From 928bdc77ea1812743f76a08084d036ab23125c45 Mon Sep 17 00:00:00 2001 From: alsco77 Date: Fri, 12 Feb 2021 08:08:23 +0100 Subject: [PATCH] Implement mAsset v2 - Upgrades solc version to 0.8.0 - Migrates necessary files to 0.8.0 - Refactors test suite to use hardhat natively - Develop, test and deploy new mAsset: mBTC --- .eslintrc.js | 11 +- .github/workflows/test.yaml | 40 +- .gitignore | 12 +- .prettierrc | 6 - .prettierrc.json | 26 + .solcover.js | 6 +- .solhint.json | 10 + .solhintignore | 2 + .soliumignore | 2 - .soliumrc.json | 21 - LICENSE | 2 +- README.md | 83 +- contracts/Migrations.sol | 23 - contracts/governance/ClaimableGovernor.sol | 67 - .../governance/DelayedClaimableGovernor.sol | 61 - contracts/governance/Governable.sol | 67 - .../governance/IncentivisedVotingLockup.sol | 950 - .../InitializableGovernableWhitelist.sol | 60 - contracts/interfaces/IBasketManager.sol | 63 - .../interfaces/IBoostedVaultWithLockup.sol | 102 + .../interfaces/IIncentivisedVotingLockup.sol | 39 +- contracts/interfaces/IMStableHelper.sol | 124 - contracts/interfaces/IMasset.sol | 168 +- contracts/interfaces/IMetaToken.sol | 25 - contracts/interfaces/INexus.sol | 17 +- contracts/interfaces/IPlatformIntegration.sol | 32 +- .../IRewardsDistributionRecipient.sol | 8 +- contracts/interfaces/ISavingsContract.sol | 45 +- contracts/interfaces/ISavingsManager.sol | 7 +- contracts/interfaces/IUniswapV2Router02.sol | 29 + contracts/masset/BasketManager.sol | 964 - contracts/masset/IInvariantValidator.sol | 46 + contracts/masset/InvariantValidator.sol | 376 + contracts/masset/Manager.sol | 505 + contracts/masset/Masset.sol | 1564 +- contracts/masset/MassetStructs.sol | 58 + .../masset/forge-validator/ForgeValidator.sol | 419 - .../forge-validator/IForgeValidator.sol | 29 - .../masset/liquidator/ICurveMetaPool.sol | 5 - contracts/masset/liquidator/ILiquidator.sol | 30 - .../masset/liquidator/IUniswapV2Router02.sol | 12 - contracts/masset/liquidator/Liquidator.sol | 290 - contracts/masset/peripheral/RenWrapper.sol | 82 + .../platform-integrations/AaveIntegration.sol | 273 - .../CompoundIntegration.sol | 300 - .../masset/platform-integrations/IAave.sol | 114 - .../platform-integrations/ICompound.sol | 49 - .../InitializableAbstractIntegration.sol | 162 - contracts/masset/shared/MStableHelper.sol | 466 - contracts/masset/shared/MassetHelpers.sol | 43 - contracts/masset/shared/MassetStructs.sol | 101 - contracts/meta-token/GovernedMinterRole.sol | 56 - contracts/meta-token/MetaToken.sol | 53 - contracts/nexus/Nexus.sol | 284 - ...ializableRewardsDistributionRecipient.sol} | 31 +- contracts/rewards/README.md | 28 - contracts/rewards/RewardsDistributor.sol | 87 - .../rewards/staking/PlatformTokenVendor.sol | 31 - contracts/rewards/staking/StakingRewards.sol | 260 - .../StakingRewardsWithPlatformToken.sol | 327 - .../rewards/staking/StakingTokenWrapper.sol | 86 - contracts/savings/BoostedSavingsVault.sol | 589 + contracts/savings/BoostedTokenWrapper.sol | 172 + contracts/savings/SavingsContract.sol | 656 +- contracts/savings/SavingsManager.sol | 469 - contracts/savings/peripheral/IConnector.sol | 33 + contracts/savings/peripheral/SaveWrapper.sol | 143 + .../shared/@openzeppelin-2.5/Context.sol | 28 + contracts/shared/@openzeppelin-2.5/ERC205.sol | 228 + .../@openzeppelin-2.5/Initializable.sol | 50 + contracts/shared/CommonHelpers.sol | 28 - contracts/shared/IBasicToken.sol | 3 +- contracts/shared/IERC20WithCheckpointing.sol | 21 +- ...alizableModule.sol => ImmutableModule.sol} | 41 +- .../shared/InitializableERC20Detailed.sol | 13 +- contracts/shared/InitializableModuleKeys.sol | 44 - .../shared/InitializablePausableModule.sol | 74 - .../shared/InitializableReentrancyGuard.sol | 5 +- contracts/shared/InitializableToken.sol | 12 +- contracts/shared/MassetHelpers.sol | 33 + contracts/shared/Module.sol | 141 - contracts/shared/ModuleKeys.sol | 45 +- contracts/shared/PausableModule.sol | 73 - contracts/shared/Root.sol | 57 +- contracts/shared/SignedSafeMath128.sol | 94 - contracts/shared/StableMath.sol | 113 +- contracts/upgradability/DelayedProxyAdmin.sol | 50 +- contracts/upgradability/Proxies.sol | 43 +- contracts/z_mocks/governance/Ejector.sol | 20 - .../z_mocks/governance/MockGovernable.sol | 7 - .../integrations/AbstractBuyAndMint.sol | 77 - .../z_mocks/integrations/MintWith1Inch.sol | 107 - .../z_mocks/integrations/MintWithKyber.sol | 230 - .../masset/ExposedInvariantValidator.sol | 18 + contracts/z_mocks/masset/ExposedMasset.sol | 18 + contracts/z_mocks/masset/IAave.sol | 58 + .../MaliciousAaveIntegration.sol | 172 +- contracts/z_mocks/masset/MockAave.sol | 96 + .../z_mocks/masset/MockBasketManager.sol | 173 - .../z_mocks/masset/MockInvariantValidator.sol | 91 + contracts/z_mocks/masset/MockMasset.sol | 4 +- .../masset/MockPlatformIntegration.sol} | 152 +- .../platform-integrations/DeadIntegration.sol | 16 - .../masset/platform-integrations/MockAave.sol | 237 - .../platform-integrations/MockCToken.sol | 79 - .../MockCompoundIntegration.sol | 58 - .../MockUpgradedAaveIntegration.sol | 417 - contracts/z_mocks/nexus/MockNexus.sol | 45 +- .../MockRewardsDistributionRecipient.sol | 23 - .../z_mocks/savings/MockRevenueRecipient.sol | 12 - .../z_mocks/savings/MockSavingsManager.sol | 30 +- .../z_mocks/savings/MockStakingContract.sol | 15 + .../savings/connectors/MockConnector.sol | 45 + .../connectors/MockErroneousConnector1.sol | 64 + .../connectors/MockErroneousConnector2.sol | 55 + .../connectors/MockLendingConnector.sol | 64 + .../savings/connectors/MockVaultConnector.sol | 100 + .../z_mocks/shared/MockCommonHelpers.sol | 14 - .../z_mocks/shared/MockCurveMetaPool.sol | 42 - contracts/z_mocks/shared/MockERC20.sol | 24 +- contracts/z_mocks/shared/MockERC20WithFee.sol | 48 +- .../shared/MockInitializableModule.sol | 70 - .../MockInitializablePausableModule.sol | 70 - .../z_mocks/shared/MockInitializableToken.sol | 13 +- .../shared/MockInitializableTokenWithFee.sol | 5 +- contracts/z_mocks/shared/MockModule.sol | 62 - .../z_mocks/shared/MockPausableModule.sol | 8 - contracts/z_mocks/shared/MockProxy.sol | 7 - contracts/z_mocks/shared/MockRoot.sol | 3 +- contracts/z_mocks/shared/MockTrigger.sol | 11 - contracts/z_mocks/shared/MockUniswap.sol | 58 - contracts/z_mocks/shared/PublicStableMath.sol | 3 +- .../z_mocks/shared/SignedSafeMath128Mock.sol | 23 - .../upgradability/MockImplementation.sol | 55 - hardhat.config.ts | 49 +- migrations/1_main.js | 16 - migrations/src/1_initial_migration.ts | 21 - migrations/src/2_system.ts | 433 - migrations/src/3_rewards.ts | 78 - migrations/src/4_staking.ts | 63 - package.json | 89 +- scripts/main.js | 13 - scripts/src/utils/logging.ts | 132 - scripts/src/utils/time.ts | 40 - tasks.config.ts | 4 + tasks/deployMbtc.ts | 448 + test-utils/assertions.ts | 130 +- test-utils/btcConstants.ts | 59 + test-utils/constants.ts | 138 +- test-utils/env_setup.ts | 30 - test-utils/machines/index.ts | 5 +- test-utils/machines/mAssetMachine.ts | 698 + test-utils/machines/massetMachine.ts | 636 - test-utils/machines/standardAccounts.ts | 45 +- test-utils/machines/systemMachine.ts | 126 - test-utils/math.ts | 88 +- test-utils/mstable-objects.ts | 119 +- test-utils/time.ts | 12 + test-utils/tools.ts | 4 - .../validator-data/convertCsvTestFiles.ts | 272 + .../validator-data/full/integrationData.json | 135740 +++++++++++++++ .../full/mintMultiTestData.json | 5942 + .../validator-data/full/mintTestData.json | 4262 + .../full/redeemExactTestData.json | 6275 + .../full/redeemMassetTestData.json | 6662 + .../validator-data/full/redeemTestData.json | 4622 + .../validator-data/full/swapTestData.json | 10442 ++ test-utils/validator-data/index.ts | 57 + .../sample/integrationData.json | 1274 + .../sample/mintMultiTestData.json | 1190 + .../validator-data/sample/mintTestData.json | 562 + .../sample/redeemExactTestData.json | 1337 + .../sample/redeemMassetTestData.json | 890 + .../validator-data/sample/redeemTestData.json | 922 + .../validator-data/sample/swapTestData.json | 694 + .../governance/ClaimableGovernor.behaviour.ts | 129 - .../DelayedClaimableGovernor.behaviour.ts | 75 - test/governance/Governable.behaviour.ts | 39 - test/governance/TestClaimableGovernor.spec.ts | 34 - .../TestDelayedClaimableGovernor.spec.ts | 43 - test/governance/TestGovernable.spec.ts | 16 - .../TestIncentivisedVotingLockup.spec.ts | 1106 - ...estIncentivisedVotingLockupRewards.spec.ts | 954 - test/masset/TestBasketManager.spec.ts | 2260 - test/masset/TestMasset.spec.ts | 279 - test/masset/TestMassetCache.spec.ts | 767 - test/masset/TestMassetMinting.spec.ts | 1564 - test/masset/TestMassetRedeemMulti.spec.ts | 723 - test/masset/TestMassetRedemption.spec.ts | 1745 - test/masset/TestMassetSwap.spec.ts | 1193 - test/masset/admin.spec.ts | 902 + test/masset/extra/erc20.spec.ts | 29 + test/masset/extra/large-basket.spec.ts | 355 + test/masset/extra/mint-swap-redeem.spec.ts | 438 + .../TestForgeValidatorM.spec.ts | 836 - .../TestForgeValidatorR.spec.ts | 1111 - .../TestForgeValidatorS.spec.ts | 545 - .../liquidator/TestLiquidatorContract.spec.ts | 505 - test/masset/mint.spec.ts | 797 + .../TestAaveIntegration.spec.ts | 1099 - .../TestAaveV2Integration.spec.ts | 1105 - .../TestCompoundIntegration.spec.ts | 1188 - ...stPlatformIntegrationUpgradability.spec.ts | 244 - test/masset/redeem.spec.ts | 1157 + test/masset/swap.spec.ts | 755 + test/masset/validator-etc.spec.ts | 210 + test/masset/validator-multi.spec.ts | 351 + test/masset/validator-single.spec.ts | 289 + test/meta-token/TestMetaToken.spec.ts | 200 - test/nexus/TestNexus.spec.ts | 842 - .../RewardsDistributionRecipient.behaviour.ts | 48 - test/rewards/TestRewardsDistributor.spec.ts | 432 - test/rewards/TestStakingRewards.spec.ts | 961 - ...estStakingRewardsWithPlatformToken.spec.ts | 1448 - test/savings/TestSavingsContract.spec.ts | 624 - test/savings/TestSavingsManager.spec.ts | 1346 - test/savings/savings-contract.spec.ts | 1264 + test/savings/savings-vault.spec.ts | 1516 + test/shared/ERC20.behaviour.ts | 321 + test/shared/Module.behaviour.ts | 26 + .../RewardsDistributionRecipient.behaviour.ts | 38 + test/shared/TestCommonHelpers.spec.ts | 84 - test/shared/TestInitializableModule.spec.ts | 195 - .../TestInitializablePausableModule.spec.ts | 197 - test/shared/TestModule.spec.ts | 189 - test/shared/TestPausableModule.spec.ts | 28 - test/shared/TestRoot.spec.ts | 42 - test/shared/TestSignedSafeMath128.spec.ts | 173 - test/shared/TestStableMath.spec.ts | 436 - test/shared/behaviours/ERC20.behaviour.ts | 365 - .../behaviours/ERC20Burnable.behaviour.ts | 125 - test/shared/behaviours/Module.behaviour.ts | 54 - .../behaviours/PausableModule.behaviour.ts | 109 - test/shared/root.spec.ts | 41 + test/shared/stable-math.spec.ts | 393 + .../TestDelayedProxyAdmin.spec.ts | 630 - truffle-config.js | 74 - tsconfig.json | 15 +- types/chai.d.ts | 8 - types/common.d.ts | 4 +- types/index.d.ts | 8 +- types/interfaces.d.ts | 14 - types/machines.ts | 61 +- types/mocha.d.ts | 3 - yarn.lock | 6359 +- 245 files changed, 200401 insertions(+), 41230 deletions(-) delete mode 100644 .prettierrc create mode 100644 .prettierrc.json create mode 100644 .solhint.json create mode 100644 .solhintignore delete mode 100644 .soliumignore delete mode 100644 .soliumrc.json delete mode 100644 contracts/Migrations.sol delete mode 100644 contracts/governance/ClaimableGovernor.sol delete mode 100644 contracts/governance/DelayedClaimableGovernor.sol delete mode 100644 contracts/governance/Governable.sol delete mode 100644 contracts/governance/IncentivisedVotingLockup.sol delete mode 100644 contracts/governance/InitializableGovernableWhitelist.sol delete mode 100644 contracts/interfaces/IBasketManager.sol create mode 100644 contracts/interfaces/IBoostedVaultWithLockup.sol delete mode 100644 contracts/interfaces/IMStableHelper.sol delete mode 100644 contracts/interfaces/IMetaToken.sol create mode 100644 contracts/interfaces/IUniswapV2Router02.sol delete mode 100644 contracts/masset/BasketManager.sol create mode 100644 contracts/masset/IInvariantValidator.sol create mode 100644 contracts/masset/InvariantValidator.sol create mode 100644 contracts/masset/Manager.sol create mode 100644 contracts/masset/MassetStructs.sol delete mode 100644 contracts/masset/forge-validator/ForgeValidator.sol delete mode 100644 contracts/masset/forge-validator/IForgeValidator.sol delete mode 100644 contracts/masset/liquidator/ICurveMetaPool.sol delete mode 100644 contracts/masset/liquidator/ILiquidator.sol delete mode 100644 contracts/masset/liquidator/IUniswapV2Router02.sol delete mode 100644 contracts/masset/liquidator/Liquidator.sol create mode 100644 contracts/masset/peripheral/RenWrapper.sol delete mode 100644 contracts/masset/platform-integrations/AaveIntegration.sol delete mode 100644 contracts/masset/platform-integrations/CompoundIntegration.sol delete mode 100644 contracts/masset/platform-integrations/IAave.sol delete mode 100644 contracts/masset/platform-integrations/ICompound.sol delete mode 100644 contracts/masset/platform-integrations/InitializableAbstractIntegration.sol delete mode 100644 contracts/masset/shared/MStableHelper.sol delete mode 100644 contracts/masset/shared/MassetHelpers.sol delete mode 100644 contracts/masset/shared/MassetStructs.sol delete mode 100644 contracts/meta-token/GovernedMinterRole.sol delete mode 100644 contracts/meta-token/MetaToken.sol delete mode 100644 contracts/nexus/Nexus.sol rename contracts/rewards/{RewardsDistributionRecipient.sol => InitializableRewardsDistributionRecipient.sol} (67%) delete mode 100644 contracts/rewards/README.md delete mode 100644 contracts/rewards/RewardsDistributor.sol delete mode 100644 contracts/rewards/staking/PlatformTokenVendor.sol delete mode 100644 contracts/rewards/staking/StakingRewards.sol delete mode 100644 contracts/rewards/staking/StakingRewardsWithPlatformToken.sol delete mode 100644 contracts/rewards/staking/StakingTokenWrapper.sol create mode 100644 contracts/savings/BoostedSavingsVault.sol create mode 100644 contracts/savings/BoostedTokenWrapper.sol delete mode 100644 contracts/savings/SavingsManager.sol create mode 100644 contracts/savings/peripheral/IConnector.sol create mode 100644 contracts/savings/peripheral/SaveWrapper.sol create mode 100644 contracts/shared/@openzeppelin-2.5/Context.sol create mode 100644 contracts/shared/@openzeppelin-2.5/ERC205.sol create mode 100644 contracts/shared/@openzeppelin-2.5/Initializable.sol delete mode 100644 contracts/shared/CommonHelpers.sol rename contracts/shared/{InitializableModule.sol => ImmutableModule.sol} (88%) delete mode 100644 contracts/shared/InitializableModuleKeys.sol delete mode 100644 contracts/shared/InitializablePausableModule.sol create mode 100644 contracts/shared/MassetHelpers.sol delete mode 100644 contracts/shared/Module.sol delete mode 100644 contracts/shared/PausableModule.sol delete mode 100644 contracts/shared/SignedSafeMath128.sol delete mode 100644 contracts/z_mocks/governance/Ejector.sol delete mode 100644 contracts/z_mocks/governance/MockGovernable.sol delete mode 100644 contracts/z_mocks/integrations/AbstractBuyAndMint.sol delete mode 100644 contracts/z_mocks/integrations/MintWith1Inch.sol delete mode 100644 contracts/z_mocks/integrations/MintWithKyber.sol create mode 100644 contracts/z_mocks/masset/ExposedInvariantValidator.sol create mode 100644 contracts/z_mocks/masset/ExposedMasset.sol create mode 100644 contracts/z_mocks/masset/IAave.sol rename contracts/z_mocks/masset/{platform-integrations => }/MaliciousAaveIntegration.sol (60%) create mode 100644 contracts/z_mocks/masset/MockAave.sol delete mode 100644 contracts/z_mocks/masset/MockBasketManager.sol create mode 100644 contracts/z_mocks/masset/MockInvariantValidator.sol rename contracts/{masset/platform-integrations/AaveV2Integration.sol => z_mocks/masset/MockPlatformIntegration.sol} (66%) delete mode 100644 contracts/z_mocks/masset/platform-integrations/DeadIntegration.sol delete mode 100644 contracts/z_mocks/masset/platform-integrations/MockAave.sol delete mode 100644 contracts/z_mocks/masset/platform-integrations/MockCToken.sol delete mode 100644 contracts/z_mocks/masset/platform-integrations/MockCompoundIntegration.sol delete mode 100644 contracts/z_mocks/masset/platform-integrations/MockUpgradedAaveIntegration.sol delete mode 100644 contracts/z_mocks/rewards/MockRewardsDistributionRecipient.sol delete mode 100644 contracts/z_mocks/savings/MockRevenueRecipient.sol create mode 100644 contracts/z_mocks/savings/MockStakingContract.sol create mode 100644 contracts/z_mocks/savings/connectors/MockConnector.sol create mode 100644 contracts/z_mocks/savings/connectors/MockErroneousConnector1.sol create mode 100644 contracts/z_mocks/savings/connectors/MockErroneousConnector2.sol create mode 100644 contracts/z_mocks/savings/connectors/MockLendingConnector.sol create mode 100644 contracts/z_mocks/savings/connectors/MockVaultConnector.sol delete mode 100644 contracts/z_mocks/shared/MockCommonHelpers.sol delete mode 100644 contracts/z_mocks/shared/MockCurveMetaPool.sol delete mode 100644 contracts/z_mocks/shared/MockInitializableModule.sol delete mode 100644 contracts/z_mocks/shared/MockInitializablePausableModule.sol delete mode 100644 contracts/z_mocks/shared/MockModule.sol delete mode 100644 contracts/z_mocks/shared/MockPausableModule.sol delete mode 100644 contracts/z_mocks/shared/MockProxy.sol delete mode 100644 contracts/z_mocks/shared/MockTrigger.sol delete mode 100644 contracts/z_mocks/shared/MockUniswap.sol delete mode 100644 contracts/z_mocks/shared/SignedSafeMath128Mock.sol delete mode 100644 contracts/z_mocks/upgradability/MockImplementation.sol delete mode 100644 migrations/1_main.js delete mode 100644 migrations/src/1_initial_migration.ts delete mode 100644 migrations/src/2_system.ts delete mode 100644 migrations/src/3_rewards.ts delete mode 100644 migrations/src/4_staking.ts delete mode 100644 scripts/main.js delete mode 100644 scripts/src/utils/logging.ts delete mode 100644 scripts/src/utils/time.ts create mode 100644 tasks.config.ts create mode 100644 tasks/deployMbtc.ts create mode 100644 test-utils/btcConstants.ts delete mode 100644 test-utils/env_setup.ts create mode 100644 test-utils/machines/mAssetMachine.ts delete mode 100644 test-utils/machines/massetMachine.ts delete mode 100644 test-utils/machines/systemMachine.ts create mode 100644 test-utils/time.ts delete mode 100644 test-utils/tools.ts create mode 100644 test-utils/validator-data/convertCsvTestFiles.ts create mode 100644 test-utils/validator-data/full/integrationData.json create mode 100644 test-utils/validator-data/full/mintMultiTestData.json create mode 100644 test-utils/validator-data/full/mintTestData.json create mode 100644 test-utils/validator-data/full/redeemExactTestData.json create mode 100644 test-utils/validator-data/full/redeemMassetTestData.json create mode 100644 test-utils/validator-data/full/redeemTestData.json create mode 100644 test-utils/validator-data/full/swapTestData.json create mode 100644 test-utils/validator-data/index.ts create mode 100644 test-utils/validator-data/sample/integrationData.json create mode 100644 test-utils/validator-data/sample/mintMultiTestData.json create mode 100644 test-utils/validator-data/sample/mintTestData.json create mode 100644 test-utils/validator-data/sample/redeemExactTestData.json create mode 100644 test-utils/validator-data/sample/redeemMassetTestData.json create mode 100644 test-utils/validator-data/sample/redeemTestData.json create mode 100644 test-utils/validator-data/sample/swapTestData.json delete mode 100644 test/governance/ClaimableGovernor.behaviour.ts delete mode 100644 test/governance/DelayedClaimableGovernor.behaviour.ts delete mode 100644 test/governance/Governable.behaviour.ts delete mode 100644 test/governance/TestClaimableGovernor.spec.ts delete mode 100644 test/governance/TestDelayedClaimableGovernor.spec.ts delete mode 100644 test/governance/TestGovernable.spec.ts delete mode 100644 test/governance/TestIncentivisedVotingLockup.spec.ts delete mode 100644 test/governance/TestIncentivisedVotingLockupRewards.spec.ts delete mode 100644 test/masset/TestBasketManager.spec.ts delete mode 100644 test/masset/TestMasset.spec.ts delete mode 100644 test/masset/TestMassetCache.spec.ts delete mode 100644 test/masset/TestMassetMinting.spec.ts delete mode 100644 test/masset/TestMassetRedeemMulti.spec.ts delete mode 100644 test/masset/TestMassetRedemption.spec.ts delete mode 100644 test/masset/TestMassetSwap.spec.ts create mode 100644 test/masset/admin.spec.ts create mode 100644 test/masset/extra/erc20.spec.ts create mode 100644 test/masset/extra/large-basket.spec.ts create mode 100644 test/masset/extra/mint-swap-redeem.spec.ts delete mode 100644 test/masset/forge-validator/TestForgeValidatorM.spec.ts delete mode 100644 test/masset/forge-validator/TestForgeValidatorR.spec.ts delete mode 100644 test/masset/forge-validator/TestForgeValidatorS.spec.ts delete mode 100644 test/masset/liquidator/TestLiquidatorContract.spec.ts create mode 100644 test/masset/mint.spec.ts delete mode 100644 test/masset/platform-integrations/TestAaveIntegration.spec.ts delete mode 100644 test/masset/platform-integrations/TestAaveV2Integration.spec.ts delete mode 100644 test/masset/platform-integrations/TestCompoundIntegration.spec.ts delete mode 100644 test/masset/platform-integrations/TestPlatformIntegrationUpgradability.spec.ts create mode 100644 test/masset/redeem.spec.ts create mode 100644 test/masset/swap.spec.ts create mode 100644 test/masset/validator-etc.spec.ts create mode 100644 test/masset/validator-multi.spec.ts create mode 100644 test/masset/validator-single.spec.ts delete mode 100644 test/meta-token/TestMetaToken.spec.ts delete mode 100644 test/nexus/TestNexus.spec.ts delete mode 100644 test/rewards/RewardsDistributionRecipient.behaviour.ts delete mode 100644 test/rewards/TestRewardsDistributor.spec.ts delete mode 100644 test/rewards/TestStakingRewards.spec.ts delete mode 100644 test/rewards/TestStakingRewardsWithPlatformToken.spec.ts delete mode 100644 test/savings/TestSavingsContract.spec.ts delete mode 100644 test/savings/TestSavingsManager.spec.ts create mode 100644 test/savings/savings-contract.spec.ts create mode 100644 test/savings/savings-vault.spec.ts create mode 100644 test/shared/ERC20.behaviour.ts create mode 100644 test/shared/Module.behaviour.ts create mode 100644 test/shared/RewardsDistributionRecipient.behaviour.ts delete mode 100644 test/shared/TestCommonHelpers.spec.ts delete mode 100644 test/shared/TestInitializableModule.spec.ts delete mode 100644 test/shared/TestInitializablePausableModule.spec.ts delete mode 100644 test/shared/TestModule.spec.ts delete mode 100644 test/shared/TestPausableModule.spec.ts delete mode 100644 test/shared/TestRoot.spec.ts delete mode 100644 test/shared/TestSignedSafeMath128.spec.ts delete mode 100644 test/shared/TestStableMath.spec.ts delete mode 100644 test/shared/behaviours/ERC20.behaviour.ts delete mode 100644 test/shared/behaviours/ERC20Burnable.behaviour.ts delete mode 100644 test/shared/behaviours/Module.behaviour.ts delete mode 100644 test/shared/behaviours/PausableModule.behaviour.ts create mode 100644 test/shared/root.spec.ts create mode 100644 test/shared/stable-math.spec.ts delete mode 100644 test/upgradability/TestDelayedProxyAdmin.spec.ts delete mode 100644 truffle-config.js delete mode 100644 types/chai.d.ts delete mode 100644 types/interfaces.d.ts delete mode 100644 types/mocha.d.ts diff --git a/.eslintrc.js b/.eslintrc.js index c25b22f2..761a8852 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -25,22 +25,19 @@ module.exports = { } }, "rules": { - "@typescript-eslint/no-use-before-define": 1 + "@typescript-eslint/no-use-before-define": 1, + "import/no-extraneous-dependencies": 1, + "no-nested-ternary": 1 }, "overrides": [ { "files": [ - "./types/*.ts", "./types/contracts.ts", - "./types/chai.d.ts", "./types/interfaces.d.ts", "./types/**/*.ts", - "./test/*.ts", "./scripts/**/*.ts", "./test/**/*.ts", - "./test-utils/*.ts", - "./test-utils/**/*.ts", - "./migrations/*.js"], + "./test-utils/**/*.ts"], } ] }; diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index 881c2b31..1ef4ab02 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -1,24 +1,24 @@ on: ["push", "pull_request"] name: Test jobs: - build: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v2 - - uses: actions/setup-node@v1 - with: - node-version: 10.22.0 - - name: Get yarn cache directory path - id: yarn-cache-dir-path - run: echo "::set-output name=dir::$(yarn cache dir)" + build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - uses: actions/setup-node@v1 + with: + node-version: 10.22.0 + - name: Get yarn cache directory path + id: yarn-cache-dir-path + run: echo "::set-output name=dir::$(yarn cache dir)" - - uses: actions/cache@v2 - id: yarn-cache # use this to check for `cache-hit` (`steps.yarn-cache.outputs.cache-hit != 'true'`) - with: - path: ${{ steps.yarn-cache-dir-path.outputs.dir }} - key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }} - restore-keys: | - ${{ runner.os }}-yarn- - - run: yarn install - - run: yarn compile - - run: yarn test + - uses: actions/cache@v2 + id: yarn-cache # use this to check for `cache-hit` (`steps.yarn-cache.outputs.cache-hit != 'true'`) + with: + path: ${{ steps.yarn-cache-dir-path.outputs.dir }} + key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }} + restore-keys: | + ${{ runner.os }}-yarn- + - run: yarn + - run: yarn compile + - run: yarn test diff --git a/.gitignore b/.gitignore index 86cbc209..df78815f 100644 --- a/.gitignore +++ b/.gitignore @@ -37,6 +37,9 @@ build/ artifacts/ contracts-output/ +# VS Code Solidity Extension +bin/contracts + # TSC /artifacts/json /artifacts/ts @@ -49,6 +52,9 @@ package-lock.json # .vscode .vscode/ +# WebStorm +.idea/ + # solcover .coverage_cache/ .coverage_artifacts/ @@ -58,4 +64,8 @@ cache # sol-merger flat/ -_flat/ \ No newline at end of file +_flat/ + +# test data +/test-utils/validator-data/*.csv +testoutput.txt \ No newline at end of file diff --git a/.prettierrc b/.prettierrc deleted file mode 100644 index 2270ca3f..00000000 --- a/.prettierrc +++ /dev/null @@ -1,6 +0,0 @@ -# .prettierrc -printWidth: 100 -parser: typescript -tabWidth: 4 -trailingComma: all -arrowParens: always diff --git a/.prettierrc.json b/.prettierrc.json new file mode 100644 index 00000000..dc179490 --- /dev/null +++ b/.prettierrc.json @@ -0,0 +1,26 @@ +{ + "trailingComma": "es5", + "tabWidth": 4, + "semi": false, + "useTabs": false, + "singleQuote": false, + "printWidth": 140, + "overrides": [ + { + "files": "*.ts", + "options": { + "parser": "typescript", + "trailingComma": "all", + "arrowParens": "always" + } + }, + { + "files": "*.sol", + "options": { + "printWidth": 100, + "bracketSpacing": true, + "explicitTypes": "always" + } + } + ] +} \ No newline at end of file diff --git a/.solcover.js b/.solcover.js index 5aa6e902..16a6e353 100644 --- a/.solcover.js +++ b/.solcover.js @@ -1,10 +1,12 @@ module.exports = { skipFiles: [ - 'Migrations.sol', 'interfaces', 'integrations', 'z_mocks', 'shared/InitializableReentrancyGuard.sol', - 'integrations' + 'integrations', + 'masset/peripheral', + 'savings/peripheral', + 'upgradability' ] }; \ No newline at end of file diff --git a/.solhint.json b/.solhint.json new file mode 100644 index 00000000..9a4edfc2 --- /dev/null +++ b/.solhint.json @@ -0,0 +1,10 @@ +{ + "extends": "solhint:recommended", + "plugins": [], + "rules": { + "avoid-suicide": "error", + "avoid-sha3": "warn", + "compiler-version": ["warn","^0.8.0"], + "func-visibility": ["warn",{"ignoreConstructors":true}] + } +} \ No newline at end of file diff --git a/.solhintignore b/.solhintignore new file mode 100644 index 00000000..aec15269 --- /dev/null +++ b/.solhintignore @@ -0,0 +1,2 @@ +node_modules +contracts/z_mocks/**/* \ No newline at end of file diff --git a/.soliumignore b/.soliumignore deleted file mode 100644 index 0aecef1d..00000000 --- a/.soliumignore +++ /dev/null @@ -1,2 +0,0 @@ -node_modules -contracts/z_mocks \ No newline at end of file diff --git a/.soliumrc.json b/.soliumrc.json deleted file mode 100644 index 3877ac54..00000000 --- a/.soliumrc.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "extends": "solium:recommended", - "plugins": [ - "security" - ], - "rules": { - "operator-whitespace": ["off"], - "quotes": [ - "error", - "double" - ], - "indentation": [ - "warning", - 4 - ], - "linebreak-style": [ - "error", - "unix" - ] - } -} \ No newline at end of file diff --git a/LICENSE b/LICENSE index 0f475495..160bc42d 100644 --- a/LICENSE +++ b/LICENSE @@ -667,7 +667,7 @@ Note: Unless otherwise specified, individual files are licensed as AGPL-3.0-or-later and are assumed to include the following text: - Copyright (C) 2020 Stability Labs Pty. Ltd. + Copyright (C) 2020 mStable This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published diff --git a/README.md b/README.md index 15d166ae..5efc6ef2 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ ![CI](https://github.com/mstable/mStable-contracts/workflows/Test/badge.svg) -[![Coverage Status](https://coveralls.io/repos/github/mstable/mStable-contracts/badge.svg?branch=master)](https://coveralls.io/github/mstable/mStable-contracts?branch=master) +[![Coverage Status](https://coveralls.io/repos/github/mstable/mStable-ICSMM/badge.svg?branch=icsmm&t=BVkH5s)](https://coveralls.io/github/mstable/mStable-ICSMM?branch=icsmm) [![Discord](https://img.shields.io/discord/525087739801239552?color=7289DA&label=discord%20)](https://discordapp.com/channels/525087739801239552/) [![npm version](https://badge.fury.io/js/%40mstable%2Fprotocol.svg)](https://badge.fury.io/js/%40mstable%2Fprotocol) @@ -10,19 +10,17 @@ This repo contains all contracts and tests relevant to the core mStable protocol. mStable is a protocol built to make stablecoins easy, robust and profitable. -mStable Assets ([mAssets](./contracts/masset/Masset.sol)) are tokens that allow minting and redemption at a 1:1 ratio for underlying Basket Assets (`bAssets`) of the same peg (i.e. USD, BTC, Gold), with composition managed by the [BasketManager](./contracts/masset/BasketManager.sol). `bAssets` are integrated with lending protocols (initially Aave, Compound) to generate interest which is accrued in `mAsset` terms. mAssets can be deposited to earn native interest through their respective Savings Contract, just like you would with a savings account. `bAssets` within an `mAsset` can also be swapped 1:1 (provided they remain within their [forge validator](./contracts/masset/forge-validator) limits), with a small `swapFee` credited additionally to Savers. +mStable Assets ([mAssets](./contracts/masset/Masset.sol)) are tokens that allow minting and redemption for underlying Basket Assets (`bAssets`) of the same peg (i.e. USD, BTC, Gold). The InvariantValidator applies both min and max weights to these bAssets, and enforces penalties and bonuses when minting with these assets to provide low slippage swaps. This Invariant applies progressive penalties and bonuses on either end of the weight scale - having the result of having a large area of low slippage. `bAssets` are integrated with lending protocols (initially Aave, Compound) to generate interest which is accrued in `mAsset` terms. mAssets can be deposited to earn native interest through their respective Savings Contract, just like you would with a savings account. `bAssets` within an `mAsset` can also be swapped with low slippage (provided they remain within their [validator](./contracts/masset/InvariantValidator.sol) limits), with a `swapFee` credited additionally to Savers. Core mAsset contracts utilise OpenZeppelin's [InitializableAdminUpgradeabilityProxy](https://github.com/OpenZeppelin/openzeppelin-sdk/blob/master/packages/lib/contracts/upgradeability/InitializableAdminUpgradeabilityProxy.sol) to facilitate future upgrades, fixes or feature additions. The upgrades are proposed by the mStable Governors (with current governor address stored in the [Nexus](./contracts/nexus/Nexus.sol) - the system kernel) and executed via the [DelayedProxyAdmin](./contracts/upgradability/DelayedProxyAdmin.sol). Both changes to the `governor`, and contract upgrades have a one week delay built in to execution. This allows mStable users a one week opt out window if they do not agree with the given change. -mStable rewards those who contribute to its utility and growth - for more information see [MTA rewards](https://docs.mstable.org/meta-rewards-1/). - +mStable rewards those who contribute to its utility and growth - for more information see [MTA](https://docs.mstable.org/mstable-assets/functions).
🏠 https://mstable.org 📀 https://app.mstable.org -📄 https://docs.mstable.org - +📄 https://docs.mstable.org
@@ -30,7 +28,6 @@ mStable rewards those who contribute to its utility and growth - for more inform Found a bug? Claim a reward from our open [Bug Bounty](https://docs.mstable.org/protocol/security/mstable-bug-bounty) by reporting it to mStable (following the [responsible disclosure](https://docs.mstable.org/protocol/security/mstable-bug-bounty#responsible-disclosure) policy) -
--- @@ -39,8 +36,8 @@ Found a bug? Claim a reward from our open [Bug Bounty](https://docs.mstable.org/ ## Branches -- `master` contains complete, tested and audited contract code, generally on `mainnet` -- `beta` is for the pre-release code, generally on `ropsten` +- `master` contains complete, tested and audited contract code, generally on `mainnet` +- `beta` is for the pre-release code, generally on `ropsten`
@@ -54,8 +51,8 @@ We publish the contract artifacts to an npm package called [@mstable/protocol](h ### Prerequisites -* Node.js v10.22.0 (you may wish to use [nvm][1]) -* [ganache-cli][2] +- Node.js v10.22.0 (you may wish to use [nvm][1]) +- [ganache-cli][2] ### Installing dependencies @@ -63,33 +60,19 @@ We publish the contract artifacts to an npm package called [@mstable/protocol](h $ yarn ``` -### Running migrations - -Deployment scripts are located in `migrations/src`. To run, start `ganache` or `ganache-cli` and run the migration script. - -*NB: You should locally use the latest version of `ganache-cli`, as contracts rely on recent opcodes.* -*In case you are using `ganache` GUI you should go to the settings/gear icon -> chain -> update the gas limit property to 8000000* - -``` -$ ganache-cli -p 7545 -l 8000000 -$ yarn compile -$ yarn migrate -``` - ### Testing -Tests are written in Typescript, using [Typechain](https://github.com/ethereum-ts/TypeChain) to generate typings for all contracts. Tests are executed using `truffle` and `ganache-cli`. +Tests are written with Hardhat, Ethers, Waffle & Typescript, using [Typechain](https://github.com/ethereum-ts/TypeChain) to generate typings for all contracts. Tests are executed using `hardhat` in hardhats evm. ``` -$ ganache-cli -p 7545 -l 50000000 --allowUnlimitedContractSize $ yarn test ``` -#### Ganache-fork +#### Forking -mStable-contracts test suite is built to support execution on a [mainnet fork](https://medium.com/ethereum-grid/forking-ethereum-mainnet-mint-your-own-dai-d8b62a82b3f7) of ganache. This allows tests to be ran using all mainnet dependencies (bAssets, lending protocols). To do this, certain mainnet accounts need to be unlocked to allows tx to be sent from that origin. +mStable-contracts test suite is built to support execution on a [mainnet fork](https://medium.com/ethereum-grid/forking-ethereum-mainnet-mint-your-own-dai-d8b62a82b3f7) of ganache. This allows tests to be ran using all mainnet dependencies (bAssets, lending protocols). To do this, certain mainnet accounts need to be unlocked to allows tx to be sent from that origin. -*NB: The following commands assume you have a full Ethereum node running and exposed on local port 1234* +_NB: The following commands assume you have a full Ethereum node running and exposed on local port 1234_ ``` $ ganache-cli -f http://localhost:1234 -p 7545 -l 100000000 --allowUnlimitedContractSize --unlock "0x6cC5F688a315f3dC28A7781717a9A798a59fDA7b" --unlock "0x3f5CE5FBFe3E9af3971dD833D26bA9b5C936f0bE" --unlock "0x3dfd23a6c5e8bbcfc9581d2e864a68feb6a076d3" @@ -101,14 +84,13 @@ $ truffle test ./test/xxx.spec.tx --network fork Key folders: -- `/contracts/z_mocks`: All mocks used throughout the test suite -- `/security`: Scripts used to run static analysis tools like Slither and Securify -- `/test`: Unit tests in folders corresponding to contracts/xx -- `/test-utils`: Core util files used throughout the test framework - - `/machines`: Mock contract machines for creating configurable instances of the contracts -- `/types`: TS Types used throughout the suite - - `/generated`: Output from Typechain; strongly-typed, Truffle-flavoured contract interfaces - +- `/contracts/z_mocks`: All mocks used throughout the test suite +- `/security`: Scripts used to run static analysis tools like Slither and Securify +- `/test`: Unit tests in folders corresponding to contracts/xx +- `/test-utils`: Core util files used throughout the test framework + - `/machines`: Mock contract machines for creating configurable instances of the contracts +- `/types`: TS Types used throughout the suite + - `/generated`: Output from Typechain; strongly-typed, Ethers-flavoured contract interfaces #### Coverage @@ -116,34 +98,21 @@ Key folders: This produces reports that are visible in the `/coverage` folder, and navigatable/uploadable. Ultimately they are used as a reference that there is some sort of adequate cover, although they will not be a source of truth for a robust test framework. Reports publically available on [coveralls](https://coveralls.io/github/mstable/mStable-contracts). -*NB: solidity-coverage runs with solc `optimizer=false` (see [discussion](https://github.com/sc-forks/solidity-coverage/issues/417))* - - -### Scripts - -`script [scriptName] [args]` > Runs custom Truffle scripts - -Example usage: - -* Mint 100 MUSD: `yarn script mint 100` -* Redeem 100 of the MUSD basset at index 0 (USDT): `yarn redeem-basset 0 100` -* Deposit 100 mUSD into savings: `yarn deposit-savings 100` -* Withdraw 100 mUSD from savings: `yarn withdraw-savings 100` -* Travel through time (forwards only, sorry): `yarn script time-travel 1 year` +_NB: solidity-coverage runs with solc `optimizer=false` (see [discussion](https://github.com/sc-forks/solidity-coverage/issues/417))_ ### CI Codebase rules are enforced through a passing [CI](https://circleci.com) (visible in `.circleci/config.yml`). These rules are: -- Linting of both the contracts (through Solium) and TS files (ESLint) -- Passing test suite -- Maintaining high unit testing coverage +- Linting of both the contracts (through Solium) and TS files (ESLint) +- Passing test suite +- Maintaining high unit testing coverage ### Code formatting -- Solidity imports deconstructed as `import { xxx } from "../xxx.sol"` -- Solidity commented as per [NatSpec format](https://solidity.readthedocs.io/en/v0.5.0/layout-of-source-files.html#comments) -- Internal function ordering from high > low order +- Solidity imports deconstructed as `import { xxx } from "../xxx.sol"` +- Solidity commented as per [NatSpec format](https://solidity.readthedocs.io/en/v0.5.0/layout-of-source-files.html#comments) +- Internal function ordering from high > low order
diff --git a/contracts/Migrations.sol b/contracts/Migrations.sol deleted file mode 100644 index ae31da45..00000000 --- a/contracts/Migrations.sol +++ /dev/null @@ -1,23 +0,0 @@ -pragma solidity 0.5.16; - -contract Migrations { - address public owner; - uint public last_completed_migration; - - constructor() public { - owner = msg.sender; - } - - modifier restricted() { - if (msg.sender == owner) _; - } - - function setCompleted(uint completed) public restricted { - last_completed_migration = completed; - } - - function upgrade(address new_address) public restricted { - Migrations upgraded = Migrations(new_address); - upgraded.setCompleted(last_completed_migration); - } -} diff --git a/contracts/governance/ClaimableGovernor.sol b/contracts/governance/ClaimableGovernor.sol deleted file mode 100644 index 068d2e7e..00000000 --- a/contracts/governance/ClaimableGovernor.sol +++ /dev/null @@ -1,67 +0,0 @@ -pragma solidity 0.5.16; - -import { Governable } from "./Governable.sol"; - -/** - * @title ClaimableGovernor - * @author Stability Labs Pty. Ltd. - * @notice 2 way handshake for Governance transfer - * @dev Overrides the public functions in Governable to provide - * a second step of validation. - */ -contract ClaimableGovernor is Governable { - - event GovernorChangeClaimed(address indexed proposedGovernor); - event GovernorChangeCancelled(address indexed governor, address indexed proposed); - event GovernorChangeRequested(address indexed governor, address indexed proposed); - - address public proposedGovernor = address(0); - - /** - * @dev Throws if called by any account other than the Proposed Governor. - */ - modifier onlyProposedGovernor() { - require(msg.sender == proposedGovernor, "Sender is not proposed governor"); - _; - } - - constructor(address _governorAddr) public { - _changeGovernor(_governorAddr); - } - - //@override - function changeGovernor(address) external onlyGovernor { - revert("Direct change not allowed"); - } - - /** - * @dev Current Governor request to proposes a new Governor - * @param _proposedGovernor Address of the proposed Governor - */ - function requestGovernorChange(address _proposedGovernor) public onlyGovernor { - require(_proposedGovernor != address(0), "Proposed governor is address(0)"); - require(proposedGovernor == address(0), "Proposed governor already set"); - - proposedGovernor = _proposedGovernor; - emit GovernorChangeRequested(governor(), _proposedGovernor); - } - - /** - * @dev Current Governor cancel Governor change request - */ - function cancelGovernorChange() public onlyGovernor { - require(proposedGovernor != address(0), "Proposed Governor not set"); - - emit GovernorChangeCancelled(governor(), proposedGovernor); - proposedGovernor = address(0); - } - - /** - * @dev Proposed Governor can claim governance ownership - */ - function claimGovernorChange() public onlyProposedGovernor { - _changeGovernor(proposedGovernor); - emit GovernorChangeClaimed(proposedGovernor); - proposedGovernor = address(0); - } -} diff --git a/contracts/governance/DelayedClaimableGovernor.sol b/contracts/governance/DelayedClaimableGovernor.sol deleted file mode 100644 index 7dd1c0a7..00000000 --- a/contracts/governance/DelayedClaimableGovernor.sol +++ /dev/null @@ -1,61 +0,0 @@ -pragma solidity 0.5.16; - -import { ClaimableGovernor } from "./ClaimableGovernor.sol"; -import { SafeMath } from "@openzeppelin/contracts/math/SafeMath.sol"; - -/** - * @title DelayedClaimableGovernor - * @author Stability Labs Pty. Ltd. - * @notice Current Governor can initiate governance change request. - * After a defined delay, proposed Governor can claim governance - * ownership. - */ -contract DelayedClaimableGovernor is ClaimableGovernor { - - using SafeMath for uint256; - - uint256 public delay = 0; - uint256 public requestTime = 0; - - /** - * @dev Initializes the contract with given delay - * @param _governorAddr Initial governor - * @param _delay Delay in seconds for 2 way handshake - */ - constructor(address _governorAddr, uint256 _delay) - public - ClaimableGovernor(_governorAddr) - { - require(_delay > 0, "Delay must be greater than zero"); - delay = _delay; - } - - //@override - /** - * @dev Requests change of governor and logs request time - * @param _proposedGovernor Address of the new governor - */ - function requestGovernorChange(address _proposedGovernor) public onlyGovernor { - requestTime = now; - super.requestGovernorChange(_proposedGovernor); - } - - //@override - /** - * @dev Cancels an outstanding governor change request by resetting request time - */ - function cancelGovernorChange() public onlyGovernor { - requestTime = 0; - super.cancelGovernorChange(); - } - - //@override - /** - * @dev Proposed governor claims new position, callable after time elapsed - */ - function claimGovernorChange() public onlyProposedGovernor { - require(now >= (requestTime.add(delay)), "Delay not over"); - super.claimGovernorChange(); - requestTime = 0; - } -} \ No newline at end of file diff --git a/contracts/governance/Governable.sol b/contracts/governance/Governable.sol deleted file mode 100644 index 21fddeea..00000000 --- a/contracts/governance/Governable.sol +++ /dev/null @@ -1,67 +0,0 @@ -pragma solidity 0.5.16; - -/** - * @title Governable - * @author Stability Labs Pty. Ltd. - * @notice Simple contract implementing an Ownable pattern. - * @dev Derives from V2.3.0 @openzeppelin/contracts/ownership/Ownable.sol - * Modified to have custom name and features - * - Removed `renounceOwnership` - * - Changes `_owner` to `_governor` - */ -contract Governable { - - event GovernorChanged(address indexed previousGovernor, address indexed newGovernor); - - address private _governor; - - - /** - * @dev Initializes the contract setting the deployer as the initial Governor. - */ - constructor () internal { - _governor = msg.sender; - emit GovernorChanged(address(0), _governor); - } - - /** - * @dev Returns the address of the current Governor. - */ - function governor() public view returns (address) { - return _governor; - } - - /** - * @dev Throws if called by any account other than the Governor. - */ - modifier onlyGovernor() { - require(isGovernor(), "GOV: caller is not the Governor"); - _; - } - - /** - * @dev Returns true if the caller is the current Governor. - */ - function isGovernor() public view returns (bool) { - return msg.sender == _governor; - } - - /** - * @dev Transfers Governance of the contract to a new account (`newGovernor`). - * Can only be called by the current Governor. - * @param _newGovernor Address of the new Governor - */ - function changeGovernor(address _newGovernor) external onlyGovernor { - _changeGovernor(_newGovernor); - } - - /** - * @dev Change Governance of the contract to a new account (`newGovernor`). - * @param _newGovernor Address of the new Governor - */ - function _changeGovernor(address _newGovernor) internal { - require(_newGovernor != address(0), "GOV: new Governor is address(0)"); - emit GovernorChanged(_governor, _newGovernor); - _governor = _newGovernor; - } -} diff --git a/contracts/governance/IncentivisedVotingLockup.sol b/contracts/governance/IncentivisedVotingLockup.sol deleted file mode 100644 index e2a0acb3..00000000 --- a/contracts/governance/IncentivisedVotingLockup.sol +++ /dev/null @@ -1,950 +0,0 @@ -/* solium-disable security/no-block-members */ -pragma solidity 0.5.16; - -import { IBasicToken } from "../shared/IBasicToken.sol"; - -import { IIncentivisedVotingLockup } from "../interfaces/IIncentivisedVotingLockup.sol"; -import { ReentrancyGuard } from "@openzeppelin/contracts/utils/ReentrancyGuard.sol"; -import { RewardsDistributionRecipient } from "../rewards/RewardsDistributionRecipient.sol"; - -import { SafeERC20, IERC20 } from "@openzeppelin/contracts/token/ERC20/SafeERC20.sol"; -import { SignedSafeMath128 } from "../shared/SignedSafeMath128.sol"; -import { StableMath, SafeMath } from "../shared/StableMath.sol"; -import { Root } from "../shared/Root.sol"; - -/** - * @title IncentivisedVotingLockup - * @author Voting Weight tracking & Decay - * -> Curve Finance (MIT) - forked & ported to Solidity - * -> https://github.com/curvefi/curve-dao-contracts/blob/master/contracts/VotingEscrow.vy - * osolmaz - Research & Reward distributions - * alsco77 - Solidity implementation - * @notice Lockup MTA, receive vMTA (voting weight that decays over time), and earn - * rewards based on staticWeight - * @dev Supports: - * 1) Tracking MTA Locked up (LockedBalance) - * 2) Pull Based Reward allocations based on Lockup (Static Balance) - * 3) Decaying voting weight lookup through CheckpointedERC20 (balanceOf) - * 4) Ejecting fully decayed participants from reward allocation (eject) - * 5) Migration of points to v2 (used as multiplier in future) ***** (rewardsPaid) - * 6) Closure of contract (expire) - */ -contract IncentivisedVotingLockup is - IIncentivisedVotingLockup, - ReentrancyGuard, - RewardsDistributionRecipient -{ - using StableMath for uint256; - using SafeMath for uint256; - using SignedSafeMath128 for int128; - using SafeERC20 for IERC20; - - /** Shared Events */ - event Deposit(address indexed provider, uint256 value, uint256 locktime, LockAction indexed action, uint256 ts); - event Withdraw(address indexed provider, uint256 value, uint256 ts); - event Ejected(address indexed ejected, address ejector, uint256 ts); - event Expired(); - event RewardAdded(uint256 reward); - event RewardPaid(address indexed user, uint256 reward); - - /** Shared Globals */ - IERC20 public stakingToken; - uint256 private constant WEEK = 7 days; - uint256 public constant MAXTIME = 365 days; - uint256 public END; - bool public expired = false; - - /** Lockup */ - uint256 public globalEpoch; - Point[] public pointHistory; - mapping(address => Point[]) public userPointHistory; - mapping(address => uint256) public userPointEpoch; - mapping(uint256 => int128) public slopeChanges; - mapping(address => LockedBalance) public locked; - - // Voting token - Checkpointed view only ERC20 - string public name; - string public symbol; - uint256 public decimals = 18; - - /** Rewards */ - // Updated upon admin deposit - uint256 public periodFinish = 0; - uint256 public rewardRate = 0; - - // Globals updated per stake/deposit/withdrawal - uint256 public totalStaticWeight = 0; - uint256 public lastUpdateTime = 0; - uint256 public rewardPerTokenStored = 0; - - // Per user storage updated per stake/deposit/withdrawal - mapping(address => uint256) public userRewardPerTokenPaid; - mapping(address => uint256) public rewards; - mapping(address => uint256) public rewardsPaid; - - /** Structs */ - struct Point { - int128 bias; - int128 slope; - uint256 ts; - uint256 blk; - } - - struct LockedBalance { - int128 amount; - uint256 end; - } - - enum LockAction { - CREATE_LOCK, - INCREASE_LOCK_AMOUNT, - INCREASE_LOCK_TIME - } - - constructor( - address _stakingToken, - string memory _name, - string memory _symbol, - address _nexus, - address _rewardsDistributor - ) - public - RewardsDistributionRecipient(_nexus, _rewardsDistributor) - { - stakingToken = IERC20(_stakingToken); - Point memory init = Point({ bias: int128(0), slope: int128(0), ts: block.timestamp, blk: block.number}); - pointHistory.push(init); - - decimals = IBasicToken(_stakingToken).decimals(); - require(decimals <= 18, "Cannot have more than 18 decimals"); - - name = _name; - symbol = _symbol; - - END = block.timestamp.add(MAXTIME); - } - - /** @dev Modifier to ensure contract has not yet expired */ - modifier contractNotExpired(){ - require(!expired, "Contract is expired"); - _; - } - - /** - * @dev Validates that the user has an expired lock && they still have capacity to earn - * @param _addr User address to check - */ - modifier lockupIsOver(address _addr) { - LockedBalance memory userLock = locked[_addr]; - require(userLock.amount > 0 && block.timestamp >= userLock.end, "Users lock didn't expire"); - require(staticBalanceOf(_addr) > 0, "User must have existing bias"); - _; - } - - /*************************************** - LOCKUP - GETTERS - ****************************************/ - - /** - * @dev Gets the last available user point - * @param _addr User address - * @return bias i.e. y - * @return slope i.e. linear gradient - * @return ts i.e. time point was logged - */ - function getLastUserPoint(address _addr) - external - view - returns( - int128 bias, - int128 slope, - uint256 ts - ) - { - uint256 uepoch = userPointEpoch[_addr]; - if(uepoch == 0){ - return (0, 0, 0); - } - Point memory point = userPointHistory[_addr][uepoch]; - return (point.bias, point.slope, point.ts); - } - - /*************************************** - LOCKUP - ****************************************/ - - /** - * @dev Records a checkpoint of both individual and global slope - * @param _addr User address, or address(0) for only global - * @param _oldLocked Old amount that user had locked, or null for global - * @param _newLocked new amount that user has locked, or null for global - */ - function _checkpoint( - address _addr, - LockedBalance memory _oldLocked, - LockedBalance memory _newLocked - ) - internal - { - Point memory userOldPoint; - Point memory userNewPoint; - int128 oldSlopeDelta = 0; - int128 newSlopeDelta = 0; - uint256 epoch = globalEpoch; - - if(_addr != address(0)){ - // Calculate slopes and biases - // Kept at zero when they have to - if(_oldLocked.end > block.timestamp && _oldLocked.amount > 0){ - userOldPoint.slope = _oldLocked.amount.div(int128(MAXTIME)); - userOldPoint.bias = userOldPoint.slope.mul(int128(_oldLocked.end.sub(block.timestamp))); - } - if(_newLocked.end > block.timestamp && _newLocked.amount > 0){ - userNewPoint.slope = _newLocked.amount.div(int128(MAXTIME)); - userNewPoint.bias = userNewPoint.slope.mul(int128(_newLocked.end.sub(block.timestamp))); - } - - // Moved from bottom final if statement to resolve stack too deep err - // start { - // Now handle user history - uint256 uEpoch = userPointEpoch[_addr]; - if(uEpoch == 0){ - userPointHistory[_addr].push(userOldPoint); - } - // track the total static weight - uint256 newStatic = _staticBalance(userNewPoint.slope, block.timestamp, _newLocked.end); - uint256 additiveStaticWeight = totalStaticWeight.add(newStatic); - if(uEpoch > 0){ - uint256 oldStatic = _staticBalance(userPointHistory[_addr][uEpoch].slope, userPointHistory[_addr][uEpoch].ts, _oldLocked.end); - additiveStaticWeight = additiveStaticWeight.sub(oldStatic); - } - totalStaticWeight = additiveStaticWeight; - - userPointEpoch[_addr] = uEpoch.add(1); - userNewPoint.ts = block.timestamp; - userNewPoint.blk = block.number; - // userPointHistory[_addr][uEpoch.add(1)] = userNewPoint; - userPointHistory[_addr].push(userNewPoint); - - // } end - - // Read values of scheduled changes in the slope - // oldLocked.end can be in the past and in the future - // newLocked.end can ONLY by in the FUTURE unless everything expired: than zeros - oldSlopeDelta = slopeChanges[_oldLocked.end]; - if(_newLocked.end != 0){ - if (_newLocked.end == _oldLocked.end) { - newSlopeDelta = oldSlopeDelta; - } else { - newSlopeDelta = slopeChanges[_newLocked.end]; - } - } - } - - Point memory lastPoint = Point({bias: 0, slope: 0, ts: block.timestamp, blk: block.number}); - if(epoch > 0){ - lastPoint = pointHistory[epoch]; - } - uint256 lastCheckpoint = lastPoint.ts; - - // initialLastPoint is used for extrapolation to calculate block number - // (approximately, for *At methods) and save them - // as we cannot figure that out exactly from inside the contract - Point memory initialLastPoint = Point({bias: 0, slope: 0, ts: lastPoint.ts, blk: lastPoint.blk}); - uint256 blockSlope = 0; // dblock/dt - if(block.timestamp > lastPoint.ts){ - blockSlope = StableMath.scaleInteger(block.number.sub(lastPoint.blk)).div(block.timestamp.sub(lastPoint.ts)); - } - // If last point is already recorded in this block, slope=0 - // But that's ok b/c we know the block in such case - - // Go over weeks to fill history and calculate what the current point is - uint256 iterativeTime = _floorToWeek(lastCheckpoint); - for (uint256 i = 0; i < 255; i++){ - // Hopefully it won't happen that this won't get used in 5 years! - // If it does, users will be able to withdraw but vote weight will be broken - iterativeTime = iterativeTime.add(WEEK); - int128 dSlope = 0; - if(iterativeTime > block.timestamp){ - iterativeTime = block.timestamp; - } else { - dSlope = slopeChanges[iterativeTime]; - } - int128 biasDelta = lastPoint.slope.mul(int128(iterativeTime.sub(lastCheckpoint))); - lastPoint.bias = lastPoint.bias.sub(biasDelta); - lastPoint.slope = lastPoint.slope.add(dSlope); - // This can happen - if(lastPoint.bias < 0){ - lastPoint.bias = 0; - } - // This cannot happen - just in case - if(lastPoint.slope < 0){ - lastPoint.slope = 0; - } - lastCheckpoint = iterativeTime; - lastPoint.ts = iterativeTime; - lastPoint.blk = initialLastPoint.blk.add(blockSlope.mulTruncate(iterativeTime.sub(initialLastPoint.ts))); - - // when epoch is incremented, we either push here or after slopes updated below - epoch = epoch.add(1); - if(iterativeTime == block.timestamp) { - lastPoint.blk = block.number; - break; - } else { - // pointHistory[epoch] = lastPoint; - pointHistory.push(lastPoint); - } - } - - globalEpoch = epoch; - // Now pointHistory is filled until t=now - - if(_addr != address(0)){ - // If last point was in this block, the slope change has been applied already - // But in such case we have 0 slope(s) - lastPoint.slope = lastPoint.slope.add(userNewPoint.slope.sub(userOldPoint.slope)); - lastPoint.bias = lastPoint.bias.add(userNewPoint.bias.sub(userOldPoint.bias)); - if(lastPoint.slope < 0) { - lastPoint.slope = 0; - } - if(lastPoint.bias < 0){ - lastPoint.bias = 0; - } - } - - // Record the changed point into history - // pointHistory[epoch] = lastPoint; - pointHistory.push(lastPoint); - - if(_addr != address(0)){ - // Schedule the slope changes (slope is going down) - // We subtract new_user_slope from [new_locked.end] - // and add old_user_slope to [old_locked.end] - if(_oldLocked.end > block.timestamp){ - // oldSlopeDelta was - userOldPoint.slope, so we cancel that - oldSlopeDelta = oldSlopeDelta.add(userOldPoint.slope); - if(_newLocked.end == _oldLocked.end) { - oldSlopeDelta = oldSlopeDelta.sub(userNewPoint.slope); // It was a new deposit, not extension - } - slopeChanges[_oldLocked.end] = oldSlopeDelta; - } - if(_newLocked.end > block.timestamp) { - if(_newLocked.end > _oldLocked.end){ - newSlopeDelta = newSlopeDelta.sub(userNewPoint.slope); // old slope disappeared at this point - slopeChanges[_newLocked.end] = newSlopeDelta; - } - // else: we recorded it already in oldSlopeDelta - } - } - } - - /** - * @dev Deposits or creates a stake for a given address - * @param _addr User address to assign the stake - * @param _value Total units of StakingToken to lockup - * @param _unlockTime Time at which the stake should unlock - * @param _oldLocked Previous amount staked by this user - * @param _action See LockAction enum - */ - function _depositFor( - address _addr, - uint256 _value, - uint256 _unlockTime, - LockedBalance memory _oldLocked, - LockAction _action - ) - internal - { - LockedBalance memory newLocked = LockedBalance({amount: _oldLocked.amount, end: _oldLocked.end}); - - // Adding to existing lock, or if a lock is expired - creating a new one - newLocked.amount = newLocked.amount.add(int128(_value)); - if(_unlockTime != 0){ - newLocked.end = _unlockTime; - } - locked[_addr] = newLocked; - - // Possibilities: - // Both _oldLocked.end could be current or expired (>/< block.timestamp) - // value == 0 (extend lock) or value > 0 (add to lock or extend lock) - // newLocked.end > block.timestamp (always) - _checkpoint(_addr, _oldLocked, newLocked); - - if(_value != 0) { - stakingToken.safeTransferFrom(_addr, address(this), _value); - } - - emit Deposit(_addr, _value, newLocked.end, _action, block.timestamp); - } - - /** - * @dev Public function to trigger global checkpoint - */ - function checkpoint() external { - LockedBalance memory empty; - _checkpoint(address(0), empty, empty); - } - - /** - * @dev Creates a new lock - * @param _value Total units of StakingToken to lockup - * @param _unlockTime Time at which the stake should unlock - */ - function createLock(uint256 _value, uint256 _unlockTime) - external - nonReentrant - contractNotExpired - updateReward(msg.sender) - { - uint256 unlock_time = _floorToWeek(_unlockTime); // Locktime is rounded down to weeks - LockedBalance memory locked_ = LockedBalance({amount: locked[msg.sender].amount, end: locked[msg.sender].end}); - - require(_value > 0, "Must stake non zero amount"); - require(locked_.amount == 0, "Withdraw old tokens first"); - - require(unlock_time > block.timestamp, "Can only lock until time in the future"); - require(unlock_time <= END, "Voting lock can be 1 year max (until recol)"); - - _depositFor(msg.sender, _value, unlock_time, locked_, LockAction.CREATE_LOCK); - } - - /** - * @dev Increases amount of stake thats locked up & resets decay - * @param _value Additional units of StakingToken to add to exiting stake - */ - function increaseLockAmount(uint256 _value) - external - nonReentrant - contractNotExpired - updateReward(msg.sender) - { - LockedBalance memory locked_ = LockedBalance({amount: locked[msg.sender].amount, end: locked[msg.sender].end}); - - require(_value > 0, "Must stake non zero amount"); - require(locked_.amount > 0, "No existing lock found"); - require(locked_.end > block.timestamp, "Cannot add to expired lock. Withdraw"); - - _depositFor(msg.sender, _value, 0, locked_, LockAction.INCREASE_LOCK_AMOUNT); - } - - /** - * @dev Increases length of lockup & resets decay - * @param _unlockTime New unlocktime for lockup - */ - function increaseLockLength(uint256 _unlockTime) - external - nonReentrant - contractNotExpired - updateReward(msg.sender) - { - LockedBalance memory locked_ = LockedBalance({amount: locked[msg.sender].amount, end: locked[msg.sender].end}); - uint256 unlock_time = _floorToWeek(_unlockTime); // Locktime is rounded down to weeks - - require(locked_.amount > 0, "Nothing is locked"); - require(locked_.end > block.timestamp, "Lock expired"); - require(unlock_time > locked_.end, "Can only increase lock WEEK"); - require(unlock_time <= END, "Voting lock can be 1 year max (until recol)"); - - _depositFor(msg.sender, 0, unlock_time, locked_, LockAction.INCREASE_LOCK_TIME); - } - - /** - * @dev Withdraws all the senders stake, providing lockup is over - */ - function withdraw() - external - { - _withdraw(msg.sender); - } - - /** - * @dev Withdraws a given users stake, providing the lockup has finished - * @param _addr User for which to withdraw - */ - function _withdraw(address _addr) - internal - nonReentrant - updateReward(_addr) - { - LockedBalance memory oldLock = LockedBalance({ end: locked[_addr].end, amount: locked[_addr].amount }); - require(block.timestamp >= oldLock.end || expired, "The lock didn't expire"); - require(oldLock.amount > 0, "Must have something to withdraw"); - - uint256 value = uint256(oldLock.amount); - - LockedBalance memory currentLock = LockedBalance({end: 0, amount: 0}); - locked[_addr] = currentLock; - - // oldLocked can have either expired <= timestamp or zero end - // currentLock has only 0 end - // Both can have >= 0 amount - if(!expired){ - _checkpoint(_addr, oldLock, currentLock); - } - - stakingToken.safeTransfer(_addr, value); - - emit Withdraw(_addr, value, block.timestamp); - } - - /** - * @dev Withdraws and consequently claims rewards for the sender - */ - function exit() - external - { - _withdraw(msg.sender); - claimReward(); - } - - /** - * @dev Ejects a user from the reward allocation, given their lock has freshly expired. - * Leave it to the user to withdraw and claim their rewards. - * @param _addr Address of the user - */ - function eject(address _addr) - external - contractNotExpired - lockupIsOver(_addr) - { - _withdraw(_addr); - - // solium-disable-next-line security/no-tx-origin - emit Ejected(_addr, tx.origin, block.timestamp); - } - - /** - * @dev Ends the contract, unlocking all stakes. - * No more staking can happen. Only withdraw and Claim. - */ - function expireContract() - external - onlyGovernor - contractNotExpired - updateReward(address(0)) - { - require(block.timestamp > periodFinish, "Period must be over"); - - expired = true; - - emit Expired(); - } - - - - /*************************************** - GETTERS - ****************************************/ - - - /** @dev Floors a timestamp to the nearest weekly increment */ - function _floorToWeek(uint256 _t) - internal - pure - returns(uint256) - { - return _t.div(WEEK).mul(WEEK); - } - - /** - * @dev Uses binarysearch to find the most recent point history preceeding block - * @param _block Find the most recent point history before this block - * @param _maxEpoch Do not search pointHistories past this index - */ - function _findBlockEpoch(uint256 _block, uint256 _maxEpoch) - internal - view - returns(uint256) - { - // Binary search - uint256 min = 0; - uint256 max = _maxEpoch; - // Will be always enough for 128-bit numbers - for(uint256 i = 0; i < 128; i++){ - if (min >= max) - break; - uint256 mid = (min.add(max).add(1)).div(2); - if (pointHistory[mid].blk <= _block){ - min = mid; - } else { - max = mid.sub(1); - } - } - return min; - } - - /** - * @dev Uses binarysearch to find the most recent user point history preceeding block - * @param _addr User for which to search - * @param _block Find the most recent point history before this block - */ - function _findUserBlockEpoch(address _addr, uint256 _block) - internal - view - returns(uint256) - { - uint256 min = 0; - uint256 max = userPointEpoch[_addr]; - for(uint256 i = 0; i < 128; i++) { - if(min >= max){ - break; - } - uint256 mid = (min.add(max).add(1)).div(2); - if(userPointHistory[_addr][mid].blk <= _block){ - min = mid; - } else { - max = mid.sub(1); - } - } - return min; - } - - /** - * @dev Gets curent user voting weight (aka effectiveStake) - * @param _owner User for which to return the balance - * @return uint256 Balance of user - */ - function balanceOf(address _owner) - public - view - returns (uint256) - { - uint256 epoch = userPointEpoch[_owner]; - if(epoch == 0){ - return 0; - } - Point memory lastPoint = userPointHistory[_owner][epoch]; - lastPoint.bias = lastPoint.bias.sub(lastPoint.slope.mul(int128(block.timestamp.sub(lastPoint.ts)))); - if(lastPoint.bias < 0) { - lastPoint.bias = 0; - } - return uint256(lastPoint.bias); - } - - /** - * @dev Gets a users votingWeight at a given blockNumber - * @param _owner User for which to return the balance - * @param _blockNumber Block at which to calculate balance - * @return uint256 Balance of user - */ - function balanceOfAt(address _owner, uint256 _blockNumber) - public - view - returns (uint256) - { - require(_blockNumber <= block.number, "Must pass block number in the past"); - - // Get most recent user Point to block - uint256 userEpoch = _findUserBlockEpoch(_owner, _blockNumber); - if(userEpoch == 0){ - return 0; - } - Point memory upoint = userPointHistory[_owner][userEpoch]; - - // Get most recent global Point to block - uint256 maxEpoch = globalEpoch; - uint256 epoch = _findBlockEpoch(_blockNumber, maxEpoch); - Point memory point0 = pointHistory[epoch]; - - // Calculate delta (block & time) between user Point and target block - // Allowing us to calculate the average seconds per block between - // the two points - uint256 dBlock = 0; - uint256 dTime = 0; - if(epoch < maxEpoch){ - Point memory point1 = pointHistory[epoch.add(1)]; - dBlock = point1.blk.sub(point0.blk); - dTime = point1.ts.sub(point0.ts); - } else { - dBlock = block.number.sub(point0.blk); - dTime = block.timestamp.sub(point0.ts); - } - // (Deterministically) Estimate the time at which block _blockNumber was mined - uint256 blockTime = point0.ts; - if(dBlock != 0) { - // blockTime += dTime * (_blockNumber - point0.blk) / dBlock; - blockTime = blockTime.add(dTime.mul(_blockNumber.sub(point0.blk)).div(dBlock)); - } - // Current Bias = most recent bias - (slope * time since update) - upoint.bias = upoint.bias.sub(upoint.slope.mul(int128(blockTime.sub(upoint.ts)))); - if(upoint.bias >= 0){ - return uint256(upoint.bias); - } else { - return 0; - } - } - - /** - * @dev Calculates total supply of votingWeight at a given time _t - * @param _point Most recent point before time _t - * @param _t Time at which to calculate supply - * @return totalSupply at given point in time - */ - function _supplyAt(Point memory _point, uint256 _t) - internal - view - returns (uint256) - { - Point memory lastPoint = _point; - // Floor the timestamp to weekly interval - uint256 iterativeTime = _floorToWeek(lastPoint.ts); - // Iterate through all weeks between _point & _t to account for slope changes - for(uint256 i = 0; i < 255; i++){ - iterativeTime = iterativeTime.add(WEEK); - int128 dSlope = 0; - // If week end is after timestamp, then truncate & leave dSlope to 0 - if(iterativeTime > _t){ - iterativeTime = _t; - } - // else get most recent slope change - else { - dSlope = slopeChanges[iterativeTime]; - } - - // lastPoint.bias -= lastPoint.slope * convert(iterativeTime - lastPoint.ts, int128) - lastPoint.bias = lastPoint.bias.sub(lastPoint.slope.mul(int128(iterativeTime.sub(lastPoint.ts)))); - if(iterativeTime == _t){ - break; - } - lastPoint.slope = lastPoint.slope.add(dSlope); - lastPoint.ts = iterativeTime; - } - - if (lastPoint.bias < 0){ - lastPoint.bias = 0; - } - return uint256(lastPoint.bias); - } - - /** - * @dev Calculates current total supply of votingWeight - * @return totalSupply of voting token weight - */ - function totalSupply() - public - view - returns (uint256) - { - uint256 epoch_ = globalEpoch; - Point memory lastPoint = pointHistory[epoch_]; - return _supplyAt(lastPoint, block.timestamp); - } - - /** - * @dev Calculates total supply of votingWeight at a given blockNumber - * @param _blockNumber Block number at which to calculate total supply - * @return totalSupply of voting token weight at the given blockNumber - */ - function totalSupplyAt(uint256 _blockNumber) - public - view - returns (uint256) - { - require(_blockNumber <= block.number, "Must pass block number in the past"); - - uint256 epoch = globalEpoch; - uint256 targetEpoch = _findBlockEpoch(_blockNumber, epoch); - - Point memory point = pointHistory[targetEpoch]; - - // If point.blk > _blockNumber that means we got the initial epoch & contract did not yet exist - if(point.blk > _blockNumber){ - return 0; - } - - uint256 dTime = 0; - if(targetEpoch < epoch){ - Point memory pointNext = pointHistory[targetEpoch.add(1)]; - if(point.blk != pointNext.blk) { - dTime = (_blockNumber.sub(point.blk)).mul(pointNext.ts.sub(point.ts)).div(pointNext.blk.sub(point.blk)); - } - } else if (point.blk != block.number){ - dTime = (_blockNumber.sub(point.blk)).mul(block.timestamp.sub(point.ts)).div(block.number.sub(point.blk)); - } - // Now dTime contains info on how far are we beyond point - - return _supplyAt(point, point.ts.add(dTime)); - } - - - /*************************************** - REWARDS - ****************************************/ - - /** @dev Updates the reward for a given address, before executing function */ - modifier updateReward(address _account) { - // Setting of global vars - uint256 newRewardPerToken = rewardPerToken(); - // If statement protects against loss in initialisation case - if(newRewardPerToken > 0) { - rewardPerTokenStored = newRewardPerToken; - lastUpdateTime = lastTimeRewardApplicable(); - // Setting of personal vars based on new globals - if (_account != address(0)) { - rewards[_account] = earned(_account); - userRewardPerTokenPaid[_account] = newRewardPerToken; - } - } - _; - } - - /** - * @dev Claims outstanding rewards for the sender. - * First updates outstanding reward allocation and then transfers. - */ - function claimReward() - public - updateReward(msg.sender) - { - uint256 reward = rewards[msg.sender]; - if (reward > 0) { - rewards[msg.sender] = 0; - stakingToken.safeTransfer(msg.sender, reward); - rewardsPaid[msg.sender] = rewardsPaid[msg.sender].add(reward); - emit RewardPaid(msg.sender, reward); - } - } - - - /*************************************** - REWARDS - GETTERS - ****************************************/ - - /** - * @dev Gets the most recent Static Balance (bias) for a user - * @param _addr User for which to retrieve static balance - * @return uint256 balance - */ - function staticBalanceOf(address _addr) - public - view - returns (uint256) - { - uint256 uepoch = userPointEpoch[_addr]; - if(uepoch == 0 || userPointHistory[_addr][uepoch].bias == 0){ - return 0; - } - return _staticBalance(userPointHistory[_addr][uepoch].slope, userPointHistory[_addr][uepoch].ts, locked[_addr].end); - } - - function _staticBalance(int128 _slope, uint256 _startTime, uint256 _endTime) - internal - pure - returns (uint256) - { - if(_startTime > _endTime) return 0; - // get lockup length (end - point.ts) - uint256 lockupLength = _endTime.sub(_startTime); - // s = amount * sqrt(length) - uint256 s = uint256(_slope.mul(10000)).mul(Root.sqrt(lockupLength)); - return s; - } - - /** - * @dev Gets the RewardsToken - */ - function getRewardToken() - external - view - returns (IERC20) - { - return stakingToken; - } - - /** - * @dev Gets the duration of the rewards period - */ - function getDuration() - external - pure - returns (uint256) - { - return WEEK; - } - - /** - * @dev Gets the last applicable timestamp for this reward period - */ - function lastTimeRewardApplicable() - public - view - returns (uint256) - { - return StableMath.min(block.timestamp, periodFinish); - } - - /** - * @dev Calculates the amount of unclaimed rewards per token since last update, - * and sums with stored to give the new cumulative reward per token - * @return 'Reward' per staked token - */ - function rewardPerToken() - public - view - returns (uint256) - { - // If there is no StakingToken liquidity, avoid div(0) - uint256 totalStatic = totalStaticWeight; - if (totalStatic == 0) { - return rewardPerTokenStored; - } - // new reward units to distribute = rewardRate * timeSinceLastUpdate - uint256 rewardUnitsToDistribute = rewardRate.mul(lastTimeRewardApplicable().sub(lastUpdateTime)); - // new reward units per token = (rewardUnitsToDistribute * 1e18) / totalTokens - uint256 unitsToDistributePerToken = rewardUnitsToDistribute.divPrecisely(totalStatic); - // return summed rate - return rewardPerTokenStored.add(unitsToDistributePerToken); - } - - /** - * @dev Calculates the amount of unclaimed rewards a user has earned - * @param _addr User address - * @return Total reward amount earned - */ - function earned(address _addr) - public - view - returns (uint256) - { - // current rate per token - rate user previously received - uint256 userRewardDelta = rewardPerToken().sub(userRewardPerTokenPaid[_addr]); - // new reward = staked tokens * difference in rate - uint256 userNewReward = staticBalanceOf(_addr).mulTruncate(userRewardDelta); - // add to previous rewards - return rewards[_addr].add(userNewReward); - } - - - /*************************************** - REWARDS - ADMIN - ****************************************/ - - /** - * @dev Notifies the contract that new rewards have been added. - * Calculates an updated rewardRate based on the rewards in period. - * @param _reward Units of RewardToken that have been added to the pool - */ - function notifyRewardAmount(uint256 _reward) - external - onlyRewardsDistributor - contractNotExpired - updateReward(address(0)) - { - uint256 currentTime = block.timestamp; - // If previous period over, reset rewardRate - if (currentTime >= periodFinish) { - rewardRate = _reward.div(WEEK); - } - // If additional reward to existing period, calc sum - else { - uint256 remaining = periodFinish.sub(currentTime); - uint256 leftover = remaining.mul(rewardRate); - rewardRate = _reward.add(leftover).div(WEEK); - } - - lastUpdateTime = currentTime; - periodFinish = currentTime.add(WEEK); - - emit RewardAdded(_reward); - } -} diff --git a/contracts/governance/InitializableGovernableWhitelist.sol b/contracts/governance/InitializableGovernableWhitelist.sol deleted file mode 100644 index 9b0e0a06..00000000 --- a/contracts/governance/InitializableGovernableWhitelist.sol +++ /dev/null @@ -1,60 +0,0 @@ -pragma solidity 0.5.16; - -import { InitializableModule } from "../shared/InitializableModule.sol"; - -/** - * @title InitializableGovernableWhitelist - * @author Stability Labs Pty. Ltd. - * @notice Contract to store whitelisted address. The onlyWhitelisted() modifier should be used - * to allow the function calls only from the whitelisted addresses. - * @dev Implementing contracts are responsible for adding their own add and remove methods - * as the original purpose of this whitelist is for read optimisation. - */ -contract InitializableGovernableWhitelist is InitializableModule { - - event Whitelisted(address indexed _address); - - mapping(address => bool) public whitelist; - - /** - * @dev Modifier to allow function calls only from the whitelisted address. - */ - modifier onlyWhitelisted() { - require(whitelist[msg.sender], "Not a whitelisted address"); - _; - } - - /** - * @dev Initialization function for upgradable proxy contracts - * @param _nexus Nexus contract address - * @param _whitelisted Array of whitelisted addresses. - */ - function _initialize( - address _nexus, - address[] memory _whitelisted - ) - internal - { - InitializableModule._initialize(_nexus); - - require(_whitelisted.length > 0, "Empty whitelist array"); - - for(uint256 i = 0; i < _whitelisted.length; i++) { - _addWhitelist(_whitelisted[i]); - } - } - - /** - * @dev Adds a new whitelist address - * @param _address Address to add in whitelist - */ - function _addWhitelist(address _address) internal { - require(_address != address(0), "Address is zero"); - require(! whitelist[_address], "Already whitelisted"); - - whitelist[_address] = true; - - emit Whitelisted(_address); - } - -} \ No newline at end of file diff --git a/contracts/interfaces/IBasketManager.sol b/contracts/interfaces/IBasketManager.sol deleted file mode 100644 index 10b0d662..00000000 --- a/contracts/interfaces/IBasketManager.sol +++ /dev/null @@ -1,63 +0,0 @@ -pragma solidity 0.5.16; -pragma experimental ABIEncoderV2; - -import { MassetStructs } from "../masset/shared/MassetStructs.sol"; - -/** - * @title IBasketManager - * @dev (Internal) Interface for interacting with BasketManager - * VERSION: 1.0 - * DATE: 2020-05-05 - */ -contract IBasketManager is MassetStructs { - - /** @dev Setters for mAsset to update balances */ - function increaseVaultBalance( - uint8 _bAsset, - address _integrator, - uint256 _increaseAmount) external; - function increaseVaultBalances( - uint8[] calldata _bAsset, - address[] calldata _integrator, - uint256[] calldata _increaseAmount) external; - function decreaseVaultBalance( - uint8 _bAsset, - address _integrator, - uint256 _decreaseAmount) external; - function decreaseVaultBalances( - uint8[] calldata _bAsset, - address[] calldata _integrator, - uint256[] calldata _decreaseAmount) external; - function collectInterest() external - returns (uint256 interestCollected, uint256[] memory gains); - - /** @dev Setters for Gov to update Basket composition */ - function addBasset( - address _basset, - address _integration, - bool _isTransferFeeCharged) external returns (uint8 index); - function setBasketWeights(address[] calldata _bassets, uint256[] calldata _weights) external; - function setTransferFeesFlag(address _bAsset, bool _flag) external; - - /** @dev Getters to retrieve Basket information */ - function getBasket() external view returns (Basket memory b); - function prepareForgeBasset(address _token, uint256 _amt, bool _mint) external - returns (bool isValid, BassetDetails memory bInfo); - function prepareSwapBassets(address _input, address _output, bool _isMint) external view - returns (bool, string memory, BassetDetails memory, BassetDetails memory); - function prepareForgeBassets(address[] calldata _bAssets, uint256[] calldata _amts, bool _mint) external - returns (ForgePropsMulti memory props); - function prepareRedeemBassets(address[] calldata _bAssets) external view - returns (RedeemProps memory props); - function prepareRedeemMulti() external view - returns (RedeemPropsMulti memory props); - function getBasset(address _token) external view - returns (Basset memory bAsset); - function getBassets() external view - returns (Basset[] memory bAssets, uint256 len); - function paused() external view returns (bool); - - /** @dev Recollateralisation */ - function handlePegLoss(address _basset, bool _belowPeg) external returns (bool actioned); - function negateIsolation(address _basset) external; -} diff --git a/contracts/interfaces/IBoostedVaultWithLockup.sol b/contracts/interfaces/IBoostedVaultWithLockup.sol new file mode 100644 index 00000000..a85cd94a --- /dev/null +++ b/contracts/interfaces/IBoostedVaultWithLockup.sol @@ -0,0 +1,102 @@ +// SPDX-License-Identifier: AGPL-3.0-or-later +pragma solidity 0.8.0; + +import { IERC20 } from "@openzeppelin/contracts-sol8/contracts/token/ERC20/IERC20.sol"; + +interface IBoostedVaultWithLockup { + /** + * @dev Stakes a given amount of the StakingToken for the sender + * @param _amount Units of StakingToken + */ + function stake(uint256 _amount) external; + + /** + * @dev Stakes a given amount of the StakingToken for a given beneficiary + * @param _beneficiary Staked tokens are credited to this address + * @param _amount Units of StakingToken + */ + function stake(address _beneficiary, uint256 _amount) external; + + /** + * @dev Withdraws stake from pool and claims any unlocked rewards. + * Note, this function is costly - the args for _claimRewards + * should be determined off chain and then passed to other fn + */ + function exit() external; + + /** + * @dev Withdraws stake from pool and claims any unlocked rewards. + * @param _first Index of the first array element to claim + * @param _last Index of the last array element to claim + */ + function exit(uint256 _first, uint256 _last) external; + + /** + * @dev Withdraws given stake amount from the pool + * @param _amount Units of the staked token to withdraw + */ + function withdraw(uint256 _amount) external; + + /** + * @dev Claims only the tokens that have been immediately unlocked, not including + * those that are in the lockers. + */ + function claimReward() external; + + /** + * @dev Claims all unlocked rewards for sender. + * Note, this function is costly - the args for _claimRewards + * should be determined off chain and then passed to other fn + */ + function claimRewards() external; + + /** + * @dev Claims all unlocked rewards for sender. Both immediately unlocked + * rewards and also locked rewards past their time lock. + * @param _first Index of the first array element to claim + * @param _last Index of the last array element to claim + */ + function claimRewards(uint256 _first, uint256 _last) external; + + /** + * @dev Pokes a given account to reset the boost + */ + function pokeBoost(address _account) external; + + /** + * @dev Gets the last applicable timestamp for this reward period + */ + function lastTimeRewardApplicable() external view returns (uint256); + + /** + * @dev Calculates the amount of unclaimed rewards per token since last update, + * and sums with stored to give the new cumulative reward per token + * @return 'Reward' per staked token + */ + function rewardPerToken() external view returns (uint256); + + /** + * @dev Returned the units of IMMEDIATELY claimable rewards a user has to receive. Note - this + * does NOT include the majority of rewards which will be locked up. + * @param _account User address + * @return Total reward amount earned + */ + function earned(address _account) external view returns (uint256); + + /** + * @dev Calculates all unclaimed reward data, finding both immediately unlocked rewards + * and those that have passed their time lock. + * @param _account User address + * @return amount Total units of unclaimed rewards + * @return first Index of the first userReward that has unlocked + * @return last Index of the last userReward that has unlocked + */ + function unclaimedRewards(address _account) + external + view + returns ( + uint256 amount, + uint256 first, + uint256 last + ); +} diff --git a/contracts/interfaces/IIncentivisedVotingLockup.sol b/contracts/interfaces/IIncentivisedVotingLockup.sol index fc7c4e04..ad53accd 100644 --- a/contracts/interfaces/IIncentivisedVotingLockup.sol +++ b/contracts/interfaces/IIncentivisedVotingLockup.sol @@ -1,17 +1,32 @@ -pragma solidity 0.5.16; +// SPDX-License-Identifier: AGPL-3.0-or-later +pragma solidity 0.8.0; import { IERC20WithCheckpointing } from "../shared/IERC20WithCheckpointing.sol"; -contract IIncentivisedVotingLockup is IERC20WithCheckpointing { +abstract contract IIncentivisedVotingLockup is IERC20WithCheckpointing { + function getLastUserPoint(address _addr) + external + view + virtual + returns ( + int128 bias, + int128 slope, + uint256 ts + ); - function getLastUserPoint(address _addr) external view returns(int128 bias, int128 slope, uint256 ts); - function createLock(uint256 _value, uint256 _unlockTime) external; - function withdraw() external; - function increaseLockAmount(uint256 _value) external; - function increaseLockLength(uint256 _unlockTime) external; - function eject(address _user) external; - function expireContract() external; + function createLock(uint256 _value, uint256 _unlockTime) external virtual; - function claimReward() public; - function earned(address _account) public view returns (uint256); -} \ No newline at end of file + function withdraw() external virtual; + + function increaseLockAmount(uint256 _value) external virtual; + + function increaseLockLength(uint256 _unlockTime) external virtual; + + function eject(address _user) external virtual; + + function expireContract() external virtual; + + function claimReward() public virtual; + + function earned(address _account) public view virtual returns (uint256); +} diff --git a/contracts/interfaces/IMStableHelper.sol b/contracts/interfaces/IMStableHelper.sol deleted file mode 100644 index 631fa9cd..00000000 --- a/contracts/interfaces/IMStableHelper.sol +++ /dev/null @@ -1,124 +0,0 @@ -pragma solidity 0.5.16; - -import { ISavingsContract } from "./ISavingsContract.sol"; - -interface IMStableHelper { - - /** - * @dev Returns a valid bAsset with which to mint - * @param _mAsset Masset addr - * @return valid bool - * @return string message - * @return address of bAsset to mint - */ - function suggestMintAsset( - address _mAsset - ) - external - view - returns ( - bool, - string memory, - address - ); - - /** - * @dev Gets the maximum input for a valid swap pair - * @param _mAsset mAsset address (e.g. mUSD) - * @param _input Asset to input only bAssets accepted - * @param _output Either a bAsset or the mAsset - * @return valid - * @return validity reason - * @return max input units (in native decimals) - * @return how much output this input would produce (in native decimals, after any fee) - */ - function getMaxSwap( - address _mAsset, - address _input, - address _output - ) - external - view - returns ( - bool, - string memory, - uint256, - uint256 - ); - - - /** - * @dev Returns a valid bAsset to redeem - * @param _mAsset Masset addr - * @return valid bool - * @return string message - * @return address of bAsset to redeem - */ - function suggestRedeemAsset( - address _mAsset - ) - external - view - returns ( - bool, - string memory, - address - ); - - /** - * @dev Determines if a given Redemption is valid - * @param _mAsset Address of the given mAsset (e.g. mUSD) - * @param _mAssetQuantity Amount of mAsset to redeem (in mUSD units) - * @param _outputBasset Desired output bAsset - * @return valid - * @return validity reason - * @return output in bAsset units - * @return bAssetQuantityArg - required input argument to the 'redeem' call - */ - function getRedeemValidity( - address _mAsset, - uint256 _mAssetQuantity, - address _outputBasset - ) - external - view - returns ( - bool, - string memory, - uint256 output, - uint256 bassetQuantityArg - ); - - /** - * @dev Gets the users savings balance in Masset terms - * @param _save SAVE contract address - * @param _user Address of the user - * @return balance in Masset units - */ - function getSaveBalance( - ISavingsContract _save, - address _user - ) - external - view - returns ( - uint256 - ); - - /** - * @dev Returns the 'credit' units required to withdraw a certain - * amount of Masset from the SAVE contract - * @param _save SAVE contract address - * @param _amount Amount of mAsset to redeem from SAVE - * @return input for the redeem function (ie. credit units to redeem) - */ - function getSaveRedeemInput( - ISavingsContract _save, - uint256 _amount - ) - external - view - returns ( - uint256 - ); -} \ No newline at end of file diff --git a/contracts/interfaces/IMasset.sol b/contracts/interfaces/IMasset.sol index d7a6f124..73f39475 100644 --- a/contracts/interfaces/IMasset.sol +++ b/contracts/interfaces/IMasset.sol @@ -1,51 +1,119 @@ -pragma solidity 0.5.16; - -import { MassetStructs } from "../masset/shared/MassetStructs.sol"; - -/** - * @title IMasset - * @dev (Internal) Interface for interacting with Masset - * VERSION: 1.0 - * DATE: 2020-05-05 - */ -contract IMasset is MassetStructs { - - /** @dev Calc interest */ - function collectInterest() external returns (uint256 swapFeesGained, uint256 newTotalSupply); - function collectPlatformInterest() external returns (uint256 interestGained, uint256 newTotalSupply); - - /** @dev Minting */ - function mint(address _basset, uint256 _bassetQuantity) - external returns (uint256 massetMinted); - function mintTo(address _basset, uint256 _bassetQuantity, address _recipient) - external returns (uint256 massetMinted); - function mintMulti(address[] calldata _bAssets, uint256[] calldata _bassetQuantity, address _recipient) - external returns (uint256 massetMinted); - - /** @dev Swapping */ - function swap( address _input, address _output, uint256 _quantity, address _recipient) - external returns (uint256 output); - function getSwapOutput( address _input, address _output, uint256 _quantity) - external view returns (bool, string memory, uint256 output); - - /** @dev Redeeming */ - function redeem(address _basset, uint256 _bassetQuantity) - external returns (uint256 massetRedeemed); - function redeemTo(address _basset, uint256 _bassetQuantity, address _recipient) - external returns (uint256 massetRedeemed); - function redeemMulti(address[] calldata _bAssets, uint256[] calldata _bassetQuantities, address _recipient) - external returns (uint256 massetRedeemed); - function redeemMasset(uint256 _mAssetQuantity, address _recipient) external; - - /** @dev Setters for the Manager or Gov to update module info */ - function upgradeForgeValidator(address _newForgeValidator) external; - - /** @dev Setters for Gov to set system params */ - function setSwapFee(uint256 _swapFee) external; - - /** @dev Getters */ - function getBasketManager() external view returns(address); - function forgeValidator() external view returns (address); - function totalSupply() external view returns (uint256); - function swapFee() external view returns (uint256); +// SPDX-License-Identifier: AGPL-3.0-or-later +pragma solidity 0.8.0; +pragma abicoder v2; + +import { MassetStructs } from "../masset/MassetStructs.sol"; + +abstract contract IMasset is MassetStructs { + // Mint + function mint( + address _input, + uint256 _inputQuantity, + uint256 _minOutputQuantity, + address _recipient + ) external virtual returns (uint256 mintOutput); + + function mintMulti( + address[] calldata _inputs, + uint256[] calldata _inputQuantities, + uint256 _minOutputQuantity, + address _recipient + ) external virtual returns (uint256 mintOutput); + + function getMintOutput(address _input, uint256 _inputQuantity) + external + view + virtual + returns (uint256 mintOutput); + + function getMintMultiOutput(address[] calldata _inputs, uint256[] calldata _inputQuantities) + external + view + virtual + returns (uint256 mintOutput); + + // Swaps + function swap( + address _input, + address _output, + uint256 _inputQuantity, + uint256 _minOutputQuantity, + address _recipient + ) external virtual returns (uint256 swapOutput); + + function getSwapOutput( + address _input, + address _output, + uint256 _inputQuantity + ) external view virtual returns (uint256 swapOutput); + + // Redemption + function redeem( + address _output, + uint256 _mAssetQuantity, + uint256 _minOutputQuantity, + address _recipient + ) external virtual returns (uint256 outputQuantity); + + function redeemMasset( + uint256 _mAssetQuantity, + uint256[] calldata _minOutputQuantities, + address _recipient + ) external virtual returns (uint256[] memory outputQuantities); + + function redeemExactBassets( + address[] calldata _outputs, + uint256[] calldata _outputQuantities, + uint256 _maxMassetQuantity, + address _recipient + ) external virtual returns (uint256 mAssetRedeemed); + + function getRedeemOutput(address _output, uint256 _mAssetQuantity) + external + view + virtual + returns (uint256 bAssetOutput); + + function getRedeemExactBassetsOutput( + address[] calldata _outputs, + uint256[] calldata _outputQuantities + ) external view virtual returns (uint256 mAssetAmount); + + // Views + function getBasket() external view virtual returns (bool, bool); + + function getBasset(address _token) + external + view + virtual + returns (BassetPersonal memory personal, BassetData memory data); + + function getBassets() + external + view + virtual + returns (BassetPersonal[] memory personal, BassetData[] memory data); + + function bAssetIndexes(address) external view virtual returns (uint8); + + // SavingsManager + function collectInterest() external virtual returns (uint256 swapFeesGained, uint256 newSupply); + + function collectPlatformInterest() + external + virtual + returns (uint256 mintAmount, uint256 newSupply); + + // Admin + function setCacheSize(uint256 _cacheSize) external virtual; + + function upgradeForgeValidator(address _newForgeValidator) external virtual; + + function setFees(uint256 _swapFee, uint256 _redemptionFee) external virtual; + + function setTransferFeesFlag(address _bAsset, bool _flag) external virtual; + + function migrateBassets(address[] calldata _bAssets, address _newIntegration) external virtual; } + +abstract contract Deprecated_BasketManager is MassetStructs {} diff --git a/contracts/interfaces/IMetaToken.sol b/contracts/interfaces/IMetaToken.sol deleted file mode 100644 index 437d018d..00000000 --- a/contracts/interfaces/IMetaToken.sol +++ /dev/null @@ -1,25 +0,0 @@ -pragma solidity 0.5.16; - -/** - * @title IMetaToken - * @dev Interface for MetaToken - */ -interface IMetaToken { - /** @dev Basic ERC20 funcs */ - function name() external view returns (string memory); - function symbol() external view returns (string memory); - function decimals() external view returns (uint8); - function totalSupply() external view returns (uint256); - function balanceOf(address account) external view returns (uint256); - function transfer(address recipient, uint256 amount) external returns (bool); - function allowance(address owner, address spender) external view returns (uint256); - function approve(address spender, uint256 amount) external returns (bool); - function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); - - /** @dev Burnable */ - function burn(uint256 amount) external; - function burnFrom(address account, uint256 amount) external; - - /** @dev Mintable */ - function mint(address account, uint256 amount) external returns (bool); -} \ No newline at end of file diff --git a/contracts/interfaces/INexus.sol b/contracts/interfaces/INexus.sol index 258fdd51..4644c191 100644 --- a/contracts/interfaces/INexus.sol +++ b/contracts/interfaces/INexus.sol @@ -1,19 +1,26 @@ -pragma solidity 0.5.16; +// SPDX-License-Identifier: AGPL-3.0-or-later +pragma solidity 0.8.0; /** - * @title INexus - * @dev Basic interface for interacting with the Nexus i.e. SystemKernel - */ + * @title INexus + * @dev Basic interface for interacting with the Nexus i.e. SystemKernel + */ interface INexus { function governor() external view returns (address); + function getModule(bytes32 key) external view returns (address); function proposeModule(bytes32 _key, address _addr) external; + function cancelProposedModule(bytes32 _key) external; + function acceptProposedModule(bytes32 _key) external; + function acceptProposedModules(bytes32[] calldata _keys) external; function requestLockModule(bytes32 _key) external; + function cancelLockModule(bytes32 _key) external; + function lockModule(bytes32 _key) external; -} \ No newline at end of file +} diff --git a/contracts/interfaces/IPlatformIntegration.sol b/contracts/interfaces/IPlatformIntegration.sol index 992ddda4..05e38ed7 100644 --- a/contracts/interfaces/IPlatformIntegration.sol +++ b/contracts/interfaces/IPlatformIntegration.sol @@ -1,32 +1,50 @@ -pragma solidity 0.5.16; +// SPDX-License-Identifier: AGPL-3.0-or-later +pragma solidity 0.8.0; /** * @title Platform interface to integrate with lending platform like Compound, AAVE etc. */ interface IPlatformIntegration { - /** * @dev Deposit the given bAsset to Lending platform * @param _bAsset bAsset address * @param _amount Amount to deposit */ - function deposit(address _bAsset, uint256 _amount, bool isTokenFeeCharged) - external returns (uint256 quantityDeposited); + function deposit( + address _bAsset, + uint256 _amount, + bool isTokenFeeCharged + ) external returns (uint256 quantityDeposited); /** * @dev Withdraw given bAsset from Lending platform */ - function withdraw(address _receiver, address _bAsset, uint256 _amount, bool _hasTxFee) external; + function withdraw( + address _receiver, + address _bAsset, + uint256 _amount, + bool _hasTxFee + ) external; /** * @dev Withdraw given bAsset from Lending platform */ - function withdraw(address _receiver, address _bAsset, uint256 _amount, uint256 _totalAmount, bool _hasTxFee) external; + function withdraw( + address _receiver, + address _bAsset, + uint256 _amount, + uint256 _totalAmount, + bool _hasTxFee + ) external; /** * @dev Withdraw given bAsset from the cache */ - function withdrawRaw(address _receiver, address _bAsset, uint256 _amount) external; + function withdrawRaw( + address _receiver, + address _bAsset, + uint256 _amount + ) external; /** * @dev Returns the current balance of the given bAsset diff --git a/contracts/interfaces/IRewardsDistributionRecipient.sol b/contracts/interfaces/IRewardsDistributionRecipient.sol index b49a601a..03d38795 100644 --- a/contracts/interfaces/IRewardsDistributionRecipient.sol +++ b/contracts/interfaces/IRewardsDistributionRecipient.sol @@ -1,8 +1,10 @@ -pragma solidity 0.5.16; +// SPDX-License-Identifier: AGPL-3.0-or-later +pragma solidity 0.8.0; -import { IERC20 } from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import { IERC20 } from "@openzeppelin/contracts-sol8/contracts/token/ERC20/IERC20.sol"; interface IRewardsDistributionRecipient { function notifyRewardAmount(uint256 reward) external; + function getRewardToken() external view returns (IERC20); -} \ No newline at end of file +} diff --git a/contracts/interfaces/ISavingsContract.sol b/contracts/interfaces/ISavingsContract.sol index 23aadcea..3094d3d1 100644 --- a/contracts/interfaces/ISavingsContract.sol +++ b/contracts/interfaces/ISavingsContract.sol @@ -1,18 +1,43 @@ -pragma solidity 0.5.16; +// SPDX-License-Identifier: AGPL-3.0-or-later +pragma solidity 0.8.0; -/** - * @title ISavingsContract - */ -interface ISavingsContract { - - /** @dev Manager privs */ +interface ISavingsContractV1 { function depositInterest(uint256 _amount) external; - /** @dev Saver privs */ function depositSavings(uint256 _amount) external returns (uint256 creditsIssued); + function redeem(uint256 _amount) external returns (uint256 massetReturned); - /** @dev Getters */ function exchangeRate() external view returns (uint256); + function creditBalances(address) external view returns (uint256); -} \ No newline at end of file +} + +interface ISavingsContractV2 { + // DEPRECATED but still backwards compatible + function redeem(uint256 _amount) external returns (uint256 massetReturned); + + function creditBalances(address) external view returns (uint256); // V1 & V2 (use balanceOf) + + // -------------------------------------------- + + function depositInterest(uint256 _amount) external; // V1 & V2 + + function depositSavings(uint256 _amount) external returns (uint256 creditsIssued); // V1 & V2 + + function depositSavings(uint256 _amount, address _beneficiary) + external + returns (uint256 creditsIssued); // V2 + + function redeemCredits(uint256 _amount) external returns (uint256 underlyingReturned); // V2 + + function redeemUnderlying(uint256 _amount) external returns (uint256 creditsBurned); // V2 + + function exchangeRate() external view returns (uint256); // V1 & V2 + + function balanceOfUnderlying(address _user) external view returns (uint256 balance); // V2 + + function underlyingToCredits(uint256 _credits) external view returns (uint256 underlying); // V2 + + function creditsToUnderlying(uint256 _underlying) external view returns (uint256 credits); // V2 +} diff --git a/contracts/interfaces/ISavingsManager.sol b/contracts/interfaces/ISavingsManager.sol index 8eca390e..c3da9335 100644 --- a/contracts/interfaces/ISavingsManager.sol +++ b/contracts/interfaces/ISavingsManager.sol @@ -1,10 +1,10 @@ -pragma solidity 0.5.16; +// SPDX-License-Identifier: AGPL-3.0-or-later +pragma solidity 0.8.0; /** * @title ISavingsManager */ interface ISavingsManager { - /** @dev Admin privs */ function distributeUnallocatedInterest(address _mAsset) external; @@ -19,7 +19,6 @@ interface ISavingsManager { } interface IRevenueRecipient { - /** @dev Recipient */ function notifyRedistributionAmount(address _mAsset, uint256 _amount) external; -} \ No newline at end of file +} diff --git a/contracts/interfaces/IUniswapV2Router02.sol b/contracts/interfaces/IUniswapV2Router02.sol new file mode 100644 index 00000000..493a7a4f --- /dev/null +++ b/contracts/interfaces/IUniswapV2Router02.sol @@ -0,0 +1,29 @@ +// SPDX-License-Identifier: AGPL-3.0-or-later +pragma solidity 0.8.0; + +interface IUniswapV2Router02 { + function swapExactTokensForTokens( + uint256 amountIn, + uint256 amountOutMin, // calculated off chain + address[] calldata path, // also worked out off chain + address to, + uint256 deadline + ) external returns (uint256[] memory amounts); + + function swapExactETHForTokens( + uint256 amountOutMin, + address[] calldata path, + address to, + uint256 deadline + ) external payable returns (uint256[] memory amounts); + + function getAmountsIn(uint256 amountOut, address[] calldata path) + external + view + returns (uint256[] memory amounts); + + function getAmountsOut(uint256 amountIn, address[] calldata path) + external + view + returns (uint256[] memory amounts); +} diff --git a/contracts/masset/BasketManager.sol b/contracts/masset/BasketManager.sol deleted file mode 100644 index 114842b6..00000000 --- a/contracts/masset/BasketManager.sol +++ /dev/null @@ -1,964 +0,0 @@ -pragma solidity 0.5.16; -pragma experimental ABIEncoderV2; - -// External -import { IPlatformIntegration } from "../interfaces/IPlatformIntegration.sol"; -import { IERC20 } from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; - -// Internal -import { InitializablePausableModule } from "../shared/InitializablePausableModule.sol"; -import { IBasketManager } from "../interfaces/IBasketManager.sol"; -import { Initializable } from "@openzeppelin/upgrades/contracts/Initializable.sol"; - -// Libs -import { CommonHelpers } from "../shared/CommonHelpers.sol"; -import { SafeERC20 } from "@openzeppelin/contracts/token/ERC20/SafeERC20.sol"; -import { SafeMath } from "@openzeppelin/contracts/math/SafeMath.sol"; -import { StableMath } from "../shared/StableMath.sol"; -import { InitializableReentrancyGuard } from "../shared/InitializableReentrancyGuard.sol"; - -/** - * @title BasketManager - * @notice Manages the Basket composition for a particular mAsset. Feeds all required - * basket data to the mAsset and is responsible for keeping accurate records. - * BasketManager can also optimise lending pool integrations and perform - * re-collateralisation on failed bAssets. - * @dev VERSION: 2.0 - * DATE: 2020-11-14 - */ -contract BasketManager is - Initializable, - IBasketManager, - InitializablePausableModule, - InitializableReentrancyGuard -{ - using SafeMath for uint256; - using StableMath for uint256; - using SafeERC20 for IERC20; - - // Events for Basket composition changes - event BassetAdded(address indexed bAsset, address integrator); - event BassetRemoved(address indexed bAsset); - event BassetsMigrated(address[] bAssets, address newIntegrator); - event BasketWeightsUpdated(address[] bAssets, uint256[] maxWeights); - event BassetStatusChanged(address indexed bAsset, BassetStatus status); - event BasketStatusChanged(); - event TransferFeeEnabled(address indexed bAsset, bool enabled); - - // mAsset linked to the manager (const) - address public mAsset; - - // Struct holding Basket details - Basket public basket; - // Mapping holds bAsset token address => array index - mapping(address => uint8) private bAssetsMap; - // Holds relative addresses of the integration platforms - address[] public integrations; - - /** - * @dev Initialization function for upgradable proxy contract. - * This function should be called via Proxy just after contract deployment. - * @param _nexus Address of system Nexus - * @param _mAsset Address of the mAsset whose Basket to manage - * @param _bAssets Array of erc20 bAsset addresses - * @param _integrators Matching array of the platform intergations for bAssets - * @param _weights Weightings of each bAsset, summing to 1e18 - * @param _hasTransferFees Bool signifying if this bAsset has xfer fees - */ - function initialize( - address _nexus, - address _mAsset, - address[] calldata _bAssets, - address[] calldata _integrators, - uint256[] calldata _weights, - bool[] calldata _hasTransferFees - ) - external - initializer - { - InitializableReentrancyGuard._initialize(); - InitializablePausableModule._initialize(_nexus); - - require(_mAsset != address(0), "mAsset address is zero"); - require(_bAssets.length > 0, "Must initialise with some bAssets"); - mAsset = _mAsset; - - // Defaults - basket.maxBassets = 10; // 10 - basket.collateralisationRatio = 1e18; // 100% - - for (uint256 i = 0; i < _bAssets.length; i++) { - _addBasset( - _bAssets[i], - _integrators[i], - StableMath.getRatioScale(), - _hasTransferFees[i] - ); - } - _setBasketWeights(_bAssets, _weights, true); - } - - /** - * @dev Requires the overall basket composition to be healthy - */ - modifier whenBasketIsHealthy() { - require(!basket.failed, "Basket must be alive"); - _; - } - - /** - * @dev Requires the overall basket composition to be healthy - */ - modifier whenNotRecolling() { - require(!basket.undergoingRecol, "No bAssets can be undergoing recol"); - _; - } - - /** - * @dev Verifies that the caller either Manager or Gov - */ - modifier managerOrGovernor() { - require( - _manager() == msg.sender || _governor() == msg.sender, - "Must be manager or governor"); - _; - } - - /** - * @dev Verifies that the caller is governed mAsset - */ - modifier onlyMasset() { - require(mAsset == msg.sender, "Must be called by mAsset"); - _; - } - - /*************************************** - VAULT BALANCE - ****************************************/ - - /** - * @dev Called by only mAsset, and only when the basket is healthy, to add units to - * storage after they have been deposited into the vault - * @param _bAssetIndex Index of the bAsset - * @param _increaseAmount Units deposited - */ - function increaseVaultBalance( - uint8 _bAssetIndex, - address /* _integrator */, - uint256 _increaseAmount - ) - external - onlyMasset - whenBasketIsHealthy - nonReentrant - { - basket.bassets[_bAssetIndex].vaultBalance = - basket.bassets[_bAssetIndex].vaultBalance.add(_increaseAmount); - } - - /** - * @dev Called by only mAsset, and only when the basket is healthy, to add units to - * storage after they have been deposited into the vault - * @param _bAssetIndices Array of bAsset indexes - * @param _increaseAmount Units deposited - */ - function increaseVaultBalances( - uint8[] calldata _bAssetIndices, - address[] calldata /* _integrator */, - uint256[] calldata _increaseAmount - ) - external - onlyMasset - whenBasketIsHealthy - nonReentrant - { - uint256 len = _bAssetIndices.length; - for(uint i = 0; i < len; i++) { - basket.bassets[_bAssetIndices[i]].vaultBalance = - basket.bassets[_bAssetIndices[i]].vaultBalance.add(_increaseAmount[i]); - } - } - - /** - * @dev Called by mAsset after redeeming tokens. Simply reduce the balance in the vault - * @param _bAssetIndex Index of the bAsset - * @param _decreaseAmount Units withdrawn - */ - function decreaseVaultBalance( - uint8 _bAssetIndex, - address /* _integrator */, - uint256 _decreaseAmount - ) - external - onlyMasset - nonReentrant - { - basket.bassets[_bAssetIndex].vaultBalance = - basket.bassets[_bAssetIndex].vaultBalance.sub(_decreaseAmount); - } - - /** - * @dev Called by mAsset after redeeming tokens. Simply reduce the balance in the vault - * @param _bAssetIndices Array of bAsset indexes - * @param _decreaseAmount Units withdrawn - */ - function decreaseVaultBalances( - uint8[] calldata _bAssetIndices, - address[] calldata /* _integrator */, - uint256[] calldata _decreaseAmount - ) - external - onlyMasset - nonReentrant - { - uint256 len = _bAssetIndices.length; - for(uint i = 0; i < len; i++) { - basket.bassets[_bAssetIndices[i]].vaultBalance = - basket.bassets[_bAssetIndices[i]].vaultBalance.sub(_decreaseAmount[i]); - } - } - - /** - * @dev Called by mAsset to calculate how much interest has been generated in the basket - * and withdraw it. Cycles through the connected platforms to check the balances. - * @return interestCollected Total amount of interest collected, in mAsset terms - * @return gains Array of bAsset units gained - */ - function collectInterest() - external - onlyMasset - whenNotPaused - whenBasketIsHealthy - nonReentrant - returns (uint256 interestCollected, uint256[] memory gains) - { - // Get basket details - (Basset[] memory allBassets, uint256 count) = _getBassets(); - gains = new uint256[](count); - interestCollected = 0; - - // foreach bAsset - for(uint8 i = 0; i < count; i++) { - Basset memory b = allBassets[i]; - address bAsset = b.addr; - - // call each integration to `checkBalance` and sum with the cache balance - address integration = integrations[i]; - uint256 lending = IPlatformIntegration(integration).checkBalance(bAsset); - uint256 cache = 0; - if (!b.isTransferFeeCharged) { - cache = IERC20(bAsset).balanceOf(integration); - } - uint256 balance = lending.add(cache); - - uint256 oldVaultBalance = b.vaultBalance; - - // accumulate interest (ratioed bAsset) - if(balance > oldVaultBalance && b.status == BassetStatus.Normal) { - // Update balance - basket.bassets[i].vaultBalance = balance; - - uint256 interestDelta = balance.sub(oldVaultBalance); - gains[i] = interestDelta; - - // Calc MassetQ - uint256 ratioedDelta = interestDelta.mulRatioTruncate(b.ratio); - interestCollected = interestCollected.add(ratioedDelta); - } else { - gains[i] = 0; - } - } - } - - - /*************************************** - BASKET MANAGEMENT - ****************************************/ - - /** - * @dev External func to allow the Governor to conduct add operations on the Basket - * @param _bAsset Address of the ERC20 token to add to the Basket - * @param _integration Address of the vault integration to deposit and withdraw - * @param _isTransferFeeCharged Bool - are transfer fees charged on this bAsset - * @return index Position of the bAsset in the Basket - */ - function addBasset(address _bAsset, address _integration, bool _isTransferFeeCharged) - external - onlyGovernor - whenBasketIsHealthy - whenNotRecolling - returns (uint8 index) - { - index = _addBasset( - _bAsset, - _integration, - StableMath.getRatioScale(), - _isTransferFeeCharged - ); - } - - /** - * @dev Adds a bAsset to the Basket, fetching its decimals and calculating the Ratios - * @param _bAsset Address of the ERC20 token to add to the Basket - * @param _integration Address of the Platform Integration - * @param _measurementMultiple Base 1e8 var to determine measurement ratio - * between bAsset:mAsset - * @param _isTransferFeeCharged Bool - are transfer fees charged on this bAsset - * @return index Position of the bAsset in the Basket - */ - function _addBasset( - address _bAsset, - address _integration, - uint256 _measurementMultiple, - bool _isTransferFeeCharged - ) - internal - returns (uint8 index) - { - require(_bAsset != address(0), "bAsset address must be valid"); - require(_integration != address(0), "Integration address must be valid"); - require(_measurementMultiple >= 1e6 && _measurementMultiple <= 1e10, "MM out of range"); - - (bool alreadyInBasket, ) = _isAssetInBasket(_bAsset); - require(!alreadyInBasket, "bAsset already exists in Basket"); - - // Should fail if bAsset is not added to integration - // Programmatic enforcement of bAsset validity should service through decentralised feed - IPlatformIntegration(_integration).checkBalance(_bAsset); - - uint256 bAsset_decimals = CommonHelpers.getDecimals(_bAsset); - uint256 delta = uint256(18).sub(bAsset_decimals); - - uint256 ratio = _measurementMultiple.mul(10 ** delta); - - uint8 numberOfBassetsInBasket = uint8(basket.bassets.length); - require(numberOfBassetsInBasket < basket.maxBassets, "Max bAssets in Basket"); - - bAssetsMap[_bAsset] = numberOfBassetsInBasket; - - integrations.push(_integration); - basket.bassets.push(Basset({ - addr: _bAsset, - ratio: ratio, - maxWeight: 0, - vaultBalance: 0, - status: BassetStatus.Normal, - isTransferFeeCharged: _isTransferFeeCharged - })); - - emit BassetAdded(_bAsset, _integration); - - index = numberOfBassetsInBasket; - } - - - /** - * @dev External call for the governor to set weightings of all bAssets - * @param _bAssets Array of bAsset addresses - * @param _weights Array of bAsset weights - summing 100% where 100% == 1e18 - */ - function setBasketWeights( - address[] calldata _bAssets, - uint256[] calldata _weights - ) - external - onlyGovernor - whenBasketIsHealthy - { - _setBasketWeights(_bAssets, _weights, false); - } - - /** - * @notice Sets new Basket weightings - * @dev Requires the modified bAssets to be in a Normal state - * @param _bAssets Array of bAsset addresses - * @param _weights Array of bAsset weights - summing 100% where 100% == 1e18 - * @param _isBootstrap True only on the first occurence of weight setting - */ - function _setBasketWeights( - address[] memory _bAssets, - uint256[] memory _weights, - bool _isBootstrap - ) - internal - { - uint256 bAssetCount = _bAssets.length; - require(bAssetCount > 0, "Empty bAssets array passed"); - require(bAssetCount == _weights.length, "Must be matching bAsset arrays"); - - for (uint256 i = 0; i < bAssetCount; i++) { - (bool exists, uint8 index) = _isAssetInBasket(_bAssets[i]); - require(exists, "bAsset must exist"); - - Basset memory bAsset = _getBasset(index); - - uint256 bAssetWeight = _weights[i]; - - if(bAsset.status == BassetStatus.Normal) { - require( - bAssetWeight <= 1e18, - "Asset weight must be <= 100%" - ); - basket.bassets[index].maxWeight = bAssetWeight; - } else { - require( - bAssetWeight == basket.bassets[index].maxWeight, - "Affected bAssets must be static" - ); - } - } - - if(!_isBootstrap){ - _validateBasketWeight(); - } - - emit BasketWeightsUpdated(_bAssets, _weights); - } - - /** - * @dev Throws if the sum of all bAsset maxWeights is not in range 100-400% - */ - function _validateBasketWeight() internal view { - uint256 len = basket.bassets.length; - uint256 weightSum = 0; - for(uint256 i = 0; i < len; i++) { - weightSum = weightSum.add(basket.bassets[i].maxWeight); - } - require(weightSum >= 1e18 && weightSum <= 4e18, "Basket weight must be >= 100 && <= 400%"); - } - - /** - * @dev Update transfer fee flag for a given bAsset, should it change its fee practice - * @param _bAsset bAsset address - * @param _flag Charge transfer fee when its set to 'true', otherwise 'false' - */ - function setTransferFeesFlag(address _bAsset, bool _flag) - external - managerOrGovernor - { - (bool exist, uint8 index) = _isAssetInBasket(_bAsset); - require(exist, "bAsset does not exist"); - basket.bassets[index].isTransferFeeCharged = _flag; - - if(_flag){ - // if token has tx fees, it can no longer operate with a cache - uint256 bal = IERC20(_bAsset).balanceOf(integrations[index]); - if(bal > 0){ - IPlatformIntegration(integrations[index]).deposit(_bAsset, bal, true); - } - } - - emit TransferFeeEnabled(_bAsset, _flag); - } - - - /** - * @dev Removes a specific Asset from the Basket, given that its target/collateral - * level is already 0, throws if invalid. - * @param _assetToRemove The asset to remove from the basket - */ - function removeBasset(address _assetToRemove) - external - whenBasketIsHealthy - whenNotRecolling - managerOrGovernor - { - _removeBasset(_assetToRemove); - } - - /** - * @dev Removes a specific Asset from the Basket, given that its target/collateral - * level is already 0, throws if invalid. - * @param _assetToRemove The asset to remove from the basket - */ - function _removeBasset(address _assetToRemove) internal { - (bool exists, uint8 index) = _isAssetInBasket(_assetToRemove); - require(exists, "bAsset does not exist"); - - uint256 len = basket.bassets.length; - Basset memory bAsset = basket.bassets[index]; - - require(bAsset.maxWeight == 0, "bAsset must have a target weight of 0"); - require(bAsset.vaultBalance == 0, "bAsset vault must be empty"); - require(bAsset.status != BassetStatus.Liquidating, "bAsset must be active"); - - uint8 lastIndex = uint8(len.sub(1)); - if(index == lastIndex) { - basket.bassets.pop(); - bAssetsMap[_assetToRemove] = 0; - integrations.pop(); - } else { - // Swap the bassets - basket.bassets[index] = basket.bassets[lastIndex]; - basket.bassets.pop(); - Basset memory swappedBasset = basket.bassets[index]; - // Update bassetsMap - bAssetsMap[_assetToRemove] = 0; - bAssetsMap[swappedBasset.addr] = index; - // Update integrations - integrations[index] = integrations[lastIndex]; - integrations.pop(); - } - - emit BassetRemoved(bAsset.addr); - } - - /** - * @dev Transfers all collateral from one lending market to another - used initially - * to handle the migration between Aave V1 and Aave V2. Note - only supports non - * tx fee enabled assets - * @param _bAssets Array of basket assets to migrate - * @param _newIntegration Address of the new platform integration - */ - function migrateBassets( - address[] calldata _bAssets, - address _newIntegration - ) - external - onlyGovernor - { - uint256 len = _bAssets.length; - require(len > 0, "Must migrate some bAssets"); - - for(uint i = 0; i < len; i++){ - // 1. Check that the bAsset is in the basket - address bAsset = _bAssets[i]; - (bool inBasket, uint8 index) = _isAssetInBasket(bAsset); - require(inBasket, "bAsset does not exist"); - require(!basket.bassets[index].isTransferFeeCharged, "Cannot migrate bAssets with xfer fee"); - - // 2. Withdraw everything from the old platform integration - IPlatformIntegration oldIntegration = IPlatformIntegration(integrations[index]); - require(address(oldIntegration) != _newIntegration, "Must transfer to new integrator"); - uint256 cache = IERC20(bAsset).balanceOf(address(oldIntegration)); - // 2.1. Withdraw from the lending market - uint256 lendingBal = oldIntegration.checkBalance(bAsset); - if(lendingBal > 0) { - oldIntegration.withdraw(address(this), bAsset, lendingBal, false); - } - // 2.2. Withdraw from the cache, if any - if(cache > 0){ - oldIntegration.withdrawRaw(address(this), bAsset, cache); - } - uint256 total = lendingBal.add(cache); - - // 3. Update the integration address for this bAsset - integrations[index] = _newIntegration; - - // 4. Deposit everything into the new - // This should fail if we did not receive the full amount from the platform withdrawal - // 4.1. Deposit all bAsset - IERC20(bAsset).safeTransfer(_newIntegration, total); - IPlatformIntegration newIntegration = IPlatformIntegration(_newIntegration); - newIntegration.deposit(bAsset, lendingBal, false); - // 4.2. Check balances - uint256 newLendingBal = newIntegration.checkBalance(bAsset); - uint256 newCache = IERC20(bAsset).balanceOf(address(newIntegration)); - uint256 upperMargin = 10001e14; - uint256 lowerMargin = 9999e14; - - require( - newLendingBal >= lendingBal.mulTruncate(lowerMargin) && - newLendingBal <= lendingBal.mulTruncate(upperMargin), - "Must transfer full amount"); - require( - newCache >= cache.mulTruncate(lowerMargin) && - newCache <= cache.mulTruncate(upperMargin), - "Must transfer full amount"); - } - - emit BassetsMigrated(_bAssets, _newIntegration); - } - - - /*************************************** - GETTERS - ****************************************/ - - /** - * @dev Get basket details for `MassetStructs.Basket` - * @return b Basket struct - */ - function getBasket() - external - view - returns (Basket memory b) - { - b = basket; - } - - /** - * @dev Prepare given bAsset for Forging. Currently returns integrator - * and essential minting info. - * @param _bAsset Address of the bAsset - * @return props Struct of all relevant Forge information - */ - function prepareForgeBasset(address _bAsset, uint256 /*_amt*/, bool /*_mint*/) - external - whenNotPaused - whenNotRecolling - returns (bool isValid, BassetDetails memory bInfo) - { - (bool exists, uint8 idx) = _isAssetInBasket(_bAsset); - require(exists, "bAsset does not exist"); - isValid = true; - bInfo = BassetDetails({ - bAsset: basket.bassets[idx], - integrator: integrations[idx], - index: idx - }); - } - - /** - * @dev Prepare given bAssets for swapping - * @param _input Address of the input bAsset - * @param _output Address of the output bAsset - * @param _isMint Is this swap actually a mint? i.e. output == address(mAsset) - * @return props Struct of all relevant Forge information - */ - function prepareSwapBassets(address _input, address _output, bool _isMint) - external - view - whenNotPaused - returns (bool, string memory, BassetDetails memory, BassetDetails memory) - { - BassetDetails memory input; - BassetDetails memory output; - // Check that basket state is healthy - if(basket.failed || basket.undergoingRecol){ - return (false, "Basket is undergoing change", input, output); - } - - // Fetch input bAsset - (bool inputExists, uint8 inputIdx) = _isAssetInBasket(_input); - if(!inputExists) { - return (false, "Input asset does not exist", input, output); - } - input = BassetDetails({ - bAsset: basket.bassets[inputIdx], - integrator: integrations[inputIdx], - index: inputIdx - }); - - // If this is a mint, we don't need output bAsset - if(_isMint) { - return (true, "", input, output); - } - - // Fetch output bAsset - (bool outputExists, uint8 outputIdx) = _isAssetInBasket(_output); - if(!outputExists) { - return (false, "Output asset does not exist", input, output); - } - output = BassetDetails({ - bAsset: basket.bassets[outputIdx], - integrator: integrations[outputIdx], - index: outputIdx - }); - return (true, "", input, output); - } - - /** - * @dev Prepare given bAsset addresses for Forging. Currently returns integrator - * and essential minting info for each bAsset - * @param _bAssets Array of bAsset addresses with which to forge - * @return props Struct of all relevant Forge information - */ - function prepareForgeBassets( - address[] calldata _bAssets, - uint256[] calldata /*_amts*/, - bool /* _isMint */ - ) - external - whenNotPaused - whenNotRecolling - returns (ForgePropsMulti memory props) - { - // Pass the fetching logic to the internal view func to reduce SLOAD cost - (Basset[] memory bAssets, uint8[] memory indexes, address[] memory integrators) = _fetchForgeBassets(_bAssets); - props = ForgePropsMulti({ - isValid: true, - bAssets: bAssets, - integrators: integrators, - indexes: indexes - }); - } - - /** - * @dev Fetch the array of bAssets for redemption, and pass back all basket info. - * @param _bAssets Array of bAsset addresses to redeem - */ - function prepareRedeemBassets( - address[] calldata _bAssets - ) - external - view - whenNotPaused - whenNotRecolling - whenBasketIsHealthy - returns (RedeemProps memory props) - { - // Pass the fetching logic to the internal view func to reduce SLOAD cost - (Basset[] memory bAssets, uint8[] memory indexes, address[] memory integrators) = _fetchForgeBassets(_bAssets); - props = RedeemProps({ - isValid: true, - allBassets: basket.bassets, - bAssets: bAssets, - integrators: integrators, - indexes: indexes - }); - } - - /** - * @dev Prepare given bAsset addresses for RedeemMulti. Currently returns integrator - * and essential minting info for each bAsset - * @return props Struct of all relevant Forge information - */ - function prepareRedeemMulti() - external - view - whenNotPaused - whenNotRecolling - returns (RedeemPropsMulti memory props) - { - (Basset[] memory bAssets, uint256 len) = _getBassets(); - address[] memory orderedIntegrators = new address[](len); - uint8[] memory indexes = new uint8[](len); - for(uint8 i = 0; i < len; i++){ - orderedIntegrators[i] = integrations[i]; - indexes[i] = i; - } - props = RedeemPropsMulti({ - colRatio: basket.collateralisationRatio, - bAssets: bAssets, - integrators: orderedIntegrators, - indexes: indexes - }); - } - - /** - * @dev Internal func to fetch an array of bAssets and their integrators from storage - * @param _bAssets Array of non-duplicate bAsset addresses with which to forge - * @return bAssets Array of bAsset structs for the given addresses - * @return indexes Array of indexes for the given addresses - * @return integrators Array of integrators for the given addresses - */ - function _fetchForgeBassets(address[] memory _bAssets) - internal - view - returns ( - Basset[] memory bAssets, - uint8[] memory indexes, - address[] memory integrators - ) - { - uint8 len = uint8(_bAssets.length); - - bAssets = new Basset[](len); - integrators = new address[](len); - indexes = new uint8[](len); - - // Iterate through the input - for(uint8 i = 0; i < len; i++) { - address current = _bAssets[i]; - - // If there is a duplicate here, throw - // Gas costs do not incur SLOAD - for(uint8 j = i+1; j < len; j++){ - require(current != _bAssets[j], "Must have no duplicates"); - } - - // Fetch and log all the relevant data - (bool exists, uint8 index) = _isAssetInBasket(current); - require(exists, "bAsset must exist"); - indexes[i] = index; - bAssets[i] = basket.bassets[index]; - integrators[i] = integrations[index]; - } - } - - /** - * @dev Get data for a all bAssets in basket - * @return bAssets Struct[] with full bAsset data - * @return len Number of bAssets in the Basket - */ - function getBassets() - external - view - returns ( - Basset[] memory bAssets, - uint256 len - ) - { - return _getBassets(); - } - - /** - * @dev Get data for a specific bAsset, if it exists - * @param _bAsset Address of bAsset - * @return bAsset Struct with full bAsset data - */ - function getBasset(address _bAsset) - external - view - returns (Basset memory bAsset) - { - (bool exists, uint8 index) = _isAssetInBasket(_bAsset); - require(exists, "bAsset must exist"); - bAsset = _getBasset(index); - } - - /** - * @dev Get current integrator for a specific bAsset, if it exists - * @param _bAsset Address of bAsset - * @return integrator Address of current integrator - */ - function getBassetIntegrator(address _bAsset) - external - view - returns (address integrator) - { - (bool exists, uint8 index) = _isAssetInBasket(_bAsset); - require(exists, "bAsset must exist"); - integrator = integrations[index]; - } - - function _getBassets() - internal - view - returns ( - Basset[] memory bAssets, - uint256 len - ) - { - bAssets = basket.bassets; - len = basket.bassets.length; - } - - function _getBasset(uint8 _bAssetIndex) - internal - view - returns (Basset memory bAsset) - { - bAsset = basket.bassets[_bAssetIndex]; - } - - - /*************************************** - HELPERS - ****************************************/ - - /** - * @dev Checks if a particular asset is in the basket - * @param _asset Address of bAsset to look for - * @return exists bool to signal that the asset is in basket - * @return index uint256 Index of the bAsset - */ - function _isAssetInBasket(address _asset) - internal - view - returns (bool exists, uint8 index) - { - index = bAssetsMap[_asset]; - if(index == 0) { - if(basket.bassets.length == 0) { - return (false, 0); - } - return (basket.bassets[0].addr == _asset, 0); - } - return (true, index); - } - - /** - * @notice Determine whether or not a bAsset has already undergone re-collateralisation - * @param _status Status of the bAsset - * @return Bool to determine if undergone re-collateralisation - */ - function _bAssetHasRecolled(BassetStatus _status) - internal - pure - returns (bool) - { - if(_status == BassetStatus.Liquidating || - _status == BassetStatus.Liquidated || - _status == BassetStatus.Failed) { - return true; - } - return false; - } - - - /*************************************** - RE-COLLATERALISATION - ****************************************/ - - /** - * @dev Executes the Auto Redistribution event by isolating the bAsset from the Basket - * @param _bAsset Address of the ERC20 token to isolate - * @param _belowPeg Bool to describe whether the bAsset deviated below peg (t) - * or above (f) - * @return alreadyActioned Bool to show whether a bAsset had already been actioned - */ - function handlePegLoss(address _bAsset, bool _belowPeg) - external - managerOrGovernor - whenBasketIsHealthy - returns (bool alreadyActioned) - { - (bool exists, uint256 i) = _isAssetInBasket(_bAsset); - require(exists, "bAsset must exist in Basket"); - - BassetStatus oldStatus = basket.bassets[i].status; - BassetStatus newStatus = - _belowPeg ? BassetStatus.BrokenBelowPeg : BassetStatus.BrokenAbovePeg; - - if(oldStatus == newStatus || _bAssetHasRecolled(oldStatus)) { - return true; - } - - // If we need to update the status.. then do it - basket.bassets[i].status = newStatus; - emit BassetStatusChanged(_bAsset, newStatus); - return false; - } - - /** - * @dev Negates the isolation of a given bAsset - * @param _bAsset Address of the bAsset - */ - function negateIsolation(address _bAsset) - external - managerOrGovernor - { - (bool exists, uint256 i) = _isAssetInBasket(_bAsset); - require(exists, "bAsset must exist"); - - BassetStatus currentStatus = basket.bassets[i].status; - if(currentStatus == BassetStatus.BrokenBelowPeg || - currentStatus == BassetStatus.BrokenAbovePeg || - currentStatus == BassetStatus.Blacklisted) { - basket.bassets[i].status = BassetStatus.Normal; - emit BassetStatusChanged(_bAsset, BassetStatus.Normal); - } - } - - /** - * @dev Marks a bAsset as permanently deviated from peg - * @param _bAsset Address of the bAsset - */ - function failBasset(address _bAsset) - external - onlyGovernor - { - (bool exists, uint256 i) = _isAssetInBasket(_bAsset); - require(exists, "bAsset must exist"); - - BassetStatus currentStatus = basket.bassets[i].status; - require( - currentStatus == BassetStatus.BrokenBelowPeg || - currentStatus == BassetStatus.BrokenAbovePeg, - "bAsset must be affected" - ); - basket.failed = true; - } -} diff --git a/contracts/masset/IInvariantValidator.sol b/contracts/masset/IInvariantValidator.sol new file mode 100644 index 00000000..7fbb4366 --- /dev/null +++ b/contracts/masset/IInvariantValidator.sol @@ -0,0 +1,46 @@ +// SPDX-License-Identifier: AGPL-3.0-or-later +pragma solidity 0.8.0; + +import { MassetStructs } from "./MassetStructs.sol"; + +abstract contract IInvariantValidator is MassetStructs { + // Mint + function computeMint( + BassetData[] calldata _bAssets, + uint8 _i, + uint256 _rawInput, + InvariantConfig memory _config + ) external view virtual returns (uint256); + + function computeMintMulti( + BassetData[] calldata _bAssets, + uint8[] calldata _indices, + uint256[] calldata _rawInputs, + InvariantConfig memory _config + ) external view virtual returns (uint256); + + // Swap + function computeSwap( + BassetData[] calldata _bAssets, + uint8 _i, + uint8 _o, + uint256 _rawInput, + uint256 _feeRate, + InvariantConfig memory _config + ) external view virtual returns (uint256, uint256); + + // Redeem + function computeRedeem( + BassetData[] calldata _bAssets, + uint8 _i, + uint256 _mAssetQuantity, + InvariantConfig memory _config + ) external view virtual returns (uint256); + + function computeRedeemExact( + BassetData[] calldata _bAssets, + uint8[] calldata _indices, + uint256[] calldata _rawOutputs, + InvariantConfig memory _config + ) external view virtual returns (uint256); +} diff --git a/contracts/masset/InvariantValidator.sol b/contracts/masset/InvariantValidator.sol new file mode 100644 index 00000000..91b3bba8 --- /dev/null +++ b/contracts/masset/InvariantValidator.sol @@ -0,0 +1,376 @@ +// SPDX-License-Identifier: AGPL-3.0-or-later +pragma solidity 0.8.0; + +import { IInvariantValidator } from "./IInvariantValidator.sol"; +import { Root } from "../shared/Root.sol"; + +/** + * @title InvariantValidator + * @author mStable + * @notice Builds on and enforces the StableSwap invariant conceived by Michael Egorov. (https://www.curve.fi/stableswap-paper.pdf) + * Derived by mStable and adapted for the needs of an mAsset, as described in MIP-7 (http://mips.mstable.org/MIPS/mip-7) + * Calculates and validates the result of Masset operations with respect to the invariant. + * This supports low slippage swaps and applies penalties towards min and max regions. + * @dev VERSION: 1.0 + * DATE: 2021-02-04 + */ +contract InvariantValidator is IInvariantValidator { + uint256 internal constant A_PRECISION = 100; + + // Data used for determining max TVL during guarded launch + uint256 public immutable startTime; + uint256 public immutable startingCap; + uint256 public immutable capFactor; + + constructor(uint256 _startingCap, uint256 _capFactor) { + startTime = block.timestamp; + startingCap = _startingCap; + capFactor = _capFactor; + } + + /*************************************** + EXTERNAL + ****************************************/ + + /** + * @notice Compute the amount of mAsset received for minting + * with `quantity` amount of bAsset index `i`. + * @param _bAssets Array of all bAsset Data + * @param _i Index of bAsset with which to mint + * @param _rawInput Raw amount of bAsset to use in mint + * @param _config Generalised invariantConfig stored externally + * @return mintAmount Quantity of mAssets minted + */ + function computeMint( + BassetData[] calldata _bAssets, + uint8 _i, + uint256 _rawInput, + InvariantConfig memory _config + ) external view override returns (uint256 mintAmount) { + // 1. Get raw reserves + (uint256[] memory x, uint256 sum) = _getReserves(_bAssets); + // 2. Get value of reserves according to invariant + uint256 k0 = _invariant(x, sum, _config.a); + uint256 scaledInput = (_rawInput * _bAssets[_i].ratio) / 1e8; + + // 3. Add deposit to x and sum + x[_i] += scaledInput; + sum += scaledInput; + // 4. Finalise mint + require(_inBounds(x, sum, _config.limits), "Exceeds weight limits"); + mintAmount = _computeMintOutput(x, sum, k0, _config.a); + } + + /** + * @notice Compute the amount of mAsset received for minting + * with the given array of inputs. + * @param _bAssets Array of all bAsset Data + * @param _indices Indexes of bAssets with which to mint + * @param _rawInputs Raw amounts of bAssets to use in mint + * @param _config Generalised invariantConfig stored externally + * @return mintAmount Quantity of mAssets minted + */ + function computeMintMulti( + BassetData[] calldata _bAssets, + uint8[] calldata _indices, + uint256[] calldata _rawInputs, + InvariantConfig memory _config + ) external view override returns (uint256 mintAmount) { + // 1. Get raw reserves + (uint256[] memory x, uint256 sum) = _getReserves(_bAssets); + // 2. Get value of reserves according to invariant + uint256 k0 = _invariant(x, sum, _config.a); + + // 3. Add deposits to x and sum + uint256 len = _indices.length; + uint8 idx; + uint256 scaledInput; + for (uint256 i = 0; i < len; i++) { + idx = _indices[i]; + scaledInput = (_rawInputs[i] * _bAssets[idx].ratio) / 1e8; + x[idx] += scaledInput; + sum += scaledInput; + } + // 4. Finalise mint + require(_inBounds(x, sum, _config.limits), "Exceeds weight limits"); + mintAmount = _computeMintOutput(x, sum, k0, _config.a); + } + + /** + * @notice Compute the amount of bAsset received for swapping + * `quantity` amount of index `input_idx` to index `output_idx`. + * @param _bAssets Array of all bAsset Data + * @param _i Index of bAsset to swap IN + * @param _o Index of bAsset to swap OUT + * @param _rawInput Raw amounts of input bAsset to input + * @param _feeRate Swap fee rate to apply to output + * @param _config Generalised invariantConfig stored externally + * @return bAssetOutputQuantity Raw bAsset output quantity + * @return scaledSwapFee Swap fee collected, in mAsset terms + */ + function computeSwap( + BassetData[] calldata _bAssets, + uint8 _i, + uint8 _o, + uint256 _rawInput, + uint256 _feeRate, + InvariantConfig memory _config + ) external view override returns (uint256 bAssetOutputQuantity, uint256 scaledSwapFee) { + // 1. Get raw reserves + (uint256[] memory x, uint256 sum) = _getReserves(_bAssets); + // 2. Get value of reserves according to invariant + uint256 k0 = _invariant(x, sum, _config.a); + // 3. Add deposits to x and sum + uint256 scaledInput = (_rawInput * _bAssets[_i].ratio) / 1e8; + x[_i] += scaledInput; + sum += scaledInput; + // 4. Calc total mAsset q + uint256 k1 = _invariant(x, sum, _config.a); + scaledSwapFee = ((k1 - k0) * _feeRate) / 1e18; + // 5. Calc output bAsset + uint256 newOutputReserve = _solveInvariant(x, _config.a, _o, k0 + scaledSwapFee); + uint256 output = x[_o] - newOutputReserve - 1; + bAssetOutputQuantity = (output * 1e8) / _bAssets[_o].ratio; + // 6. Check for bounds + x[_o] -= output; + sum -= output; + require(_inBounds(x, sum, _config.limits), "Exceeds weight limits"); + } + + /** + * @notice Compute the amount of bAsset index `i` received for + * redeeming `quantity` amount of mAsset. + * @param _bAssets Array of all bAsset Data + * @param _o Index of output bAsset + * @param _netMassetQuantity Net amount of mAsset to redeem + * @param _config Generalised invariantConfig stored externally + * @return rawOutputUnits Raw bAsset output returned + */ + function computeRedeem( + BassetData[] calldata _bAssets, + uint8 _o, + uint256 _netMassetQuantity, + InvariantConfig memory _config + ) external view override returns (uint256 rawOutputUnits) { + // 1. Get raw reserves + (uint256[] memory x, uint256 sum) = _getReserves(_bAssets); + // 2. Get value of reserves according to invariant + uint256 k0 = _invariant(x, sum, _config.a); + // 3. Compute bAsset output + uint256 newOutputReserve = _solveInvariant(x, _config.a, _o, k0 - _netMassetQuantity); + uint256 output = x[_o] - newOutputReserve - 1; + rawOutputUnits = (output * 1e8) / _bAssets[_o].ratio; + // 4. Check for max weight + x[_o] -= output; + sum -= output; + require(_inBounds(x, sum, _config.limits), "Exceeds weight limits"); + } + + /** + * @notice Compute the amount of mAsset required to redeem + * a given selection of bAssets. + * @param _bAssets Array of all bAsset Data + * @param _indices Indexes of output bAssets + * @param _rawOutputs Desired raw bAsset outputs + * @param _config Generalised invariantConfig stored externally + * @return totalmAssets Amount of mAsset required to redeem bAssets + */ + function computeRedeemExact( + BassetData[] calldata _bAssets, + uint8[] calldata _indices, + uint256[] calldata _rawOutputs, + InvariantConfig memory _config + ) external view override returns (uint256 totalmAssets) { + // 1. Get raw reserves + (uint256[] memory x, uint256 sum) = _getReserves(_bAssets); + // 2. Get value of reserves according to invariant + uint256 k0 = _invariant(x, sum, _config.a); + // 3. Sub deposits from x and sum + uint256 len = _indices.length; + uint256 ratioed; + for (uint256 i = 0; i < len; i++) { + ratioed = (_rawOutputs[i] * _bAssets[_indices[i]].ratio) / 1e8; + x[_indices[i]] -= ratioed; + sum -= ratioed; + } + require(_inBounds(x, sum, _config.limits), "Exceeds weight limits"); + // 4. Get new value of reserves according to invariant + uint256 k1 = _invariant(x, sum, _config.a); + // 5. Total mAsset is the difference between values + totalmAssets = k0 - k1; + } + + /*************************************** + INTERNAL + ****************************************/ + + /** + * @dev Computes the actual mint output after adding mint inputs + * to the vault balances. Also checks that tvl cap does not exceed + * the cap, during guarded launch period. + * @param _x Scaled vaultBalances + * @param _sum Sum of vaultBalances, to avoid another loop + * @param _k Previous value of invariant, k, before addition + * @param _a Precise amplification coefficient + * @return mintAmount Amount of value added to invariant, in mAsset terms + */ + function _computeMintOutput( + uint256[] memory _x, + uint256 _sum, + uint256 _k, + uint256 _a + ) internal view returns (uint256 mintAmount) { + // 1. Get value of reserves according to invariant + uint256 kFinal = _invariant(_x, _sum, _a); + // 2. Guarded launch - ensure TVL cap is not hit + // e.g. 10 days after launch + // e.g. 864000e18 / 86400 = 1.4e18 (1.4 weeks) + uint256 weeksSinceLaunch = ((block.timestamp - startTime) * 1e18) / 604800; + if (weeksSinceLaunch < 7e18) { + // e.g. 1e19 + (15e18 * 2.04e36) = 1e19 + 3.06e55 + uint256 maxK = startingCap + ((capFactor * (weeksSinceLaunch**2)) / 1e36); + require(kFinal <= maxK, "Cannot exceed TVL cap"); + } + // 3. Total minted is the difference between values + mintAmount = kFinal - _k; + } + + /** + * @dev Simply scaled raw reserve values and returns the sum + * @param _bAssets All bAssets + * @return x Scaled vault balances + * @return sum Sum of scaled vault balances + */ + function _getReserves(BassetData[] memory _bAssets) + internal + pure + returns (uint256[] memory x, uint256 sum) + { + uint256 len = _bAssets.length; + x = new uint256[](len); + uint256 r; + for (uint256 i = 0; i < len; i++) { + BassetData memory bAsset = _bAssets[i]; + r = (bAsset.vaultBalance * bAsset.ratio) / 1e8; + x[i] = r; + sum += r; + } + } + + /** + * @dev Checks that no bAsset reserves exceed max weight + * @param _x Scaled bAsset reserves + * @param _sum Sum of x, precomputed + * @param _limits Config object containing max and min weights + * @return inBounds Bool, true if all assets are within bounds + */ + function _inBounds( + uint256[] memory _x, + uint256 _sum, + WeightLimits memory _limits + ) internal pure returns (bool inBounds) { + uint256 len = _x.length; + inBounds = true; + uint256 w; + for (uint256 i = 0; i < len; i++) { + w = (_x[i] * 1e18) / _sum; + if (w > _limits.max || w < _limits.min) return false; + } + } + + /*************************************** + INVARIANT + ****************************************/ + + /** + * @dev Compute the invariant f(x) for a given array of supplies `x`. + * @param _x Scaled vault balances + * @param _sum Sum of scaled vault balances + * @param _a Precise amplification coefficient + * @return k Cumulative value of all assets according to the invariant + */ + function _invariant( + uint256[] memory _x, + uint256 _sum, + uint256 _a + ) internal pure returns (uint256 k) { + uint256 len = _x.length; + + if (_sum == 0) return 0; + + uint256 nA = _a * len; + uint256 kPrev; + k = _sum; + + for (uint256 i = 0; i < 256; i++) { + uint256 kP = k; + for (uint256 j = 0; j < len; j++) { + kP = (kP * k) / (_x[j] * len); + } + kPrev = k; + k = + (((nA * _sum) / A_PRECISION + (kP * len)) * k) / + (((nA - A_PRECISION) * k) / A_PRECISION + ((len + 1) * kP)); + if (_hasConverged(k, kPrev)) { + return k; + } + } + + revert("Invariant did not converge"); + } + + /** + * @dev Checks if a given solution has converged within a factor of 1 + * @param _k Current solution k + * @param _kPrev Previous iteration solution + * @return hasConverged Bool, true if diff abs(k, kPrev) <= 1 + */ + function _hasConverged(uint256 _k, uint256 _kPrev) internal pure returns (bool) { + if (_kPrev > _k) { + return (_kPrev - _k) <= 1; + } else { + return (_k - _kPrev) <= 1; + } + } + + /** + * @dev Solves the invariant for _i with respect to target K, given an array of reserves. + * @param _x Scaled reserve balances + * @param _a Precise amplification coefficient + * @param _idx Index of asset for which to solve + * @param _targetK Target invariant value K + * @return y New reserve of _i + */ + function _solveInvariant( + uint256[] memory _x, + uint256 _a, + uint8 _idx, + uint256 _targetK + ) internal pure returns (uint256 y) { + uint256 len = _x.length; + require(_idx >= 0 && _idx < len, "Invalid index"); + + (uint256 sum_, uint256 nA, uint256 kP) = (0, _a * len, _targetK); + + for (uint256 i = 0; i < len; i++) { + if (i != _idx) { + sum_ += _x[i]; + kP = (kP * _targetK) / (_x[i] * len); + } + } + + uint256 c = (((kP * _targetK) * A_PRECISION) / nA) / len; + uint256 g = (_targetK * (nA - A_PRECISION)) / nA; + uint256 b = 0; + + if (g > sum_) { + b = g - sum_; + y = (Root.sqrt((b**2) + (4 * c)) + b) / 2 + 1; + } else { + b = sum_ - g; + y = (Root.sqrt((b**2) + (4 * c)) - b) / 2 + 1; + } + + if (y < 1e8) revert("Invalid solution"); + } +} diff --git a/contracts/masset/Manager.sol b/contracts/masset/Manager.sol new file mode 100644 index 00000000..ecbbc384 --- /dev/null +++ b/contracts/masset/Manager.sol @@ -0,0 +1,505 @@ +// SPDX-License-Identifier: AGPL-3.0-or-later +pragma solidity 0.8.0; +pragma abicoder v2; + +// External +import { IPlatformIntegration } from "../interfaces/IPlatformIntegration.sol"; +import { IInvariantValidator } from "./IInvariantValidator.sol"; +import { IBasicToken } from "../shared/IBasicToken.sol"; + +// Internal +import { MassetStructs } from "./MassetStructs.sol"; + +// Libs +import { SafeCast } from "@openzeppelin/contracts-sol8/contracts/utils/SafeCast.sol"; +import { IERC20 } from "@openzeppelin/contracts-sol8/contracts/token/ERC20/IERC20.sol"; +import { SafeERC20 } from "@openzeppelin/contracts-sol8/contracts/token/ERC20/SafeERC20.sol"; +import { StableMath } from "../shared/StableMath.sol"; +import { MassetHelpers } from "../shared/MassetHelpers.sol"; + +/** + * @title Manager + * @author mStable + * @notice Simply contains logic to perform Basket Manager duties for an mAsset. + * Allowing logic can be abstracted here to avoid bytecode inflation. + * @dev VERSION: 1.0 + * DATE: 2021-01-22 + */ +library Manager { + using SafeERC20 for IERC20; + using StableMath for uint256; + + event BassetsMigrated(address[] bAssets, address newIntegrator); + event TransferFeeEnabled(address indexed bAsset, bool enabled); + event BassetAdded(address indexed bAsset, address integrator); + event BassetStatusChanged(address indexed bAsset, MassetStructs.BassetStatus status); + event BasketStatusChanged(); + event StartRampA(uint256 currentA, uint256 targetA, uint256 startTime, uint256 rampEndTime); + event StopRampA(uint256 currentA, uint256 time); + + uint256 private constant MIN_RAMP_TIME = 1 days; + uint256 private constant MAX_A = 1e6; + + /** + * @notice Adds a bAsset to the given personal, data and mapping, provided it is valid + * @param _bAssetPersonal Basset data storage array + * @param _bAssetData Basset data storage array + * @param _bAssetIndexes Mapping of bAsset address to their index + * @param _maxBassets Max size of the basket + * @param _bAsset Address of the ERC20 token to add to the Basket + * @param _integration Address of the Platform Integration + * @param _mm Base 1e8 var to determine measurement ratio + * @param _hasTxFee Are transfer fees charged on this bAsset (e.g. USDT) + */ + function addBasset( + MassetStructs.BassetPersonal[] storage _bAssetPersonal, + MassetStructs.BassetData[] storage _bAssetData, + mapping(address => uint8) storage _bAssetIndexes, + uint8 _maxBassets, + address _bAsset, + address _integration, + uint256 _mm, + bool _hasTxFee + ) external { + require(_bAsset != address(0), "bAsset address must be valid"); + uint8 bAssetCount = uint8(_bAssetPersonal.length); + require(bAssetCount < _maxBassets, "Max bAssets in Basket"); + + uint8 idx = _bAssetIndexes[_bAsset]; + require( + bAssetCount == 0 || _bAssetPersonal[idx].addr != _bAsset, + "bAsset already exists in Basket" + ); + + // Should fail if bAsset is not added to integration + // Programmatic enforcement of bAsset validity should service through decentralised feed + if (_integration != address(0)) { + IPlatformIntegration(_integration).checkBalance(_bAsset); + } + + uint256 bAssetDecimals = IBasicToken(_bAsset).decimals(); + require( + bAssetDecimals >= 4 && bAssetDecimals <= 18, + "Token must have sufficient decimal places" + ); + + uint256 delta = uint256(18) - bAssetDecimals; + uint256 ratio = _mm * (10**delta); + + _bAssetIndexes[_bAsset] = bAssetCount; + + _bAssetPersonal.push( + MassetStructs.BassetPersonal({ + addr: _bAsset, + integrator: _integration, + hasTxFee: _hasTxFee, + status: MassetStructs.BassetStatus.Normal + }) + ); + _bAssetData.push( + MassetStructs.BassetData({ ratio: SafeCast.toUint128(ratio), vaultBalance: 0 }) + ); + + emit BassetAdded(_bAsset, _integration); + } + + /** + * @dev Collects the interest generated from the Basket, minting a relative + * amount of mAsset and sending it over to the SavingsManager. + * @param _bAssetPersonal Basset personal storage array + * @param _bAssetData Basset data storage array + * @param _forgeValidator Link to the current InvariantValidator + * @return mintAmount Lending market interest collected + * @return rawGains Raw increases in vault Balance + */ + function collectPlatformInterest( + MassetStructs.BassetPersonal[] memory _bAssetPersonal, + MassetStructs.BassetData[] storage _bAssetData, + IInvariantValidator _forgeValidator, + MassetStructs.InvariantConfig memory _config + ) external returns (uint256 mintAmount, uint256[] memory rawGains) { + // Get basket details + MassetStructs.BassetData[] memory bAssetData_ = _bAssetData; + uint256 count = bAssetData_.length; + uint8[] memory indices = new uint8[](count); + rawGains = new uint256[](count); + // 1. Calculate rawGains in each bAsset, in comparison to current vault balance + for (uint256 i = 0; i < count; i++) { + indices[i] = uint8(i); + MassetStructs.BassetPersonal memory bPersonal = _bAssetPersonal[i]; + MassetStructs.BassetData memory bData = bAssetData_[i]; + // If there is no integration, then nothing can have accrued + if (bPersonal.integrator == address(0)) continue; + uint256 lending = + IPlatformIntegration(bPersonal.integrator).checkBalance(bPersonal.addr); + uint256 cache = 0; + if (!bPersonal.hasTxFee) { + cache = IERC20(bPersonal.addr).balanceOf(bPersonal.integrator); + } + uint256 balance = lending + cache; + uint256 oldVaultBalance = bData.vaultBalance; + if ( + balance > oldVaultBalance && bPersonal.status == MassetStructs.BassetStatus.Normal + ) { + _bAssetData[i].vaultBalance = SafeCast.toUint128(balance); + uint256 interestDelta = balance - oldVaultBalance; + rawGains[i] = interestDelta; + } else { + rawGains[i] = 0; + } + } + mintAmount = _forgeValidator.computeMintMulti(bAssetData_, indices, rawGains, _config); + } + + /** + * @dev Update transfer fee flag for a given bAsset, should it change its fee practice + * @param _bAssetPersonal Basset data storage array + * @param _bAssetIndexes Mapping of bAsset address to their index + * @param _bAsset bAsset address + * @param _flag Charge transfer fee when its set to 'true', otherwise 'false' + */ + function setTransferFeesFlag( + MassetStructs.BassetPersonal[] storage _bAssetPersonal, + mapping(address => uint8) storage _bAssetIndexes, + address _bAsset, + bool _flag + ) external { + uint256 index = _getAssetIndex(_bAssetPersonal, _bAssetIndexes, _bAsset); + _bAssetPersonal[index].hasTxFee = _flag; + + if (_flag) { + // if token has tx fees, it can no longer operate with a cache + address integration = _bAssetPersonal[index].integrator; + if (integration != address(0)) { + uint256 bal = IERC20(_bAsset).balanceOf(integration); + if (bal > 0) { + IPlatformIntegration(integration).deposit(_bAsset, bal, true); + } + } + } + + emit TransferFeeEnabled(_bAsset, _flag); + } + + /** + * @dev Transfers all collateral from one lending market to another - used initially + * to handle the migration between Aave V1 and Aave V2. Note - only supports non + * tx fee enabled assets. Supports going from no integration to integration, but + * not the other way around. + * @param _bAssetPersonal Basset data storage array + * @param _bAssetIndexes Mapping of bAsset address to their index + * @param _bAssets Array of basket assets to migrate + * @param _newIntegration Address of the new platform integration + */ + function migrateBassets( + MassetStructs.BassetPersonal[] storage _bAssetPersonal, + mapping(address => uint8) storage _bAssetIndexes, + address[] calldata _bAssets, + address _newIntegration + ) external { + uint256 len = _bAssets.length; + require(len > 0, "Must migrate some bAssets"); + + for (uint256 i = 0; i < len; i++) { + // 1. Check that the bAsset is in the basket + address bAsset = _bAssets[i]; + uint256 index = _getAssetIndex(_bAssetPersonal, _bAssetIndexes, bAsset); + require(!_bAssetPersonal[index].hasTxFee, "A bAsset has a transfer fee"); + + // 2. Withdraw everything from the old platform integration + address oldAddress = _bAssetPersonal[index].integrator; + require(oldAddress != _newIntegration, "Must transfer to new integrator"); + (uint256 cache, uint256 lendingBal) = (0, 0); + if (oldAddress == address(0)) { + cache = IERC20(bAsset).balanceOf(address(this)); + } else { + IPlatformIntegration oldIntegration = IPlatformIntegration(oldAddress); + cache = IERC20(bAsset).balanceOf(address(oldIntegration)); + // 2.1. Withdraw from the lending market + lendingBal = oldIntegration.checkBalance(bAsset); + if (lendingBal > 0) { + oldIntegration.withdraw(address(this), bAsset, lendingBal, false); + } + // 2.2. Withdraw from the cache, if any + if (cache > 0) { + oldIntegration.withdrawRaw(address(this), bAsset, cache); + } + } + uint256 sum = lendingBal + cache; + + // 3. Update the integration address for this bAsset + _bAssetPersonal[index].integrator = _newIntegration; + + // 4. Deposit everything into the new + // This should fail if we did not receive the full amount from the platform withdrawal + // 4.1. Deposit all bAsset + IERC20(bAsset).safeTransfer(_newIntegration, sum); + IPlatformIntegration newIntegration = IPlatformIntegration(_newIntegration); + if (lendingBal > 0) { + newIntegration.deposit(bAsset, lendingBal, false); + } + // 4.2. Check balances + uint256 newLendingBal = newIntegration.checkBalance(bAsset); + uint256 newCache = IERC20(bAsset).balanceOf(address(newIntegration)); + uint256 upperMargin = 10001e14; + uint256 lowerMargin = 9999e14; + + require( + newLendingBal >= lendingBal.mulTruncate(lowerMargin) && + newLendingBal <= lendingBal.mulTruncate(upperMargin), + "Must transfer full amount" + ); + require( + newCache >= cache.mulTruncate(lowerMargin) && + newCache <= cache.mulTruncate(upperMargin), + "Must transfer full amount" + ); + } + + emit BassetsMigrated(_bAssets, _newIntegration); + } + + /** + * @dev Executes the Auto Redistribution event by isolating the bAsset from the Basket + * @param _basket Struct containing core basket info + * @param _bAssetPersonal Basset data storage array + * @param _bAsset Address of the ERC20 token to isolate + * @param _belowPeg Bool to describe whether the bAsset deviated below peg (t) + * or above (f) + */ + function handlePegLoss( + MassetStructs.BasketState storage _basket, + MassetStructs.BassetPersonal[] storage _bAssetPersonal, + mapping(address => uint8) storage _bAssetIndexes, + address _bAsset, + bool _belowPeg + ) external { + require(!_basket.failed, "Basket must be alive"); + + uint256 i = _getAssetIndex(_bAssetPersonal, _bAssetIndexes, _bAsset); + + MassetStructs.BassetStatus newStatus = + _belowPeg + ? MassetStructs.BassetStatus.BrokenBelowPeg + : MassetStructs.BassetStatus.BrokenAbovePeg; + _bAssetPersonal[i].status = newStatus; + + _basket.undergoingRecol = true; + + emit BassetStatusChanged(_bAsset, newStatus); + } + + /** + * @dev Negates the isolation of a given bAsset + * @param _basket Struct containing core basket info + * @param _bAssetPersonal Basset data storage array + * @param _bAssetIndexes Mapping of bAsset address to their index + * @param _bAsset Address of the bAsset + */ + function negateIsolation( + MassetStructs.BasketState storage _basket, + MassetStructs.BassetPersonal[] storage _bAssetPersonal, + mapping(address => uint8) storage _bAssetIndexes, + address _bAsset + ) external { + uint256 i = _getAssetIndex(_bAssetPersonal, _bAssetIndexes, _bAsset); + + _bAssetPersonal[i].status = MassetStructs.BassetStatus.Normal; + + bool undergoingRecol = false; + for (uint256 j = 0; j < _bAssetPersonal.length; j++) { + if (_bAssetPersonal[j].status != MassetStructs.BassetStatus.Normal) { + undergoingRecol = true; + break; + } + } + _basket.undergoingRecol = undergoingRecol; + + emit BassetStatusChanged(_bAsset, MassetStructs.BassetStatus.Normal); + } + + /** + * @dev Starts changing of the amplification var A + * @param _targetA Target A value + * @param _rampEndTime Time at which A will arrive at _targetA + */ + function startRampA( + MassetStructs.AmpData storage _ampData, + uint256 _targetA, + uint256 _rampEndTime, + uint256 _currentA, + uint256 _precision + ) external { + require( + block.timestamp >= (_ampData.rampStartTime + MIN_RAMP_TIME), + "Sufficient period of previous ramp has not elapsed" + ); + require(_rampEndTime >= (block.timestamp + MIN_RAMP_TIME), "Ramp time too short"); + require(_targetA > 0 && _targetA < MAX_A, "A target out of bounds"); + + uint256 preciseTargetA = _targetA * _precision; + + if (preciseTargetA > _currentA) { + require(preciseTargetA <= _currentA * 10, "A target increase too big"); + } else { + require(preciseTargetA >= _currentA / 10, "A target decrease too big"); + } + + _ampData.initialA = SafeCast.toUint64(_currentA); + _ampData.targetA = SafeCast.toUint64(preciseTargetA); + _ampData.rampStartTime = SafeCast.toUint64(block.timestamp); + _ampData.rampEndTime = SafeCast.toUint64(_rampEndTime); + + emit StartRampA(_currentA, preciseTargetA, block.timestamp, _rampEndTime); + } + + /** + * @dev Stops the changing of the amplification var A, setting + * it to whatever the current value is. + */ + function stopRampA(MassetStructs.AmpData storage _ampData, uint256 _currentA) external { + require(block.timestamp < _ampData.rampEndTime, "Amplification not changing"); + + _ampData.initialA = SafeCast.toUint64(_currentA); + _ampData.targetA = SafeCast.toUint64(_currentA); + _ampData.rampStartTime = SafeCast.toUint64(block.timestamp); + _ampData.rampEndTime = SafeCast.toUint64(block.timestamp); + + emit StopRampA(_currentA, block.timestamp); + } + + /** + * @dev Gets a bAsset index from storage + * @param _asset Address of the asset + * @return idx Index of the asset + */ + function _getAssetIndex( + MassetStructs.BassetPersonal[] storage _bAssetPersonal, + mapping(address => uint8) storage _bAssetIndexes, + address _asset + ) internal view returns (uint8 idx) { + idx = _bAssetIndexes[_asset]; + require(_bAssetPersonal[idx].addr == _asset, "Invalid asset input"); + } + + /*************************************** + FORGING + ****************************************/ + + /** + * @dev Deposits a given asset to the system. If there is sufficient room for the asset + * in the cache, then just transfer, otherwise reset the cache to the desired mid level by + * depositing the delta in the platform + */ + function depositTokens( + MassetStructs.BassetPersonal memory _bAsset, + uint256 _bAssetRatio, + uint256 _quantity, + uint256 _maxCache + ) external returns (uint256 quantityDeposited) { + // 0. If integration is 0, short circuit + if (_bAsset.integrator == address(0)) { + (uint256 received, ) = + MassetHelpers.transferReturnBalance( + msg.sender, + address(this), + _bAsset.addr, + _quantity + ); + return received; + } + + // 1 - Send all to PI, using the opportunity to get the cache balance and net amount transferred + uint256 cacheBal; + (quantityDeposited, cacheBal) = MassetHelpers.transferReturnBalance( + msg.sender, + _bAsset.integrator, + _bAsset.addr, + _quantity + ); + + // 2 - Deposit X if necessary + // 2.1 - Deposit if xfer fees + if (_bAsset.hasTxFee) { + uint256 deposited = + IPlatformIntegration(_bAsset.integrator).deposit( + _bAsset.addr, + quantityDeposited, + true + ); + + return StableMath.min(deposited, quantityDeposited); + } + // 2.2 - Else Deposit X if Cache > % + // This check is in place to ensure that any token with a txFee is rejected + require(quantityDeposited == _quantity, "Asset not fully transferred"); + + uint256 relativeMaxCache = _maxCache.divRatioPrecisely(_bAssetRatio); + + if (cacheBal > relativeMaxCache) { + uint256 delta = cacheBal - (relativeMaxCache / 2); + IPlatformIntegration(_bAsset.integrator).deposit(_bAsset.addr, delta, false); + } + } + + /** + * @dev Withdraws a given asset from its platformIntegration. If there is sufficient liquidity + * in the cache, then withdraw from there, otherwise withdraw from the lending market and reset the + * cache to the mid level. + */ + function withdrawTokens( + uint256 _quantity, + MassetStructs.BassetPersonal memory _personal, + MassetStructs.BassetData memory _data, + address _recipient, + uint256 _maxCache + ) external { + if (_quantity == 0) return; + + // 1.0 If there is no integrator, send from here + if (_personal.integrator == address(0)) { + IERC20(_personal.addr).safeTransfer(_recipient, _quantity); + } + // 1.1 If txFee then short circuit - there is no cache + else if (_personal.hasTxFee) { + IPlatformIntegration(_personal.integrator).withdraw( + _recipient, + _personal.addr, + _quantity, + _quantity, + true + ); + } + // 1.2. Else, withdraw from either cache or main vault + else { + uint256 cacheBal = IERC20(_personal.addr).balanceOf(_personal.integrator); + // 2.1 - If balance b in cache, simply withdraw + if (cacheBal >= _quantity) { + IPlatformIntegration(_personal.integrator).withdrawRaw( + _recipient, + _personal.addr, + _quantity + ); + } + // 2.2 - Else reset the cache to X, or as far as possible + // - Withdraw X+b from platform + // - Send b to user + else { + uint256 relativeMidCache = _maxCache.divRatioPrecisely(_data.ratio) / 2; + uint256 totalWithdrawal = + StableMath.min( + relativeMidCache + _quantity - cacheBal, + _data.vaultBalance - SafeCast.toUint128(cacheBal) + ); + + IPlatformIntegration(_personal.integrator).withdraw( + _recipient, + _personal.addr, + _quantity, + totalWithdrawal, + false + ); + } + } + } +} diff --git a/contracts/masset/Masset.sol b/contracts/masset/Masset.sol index 6b25c288..92111211 100644 --- a/contracts/masset/Masset.sol +++ b/contracts/masset/Masset.sol @@ -1,94 +1,164 @@ -pragma solidity 0.5.16; -pragma experimental ABIEncoderV2; +// SPDX-License-Identifier: AGPL-3.0-or-later +pragma solidity 0.8.0; +pragma abicoder v2; // External -import { IForgeValidator } from "./forge-validator/IForgeValidator.sol"; -import { IPlatformIntegration } from "../interfaces/IPlatformIntegration.sol"; -import { IBasketManager } from "../interfaces/IBasketManager.sol"; +import { IInvariantValidator } from "./IInvariantValidator.sol"; // Internal -import { IMasset } from "../interfaces/IMasset.sol"; -import { Initializable } from "@openzeppelin/upgrades/contracts/Initializable.sol"; +import { Initializable } from "../shared/@openzeppelin-2.5/Initializable.sol"; import { InitializableToken } from "../shared/InitializableToken.sol"; -import { InitializableModule } from "../shared/InitializableModule.sol"; +import { ImmutableModule } from "../shared/ImmutableModule.sol"; import { InitializableReentrancyGuard } from "../shared/InitializableReentrancyGuard.sol"; -import { MassetStructs } from "./shared/MassetStructs.sol"; +import { IMasset, Deprecated_BasketManager } from "../interfaces/IMasset.sol"; // Libs +import { SafeCast } from "@openzeppelin/contracts-sol8/contracts/utils/SafeCast.sol"; import { StableMath } from "../shared/StableMath.sol"; -import { MassetHelpers } from "./shared/MassetHelpers.sol"; -import { SafeERC20 } from "@openzeppelin/contracts/token/ERC20/SafeERC20.sol"; -import { IERC20 } from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import { Manager } from "./Manager.sol"; /** * @title Masset - * @author Stability Labs Pty. Ltd. - * @notice The Masset is a token that allows minting and redemption at a 1:1 ratio - * for underlying basket assets (bAssets) of the same peg (i.e. USD, - * EUR, Gold). Composition and validation is enforced via the BasketManager. - * @dev VERSION: 2.0 - * DATE: 2020-11-14 + * @author mStable + * @notice An incentivised constant sum market maker with hard limits at max region. This supports + * low slippage swaps and applies penalties towards min and max regions. AMM produces a + * stablecoin (mAsset) and redirects lending market interest and swap fees to the savings + * contract, producing a second yield bearing asset. + * @dev VERSION: 3.0 + * DATE: 2021-01-22 */ contract Masset is - Initializable, IMasset, + Initializable, InitializableToken, - InitializableModule, + ImmutableModule, InitializableReentrancyGuard { using StableMath for uint256; // Forging Events - event Minted(address indexed minter, address recipient, uint256 mAssetQuantity, address bAsset, uint256 bAssetQuantity); - event MintedMulti(address indexed minter, address recipient, uint256 mAssetQuantity, address[] bAssets, uint256[] bAssetQuantities); - event Swapped(address indexed swapper, address input, address output, uint256 outputAmount, address recipient); - event Redeemed(address indexed redeemer, address recipient, uint256 mAssetQuantity, address[] bAssets, uint256[] bAssetQuantities); - event RedeemedMasset(address indexed redeemer, address recipient, uint256 mAssetQuantity); - event PaidFee(address indexed payer, address asset, uint256 feeQuantity); + event Minted( + address indexed minter, + address recipient, + uint256 mAssetQuantity, + address input, + uint256 inputQuantity + ); + event MintedMulti( + address indexed minter, + address recipient, + uint256 mAssetQuantity, + address[] inputs, + uint256[] inputQuantities + ); + event Swapped( + address indexed swapper, + address input, + address output, + uint256 outputAmount, + uint256 scaledFee, + address recipient + ); + event Redeemed( + address indexed redeemer, + address recipient, + uint256 mAssetQuantity, + address output, + uint256 outputQuantity, + uint256 scaledFee + ); + event RedeemedMulti( + address indexed redeemer, + address recipient, + uint256 mAssetQuantity, + address[] outputs, + uint256[] outputQuantity, + uint256 scaledFee + ); // State Events event CacheSizeChanged(uint256 cacheSize); - event SwapFeeChanged(uint256 fee); - event RedemptionFeeChanged(uint256 fee); + event FeesChanged(uint256 swapFee, uint256 redemptionFee); + event WeightLimitsChanged(uint128 min, uint128 max); event ForgeValidatorChanged(address forgeValidator); - // Modules and connectors - IForgeValidator public forgeValidator; + // Release 1.0 VARS + IInvariantValidator public forgeValidator; bool private forgeValidatorLocked; - IBasketManager private basketManager; + // Deprecated - maintain for storage layout in mUSD + Deprecated_BasketManager private deprecated_basketManager; // Basic redemption fee information uint256 public swapFee; uint256 private MAX_FEE; - // RELEASE 1.1 VARS + // Release 1.1 VARS uint256 public redemptionFee; - // RELEASE 2.0 VARS + // Release 2.0 VARS uint256 public cacheSize; uint256 public surplus; + // Release 3.0 VARS + // Struct holding Basket details + BassetPersonal[] public bAssetPersonal; + BassetData[] public bAssetData; + mapping(address => uint8) public override bAssetIndexes; + uint8 public maxBassets; + BasketState public basket; + // Amplification Data + uint256 private constant A_PRECISION = 100; + AmpData public ampData; + WeightLimits public weightLimits; + + /** + * @dev Constructor to set immutable bytecode + * @param _nexus Nexus address + */ + constructor(address _nexus) ImmutableModule(_nexus) {} + /** - * @dev Constructor - * @notice To avoid variable shadowing appended `Arg` after arguments name. + * @dev Initialization function for upgradable proxy contract. + * This function should be called via Proxy just after contract deployment. + * To avoid variable shadowing appended `Arg` after arguments name. + * @param _nameArg Name of the mAsset + * @param _symbolArg Symbol of the mAsset + * @param _forgeValidator Address of the AMM implementation + * @param _bAssets Array of Basset data */ function initialize( string calldata _nameArg, string calldata _symbolArg, - address _nexus, address _forgeValidator, - address _basketManager - ) - external - initializer - { + BassetPersonal[] calldata _bAssets, + InvariantConfig memory _config + ) public initializer { InitializableToken._initialize(_nameArg, _symbolArg); - InitializableModule._initialize(_nexus); - InitializableReentrancyGuard._initialize(); - forgeValidator = IForgeValidator(_forgeValidator); + _initializeReentrancyGuard(); + + forgeValidator = IInvariantValidator(_forgeValidator); - basketManager = IBasketManager(_basketManager); + maxBassets = 10; + + uint256 len = _bAssets.length; + require(len > 0, "No bAssets"); + for (uint256 i = 0; i < len; i++) { + Manager.addBasset( + bAssetPersonal, + bAssetData, + bAssetIndexes, + maxBassets, + _bAssets[i].addr, + _bAssets[i].integrator, + 1e8, + _bAssets[i].hasTxFee + ); + } + + uint64 startA = SafeCast.toUint64(_config.a * A_PRECISION); + ampData = AmpData(startA, startA, 0, 0); + weightLimits = _config.limits; MAX_FEE = 2e16; swapFee = 6e14; @@ -97,13 +167,45 @@ contract Masset is } /** - * @dev Verifies that the caller is the Savings Manager contract - */ + * @dev Verifies that the caller is the Savings Manager contract + */ modifier onlySavingsManager() { + _isSavingsManager(); + _; + } + + // Internal fn for modifier to reduce deployment size + function _isSavingsManager() internal view { require(_savingsManager() == msg.sender, "Must be savings manager"); + } + + /** + * @dev Requires the overall basket composition to be healthy + */ + modifier whenHealthy() { + _isHealthy(); + _; + } + + // Internal fn for modifier to reduce deployment size + function _isHealthy() internal view { + BasketState memory basket_ = basket; + require(!basket_.undergoingRecol && !basket_.failed, "Unhealthy"); + } + + /** + * @dev Requires the basket not to be undergoing recollateralisation + */ + modifier whenNoRecol() { + _noRecol(); _; } + // Internal fn for modifier to reduce deployment size + function _noRecol() internal view { + BasketState memory basket_ = basket; + require(!basket_.undergoingRecol, "In recol"); + } /*************************************** MINTING (PUBLIC) @@ -112,60 +214,75 @@ contract Masset is /** * @dev Mint a single bAsset, at a 1:1 ratio with the bAsset. This contract * must have approval to spend the senders bAsset - * @param _bAsset Address of the bAsset to mint - * @param _bAssetQuantity Quantity in bAsset units - * @return massetMinted Number of newly minted mAssets + * @param _input Address of the bAsset to deposit for the minted mAsset. + * @param _inputQuantity Quantity in bAsset units + * @param _minOutputQuantity Minimum mAsset quanity to be minted. This protects against slippage. + * @param _recipient Receipient of the newly minted mAsset tokens + * @return mintOutput Quantity of newly minted mAssets for the deposited bAsset. */ function mint( - address _bAsset, - uint256 _bAssetQuantity - ) - external - nonReentrant - returns (uint256 massetMinted) - { - return _mintTo(_bAsset, _bAssetQuantity, msg.sender); + address _input, + uint256 _inputQuantity, + uint256 _minOutputQuantity, + address _recipient + ) external override nonReentrant whenHealthy returns (uint256 mintOutput) { + mintOutput = _mintTo(_input, _inputQuantity, _minOutputQuantity, _recipient); } /** - * @dev Mint a single bAsset, at a 1:1 ratio with the bAsset. This contract - * must have approval to spend the senders bAsset - * @param _bAsset Address of the bAsset to mint - * @param _bAssetQuantity Quantity in bAsset units - * @param _recipient receipient of the newly minted mAsset tokens - * @return massetMinted Number of newly minted mAssets - */ - function mintTo( - address _bAsset, - uint256 _bAssetQuantity, + * @dev Mint with multiple bAssets, at a 1:1 ratio to mAsset. This contract + * must have approval to spend the senders bAssets + * @param _inputs Non-duplicate address array of bASset addresses to deposit for the minted mAsset tokens. + * @param _inputQuantities Quantity of each bAsset to deposit for the minted mAsset. + * Order of array should mirror the above bAsset addresses. + * @param _minOutputQuantity Minimum mAsset quanity to be minted. This protects against slippage. + * @param _recipient Address to receive the newly minted mAsset tokens + * @return mintOutput Quantity of newly minted mAssets for the deposited bAssets. + */ + function mintMulti( + address[] calldata _inputs, + uint256[] calldata _inputQuantities, + uint256 _minOutputQuantity, address _recipient - ) + ) external override nonReentrant whenHealthy returns (uint256 mintOutput) { + mintOutput = _mintMulti(_inputs, _inputQuantities, _minOutputQuantity, _recipient); + } + + /** + * @dev Get the projected output of a given mint + * @param _input Address of the bAsset to deposit for the minted mAsset + * @param _inputQuantity Quantity in bAsset units + * @return mintOutput Estimated mint output in mAsset terms + */ + function getMintOutput(address _input, uint256 _inputQuantity) external - nonReentrant - returns (uint256 massetMinted) + view + override + returns (uint256 mintOutput) { - return _mintTo(_bAsset, _bAssetQuantity, _recipient); + require(_inputQuantity > 0, "Qty==0"); + + (uint8 idx, ) = _getAsset(_input); + + mintOutput = forgeValidator.computeMint(bAssetData, idx, _inputQuantity, _getConfig()); } /** - * @dev Mint with multiple bAssets, at a 1:1 ratio to mAsset. This contract - * must have approval to spend the senders bAssets - * @param _bAssets Non-duplicate address array of bAssets with which to mint - * @param _bAssetQuantity Quantity of each bAsset to mint. Order of array - * should mirror the above - * @param _recipient Address to receive the newly minted mAsset tokens - * @return massetMinted Number of newly minted mAssets + * @dev Get the projected output of a given mint + * @param _inputs Non-duplicate address array of addresses to bAssets to deposit for the minted mAsset tokens. + * @param _inputQuantities Quantity of each bAsset to deposit for the minted mAsset. + * @return mintOutput Estimated mint output in mAsset terms */ - function mintMulti( - address[] calldata _bAssets, - uint256[] calldata _bAssetQuantity, - address _recipient - ) + function getMintMultiOutput(address[] calldata _inputs, uint256[] calldata _inputQuantities) external - nonReentrant - returns(uint256 massetMinted) + view + override + returns (uint256 mintOutput) { - return _mintTo(_bAssets, _bAssetQuantity, _recipient); + uint256 len = _inputQuantities.length; + require(len > 0 && len == _inputs.length, "Input array mismatch"); + (uint8[] memory indexes, ) = _getBassets(_inputs); + return forgeValidator.computeMintMulti(bAssetData, indexes, _inputQuantities, _getConfig()); } /*************************************** @@ -174,649 +291,547 @@ contract Masset is /** @dev Mint Single */ function _mintTo( - address _bAsset, - uint256 _bAssetQuantity, + address _input, + uint256 _inputQuantity, + uint256 _minMassetQuantity, address _recipient - ) - internal - returns (uint256 massetMinted) - { - require(_recipient != address(0), "Must be a valid recipient"); - require(_bAssetQuantity > 0, "Quantity must not be 0"); - - (bool isValid, BassetDetails memory bInfo) = basketManager.prepareForgeBasset(_bAsset, _bAssetQuantity, true); - if(!isValid) return 0; - + ) internal returns (uint256 mAssetMinted) { + require(_recipient != address(0), "Invalid recipient"); + require(_inputQuantity > 0, "Qty==0"); + BassetData[] memory allBassets = bAssetData; + (uint8 bAssetIndex, BassetPersonal memory personal) = _getAsset(_input); Cache memory cache = _getCacheDetails(); - // Transfer collateral to the platform integration address and call deposit - address integrator = bInfo.integrator; - (uint256 quantityDeposited, uint256 ratioedDeposit) = - _depositTokens(_bAsset, bInfo.bAsset.ratio, integrator, bInfo.bAsset.isTransferFeeCharged, _bAssetQuantity, cache.maxCache); - + uint256 quantityDeposited = + Manager.depositTokens( + personal, + allBassets[bAssetIndex].ratio, + _inputQuantity, + cache.maxCache + ); // Validation should be after token transfer, as bAssetQty is unknown before - (bool mintValid, string memory reason) = forgeValidator.validateMint(cache.vaultBalanceSum, bInfo.bAsset, quantityDeposited); - require(mintValid, reason); - + mAssetMinted = forgeValidator.computeMint( + allBassets, + bAssetIndex, + quantityDeposited, + _getConfig() + ); + require(mAssetMinted >= _minMassetQuantity, "Mint quantity < min qty"); // Log the Vault increase - can only be done when basket is healthy - basketManager.increaseVaultBalance(bInfo.index, integrator, quantityDeposited); - + bAssetData[bAssetIndex].vaultBalance = + allBassets[bAssetIndex].vaultBalance + + SafeCast.toUint128(quantityDeposited); // Mint the Masset - _mint(_recipient, ratioedDeposit); - emit Minted(msg.sender, _recipient, ratioedDeposit, _bAsset, quantityDeposited); - - return ratioedDeposit; + _mint(_recipient, mAssetMinted); + emit Minted(msg.sender, _recipient, mAssetMinted, _input, quantityDeposited); } /** @dev Mint Multi */ - function _mintTo( - address[] memory _bAssets, - uint256[] memory _bAssetQuantities, + function _mintMulti( + address[] memory _inputs, + uint256[] memory _inputQuantities, + uint256 _minMassetQuantity, address _recipient - ) - internal - returns (uint256 massetMinted) - { - require(_recipient != address(0), "Must be a valid recipient"); - uint256 len = _bAssetQuantities.length; - require(len > 0 && len == _bAssets.length, "Input array mismatch"); - - // Load only needed bAssets in array - ForgePropsMulti memory props - = basketManager.prepareForgeBassets(_bAssets, _bAssetQuantities, true); - if(!props.isValid) return 0; - + ) internal returns (uint256 mAssetMinted) { + require(_recipient != address(0), "Invalid recipient"); + uint256 len = _inputQuantities.length; + require(len > 0 && len == _inputs.length, "Input array mismatch"); + // Load bAssets from storage into memory + (uint8[] memory indexes, BassetPersonal[] memory personals) = _getBassets(_inputs); + BassetData[] memory allBassets = bAssetData; Cache memory cache = _getCacheDetails(); - - uint256 mAssetQuantity = 0; - uint256[] memory receivedQty = new uint256[](len); - + uint256[] memory quantitiesDeposited = new uint256[](len); // Transfer the Bassets to the integrator, update storage and calc MassetQ - for(uint256 i = 0; i < len; i++){ - uint256 bAssetQuantity = _bAssetQuantities[i]; - if(bAssetQuantity > 0){ - // bAsset == bAssets[i] == basket.bassets[indexes[i]] - Basset memory bAsset = props.bAssets[i]; - - (uint256 quantityDeposited, uint256 ratioedDeposit) = - _depositTokens(bAsset.addr, bAsset.ratio, props.integrators[i], bAsset.isTransferFeeCharged, bAssetQuantity, cache.maxCache); - - receivedQty[i] = quantityDeposited; - mAssetQuantity = mAssetQuantity.add(ratioedDeposit); + for (uint256 i = 0; i < len; i++) { + uint256 bAssetQuantity = _inputQuantities[i]; + if (bAssetQuantity > 0) { + uint8 idx = indexes[i]; + BassetData memory data = allBassets[idx]; + BassetPersonal memory personal = personals[i]; + uint256 quantityDeposited = + Manager.depositTokens(personal, data.ratio, bAssetQuantity, cache.maxCache); + quantitiesDeposited[i] = quantityDeposited; + bAssetData[idx].vaultBalance = + data.vaultBalance + + SafeCast.toUint128(quantityDeposited); } } - require(mAssetQuantity > 0, "No masset quantity to mint"); - - basketManager.increaseVaultBalances(props.indexes, props.integrators, receivedQty); - // Validate the proposed mint, after token transfer - (bool mintValid, string memory reason) = forgeValidator.validateMintMulti(cache.vaultBalanceSum, props.bAssets, receivedQty); - require(mintValid, reason); + mAssetMinted = forgeValidator.computeMintMulti( + allBassets, + indexes, + quantitiesDeposited, + _getConfig() + ); + require(mAssetMinted >= _minMassetQuantity, "Mint quantity < min qty"); + require(mAssetMinted > 0, "Zero mAsset quantity"); // Mint the Masset - _mint(_recipient, mAssetQuantity); - emit MintedMulti(msg.sender, _recipient, mAssetQuantity, _bAssets, _bAssetQuantities); - - return mAssetQuantity; - } - - /** - * @dev Deposits a given asset to the system. If there is sufficient room for the asset - * in the cache, then just transfer, otherwise reset the cache to the desired mid level by - * depositing the delta in the platform - */ - function _depositTokens( - address _bAsset, - uint256 _bAssetRatio, - address _integrator, - bool _hasTxFee, - uint256 _quantity, - uint256 _maxCache - ) - internal - returns (uint256 quantityDeposited, uint256 ratioedDeposit) - { - // 1 - Send all to PI, using the opportunity to get the cache balance and net amount transferred - (uint256 transferred, uint256 cacheBal) = MassetHelpers.transferReturnBalance(msg.sender, _integrator, _bAsset, _quantity); - - // 2 - Deposit X if necessary - // - Can account here for non-lending market integrated bAssets by simply checking for - // integrator == address(0) || address(this) and then keeping entirely in cache - // 2.1 - Deposit if xfer fees - if(_hasTxFee){ - uint256 deposited = IPlatformIntegration(_integrator).deposit(_bAsset, transferred, true); - quantityDeposited = StableMath.min(deposited, _quantity); - } - // 2.2 - Else Deposit X if Cache > % - else { - // This check is in place to ensure that any token with a txFee is rejected - require(transferred == _quantity, "Asset not fully transferred"); - - quantityDeposited = transferred; - - uint256 relativeMaxCache = _maxCache.divRatioPrecisely(_bAssetRatio); - - if(cacheBal > relativeMaxCache){ - uint256 delta = cacheBal.sub(relativeMaxCache.div(2)); - IPlatformIntegration(_integrator).deposit(_bAsset, delta, false); - } - } - - ratioedDeposit = quantityDeposited.mulRatioTruncate(_bAssetRatio); + _mint(_recipient, mAssetMinted); + emit MintedMulti(msg.sender, _recipient, mAssetMinted, _inputs, _inputQuantities); } /*************************************** SWAP (PUBLIC) ****************************************/ - struct SwapArgs { - address input; - address output; - address recipient; - } - /** - * @dev Simply swaps one bAsset for another bAsset or this mAsset at a 1:1 ratio. - * bAsset <> bAsset swaps will incur a small fee (swapFee()). Swap - * is valid if it does not result in the input asset exceeding its maximum weight. - * @param _input bAsset to deposit - * @param _output Asset to receive - either a bAsset or mAsset(this) - * @param _quantity Units of input bAsset to swap - * @param _recipient Address to credit output asset - * @return output Units of output asset returned + * @dev Swaps one bAsset for another bAsset using the bAsset addresses. + * bAsset <> bAsset swaps will incur a small fee (swapFee()). + * @param _input Address of bAsset to deposit + * @param _output Address of bAsset to receive + * @param _inputQuantity Units of input bAsset to swap + * @param _minOutputQuantity Minimum quantity of the swap output asset. This protects against slippage + * @param _recipient Address to transfer output asset to + * @return swapOutput Quantity of output asset returned from swap */ function swap( address _input, address _output, - uint256 _quantity, + uint256 _inputQuantity, + uint256 _minOutputQuantity, address _recipient - ) - external - nonReentrant - returns (uint256 output) - { - // Struct created to avoid Stack Too Deep errors. Minor gas cost increase. - SwapArgs memory args = SwapArgs(_input, _output, _recipient); - require(args.input != address(0) && args.output != address(0), "Invalid swap asset addresses"); - require(args.input != args.output, "Cannot swap the same asset"); - require(args.recipient != address(0), "Missing recipient address"); - require(_quantity > 0, "Invalid quantity"); - - // 1. If the output is this mAsset, just mint - if(args.output == address(this)){ - return _mintTo(args.input, _quantity, args.recipient); - } - - // 2. Grab all relevant info from the Manager - (bool isValid, string memory reason, BassetDetails memory inputDetails, BassetDetails memory outputDetails) = - basketManager.prepareSwapBassets(args.input, args.output, false); - require(isValid, reason); - - Cache memory cache = _getCacheDetails(); - - // 3. Deposit the input tokens - (uint256 amountIn, ) = - _depositTokens(args.input, inputDetails.bAsset.ratio, inputDetails.integrator, inputDetails.bAsset.isTransferFeeCharged, _quantity, cache.maxCache); - // 3.1. Update the input balance - basketManager.increaseVaultBalance(inputDetails.index, inputDetails.integrator, amountIn); - - // 4. Validate the swap - (bool swapValid, string memory swapValidityReason, uint256 swapOutput, bool applySwapFee) = - forgeValidator.validateSwap(cache.vaultBalanceSum, inputDetails.bAsset, outputDetails.bAsset, amountIn); - require(swapValid, swapValidityReason); - require(swapOutput > 0, "Must withdraw something"); - - // 5. Settle the swap - // 5.0. Redeclare recipient to avoid stack depth error - address recipient = args.recipient; - // 5.1. Decrease output bal - Amount memory amt = _withdrawTokens( - WithdrawArgs({ - quantity: swapOutput, - bAsset: args.output, - integrator: outputDetails.integrator, - feeRate: applySwapFee ? swapFee : 0, - hasTxFee: outputDetails.bAsset.isTransferFeeCharged, - recipient: recipient, - ratio: outputDetails.bAsset.ratio, - maxCache: cache.maxCache, - vaultBalance: outputDetails.bAsset.vaultBalance - }) - ); - - basketManager.decreaseVaultBalance(outputDetails.index, outputDetails.integrator, amt.net); - - surplus = cache.surplus.add(amt.scaledFee); - - emit Swapped(msg.sender, args.input, args.output, amt.net, recipient); - - return amt.net; + ) external override nonReentrant whenHealthy returns (uint256 swapOutput) { + swapOutput = _swap(_input, _output, _inputQuantity, _minOutputQuantity, _recipient); } /** * @dev Determines both if a trade is valid, and the expected fee or output. * Swap is valid if it does not result in the input asset exceeding its maximum weight. - * @param _input bAsset to deposit - * @param _output Asset to receive - bAsset or mAsset(this) - * @param _quantity Units of input bAsset to swap - * @return valid Bool to signify that swap is current valid - * @return reason If swap is invalid, this is the reason - * @return output Units of _output asset the trade would return + * @param _input Address of bAsset to deposit + * @param _output Address of bAsset to receive + * @param _inputQuantity Units of input bAsset to swap + * @return swapOutput Quantity of output asset returned from swap */ function getSwapOutput( address _input, address _output, - uint256 _quantity - ) - external - view - returns (bool, string memory, uint256 output) - { - require(_input != address(0) && _output != address(0), "Invalid swap asset addresses"); - require(_input != _output, "Cannot swap the same asset"); - - bool isMint = _output == address(this); - uint256 quantity = _quantity; + uint256 _inputQuantity + ) external view override returns (uint256 swapOutput) { + require(_input != _output, "Invalid pair"); + require(_inputQuantity > 0, "Invalid swap quantity"); + + // 1. Load the bAssets from storage into memory + BassetData[] memory allBassets = bAssetData; + (uint8 inputIdx, ) = _getAsset(_input); + (uint8 outputIdx, ) = _getAsset(_output); + + // 2. If a bAsset swap, calculate the validity, output and fee + (swapOutput, ) = forgeValidator.computeSwap( + allBassets, + inputIdx, + outputIdx, + _inputQuantity, + swapFee, + _getConfig() + ); + } - // 1. Get relevant asset data - (bool isValid, string memory reason, BassetDetails memory inputDetails, BassetDetails memory outputDetails) = - basketManager.prepareSwapBassets(_input, _output, isMint); - if(!isValid){ - return (false, reason, 0); - } + /*************************************** + SWAP (INTERNAL) + ****************************************/ + /** @dev Swap single */ + function _swap( + address _input, + address _output, + uint256 _inputQuantity, + uint256 _minOutputQuantity, + address _recipient + ) internal returns (uint256 swapOutput) { + require(_recipient != address(0), "Invalid recipient"); + require(_input != _output, "Invalid pair"); + require(_inputQuantity > 0, "Invalid swap quantity"); + + // 1. Load the bAssets from storage into memory + BassetData[] memory allBassets = bAssetData; + (uint8 inputIdx, BassetPersonal memory inputPersonal) = _getAsset(_input); + (uint8 outputIdx, BassetPersonal memory outputPersonal) = _getAsset(_output); + // 2. Load cache Cache memory cache = _getCacheDetails(); + // 3. Deposit the input tokens + uint256 quantityDeposited = + Manager.depositTokens( + inputPersonal, + allBassets[inputIdx].ratio, + _inputQuantity, + cache.maxCache + ); + // 3.1. Update the input balance + bAssetData[inputIdx].vaultBalance = + allBassets[inputIdx].vaultBalance + + SafeCast.toUint128(quantityDeposited); - // 2. check if trade is valid - // 2.1. If output is mAsset(this), then calculate a simple mint - if(isMint){ - // Validate mint - (isValid, reason) = forgeValidator.validateMint(cache.vaultBalanceSum, inputDetails.bAsset, quantity); - if(!isValid) return (false, reason, 0); - // Simply cast the quantity to mAsset - output = quantity.mulRatioTruncate(inputDetails.bAsset.ratio); - return(true, "", output); - } - // 2.2. If a bAsset swap, calculate the validity, output and fee - else { - (bool swapValid, string memory swapValidityReason, uint256 swapOutput, bool applySwapFee) = - forgeValidator.validateSwap(cache.vaultBalanceSum, inputDetails.bAsset, outputDetails.bAsset, quantity); - if(!swapValid){ - return (false, swapValidityReason, 0); - } - - // 3. Return output and fee, if any - if(applySwapFee){ - (, swapOutput) = _calcSwapFee(swapOutput, swapFee); - } - return (true, "", swapOutput); - } + // 3. Validate the swap + uint256 scaledFee; + (swapOutput, scaledFee) = forgeValidator.computeSwap( + allBassets, + inputIdx, + outputIdx, + quantityDeposited, + swapFee, + _getConfig() + ); + require(swapOutput >= _minOutputQuantity, "Output qty < minimum qty"); + require(swapOutput > 0, "Zero output quantity"); + //4. Settle the swap + //4.1. Decrease output bal + Manager.withdrawTokens( + swapOutput, + outputPersonal, + allBassets[outputIdx], + _recipient, + cache.maxCache + ); + bAssetData[outputIdx].vaultBalance = + allBassets[outputIdx].vaultBalance - + SafeCast.toUint128(swapOutput); + // Save new surplus to storage + surplus = cache.surplus + scaledFee; + emit Swapped( + msg.sender, + inputPersonal.addr, + outputPersonal.addr, + swapOutput, + scaledFee, + _recipient + ); } - /*************************************** - REDEMPTION (PUBLIC) + REDEMPTION (PUBLIC) ****************************************/ /** - * @dev Credits the sender with a certain quantity of selected bAsset, in exchange for burning the - * relative mAsset quantity from the sender. Sender also incurs a small mAsset fee, if any. - * @param _bAsset Address of the bAsset to redeem - * @param _bAssetQuantity Units of the bAsset to redeem - * @return massetMinted Relative number of mAsset units burned to pay for the bAssets + * @notice Redeems a specified quantity of mAsset in return for a bAsset specified by bAsset address. + * The bAsset is sent to the specified recipient. + * The bAsset quantity is relative to current vault balance levels and desired mAsset quantity. + * The quantity of mAsset is burnt as payment. + * A minimum quantity of bAsset is specified to protect against price slippage between the mAsset and bAsset. + * @param _output Address of the bAsset to receive + * @param _mAssetQuantity Quantity of mAsset to redeem + * @param _minOutputQuantity Minimum bAsset quantity to receive for the burnt mAssets. This protects against slippage. + * @param _recipient Address to transfer the withdrawn bAssets to. + * @return outputQuantity Quanity of bAsset units received for the burnt mAssets */ function redeem( - address _bAsset, - uint256 _bAssetQuantity - ) - external - nonReentrant - returns (uint256 massetRedeemed) - { - return _redeemTo(_bAsset, _bAssetQuantity, msg.sender); + address _output, + uint256 _mAssetQuantity, + uint256 _minOutputQuantity, + address _recipient + ) external override nonReentrant whenNoRecol returns (uint256 outputQuantity) { + outputQuantity = _redeem(_output, _mAssetQuantity, _minOutputQuantity, _recipient); } /** - * @dev Credits a recipient with a certain quantity of selected bAsset, in exchange for burning the - * relative Masset quantity from the sender. Sender also incurs a small fee, if any. - * @param _bAsset Address of the bAsset to redeem - * @param _bAssetQuantity Units of the bAsset to redeem - * @param _recipient Address to credit with withdrawn bAssets - * @return massetMinted Relative number of mAsset units burned to pay for the bAssets + * @dev Credits a recipient with a proportionate amount of bAssets, relative to current vault + * balance levels and desired mAsset quantity. Burns the mAsset as payment. + * @param _mAssetQuantity Quantity of mAsset to redeem + * @param _minOutputQuantities Min units of output to receive + * @param _recipient Address to credit the withdrawn bAssets */ - function redeemTo( - address _bAsset, - uint256 _bAssetQuantity, + function redeemMasset( + uint256 _mAssetQuantity, + uint256[] calldata _minOutputQuantities, address _recipient - ) - external - nonReentrant - returns (uint256 massetRedeemed) - { - return _redeemTo(_bAsset, _bAssetQuantity, _recipient); + ) external override nonReentrant whenNoRecol returns (uint256[] memory outputQuantities) { + outputQuantities = _redeemMasset(_mAssetQuantity, _minOutputQuantities, _recipient); } /** * @dev Credits a recipient with a certain quantity of selected bAssets, in exchange for burning the * relative Masset quantity from the sender. Sender also incurs a small fee on the outgoing asset. - * @param _bAssets Address of the bAssets to redeem - * @param _bAssetQuantities Units of the bAssets to redeem - * @param _recipient Address to credit with withdrawn bAssets - * @return massetMinted Relative number of mAsset units burned to pay for the bAssets - */ - function redeemMulti( - address[] calldata _bAssets, - uint256[] calldata _bAssetQuantities, + * @param _outputs Addresses of the bAssets to receive + * @param _outputQuantities Units of the bAssets to redeem + * @param _maxMassetQuantity Maximum mAsset quantity to burn for the received bAssets. This protects against slippage. + * @param _recipient Address to receive the withdrawn bAssets + * @return mAssetQuantity Quantity of mAsset units burned plus the swap fee to pay for the redeemed bAssets + */ + function redeemExactBassets( + address[] calldata _outputs, + uint256[] calldata _outputQuantities, + uint256 _maxMassetQuantity, address _recipient - ) - external - nonReentrant - returns (uint256 massetRedeemed) - { - return _redeemTo(_bAssets, _bAssetQuantities, _recipient); + ) external override nonReentrant whenNoRecol returns (uint256 mAssetQuantity) { + mAssetQuantity = _redeemExactBassets( + _outputs, + _outputQuantities, + _maxMassetQuantity, + _recipient + ); } /** - * @dev Credits a recipient with a proportionate amount of bAssets, relative to current vault - * balance levels and desired mAsset quantity. Burns the mAsset as payment. - * @param _mAssetQuantity Quantity of mAsset to redeem - * @param _recipient Address to credit the withdrawn bAssets + * @notice Gets the estimated output from a given redeem + * @param _output Address of the bAsset to receive + * @param _mAssetQuantity Quantity of mAsset to redeem + * @return bAssetOutput Estimated quantity of bAsset units received for the burnt mAssets */ - function redeemMasset( - uint256 _mAssetQuantity, - address _recipient - ) + function getRedeemOutput(address _output, uint256 _mAssetQuantity) external - nonReentrant + view + override + returns (uint256 bAssetOutput) { - _redeemMasset(_mAssetQuantity, _recipient); - } + require(_mAssetQuantity > 0, "Qty==0"); - /*************************************** - REDEMPTION (INTERNAL) - ****************************************/ + (uint8 idx, ) = _getAsset(_output); - /** @dev Casting to arrays for use in redeemMulti func */ - function _redeemTo( - address _bAsset, - uint256 _bAssetQuantity, - address _recipient - ) - internal - returns (uint256 massetRedeemed) - { - address[] memory bAssets = new address[](1); - uint256[] memory quantities = new uint256[](1); - bAssets[0] = _bAsset; - quantities[0] = _bAssetQuantity; - return _redeemTo(bAssets, quantities, _recipient); + uint256 scaledFee = _mAssetQuantity.mulTruncate(swapFee); + bAssetOutput = forgeValidator.computeRedeem( + bAssetData, + idx, + _mAssetQuantity - scaledFee, + _getConfig() + ); } - /** @dev Redeem mAsset for one or more bAssets */ - function _redeemTo( - address[] memory _bAssets, - uint256[] memory _bAssetQuantities, - address _recipient - ) - internal - returns (uint256 massetRedeemed) - { - require(_recipient != address(0), "Must be a valid recipient"); - uint256 bAssetCount = _bAssetQuantities.length; - require(bAssetCount > 0 && bAssetCount == _bAssets.length, "Input array mismatch"); - - // Prepare relevant data - RedeemProps memory props = basketManager.prepareRedeemBassets(_bAssets); - if(!props.isValid) return 0; - - Cache memory cache = _getCacheDetails(); + /** + * @notice Gets the estimated output from a given redeem + * @param _outputs Addresses of the bAsset to receive + * @param _outputQuantities Quantities of bAsset to redeem + * @return mAssetQuantity Estimated quantity of mAsset units needed to burn to receive output + */ + function getRedeemExactBassetsOutput( + address[] calldata _outputs, + uint256[] calldata _outputQuantities + ) external view override returns (uint256 mAssetQuantity) { + uint256 len = _outputQuantities.length; + require(len > 0 && len == _outputs.length, "Invalid array input"); + + (uint8[] memory indexes, ) = _getBassets(_outputs); + + // calculate the value of mAssets need to cover the value of bAssets being redeemed + uint256 mAssetRedeemed = + forgeValidator.computeRedeemExact(bAssetData, indexes, _outputQuantities, _getConfig()); + mAssetQuantity = mAssetRedeemed.divPrecisely(1e18 - swapFee) + 1; + } - // Validate redemption - (bool redemptionValid, string memory reason, bool applyFee) = - forgeValidator.validateRedemption(false, cache.vaultBalanceSum, props.allBassets, props.indexes, _bAssetQuantities); - require(redemptionValid, reason); - - uint256 mAssetQuantity = 0; - - // Calc total redeemed mAsset quantity - for(uint256 i = 0; i < bAssetCount; i++){ - uint256 bAssetQuantity = _bAssetQuantities[i]; - if(bAssetQuantity > 0){ - // Calc equivalent mAsset amount - uint256 ratioedBasset = bAssetQuantity.mulRatioTruncateCeil(props.bAssets[i].ratio); - mAssetQuantity = mAssetQuantity.add(ratioedBasset); - } - } - require(mAssetQuantity > 0, "Must redeem some bAssets"); + /*************************************** + REDEMPTION (INTERNAL) + ****************************************/ - // Redemption has fee? Fetch the rate - uint256 fee = applyFee ? swapFee : 0; + /** + * @dev Redeem mAsset for a single bAsset + */ + function _redeem( + address _output, + uint256 _inputQuantity, + uint256 _minOutputQuantity, + address _recipient + ) internal returns (uint256 bAssetQuantity) { + require(_recipient != address(0), "Invalid recipient"); + require(_inputQuantity > 0, "Qty==0"); + // Load the bAsset data from storage into memory + BassetData[] memory allBassets = bAssetData; + (uint8 bAssetIndex, BassetPersonal memory personal) = _getAsset(_output); + // Calculate redemption quantities + uint256 scaledFee = _inputQuantity.mulTruncate(swapFee); + bAssetQuantity = forgeValidator.computeRedeem( + allBassets, + bAssetIndex, + _inputQuantity - scaledFee, + _getConfig() + ); + require(bAssetQuantity >= _minOutputQuantity, "bAsset qty < min qty"); + require(bAssetQuantity > 0, "Output == 0"); // Apply fees, burn mAsset and return bAsset to recipient - _settleRedemption( - RedemptionSettlement({ - recipient: _recipient, - mAssetQuantity: mAssetQuantity, - bAssetQuantities: _bAssetQuantities, - indices: props.indexes, - integrators: props.integrators, - feeRate: fee, - bAssets: props.bAssets, - cache: cache - }) + // 1.0. Burn the full amount of Masset + _burn(msg.sender, _inputQuantity); + surplus += scaledFee; + Cache memory cache = _getCacheDetails(); + // 2.0. Transfer the Bassets to the recipient + Manager.withdrawTokens( + bAssetQuantity, + personal, + allBassets[bAssetIndex], + _recipient, + cache.maxCache + ); + // 3.0. Set vault balance + bAssetData[bAssetIndex].vaultBalance = + allBassets[bAssetIndex].vaultBalance - + SafeCast.toUint128(bAssetQuantity); + + emit Redeemed( + msg.sender, + _recipient, + _inputQuantity, + personal.addr, + bAssetQuantity, + scaledFee ); - - emit Redeemed(msg.sender, _recipient, mAssetQuantity, _bAssets, _bAssetQuantities); - return mAssetQuantity; } - - /** @dev Redeem mAsset for a multiple bAssets */ + /** + * @dev Redeem mAsset for proportional amount of bAssets + */ function _redeemMasset( - uint256 _mAssetQuantity, + uint256 _inputQuantity, + uint256[] calldata _minOutputQuantities, address _recipient - ) - internal - { - require(_recipient != address(0), "Must be a valid recipient"); - require(_mAssetQuantity > 0, "Invalid redemption quantity"); + ) internal returns (uint256[] memory outputQuantities) { + require(_recipient != address(0), "Invalid recipient"); + require(_inputQuantity > 0, "Qty==0"); - // Fetch high level details - RedeemPropsMulti memory props = basketManager.prepareRedeemMulti(); - uint256 colRatio = StableMath.min(props.colRatio, StableMath.getFullScale()); + // Calculate mAsset redemption quantities + uint256 scaledFee = _inputQuantity.mulTruncate(redemptionFee); + uint256 mAssetRedemptionAmount = _inputQuantity - scaledFee; - // Ensure payout is related to the collateralised mAsset quantity - uint256 collateralisedMassetQuantity = _mAssetQuantity.mulTruncate(colRatio); + // Burn mAsset quantity + _burn(msg.sender, _inputQuantity); + surplus += scaledFee; - // Calculate redemption quantities - (bool redemptionValid, string memory reason, uint256[] memory bAssetQuantities) = - forgeValidator.calculateRedemptionMulti(collateralisedMassetQuantity, props.bAssets); - require(redemptionValid, reason); + // Calc cache and total mAsset circulating + Cache memory cache = _getCacheDetails(); + // Total mAsset = (totalSupply + _inputQuantity - scaledFee) + surplus + uint256 totalMasset = cache.vaultBalanceSum + mAssetRedemptionAmount; + + // Load the bAsset data from storage into memory + BassetData[] memory allBassets = bAssetData; + + uint256 len = allBassets.length; + address[] memory outputs = new address[](len); + outputQuantities = new uint256[](len); + for (uint256 i = 0; i < len; i++) { + // Get amount out, proportionate to redemption quantity + // Use `cache.sum` here as the total mAsset supply is actually totalSupply + surplus + uint256 amountOut = (allBassets[i].vaultBalance * mAssetRedemptionAmount) / totalMasset; + require(amountOut > 1, "Output == 0"); + amountOut -= 1; + require(amountOut >= _minOutputQuantities[i], "bAsset qty < min qty"); + // Set output in array + (outputQuantities[i], outputs[i]) = (amountOut, bAssetPersonal[i].addr); + // Transfer the bAsset to the recipient + Manager.withdrawTokens( + amountOut, + bAssetPersonal[i], + allBassets[i], + _recipient, + cache.maxCache + ); + // reduce vaultBalance + bAssetData[i].vaultBalance = allBassets[i].vaultBalance - SafeCast.toUint128(amountOut); + } - // Apply fees, burn mAsset and return bAsset to recipient - _settleRedemption( - RedemptionSettlement({ - recipient: _recipient, - mAssetQuantity: _mAssetQuantity, - bAssetQuantities: bAssetQuantities, - indices: props.indexes, - integrators: props.integrators, - feeRate: redemptionFee, - bAssets: props.bAssets, - cache: _getCacheDetails() - }) + emit RedeemedMulti( + msg.sender, + _recipient, + _inputQuantity, + outputs, + outputQuantities, + scaledFee ); - - emit RedeemedMasset(msg.sender, _recipient, _mAssetQuantity); - } - - /** - * @param _recipient Recipient of the bAssets - * @param _mAssetQuantity Total amount of mAsset to burn from sender - * @param _bAssetQuantities Array of bAsset quantities - * @param _indices Matching indices for the bAsset array - * @param _integrators Matching integrators for the bAsset array - * @param _feeRate Fee rate to be applied to this redemption - * @param _bAssets Array of bAssets to redeem - */ - struct RedemptionSettlement { - address recipient; - uint256 mAssetQuantity; - uint256[] bAssetQuantities; - uint8[] indices; - address[] integrators; - uint256 feeRate; - Basset[] bAssets; - Cache cache; } - /** - * @dev Internal func to update contract state post-redemption, - * burning sufficient mAsset before withdrawing all tokens - */ - function _settleRedemption( - RedemptionSettlement memory args - ) internal { + /** @dev Redeem mAsset for one or more bAssets */ + function _redeemExactBassets( + address[] memory _outputs, + uint256[] memory _outputQuantities, + uint256 _maxMassetQuantity, + address _recipient + ) internal returns (uint256 mAssetQuantity) { + require(_recipient != address(0), "Invalid recipient"); + uint256 len = _outputQuantities.length; + require(len > 0 && len == _outputs.length, "Invalid array input"); + require(_maxMassetQuantity > 0, "Qty==0"); + + (uint8[] memory indexes, BassetPersonal[] memory personal) = _getBassets(_outputs); + // Load bAsset data from storage to memory + BassetData[] memory allBassets = bAssetData; + // Validate redemption + uint256 mAssetRequired = + forgeValidator.computeRedeemExact(allBassets, indexes, _outputQuantities, _getConfig()); + mAssetQuantity = mAssetRequired.divPrecisely(1e18 - swapFee); + uint256 fee = mAssetQuantity - mAssetRequired; + require(mAssetQuantity > 0, "Must redeem some mAssets"); + mAssetQuantity += 1; + require(mAssetQuantity <= _maxMassetQuantity, "Redeem mAsset qty > max quantity"); + // Apply fees, burn mAsset and return bAsset to recipient // 1.0. Burn the full amount of Masset - _burn(msg.sender, args.mAssetQuantity); - + _burn(msg.sender, mAssetQuantity); + surplus += fee; + Cache memory cache = _getCacheDetails(); // 2.0. Transfer the Bassets to the recipient and count fees - uint256 bAssetCount = args.bAssets.length; - uint256[] memory netAmounts = new uint256[](bAssetCount); - uint256 fees = 0; - for(uint256 i = 0; i < bAssetCount; i++){ - Amount memory amt = _withdrawTokens( - WithdrawArgs({ - quantity: args.bAssetQuantities[i], - bAsset: args.bAssets[i].addr, - integrator: args.integrators[i], - feeRate: args.feeRate, - hasTxFee: args.bAssets[i].isTransferFeeCharged, - recipient: args.recipient, - ratio: args.bAssets[i].ratio, - maxCache: args.cache.maxCache, - vaultBalance: args.bAssets[i].vaultBalance - }) + for (uint256 i = 0; i < len; i++) { + uint8 idx = indexes[i]; + Manager.withdrawTokens( + _outputQuantities[i], + personal[i], + allBassets[idx], + _recipient, + cache.maxCache ); - // 2.1. Log the net amounts (output - fee) - netAmounts[i] = amt.net; - // 2.2. Accumulate scaled fees - fees = fees.add(amt.scaledFee); + bAssetData[idx].vaultBalance = + allBassets[idx].vaultBalance - + SafeCast.toUint128(_outputQuantities[i]); } - // 2.3. Log the collected fees to the surplus - surplus = args.cache.surplus.add(fees); - - // 3.0. Reduce the vaultBalances by the **net** amount - basketManager.decreaseVaultBalances(args.indices, args.integrators, netAmounts); + emit RedeemedMulti( + msg.sender, + _recipient, + mAssetQuantity, + _outputs, + _outputQuantities, + fee + ); } - struct WithdrawArgs { - uint256 quantity; - address bAsset; - address integrator; - uint256 feeRate; - bool hasTxFee; - address recipient; - uint256 ratio; - uint256 maxCache; - uint256 vaultBalance; - } + /*************************************** + GETTERS + ****************************************/ /** - * @dev Withdraws a given asset from its platformIntegration. If there is sufficient liquidity - * in the cache, then withdraw from there, otherwise withdraw from the lending market and reset the - * cache to the mid level. - * @param args All args needed for a full withdrawal - * @return amount Struct containing the desired output, output-fee, and the scaled fee + * @dev Get basket details for `Masset_MassetStructs.Basket` + * @return b Basket struct */ - function _withdrawTokens(WithdrawArgs memory args) internal returns (Amount memory amount) { - if(args.quantity > 0){ - - // 1. Deduct the redemption fee, if any, and log quantities - amount = _deductSwapFee(args.bAsset, args.quantity, args.feeRate, args.ratio); - - // 2. If txFee then short circuit - there is no cache - if(args.hasTxFee){ - IPlatformIntegration(args.integrator).withdraw(args.recipient, args.bAsset, amount.net, amount.net, true); - } - // 3. Else, withdraw from either cache or main vault - else { - uint256 cacheBal = IERC20(args.bAsset).balanceOf(args.integrator); - // 3.1 - If balance b in cache, simply withdraw - if(cacheBal >= amount.net) { - IPlatformIntegration(args.integrator).withdrawRaw(args.recipient, args.bAsset, amount.net); - } - // 3.2 - Else reset the cache to X, or as far as possible - // - Withdraw X+b from platform - // - Send b to user - else { - uint256 relativeMidCache = args.maxCache.divRatioPrecisely(args.ratio).div(2); - uint256 totalWithdrawal = StableMath.min(relativeMidCache.add(amount.net).sub(cacheBal), args.vaultBalance.sub(cacheBal)); - - IPlatformIntegration(args.integrator).withdraw( - args.recipient, - args.bAsset, - amount.net, - totalWithdrawal, - false - ); - } - } - } + function getBasket() external view override returns (bool, bool) { + return (basket.undergoingRecol, basket.failed); } - - /*************************************** - INTERNAL - ****************************************/ - - struct Amount { - uint256 gross; - uint256 net; - uint256 scaledFee; + /** + * @dev Get data for a all bAssets in basket + * @return personal Struct[] with full bAsset data + * @return data Number of bAssets in the Basket + */ + function getBassets() + external + view + override + returns (BassetPersonal[] memory personal, BassetData[] memory data) + { + return (bAssetPersonal, bAssetData); } /** - * @dev Calculates the output amount from a given bAsset quantity and fee, and returns in a helpful struct - * @param _asset Asset upon which the fee is being deducted - * @param _bAssetQuantity Exact amount of the bAsset - * @param _feeRate Percentage fee rate - * @param _ratio bAsset ratio, to calculate the scaled fee - * @return struct containing input, input-fee, and a scaled fee + * @dev Get data for a specific bAsset, if it exists + * @param _bAsset Address of bAsset + * @return personal Struct with full bAsset data + * @return data Struct with full bAsset data */ - function _deductSwapFee(address _asset, uint256 _bAssetQuantity, uint256 _feeRate, uint256 _ratio) - private - returns (Amount memory) + function getBasset(address _bAsset) + external + view + override + returns (BassetPersonal memory personal, BassetData memory data) { - if(_feeRate > 0){ - (uint256 fee, uint256 output) = _calcSwapFee(_bAssetQuantity, _feeRate); - - emit PaidFee(msg.sender, _asset, fee); - - return Amount(_bAssetQuantity, output, fee.mulRatioTruncate(_ratio)); - } - return Amount(_bAssetQuantity, _bAssetQuantity, 0); + uint8 idx = bAssetIndexes[_bAsset]; + personal = bAssetPersonal[idx]; + require(personal.addr == _bAsset, "Invalid asset"); + data = bAssetData[idx]; } /** - * @dev Calculates the output amount from a given bAsset quantity and fee - * @param _bAssetQuantity Exact amount of bAsset being swapped out - * @param _feeRate Percentage rate of fee - * @return feeAmount Fee in output asset units - * @return outputMinusFee Input minus fee + * @dev Gets all config needed for general InvariantValidator calls */ - function _calcSwapFee(uint256 _bAssetQuantity, uint256 _feeRate) - private - pure - returns (uint256 feeAmount, uint256 outputMinusFee) - { - // e.g. for 500 massets. - // feeRate == 1% == 1e16. _quantity == 5e20. - // (5e20 * 1e16) / 1e18 = 5e18 - feeAmount = _bAssetQuantity.mulTruncate(_feeRate); - outputMinusFee = _bAssetQuantity.sub(feeAmount); + function getConfig() external view returns (InvariantConfig memory config) { + return _getConfig(); } + /*************************************** + GETTERS - INTERNAL + ****************************************/ + /** * vaultBalanceSum = totalSupply + 'surplus' * maxCache = vaultBalanceSum * (cacheSize / 1e18) @@ -833,147 +848,270 @@ contract Masset is * @return Cache containing (tracked) sum of vault balances, ideal cache size and surplus */ function _getCacheDetails() internal view returns (Cache memory) { + // read surplus from storage into memory uint256 _surplus = surplus; - uint256 sum = totalSupply().add(_surplus); + uint256 sum = totalSupply() + _surplus; return Cache(sum, sum.mulTruncate(cacheSize), _surplus); } - /*************************************** - STATE - ****************************************/ - /** - * @dev Sets the MAX cache size for each bAsset. The cache will actually revolve around - * _cacheSize * totalSupply / 2 under normal circumstances. - * @param _cacheSize Maximum percent of total mAsset supply to hold for each bAsset - */ - function setCacheSize(uint256 _cacheSize) - external - onlyGovernance + * @dev Gets a bAsset from storage + * @param _asset Address of the asset + * @return idx Index of the asset + * @return personal Personal details for the asset + */ + function _getAsset(address _asset) + internal + view + returns (uint8 idx, BassetPersonal memory personal) { - require(_cacheSize <= 2e17, "Must be <= 20%"); - - cacheSize = _cacheSize; - - emit CacheSizeChanged(_cacheSize); + idx = bAssetIndexes[_asset]; + personal = bAssetPersonal[idx]; + require(personal.addr == _asset, "Invalid asset"); } - /** - * @dev Upgrades the version of ForgeValidator protocol. Governor can do this - * only while ForgeValidator is unlocked. - * @param _newForgeValidator Address of the new ForgeValidator - */ - function upgradeForgeValidator(address _newForgeValidator) - external - onlyGovernor + * @dev Gets a an array of bAssets from storage and protects against duplicates + * @param _bAssets Addresses of the assets + * @return indexes Indexes of the assets + * @return personal Personal details for the assets + */ + function _getBassets(address[] memory _bAssets) + internal + view + returns (uint8[] memory indexes, BassetPersonal[] memory personal) { - require(!forgeValidatorLocked, "Must be allowed to upgrade"); - require(_newForgeValidator != address(0), "Must be non null address"); - forgeValidator = IForgeValidator(_newForgeValidator); - emit ForgeValidatorChanged(_newForgeValidator); + uint256 len = _bAssets.length; + + indexes = new uint8[](len); + personal = new BassetPersonal[](len); + + for (uint256 i = 0; i < len; i++) { + (indexes[i], personal[i]) = _getAsset(_bAssets[i]); + + for (uint256 j = i + 1; j < len; j++) { + require(_bAssets[i] != _bAssets[j], "Duplicate asset"); + } + } } /** - * @dev Locks the ForgeValidator into it's final form. Called by Governor - */ - function lockForgeValidator() - external - onlyGovernor - { - forgeValidatorLocked = true; + * @dev Gets all config needed for general InvariantValidator calls + */ + function _getConfig() internal view returns (InvariantConfig memory) { + return InvariantConfig(_getA(), weightLimits); } /** - * @dev Set the ecosystem fee for redeeming a mAsset - * @param _swapFee Fee calculated in (%/100 * 1e18) - */ - function setSwapFee(uint256 _swapFee) - external - onlyGovernor - { - require(_swapFee <= MAX_FEE, "Rate must be within bounds"); - swapFee = _swapFee; + * @dev Gets current amplification var A + */ + function _getA() internal view returns (uint256) { + AmpData memory ampData_ = ampData; - emit SwapFeeChanged(_swapFee); - } + uint64 endA = ampData_.targetA; + uint64 endTime = ampData_.rampEndTime; - /** - * @dev Set the ecosystem fee for redeeming a mAsset - * @param _redemptionFee Fee calculated in (%/100 * 1e18) - */ - function setRedemptionFee(uint256 _redemptionFee) - external - onlyGovernor - { - require(_redemptionFee <= MAX_FEE, "Rate must be within bounds"); - redemptionFee = _redemptionFee; + // If still changing, work out based on current timestmap + if (block.timestamp < endTime) { + uint64 startA = ampData_.initialA; + uint64 startTime = ampData_.rampStartTime; - emit RedemptionFeeChanged(_redemptionFee); - } + (uint256 elapsed, uint256 total) = (block.timestamp - startTime, endTime - startTime); - /** - * @dev Gets the address of the BasketManager for this mAsset - * @return basketManager Address - */ - function getBasketManager() - external - view - returns (address) - { - return address(basketManager); + if (endA > startA) { + return startA + (((endA - startA) * elapsed) / total); + } else { + return startA - (((startA - endA) * elapsed) / total); + } + } + // Else return final value + else { + return endA; + } } /*************************************** - INFLATION + YIELD ****************************************/ /** - * @dev Converts recently accrued swap fees into mAsset - * @return swapFeesGained Equivalent amount of mAsset units that have been generated - * @return newSupply New total mAsset supply + * @dev Converts recently accrued swap and redeem fees into mAsset + * @return mintAmount mAsset units generated from swap and redeem fees + * @return newSupply mAsset total supply after mint */ function collectInterest() external + override onlySavingsManager - nonReentrant - returns (uint256 swapFeesGained, uint256 newSupply) + returns (uint256 mintAmount, uint256 newSupply) { - uint256 toMint = 0; // Set the surplus variable to 1 to optimise for SSTORE costs. // If setting to 0 here, it would save 5k per savings deposit, but cost 20k for the // first surplus call (a SWAP or REDEEM). - if(surplus > 1){ - toMint = surplus.sub(1); + uint256 surplusFees = surplus; + if (surplusFees > 1) { + mintAmount = surplusFees - 1; surplus = 1; // mint new mAsset to savings manager - _mint(msg.sender, toMint); - emit MintedMulti(address(this), address(this), toMint, new address[](0), new uint256[](0)); + _mint(msg.sender, mintAmount); + emit MintedMulti( + address(this), + msg.sender, + mintAmount, + new address[](0), + new uint256[](0) + ); } - - return (toMint, totalSupply()); + newSupply = totalSupply(); } /** * @dev Collects the interest generated from the Basket, minting a relative - * amount of mAsset and sending it over to the SavingsManager. - * @return interestGained Lending market interest collected - * @return newSupply New total mAsset supply + * amount of mAsset and sends it over to the SavingsManager. + * @return mintAmount mAsset units generated from interest collected from lending markets + * @return newSupply mAsset total supply after mint */ function collectPlatformInterest() external + override onlySavingsManager + whenHealthy nonReentrant - returns (uint256 interestGained, uint256 newSupply) + returns (uint256 mintAmount, uint256 newSupply) + { + uint256[] memory gains; + (mintAmount, gains) = Manager.collectPlatformInterest( + bAssetPersonal, + bAssetData, + forgeValidator, + _getConfig() + ); + + require(mintAmount > 0, "Must collect something"); + + _mint(msg.sender, mintAmount); + emit MintedMulti(address(this), msg.sender, mintAmount, new address[](0), gains); + + newSupply = totalSupply(); + } + + /*************************************** + STATE + ****************************************/ + + /** + * @dev Sets the MAX cache size for each bAsset. The cache will actually revolve around + * _cacheSize * totalSupply / 2 under normal circumstances. + * @param _cacheSize Maximum percent of total mAsset supply to hold for each bAsset + */ + function setCacheSize(uint256 _cacheSize) external override onlyGovernor { + require(_cacheSize <= 2e17, "Must be <= 20%"); + + cacheSize = _cacheSize; + + emit CacheSizeChanged(_cacheSize); + } + + /** + * @dev Upgrades the version of ForgeValidator protocol. Governor can do this + * only while ForgeValidator is unlocked. + * @param _newForgeValidator Address of the new ForgeValidator + */ + function upgradeForgeValidator(address _newForgeValidator) external override onlyGovernor { + require(!forgeValidatorLocked, "ForgeVal locked"); + require(_newForgeValidator != address(0), "Null address"); + + forgeValidator = IInvariantValidator(_newForgeValidator); + + emit ForgeValidatorChanged(_newForgeValidator); + } + + /** + * @dev Set the ecosystem fee for sewapping bAssets or redeeming specific bAssets + * @param _swapFee Fee calculated in (%/100 * 1e18) + */ + function setFees(uint256 _swapFee, uint256 _redemptionFee) external override onlyGovernor { + require(_swapFee <= MAX_FEE, "Swap rate oob"); + require(_redemptionFee <= MAX_FEE, "Redemption rate oob"); + + swapFee = _swapFee; + redemptionFee = _redemptionFee; + + emit FeesChanged(_swapFee, _redemptionFee); + } + + /** + * @dev Set the maximum weight for a given bAsset + * @param _min Weight where 100% = 1e18 + * @param _max Weight where 100% = 1e18 + */ + function setWeightLimits(uint128 _min, uint128 _max) external onlyGovernor { + require(_min <= 1e18 / (bAssetData.length * 2), "Min weight oob"); + require(_max >= 1e18 / (bAssetData.length - 1), "Max weight oob"); + + weightLimits = WeightLimits(_min, _max); + + emit WeightLimitsChanged(_min, _max); + } + + /** + * @dev Update transfer fee flag for a given bAsset, should it change its fee practice + * @param _bAsset bAsset address + * @param _flag Charge transfer fee when its set to 'true', otherwise 'false' + */ + function setTransferFeesFlag(address _bAsset, bool _flag) external override onlyGovernor { + Manager.setTransferFeesFlag(bAssetPersonal, bAssetIndexes, _bAsset, _flag); + } + + /** + * @dev Transfers all collateral from one lending market to another - used initially + * to handle the migration between Aave V1 and Aave V2. Note - only supports non + * tx fee enabled assets. Supports going from no integration to integration, but + * not the other way around. + * @param _bAssets Array of basket assets to migrate + * @param _newIntegration Address of the new platform integration + */ + function migrateBassets(address[] calldata _bAssets, address _newIntegration) + external + override + onlyGovernor { - // 1. Collect interest from Basket - (uint256 interestCollected, uint256[] memory gains) = basketManager.collectInterest(); + Manager.migrateBassets(bAssetPersonal, bAssetIndexes, _bAssets, _newIntegration); + } + + /** + * @dev Executes the Auto Redistribution event by isolating the bAsset from the Basket + * @param _bAsset Address of the ERC20 token to isolate + * @param _belowPeg Bool to describe whether the bAsset deviated below peg (t) + * or above (f) + */ + function handlePegLoss(address _bAsset, bool _belowPeg) external onlyGovernor { + Manager.handlePegLoss(basket, bAssetPersonal, bAssetIndexes, _bAsset, _belowPeg); + } - // 2. Mint to SM - _mint(msg.sender, interestCollected); - emit MintedMulti(address(this), address(this), interestCollected, new address[](0), gains); + /** + * @dev Negates the isolation of a given bAsset + * @param _bAsset Address of the bAsset + */ + function negateIsolation(address _bAsset) external onlyGovernor { + Manager.negateIsolation(basket, bAssetPersonal, bAssetIndexes, _bAsset); + } - return (interestCollected, totalSupply()); + /** + * @dev Starts changing of the amplification var A + * @param _targetA Target A value + * @param _rampEndTime Time at which A will arrive at _targetA + */ + function startRampA(uint256 _targetA, uint256 _rampEndTime) external onlyGovernor { + Manager.startRampA(ampData, _targetA, _rampEndTime, _getA(), A_PRECISION); + } + + /** + * @dev Stops the changing of the amplification var A, setting + * it to whatever the current value is. + */ + function stopRampA() external onlyGovernor { + Manager.stopRampA(ampData, _getA()); } } diff --git a/contracts/masset/MassetStructs.sol b/contracts/masset/MassetStructs.sol new file mode 100644 index 00000000..d797c6b0 --- /dev/null +++ b/contracts/masset/MassetStructs.sol @@ -0,0 +1,58 @@ +// SPDX-License-Identifier: AGPL-3.0-or-later +pragma solidity 0.8.0; + +interface MassetStructs { + struct BassetPersonal { + // Address of the bAsset + address addr; + // Address of the bAsset + address integrator; + // An ERC20 can charge transfer fee, for example USDT, DGX tokens. + bool hasTxFee; // takes a byte in storage + // Status of the bAsset + BassetStatus status; + } + + struct BassetData { + // 1 Basset * ratio / ratioScale == x Masset (relative value) + // If ratio == 10e8 then 1 bAsset = 10 mAssets + // A ratio is divised as 10^(18-tokenDecimals) * measurementMultiple(relative value of 1 base unit) + uint128 ratio; + // Amount of the Basset that is held in Collateral + uint128 vaultBalance; + } + + // Status of the Basset - has it broken its peg? + enum BassetStatus { + Default, + Normal, + BrokenBelowPeg, + BrokenAbovePeg, + Blacklisted, + Liquidating, + Liquidated, + Failed + } + + struct BasketState { + bool undergoingRecol; + bool failed; + } + + struct InvariantConfig { + uint256 a; + WeightLimits limits; + } + + struct WeightLimits { + uint128 min; + uint128 max; + } + + struct AmpData { + uint64 initialA; + uint64 targetA; + uint64 rampStartTime; + uint64 rampEndTime; + } +} diff --git a/contracts/masset/forge-validator/ForgeValidator.sol b/contracts/masset/forge-validator/ForgeValidator.sol deleted file mode 100644 index 76957e47..00000000 --- a/contracts/masset/forge-validator/ForgeValidator.sol +++ /dev/null @@ -1,419 +0,0 @@ -pragma solidity 0.5.16; -pragma experimental ABIEncoderV2; - -import { IForgeValidator, MassetStructs } from "./IForgeValidator.sol"; -import { StableMath } from "../../shared/StableMath.sol"; -import { SafeMath } from "@openzeppelin/contracts/math/SafeMath.sol"; - -/** - * @title ForgeValidator - * @author Stability Labs Pty. Ltd. - * @notice Calculates whether or not minting or redemption is valid, based - * on how it affects the underlying basket collateral weightings - * @dev VERSION: 1.1 - * DATE: 2020-06-22 - */ -contract ForgeValidator is IForgeValidator { - - using SafeMath for uint256; - using StableMath for uint256; - - /*************************************** - MINT - ****************************************/ - - /** - * @notice Checks whether a given mint is valid and returns the result - * @dev Is the resulting weighting of the max bAsset beyond it's implicit max weight? - * Max weight is determined as max weight (in units) - * @param _totalVault Current sum of basket collateral - * @param _bAsset Struct containing relevant data on the bAsset - * @param _bAssetQuantity Number of bAsset units that will be used to mint - * @return isValid Bool to signify that the mint does not move our weightings the wrong way - * @return reason If the mint is invalid, this is the reason - */ - function validateMint( - uint256 _totalVault, - Basset calldata _bAsset, - uint256 _bAssetQuantity - ) - external - pure - returns (bool isValid, string memory reason) - { - if( - _bAsset.status == BassetStatus.BrokenBelowPeg || - _bAsset.status == BassetStatus.Liquidating || - _bAsset.status == BassetStatus.Blacklisted - ) { - return (false, "bAsset not allowed in mint"); - } - - // How much mAsset is this _bAssetQuantity worth? - uint256 mintAmountInMasset = _bAssetQuantity.mulRatioTruncate(_bAsset.ratio); - // How much of this bAsset do we have in the vault, in terms of mAsset? - uint256 newBalanceInMasset = _bAsset.vaultBalance.mulRatioTruncate(_bAsset.ratio).add(mintAmountInMasset); - // What is the max weight of this bAsset in the basket? - uint256 maxWeightInUnits = (_totalVault.add(mintAmountInMasset)).mulTruncate(_bAsset.maxWeight); - - if(newBalanceInMasset > maxWeightInUnits) { - return (false, "bAssets used in mint cannot exceed their max weight"); - } - - return (true, ""); - } - - /** - * @notice Checks whether a given mint using more than one asset is valid and returns the result - * @dev Is the resulting weighting of the max bAssets beyond their implicit max weight? - * Max weight is determined as max weight (in units) - * @param _totalVault Current sum of basket collateral - * @param _bAssets Array of Struct containing relevant data on the bAssets - * @param _bAssetQuantities Number of bAsset units that will be used to mint (aligned with above) - * @return isValid Bool to signify that the mint does not move our weightings the wrong way - * @return reason If the mint is invalid, this is the reason - */ - function validateMintMulti( - uint256 _totalVault, - Basset[] calldata _bAssets, - uint256[] calldata _bAssetQuantities - ) - external - pure - returns (bool isValid, string memory reason) - { - uint256 bAssetCount = _bAssets.length; - if(bAssetCount != _bAssetQuantities.length) return (false, "Input length should be equal"); - - uint256[] memory newBalances = new uint256[](bAssetCount); - uint256 newTotalVault = _totalVault; - - // Theoretically add the mint quantities to the vault - for(uint256 j = 0; j < bAssetCount; j++){ - Basset memory b = _bAssets[j]; - BassetStatus bAssetStatus = b.status; - - if( - bAssetStatus == BassetStatus.BrokenBelowPeg || - bAssetStatus == BassetStatus.Liquidating || - bAssetStatus == BassetStatus.Blacklisted - ) { - return (false, "bAsset not allowed in mint"); - } - - // How much mAsset is this bassetquantity worth? - uint256 mintAmountInMasset = _bAssetQuantities[j].mulRatioTruncate(b.ratio); - // How much of this bAsset do we have in the vault, in terms of mAsset? - newBalances[j] = b.vaultBalance.mulRatioTruncate(b.ratio).add(mintAmountInMasset); - - newTotalVault = newTotalVault.add(mintAmountInMasset); - } - - for(uint256 k = 0; k < bAssetCount; k++){ - // What is the max weight of this bAsset in the basket? - uint256 maxWeightInUnits = newTotalVault.mulTruncate(_bAssets[k].maxWeight); - - if(newBalances[k] > maxWeightInUnits) { - return (false, "bAssets used in mint cannot exceed their max weight"); - } - } - - return (true, ""); - } - - /*************************************** - SWAP - ****************************************/ - - /** - * @notice Checks whether a given swap is valid and calculates the output - * @dev Input bAsset must not exceed max weight, output bAsset must have sufficient liquidity - * @param _totalVault Current sum of basket collateral - * @param _inputBasset Input bAsset details - * @param _outputBasset Output bAsset details - * @param _quantity Number of bAsset units on the input side - * @return isValid Bool to signify that the mint does not move our weightings the wrong way - * @return reason If the swap is invalid, this is the reason - * @return output Units of output bAsset, before fee is applied - * @return applySwapFee Bool to signify that the swap fee is applied - */ - function validateSwap( - uint256 _totalVault, - Basset calldata _inputBasset, - Basset calldata _outputBasset, - uint256 _quantity - ) - external - pure - returns (bool isValid, string memory reason, uint256 output, bool applySwapFee) - { - if(_inputBasset.status != BassetStatus.Normal || _outputBasset.status != BassetStatus.Normal) { - return (false, "bAsset not allowed in swap", 0, false); - } - - // How much mAsset is this _bAssetQuantity worth? - uint256 inputAmountInMasset = _quantity.mulRatioTruncate(_inputBasset.ratio); - - // 1. Determine output bAsset valid - // - Enough units in the bank - uint256 outputAmount = inputAmountInMasset.divRatioPrecisely(_outputBasset.ratio); - if(outputAmount > _outputBasset.vaultBalance) { - return (false, "Not enough liquidity", 0, false); - } - - // 1.1. If it is currently overweight, then no fee - applySwapFee = true; - uint256 outputBalanceMasset = _outputBasset.vaultBalance.mulRatioTruncate(_outputBasset.ratio); - uint256 outputMaxWeightUnits = _totalVault.mulTruncate(_outputBasset.maxWeight); - if(outputBalanceMasset > outputMaxWeightUnits) { - applySwapFee = false; - } - - // 2. Calculate input bAsset valid - If incoming basket goes above weight, then fail - // How much of this bAsset do we have in the vault, in terms of mAsset? - uint256 newInputBalanceInMasset = _inputBasset.vaultBalance.mulRatioTruncate(_inputBasset.ratio).add(inputAmountInMasset); - // What is the max weight of this bAsset in the basket? - uint256 inputMaxWeightInUnits = _totalVault.mulTruncate(_inputBasset.maxWeight); - if(newInputBalanceInMasset > inputMaxWeightInUnits) { - return (false, "Input must remain below max weighting", 0, false); - } - - // 3. Return swap output - return (true, "", outputAmount, applySwapFee); - } - - - /*************************************** - REDEEM - ****************************************/ - - /** - * @notice Checks whether a given redemption is valid and returns the result - * @dev A redemption is valid if it does not push any untouched bAssets above their - * max weightings. In addition, if bAssets are currently above their max weight - * (i.e. during basket composition changes) they must be redeemed - * @param _basketIsFailed Bool to suggest that the basket has failed a recollateralisation attempt - * @param _totalVault Sum of collateral units in the basket - * @param _allBassets Array of all bAsset information - * @param _indices Indexes of the bAssets to redeem - * @param _bAssetQuantities Quantity of bAsset to redeem - * @return isValid Bool to signify that the redemption is allowed - * @return reason If the redemption is invalid, this is the reason - * @return feeRequired Does this redemption require the swap fee to be applied - */ - function validateRedemption( - bool _basketIsFailed, - uint256 _totalVault, - Basset[] calldata _allBassets, - uint8[] calldata _indices, - uint256[] calldata _bAssetQuantities - ) - external - pure - returns (bool, string memory, bool) - { - uint256 idxCount = _indices.length; - if(idxCount != _bAssetQuantities.length) return (false, "Input arrays must have equal length", false); - - // Get current weightings, and cache some outputs from the loop to avoid unnecessary recursion - BasketStateResponse memory data = _getBasketState(_totalVault, _allBassets); - if(!data.isValid) return (false, data.reason, false); - - // If the basket is in an affected state, enforce proportional redemption - if( - _basketIsFailed || - data.atLeastOneBroken - ) { - return (false, "Must redeem proportionately", false); - } else if (data.overWeightCount > idxCount) { - return (false, "Redemption must contain all overweight bAssets", false); - } - - uint256 newTotalVault = _totalVault; - - // Simulate the redemption on the ratioedBassetVaults and totalSupply - for(uint256 i = 0; i < idxCount; i++){ - uint8 idx = _indices[i]; - if(idx >= _allBassets.length) return (false, "Basset does not exist", false); - - Basset memory bAsset = _allBassets[idx]; - uint256 quantity = _bAssetQuantities[i]; - if(quantity > bAsset.vaultBalance) return (false, "Cannot redeem more bAssets than are in the vault", false); - - // Calculate ratioed redemption amount in mAsset terms - uint256 ratioedRedemptionAmount = quantity.mulRatioTruncate(bAsset.ratio); - // Subtract ratioed redemption amount from both vault and total supply - data.ratioedBassetVaults[idx] = data.ratioedBassetVaults[idx].sub(ratioedRedemptionAmount); - - newTotalVault = newTotalVault.sub(ratioedRedemptionAmount); - } - - // Get overweight after - bool atLeastOneBecameOverweight = - _getOverweightBassetsAfter(newTotalVault, _allBassets, data.ratioedBassetVaults, data.isOverWeight); - - bool applySwapFee = true; - // If there are any bAssets overweight, we must redeem them all - if(data.overWeightCount > 0) { - for(uint256 j = 0; j < idxCount; j++) { - if(!data.isOverWeight[_indices[j]]) return (false, "Must redeem overweight bAssets", false); - } - applySwapFee = false; - } - // Since no bAssets were overweight before, if one becomes overweight, throw - if(atLeastOneBecameOverweight) return (false, "bAssets must remain below max weight", false); - - return (true, "", applySwapFee); - } - - /** - * @notice Calculates the relative quantities of bAssets to redeem, with current basket state - * @dev Sum the value of the bAssets, and then find the proportions relative to the desired - * mAsset quantity. - * @param _mAssetQuantity Quantity of mAsset to redeem - * @param _allBassets Array of all bAsset information - * @return isValid Bool to signify that the redemption is allowed - * @return reason If the redemption is invalid, this is the reason - * @return quantities Array of bAsset quantities to redeem - */ - function calculateRedemptionMulti( - uint256 _mAssetQuantity, - Basset[] calldata _allBassets - ) - external - pure - returns (bool, string memory, uint256[] memory) - { - // e.g. mAsset = 1e20 (100) - // e.g. bAsset: [ A, B, C, D] - // e.g. vaults: [ 80, 60, 60, 0] - // e.g. ratio: [1e12, 1e8, 1e20, 1e18] - // expectedM: 4e19 3e19 3e19 0 - // expectedB: 4e15 3e19 3e7 0 - uint256 len = _allBassets.length; - uint256[] memory redeemQuantities = new uint256[](len); - uint256[] memory ratioedBassetVaults = new uint256[](len); - uint256 totalBassetVault = 0; - // 1. Add up total vault & ratioedBassets, fail if blacklisted - for(uint256 i = 0; i < len; i++) { - if(_allBassets[i].status == BassetStatus.Blacklisted) { - return (false, "Basket contains blacklisted bAsset", redeemQuantities); - } else if(_allBassets[i].status == BassetStatus.Liquidating) { - return (false, "Basket contains liquidating bAsset", redeemQuantities); - } - // e.g. (80e14 * 1e12) / 1e8 = 80e18 - // e.g. (60e18 * 1e8) / 1e8 = 60e18 - uint256 ratioedBasset = _allBassets[i].vaultBalance.mulRatioTruncate(_allBassets[i].ratio); - ratioedBassetVaults[i] = ratioedBasset; - totalBassetVault = totalBassetVault.add(ratioedBasset); - } - if(totalBassetVault == 0) return (false, "Nothing in the basket to redeem", redeemQuantities); - if(_mAssetQuantity > totalBassetVault) return (false, "Not enough liquidity", redeemQuantities); - // 2. Calculate proportional weighting & non-ratioed amount - for(uint256 i = 0; i < len; i++) { - // proportional weighting - // e.g. (8e19 * 1e18) / 2e20 = 8e37 / 2e20 = 4e17 (40%) - uint256 percentageOfVault = ratioedBassetVaults[i].divPrecisely(totalBassetVault); - // e.g. (1e20 * 4e17) / 1e18 = 4e37 / 1e18 = 4e19 (40) - uint256 ratioedProportionalBasset = _mAssetQuantity.mulTruncate(percentageOfVault); - // convert back to bAsset amount - // e.g. (4e19 * 1e8) / 1e12 = 4e27 / 1e12 = 4e15 - redeemQuantities[i] = ratioedProportionalBasset.divRatioPrecisely(_allBassets[i].ratio); - } - // 3. Return - return (true, "", redeemQuantities); - } - - /*************************************** - HELPERS - ****************************************/ - - struct BasketStateResponse { - bool isValid; - string reason; - bool atLeastOneBroken; - uint256 overWeightCount; - bool[] isOverWeight; - uint256[] ratioedBassetVaults; - } - - /** - * @dev Gets the currently overweight bAssets, and capitalises on the for loop to - * produce some other useful data. Loops through, validating the bAsset, and determining - * if it is overweight, returning the ratioed bAsset. - * @param _total Sum of collateral units in the basket - * @param _bAssets Array of all bAsset information - * @return response Struct containing calculated data - */ - function _getBasketState(uint256 _total, Basset[] memory _bAssets) - private - pure - returns (BasketStateResponse memory response) - { - uint256 len = _bAssets.length; - response = BasketStateResponse({ - isValid: true, - reason: "", - atLeastOneBroken: false, - overWeightCount: 0, - isOverWeight: new bool[](len), - ratioedBassetVaults: new uint256[](len) - }); - - for(uint256 i = 0; i < len; i++) { - BassetStatus status = _bAssets[i].status; - if(status == BassetStatus.Blacklisted) { - response.isValid = false; - response.reason = "Basket contains blacklisted bAsset"; - return response; - } else if( - status == BassetStatus.Liquidating || - status == BassetStatus.BrokenBelowPeg || - status == BassetStatus.BrokenAbovePeg - ) { - response.atLeastOneBroken = true; - } - - uint256 ratioedBasset = _bAssets[i].vaultBalance.mulRatioTruncate(_bAssets[i].ratio); - response.ratioedBassetVaults[i] = ratioedBasset; - uint256 maxWeightInUnits = _total.mulTruncate(_bAssets[i].maxWeight); - - bool bAssetOverWeight = ratioedBasset > maxWeightInUnits; - if(bAssetOverWeight){ - response.isOverWeight[i] = true; - response.overWeightCount += 1; - } - } - } - - /** - * @dev After the redeemed bAssets have been removed from the basket, determine - * if there are any resulting overweight, or underweight - * @param _newTotal Sum of collateral units in the basket - * @param _bAssets Array of all bAsset information - * @param _ratioedBassetVaultsAfter Array of all new bAsset vaults - * @param _previouslyOverWeight Array of bools - was this bAsset already overweight - * @return underWeight Array of bools - is this bAsset now under min weight - */ - function _getOverweightBassetsAfter( - uint256 _newTotal, - Basset[] memory _bAssets, - uint256[] memory _ratioedBassetVaultsAfter, - bool[] memory _previouslyOverWeight - ) - private - pure - returns (bool atLeastOneBecameOverweight) - { - uint256 len = _ratioedBassetVaultsAfter.length; - - for(uint256 i = 0; i < len; i++) { - uint256 maxWeightInUnits = _newTotal.mulTruncate(_bAssets[i].maxWeight); - - bool isOverweight = _ratioedBassetVaultsAfter[i] > maxWeightInUnits; - // If it was not previously overweight, and now it, then it became overweight - bool becameOverweight = !_previouslyOverWeight[i] && isOverweight; - atLeastOneBecameOverweight = atLeastOneBecameOverweight || becameOverweight; - } - } -} diff --git a/contracts/masset/forge-validator/IForgeValidator.sol b/contracts/masset/forge-validator/IForgeValidator.sol deleted file mode 100644 index 0e770803..00000000 --- a/contracts/masset/forge-validator/IForgeValidator.sol +++ /dev/null @@ -1,29 +0,0 @@ -pragma solidity 0.5.16; -pragma experimental ABIEncoderV2; - -import { MassetStructs } from "../shared/MassetStructs.sol"; - -/** - * @title IForgeValidator - * @author Stability Labs Pty. Ltd. - * @notice Calculates whether or not minting or redemption is valid, based - * on how it affects the underlying basket collateral weightings - * @dev Abstract ForgeValidator contract for interacting with the Forge Validator implementation - */ -contract IForgeValidator is MassetStructs { - function validateMint(uint256 _totalVault, Basset calldata _basset, uint256 _bAssetQuantity) - external pure returns (bool, string memory); - function validateMintMulti(uint256 _totalVault, Basset[] calldata _bassets, uint256[] calldata _bAssetQuantities) - external pure returns (bool, string memory); - function validateSwap(uint256 _totalVault, Basset calldata _inputBasset, Basset calldata _outputBasset, uint256 _quantity) - external pure returns (bool, string memory, uint256, bool); - function validateRedemption( - bool basketIsFailed, - uint256 _totalVault, - Basset[] calldata _allBassets, - uint8[] calldata _indices, - uint256[] calldata _bassetQuantities) external pure returns (bool, string memory, bool); - function calculateRedemptionMulti( - uint256 _mAssetQuantity, - Basset[] calldata _allBassets) external pure returns (bool, string memory, uint256[] memory); -} diff --git a/contracts/masset/liquidator/ICurveMetaPool.sol b/contracts/masset/liquidator/ICurveMetaPool.sol deleted file mode 100644 index 5d040995..00000000 --- a/contracts/masset/liquidator/ICurveMetaPool.sol +++ /dev/null @@ -1,5 +0,0 @@ -pragma solidity 0.5.16; - -interface ICurveMetaPool { - function exchange_underlying(int128 i, int128 j, uint256 dx, uint256 min_dy) external returns (uint256); -} diff --git a/contracts/masset/liquidator/ILiquidator.sol b/contracts/masset/liquidator/ILiquidator.sol deleted file mode 100644 index d6504450..00000000 --- a/contracts/masset/liquidator/ILiquidator.sol +++ /dev/null @@ -1,30 +0,0 @@ -pragma solidity 0.5.16; - - -contract ILiquidator { - - function createLiquidation( - address _integration, - address _sellToken, - address _bAsset, - int128 _curvePosition, - address[] calldata _uniswapPath, - uint256 _trancheAmount, - uint256 _minReturn - ) - external; - - function updateBasset( - address _integration, - address _bAsset, - int128 _curvePosition, - address[] calldata _uniswapPath, - uint256 _trancheAmount, - uint256 _minReturn - ) - external; - - function deleteLiquidation(address _integration) external; - - function triggerLiquidation(address _integration) external; -} \ No newline at end of file diff --git a/contracts/masset/liquidator/IUniswapV2Router02.sol b/contracts/masset/liquidator/IUniswapV2Router02.sol deleted file mode 100644 index 4031664d..00000000 --- a/contracts/masset/liquidator/IUniswapV2Router02.sol +++ /dev/null @@ -1,12 +0,0 @@ -pragma solidity ^0.5.16; - -interface IUniswapV2Router02 { - function swapExactTokensForTokens( - uint amountIn, - uint amountOutMin, - address[] calldata path, - address to, - uint deadline - ) external returns (uint[] memory amounts); - function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts); -} diff --git a/contracts/masset/liquidator/Liquidator.sol b/contracts/masset/liquidator/Liquidator.sol deleted file mode 100644 index f1486d4d..00000000 --- a/contracts/masset/liquidator/Liquidator.sol +++ /dev/null @@ -1,290 +0,0 @@ -pragma solidity 0.5.16; - -import { ICurveMetaPool } from "./ICurveMetaPool.sol"; -import { IUniswapV2Router02 } from "./IUniswapV2Router02.sol"; -import { ISavingsManager } from "../../interfaces/ISavingsManager.sol"; - -import { Initializable } from "@openzeppelin/upgrades/contracts/Initializable.sol"; -import { InitializableModule } from "../../shared/InitializableModule.sol"; -import { ILiquidator } from "./ILiquidator.sol"; - -import { IBasicToken } from "../../shared/IBasicToken.sol"; -import { SafeMath } from "@openzeppelin/contracts/math/SafeMath.sol"; -import { SafeERC20 } from "@openzeppelin/contracts/token/ERC20/SafeERC20.sol"; -import { IERC20 } from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; - - -/** - * @title Liquidator - * @author Stability Labs Pty. Ltd. - * @notice The Liquidator allows rewards to be swapped for another token - * and returned to a calling contract - * @dev VERSION: 1.2 - * DATE: 2020-12-16 - */ -contract Liquidator is - ILiquidator, - Initializable, - InitializableModule -{ - using SafeMath for uint256; - using SafeERC20 for IERC20; - - event LiquidationModified(address indexed integration); - event LiquidationEnded(address indexed integration); - event Liquidated(address indexed sellToken, address mUSD, uint256 mUSDAmount, address buyToken); - - address public mUSD; - ICurveMetaPool public curve; - IUniswapV2Router02 public uniswap; - // Deprecated var, but kept around to mirror storage layout - uint256 private interval = 7 days; - - mapping(address => Liquidation) public liquidations; - mapping(address => uint256) public minReturn; - - struct Liquidation { - address sellToken; - - address bAsset; - int128 curvePosition; - address[] uniswapPath; - - uint256 lastTriggered; - uint256 trancheAmount; // The amount of bAsset units to buy each week, with token decimals - } - - function initialize( - address _nexus, - address _uniswap, - address _curve, - address _mUSD - ) - external - initializer - { - InitializableModule._initialize(_nexus); - - require(_uniswap != address(0), "Invalid uniswap address"); - uniswap = IUniswapV2Router02(_uniswap); - - require(_curve != address(0), "Invalid curve address"); - curve = ICurveMetaPool(_curve); - - require(_mUSD != address(0), "Invalid mUSD address"); - mUSD = _mUSD; - } - - /*************************************** - GOVERNANCE - ****************************************/ - - /** - * @dev Create a liquidation - * @param _integration The integration contract address from which to receive sellToken - * @param _sellToken Token harvested from the integration contract - * @param _bAsset The asset to buy on Uniswap - * @param _curvePosition Position of the bAsset in Curves MetaPool - * @param _uniswapPath The Uniswap path as an array of addresses e.g. [COMP, WETH, DAI] - * @param _trancheAmount The amount of bAsset units to buy in each weekly tranche - * @param _minReturn Minimum exact amount of bAsset to get for each (whole) sellToken unit - */ - function createLiquidation( - address _integration, - address _sellToken, - address _bAsset, - int128 _curvePosition, - address[] calldata _uniswapPath, - uint256 _trancheAmount, - uint256 _minReturn - ) - external - onlyGovernance - { - require(liquidations[_integration].sellToken == address(0), "Liquidation exists for this bAsset"); - - require( - _integration != address(0) && - _sellToken != address(0) && - _bAsset != address(0) && - _uniswapPath.length >= 2 && - _minReturn > 0, - "Invalid inputs" - ); - require(_validUniswapPath(_sellToken, _bAsset, _uniswapPath), "Invalid uniswap path"); - - liquidations[_integration] = Liquidation({ - sellToken: _sellToken, - bAsset: _bAsset, - curvePosition: _curvePosition, - uniswapPath: _uniswapPath, - lastTriggered: 0, - trancheAmount: _trancheAmount - }); - minReturn[_integration] = _minReturn; - - emit LiquidationModified(_integration); - } - - /** - * @dev Update a liquidation - * @param _integration The integration contract in question - * @param _bAsset New asset to buy on Uniswap - * @param _curvePosition Position of the bAsset in Curves MetaPool - * @param _uniswapPath The Uniswap path as an array of addresses e.g. [COMP, WETH, DAI] - * @param _trancheAmount The amount of bAsset units to buy in each weekly tranche - * @param _minReturn Minimum exact amount of bAsset to get for each (whole) sellToken unit - */ - function updateBasset( - address _integration, - address _bAsset, - int128 _curvePosition, - address[] calldata _uniswapPath, - uint256 _trancheAmount, - uint256 _minReturn - ) - external - onlyGovernance - { - Liquidation memory liquidation = liquidations[_integration]; - - address oldBasset = liquidation.bAsset; - require(oldBasset != address(0), "Liquidation does not exist"); - - require(_minReturn > 0, "Must set some minimum value"); - require(_bAsset != address(0), "Invalid bAsset"); - require(_validUniswapPath(liquidation.sellToken, _bAsset, _uniswapPath), "Invalid uniswap path"); - - liquidations[_integration].bAsset = _bAsset; - liquidations[_integration].curvePosition = _curvePosition; - liquidations[_integration].uniswapPath = _uniswapPath; - liquidations[_integration].trancheAmount = _trancheAmount; - minReturn[_integration] = _minReturn; - - emit LiquidationModified(_integration); - } - - /** - * @dev Validates a given uniswap path - valid if sellToken at position 0 and bAsset at end - * @param _sellToken Token harvested from the integration contract - * @param _bAsset New asset to buy on Uniswap - * @param _uniswapPath The Uniswap path as an array of addresses e.g. [COMP, WETH, DAI] - */ - function _validUniswapPath(address _sellToken, address _bAsset, address[] memory _uniswapPath) - internal - pure - returns (bool) - { - uint256 len = _uniswapPath.length; - return _sellToken == _uniswapPath[0] && _bAsset == _uniswapPath[len-1]; - } - - /** - * @dev Delete a liquidation - */ - function deleteLiquidation(address _integration) - external - onlyGovernance - { - Liquidation memory liquidation = liquidations[_integration]; - require(liquidation.bAsset != address(0), "Liquidation does not exist"); - - delete liquidations[_integration]; - delete minReturn[_integration]; - - emit LiquidationEnded(_integration); - } - - /*************************************** - LIQUIDATION - ****************************************/ - - /** - * @dev Triggers a liquidation, flow (once per week): - * - Sells $COMP for $USDC (or other) on Uniswap (up to trancheAmount) - * - Sell USDC for mUSD on Curve - * - Send to SavingsManager - * @param _integration Integration for which to trigger liquidation - */ - function triggerLiquidation(address _integration) - external - { - // solium-disable-next-line security/no-tx-origin - require(tx.origin == msg.sender, "Must be EOA"); - - Liquidation memory liquidation = liquidations[_integration]; - - address bAsset = liquidation.bAsset; - require(bAsset != address(0), "Liquidation does not exist"); - - require(block.timestamp > liquidation.lastTriggered.add(7 days), "Must wait for interval"); - liquidations[_integration].lastTriggered = block.timestamp; - - // Cache variables - address sellToken = liquidation.sellToken; - address[] memory uniswapPath = liquidation.uniswapPath; - - // 1. Transfer sellTokens from integration contract if there are some - // Assumes infinite approval - uint256 integrationBal = IERC20(sellToken).balanceOf(_integration); - if (integrationBal > 0) { - IERC20(sellToken).safeTransferFrom(_integration, address(this), integrationBal); - } - - // 2. Get the amount to sell based on the tranche amount we want to buy - // Check contract balance - uint256 sellTokenBal = IERC20(sellToken).balanceOf(address(this)); - require(sellTokenBal > 0, "No sell tokens to liquidate"); - require(liquidation.trancheAmount > 0, "Liquidation has been paused"); - // Calc amounts for max tranche - uint[] memory amountsIn = uniswap.getAmountsIn(liquidation.trancheAmount, uniswapPath); - uint256 sellAmount = amountsIn[0]; - - if (sellTokenBal < sellAmount) { - sellAmount = sellTokenBal; - } - - // 3. Make the swap - // 3.1 Approve Uniswap and make the swap - IERC20(sellToken).safeApprove(address(uniswap), 0); - IERC20(sellToken).safeApprove(address(uniswap), sellAmount); - // 3.2. Make the sale > https://uniswap.org/docs/v2/smart-contracts/router02/#swapexacttokensfortokens - - // min amount out = sellAmount * priceFloor / 1e18 - // e.g. 1e18 * 100e6 / 1e18 = 100e6 - // e.g. 30e8 * 100e6 / 1e8 = 3000e6 - // e.g. 30e18 * 100e18 / 1e18 = 3000e18 - uint256 sellTokenDec = IBasicToken(sellToken).decimals(); - uint256 minOut = sellAmount.mul(minReturn[_integration]).div(10 ** sellTokenDec); - require(minOut > 0, "Must have some price floor"); - uniswap.swapExactTokensForTokens( - sellAmount, - minOut, - uniswapPath, - address(this), - block.timestamp.add(1800) - ); - - // 3.3. Trade on Curve - uint256 purchased = _sellOnCrv(bAsset, liquidation.curvePosition); - - // 4.0. Send to SavingsManager - address savings = _savingsManager(); - IERC20(mUSD).safeApprove(savings, 0); - IERC20(mUSD).safeApprove(savings, purchased); - ISavingsManager(savings).depositLiquidation(mUSD, purchased); - - emit Liquidated(sellToken, mUSD, purchased, bAsset); - } - - function _sellOnCrv(address _bAsset, int128 _curvePosition) internal returns (uint256 purchased) { - uint256 bAssetBal = IERC20(_bAsset).balanceOf(address(this)); - - IERC20(_bAsset).safeApprove(address(curve), 0); - IERC20(_bAsset).safeApprove(address(curve), bAssetBal); - uint256 bAssetDec = IBasicToken(_bAsset).decimals(); - // e.g. 100e6 * 95e16 / 1e6 = 100e18 - uint256 minOutCrv = bAssetBal.mul(95e16).div(10 ** bAssetDec); - purchased = curve.exchange_underlying(_curvePosition, 0, bAssetBal, minOutCrv); - } -} \ No newline at end of file diff --git a/contracts/masset/peripheral/RenWrapper.sol b/contracts/masset/peripheral/RenWrapper.sol new file mode 100644 index 00000000..0071cbd8 --- /dev/null +++ b/contracts/masset/peripheral/RenWrapper.sol @@ -0,0 +1,82 @@ +// SPDX-License-Identifier: AGPL-3.0-or-later +pragma solidity 0.8.0; + +import { SafeERC20 } from "@openzeppelin/contracts-sol8/contracts/token/ERC20/SafeERC20.sol"; +import { IERC20 } from "@openzeppelin/contracts-sol8/contracts/token/ERC20/IERC20.sol"; + +interface IGateway { + function mint( + bytes32 _pHash, + uint256 _amount, + bytes32 _nHash, + bytes calldata _sig + ) external returns (uint256); + + function burn(bytes calldata _to, uint256 _amount) external returns (uint256); +} + +interface IGatewayRegistry { + function getGatewayBySymbol(string calldata _tokenSymbol) external view returns (IGateway); + + function getTokenBySymbol(string calldata _tokenSymbol) external view returns (IERC20); +} + +contract RenWrapper { + using SafeERC20 for IERC20; + + address public immutable mAsset; + address public immutable gatewayRegistry; + + event Minted( + address indexed minter, + address recipient, + uint256 mAssetQuantity, + address input, + uint256 inputQuantity + ); + + constructor(address _mAsset, address _gatewayRegistry) public { + require(_mAsset != address(0), "Invalid mAsset address"); + mAsset = _mAsset; + require(_gatewayRegistry != address(0), "Invalid gateway registry address"); + gatewayRegistry = _gatewayRegistry; + + IGatewayRegistry(_gatewayRegistry).getTokenBySymbol("BTC").safeApprove( + _mAsset, + type(uint256).max + ); + } + + function depositAndMint( + address _recipient, + uint256 _minOutputAmount, + uint256 _amount, + bytes32 _nHash, + bytes calldata _sig + ) external { + bytes32 pHash = keccak256(abi.encode(_recipient, _minOutputAmount)); + + uint256 mintedAmount = + IGatewayRegistry(gatewayRegistry).getGatewayBySymbol("BTC").mint( + pHash, + _amount, + _nHash, + _sig + ); + + require(mintedAmount > _minOutputAmount, "Minted asset must be > min output"); + + _mint(mintedAmount, _minOutputAmount, _recipient); + } + + function _mint( + uint256 _amount, + uint256 _minOutputAmount, + address _recipient + ) internal { + address asset = address(IGatewayRegistry(gatewayRegistry).getTokenBySymbol("BTC")); + + // Fake "mint" + emit Minted(msg.sender, _recipient, _minOutputAmount, asset, _amount); + } +} \ No newline at end of file diff --git a/contracts/masset/platform-integrations/AaveIntegration.sol b/contracts/masset/platform-integrations/AaveIntegration.sol deleted file mode 100644 index cb8e587a..00000000 --- a/contracts/masset/platform-integrations/AaveIntegration.sol +++ /dev/null @@ -1,273 +0,0 @@ -pragma solidity 0.5.16; - -import { IAaveATokenV1, IAaveLendingPoolV1, ILendingPoolAddressesProviderV1 } from "./IAave.sol"; -import { InitializableAbstractIntegration, MassetHelpers, IERC20 } from "./InitializableAbstractIntegration.sol"; - - -/** - * @title AaveIntegration - * @author Stability Labs Pty. Ltd. - * @notice A simple connection to deposit and withdraw bAssets from Aave - * @dev VERSION: 1.2 - * DATE: 2020-12-24 - */ -contract AaveIntegration is InitializableAbstractIntegration { - - /*************************************** - CORE - ****************************************/ - - /** - * @dev Deposit a quantity of bAsset into the platform. Credited aTokens - * remain here in the vault. Can only be called by whitelisted addresses - * (mAsset and corresponding BasketManager) - * @param _bAsset Address for the bAsset - * @param _amount Units of bAsset to deposit - * @param _hasTxFee Is the bAsset known to have a tx fee? - * @return quantityDeposited Quantity of bAsset that entered the platform - */ - function deposit( - address _bAsset, - uint256 _amount, - bool _hasTxFee - ) - external - onlyWhitelisted - nonReentrant - returns (uint256 quantityDeposited) - { - require(_amount > 0, "Must deposit something"); - // Get the Target token - IAaveATokenV1 aToken = _getATokenFor(_bAsset); - - quantityDeposited = _amount; - - uint16 referralCode = 36; // temp code - - if(_hasTxFee) { - // If we charge a fee, account for it - uint256 prevBal = _checkBalance(aToken); - _getLendingPool().deposit(_bAsset, _amount, referralCode); - uint256 newBal = _checkBalance(aToken); - quantityDeposited = _min(quantityDeposited, newBal.sub(prevBal)); - } else { - // aTokens are 1:1 for each asset - _getLendingPool().deposit(_bAsset, _amount, referralCode); - } - - emit Deposit(_bAsset, address(aToken), quantityDeposited); - } - - /** - * @dev Withdraw a quantity of bAsset from the platform - * @param _receiver Address to which the bAsset should be sent - * @param _bAsset Address of the bAsset - * @param _amount Units of bAsset to send to recipient - * @param _hasTxFee Is the bAsset known to have a tx fee? - */ - function withdraw( - address _receiver, - address _bAsset, - uint256 _amount, - bool _hasTxFee - ) - external - onlyWhitelisted - nonReentrant - { - _withdraw(_receiver, _bAsset, _amount, _amount, _hasTxFee); - } - - /** - * @dev Withdraw a quantity of bAsset from the platform - * @param _receiver Address to which the bAsset should be sent - * @param _bAsset Address of the bAsset - * @param _amount Units of bAsset to send to recipient - * @param _totalAmount Total units to pull from lending platform - * @param _hasTxFee Is the bAsset known to have a tx fee? - */ - function withdraw( - address _receiver, - address _bAsset, - uint256 _amount, - uint256 _totalAmount, - bool _hasTxFee - ) - external - onlyWhitelisted - nonReentrant - { - _withdraw(_receiver, _bAsset, _amount, _totalAmount, _hasTxFee); - } - - function _withdraw( - address _receiver, - address _bAsset, - uint256 _amount, - uint256 _totalAmount, - bool _hasTxFee - ) - internal - { - require(_totalAmount > 0, "Must withdraw something"); - // Get the Target token - IAaveATokenV1 aToken = _getATokenFor(_bAsset); - - uint256 userWithdrawal = _amount; - - // Don't need to Approve aToken, as it gets burned in redeem() - if(_hasTxFee) { - require(_amount == _totalAmount, "Cache inactive for assets with fee"); - IERC20 b = IERC20(_bAsset); - uint256 prevBal = b.balanceOf(address(this)); - aToken.redeem(_amount); - uint256 newBal = b.balanceOf(address(this)); - userWithdrawal = _min(userWithdrawal, newBal.sub(prevBal)); - } else { - aToken.redeem(_totalAmount); - } - - // Send redeemed bAsset to the receiver - IERC20(_bAsset).safeTransfer(_receiver, userWithdrawal); - - emit PlatformWithdrawal(_bAsset, address(aToken), _totalAmount, userWithdrawal); - } - - /** - * @dev Withdraw a quantity of bAsset from the cache. - * @param _receiver Address to which the bAsset should be sent - * @param _bAsset Address of the bAsset - * @param _amount Units of bAsset to withdraw - */ - function withdrawRaw( - address _receiver, - address _bAsset, - uint256 _amount - ) - external - onlyWhitelisted - nonReentrant - { - require(_amount > 0, "Must withdraw something"); - require(_receiver != address(0), "Must specify recipient"); - - // Send redeemed bAsset to the receiver - IERC20(_bAsset).safeTransfer(_receiver, _amount); - - emit Withdrawal(_bAsset, address(0), _amount); - } - - /** - * @dev Get the total bAsset value held in the platform - * This includes any interest that was generated since depositing - * Aave gradually increases the balances of all aToken holders, as the interest grows - * @param _bAsset Address of the bAsset - * @return balance Total value of the bAsset in the platform - */ - function checkBalance(address _bAsset) - external - returns (uint256 balance) - { - // balance is always with token aToken decimals - IAaveATokenV1 aToken = _getATokenFor(_bAsset); - return _checkBalance(aToken); - } - - /*************************************** - APPROVALS - ****************************************/ - - /** - * @dev Re-approve the spending of all bAssets by the Aave lending pool core, - * if for some reason is it necessary for example if the address of core changes. - * Only callable through Governance. - */ - function reApproveAllTokens() - external - onlyGovernor - { - uint256 bAssetCount = bAssetsMapped.length; - address lendingPoolVault = _getLendingPoolCore(); - // approve the pool to spend the bAsset - for(uint i = 0; i < bAssetCount; i++){ - MassetHelpers.safeInfiniteApprove(bAssetsMapped[i], lendingPoolVault); - } - } - - /** - * @dev Internal method to respond to the addition of new bAsset / pTokens - * We need to approve the Aave lending pool core conrtact and give it permission - * to spend the bAsset - * @param _bAsset Address of the bAsset to approve - */ - function _abstractSetPToken(address _bAsset, address /*_pToken*/) - internal - { - address lendingPoolVault = _getLendingPoolCore(); - // approve the pool to spend the bAsset - MassetHelpers.safeInfiniteApprove(_bAsset, lendingPoolVault); - } - - /*************************************** - HELPERS - ****************************************/ - - /** - * @dev Get the current address of the Aave lending pool, which is the gateway to - * depositing. - * @return Current lending pool implementation - */ - function _getLendingPool() - internal - view - returns (IAaveLendingPoolV1) - { - address lendingPool = ILendingPoolAddressesProviderV1(platformAddress).getLendingPool(); - require(lendingPool != address(0), "Lending pool does not exist"); - return IAaveLendingPoolV1(lendingPool); - } - - /** - * @dev Get the current address of the Aave lending pool core, which stores all the - * reserve tokens in its vault. - * @return Current lending pool core address - */ - function _getLendingPoolCore() - internal - view - returns (address payable) - { - address payable lendingPoolCore = ILendingPoolAddressesProviderV1(platformAddress).getLendingPoolCore(); - require(lendingPoolCore != address(uint160(address(0))), "Lending pool core does not exist"); - return lendingPoolCore; - } - - /** - * @dev Get the pToken wrapped in the IAaveATokenV1 interface for this bAsset, to use - * for withdrawing or balance checking. Fails if the pToken doesn't exist in our mappings. - * @param _bAsset Address of the bAsset - * @return aToken Corresponding to this bAsset - */ - function _getATokenFor(address _bAsset) - internal - view - returns (IAaveATokenV1) - { - address aToken = bAssetToPToken[_bAsset]; - require(aToken != address(0), "aToken does not exist"); - return IAaveATokenV1(aToken); - } - - /** - * @dev Get the total bAsset value held in the platform - * @param _aToken aToken for which to check balance - * @return balance Total value of the bAsset in the platform - */ - function _checkBalance(IAaveATokenV1 _aToken) - internal - view - returns (uint256 balance) - { - return _aToken.balanceOf(address(this)); - } -} \ No newline at end of file diff --git a/contracts/masset/platform-integrations/CompoundIntegration.sol b/contracts/masset/platform-integrations/CompoundIntegration.sol deleted file mode 100644 index 5ac2fe95..00000000 --- a/contracts/masset/platform-integrations/CompoundIntegration.sol +++ /dev/null @@ -1,300 +0,0 @@ -pragma solidity 0.5.16; - -import { ICERC20 } from "./ICompound.sol"; -import { InitializableAbstractIntegration, MassetHelpers, IERC20 } from "./InitializableAbstractIntegration.sol"; - - -/** - * @title CompoundIntegration - * @author Stability Labs Pty. Ltd. - * @notice A simple connection to deposit and withdraw bAssets from Compound - * @dev VERSION: 1.3 - * DATE: 2020-11-14 - */ -contract CompoundIntegration is InitializableAbstractIntegration { - - event SkippedWithdrawal(address bAsset, uint256 amount); - event RewardTokenApproved(address rewardToken, address account); - - /*************************************** - ADMIN - ****************************************/ - - /** - * @dev Approves Liquidator to spend reward tokens - */ - function approveRewardToken() - external - onlyGovernor - { - address liquidator = nexus.getModule(keccak256("Liquidator")); - require(liquidator != address(0), "Liquidator address cannot be zero"); - - // Official checksummed COMP token address - // https://ethplorer.io/address/0xc00e94cb662c3520282e6f5717214004a7f26888 - address compToken = address(0xc00e94Cb662C3520282E6f5717214004A7f26888); - - MassetHelpers.safeInfiniteApprove(compToken, liquidator); - - emit RewardTokenApproved(address(compToken), liquidator); - } - - /*************************************** - CORE - ****************************************/ - - /** - * @dev Deposit a quantity of bAsset into the platform. Credited cTokens - * remain here in the vault. Can only be called by whitelisted addresses - * (mAsset and corresponding BasketManager) - * @param _bAsset Address for the bAsset - * @param _amount Units of bAsset to deposit - * @param _hasTxFee Flag that signals if an xfer fee is charged on bAsset - * @return quantityDeposited Quantity of bAsset that entered the platform - */ - function deposit( - address _bAsset, - uint256 _amount, - bool _hasTxFee - ) - external - onlyWhitelisted - nonReentrant - returns (uint256 quantityDeposited) - { - require(_amount > 0, "Must deposit something"); - - // Get the Target token - ICERC20 cToken = _getCTokenFor(_bAsset); - - quantityDeposited = _amount; - - if(_hasTxFee) { - // If we charge a fee, account for it - uint256 prevBal = _checkBalance(cToken); - require(cToken.mint(_amount) == 0, "cToken mint failed"); - uint256 newBal = _checkBalance(cToken); - quantityDeposited = _min(quantityDeposited, newBal.sub(prevBal)); - } else { - // Else just execute the mint - require(cToken.mint(_amount) == 0, "cToken mint failed"); - } - - emit Deposit(_bAsset, address(cToken), quantityDeposited); - } - - - /** - * @dev Withdraw a quantity of bAsset from Compound - * @param _receiver Address to which the withdrawn bAsset should be sent - * @param _bAsset Address of the bAsset - * @param _amount Units of bAsset to withdraw - * @param _hasTxFee Is the bAsset known to have a tx fee? - */ - function withdraw( - address _receiver, - address _bAsset, - uint256 _amount, - bool _hasTxFee - ) - external - onlyWhitelisted - nonReentrant - { - _withdraw(_receiver, _bAsset, _amount, _amount, _hasTxFee); - } - - /** - * @dev Withdraw a quantity of bAsset from Compound - * @param _receiver Address to which the withdrawn bAsset should be sent - * @param _bAsset Address of the bAsset - * @param _amount Units of bAsset to withdraw - * @param _totalAmount Total units to pull from lending platform - * @param _hasTxFee Is the bAsset known to have a tx fee? - */ - function withdraw( - address _receiver, - address _bAsset, - uint256 _amount, - uint256 _totalAmount, - bool _hasTxFee - ) - external - onlyWhitelisted - nonReentrant - { - _withdraw(_receiver, _bAsset, _amount, _totalAmount, _hasTxFee); - } - - function _withdraw( - address _receiver, - address _bAsset, - uint256 _amount, - uint256 _totalAmount, - bool _hasTxFee - ) - internal - { - require(_totalAmount > 0, "Must withdraw something"); - require(_receiver != address(0), "Must specify recipient"); - - // Get the Target token - ICERC20 cToken = _getCTokenFor(_bAsset); - - // If redeeming 0 cTokens, just skip, else COMP will revert - // Reason for skipping: to ensure that redeemMasset is always able to execute - uint256 cTokensToRedeem = _convertUnderlyingToCToken(cToken, _totalAmount); - if(cTokensToRedeem == 0) { - emit SkippedWithdrawal(_bAsset, _totalAmount); - return; - } - - uint256 userWithdrawal = _amount; - - if(_hasTxFee) { - require(_amount == _totalAmount, "Cache inactive for assets with fee"); - IERC20 b = IERC20(_bAsset); - uint256 prevBal = b.balanceOf(address(this)); - require(cToken.redeemUnderlying(_amount) == 0, "redeem failed"); - uint256 newBal = b.balanceOf(address(this)); - userWithdrawal = _min(userWithdrawal, newBal.sub(prevBal)); - } else { - // Redeem Underlying bAsset amount - require(cToken.redeemUnderlying(_totalAmount) == 0, "redeem failed"); - } - - // Send redeemed bAsset to the receiver - IERC20(_bAsset).safeTransfer(_receiver, userWithdrawal); - - emit PlatformWithdrawal(_bAsset, address(cToken), _totalAmount, _amount); - } - - - /** - * @dev Withdraw a quantity of bAsset from the cache. - * @param _receiver Address to which the bAsset should be sent - * @param _bAsset Address of the bAsset - * @param _amount Units of bAsset to withdraw - */ - function withdrawRaw( - address _receiver, - address _bAsset, - uint256 _amount - ) - external - onlyWhitelisted - nonReentrant - { - require(_amount > 0, "Must withdraw something"); - require(_receiver != address(0), "Must specify recipient"); - - IERC20(_bAsset).safeTransfer(_receiver, _amount); - - emit Withdrawal(_bAsset, address(0), _amount); - } - - /** - * @dev Get the total bAsset value held in the platform - * This includes any interest that was generated since depositing - * Compound exchange rate between the cToken and bAsset gradually increases, - * causing the cToken to be worth more corresponding bAsset. - * @param _bAsset Address of the bAsset - * @return balance Total value of the bAsset in the platform - */ - function checkBalance(address _bAsset) - external - returns (uint256 balance) - { - // balance is always with token cToken decimals - ICERC20 cToken = _getCTokenFor(_bAsset); - balance = _checkBalance(cToken); - } - - /*************************************** - APPROVALS - ****************************************/ - - /** - * @dev Re-approve the spending of all bAssets by their corresponding cToken, - * if for some reason is it necessary. Only callable through Governance. - */ - function reApproveAllTokens() - external - onlyGovernor - { - uint256 bAssetCount = bAssetsMapped.length; - for(uint i = 0; i < bAssetCount; i++){ - address bAsset = bAssetsMapped[i]; - address cToken = bAssetToPToken[bAsset]; - MassetHelpers.safeInfiniteApprove(bAsset, cToken); - } - } - - /** - * @dev Internal method to respond to the addition of new bAsset / cTokens - * We need to approve the cToken and give it permission to spend the bAsset - * @param _bAsset Address of the bAsset to approve - * @param _cToken This cToken has the approval approval - */ - function _abstractSetPToken(address _bAsset, address _cToken) - internal - { - // approve the pool to spend the bAsset - MassetHelpers.safeInfiniteApprove(_bAsset, _cToken); - } - - /*************************************** - HELPERS - ****************************************/ - - /** - * @dev Get the cToken wrapped in the ICERC20 interface for this bAsset. - * Fails if the pToken doesn't exist in our mappings. - * @param _bAsset Address of the bAsset - * @return Corresponding cToken to this bAsset - */ - function _getCTokenFor(address _bAsset) - internal - view - returns (ICERC20) - { - address cToken = bAssetToPToken[_bAsset]; - require(cToken != address(0), "cToken does not exist"); - return ICERC20(cToken); - } - - /** - * @dev Get the total bAsset value held in the platform - * underlying = (cTokenAmt * exchangeRate) / 1e18 - * @param _cToken cToken for which to check balance - * @return balance Total value of the bAsset in the platform - */ - function _checkBalance(ICERC20 _cToken) - internal - view - returns (uint256 balance) - { - uint256 cTokenBalance = _cToken.balanceOf(address(this)); - uint256 exchangeRate = _cToken.exchangeRateStored(); - // e.g. 50e8*205316390724364402565641705 / 1e18 = 1.0265..e18 - balance = cTokenBalance.mul(exchangeRate).div(1e18); - } - - /** - * @dev Converts an underlying amount into cToken amount - * cTokenAmt = (underlying * 1e18) / exchangeRate - * @param _cToken cToken for which to change - * @param _underlying Amount of underlying to convert - * @return amount Equivalent amount of cTokens - */ - function _convertUnderlyingToCToken(ICERC20 _cToken, uint256 _underlying) - internal - view - returns (uint256 amount) - { - uint256 exchangeRate = _cToken.exchangeRateStored(); - // e.g. 1e18*1e18 / 205316390724364402565641705 = 50e8 - // e.g. 1e8*1e18 / 205316390724364402565641705 = 0.45 or 0 - amount = _underlying.mul(1e18).div(exchangeRate); - } -} diff --git a/contracts/masset/platform-integrations/IAave.sol b/contracts/masset/platform-integrations/IAave.sol deleted file mode 100644 index 40e16174..00000000 --- a/contracts/masset/platform-integrations/IAave.sol +++ /dev/null @@ -1,114 +0,0 @@ -pragma solidity 0.5.16; - -/** - * @dev Interface for Aaves A Token - * Documentation: https://developers.aave.com/#atokens - */ -interface IAaveATokenV1 { - - /** - * @notice Non-standard ERC20 function to redeem an _amount of aTokens for the underlying - * asset, burning the aTokens during the process. - * @param _amount Amount of aTokens - */ - function redeem(uint256 _amount) external; - - /** - * @notice returns the current total aToken balance of _user all interest collected included. - * To obtain the user asset principal balance with interests excluded , ERC20 non-standard - * method principalBalanceOf() can be used. - */ - function balanceOf(address _user) external view returns(uint256); -} - -/** - * @dev Interface for Aaves Lending Pool - * Documentation: https://developers.aave.com/#lendingpool - */ -interface IAaveLendingPoolV1 { - - /** - * @notice Deposits a certain _amount of an asset specified by the _reserve parameter. - * @dev The caller receives a certain amount of corresponding aTokens in exchange. - * The amount of aTokens received depends on the corresponding aToken exchange rate. - * LendingPoolCore must be approved to spend this reserve - */ - function deposit(address _reserve, uint256 _amount, uint16 _referralCode) external; - -} -/** - * @dev Interface for Aaves Lending Pool - * Documentation: https://developers.aave.com/#lendingpooladdressesprovider - */ -interface ILendingPoolAddressesProviderV1 { - - /** - * @notice Get the current address for Aave LendingPool - * @dev Lending pool is the core contract on which to call deposit - */ - function getLendingPool() external view returns (address); - - /** - * @notice Get the address for lendingPoolCore - * @dev IMPORTANT - this is where _reserve must be approved before deposit - */ - function getLendingPoolCore() external view returns (address payable); - -} - -/** - * @dev Interface for Aaves Lending Pool - * Documentation: https://developers.aave.com/#lendingpooladdressesprovider - */ -interface ILendingPoolAddressesProviderV2 { - - /** - * @notice Get the current address for Aave LendingPool - * @dev Lending pool is the core contract on which to call deposit - */ - function getLendingPool() external view returns (address); -} - -/** - * @dev Interface for Aaves A Token - * Documentation: https://developers.aave.com/#atokens - */ -interface IAaveATokenV2 { - - /** - * @notice returns the current total aToken balance of _user all interest collected included. - * To obtain the user asset principal balance with interests excluded , ERC20 non-standard - * method principalBalanceOf() can be used. - */ - function balanceOf(address _user) external view returns(uint256); -} - - -interface IAaveLendingPoolV2 { - - /** - * @dev deposits The underlying asset into the reserve. A corresponding amount of the overlying asset (aTokens) - * is minted. - * @param reserve the address of the reserve - * @param amount the amount to be deposited - * @param referralCode integrators are assigned a referral code and can potentially receive rewards. - **/ - function deposit( - address reserve, - uint256 amount, - address onBehalfOf, - uint16 referralCode - ) external; - - /** - * @dev withdraws the assets of user. - * @param reserve the address of the reserve - * @param amount the underlying amount to be redeemed - * @param to address that will receive the underlying - **/ - function withdraw( - address reserve, - uint256 amount, - address to - ) external; -} \ No newline at end of file diff --git a/contracts/masset/platform-integrations/ICompound.sol b/contracts/masset/platform-integrations/ICompound.sol deleted file mode 100644 index 27ababa0..00000000 --- a/contracts/masset/platform-integrations/ICompound.sol +++ /dev/null @@ -1,49 +0,0 @@ -pragma solidity 0.5.16; - -/** - * @dev Compound C Token interface - * Documentation: https://compound.finance/developers/ctokens - */ -interface ICERC20 { - - /** - * @notice The mint function transfers an asset into the protocol, which begins accumulating - * interest based on the current Supply Rate for the asset. The user receives a quantity of - * cTokens equal to the underlying tokens supplied, divided by the current Exchange Rate. - * @param mintAmount The amount of the asset to be supplied, in units of the underlying asset. - * @return 0 on success, otherwise an Error codes - */ - function mint(uint mintAmount) external returns (uint); - - /** - * @notice The redeem underlying function converts cTokens into a specified quantity of the underlying - * asset, and returns them to the user. The amount of cTokens redeemed is equal to the quantity of - * underlying tokens received, divided by the current Exchange Rate. The amount redeemed must be less - * than the user's Account Liquidity and the market's available liquidity. - * @param redeemAmount The amount of underlying to be redeemed. - * @return 0 on success, otherwise an Error codes - */ - function redeemUnderlying(uint redeemAmount) external returns (uint); - - /** - * @notice The user's underlying balance, representing their assets in the protocol, is equal to - * the user's cToken balance multiplied by the Exchange Rate. - * @param owner The account to get the underlying balance of. - * @return The amount of underlying currently owned by the account. - */ - function balanceOfUnderlying(address owner) external returns (uint); - - /** - * @notice Calculates the exchange rate from the underlying to the CToken - * @dev This function does not accrue interest before calculating the exchange rate - * @return Calculated exchange rate scaled by 1e18 - */ - function exchangeRateStored() external view returns (uint); - - /** - * @notice Get the token balance of the `owner` - * @param owner The address of the account to query - * @return The number of tokens owned by `owner` - */ - function balanceOf(address owner) external view returns (uint256); -} diff --git a/contracts/masset/platform-integrations/InitializableAbstractIntegration.sol b/contracts/masset/platform-integrations/InitializableAbstractIntegration.sol deleted file mode 100644 index d04429a0..00000000 --- a/contracts/masset/platform-integrations/InitializableAbstractIntegration.sol +++ /dev/null @@ -1,162 +0,0 @@ -pragma solidity 0.5.16; - -// Internal -import { IPlatformIntegration } from "../../interfaces/IPlatformIntegration.sol"; -import { InitializableGovernableWhitelist } from "../../governance/InitializableGovernableWhitelist.sol"; -import { Initializable } from "@openzeppelin/upgrades/contracts/Initializable.sol"; - -// Libs -import { MassetHelpers } from "../shared/MassetHelpers.sol"; -import { SafeERC20 } from "@openzeppelin/contracts/token/ERC20/SafeERC20.sol"; -import { IERC20 } from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; -import { SafeMath } from "@openzeppelin/contracts/math/SafeMath.sol"; -import { InitializableReentrancyGuard } from "../../shared/InitializableReentrancyGuard.sol"; - -/** - * @title AbstractIntegration - * @author Stability Labs Pty. Ltd. - * @notice A generalised platform integration contract from which to inherit - * @dev Contains functionality for managing access to a specific lending - * platform. pTokens are the generic name given to platform tokens e.g. cDai - * Governance are responsible for setting platform and pToken addresses. - */ -contract InitializableAbstractIntegration is - Initializable, - IPlatformIntegration, - InitializableGovernableWhitelist, - InitializableReentrancyGuard -{ - - using SafeERC20 for IERC20; - using SafeMath for uint256; - - event PTokenAdded(address indexed _bAsset, address _pToken); - - event Deposit(address indexed _bAsset, address _pToken, uint256 _amount); - event Withdrawal(address indexed _bAsset, address _pToken, uint256 _amount); - event PlatformWithdrawal(address indexed bAsset, address pToken, uint256 totalAmount, uint256 userAmount); - - // Core address for the given platform */ - address public platformAddress; - - // bAsset => pToken (Platform Specific Token Address) - mapping(address => address) public bAssetToPToken; - // Full list of all bAssets supported here - address[] internal bAssetsMapped; - - /** - * @dev Initialization function for upgradable proxy contract. - * This function should be called via Proxy just after contract deployment. - * @param _nexus Address of the Nexus - * @param _whitelisted Whitelisted addresses for vault access - * @param _platformAddress Generic platform address - * @param _bAssets Addresses of initial supported bAssets - * @param _pTokens Platform Token corresponding addresses - */ - function initialize( - address _nexus, - address[] calldata _whitelisted, - address _platformAddress, - address[] calldata _bAssets, - address[] calldata _pTokens - ) - external - initializer - { - InitializableReentrancyGuard._initialize(); - InitializableGovernableWhitelist._initialize(_nexus, _whitelisted); - InitializableAbstractIntegration._initialize(_platformAddress, _bAssets, _pTokens); - } - - /** - * @dev Internal initialize function, to set up initial internal state - * @param _platformAddress Generic platform address - * @param _bAssets Addresses of initial supported bAssets - * @param _pTokens Platform Token corresponding addresses - */ - function _initialize( - address _platformAddress, - address[] memory _bAssets, - address[] memory _pTokens - ) - internal - { - platformAddress = _platformAddress; - - uint256 bAssetCount = _bAssets.length; - require(bAssetCount == _pTokens.length, "Invalid input arrays"); - for(uint256 i = 0; i < bAssetCount; i++){ - _setPTokenAddress(_bAssets[i], _pTokens[i]); - } - } - - /*************************************** - CONFIG - ****************************************/ - - /** - * @dev Provide support for bAsset by passing its pToken address. - * This method can only be called by the system Governor - * @param _bAsset Address for the bAsset - * @param _pToken Address for the corresponding platform token - */ - function setPTokenAddress(address _bAsset, address _pToken) - external - onlyGovernor - { - _setPTokenAddress(_bAsset, _pToken); - } - - /** - * @dev Provide support for bAsset by passing its pToken address. - * Add to internal mappings and execute the platform specific, - * abstract method `_abstractSetPToken` - * @param _bAsset Address for the bAsset - * @param _pToken Address for the corresponding platform token - */ - function _setPTokenAddress(address _bAsset, address _pToken) - internal - { - require(bAssetToPToken[_bAsset] == address(0), "pToken already set"); - require(_bAsset != address(0) && _pToken != address(0), "Invalid addresses"); - - bAssetToPToken[_bAsset] = _pToken; - bAssetsMapped.push(_bAsset); - - emit PTokenAdded(_bAsset, _pToken); - - _abstractSetPToken(_bAsset, _pToken); - } - - function _abstractSetPToken(address _bAsset, address _pToken) internal; - - function reApproveAllTokens() external; - - /*************************************** - ABSTRACT - ****************************************/ - - function deposit(address _bAsset, uint256 _amount, bool _hasTxFee) - external returns (uint256 quantityDeposited); - - function withdraw(address _receiver, address _bAsset, uint256 _amount, bool _hasTxFee) external; - - function withdraw(address _receiver, address _bAsset, uint256 _amount, uint256 _totalAmount, bool _hasTxFee) external; - - function checkBalance(address _bAsset) external returns (uint256 balance); - - /*************************************** - HELPERS - ****************************************/ - - /** - * @dev Simple helper func to get the min of two values - */ - function _min(uint256 x, uint256 y) - internal - pure - returns (uint256) - { - return x > y ? y : x; - } -} \ No newline at end of file diff --git a/contracts/masset/shared/MStableHelper.sol b/contracts/masset/shared/MStableHelper.sol deleted file mode 100644 index 19e51ae2..00000000 --- a/contracts/masset/shared/MStableHelper.sol +++ /dev/null @@ -1,466 +0,0 @@ -pragma solidity 0.5.16; -pragma experimental ABIEncoderV2; - -import { IMasset } from "../../interfaces/IMasset.sol"; -import { IBasketManager } from "../../interfaces/IBasketManager.sol"; -import { IMStableHelper } from "../../interfaces/IMStableHelper.sol"; -import { ISavingsContract } from "../../interfaces/ISavingsContract.sol"; -import { IForgeValidator } from "../forge-validator/IForgeValidator.sol"; - -import { MassetStructs } from "./MassetStructs.sol"; -import { StableMath, SafeMath } from "../../shared/StableMath.sol"; - - -/** - * @title MStableHelper - * @author Stability Labs Pty. Ltd. - * @notice Returns the validity and output of a given redemption - * @dev VERSION: 1.0 - * DATE: 2020-06-18 - */ -contract MStableHelper is IMStableHelper, MassetStructs { - - using StableMath for uint256; - using SafeMath for uint256; - - - /*************************************** - MINT/SWAP/REDEEM - ****************************************/ - - /** - * @dev Returns a valid bAsset with which to mint - * @param _mAsset Masset addr - * @return valid bool - * @return string message - * @return address of bAsset to mint - */ - function suggestMintAsset( - address _mAsset - ) - external - view - returns ( - bool, - string memory, - address - ) - { - require(_mAsset != address(0), "Invalid mAsset"); - // Get the data - IBasketManager basketManager = IBasketManager( - IMasset(_mAsset).getBasketManager() - ); - Basket memory basket = basketManager.getBasket(); - uint256 totalSupply = IMasset(_mAsset).totalSupply(); - - // Calc the max weight delta (i.e is X% away from Max weight) - uint256 len = basket.bassets.length; - uint256[] memory maxWeightDelta = new uint256[](len); - for(uint256 i = 0; i < len; i++){ - Basset memory bAsset = basket.bassets[i]; - uint256 scaledBasset = bAsset.vaultBalance.mulRatioTruncate(bAsset.ratio); - // e.g. (1e21 * 1e18) / 1e23 = 1e16 or 1% - uint256 weight = scaledBasset.divPrecisely(totalSupply); - maxWeightDelta[i] = weight > bAsset.maxWeight ? 0 : bAsset.maxWeight.sub(weight); - if(bAsset.status != BassetStatus.Normal){ - return (false, "No assets available", address(0)); - } - } - // Ideal delta is the bAsset > 10 but closest - uint256 idealMaxWeight = 0; - address selected = address(0); - for(uint256 j = 0; j < len; j++){ - uint256 bAssetDelta = maxWeightDelta[j]; - if(bAssetDelta >= 1e17){ - if(selected == address(0) || bAssetDelta < idealMaxWeight){ - idealMaxWeight = bAssetDelta; - selected = basket.bassets[j].addr; - } - } - } - if(selected == address(0)){ - return (false, "No assets available", address(0)); - } - return (true, "", selected); - } - - - /** - * @dev Gets the maximum input for a valid swap pair - * @param _mAsset mAsset address (e.g. mUSD) - * @param _input Asset to input only bAssets accepted - * @param _output Either a bAsset or the mAsset - * @return valid - * @return validity reason - * @return max input units (in native decimals) - * @return how much output this input would produce (in native decimals, after any fee) - */ - function getMaxSwap( - address _mAsset, - address _input, - address _output - ) - external - view - returns ( - bool, - string memory, - uint256, - uint256 - ) - { - Data memory data = _getData(_mAsset, _input, _output); - if(!data.isValid) { - return (false, data.reason, 0, 0); - } - uint256 inputMaxWeightUnits = data.totalSupply.mulTruncate(data.input.maxWeight); - uint256 inputVaultBalanceScaled = data.input.vaultBalance.mulRatioTruncate( - data.input.ratio - ); - if (data.isMint) { - // M = ((t * maxW) - c)/(1-maxW) - // M = max mint (scaled) - // t = totalSupply before - // maxW = max weight % - // c = vault balance (scaled) - // num = (t * maxW) - c - // e.g. 1e22 - 1e21 = 9e21 - uint256 num = inputMaxWeightUnits.sub(inputVaultBalanceScaled); - // den = 1e18 - maxW - // e.g. 1e18 - 75e16 = 25e16 - uint256 den = StableMath.getFullScale().sub(data.input.maxWeight); - uint256 maxMintScaled = den > 0 ? num.divPrecisely(den) : num; - uint256 maxMint = maxMintScaled.divRatioPrecisely(data.input.ratio); - maxMintScaled = maxMint.mulRatioTruncate(data.input.ratio); - return (true, "", maxMint, maxMintScaled); - } else { - // get max input - uint256 maxInputScaled = inputMaxWeightUnits.sub(inputVaultBalanceScaled); - // get max output - uint256 outputMaxWeight = data.totalSupply.mulTruncate(data.output.maxWeight); - uint256 outputVaultBalanceScaled = data.output.vaultBalance.mulRatioTruncate(data.output.ratio); - // If maxInput = 2, outputVaultBalance = 1, then clamp to 1 - uint256 clampedMax = maxInputScaled > outputVaultBalanceScaled ? outputVaultBalanceScaled : maxInputScaled; - // if output is overweight, no fee, else fee - bool applyFee = outputVaultBalanceScaled < outputMaxWeight; - uint256 maxInputUnits = clampedMax.divRatioPrecisely(data.input.ratio); - uint256 outputUnitsIncFee = maxInputUnits.mulRatioTruncate(data.input.ratio).divRatioPrecisely(data.output.ratio); - - uint256 fee = applyFee ? data.mAsset.swapFee() : 0; - uint256 outputFee = outputUnitsIncFee.mulTruncate(fee); - return (true, "", maxInputUnits, outputUnitsIncFee.sub(outputFee)); - } - } - - /** - * @dev Returns a valid bAsset to redeem - * @param _mAsset Masset addr - * @return valid bool - * @return string message - * @return address of bAsset to redeem - */ - function suggestRedeemAsset( - address _mAsset - ) - external - view - returns ( - bool, - string memory, - address - ) - { - require(_mAsset != address(0), "Invalid mAsset"); - // Get the data - IBasketManager basketManager = IBasketManager( - IMasset(_mAsset).getBasketManager() - ); - Basket memory basket = basketManager.getBasket(); - uint256 totalSupply = IMasset(_mAsset).totalSupply(); - - // Calc the max weight delta (i.e is X% away from Max weight) - uint256 len = basket.bassets.length; - uint256 overweightCount = 0; - uint256[] memory maxWeightDelta = new uint256[](len); - - for(uint256 i = 0; i < len; i++){ - Basset memory bAsset = basket.bassets[i]; - uint256 scaledBasset = bAsset.vaultBalance.mulRatioTruncate(bAsset.ratio); - // e.g. (1e21 * 1e18) / 1e23 = 1e16 or 1% - uint256 weight = scaledBasset.divPrecisely(totalSupply); - if(weight > bAsset.maxWeight) { - overweightCount++; - } - maxWeightDelta[i] = weight > bAsset.maxWeight ? uint256(-1) : bAsset.maxWeight.sub(weight); - if(bAsset.status != BassetStatus.Normal){ - return (false, "No assets available", address(0)); - } - } - - // if > 1 overweight, fail - if(overweightCount > 1) { - return (false, "No assets available", address(0)); - } else if(overweightCount == 1){ - // if 1 overweight, choose asset - for(uint256 j = 0; j < len; j++){ - if(maxWeightDelta[j] == uint256(-1)){ - return (true, "", basket.bassets[j].addr); - } - } - } - // else choose highest % - uint256 lowestDelta = uint256(-1); - address selected = address(0); - for(uint256 k = 0; k < len; k++){ - if(maxWeightDelta[k] < lowestDelta) { - selected = basket.bassets[k].addr; - lowestDelta = maxWeightDelta[k]; - } - } - return (true, "", selected); - } - - /** - * @dev Determines if a given Redemption is valid - * @param _mAsset Address of the given mAsset (e.g. mUSD) - * @param _mAssetQuantity Amount of mAsset to redeem (in mUSD units) - * @param _outputBasset Desired output bAsset - * @return valid - * @return validity reason - * @return output in bAsset units - * @return bAssetQuantityArg - required input argument to the 'redeem' call - */ - function getRedeemValidity( - address _mAsset, - uint256 _mAssetQuantity, - address _outputBasset - ) - external - view - returns ( - bool, - string memory, - uint256 output, - uint256 bassetQuantityArg - ) - { - // Convert the `mAssetQuantity` (input) into bAsset units - IBasketManager basketManager = IBasketManager( - IMasset(_mAsset).getBasketManager() - ); - Basset memory bAsset = basketManager.getBasset(_outputBasset); - uint256 bAssetQuantity = _mAssetQuantity.divRatioPrecisely( - bAsset.ratio - ); - - // Prepare params for internal validity - address[] memory bAssets = new address[](1); - uint256[] memory quantities = new uint256[](1); - bAssets[0] = _outputBasset; - quantities[0] = bAssetQuantity; - ( - bool valid, - string memory reason, - uint256 bAssetOutput - ) = _getRedeemValidity(_mAsset, bAssets, quantities); - return (valid, reason, bAssetOutput, bAssetQuantity); - } - - - /*************************************** - SAVE - ****************************************/ - - /** - * @dev Gets the users savings balance in Masset terms - * @param _save SAVE contract address - * @param _user Address of the user - * @return balance in Masset units - */ - function getSaveBalance( - ISavingsContract _save, - address _user - ) - external - view - returns ( - uint256 - ) - { - require(address(_save) != address(0), "Invalid contract"); - require(_user != address(0), "Invalid user"); - - uint256 credits = _save.creditBalances(_user); - uint256 rate = _save.exchangeRate(); - require(rate > 0, "Invalid rate"); - - return credits.mulTruncate(rate); - } - - /** - * @dev Returns the 'credit' units required to withdraw a certain - * amount of Masset from the SAVE contract - * @param _save SAVE contract address - * @param _mAssetUnits Amount of mAsset to redeem from SAVE - * @return input for the redeem function (ie. credit units to redeem) - */ - function getSaveRedeemInput( - ISavingsContract _save, - uint256 _mAssetUnits - ) - external - view - returns ( - uint256 - ) - { - require(address(_save) != address(0), "Invalid contract"); - - uint256 rate = _save.exchangeRate(); - require(rate > 0, "Invalid rate"); - - uint256 credits = _mAssetUnits.divPrecisely(rate); - - // Add 1 because the amounts always round down - // e.g. i have 51 credits, e4 10 = 20.4 - // to withdraw 20 i need 20*10/4 = 50 + 1 - return credits + 1; - } - - - /*************************************** - INTERNAL - ****************************************/ - - struct Data { - bool isValid; - string reason; - IMasset mAsset; - IBasketManager basketManager; - bool isMint; - uint256 totalSupply; - Basset input; - Basset output; - } - - function _getData(address _mAsset, address _input, address _output) internal view returns (Data memory) { - bool isMint = _output == _mAsset; - IMasset mAsset = IMasset(_mAsset); - IBasketManager basketManager = IBasketManager( - mAsset.getBasketManager() - ); - (bool isValid, string memory reason, ) = mAsset - .getSwapOutput(_input, _output, 1); - uint256 totalSupply = mAsset.totalSupply(); - Basset memory input = basketManager.getBasset(_input); - Basset memory output = !isMint ? basketManager.getBasset(_output) : Basset({ - addr: _output, - ratio: StableMath.getRatioScale(), - maxWeight: 0, - vaultBalance: 0, - status: BassetStatus.Normal, - isTransferFeeCharged: false - }); - return Data({ - isValid: isValid, - reason: reason, - mAsset: mAsset, - basketManager: basketManager, - isMint: isMint, - totalSupply: totalSupply, - input: input, - output: output - }); - } - - - function _getRedeemValidity( - address _mAsset, - address[] memory _bAssets, - uint256[] memory _bAssetQuantities - ) - internal - view - returns ( - bool, - string memory, - uint256 output - ) - { - uint256 bAssetCount = _bAssetQuantities.length; - require( - bAssetCount == 1 && bAssetCount == _bAssets.length, - "Input array mismatch" - ); - - IMasset mAsset = IMasset(_mAsset); - IBasketManager basketManager = IBasketManager( - mAsset.getBasketManager() - ); - - Basket memory basket = basketManager.getBasket(); - - if (basket.undergoingRecol || basketManager.paused()) { - return (false, "Invalid basket state", 0); - } - - ( - bool redemptionValid, - string memory reason, - bool applyFee - ) = _validateRedeem( - mAsset, - _bAssetQuantities, - _bAssets[0], - basket.failed, - mAsset.totalSupply(), - basket.bassets - ); - if (!redemptionValid) { - return (false, reason, 0); - } - uint256 fee = applyFee ? mAsset.swapFee() : 0; - uint256 feeAmount = _bAssetQuantities[0].mulTruncate(fee); - uint256 outputMinusFee = _bAssetQuantities[0].sub(feeAmount); - return (true, "", outputMinusFee); - } - - - function _validateRedeem( - IMasset mAsset, - uint256[] memory quantities, - address bAsset, - bool failed, - uint256 supply, - Basset[] memory allBassets - ) - internal - view - returns ( - bool, - string memory, - bool - ) - { - IForgeValidator forgeValidator = IForgeValidator( - mAsset.forgeValidator() - ); - uint8[] memory bAssetIndexes = new uint8[](1); - for (uint8 i = 0; i < uint8(allBassets.length); i++) { - if (allBassets[i].addr == bAsset) { - bAssetIndexes[0] = i; - break; - } - } - return - forgeValidator.validateRedemption( - failed, - supply, - allBassets, - bAssetIndexes, - quantities - ); - } - -} diff --git a/contracts/masset/shared/MassetHelpers.sol b/contracts/masset/shared/MassetHelpers.sol deleted file mode 100644 index d959e8b4..00000000 --- a/contracts/masset/shared/MassetHelpers.sol +++ /dev/null @@ -1,43 +0,0 @@ -pragma solidity 0.5.16; - -import { StableMath } from "../../shared/StableMath.sol"; -import { SafeMath } from "@openzeppelin/contracts/math/SafeMath.sol"; -import { SafeERC20 } from "@openzeppelin/contracts/token/ERC20/SafeERC20.sol"; -import { IERC20 } from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; - -/** - * @title MassetHelpers - * @author Stability Labs Pty. Ltd. - * @notice Helper functions to facilitate minting and redemption from off chain - * @dev VERSION: 1.0 - * DATE: 2020-03-28 - */ -library MassetHelpers { - - using StableMath for uint256; - using SafeMath for uint256; - using SafeERC20 for IERC20; - - - function transferReturnBalance( - address _sender, - address _recipient, - address _basset, - uint256 _qty - ) - internal - returns (uint256 receivedQty, uint256 recipientBalance) - { - uint256 balBefore = IERC20(_basset).balanceOf(_recipient); - IERC20(_basset).safeTransferFrom(_sender, _recipient, _qty); - recipientBalance = IERC20(_basset).balanceOf(_recipient); - receivedQty = StableMath.min(_qty, recipientBalance.sub(balBefore)); - } - - function safeInfiniteApprove(address _asset, address _spender) - internal - { - IERC20(_asset).safeApprove(_spender, 0); - IERC20(_asset).safeApprove(_spender, uint256(-1)); - } -} diff --git a/contracts/masset/shared/MassetStructs.sol b/contracts/masset/shared/MassetStructs.sol deleted file mode 100644 index 08e8b27f..00000000 --- a/contracts/masset/shared/MassetStructs.sol +++ /dev/null @@ -1,101 +0,0 @@ -pragma solidity 0.5.16; - -/** - * @title MassetStructs - * @author Stability Labs Pty. Ltd. - * @notice Structs used in the Masset contract and associated Libs - */ -interface MassetStructs { - - /** @dev Stores high level basket info */ - struct Basket { - - /** @dev Array of Bassets currently active */ - Basset[] bassets; - - /** @dev Max number of bAssets that can be present in any Basket */ - uint8 maxBassets; - - /** @dev Some bAsset is undergoing re-collateralisation */ - bool undergoingRecol; - - /** - * @dev In the event that we do not raise enough funds from the auctioning of a failed Basset, - * The Basket is deemed as failed, and is undercollateralised to a certain degree. - * The collateralisation ratio is used to calc Masset burn rate. - */ - bool failed; - uint256 collateralisationRatio; - - } - - /** @dev Stores bAsset info. The struct takes 5 storage slots per Basset */ - struct Basset { - - /** @dev Address of the bAsset */ - address addr; - - /** @dev Status of the basset, */ - BassetStatus status; // takes uint8 datatype (1 byte) in storage - - /** @dev An ERC20 can charge transfer fee, for example USDT, DGX tokens. */ - bool isTransferFeeCharged; // takes a byte in storage - - /** - * @dev 1 Basset * ratio / ratioScale == x Masset (relative value) - * If ratio == 10e8 then 1 bAsset = 10 mAssets - * A ratio is divised as 10^(18-tokenDecimals) * measurementMultiple(relative value of 1 base unit) - */ - uint256 ratio; - - /** @dev Target weights of the Basset (100% == 1e18) */ - uint256 maxWeight; - - /** @dev Amount of the Basset that is held in Collateral */ - uint256 vaultBalance; - - } - - /** @dev Status of the Basset - has it broken its peg? */ - enum BassetStatus { - Default, - Normal, - BrokenBelowPeg, - BrokenAbovePeg, - Blacklisted, - Liquidating, - Liquidated, - Failed - } - - /** @dev Internal details on Basset */ - struct BassetDetails { - Basset bAsset; - address integrator; - uint8 index; - } - - /** @dev All details needed to Forge with multiple bAssets */ - struct ForgePropsMulti { - bool isValid; // Flag to signify that forge bAssets have passed validity check - Basset[] bAssets; - address[] integrators; - uint8[] indexes; - } - /** @dev All details needed to Forge with multiple bAssets */ - struct RedeemProps { - bool isValid; - Basset[] allBassets; - Basset[] bAssets; - address[] integrators; - uint8[] indexes; - } - - /** @dev All details needed for proportionate Redemption */ - struct RedeemPropsMulti { - uint256 colRatio; - Basset[] bAssets; - address[] integrators; - uint8[] indexes; - } -} diff --git a/contracts/meta-token/GovernedMinterRole.sol b/contracts/meta-token/GovernedMinterRole.sol deleted file mode 100644 index f04f87d9..00000000 --- a/contracts/meta-token/GovernedMinterRole.sol +++ /dev/null @@ -1,56 +0,0 @@ -pragma solidity 0.5.16; - -import { Module } from "../shared/Module.sol"; -import { ERC20 } from "@openzeppelin/contracts/token/ERC20/ERC20.sol"; -import { Roles } from "@openzeppelin/contracts/access/Roles.sol"; - -/** - * @title GovernedMinterRole - * @author OpenZeppelin (forked from @openzeppelin/contracts/access/roles/MinterRole.sol) - * @dev Forked from OpenZeppelin 'MinterRole' with changes: - * - `addMinter` modified from `onlyMinter` to `onlyGovernor` - * - `removeMinter` function added, callable by `onlyGovernor` - */ -contract GovernedMinterRole is Module { - - using Roles for Roles.Role; - - event MinterAdded(address indexed account); - event MinterRemoved(address indexed account); - - Roles.Role private _minters; - - constructor(address _nexus) internal Module(_nexus) { - } - - modifier onlyMinter() { - require(isMinter(msg.sender), "MinterRole: caller does not have the Minter role"); - _; - } - - function isMinter(address account) public view returns (bool) { - return _minters.has(account); - } - - function addMinter(address account) public onlyGovernor { - _addMinter(account); - } - - function removeMinter(address account) public onlyGovernor { - _removeMinter(account); - } - - function renounceMinter() public { - _removeMinter(msg.sender); - } - - function _addMinter(address account) internal { - _minters.add(account); - emit MinterAdded(account); - } - - function _removeMinter(address account) internal { - _minters.remove(account); - emit MinterRemoved(account); - } -} \ No newline at end of file diff --git a/contracts/meta-token/MetaToken.sol b/contracts/meta-token/MetaToken.sol deleted file mode 100644 index a6e5b1ee..00000000 --- a/contracts/meta-token/MetaToken.sol +++ /dev/null @@ -1,53 +0,0 @@ -pragma solidity 0.5.16; - -import { GovernedMinterRole } from "./GovernedMinterRole.sol"; -import { ERC20 } from "@openzeppelin/contracts/token/ERC20/ERC20.sol"; -import { ERC20Detailed } from "@openzeppelin/contracts/token/ERC20/ERC20Detailed.sol"; -import { ERC20Burnable } from "@openzeppelin/contracts/token/ERC20/ERC20Burnable.sol"; - -/** - * @title MetaToken - * @author Stability Labs Pty. Ltd. - * @dev MetaToken is an ERC20 token, with mint privileges governed by mStable - * governors - */ -contract MetaToken is - ERC20, - GovernedMinterRole, - ERC20Detailed, - ERC20Burnable -{ - - /** - * @dev MetaToken simply implements a detailed ERC20 token, - * and a governed list of minters - */ - constructor( - address _nexus, - address _initialRecipient - ) - public - GovernedMinterRole(_nexus) - ERC20Detailed( - "Meta", - "MTA", - 18 - ) - { - // 100m initial supply - _mint(_initialRecipient, 100000000 * (10 ** 18)); - } - - // Forked from @openzeppelin - /** - * @dev See {ERC20-_mint}. - * - * Requirements: - * - * - the caller must have the {MinterRole}. - */ - function mint(address account, uint256 amount) public onlyMinter returns (bool) { - _mint(account, amount); - return true; - } -} \ No newline at end of file diff --git a/contracts/nexus/Nexus.sol b/contracts/nexus/Nexus.sol deleted file mode 100644 index e1f0561f..00000000 --- a/contracts/nexus/Nexus.sol +++ /dev/null @@ -1,284 +0,0 @@ -pragma solidity 0.5.16; - -import { INexus } from "../interfaces/INexus.sol"; -import { DelayedClaimableGovernor } from "../governance/DelayedClaimableGovernor.sol"; - -/** - * @title Nexus - * @author Stability Labs Pty. Ltd. - * @notice Address provider and system kernel, also facilitates governance changes - * @dev The Nexus is mStable's Kernel, and allows the publishing and propagating - * of new system Modules. Other Modules will read from the Nexus - */ -contract Nexus is INexus, DelayedClaimableGovernor { - - event ModuleProposed(bytes32 indexed key, address addr, uint256 timestamp); - event ModuleAdded(bytes32 indexed key, address addr, bool isLocked); - event ModuleCancelled(bytes32 indexed key); - event ModuleLockRequested(bytes32 indexed key, uint256 timestamp); - event ModuleLockEnabled(bytes32 indexed key); - event ModuleLockCancelled(bytes32 indexed key); - - /** @dev Struct to store information about current modules */ - struct Module { - address addr; // Module address - bool isLocked; // Module lock status - } - - /** @dev Struct to store information about proposed modules */ - struct Proposal { - address newAddress; // Proposed Module address - uint256 timestamp; // Timestamp when module upgrade was proposed - } - - // 1 week delayed upgrade period - uint256 public constant UPGRADE_DELAY = 1 weeks; - - // Module-key => Module - mapping(bytes32 => Module) public modules; - // Module-address => Module-key - mapping(address => bytes32) private addressToModule; - // Module-key => Proposal - mapping(bytes32 => Proposal) public proposedModules; - // Module-key => Timestamp when lock was proposed - mapping(bytes32 => uint256) public proposedLockModules; - - // Init flag to allow add modules at the time of deplyment without delay - bool public initialized = false; - - /** - * @dev Modifier allows functions calls only when contract is not initialized. - */ - modifier whenNotInitialized() { - require(!initialized, "Nexus is already initialized"); - _; - } - - /** - * @dev Initialises the Nexus and adds the core data to the Kernel (itself and governor) - * @param _governorAddr Governor address - */ - constructor(address _governorAddr) - public - DelayedClaimableGovernor(_governorAddr, UPGRADE_DELAY) - {} - - /** - * @dev Adds multiple new modules to the system to initialize the - * Nexus contract with default modules. This should be called first - * after deploying Nexus contract. - * @param _keys Keys of the new modules in bytes32 form - * @param _addresses Contract addresses of the new modules - * @param _isLocked IsLocked flag for the new modules - * @param _governorAddr New Governor address - * @return bool Success of publishing new Modules - */ - function initialize( - bytes32[] calldata _keys, - address[] calldata _addresses, - bool[] calldata _isLocked, - address _governorAddr - ) - external - onlyGovernor - whenNotInitialized - returns (bool) - { - uint256 len = _keys.length; - require(len > 0, "No keys provided"); - require(len == _addresses.length, "Insufficient address data"); - require(len == _isLocked.length, "Insufficient locked statuses"); - - for(uint256 i = 0 ; i < len; i++) { - _publishModule(_keys[i], _addresses[i], _isLocked[i]); - } - - if(_governorAddr != governor()) _changeGovernor(_governorAddr); - - initialized = true; - return true; - } - - /*************************************** - MODULE ADDING - ****************************************/ - - /** - * @dev Propose a new or update existing module - * @param _key Key of the module - * @param _addr Address of the module - */ - function proposeModule(bytes32 _key, address _addr) - external - onlyGovernor - { - require(_key != bytes32(0x0), "Key must not be zero"); - require(_addr != address(0), "Module address must not be 0"); - require(!modules[_key].isLocked, "Module must be unlocked"); - require(modules[_key].addr != _addr, "Module already has same address"); - Proposal storage p = proposedModules[_key]; - require(p.timestamp == 0, "Module already proposed"); - - p.newAddress = _addr; - p.timestamp = now; - emit ModuleProposed(_key, _addr, now); - } - - /** - * @dev Cancel a proposed module request - * @param _key Key of the module - */ - function cancelProposedModule(bytes32 _key) - external - onlyGovernor - { - uint256 timestamp = proposedModules[_key].timestamp; - require(timestamp > 0, "Proposed module not found"); - - delete proposedModules[_key]; - emit ModuleCancelled(_key); - } - - /** - * @dev Accept and publish an already proposed module - * @param _key Key of the module - */ - function acceptProposedModule(bytes32 _key) - external - onlyGovernor - { - _acceptProposedModule(_key); - } - - /** - * @dev Accept and publish already proposed modules - * @param _keys Keys array of the modules - */ - function acceptProposedModules(bytes32[] calldata _keys) - external - onlyGovernor - { - uint256 len = _keys.length; - require(len > 0, "Keys array empty"); - - for(uint256 i = 0 ; i < len; i++) { - _acceptProposedModule(_keys[i]); - } - } - - /** - * @dev Accept a proposed module - * @param _key Key of the module - */ - function _acceptProposedModule(bytes32 _key) internal { - Proposal memory p = proposedModules[_key]; - require(_isDelayOver(p.timestamp), "Module upgrade delay not over"); - - delete proposedModules[_key]; - _publishModule(_key, p.newAddress, false); - } - - /** - * @dev Internal func to publish a module to kernel - * @param _key Key of the new module in bytes32 form - * @param _addr Contract address of the new module - * @param _isLocked Flag to lock a module - */ - function _publishModule(bytes32 _key, address _addr, bool _isLocked) internal { - require(addressToModule[_addr] == bytes32(0x0), "Modules must have unique addr"); - require(!modules[_key].isLocked, "Module must be unlocked"); - // Old no longer points to a moduleAddress - address oldModuleAddr = modules[_key].addr; - if(oldModuleAddr != address(0x0)) { - addressToModule[oldModuleAddr] = bytes32(0x0); - } - modules[_key].addr = _addr; - modules[_key].isLocked = _isLocked; - addressToModule[_addr] = _key; - emit ModuleAdded(_key, _addr, _isLocked); - } - - /*************************************** - MODULE LOCKING - ****************************************/ - - /** - * @dev Request to lock an existing module - * @param _key Key of the module - */ - function requestLockModule(bytes32 _key) - external - onlyGovernor - { - require(moduleExists(_key), "Module must exist"); - require(!modules[_key].isLocked, "Module must be unlocked"); - require(proposedLockModules[_key] == 0, "Lock already proposed"); - - proposedLockModules[_key] = now; - emit ModuleLockRequested(_key, now); - } - - /** - * @dev Cancel a lock module request - * @param _key Key of the module - */ - function cancelLockModule(bytes32 _key) - external - onlyGovernor - { - require(proposedLockModules[_key] > 0, "Module lock request not found"); - - delete proposedLockModules[_key]; - emit ModuleLockCancelled(_key); - } - - /** - * @dev Permanently lock a module to its current settings - * @param _key Bytes32 key of the module - */ - function lockModule(bytes32 _key) - external - onlyGovernor - { - require(_isDelayOver(proposedLockModules[_key]), "Delay not over"); - - modules[_key].isLocked = true; - delete proposedLockModules[_key]; - emit ModuleLockEnabled(_key); - } - - /*************************************** - HELPERS & GETTERS - ****************************************/ - - /** - * @dev Checks if a module exists - * @param _key Key of the module - * @return Returns 'true' when a module exists, otherwise 'false' - */ - function moduleExists(bytes32 _key) public view returns (bool) { - if(_key != 0 && modules[_key].addr != address(0)) - return true; - return false; - } - - /** - * @dev Get the module address - * @param _key Key of the module - * @return Return the address of the module - */ - function getModule(bytes32 _key) external view returns (address addr) { - addr = modules[_key].addr; - } - - /** - * @dev Checks if upgrade delay over - * @param _timestamp Timestamp to check - * @return Return 'true' when delay is over, otherwise 'false' - */ - function _isDelayOver(uint256 _timestamp) private view returns (bool) { - if(_timestamp > 0 && now >= _timestamp.add(UPGRADE_DELAY)) - return true; - return false; - } -} \ No newline at end of file diff --git a/contracts/rewards/RewardsDistributionRecipient.sol b/contracts/rewards/InitializableRewardsDistributionRecipient.sol similarity index 67% rename from contracts/rewards/RewardsDistributionRecipient.sol rename to contracts/rewards/InitializableRewardsDistributionRecipient.sol index 76af249e..08ccbf25 100644 --- a/contracts/rewards/RewardsDistributionRecipient.sol +++ b/contracts/rewards/InitializableRewardsDistributionRecipient.sol @@ -1,30 +1,28 @@ -pragma solidity 0.5.16; +// SPDX-License-Identifier: AGPL-3.0-or-later +pragma solidity 0.8.0; -import { Module } from "../shared/Module.sol"; -import { IERC20 } from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import { ImmutableModule } from "../shared/ImmutableModule.sol"; +import { IERC20 } from "@openzeppelin/contracts-sol8/contracts/token/ERC20/IERC20.sol"; import { IRewardsDistributionRecipient } from "../interfaces/IRewardsDistributionRecipient.sol"; /** * @title RewardsDistributionRecipient * @author Originally: Synthetix (forked from /Synthetixio/synthetix/contracts/RewardsDistributionRecipient.sol) - * Changes by: Stability Labs Pty. Ltd. + * Changes by: mStable * @notice RewardsDistributionRecipient gets notified of additional rewards by the rewardsDistributor * @dev Changes: Addition of Module and abstract `getRewardToken` func + cosmetic */ -contract RewardsDistributionRecipient is IRewardsDistributionRecipient, Module { - - // @abstract - function notifyRewardAmount(uint256 reward) external; - function getRewardToken() external view returns (IERC20); - +abstract contract InitializableRewardsDistributionRecipient is + IRewardsDistributionRecipient, + ImmutableModule +{ // This address has the ability to distribute the rewards address public rewardsDistributor; + constructor(address _nexus) ImmutableModule(_nexus) {} + /** @dev Recipient is a module, governed by mStable governance */ - constructor(address _nexus, address _rewardsDistributor) - internal - Module(_nexus) - { + function _initialize(address _rewardsDistributor) internal { rewardsDistributor = _rewardsDistributor; } @@ -40,10 +38,7 @@ contract RewardsDistributionRecipient is IRewardsDistributionRecipient, Module { * @dev Change the rewardsDistributor - only called by mStable governor * @param _rewardsDistributor Address of the new distributor */ - function setRewardsDistribution(address _rewardsDistributor) - external - onlyGovernor - { + function setRewardsDistribution(address _rewardsDistributor) external onlyGovernor { rewardsDistributor = _rewardsDistributor; } } diff --git a/contracts/rewards/README.md b/contracts/rewards/README.md deleted file mode 100644 index df6956ab..00000000 --- a/contracts/rewards/README.md +++ /dev/null @@ -1,28 +0,0 @@ - - -## Files - -Why so many? - -Actually only 3 are base contracts - -### RewardsDistributor - -Allows reward allocators ("FundManagers") to distribute rewards. - -### StakingRewards - -`StakingRewards` is `RewardsDistributionRecipient` ---------------> is `StakingTokenWrapper` - -This preserves the code written, tested, audited and deployed by `Synthetix` (StakingRewards & StakingTokenWrapper). - -Originally: Synthetix (forked from /Synthetixio/synthetix/contracts/StakingRewards.sol) -Audit: https://github.com/sigp/public-audits/blob/master/synthetix/unipool/review.pdf` - -### StakingRewardsWithPlatformToken - -`StakingRewardsWithPlatformToken` is `RewardsDistributionRecipient` --------------------------------> is `StakingTokenWrapper` - -`StakingRewardsWithPlatformToken` deploys `PlatformTokenVendor` during its constructor diff --git a/contracts/rewards/RewardsDistributor.sol b/contracts/rewards/RewardsDistributor.sol deleted file mode 100644 index 5155224d..00000000 --- a/contracts/rewards/RewardsDistributor.sol +++ /dev/null @@ -1,87 +0,0 @@ -pragma solidity 0.5.16; - -import { IRewardsDistributionRecipient } from "../interfaces/IRewardsDistributionRecipient.sol"; - -import { InitializableGovernableWhitelist } from "../governance/InitializableGovernableWhitelist.sol"; -import { SafeERC20, IERC20 } from "@openzeppelin/contracts/token/ERC20/SafeERC20.sol"; - -/** - * @title RewardsDistributor - * @author Stability Labs Pty. Ltd. - * @notice RewardsDistributor allows Fund Managers to send rewards (usually in MTA) - * to specified Reward Recipients. - */ -contract RewardsDistributor is InitializableGovernableWhitelist { - - using SafeERC20 for IERC20; - - event RemovedFundManager(address indexed _address); - event DistributedReward(address funder, address recipient, address rewardToken, uint256 amount); - - /** @dev Recipient is a module, governed by mStable governance */ - constructor( - address _nexus, - address[] memory _fundManagers - ) - public - { - InitializableGovernableWhitelist._initialize(_nexus, _fundManagers); - } - - /** - * @dev Allows the mStable governance to add a new FundManager - * @param _address FundManager to add - */ - function addFundManager(address _address) - external - onlyGovernor - { - _addWhitelist(_address); - } - - /** - * @dev Allows the mStable governance to remove inactive FundManagers - * @param _address FundManager to remove - */ - function removeFundManager(address _address) - external - onlyGovernor - { - require(_address != address(0), "Address is zero"); - require(whitelist[_address], "Address is not whitelisted"); - - whitelist[_address] = false; - - emit RemovedFundManager(_address); - } - - /** - * @dev Distributes reward tokens to list of recipients and notifies them - * of the transfer. Only callable by FundManagers - * @param _recipients Array of Reward recipients to credit - * @param _amounts Amounts of reward tokens to distribute - */ - function distributeRewards( - IRewardsDistributionRecipient[] calldata _recipients, - uint256[] calldata _amounts - ) - external - onlyWhitelisted - { - uint256 len = _recipients.length; - require(len > 0, "Must choose recipients"); - require(len == _amounts.length, "Mismatching inputs"); - - for(uint i = 0; i < len; i++){ - uint256 amount = _amounts[i]; - IRewardsDistributionRecipient recipient = _recipients[i]; - // Send the RewardToken to recipient - IERC20 rewardToken = recipient.getRewardToken(); - rewardToken.safeTransferFrom(msg.sender, address(recipient), amount); - // Only after successfull tx - notify the contract of the new funds - recipient.notifyRewardAmount(amount); - - emit DistributedReward(msg.sender, address(recipient), address(rewardToken), amount); - } - } -} diff --git a/contracts/rewards/staking/PlatformTokenVendor.sol b/contracts/rewards/staking/PlatformTokenVendor.sol deleted file mode 100644 index 0e13be07..00000000 --- a/contracts/rewards/staking/PlatformTokenVendor.sol +++ /dev/null @@ -1,31 +0,0 @@ -pragma solidity 0.5.16; - -import { IERC20 } from "@openzeppelin/contracts/token/ERC20/SafeERC20.sol"; -import { MassetHelpers } from "../../masset/shared/MassetHelpers.sol"; - -/** - * @title PlatformTokenVendor - * @author Stability Labs Pty. Ltd. - * @notice Stores platform tokens for distributing to StakingReward participants - * @dev Only deploy this during the constructor of a given StakingReward contract - */ -contract PlatformTokenVendor { - - IERC20 public platformToken; - address public parentStakingContract; - - /** @dev Simple constructor that stores the parent address */ - constructor(IERC20 _platformToken) public { - parentStakingContract = msg.sender; - platformToken = _platformToken; - MassetHelpers.safeInfiniteApprove(address(_platformToken), parentStakingContract); - } - - /** - * @dev Re-approves the StakingReward contract to spend the platform token. - * Just incase for some reason approval has been reset. - */ - function reApproveOwner() external { - MassetHelpers.safeInfiniteApprove(address(platformToken), parentStakingContract); - } -} diff --git a/contracts/rewards/staking/StakingRewards.sol b/contracts/rewards/staking/StakingRewards.sol deleted file mode 100644 index cafeed9d..00000000 --- a/contracts/rewards/staking/StakingRewards.sol +++ /dev/null @@ -1,260 +0,0 @@ -pragma solidity 0.5.16; - -// Internal -import { StakingTokenWrapper } from "./StakingTokenWrapper.sol"; -import { RewardsDistributionRecipient } from "../RewardsDistributionRecipient.sol"; - -// Libs -import { IERC20 } from "@openzeppelin/contracts/token/ERC20/SafeERC20.sol"; -import { StableMath } from "../../shared/StableMath.sol"; - - -/** - * @title StakingRewards - * @author Originally: Synthetix (forked from /Synthetixio/synthetix/contracts/StakingRewards.sol) - * Audit: https://github.com/sigp/public-audits/blob/master/synthetix/unipool/review.pdf - * Changes by: Stability Labs Pty. Ltd. - * @notice Rewards stakers of a given LP token (a.k.a StakingToken) with RewardsToken, on a pro-rata basis - * @dev Uses an ever increasing 'rewardPerTokenStored' variable to distribute rewards - * each time a write action is called in the contract. This allows for passive reward accrual. - * Changes: - * - Cosmetic (comments, readability) - * - Addition of getRewardToken() - * - Changing of `StakingTokenWrapper` funcs from `super.stake` to `_stake` - * - Introduced a `stake(_beneficiary)` function to enable contract wrappers to stake on behalf - */ -contract StakingRewards is StakingTokenWrapper, RewardsDistributionRecipient { - - using StableMath for uint256; - - IERC20 public rewardsToken; - - uint256 public constant DURATION = 7 days; - - // Timestamp for current period finish - uint256 public periodFinish = 0; - // RewardRate for the rest of the PERIOD - uint256 public rewardRate = 0; - // Last time any user took action - uint256 public lastUpdateTime = 0; - // Ever increasing rewardPerToken rate, based on % of total supply - uint256 public rewardPerTokenStored = 0; - mapping(address => uint256) public userRewardPerTokenPaid; - mapping(address => uint256) public rewards; - - event RewardAdded(uint256 reward); - event Staked(address indexed user, uint256 amount, address payer); - event Withdrawn(address indexed user, uint256 amount); - event RewardPaid(address indexed user, uint256 reward); - - /** @dev StakingRewards is a TokenWrapper and RewardRecipient */ - constructor( - address _nexus, - address _stakingToken, - address _rewardsToken, - address _rewardsDistributor - ) - public - StakingTokenWrapper(_stakingToken) - RewardsDistributionRecipient(_nexus, _rewardsDistributor) - { - rewardsToken = IERC20(_rewardsToken); - } - - /** @dev Updates the reward for a given address, before executing function */ - modifier updateReward(address _account) { - // Setting of global vars - uint256 newRewardPerToken = rewardPerToken(); - // If statement protects against loss in initialisation case - if(newRewardPerToken > 0) { - rewardPerTokenStored = newRewardPerToken; - lastUpdateTime = lastTimeRewardApplicable(); - // Setting of personal vars based on new globals - if (_account != address(0)) { - rewards[_account] = earned(_account); - userRewardPerTokenPaid[_account] = newRewardPerToken; - } - } - _; - } - - /*************************************** - ACTIONS - ****************************************/ - - /** - * @dev Stakes a given amount of the StakingToken for the sender - * @param _amount Units of StakingToken - */ - function stake(uint256 _amount) - external - { - _stake(msg.sender, _amount); - } - - /** - * @dev Stakes a given amount of the StakingToken for a given beneficiary - * @param _beneficiary Staked tokens are credited to this address - * @param _amount Units of StakingToken - */ - function stake(address _beneficiary, uint256 _amount) - external - { - _stake(_beneficiary, _amount); - } - - /** - * @dev Internally stakes an amount by depositing from sender, - * and crediting to the specified beneficiary - * @param _beneficiary Staked tokens are credited to this address - * @param _amount Units of StakingToken - */ - function _stake(address _beneficiary, uint256 _amount) - internal - updateReward(_beneficiary) - { - require(_amount > 0, "Cannot stake 0"); - super._stake(_beneficiary, _amount); - emit Staked(_beneficiary, _amount, msg.sender); - } - - /** - * @dev Withdraws stake from pool and claims any rewards - */ - function exit() external { - withdraw(balanceOf(msg.sender)); - claimReward(); - } - - /** - * @dev Withdraws given stake amount from the pool - * @param _amount Units of the staked token to withdraw - */ - function withdraw(uint256 _amount) - public - updateReward(msg.sender) - { - require(_amount > 0, "Cannot withdraw 0"); - _withdraw(_amount); - emit Withdrawn(msg.sender, _amount); - } - - /** - * @dev Claims outstanding rewards for the sender. - * First updates outstanding reward allocation and then transfers. - */ - function claimReward() - public - updateReward(msg.sender) - { - uint256 reward = rewards[msg.sender]; - if (reward > 0) { - rewards[msg.sender] = 0; - rewardsToken.safeTransfer(msg.sender, reward); - emit RewardPaid(msg.sender, reward); - } - } - - - /*************************************** - GETTERS - ****************************************/ - - /** - * @dev Gets the RewardsToken - */ - function getRewardToken() - external - view - returns (IERC20) - { - return rewardsToken; - } - - /** - * @dev Gets the last applicable timestamp for this reward period - */ - function lastTimeRewardApplicable() - public - view - returns (uint256) - { - return StableMath.min(block.timestamp, periodFinish); - } - - /** - * @dev Calculates the amount of unclaimed rewards per token since last update, - * and sums with stored to give the new cumulative reward per token - * @return 'Reward' per staked token - */ - function rewardPerToken() - public - view - returns (uint256) - { - // If there is no StakingToken liquidity, avoid div(0) - uint256 stakedTokens = totalSupply(); - if (stakedTokens == 0) { - return rewardPerTokenStored; - } - // new reward units to distribute = rewardRate * timeSinceLastUpdate - uint256 rewardUnitsToDistribute = rewardRate.mul(lastTimeRewardApplicable().sub(lastUpdateTime)); - // new reward units per token = (rewardUnitsToDistribute * 1e18) / totalTokens - uint256 unitsToDistributePerToken = rewardUnitsToDistribute.divPrecisely(stakedTokens); - // return summed rate - return rewardPerTokenStored.add(unitsToDistributePerToken); - } - - /** - * @dev Calculates the amount of unclaimed rewards a user has earned - * @param _account User address - * @return Total reward amount earned - */ - function earned(address _account) - public - view - returns (uint256) - { - // current rate per token - rate user previously received - uint256 userRewardDelta = rewardPerToken().sub(userRewardPerTokenPaid[_account]); - // new reward = staked tokens * difference in rate - uint256 userNewReward = balanceOf(_account).mulTruncate(userRewardDelta); - // add to previous rewards - return rewards[_account].add(userNewReward); - } - - - /*************************************** - ADMIN - ****************************************/ - - /** - * @dev Notifies the contract that new rewards have been added. - * Calculates an updated rewardRate based on the rewards in period. - * @param _reward Units of RewardToken that have been added to the pool - */ - function notifyRewardAmount(uint256 _reward) - external - onlyRewardsDistributor - updateReward(address(0)) - { - require(_reward < 1e24, "Cannot notify with more than a million units"); - - uint256 currentTime = block.timestamp; - // If previous period over, reset rewardRate - if (currentTime >= periodFinish) { - rewardRate = _reward.div(DURATION); - } - // If additional reward to existing period, calc sum - else { - uint256 remaining = periodFinish.sub(currentTime); - uint256 leftover = remaining.mul(rewardRate); - rewardRate = _reward.add(leftover).div(DURATION); - } - - lastUpdateTime = currentTime; - periodFinish = currentTime.add(DURATION); - - emit RewardAdded(_reward); - } -} \ No newline at end of file diff --git a/contracts/rewards/staking/StakingRewardsWithPlatformToken.sol b/contracts/rewards/staking/StakingRewardsWithPlatformToken.sol deleted file mode 100644 index 9d2450a4..00000000 --- a/contracts/rewards/staking/StakingRewardsWithPlatformToken.sol +++ /dev/null @@ -1,327 +0,0 @@ -pragma solidity 0.5.16; - -// Internal -import { RewardsDistributionRecipient } from "../RewardsDistributionRecipient.sol"; -import { StakingTokenWrapper } from "./StakingTokenWrapper.sol"; -import { PlatformTokenVendor } from "./PlatformTokenVendor.sol"; - -// Libs -import { SafeERC20, IERC20 } from "@openzeppelin/contracts/token/ERC20/SafeERC20.sol"; -import { ReentrancyGuard } from "@openzeppelin/contracts/utils/ReentrancyGuard.sol"; -import { SafeMath } from "@openzeppelin/contracts/math/SafeMath.sol"; -import { StableMath } from "../../shared/StableMath.sol"; - - -/** - * @title StakingRewardsWithPlatformToken - * @author Stability Labs Pty. Ltd. - * @notice Rewards stakers of a given LP token (a.k.a StakingToken) with RewardsToken, on a pro-rata basis - * additionally, distributes the Platform token airdropped by the platform - * @dev Derives from ./StakingRewards.sol and implements a secondary token into the core logic - */ -contract StakingRewardsWithPlatformToken is StakingTokenWrapper, RewardsDistributionRecipient { - - using StableMath for uint256; - - IERC20 public rewardsToken; - IERC20 public platformToken; - PlatformTokenVendor public platformTokenVendor; - - uint256 public constant DURATION = 7 days; - - // Timestamp for current period finish - uint256 public periodFinish = 0; - // RewardRate for the rest of the PERIOD - uint256 public rewardRate = 0; - uint256 public platformRewardRate = 0; - // Last time any user took action - uint256 public lastUpdateTime; - // Ever increasing rewardPerToken rate, based on % of total supply - uint256 public rewardPerTokenStored; - uint256 public platformRewardPerTokenStored; - - mapping(address => uint256) public userRewardPerTokenPaid; - mapping(address => uint256) public userPlatformRewardPerTokenPaid; - - mapping(address => uint256) public rewards; - mapping(address => uint256) public platformRewards; - - event RewardAdded(uint256 reward, uint256 platformReward); - event Staked(address indexed user, uint256 amount, address payer); - event Withdrawn(address indexed user, uint256 amount); - event RewardPaid(address indexed user, uint256 reward, uint256 platformReward); - - /** @dev StakingRewards is a TokenWrapper and RewardRecipient */ - constructor( - address _nexus, - address _stakingToken, - address _rewardsToken, - address _platformToken, - address _rewardsDistributor - ) - public - StakingTokenWrapper(_stakingToken) - RewardsDistributionRecipient(_nexus, _rewardsDistributor) - { - rewardsToken = IERC20(_rewardsToken); - platformToken = IERC20(_platformToken); - platformTokenVendor = new PlatformTokenVendor(platformToken); - } - - /** @dev Updates the reward for a given address, before executing function */ - modifier updateReward(address _account) { - // Setting of global vars - (uint256 newRewardPerTokenStored, uint256 newPlatformRewardPerTokenStored) = rewardPerToken(); - - // If statement protects against loss in initialisation case - if(newRewardPerTokenStored > 0 || newPlatformRewardPerTokenStored > 0) { - rewardPerTokenStored = newRewardPerTokenStored; - platformRewardPerTokenStored = newPlatformRewardPerTokenStored; - - lastUpdateTime = lastTimeRewardApplicable(); - - // Setting of personal vars based on new globals - if (_account != address(0)) { - (rewards[_account], platformRewards[_account]) = earned(_account); - - userRewardPerTokenPaid[_account] = newRewardPerTokenStored; - userPlatformRewardPerTokenPaid[_account] = newPlatformRewardPerTokenStored; - } - } - _; - } - - /*************************************** - ACTIONS - ****************************************/ - - /** - * @dev Stakes a given amount of the StakingToken for the sender - * @param _amount Units of StakingToken - */ - function stake(uint256 _amount) - external - { - _stake(msg.sender, _amount); - } - - /** - * @dev Stakes a given amount of the StakingToken for a given beneficiary - * @param _beneficiary Staked tokens are credited to this address - * @param _amount Units of StakingToken - */ - function stake(address _beneficiary, uint256 _amount) - external - { - _stake(_beneficiary, _amount); - } - - /** - * @dev Internally stakes an amount by depositing from sender, - * and crediting to the specified beneficiary - * @param _beneficiary Staked tokens are credited to this address - * @param _amount Units of StakingToken - */ - function _stake(address _beneficiary, uint256 _amount) - internal - updateReward(_beneficiary) - { - require(_amount > 0, "Cannot stake 0"); - super._stake(_beneficiary, _amount); - emit Staked(_beneficiary, _amount, msg.sender); - } - - /** - * @dev Withdraws stake from pool and claims any rewards - */ - function exit() external { - withdraw(balanceOf(msg.sender)); - claimReward(); - } - - /** - * @dev Withdraws given stake amount from the pool - * @param _amount Units of the staked token to withdraw - */ - function withdraw(uint256 _amount) - public - updateReward(msg.sender) - { - require(_amount > 0, "Cannot withdraw 0"); - _withdraw(_amount); - emit Withdrawn(msg.sender, _amount); - } - - /** - * @dev Claims outstanding rewards (both platform and native) for the sender. - * First updates outstanding reward allocation and then transfers. - */ - function claimReward() - public - updateReward(msg.sender) - { - uint256 reward = _claimReward(); - uint256 platformReward = _claimPlatformReward(); - emit RewardPaid(msg.sender, reward, platformReward); - } - - /** - * @dev Claims outstanding rewards for the sender. Only the native - * rewards token, and not the platform rewards - */ - function claimRewardOnly() - public - updateReward(msg.sender) - { - uint256 reward = _claimReward(); - emit RewardPaid(msg.sender, reward, 0); - } - - /** - * @dev Credits any outstanding rewards to the sender - */ - function _claimReward() internal returns (uint256) { - uint256 reward = rewards[msg.sender]; - if (reward > 0) { - rewards[msg.sender] = 0; - rewardsToken.transfer(msg.sender, reward); - } - return reward; - } - - /** - * @dev Claims any outstanding platform reward tokens - */ - function _claimPlatformReward() internal returns (uint256) { - uint256 platformReward = platformRewards[msg.sender]; - if(platformReward > 0) { - platformRewards[msg.sender] = 0; - platformToken.safeTransferFrom(address(platformTokenVendor), msg.sender, platformReward); - } - return platformReward; - } - - /*************************************** - GETTERS - ****************************************/ - - /** - * @dev Gets the RewardsToken - */ - function getRewardToken() - external - view - returns (IERC20) - { - return rewardsToken; - } - - /** - * @dev Gets the last applicable timestamp for this reward period - */ - function lastTimeRewardApplicable() - public - view - returns (uint256) - { - return StableMath.min(block.timestamp, periodFinish); - } - - /** - * @dev Calculates the amount of unclaimed rewards a user has earned - * @return 'Reward' per staked token - */ - function rewardPerToken() - public - view - returns (uint256, uint256) - { - // If there is no StakingToken liquidity, avoid div(0) - uint256 stakedTokens = totalSupply(); - if (stakedTokens == 0) { - return (rewardPerTokenStored, platformRewardPerTokenStored); - } - // new reward units to distribute = rewardRate * timeSinceLastUpdate - uint256 timeDelta = lastTimeRewardApplicable().sub(lastUpdateTime); - uint256 rewardUnitsToDistribute = rewardRate.mul(timeDelta); - uint256 platformRewardUnitsToDistribute = platformRewardRate.mul(timeDelta); - // new reward units per token = (rewardUnitsToDistribute * 1e18) / totalTokens - uint256 unitsToDistributePerToken = rewardUnitsToDistribute.divPrecisely(stakedTokens); - uint256 platformUnitsToDistributePerToken = platformRewardUnitsToDistribute.divPrecisely(stakedTokens); - // return summed rate - return ( - rewardPerTokenStored.add(unitsToDistributePerToken), - platformRewardPerTokenStored.add(platformUnitsToDistributePerToken) - ); - } - - /** - * @dev Calculates the amount of unclaimed rewards a user has earned - * @param _account User address - * @return Total reward amount earned - */ - function earned(address _account) - public - view - returns (uint256, uint256) - { - // current rate per token - rate user previously received - (uint256 currentRewardPerToken, uint256 currentPlatformRewardPerToken) = rewardPerToken(); - uint256 userRewardDelta = currentRewardPerToken.sub(userRewardPerTokenPaid[_account]); - uint256 userPlatformRewardDelta = currentPlatformRewardPerToken.sub(userPlatformRewardPerTokenPaid[_account]); - // new reward = staked tokens * difference in rate - uint256 stakeBalance = balanceOf(_account); - uint256 userNewReward = stakeBalance.mulTruncate(userRewardDelta); - uint256 userNewPlatformReward = stakeBalance.mulTruncate(userPlatformRewardDelta); - // add to previous rewards - return ( - rewards[_account].add(userNewReward), - platformRewards[_account].add(userNewPlatformReward) - ); - } - - - /*************************************** - ADMIN - ****************************************/ - - /** - * @dev Notifies the contract that new rewards have been added. - * Calculates an updated rewardRate based on the rewards in period. - * @param _reward Units of RewardToken that have been added to the pool - */ - function notifyRewardAmount(uint256 _reward) - external - onlyRewardsDistributor - updateReward(address(0)) - { - require(_reward < 1e24, "Cannot notify with more than a million units"); - - uint256 newPlatformRewards = platformToken.balanceOf(address(this)); - if(newPlatformRewards > 0){ - platformToken.safeTransfer(address(platformTokenVendor), newPlatformRewards); - } - - uint256 currentTime = block.timestamp; - // If previous period over, reset rewardRate - if (currentTime >= periodFinish) { - rewardRate = _reward.div(DURATION); - platformRewardRate = newPlatformRewards.div(DURATION); - } - // If additional reward to existing period, calc sum - else { - uint256 remaining = periodFinish.sub(currentTime); - - uint256 leftoverReward = remaining.mul(rewardRate); - rewardRate = _reward.add(leftoverReward).div(DURATION); - - uint256 leftoverPlatformReward = remaining.mul(platformRewardRate); - platformRewardRate = newPlatformRewards.add(leftoverPlatformReward).div(DURATION); - } - - lastUpdateTime = currentTime; - periodFinish = currentTime.add(DURATION); - - emit RewardAdded(_reward, newPlatformRewards); - } -} diff --git a/contracts/rewards/staking/StakingTokenWrapper.sol b/contracts/rewards/staking/StakingTokenWrapper.sol deleted file mode 100644 index 25a8bfb0..00000000 --- a/contracts/rewards/staking/StakingTokenWrapper.sol +++ /dev/null @@ -1,86 +0,0 @@ -pragma solidity 0.5.16; - -// Libs -import { SafeERC20, IERC20 } from "@openzeppelin/contracts/token/ERC20/SafeERC20.sol"; -import { ReentrancyGuard } from "@openzeppelin/contracts/utils/ReentrancyGuard.sol"; -import { SafeMath } from "@openzeppelin/contracts/math/SafeMath.sol"; - -/** - * @title StakingTokenWrapper - * @author Synthetix (forked from /Synthetixio/synthetix/contracts/StakingRewards.sol) - * Audit: https://github.com/sigp/public-audits/blob/master/synthetix/unipool/review.pdf - * Changes by: Stability Labs Pty. Ltd. - * @notice Basic wrapper to facilitate tracking of staked balances - * @dev Changes: - * - Cosmetic (comments, readability) - * - Changing 'stake' and 'withdraw' to internal funcs - * - Changing '_stake' to accept a `beneficiary` address to enable wrapper integrations - */ -contract StakingTokenWrapper is ReentrancyGuard { - - using SafeMath for uint256; - using SafeERC20 for IERC20; - - IERC20 public stakingToken; - - uint256 private _totalSupply; - mapping(address => uint256) private _balances; - - /** - * @dev TokenWrapper constructor - * @param _stakingToken Wrapped token to be staked - */ - constructor(address _stakingToken) internal { - stakingToken = IERC20(_stakingToken); - } - - /** - * @dev Get the total amount of the staked token - * @return uint256 total supply - */ - function totalSupply() - public - view - returns (uint256) - { - return _totalSupply; - } - - /** - * @dev Get the balance of a given account - * @param _account User for which to retrieve balance - */ - function balanceOf(address _account) - public - view - returns (uint256) - { - return _balances[_account]; - } - - /** - * @dev Deposits a given amount of StakingToken from sender - * @param _amount Units of StakingToken - */ - function _stake(address _beneficiary, uint256 _amount) - internal - nonReentrant - { - _totalSupply = _totalSupply.add(_amount); - _balances[_beneficiary] = _balances[_beneficiary].add(_amount); - stakingToken.safeTransferFrom(msg.sender, address(this), _amount); - } - - /** - * @dev Withdraws a given stake from sender - * @param _amount Units of StakingToken - */ - function _withdraw(uint256 _amount) - internal - nonReentrant - { - _totalSupply = _totalSupply.sub(_amount); - _balances[msg.sender] = _balances[msg.sender].sub(_amount); - stakingToken.safeTransfer(msg.sender, _amount); - } -} \ No newline at end of file diff --git a/contracts/savings/BoostedSavingsVault.sol b/contracts/savings/BoostedSavingsVault.sol new file mode 100644 index 00000000..3a09deb9 --- /dev/null +++ b/contracts/savings/BoostedSavingsVault.sol @@ -0,0 +1,589 @@ +// SPDX-License-Identifier: AGPL-3.0-or-later +pragma solidity 0.8.0; + +// Internal +import { IBoostedVaultWithLockup } from "../interfaces/IBoostedVaultWithLockup.sol"; +import { + InitializableRewardsDistributionRecipient +} from "../rewards/InitializableRewardsDistributionRecipient.sol"; +import { BoostedTokenWrapper } from "./BoostedTokenWrapper.sol"; +import { Initializable } from "../shared/@openzeppelin-2.5/Initializable.sol"; + +// Libs +import { + IERC20, + SafeERC20 +} from "@openzeppelin/contracts-sol8/contracts/token/ERC20/SafeERC20.sol"; +import { SafeCast } from "@openzeppelin/contracts-sol8/contracts/utils/SafeCast.sol"; +import { StableMath } from "../shared/StableMath.sol"; + +/** + * @title BoostedSavingsVault + * @author mStable + * @notice Accrues rewards second by second, based on a users boosted balance + * @dev Forked from rewards/staking/StakingRewards.sol + * Changes: + * - Lockup implemented in `updateReward` hook (20% unlock immediately, 80% locked for 6 months) + * - `updateBoost` hook called after every external action to reset a users boost + * - Struct packing of common data + * - Searching for and claiming of unlocked rewards + */ +contract BoostedSavingsVault is + IBoostedVaultWithLockup, + Initializable, + InitializableRewardsDistributionRecipient, + BoostedTokenWrapper +{ + using SafeERC20 for IERC20; + using StableMath for uint256; + using SafeCast for uint256; + + event RewardAdded(uint256 reward); + event Staked(address indexed user, uint256 amount, address payer); + event Withdrawn(address indexed user, uint256 amount); + event Poked(address indexed user); + event RewardPaid(address indexed user, uint256 reward); + + IERC20 public immutable rewardsToken; + + uint64 public constant DURATION = 7 days; + // Length of token lockup, after rewards are earned + uint256 public constant LOCKUP = 26 weeks; + // Percentage of earned tokens unlocked immediately + uint64 public constant UNLOCK = 2e17; + + // Timestamp for current period finish + uint256 public periodFinish; + // RewardRate for the rest of the PERIOD + uint256 public rewardRate; + // Last time any user took action + uint256 public lastUpdateTime; + // Ever increasing rewardPerToken rate, based on % of total supply + uint256 public rewardPerTokenStored; + mapping(address => UserData) public userData; + // Locked reward tracking + mapping(address => Reward[]) public userRewards; + mapping(address => uint64) public userClaim; + + struct UserData { + uint128 rewardPerTokenPaid; + uint128 rewards; + uint64 lastAction; + uint64 rewardCount; + } + + struct Reward { + uint64 start; + uint64 finish; + uint128 rate; + } + + constructor( + address _nexus, + address _stakingToken, + address _stakingContract, + uint256 _priceCoeff, + address _rewardsToken + ) + InitializableRewardsDistributionRecipient(_nexus) + BoostedTokenWrapper(_stakingToken, _stakingContract, _priceCoeff) + { + rewardsToken = IERC20(_rewardsToken); + } + + /** + * @dev StakingRewards is a TokenWrapper and RewardRecipient + * Constants added to bytecode at deployTime to reduce SLOAD cost + */ + function initialize(address _rewardsDistributor) external initializer { + InitializableRewardsDistributionRecipient._initialize(_rewardsDistributor); + BoostedTokenWrapper._initialize(); + } + + /** + * @dev Updates the reward for a given address, before executing function. + * Locks 80% of new rewards up for 6 months, vesting linearly from (time of last action + 6 months) to + * (now + 6 months). This allows rewards to be distributed close to how they were accrued, as opposed + * to locking up for a flat 6 months from the time of this fn call (allowing more passive accrual). + */ + modifier updateReward(address _account) { + uint256 currentTime = block.timestamp; + uint64 currentTime64 = SafeCast.toUint64(currentTime); + + // Setting of global vars + (uint256 newRewardPerToken, uint256 lastApplicableTime) = _rewardPerToken(); + // If statement protects against loss in initialisation case + if (newRewardPerToken > 0) { + rewardPerTokenStored = newRewardPerToken; + lastUpdateTime = lastApplicableTime; + + // Setting of personal vars based on new globals + if (_account != address(0)) { + UserData memory data = userData[_account]; + uint256 earned_ = _earned(_account, data.rewardPerTokenPaid, newRewardPerToken); + + // If earned == 0, then it must either be the initial stake, or an action in the + // same block, since new rewards unlock after each block. + if (earned_ > 0) { + uint256 unlocked = earned_.mulTruncate(UNLOCK); + uint256 locked = earned_ - unlocked; + + userRewards[_account].push( + Reward({ + start: SafeCast.toUint64(LOCKUP + data.lastAction), + finish: SafeCast.toUint64(LOCKUP + currentTime), + rate: SafeCast.toUint128(locked / (currentTime - data.lastAction)) + }) + ); + + userData[_account] = UserData({ + rewardPerTokenPaid: SafeCast.toUint128(newRewardPerToken), + rewards: SafeCast.toUint128(unlocked + data.rewards), + lastAction: currentTime64, + rewardCount: data.rewardCount + 1 + }); + } else { + userData[_account] = UserData({ + rewardPerTokenPaid: SafeCast.toUint128(newRewardPerToken), + rewards: data.rewards, + lastAction: currentTime64, + rewardCount: data.rewardCount + }); + } + } + } else if (_account != address(0)) { + // This should only be hit once, for first staker in initialisation case + userData[_account].lastAction = currentTime64; + } + _; + } + + /** @dev Updates the boost for a given address, after the rest of the function has executed */ + modifier updateBoost(address _account) { + _; + _setBoost(_account); + } + + /*************************************** + ACTIONS - EXTERNAL + ****************************************/ + + /** + * @dev Stakes a given amount of the StakingToken for the sender + * @param _amount Units of StakingToken + */ + function stake(uint256 _amount) + external + override + updateReward(msg.sender) + updateBoost(msg.sender) + { + _stake(msg.sender, _amount); + } + + /** + * @dev Stakes a given amount of the StakingToken for a given beneficiary + * @param _beneficiary Staked tokens are credited to this address + * @param _amount Units of StakingToken + */ + function stake(address _beneficiary, uint256 _amount) + external + override + updateReward(_beneficiary) + updateBoost(_beneficiary) + { + _stake(_beneficiary, _amount); + } + + /** + * @dev Withdraws stake from pool and claims any unlocked rewards. + * Note, this function is costly - the args for _claimRewards + * should be determined off chain and then passed to other fn + */ + function exit() external override updateReward(msg.sender) updateBoost(msg.sender) { + _withdraw(rawBalanceOf(msg.sender)); + (uint256 first, uint256 last) = _unclaimedEpochs(msg.sender); + _claimRewards(first, last); + } + + /** + * @dev Withdraws stake from pool and claims any unlocked rewards. + * @param _first Index of the first array element to claim + * @param _last Index of the last array element to claim + */ + function exit(uint256 _first, uint256 _last) + external + override + updateReward(msg.sender) + updateBoost(msg.sender) + { + _withdraw(rawBalanceOf(msg.sender)); + _claimRewards(_first, _last); + } + + /** + * @dev Withdraws given stake amount from the pool + * @param _amount Units of the staked token to withdraw + */ + function withdraw(uint256 _amount) + external + override + updateReward(msg.sender) + updateBoost(msg.sender) + { + _withdraw(_amount); + } + + /** + * @dev Claims only the tokens that have been immediately unlocked, not including + * those that are in the lockers. + */ + function claimReward() external override updateReward(msg.sender) updateBoost(msg.sender) { + uint256 unlocked = userData[msg.sender].rewards; + userData[msg.sender].rewards = 0; + + if (unlocked > 0) { + rewardsToken.safeTransfer(msg.sender, unlocked); + emit RewardPaid(msg.sender, unlocked); + } + } + + /** + * @dev Claims all unlocked rewards for sender. + * Note, this function is costly - the args for _claimRewards + * should be determined off chain and then passed to other fn + */ + function claimRewards() external override updateReward(msg.sender) updateBoost(msg.sender) { + (uint256 first, uint256 last) = _unclaimedEpochs(msg.sender); + + _claimRewards(first, last); + } + + /** + * @dev Claims all unlocked rewards for sender. Both immediately unlocked + * rewards and also locked rewards past their time lock. + * @param _first Index of the first array element to claim + * @param _last Index of the last array element to claim + */ + function claimRewards(uint256 _first, uint256 _last) + external + override + updateReward(msg.sender) + updateBoost(msg.sender) + { + _claimRewards(_first, _last); + } + + /** + * @dev Pokes a given account to reset the boost + */ + function pokeBoost(address _account) + external + override + updateReward(_account) + updateBoost(_account) + { + emit Poked(_account); + } + + /*************************************** + ACTIONS - INTERNAL + ****************************************/ + + /** + * @dev Claims all unlocked rewards for sender. Both immediately unlocked + * rewards and also locked rewards past their time lock. + * @param _first Index of the first array element to claim + * @param _last Index of the last array element to claim + */ + function _claimRewards(uint256 _first, uint256 _last) internal { + (uint256 unclaimed, uint256 lastTimestamp) = _unclaimedRewards(msg.sender, _first, _last); + userClaim[msg.sender] = uint64(lastTimestamp); + + uint256 unlocked = userData[msg.sender].rewards; + userData[msg.sender].rewards = 0; + + uint256 total = unclaimed + unlocked; + + if (total > 0) { + rewardsToken.safeTransfer(msg.sender, total); + + emit RewardPaid(msg.sender, total); + } + } + + /** + * @dev Internally stakes an amount by depositing from sender, + * and crediting to the specified beneficiary + * @param _beneficiary Staked tokens are credited to this address + * @param _amount Units of StakingToken + */ + function _stake(address _beneficiary, uint256 _amount) internal { + require(_amount > 0, "Cannot stake 0"); + require(_beneficiary != address(0), "Invalid beneficiary address"); + + _stakeRaw(_beneficiary, _amount); + emit Staked(_beneficiary, _amount, msg.sender); + } + + /** + * @dev Withdraws raw units from the sender + * @param _amount Units of StakingToken + */ + function _withdraw(uint256 _amount) internal { + require(_amount > 0, "Cannot withdraw 0"); + _withdrawRaw(_amount); + emit Withdrawn(msg.sender, _amount); + } + + /*************************************** + GETTERS + ****************************************/ + + /** + * @dev Gets the RewardsToken + */ + function getRewardToken() external view override returns (IERC20) { + return rewardsToken; + } + + /** + * @dev Gets the last applicable timestamp for this reward period + */ + function lastTimeRewardApplicable() public view override returns (uint256) { + return StableMath.min(block.timestamp, periodFinish); + } + + /** + * @dev Calculates the amount of unclaimed rewards per token since last update, + * and sums with stored to give the new cumulative reward per token + * @return 'Reward' per staked token + */ + function rewardPerToken() public view override returns (uint256) { + (uint256 rewardPerToken_, ) = _rewardPerToken(); + return rewardPerToken_; + } + + function _rewardPerToken() + internal + view + returns (uint256 rewardPerToken_, uint256 lastTimeRewardApplicable_) + { + uint256 lastApplicableTime = lastTimeRewardApplicable(); // + 1 SLOAD + uint256 timeDelta = lastApplicableTime - lastUpdateTime; // + 1 SLOAD + // If this has been called twice in the same block, shortcircuit to reduce gas + if (timeDelta == 0) { + return (rewardPerTokenStored, lastApplicableTime); + } + // new reward units to distribute = rewardRate * timeSinceLastUpdate + uint256 rewardUnitsToDistribute = rewardRate * timeDelta; // + 1 SLOAD + uint256 supply = totalSupply(); // + 1 SLOAD + // If there is no StakingToken liquidity, avoid div(0) + // If there is nothing to distribute, short circuit + if (supply == 0 || rewardUnitsToDistribute == 0) { + return (rewardPerTokenStored, lastApplicableTime); + } + // new reward units per token = (rewardUnitsToDistribute * 1e18) / totalTokens + uint256 unitsToDistributePerToken = rewardUnitsToDistribute.divPrecisely(supply); + // return summed rate + return (rewardPerTokenStored + unitsToDistributePerToken, lastApplicableTime); // + 1 SLOAD + } + + /** + * @dev Returned the units of IMMEDIATELY claimable rewards a user has to receive. Note - this + * does NOT include the majority of rewards which will be locked up. + * @param _account User address + * @return Total reward amount earned + */ + function earned(address _account) public view override returns (uint256) { + uint256 newEarned = + _earned(_account, userData[_account].rewardPerTokenPaid, rewardPerToken()); + uint256 immediatelyUnlocked = newEarned.mulTruncate(UNLOCK); + return immediatelyUnlocked + userData[_account].rewards; + } + + /** + * @dev Calculates all unclaimed reward data, finding both immediately unlocked rewards + * and those that have passed their time lock. + * @param _account User address + * @return amount Total units of unclaimed rewards + * @return first Index of the first userReward that has unlocked + * @return last Index of the last userReward that has unlocked + */ + function unclaimedRewards(address _account) + external + view + override + returns ( + uint256 amount, + uint256 first, + uint256 last + ) + { + (first, last) = _unclaimedEpochs(_account); + (uint256 unlocked, ) = _unclaimedRewards(_account, first, last); + amount = unlocked + earned(_account); + } + + /** @dev Returns only the most recently earned rewards */ + function _earned( + address _account, + uint256 _userRewardPerTokenPaid, + uint256 _currentRewardPerToken + ) internal view returns (uint256) { + // current rate per token - rate user previously received + uint256 userRewardDelta = _currentRewardPerToken - _userRewardPerTokenPaid; // + 1 SLOAD + // Short circuit if there is nothing new to distribute + if (userRewardDelta == 0) { + return 0; + } + // new reward = staked tokens * difference in rate + uint256 userNewReward = balanceOf(_account).mulTruncate(userRewardDelta); // + 1 SLOAD + // add to previous rewards + return userNewReward; + } + + /** + * @dev Gets the first and last indexes of array elements containing unclaimed rewards + */ + function _unclaimedEpochs(address _account) + internal + view + returns (uint256 first, uint256 last) + { + uint64 lastClaim = userClaim[_account]; + + uint256 firstUnclaimed = _findFirstUnclaimed(lastClaim, _account); + uint256 lastUnclaimed = _findLastUnclaimed(_account); + + return (firstUnclaimed, lastUnclaimed); + } + + /** + * @dev Sums the cumulative rewards from a valid range + */ + function _unclaimedRewards( + address _account, + uint256 _first, + uint256 _last + ) internal view returns (uint256 amount, uint256 latestTimestamp) { + uint256 currentTime = block.timestamp; + uint64 lastClaim = userClaim[_account]; + + // Check for no rewards unlocked + uint256 totalLen = userRewards[_account].length; + if (_first == 0 && _last == 0) { + if (totalLen == 0 || currentTime <= userRewards[_account][0].start) { + return (0, currentTime); + } + } + // If there are previous unlocks, check for claims that would leave them untouchable + if (_first > 0) { + require( + lastClaim >= userRewards[_account][_first - 1].finish, + "Invalid _first arg: Must claim earlier entries" + ); + } + + uint256 count = _last - _first + 1; + for (uint256 i = 0; i < count; i++) { + uint256 id = _first + i; + Reward memory rwd = userRewards[_account][id]; + + require(currentTime >= rwd.start && lastClaim <= rwd.finish, "Invalid epoch"); + + uint256 endTime = StableMath.min(rwd.finish, currentTime); + uint256 startTime = StableMath.max(rwd.start, lastClaim); + uint256 unclaimed = (endTime - startTime) * rwd.rate; + + amount += unclaimed; + } + + // Calculate last relevant timestamp here to allow users to avoid issue of OOG errors + // by claiming rewards in batches. + latestTimestamp = StableMath.min(currentTime, userRewards[_account][_last].finish); + } + + /** + * @dev Uses binarysearch to find the unclaimed lockups for a given account + */ + function _findFirstUnclaimed(uint64 _lastClaim, address _account) + internal + view + returns (uint256 first) + { + uint256 len = userRewards[_account].length; + if (len == 0) return 0; + // Binary search + uint256 min = 0; + uint256 max = len - 1; + // Will be always enough for 128-bit numbers + for (uint256 i = 0; i < 128; i++) { + if (min >= max) break; + uint256 mid = (min + max + 1) / 2; + if (_lastClaim > userRewards[_account][mid].start) { + min = mid; + } else { + max = mid - 1; + } + } + return min; + } + + /** + * @dev Uses binarysearch to find the unclaimed lockups for a given account + */ + function _findLastUnclaimed(address _account) internal view returns (uint256 first) { + uint256 len = userRewards[_account].length; + if (len == 0) return 0; + // Binary search + uint256 min = 0; + uint256 max = len - 1; + // Will be always enough for 128-bit numbers + for (uint256 i = 0; i < 128; i++) { + if (min >= max) break; + uint256 mid = (min + max + 1) / 2; + if (block.timestamp > userRewards[_account][mid].start) { + min = mid; + } else { + max = mid - 1; + } + } + return min; + } + + /*************************************** + ADMIN + ****************************************/ + + /** + * @dev Notifies the contract that new rewards have been added. + * Calculates an updated rewardRate based on the rewards in period. + * @param _reward Units of RewardToken that have been added to the pool + */ + function notifyRewardAmount(uint256 _reward) + external + override + onlyRewardsDistributor + updateReward(address(0)) + { + require(_reward < 1e24, "Cannot notify with more than a million units"); + + uint256 currentTime = block.timestamp; + // If previous period over, reset rewardRate + if (currentTime >= periodFinish) { + rewardRate = _reward / DURATION; + } + // If additional reward to existing period, calc sum + else { + uint256 remaining = periodFinish - currentTime; + uint256 leftover = remaining * rewardRate; + rewardRate = (_reward + leftover) / DURATION; + } + + lastUpdateTime = currentTime; + periodFinish = currentTime + DURATION; + + emit RewardAdded(_reward); + } +} diff --git a/contracts/savings/BoostedTokenWrapper.sol b/contracts/savings/BoostedTokenWrapper.sol new file mode 100644 index 00000000..700c4ebc --- /dev/null +++ b/contracts/savings/BoostedTokenWrapper.sol @@ -0,0 +1,172 @@ +// SPDX-License-Identifier: AGPL-3.0-or-later +pragma solidity 0.8.0; + +// Internal +import { IIncentivisedVotingLockup } from "../interfaces/IIncentivisedVotingLockup.sol"; + +// Libs +import { + SafeERC20, + IERC20 +} from "@openzeppelin/contracts-sol8/contracts/token/ERC20/SafeERC20.sol"; +import { InitializableReentrancyGuard } from "../shared/InitializableReentrancyGuard.sol"; +import { StableMath } from "../shared/StableMath.sol"; +import { Root } from "../shared/Root.sol"; + +/** + * @title BoostedTokenWrapper + * @author mStable + * @notice Wrapper to facilitate tracking of staked balances, applying a boost + * @dev Forked from rewards/staking/StakingTokenWrapper.sol + * Changes: + * - Adding `_boostedBalances` and `_totalBoostedSupply` + * - Implemting of a `_setBoost` hook to calculate/apply a users boost + */ +contract BoostedTokenWrapper is InitializableReentrancyGuard { + using StableMath for uint256; + using SafeERC20 for IERC20; + + IERC20 public immutable stakingToken; + // mStable MTA Staking contract + IIncentivisedVotingLockup public immutable stakingContract; + + uint256 private _totalBoostedSupply; + mapping(address => uint256) private _boostedBalances; + mapping(address => uint256) private _rawBalances; + + // Vars for use in the boost calculations + uint256 private constant MIN_DEPOSIT = 1e18; + uint256 private constant MAX_BOOST = 15e17; + uint256 private constant MIN_BOOST = 5e17; + uint8 private constant BOOST_COEFF = 60; + + uint256 private immutable priceCoeff; + + /** + * @dev TokenWrapper constructor + * @param _stakingToken Wrapped token to be staked + * @param _stakingContract mStable MTA Staking contract + * @param _priceCoeff Rough price of a given LP token, to be used in boost calculations, where $1 = 1e18 + */ + constructor( + address _stakingToken, + address _stakingContract, + uint256 _priceCoeff + ) { + stakingToken = IERC20(_stakingToken); + stakingContract = IIncentivisedVotingLockup(_stakingContract); + priceCoeff = _priceCoeff; + } + + function _initialize() internal { + _initializeReentrancyGuard(); + } + + /** + * @dev Get the total boosted amount + * @return uint256 total supply + */ + function totalSupply() public view returns (uint256) { + return _totalBoostedSupply; + } + + /** + * @dev Get the boosted balance of a given account + * @param _account User for which to retrieve balance + */ + function balanceOf(address _account) public view returns (uint256) { + return _boostedBalances[_account]; + } + + /** + * @dev Get the RAW balance of a given account + * @param _account User for which to retrieve balance + */ + function rawBalanceOf(address _account) public view returns (uint256) { + return _rawBalances[_account]; + } + + /** + * @dev Read the boost for the given address + * @param _account User for which to return the boost + * @return boost where 1x == 1e18 + */ + function getBoost(address _account) public view returns (uint256) { + return balanceOf(_account).divPrecisely(rawBalanceOf(_account)); + } + + /** + * @dev Deposits a given amount of StakingToken from sender + * @param _amount Units of StakingToken + */ + function _stakeRaw(address _beneficiary, uint256 _amount) internal nonReentrant { + _rawBalances[_beneficiary] += _amount; + stakingToken.safeTransferFrom(msg.sender, address(this), _amount); + } + + /** + * @dev Withdraws a given stake from sender + * @param _amount Units of StakingToken + */ + function _withdrawRaw(uint256 _amount) internal nonReentrant { + _rawBalances[msg.sender] -= _amount; + stakingToken.safeTransfer(msg.sender, _amount); + } + + /** + * @dev Updates the boost for the given address according to the formula + * boost = min(0.5 + c * vMTA_balance / imUSD_locked^(7/8), 1.5) + * If rawBalance <= MIN_DEPOSIT, boost is 0 + * @param _account User for which to update the boost + */ + function _setBoost(address _account) internal { + uint256 rawBalance = _rawBalances[_account]; + uint256 boostedBalance = _boostedBalances[_account]; + uint256 boost = MIN_BOOST; + + // Check whether balance is sufficient + // is_boosted is used to minimize gas usage + uint256 scaledBalance = (rawBalance * priceCoeff) / 1e18; + if (scaledBalance >= MIN_DEPOSIT) { + uint256 votingWeight = stakingContract.balanceOf(_account); + boost = _computeBoost(scaledBalance, votingWeight); + } + + uint256 newBoostedBalance = rawBalance.mulTruncate(boost); + + if (newBoostedBalance != boostedBalance) { + _totalBoostedSupply = _totalBoostedSupply - boostedBalance + newBoostedBalance; + _boostedBalances[_account] = newBoostedBalance; + } + } + + /** + * @dev Computes the boost for + * boost = min(0.5 + c * voting_weight / deposit^(7/8), 1.5) + * @param _scaledDeposit deposit amount in terms of USD + */ + function _computeBoost(uint256 _scaledDeposit, uint256 _votingWeight) + private + pure + returns (uint256 boost) + { + if (_votingWeight == 0) return MIN_BOOST; + + // Compute balance to the power 7/8 + // if price is $0.10, do sqrt(_deposit * 1e5) + // if price is $1.00, do sqrt(_deposit * 1e6) + // if price is $10000.00, do sqrt(_deposit * 1e9) + uint256 denominator = Root.sqrt(Root.sqrt(Root.sqrt(_scaledDeposit * 1e6))); + denominator = + denominator * + denominator * + denominator * + denominator * + denominator * + denominator * + denominator; + denominator /= 1e3; + boost = (((_votingWeight * BOOST_COEFF) / 10) * 1e18) / denominator; + boost = StableMath.min(MIN_BOOST + boost, MAX_BOOST); + } +} diff --git a/contracts/savings/SavingsContract.sol b/contracts/savings/SavingsContract.sol index 5a3b0247..b4f7f190 100644 --- a/contracts/savings/SavingsContract.sol +++ b/contracts/savings/SavingsContract.sol @@ -1,60 +1,99 @@ -pragma solidity 0.5.16; +// SPDX-License-Identifier: AGPL-3.0-or-later +pragma solidity 0.8.0; // External import { ISavingsManager } from "../interfaces/ISavingsManager.sol"; // Internal -import { ISavingsContract } from "../interfaces/ISavingsContract.sol"; -import { Module } from "../shared/Module.sol"; +import { ISavingsContractV2 } from "../interfaces/ISavingsContract.sol"; +import { InitializableToken } from "../shared/InitializableToken.sol"; +import { ImmutableModule } from "../shared/ImmutableModule.sol"; +import { IConnector } from "./peripheral/IConnector.sol"; +import { Initializable } from "../shared/@openzeppelin-2.5/Initializable.sol"; // Libs -import { IERC20 } from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; -import { SafeMath } from "@openzeppelin/contracts/math/SafeMath.sol"; +import { IERC20 } from "@openzeppelin/contracts-sol8/contracts/token/ERC20/IERC20.sol"; import { StableMath } from "../shared/StableMath.sol"; - /** * @title SavingsContract - * @author Stability Labs Pty. Ltd. + * @author mStable * @notice Savings contract uses the ever increasing "exchangeRate" to increase - * the value of the Savers "credits" relative to the amount of additional + * the value of the Savers "credits" (ERC20) relative to the amount of additional * underlying collateral that has been deposited into this contract ("interest") - * @dev VERSION: 1.0 - * DATE: 2020-03-28 + * @dev VERSION: 2.0 + * DATE: 2020-12-15 */ -contract SavingsContract is ISavingsContract, Module { - - using SafeMath for uint256; +contract SavingsContract is ISavingsContractV2, Initializable, InitializableToken, ImmutableModule { using StableMath for uint256; // Core events for depositing and withdrawing event ExchangeRateUpdated(uint256 newExchangeRate, uint256 interestCollected); event SavingsDeposited(address indexed saver, uint256 savingsDeposited, uint256 creditsIssued); - event CreditsRedeemed(address indexed redeemer, uint256 creditsRedeemed, uint256 savingsCredited); + event CreditsRedeemed( + address indexed redeemer, + uint256 creditsRedeemed, + uint256 savingsCredited + ); + event AutomaticInterestCollectionSwitched(bool automationEnabled); - // Underlying asset is mUSD - IERC20 private mUSD; - - // Amount of underlying savings in the contract - uint256 public totalSavings; - // Total number of savings credits issued - uint256 public totalCredits; - - // Rate between 'savings credits' and mUSD - // e.g. 1 credit (1e18) mulTruncate(exchangeRate) = mUSD, starts at 1:1 - // exchangeRate increases over time and is essentially a percentage based value - uint256 public exchangeRate = 1e18; - // Amount of credits for each saver - mapping(address => uint256) public creditBalances; - bool private automateInterestCollection = true; - - constructor(address _nexus, IERC20 _mUSD) - public - Module(_nexus) - { - require(address(_mUSD) != address(0), "mAsset address is zero"); - mUSD = _mUSD; + // Connector poking + event PokerUpdated(address poker); + + event FractionUpdated(uint256 fraction); + event ConnectorUpdated(address connector); + event EmergencyUpdate(); + + event Poked(uint256 oldBalance, uint256 newBalance, uint256 interestDetected); + event PokedRaw(); + + // Rate between 'savings credits' and underlying + // e.g. 1 credit (1e17) mulTruncate(exchangeRate) = underlying, starts at 10:1 + // exchangeRate increases over time + uint256 private constant startingRate = 1e17; + uint256 public override exchangeRate; + + // Underlying asset is underlying + IERC20 public immutable underlying; + bool private automateInterestCollection; + + // Yield + // Poker is responsible for depositing/withdrawing from connector + address public poker; + // Last time a poke was made + uint256 public lastPoke; + // Last known balance of the connector + uint256 public lastBalance; + // Fraction of capital assigned to the connector (100% = 1e18) + uint256 public fraction; + // Address of the current connector (all IConnectors are mStable validated) + IConnector public connector; + // How often do we allow pokes + uint256 private constant POKE_CADENCE = 4 hours; + // Max APY generated on the capital in the connector + uint256 private constant MAX_APY = 4e18; + uint256 private constant SECONDS_IN_YEAR = 365 days; + + constructor(address _nexus, address _underlying) ImmutableModule(_nexus) { + require(address(_underlying) != address(0), "mAsset address is zero"); + underlying = IERC20(_underlying); + } + + // Add these constants to bytecode at deploytime + function initialize( + address _poker, + string calldata _nameArg, + string calldata _symbolArg + ) external initializer { + InitializableToken._initialize(_nameArg, _symbolArg); + + require(_poker != address(0), "Invalid poker address"); + poker = _poker; + + fraction = 2e17; + automateInterestCollection = true; + exchangeRate = startingRate; } /** @dev Only the savings managaer (pulled from Nexus) can execute this */ @@ -63,13 +102,47 @@ contract SavingsContract is ISavingsContract, Module { _; } - /** @dev Enable or disable the automation of fee collection during deposit process */ - function automateInterestCollectionFlag(bool _enabled) + /*************************************** + VIEW - E + ****************************************/ + + /** + * @dev Returns the underlying balance of a given user + * @param _user Address of the user to check + * @return balance Units of underlying owned by the user + */ + function balanceOfUnderlying(address _user) external view override returns (uint256 balance) { + (balance, ) = _creditsToUnderlying(balanceOf(_user)); + } + + /** + * @dev Converts a given underlying amount into credits + * @param _underlying Units of underlying + * @return credits Credit units (a.k.a imUSD) + */ + function underlyingToCredits(uint256 _underlying) external - onlyGovernor + view + override + returns (uint256 credits) { - automateInterestCollection = _enabled; - emit AutomaticInterestCollectionSwitched(_enabled); + (credits, ) = _underlyingToCredits(_underlying); + } + + /** + * @dev Converts a given credit amount into underlying + * @param _credits Units of credits + * @return amount Corresponding underlying amount + */ + function creditsToUnderlying(uint256 _credits) external view override returns (uint256 amount) { + (amount, ) = _creditsToUnderlying(_credits); + } + + // Deprecated in favour of `balanceOf(address)` + // Maintained for backwards compatibility + // Returns the credit balance of a given user + function creditBalances(address _user) external view override returns (uint256) { + return balanceOf(_user); } /*************************************** @@ -83,66 +156,126 @@ contract SavingsContract is ISavingsContract, Module { * * @param _amount Units of underlying to add to the savings vault */ - function depositInterest(uint256 _amount) - external - onlySavingsManager - { + function depositInterest(uint256 _amount) external override onlySavingsManager { require(_amount > 0, "Must deposit something"); // Transfer the interest from sender to here - require(mUSD.transferFrom(msg.sender, address(this), _amount), "Must receive tokens"); - totalSavings = totalSavings.add(_amount); + require(underlying.transferFrom(msg.sender, address(this), _amount), "Must receive tokens"); // Calc new exchange rate, protect against initialisation case - if(totalCredits > 0) { - // new exchange rate is relationship between totalCredits & totalSavings - // totalCredits * exchangeRate = totalSavings - // exchangeRate = totalSavings/totalCredits - // e.g. (100e18 * 1e18) / 100e18 = 1e18 - // e.g. (101e20 * 1e18) / 100e20 = 1.01e18 - exchangeRate = totalSavings.divPrecisely(totalCredits); - - emit ExchangeRateUpdated(exchangeRate, _amount); + uint256 totalCredits = totalSupply(); + if (totalCredits > 0) { + // new exchange rate is relationship between _totalCredits & totalSavings + // _totalCredits * exchangeRate = totalSavings + // exchangeRate = totalSavings/_totalCredits + (uint256 totalCollat, ) = _creditsToUnderlying(totalCredits); + uint256 newExchangeRate = _calcExchangeRate(totalCollat + _amount, totalCredits); + exchangeRate = newExchangeRate; + + emit ExchangeRateUpdated(newExchangeRate, _amount); } } + /** @dev Enable or disable the automation of fee collection during deposit process */ + function automateInterestCollectionFlag(bool _enabled) external onlyGovernor { + automateInterestCollection = _enabled; + emit AutomaticInterestCollectionSwitched(_enabled); + } /*************************************** - SAVING + DEPOSIT ****************************************/ + /** + * @dev During a migration period, allow savers to deposit underlying here before the interest has been redirected + * @param _underlying Units of underlying to deposit into savings vault + * @param _beneficiary Immediately transfer the imUSD token to this beneficiary address + * @return creditsIssued Units of credits (imUSD) issued + */ + function preDeposit(uint256 _underlying, address _beneficiary) + external + returns (uint256 creditsIssued) + { + require(exchangeRate == startingRate, "Can only use this method before streaming begins"); + return _deposit(_underlying, _beneficiary, false); + } + /** * @dev Deposit the senders savings to the vault, and credit them internally with "credits". * Credit amount is calculated as a ratio of deposit amount and exchange rate: * credits = underlying / exchangeRate - * If automation is enabled, we will first update the internal exchange rate by - * collecting any interest generated on the underlying. - * @param _amount Units of underlying to deposit into savings vault - * @return creditsIssued Units of credits issued internally + * We will first update the internal exchange rate by collecting any interest generated on the underlying. + * @param _underlying Units of underlying to deposit into savings vault + * @return creditsIssued Units of credits (imUSD) issued */ - function depositSavings(uint256 _amount) + function depositSavings(uint256 _underlying) external override returns (uint256 creditsIssued) { + return _deposit(_underlying, msg.sender, true); + } + + /** + * @dev Deposit the senders savings to the vault, and credit them internally with "credits". + * Credit amount is calculated as a ratio of deposit amount and exchange rate: + * credits = underlying / exchangeRate + * We will first update the internal exchange rate by collecting any interest generated on the underlying. + * @param _underlying Units of underlying to deposit into savings vault + * @param _beneficiary Immediately transfer the imUSD token to this beneficiary address + * @return creditsIssued Units of credits (imUSD) issued + */ + function depositSavings(uint256 _underlying, address _beneficiary) external + override returns (uint256 creditsIssued) { - require(_amount > 0, "Must deposit something"); + return _deposit(_underlying, _beneficiary, true); + } - if(automateInterestCollection) { - // Collect recent interest generated by basket and update exchange rate - ISavingsManager(_savingsManager()).collectAndDistributeInterest(address(mUSD)); + /** + * @dev Internally deposit the _underlying from the sender and credit the beneficiary with new imUSD + */ + function _deposit( + uint256 _underlying, + address _beneficiary, + bool _collectInterest + ) internal returns (uint256 creditsIssued) { + require(_underlying > 0, "Must deposit something"); + require(_beneficiary != address(0), "Invalid beneficiary address"); + + // Collect recent interest generated by basket and update exchange rate + IERC20 mAsset = underlying; + if (_collectInterest) { + ISavingsManager(_savingsManager()).collectAndDistributeInterest(address(mAsset)); } // Transfer tokens from sender to here - require(mUSD.transferFrom(msg.sender, address(this), _amount), "Must receive tokens"); - totalSavings = totalSavings.add(_amount); + require(mAsset.transferFrom(msg.sender, address(this), _underlying), "Must receive tokens"); // Calc how many credits they receive based on currentRatio - creditsIssued = _massetToCredit(_amount); - totalCredits = totalCredits.add(creditsIssued); + (creditsIssued, ) = _underlyingToCredits(_underlying); - // add credits to balances - creditBalances[msg.sender] = creditBalances[msg.sender].add(creditsIssued); + // add credits to ERC20 balances + _mint(_beneficiary, creditsIssued); + + emit SavingsDeposited(_beneficiary, _underlying, creditsIssued); + } + + /*************************************** + REDEEM + ****************************************/ + + // Deprecated in favour of redeemCredits + // Maintaining backwards compatibility, this fn minimics the old redeem fn, in which + // credits are redeemed but the interest from the underlying is not collected. + function redeem(uint256 _credits) external override returns (uint256 massetReturned) { + require(_credits > 0, "Must withdraw something"); + + (, uint256 payout) = _redeem(_credits, true); + + // Collect recent interest generated by basket and update exchange rate + if (automateInterestCollection) { + ISavingsManager(_savingsManager()).collectAndDistributeInterest(address(underlying)); + } - emit SavingsDeposited(msg.sender, _amount, creditsIssued); + return payout; } /** @@ -152,53 +285,390 @@ contract SavingsContract is ISavingsContract, Module { * @param _credits Amount of credits to redeem * @return massetReturned Units of underlying mAsset paid out */ - function redeem(uint256 _credits) + function redeemCredits(uint256 _credits) external override returns (uint256 massetReturned) { + require(_credits > 0, "Must withdraw something"); + + // Collect recent interest generated by basket and update exchange rate + if (automateInterestCollection) { + ISavingsManager(_savingsManager()).collectAndDistributeInterest(address(underlying)); + } + + (, uint256 payout) = _redeem(_credits, true); + + return payout; + } + + /** + * @dev Redeem credits into a specific amount of underlying. + * Credits needed to burn is calculated using: + * credits = underlying / exchangeRate + * @param _underlying Amount of underlying to redeem + * @return creditsBurned Units of credits burned from sender + */ + function redeemUnderlying(uint256 _underlying) external - returns (uint256 massetReturned) + override + returns (uint256 creditsBurned) { - require(_credits > 0, "Must withdraw something"); + require(_underlying > 0, "Must withdraw something"); + + // Collect recent interest generated by basket and update exchange rate + if (automateInterestCollection) { + ISavingsManager(_savingsManager()).collectAndDistributeInterest(address(underlying)); + } - uint256 saverCredits = creditBalances[msg.sender]; - require(saverCredits >= _credits, "Saver has no credits"); + // Ensure that the payout was sufficient + (uint256 credits, uint256 massetReturned) = _redeem(_underlying, false); + require(massetReturned == _underlying, "Invalid output"); + + return credits; + } - creditBalances[msg.sender] = saverCredits.sub(_credits); - totalCredits = totalCredits.sub(_credits); + /** + * @dev Internally burn the credits and send the underlying to msg.sender + */ + function _redeem(uint256 _amt, bool _isCreditAmt) + internal + returns (uint256 creditsBurned, uint256 massetReturned) + { + // Centralise credit <> underlying calcs and minimise SLOAD count + uint256 credits_; + uint256 underlying_; + uint256 exchangeRate_; + // If the input is a credit amt, then calculate underlying payout and cache the exchangeRate + if (_isCreditAmt) { + credits_ = _amt; + (underlying_, exchangeRate_) = _creditsToUnderlying(_amt); + } + // If the input is in underlying, then calculate credits needed to burn + else { + underlying_ = _amt; + (credits_, exchangeRate_) = _underlyingToCredits(_amt); + } - // Calc payout based on currentRatio - massetReturned = _creditToMasset(_credits); - totalSavings = totalSavings.sub(massetReturned); + // Burn required credits from the sender FIRST + _burn(msg.sender, credits_); // Transfer tokens from here to sender - require(mUSD.transfer(msg.sender, massetReturned), "Must send tokens"); + require(underlying.transfer(msg.sender, underlying_), "Must send tokens"); + + // If this withdrawal pushes the portion of stored collateral in the `connector` over a certain + // threshold (fraction + 20%), then this should trigger a _poke on the connector. This is to avoid + // a situation in which there is a rush on withdrawals for some reason, causing the connector + // balance to go up and thus having too large an exposure. + CachedData memory cachedData = _cacheData(); + ConnectorStatus memory status = _getConnectorStatus(cachedData, exchangeRate_); + if (status.inConnector > status.limit) { + _poke(cachedData, false); + } + + emit CreditsRedeemed(msg.sender, credits_, underlying_); + + return (credits_, underlying_); + } + + struct ConnectorStatus { + // Limit is the max amount of units allowed in the connector + uint256 limit; + // Derived balance of the connector + uint256 inConnector; + } + + /** + * @dev Derives the units of collateral held in the connector + * @param _data Struct containing data on balances + * @param _exchangeRate Current system exchange rate + * @return status Contains max amount of assets allowed in connector + */ + function _getConnectorStatus(CachedData memory _data, uint256 _exchangeRate) + internal + pure + returns (ConnectorStatus memory) + { + // Total units of underlying collateralised + uint256 totalCollat = _data.totalCredits.mulTruncate(_exchangeRate); + // Max amount of underlying that can be held in the connector + uint256 limit = totalCollat.mulTruncate(_data.fraction + 2e17); + // Derives amount of underlying present in the connector + uint256 inConnector = _data.rawBalance >= totalCollat ? 0 : totalCollat - _data.rawBalance; + + return ConnectorStatus(limit, inConnector); + } + + /*************************************** + YIELD - E + ****************************************/ + + /** @dev Modifier allowing only the designated poker to execute the fn */ + modifier onlyPoker() { + require(msg.sender == poker, "Only poker can execute"); + _; + } + + /** + * @dev External poke function allows for the redistribution of collateral between here and the + * current connector, setting the ratio back to the defined optimal. + */ + function poke() external onlyPoker { + CachedData memory cachedData = _cacheData(); + _poke(cachedData, false); + } + + /** + * @dev Governance action to set the address of a new poker + * @param _newPoker Address of the new poker + */ + function setPoker(address _newPoker) external onlyGovernor { + require(_newPoker != address(0) && _newPoker != poker, "Invalid poker"); + + poker = _newPoker; + + emit PokerUpdated(_newPoker); + } + + /** + * @dev Governance action to set the percentage of assets that should be held + * in the connector. + * @param _fraction Percentage of assets that should be held there (where 20% == 2e17) + */ + function setFraction(uint256 _fraction) external onlyGovernor { + require(_fraction <= 5e17, "Fraction must be <= 50%"); + + fraction = _fraction; + + CachedData memory cachedData = _cacheData(); + _poke(cachedData, true); + + emit FractionUpdated(_fraction); + } + + /** + * @dev Governance action to set the address of a new connector, and move funds (if any) across. + * @param _newConnector Address of the new connector + */ + function setConnector(address _newConnector) external onlyGovernor { + // Withdraw all from previous by setting target = 0 + CachedData memory cachedData = _cacheData(); + cachedData.fraction = 0; + _poke(cachedData, true); + + // Set new connector + CachedData memory cachedDataNew = _cacheData(); + connector = IConnector(_newConnector); + _poke(cachedDataNew, true); + + emit ConnectorUpdated(_newConnector); + } + + /** + * @dev Governance action to perform an emergency withdraw of the assets in the connector, + * should it be the case that some or all of the liquidity is trapped in. This causes the total + * collateral in the system to go down, causing a hard refresh. + */ + function emergencyWithdraw(uint256 _withdrawAmount) external onlyGovernor { + // withdraw _withdrawAmount from connection + connector.withdraw(_withdrawAmount); + + // reset the connector + connector = IConnector(address(0)); + emit ConnectorUpdated(address(0)); - emit CreditsRedeemed(msg.sender, _credits, massetReturned); + // set fraction to 0 + fraction = 0; + emit FractionUpdated(0); + + // check total collateralisation of credits + CachedData memory data = _cacheData(); + // use rawBalance as the remaining liquidity in the connector is now written off + _refreshExchangeRate(data.rawBalance, data.totalCredits, true); + + emit EmergencyUpdate(); + } + + /*************************************** + YIELD - I + ****************************************/ + + /** @dev Internal poke function to keep the balance between connector and raw balance healthy */ + function _poke(CachedData memory _data, bool _ignoreCadence) internal { + require(_data.totalCredits > 0, "Must have something to poke"); + + // 1. Verify that poke cadence is valid, unless this is a manual action by governance + uint256 currentTime = uint256(block.timestamp); + uint256 timeSinceLastPoke = currentTime - lastPoke; + require(_ignoreCadence || timeSinceLastPoke > POKE_CADENCE, "Not enough time elapsed"); + lastPoke = currentTime; + + // If there is a connector, check the balance and settle to the specified fraction % + IConnector connector_ = connector; + if (address(connector_) != address(0)) { + // 2. Check and verify new connector balance + uint256 lastBalance_ = lastBalance; + uint256 connectorBalance = connector_.checkBalance(); + // Always expect the collateral in the connector to increase in value + require(connectorBalance >= lastBalance_, "Invalid yield"); + if (connectorBalance > 0) { + // Validate the collection by ensuring that the APY is not ridiculous + _validateCollection( + connectorBalance, + connectorBalance - lastBalance_, + timeSinceLastPoke + ); + } + + // 3. Level the assets to Fraction (connector) & 100-fraction (raw) + uint256 sum = _data.rawBalance + connectorBalance; + uint256 ideal = sum.mulTruncate(_data.fraction); + // If there is not enough mAsset in the connector, then deposit + if (ideal > connectorBalance) { + uint256 deposit = ideal - connectorBalance; + underlying.approve(address(connector_), deposit); + connector_.deposit(deposit); + } + // Else withdraw, if there is too much mAsset in the connector + else if (connectorBalance > ideal) { + // If fraction == 0, then withdraw everything + if (ideal == 0) { + connector_.withdrawAll(); + sum = IERC20(underlying).balanceOf(address(this)); + } else { + connector_.withdraw(connectorBalance - ideal); + } + } + // Else ideal == connectorBalance (e.g. 0), do nothing + require(connector_.checkBalance() >= ideal, "Enforce system invariant"); + + // 4i. Refresh exchange rate and emit event + lastBalance = ideal; + _refreshExchangeRate(sum, _data.totalCredits, false); + emit Poked(lastBalance_, ideal, connectorBalance - lastBalance_); + } else { + // 4ii. Refresh exchange rate and emit event + lastBalance = 0; + _refreshExchangeRate(_data.rawBalance, _data.totalCredits, false); + emit PokedRaw(); + } + } + + /** + * @dev Internal fn to refresh the exchange rate, based on the sum of collateral and the number of credits + * @param _realSum Sum of collateral held by the contract + * @param _totalCredits Total number of credits in the system + * @param _ignoreValidation This is for use in the emergency situation, and ignores a decreasing exchangeRate + */ + function _refreshExchangeRate( + uint256 _realSum, + uint256 _totalCredits, + bool _ignoreValidation + ) internal { + // Based on the current exchange rate, how much underlying is collateralised? + (uint256 totalCredited, ) = _creditsToUnderlying(_totalCredits); + + // Require the amount of capital held to be greater than the previously credited units + require(_ignoreValidation || _realSum >= totalCredited, "ExchangeRate must increase"); + // Work out the new exchange rate based on the current capital + uint256 newExchangeRate = _calcExchangeRate(_realSum, _totalCredits); + exchangeRate = newExchangeRate; + + emit ExchangeRateUpdated( + newExchangeRate, + _realSum > totalCredited ? _realSum - totalCredited : 0 + ); + } + + /** + * FORKED DIRECTLY FROM SAVINGSMANAGER.sol + * --------------------------------------- + * @dev Validates that an interest collection does not exceed a maximum APY. If last collection + * was under 30 mins ago, simply check it does not exceed 10bps + * @param _newBalance New balance of the underlying + * @param _interest Increase in total supply since last collection + * @param _timeSinceLastCollection Seconds since last collection + */ + function _validateCollection( + uint256 _newBalance, + uint256 _interest, + uint256 _timeSinceLastCollection + ) internal pure returns (uint256 extrapolatedAPY) { + // Protect against division by 0 + uint256 protectedTime = StableMath.max(1, _timeSinceLastCollection); + + uint256 oldSupply = _newBalance - _interest; + uint256 percentageIncrease = _interest.divPrecisely(oldSupply); + + uint256 yearsSinceLastCollection = protectedTime.divPrecisely(SECONDS_IN_YEAR); + + extrapolatedAPY = percentageIncrease.divPrecisely(yearsSinceLastCollection); + + if (protectedTime > 30 minutes) { + require(extrapolatedAPY < MAX_APY, "Interest protected from inflating past maxAPY"); + } else { + require(percentageIncrease < 1e15, "Interest protected from inflating past 10 Bps"); + } + } + + /*************************************** + VIEW - I + ****************************************/ + + struct CachedData { + // SLOAD from 'fraction' + uint256 fraction; + // ERC20 balance of underlying, held by this contract + // underlying.balanceOf(address(this)) + uint256 rawBalance; + // totalSupply() + uint256 totalCredits; + } + + /** + * @dev Retrieves generic data to avoid duplicate SLOADs + */ + function _cacheData() internal view returns (CachedData memory) { + uint256 balance = underlying.balanceOf(address(this)); + return CachedData(fraction, balance, totalSupply()); } /** * @dev Converts masset amount into credits based on exchange rate - * c = masset / exchangeRate + * c = (masset / exchangeRate) + 1 */ - function _massetToCredit(uint256 _amount) + function _underlyingToCredits(uint256 _underlying) internal view - returns (uint256 credits) + returns (uint256 credits, uint256 exchangeRate_) { // e.g. (1e20 * 1e18) / 1e18 = 1e20 // e.g. (1e20 * 1e18) / 14e17 = 7.1429e19 - credits = _amount.divPrecisely(exchangeRate); + // e.g. 1 * 1e18 / 1e17 + 1 = 11 => 11 * 1e17 / 1e18 = 1.1e18 / 1e18 = 1 + exchangeRate_ = exchangeRate; + credits = _underlying.divPrecisely(exchangeRate_) + 1; } /** - * @dev Converts masset amount into credits based on exchange rate + * @dev Works out a new exchange rate, given an amount of collateral and total credits + * e = underlying / (credits-1) + */ + function _calcExchangeRate(uint256 _totalCollateral, uint256 _totalCredits) + internal + pure + returns (uint256 _exchangeRate) + { + _exchangeRate = _totalCollateral.divPrecisely(_totalCredits - 1); + } + + /** + * @dev Converts credit amount into masset based on exchange rate * m = credits * exchangeRate */ - function _creditToMasset(uint256 _credits) + function _creditsToUnderlying(uint256 _credits) internal view - returns (uint256 massetAmount) + returns (uint256 underlyingAmount, uint256 exchangeRate_) { // e.g. (1e20 * 1e18) / 1e18 = 1e20 // e.g. (1e20 * 14e17) / 1e18 = 1.4e20 - massetAmount = _credits.mulTruncate(exchangeRate); + exchangeRate_ = exchangeRate; + underlyingAmount = _credits.mulTruncate(exchangeRate_); } } diff --git a/contracts/savings/SavingsManager.sol b/contracts/savings/SavingsManager.sol deleted file mode 100644 index ec1f420d..00000000 --- a/contracts/savings/SavingsManager.sol +++ /dev/null @@ -1,469 +0,0 @@ -pragma solidity 0.5.16; - -// External -import { IMasset } from "../interfaces/IMasset.sol"; -import { ISavingsContract } from "../interfaces/ISavingsContract.sol"; - -// Internal -import { ISavingsManager, IRevenueRecipient } from "../interfaces/ISavingsManager.sol"; -import { PausableModule } from "../shared/PausableModule.sol"; - -// Libs -import { IERC20 } from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; -import { SafeERC20 } from "@openzeppelin/contracts/token/ERC20/SafeERC20.sol"; -import { SafeMath } from "@openzeppelin/contracts/math/SafeMath.sol"; -import { StableMath } from "../shared/StableMath.sol"; - -/** - * @title SavingsManager - * @author Stability Labs Pty. Ltd. - * @notice Savings Manager collects interest from mAssets and sends them to the - * corresponding Savings Contract, performing some validation in the process. - * @dev VERSION: 1.3 - * DATE: 2020-12-09 - */ -contract SavingsManager is ISavingsManager, PausableModule { - - using SafeMath for uint256; - using StableMath for uint256; - using SafeERC20 for IERC20; - - - // Core admin events - event RevenueRecipientSet(address indexed mAsset, address recipient); - event SavingsContractAdded(address indexed mAsset, address savingsContract); - event SavingsContractUpdated(address indexed mAsset, address savingsContract); - event SavingsRateChanged(uint256 newSavingsRate); - event StreamsFrozen(); - // Interest collection - event LiquidatorDeposited(address indexed mAsset, uint256 amount); - event InterestCollected(address indexed mAsset, uint256 interest, uint256 newTotalSupply, uint256 apy); - event InterestDistributed(address indexed mAsset, uint256 amountSent); - event RevenueRedistributed(address indexed mAsset, address recipient, uint256 amount); - - // Locations of each mAsset savings contract - mapping(address => ISavingsContract) public savingsContracts; - mapping(address => IRevenueRecipient) public revenueRecipients; - // Time at which last collection was made - mapping(address => uint256) public lastPeriodStart; - mapping(address => uint256) public lastCollection; - mapping(address => uint256) public periodYield; - - // Amount of collected interest that will be sent to Savings Contract (100%) - uint256 private savingsRate = 1e18; - // Utils to help keep interest under check - uint256 constant private SECONDS_IN_YEAR = 365 days; - // Theoretical cap on APY to avoid excess inflation - uint256 constant private MAX_APY = 15e18; - uint256 constant private TEN_BPS = 1e15; - // Streaming liquidated tokens - uint256 private constant DURATION = 7 days; - uint256 private constant ONE_DAY = 1 days; - uint256 constant private THIRTY_MINUTES = 30 minutes; - // Streams - bool private streamsFrozen = false; - // Liquidator - mapping(address => Stream) public liqStream; - // Platform - mapping(address => Stream) public yieldStream; - // Batches are for the platformInterest collection - mapping(address => uint256) public lastBatchCollected; - - enum StreamType { - liquidator, - yield - } - - struct Stream { - uint256 end; - uint256 rate; - } - - constructor( - address _nexus, - address _mUSD, - address _savingsContract - ) - public - PausableModule(_nexus) - { - _updateSavingsContract(_mUSD, _savingsContract); - emit SavingsContractAdded(_mUSD, _savingsContract); - } - - modifier onlyLiquidator() { - require(msg.sender == _liquidator(), "Only liquidator can execute"); - _; - } - - modifier whenStreamsNotFrozen() { - require(!streamsFrozen, "Streaming is currently frozen"); - _; - } - - /*************************************** - STATE - ****************************************/ - - /** - * @dev Adds a new savings contract - * @param _mAsset Address of underlying mAsset - * @param _savingsContract Address of the savings contract - */ - function addSavingsContract(address _mAsset, address _savingsContract) - external - onlyGovernor - { - require(address(savingsContracts[_mAsset]) == address(0), "Savings contract already exists"); - _updateSavingsContract(_mAsset, _savingsContract); - emit SavingsContractAdded(_mAsset, _savingsContract); - } - - /** - * @dev Updates an existing savings contract - * @param _mAsset Address of underlying mAsset - * @param _savingsContract Address of the savings contract - */ - function updateSavingsContract(address _mAsset, address _savingsContract) - external - onlyGovernor - { - require(address(savingsContracts[_mAsset]) != address(0), "Savings contract does not exist"); - _updateSavingsContract(_mAsset, _savingsContract); - emit SavingsContractUpdated(_mAsset, _savingsContract); - } - - function _updateSavingsContract(address _mAsset, address _savingsContract) - internal - { - require(_mAsset != address(0) && _savingsContract != address(0), "Must be valid address"); - savingsContracts[_mAsset] = ISavingsContract(_savingsContract); - - IERC20(_mAsset).safeApprove(address(_savingsContract), 0); - IERC20(_mAsset).safeApprove(address(_savingsContract), uint256(-1)); - } - - /** - * @dev Freezes streaming of mAssets - */ - function freezeStreams() - external - onlyGovernor - whenStreamsNotFrozen - { - streamsFrozen = true; - - emit StreamsFrozen(); - } - - /** - * @dev Sets the revenue recipient address - * @param _mAsset Address of underlying mAsset - * @param _recipient Address of the recipient - */ - function setRevenueRecipient(address _mAsset, address _recipient) - external - onlyGovernor - { - revenueRecipients[_mAsset] = IRevenueRecipient(_recipient); - - emit RevenueRecipientSet(_mAsset, _recipient); - } - - - /** - * @dev Sets a new savings rate for interest distribution - * @param _savingsRate Rate of savings sent to SavingsContract (100% = 1e18) - */ - function setSavingsRate(uint256 _savingsRate) - external - onlyGovernor - { - // Greater than 60% upto 100% - require(_savingsRate >= 6e17 && _savingsRate <= 1e18, "Must be a valid rate"); - savingsRate = _savingsRate; - emit SavingsRateChanged(_savingsRate); - } - - /** - * @dev Allows the liquidator to deposit proceeds from iquidated gov tokens. - * Transfers proceeds on a second by second basis to the Savings Contract over 1 week. - * @param _mAsset The mAsset to transfer and distribute - * @param _liquidated Units of mAsset to distribute - */ - function depositLiquidation(address _mAsset, uint256 _liquidated) - external - whenNotPaused - onlyLiquidator - whenStreamsNotFrozen - { - // Collect existing interest to ensure everything is up to date - _collectAndDistributeInterest(_mAsset); - - // transfer liquidated mUSD to here - IERC20(_mAsset).safeTransferFrom(_liquidator(), address(this), _liquidated); - - uint256 leftover = _unstreamedRewards(_mAsset, StreamType.liquidator); - _initialiseStream(_mAsset, StreamType.liquidator, _liquidated.add(leftover), DURATION); - - emit LiquidatorDeposited(_mAsset, _liquidated); - } - - /** - * @dev Collects the platform interest from a given mAsset and then adds capital to the - * stream. If there is > 24h left in current stream, just top it up, otherwise reset. - * @param _mAsset The mAsset to fetch interest - */ - function collectAndStreamInterest(address _mAsset) - external - whenNotPaused - whenStreamsNotFrozen - { - // Collect existing interest to ensure everything is up to date - _collectAndDistributeInterest(_mAsset); - - uint256 currentTime = now; - uint256 previousBatch = lastBatchCollected[_mAsset]; - uint256 timeSincePreviousBatch = currentTime.sub(previousBatch); - require(timeSincePreviousBatch > 6 hours, "Cannot deposit twice in 6 hours"); - lastBatchCollected[_mAsset] = currentTime; - - // Batch collect - (uint256 interestCollected, uint256 totalSupply) = IMasset(_mAsset).collectPlatformInterest(); - - if(interestCollected > 0){ - // Validate APY - uint256 apy = _validateCollection(totalSupply, interestCollected, timeSincePreviousBatch); - - // Get remaining rewards - uint256 leftover = _unstreamedRewards(_mAsset, StreamType.yield); - _initialiseStream(_mAsset, StreamType.yield, interestCollected.add(leftover), ONE_DAY); - - emit InterestCollected(_mAsset, interestCollected, totalSupply, apy); - } - - emit InterestCollected(_mAsset, interestCollected, totalSupply, 0); - } - - /** - * @dev Calculates how many rewards from the stream are still to be distributed, from the - * last collection time to the end of the stream. - * @param _mAsset The mAsset in question - * @return leftover The total amount of mAsset that is yet to be collected from a stream - */ - function _unstreamedRewards(address _mAsset, StreamType _stream) internal view returns (uint256 leftover) { - uint256 lastUpdate = lastCollection[_mAsset]; - - Stream memory stream = _stream == StreamType.liquidator ? liqStream[_mAsset] : yieldStream[_mAsset]; - uint256 unclaimedSeconds = 0; - if(lastUpdate < stream.end){ - unclaimedSeconds = stream.end.sub(lastUpdate); - } - return unclaimedSeconds.mul(stream.rate); - } - - /** - * @dev Simply sets up the stream - * @param _mAsset The mAsset in question - * @param _amount Amount of units to stream - * @param _duration Duration of the stream, from now - */ - function _initialiseStream(address _mAsset, StreamType _stream, uint256 _amount, uint256 _duration) internal { - uint256 currentTime = now; - // Distribute reward per second over X seconds - uint256 rate = _amount.div(_duration); - uint256 end = currentTime.add(_duration); - if(_stream == StreamType.liquidator){ - liqStream[_mAsset] = Stream(end, rate); - } else { - yieldStream[_mAsset] = Stream(end, rate); - } - - // Reset pool data to enable lastCollection usage twice - require(lastCollection[_mAsset] == currentTime, "Stream data must be up to date"); - } - - /*************************************** - COLLECTION - ****************************************/ - - /** - * @dev Collects interest from a target mAsset and distributes to the SavingsContract. - * Applies constraints such that the max APY since the last fee collection cannot - * exceed the "MAX_APY" variable. - * @param _mAsset mAsset for which the interest should be collected - */ - function collectAndDistributeInterest(address _mAsset) - external - whenNotPaused - { - _collectAndDistributeInterest(_mAsset); - } - - function _collectAndDistributeInterest(address _mAsset) - internal - { - ISavingsContract savingsContract = savingsContracts[_mAsset]; - require(address(savingsContract) != address(0), "Must have a valid savings contract"); - - // Get collection details - uint256 recentPeriodStart = lastPeriodStart[_mAsset]; - uint256 previousCollection = lastCollection[_mAsset]; - lastCollection[_mAsset] = now; - - // 1. Collect the new interest from the mAsset - IMasset mAsset = IMasset(_mAsset); - (uint256 interestCollected, uint256 totalSupply) = mAsset.collectInterest(); - - // 2. Update all the time stamps - // Avoid division by 0 by adding a minimum elapsed time of 1 second - uint256 timeSincePeriodStart = StableMath.max(1, now.sub(recentPeriodStart)); - uint256 timeSinceLastCollection = StableMath.max(1, now.sub(previousCollection)); - - uint256 inflationOperand = interestCollected; - // If it has been 30 mins since last collection, reset period data - if(timeSinceLastCollection > THIRTY_MINUTES) { - lastPeriodStart[_mAsset] = now; - periodYield[_mAsset] = 0; - } - // Else if period has elapsed, start a new period from the lastCollection time - else if(timeSincePeriodStart > THIRTY_MINUTES) { - lastPeriodStart[_mAsset] = previousCollection; - periodYield[_mAsset] = interestCollected; - } - // Else add yield to period yield - else { - inflationOperand = periodYield[_mAsset].add(interestCollected); - periodYield[_mAsset] = inflationOperand; - } - - // Add on liquidated - uint256 newReward = _unclaimedRewards(_mAsset, previousCollection); - // 3. Validate that interest is collected correctly and does not exceed max APY - if(interestCollected > 0 || newReward > 0) { - require( - IERC20(_mAsset).balanceOf(address(this)) >= interestCollected.add(newReward), - "Must receive mUSD" - ); - - uint256 extrapolatedAPY = _validateCollection(totalSupply, inflationOperand, timeSinceLastCollection); - - emit InterestCollected(_mAsset, interestCollected, totalSupply, extrapolatedAPY); - - // 4. Distribute the interest - // Calculate the share for savers (95e16 or 95%) - uint256 saversShare = interestCollected.add(newReward).mulTruncate(savingsRate); - - // Call depositInterest on contract - savingsContract.depositInterest(saversShare); - - emit InterestDistributed(_mAsset, saversShare); - } else { - emit InterestCollected(_mAsset, 0, totalSupply, 0); - } - } - - /** - * @dev Calculates unclaimed rewards from the liquidation stream - * @param _mAsset mAsset key - * @param _previousCollection Time of previous collection - * @return Units of mAsset that have been unlocked for distribution - */ - function _unclaimedRewards(address _mAsset, uint256 _previousCollection) internal view returns (uint256) { - Stream memory liq = liqStream[_mAsset]; - uint256 unclaimedSeconds_liq = _unclaimedSeconds(_previousCollection, liq.end); - uint256 subtotal_liq = unclaimedSeconds_liq.mul(liq.rate); - - Stream memory yield = yieldStream[_mAsset]; - uint256 unclaimedSeconds_yield = _unclaimedSeconds(_previousCollection, yield.end); - uint256 subtotal_yield = unclaimedSeconds_yield.mul(yield.rate); - - return subtotal_liq.add(subtotal_yield); - } - - /** - * @dev Calculates the seconds of unclaimed rewards, based on period length - * @param _lastUpdate Time of last update - * @param _end End time of period - * @return Seconds of stream that should be compensated - */ - function _unclaimedSeconds(uint256 _lastUpdate, uint256 _end) internal view returns (uint256) { - uint256 currentTime = block.timestamp; - uint256 unclaimedSeconds = 0; - - if(currentTime <= _end){ - unclaimedSeconds = currentTime.sub(_lastUpdate); - } else if(_lastUpdate < _end) { - unclaimedSeconds = _end.sub(_lastUpdate); - } - return unclaimedSeconds; - } - - /** - * @dev Validates that an interest collection does not exceed a maximum APY. If last collection - * was under 30 mins ago, simply check it does not exceed 10bps - * @param _newSupply New total supply of the mAsset - * @param _interest Increase in total supply since last collection - * @param _timeSinceLastCollection Seconds since last collection - */ - function _validateCollection(uint256 _newSupply, uint256 _interest, uint256 _timeSinceLastCollection) - internal - pure - returns (uint256 extrapolatedAPY) - { - // Percentage increase in total supply - // e.g. (1e20 * 1e18) / 1e24 = 1e14 (or a 0.01% increase) - // e.g. (5e18 * 1e18) / 1.2e24 = 4.1667e12 - // e.g. (1e19 * 1e18) / 1e21 = 1e16 - uint256 oldSupply = _newSupply.sub(_interest); - uint256 percentageIncrease = _interest.divPrecisely(oldSupply); - - // If over 30 mins, extrapolate APY - // e.g. day: (86400 * 1e18) / 3.154e7 = 2.74..e15 - // e.g. 30 mins: (1800 * 1e18) / 3.154e7 = 5.7..e13 - // e.g. epoch: (1593596907 * 1e18) / 3.154e7 = 50.4..e18 - uint256 yearsSinceLastCollection = - _timeSinceLastCollection.divPrecisely(SECONDS_IN_YEAR); - - // e.g. 0.01% (1e14 * 1e18) / 2.74..e15 = 3.65e16 or 3.65% apr - // e.g. (4.1667e12 * 1e18) / 5.7..e13 = 7.1e16 or 7.1% apr - // e.g. (1e16 * 1e18) / 50e18 = 2e14 - extrapolatedAPY = percentageIncrease.divPrecisely(yearsSinceLastCollection); - - if(_timeSinceLastCollection > THIRTY_MINUTES) { - require(extrapolatedAPY < MAX_APY, "Interest protected from inflating past maxAPY"); - } else { - require(percentageIncrease < TEN_BPS, "Interest protected from inflating past 10 Bps"); - } - } - - - /*************************************** - Revenue Redistribution - ****************************************/ - - /** - * @dev Redistributes the unallocated interest to the saved recipient, allowing - * the siphoned assets to be used elsewhere in the system - * @param _mAsset mAsset to collect - */ - function distributeUnallocatedInterest(address _mAsset) - external - onlyGovernance - { - IRevenueRecipient recipient = revenueRecipients[_mAsset]; - require(address(recipient) != address(0), "Must have valid recipient"); - - IERC20 mAsset = IERC20(_mAsset); - uint256 balance = mAsset.balanceOf(address(this)); - uint256 leftover_liq = _unstreamedRewards(_mAsset, StreamType.liquidator); - uint256 leftover_yield = _unstreamedRewards(_mAsset, StreamType.yield); - - uint256 unallocated = balance.sub(leftover_liq).sub(leftover_yield); - - mAsset.approve(address(recipient), unallocated); - recipient.notifyRedistributionAmount(_mAsset, unallocated); - - emit RevenueRedistributed(_mAsset, address(recipient), unallocated); - } -} diff --git a/contracts/savings/peripheral/IConnector.sol b/contracts/savings/peripheral/IConnector.sol new file mode 100644 index 00000000..8f1d5e32 --- /dev/null +++ b/contracts/savings/peripheral/IConnector.sol @@ -0,0 +1,33 @@ +// SPDX-License-Identifier: AGPL-3.0-or-later +pragma solidity 0.8.0; + + +interface IConnector { + + /** + * @notice Deposits the mAsset into the connector + * @param _amount Units of mAsset to receive and deposit + */ + function deposit(uint256 _amount) external; + + /** + * @notice Withdraws a specific amount of mAsset from the connector + * @param _amount Units of mAsset to withdraw + */ + function withdraw(uint256 _amount) external; + + /** + * @notice Withdraws all mAsset from the connector + */ + function withdrawAll() external; + + /** + * @notice Returns the available balance in the connector. In connections + * where there is likely to be an initial dip in value due to conservative + * exchange rates (e.g. with Curves `get_virtual_price`), it should return + * max(deposited, balance) to avoid temporary negative yield. Any negative yield + * should be corrected during a withdrawal or over time. + * @return Balance of mAsset in the connector + */ + function checkBalance() external view returns (uint256); +} \ No newline at end of file diff --git a/contracts/savings/peripheral/SaveWrapper.sol b/contracts/savings/peripheral/SaveWrapper.sol new file mode 100644 index 00000000..bbc2297d --- /dev/null +++ b/contracts/savings/peripheral/SaveWrapper.sol @@ -0,0 +1,143 @@ +// SPDX-License-Identifier: AGPL-3.0-or-later +pragma solidity 0.8.0; + +import { ISavingsContractV2 } from "../../interfaces/ISavingsContract.sol"; +import { IMasset } from "../../interfaces/IMasset.sol"; + +import { IERC20 } from "@openzeppelin/contracts-sol8/contracts/token/ERC20/IERC20.sol"; +import { SafeERC20 } from "@openzeppelin/contracts-sol8/contracts/token/ERC20/SafeERC20.sol"; +import { IUniswapV2Router02 } from "../../interfaces/IUniswapV2Router02.sol"; +import { IBasicToken } from "../../shared/IBasicToken.sol"; + + +interface IBoostedSavingsVault { + function stake(address _beneficiary, uint256 _amount) external; +} + +// 3 FLOWS +// 0 - SAVE +// 1 - MINT AND SAVE +// 2 - BUY AND SAVE (ETH via Uni) +contract SaveWrapper { + + using SafeERC20 for IERC20; + + // Constants - add to bytecode during deployment + address public immutable save; + address public immutable vault; + address public immutable mAsset; + + IUniswapV2Router02 public immutable uniswap; + + constructor( + address _save, + address _vault, + address _mAsset, + address[] memory _bAssets, + address _uniswapAddress + ) { + require(_save != address(0), "Invalid save address"); + save = _save; + require(_vault != address(0), "Invalid vault address"); + vault = _vault; + require(_mAsset != address(0), "Invalid mAsset address"); + mAsset = _mAsset; + require(_uniswapAddress != address(0), "Invalid uniswap address"); + uniswap = IUniswapV2Router02(_uniswapAddress); + + IERC20(_mAsset).safeApprove(_save, 2**256 - 1); + IERC20(_save).approve(_vault, 2**256 - 1); + for(uint256 i = 0; i < _bAssets.length; i++ ) { + IERC20(_bAssets[i]).safeApprove(_mAsset, 2**256 - 1); + } + } + + + /** + * @dev 0. Simply saves an mAsset and then into the vault + * @param _amount Units of mAsset to deposit to savings + */ + function saveAndStake(uint256 _amount) external { + IERC20(mAsset).transferFrom(msg.sender, address(this), _amount); + _saveAndStake(_amount, true); + } + + /** + * @dev 1. Mints an mAsset and then deposits to SAVE + * @param _bAsset bAsset address + * @param _amt Amount of bAsset to mint with + * @param _minOut Min amount of mAsset to get back + * @param _stake Add the imUSD to the Savings Vault? + */ + function saveViaMint(address _bAsset, uint256 _amt, uint256 _minOut, bool _stake) external { + // 1. Get the input bAsset + IERC20(_bAsset).transferFrom(msg.sender, address(this), _amt); + // 2. Mint + IMasset mAsset_ = IMasset(mAsset); + uint256 massetsMinted = mAsset_.mint(_bAsset, _amt, _minOut, address(this)); + // 3. Mint imUSD and optionally stake in vault + _saveAndStake(massetsMinted, _stake); + } + + + /** + * @dev 2. Buys a bAsset on Uniswap with ETH then mUSD on Curve + * @param _amountOutMin Min uniswap output in bAsset units + * @param _path Sell path on Uniswap (e.g. [WETH, DAI]) + * @param _minOutMStable Min amount of mUSD to receive + * @param _stake Add the imUSD to the Savings Vault? + */ + function saveViaUniswapETH( + uint256 _amountOutMin, + address[] calldata _path, + uint256 _minOutMStable, + bool _stake + ) external payable { + // 1. Get the bAsset + uint[] memory amounts = uniswap.swapExactETHForTokens{value: msg.value}( + _amountOutMin, + _path, + address(this), + block.timestamp + 1000 + ); + // 2. Purchase mUSD + uint256 massetsMinted = IMasset(mAsset).mint(_path[_path.length-1], amounts[amounts.length-1], _minOutMStable, address(this)); + // 3. Mint imUSD and optionally stake in vault + _saveAndStake(massetsMinted, _stake); + } + + /** + * @dev Gets estimated mAsset output from a WETH > bAsset > mAsset trade + */ + function estimate_saveViaUniswapETH( + uint256 _ethAmount, + address[] calldata _path, + int128 _curvePosition + ) + external + view + returns (uint256 out) + { + uint256 estimatedBasset = _getAmountOut(_ethAmount, _path); + return IMasset(mAsset).getMintOutput(_path[_path.length-1], estimatedBasset); + } + + /** @dev Internal func to deposit into SAVE and optionally stake in the vault */ + function _saveAndStake( + uint256 _amount, + bool _stake + ) internal { + if(_stake){ + uint256 credits = ISavingsContractV2(save).depositSavings(_amount, address(this)); + IBoostedSavingsVault(vault).stake(msg.sender, credits); + } else { + ISavingsContractV2(save).depositSavings(_amount, msg.sender); + } + } + + /** @dev Internal func to get esimtated Uniswap output from WETH to token trade */ + function _getAmountOut(uint256 _amountIn, address[] memory _path) internal view returns (uint256) { + uint256[] memory amountsOut = uniswap.getAmountsOut(_amountIn, _path); + return amountsOut[amountsOut.length - 1]; + } +} \ No newline at end of file diff --git a/contracts/shared/@openzeppelin-2.5/Context.sol b/contracts/shared/@openzeppelin-2.5/Context.sol new file mode 100644 index 00000000..83981fed --- /dev/null +++ b/contracts/shared/@openzeppelin-2.5/Context.sol @@ -0,0 +1,28 @@ +// SPDX-License-Identifier: AGPL-3.0-or-later +pragma solidity 0.8.0; + +/* + * @dev Provides information about the current execution context, including the + * sender of the transaction and its data. While these are generally available + * via msg.sender and msg.data, they should not be accessed in such a direct + * manner, since when dealing with GSN meta-transactions the account sending and + * paying for execution may not be the actual sender (as far as an application + * is concerned). + * + * This contract is only required for intermediate, library-like contracts. + */ +abstract contract Context { + // Empty internal constructor, to prevent people from mistakenly deploying + // an instance of this contract, which should be used via inheritance. + // constructor () internal { } + // solhint-disable-previous-line no-empty-blocks + + function _msgSender() internal view returns (address payable) { + return payable(msg.sender); + } + + function _msgData() internal view returns (bytes memory) { + this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 + return msg.data; + } +} diff --git a/contracts/shared/@openzeppelin-2.5/ERC205.sol b/contracts/shared/@openzeppelin-2.5/ERC205.sol new file mode 100644 index 00000000..4c5ec1de --- /dev/null +++ b/contracts/shared/@openzeppelin-2.5/ERC205.sol @@ -0,0 +1,228 @@ +// SPDX-License-Identifier: AGPL-3.0-or-later +pragma solidity 0.8.0; + +import "./Context.sol"; +import { IERC20 } from "@openzeppelin/contracts-sol8/contracts/token/ERC20/IERC20.sol"; + +/** + * @dev Implementation of the {IERC20} interface. + * + * This implementation is agnostic to the way tokens are created. This means + * that a supply mechanism has to be added in a derived contract using {_mint}. + * For a generic mechanism see {ERC20Mintable}. + * + * TIP: For a detailed writeup see our guide + * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How + * to implement supply mechanisms]. + * + * We have followed general OpenZeppelin guidelines: functions revert instead + * of returning `false` on failure. This behavior is nonetheless conventional + * and does not conflict with the expectations of ERC20 applications. + * + * Additionally, an {Approval} event is emitted on calls to {transferFrom}. + * This allows applications to reconstruct the allowance for all accounts just + * by listening to said events. Other implementations of the EIP may not emit + * these events, as it isn't required by the specification. + * + * Finally, the non-standard {decreaseAllowance} and {increaseAllowance} + * functions have been added to mitigate the well-known issues around setting + * allowances. See {IERC20-approve}. + */ +contract ERC205 is Context, IERC20 { + mapping (address => uint256) private _balances; + + mapping (address => mapping (address => uint256)) private _allowances; + + uint256 private _totalSupply; + + /** + * @dev See {IERC20-totalSupply}. + */ + function totalSupply() public override view returns (uint256) { + return _totalSupply; + } + + /** + * @dev See {IERC20-balanceOf}. + */ + function balanceOf(address account) public override view returns (uint256) { + return _balances[account]; + } + + /** + * @dev See {IERC20-transfer}. + * + * Requirements: + * + * - `recipient` cannot be the zero address. + * - the caller must have a balance of at least `amount`. + */ + function transfer(address recipient, uint256 amount) public override returns (bool) { + _transfer(_msgSender(), recipient, amount); + return true; + } + + /** + * @dev See {IERC20-allowance}. + */ + function allowance(address owner, address spender) public override view returns (uint256) { + return _allowances[owner][spender]; + } + + /** + * @dev See {IERC20-approve}. + * + * Requirements: + * + * - `spender` cannot be the zero address. + */ + function approve(address spender, uint256 amount) public override returns (bool) { + _approve(_msgSender(), spender, amount); + return true; + } + + /** + * @dev See {IERC20-transferFrom}. + * + * Emits an {Approval} event indicating the updated allowance. This is not + * required by the EIP. See the note at the beginning of {ERC20}; + * + * Requirements: + * - `sender` and `recipient` cannot be the zero address. + * - `sender` must have a balance of at least `amount`. + * - the caller must have allowance for `sender`'s tokens of at least + * `amount`. + */ + function transferFrom(address sender, address recipient, uint256 amount) public override returns (bool) { + _transfer(sender, recipient, amount); + _approve(sender, _msgSender(), _allowances[sender][_msgSender()] - amount); + return true; + } + + /** + * @dev Atomically increases the allowance granted to `spender` by the caller. + * + * This is an alternative to {approve} that can be used as a mitigation for + * problems described in {IERC20-approve}. + * + * Emits an {Approval} event indicating the updated allowance. + * + * Requirements: + * + * - `spender` cannot be the zero address. + */ + function increaseAllowance(address spender, uint256 addedValue) public returns (bool) { + _approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue); + return true; + } + + /** + * @dev Atomically decreases the allowance granted to `spender` by the caller. + * + * This is an alternative to {approve} that can be used as a mitigation for + * problems described in {IERC20-approve}. + * + * Emits an {Approval} event indicating the updated allowance. + * + * Requirements: + * + * - `spender` cannot be the zero address. + * - `spender` must have allowance for the caller of at least + * `subtractedValue`. + */ + function decreaseAllowance(address spender, uint256 subtractedValue) public returns (bool) { + _approve(_msgSender(), spender, _allowances[_msgSender()][spender] - subtractedValue); + return true; + } + + /** + * @dev Moves tokens `amount` from `sender` to `recipient`. + * + * This is internal function is equivalent to {transfer}, and can be used to + * e.g. implement automatic token fees, slashing mechanisms, etc. + * + * Emits a {Transfer} event. + * + * Requirements: + * + * - `sender` cannot be the zero address. + * - `recipient` cannot be the zero address. + * - `sender` must have a balance of at least `amount`. + */ + function _transfer(address sender, address recipient, uint256 amount) internal { + require(sender != address(0), "ERC20: transfer from the zero address"); + require(recipient != address(0), "ERC20: transfer to the zero address"); + + _balances[sender] -= amount; + _balances[recipient] += amount; + emit Transfer(sender, recipient, amount); + } + + /** @dev Creates `amount` tokens and assigns them to `account`, increasing + * the total supply. + * + * Emits a {Transfer} event with `from` set to the zero address. + * + * Requirements + * + * - `to` cannot be the zero address. + */ + function _mint(address account, uint256 amount) internal { + require(account != address(0), "ERC20: mint to the zero address"); + + _totalSupply += amount; + _balances[account] += amount; + emit Transfer(address(0), account, amount); + } + + /** + * @dev Destroys `amount` tokens from `account`, reducing the + * total supply. + * + * Emits a {Transfer} event with `to` set to the zero address. + * + * Requirements + * + * - `account` cannot be the zero address. + * - `account` must have at least `amount` tokens. + */ + function _burn(address account, uint256 amount) internal { + require(account != address(0), "ERC20: burn from the zero address"); + + _balances[account] -= amount; + _totalSupply -= amount; + emit Transfer(account, address(0), amount); + } + + /** + * @dev Sets `amount` as the allowance of `spender` over the `owner`s tokens. + * + * This is internal function is equivalent to `approve`, and can be used to + * e.g. set automatic allowances for certain subsystems, etc. + * + * Emits an {Approval} event. + * + * Requirements: + * + * - `owner` cannot be the zero address. + * - `spender` cannot be the zero address. + */ + function _approve(address owner, address spender, uint256 amount) internal { + require(owner != address(0), "ERC20: approve from the zero address"); + require(spender != address(0), "ERC20: approve to the zero address"); + + _allowances[owner][spender] = amount; + emit Approval(owner, spender, amount); + } + + /** + * @dev Destroys `amount` tokens from `account`.`amount` is then deducted + * from the caller's allowance. + * + * See {_burn} and {_approve}. + */ + function _burnFrom(address account, uint256 amount) internal { + _burn(account, amount); + _approve(account, _msgSender(), _allowances[account][_msgSender()] - amount); + } +} diff --git a/contracts/shared/@openzeppelin-2.5/Initializable.sol b/contracts/shared/@openzeppelin-2.5/Initializable.sol new file mode 100644 index 00000000..ef2d102a --- /dev/null +++ b/contracts/shared/@openzeppelin-2.5/Initializable.sol @@ -0,0 +1,50 @@ +// SPDX-License-Identifier: AGPL-3.0-or-later +pragma solidity 0.8.0; + +contract Initializable { + + /** + * @dev Indicates that the contract has been initialized. + */ + bool private initialized; + + /** + * @dev Indicates that the contract is in the process of being initialized. + */ + bool private initializing; + + /** + * @dev Modifier to use in the initializer function of a contract. + */ + modifier initializer() { + require(initializing || isConstructor() || !initialized, "Contract instance has already been initialized"); + + bool isTopLevelCall = !initializing; + if (isTopLevelCall) { + initializing = true; + initialized = true; + } + + _; + + if (isTopLevelCall) { + initializing = false; + } + } + + /// @dev Returns true if and only if the function is running in the constructor + function isConstructor() private view returns (bool) { + // extcodesize checks the size of the code stored in an address, and + // address returns the current address. Since the code is still not + // deployed when running a constructor, any checks on its code size will + // yield zero, making it an effective way to detect if a contract is + // under construction or not. + address self = address(this); + uint256 cs; + assembly { cs := extcodesize(self) } + return cs == 0; + } + + // Reserved storage space to allow for layout changes in the future. + uint256[50] private ______gap; +} \ No newline at end of file diff --git a/contracts/shared/CommonHelpers.sol b/contracts/shared/CommonHelpers.sol deleted file mode 100644 index 38ba7bec..00000000 --- a/contracts/shared/CommonHelpers.sol +++ /dev/null @@ -1,28 +0,0 @@ -pragma solidity 0.5.16; - -import { IBasicToken } from "./IBasicToken.sol"; - -/** - * @title CommonHelpers - * @author Stability Labs Pty. Ltd. - */ -library CommonHelpers { - - /** - * @notice Fetch the `decimals()` from an ERC20 token - * @dev Grabs the `decimals()` from a contract and fails if - * the decimal value does not live within a certain range - * @param _token Address of the ERC20 token - * @return uint256 Decimals of the ERC20 token - */ - function getDecimals(address _token) - internal - view - returns (uint256) { - uint256 decimals = IBasicToken(_token).decimals(); - require(decimals >= 4 && decimals <= 18, "Token must have sufficient decimal places"); - - return decimals; - } - -} \ No newline at end of file diff --git a/contracts/shared/IBasicToken.sol b/contracts/shared/IBasicToken.sol index 878e0d0e..2c85f92f 100644 --- a/contracts/shared/IBasicToken.sol +++ b/contracts/shared/IBasicToken.sol @@ -1,4 +1,5 @@ -pragma solidity 0.5.16; +// SPDX-License-Identifier: AGPL-3.0-or-later +pragma solidity 0.8.0; interface IBasicToken { function decimals() external view returns (uint8); diff --git a/contracts/shared/IERC20WithCheckpointing.sol b/contracts/shared/IERC20WithCheckpointing.sol index a1e66fc4..c2adcc3a 100644 --- a/contracts/shared/IERC20WithCheckpointing.sol +++ b/contracts/shared/IERC20WithCheckpointing.sol @@ -1,10 +1,17 @@ -pragma solidity 0.5.16; +// SPDX-License-Identifier: AGPL-3.0-or-later +pragma solidity 0.8.0; // From https://github.com/aragonone/voting-connectors -contract IERC20WithCheckpointing { - function balanceOf(address _owner) public view returns (uint256); - function balanceOfAt(address _owner, uint256 _blockNumber) public view returns (uint256); +abstract contract IERC20WithCheckpointing { + function balanceOf(address _owner) public view virtual returns (uint256); - function totalSupply() public view returns (uint256); - function totalSupplyAt(uint256 _blockNumber) public view returns (uint256); -} \ No newline at end of file + function balanceOfAt(address _owner, uint256 _blockNumber) + public + view + virtual + returns (uint256); + + function totalSupply() public view virtual returns (uint256); + + function totalSupplyAt(uint256 _blockNumber) public view virtual returns (uint256); +} diff --git a/contracts/shared/InitializableModule.sol b/contracts/shared/ImmutableModule.sol similarity index 88% rename from contracts/shared/InitializableModule.sol rename to contracts/shared/ImmutableModule.sol index 95a66a72..c73ff3f5 100644 --- a/contracts/shared/InitializableModule.sol +++ b/contracts/shared/ImmutableModule.sol @@ -1,26 +1,39 @@ -pragma solidity 0.5.16; +// SPDX-License-Identifier: AGPL-3.0-or-later +pragma solidity 0.8.0; -import { InitializableModuleKeys } from "./InitializableModuleKeys.sol"; +import { ModuleKeys } from "./ModuleKeys.sol"; import { INexus } from "../interfaces/INexus.sol"; /** - * @title InitializableModule - * @author Stability Labs Pty. Ltd. + * @title ImmutableModule + * @author mStable * @dev Subscribes to module updates from a given publisher and reads from its registry. * Contract is used for upgradable proxy contracts. */ -contract InitializableModule is InitializableModuleKeys { +abstract contract ImmutableModule is ModuleKeys { + INexus public immutable nexus; - INexus public nexus; + /** + * @dev Initialization function for upgradable proxy contracts + * @param _nexus Nexus contract address + */ + constructor(address _nexus) { + require(_nexus != address(0), "Nexus address is zero"); + nexus = INexus(_nexus); + } /** * @dev Modifier to allow function calls only from the Governor. */ modifier onlyGovernor() { - require(msg.sender == _governor(), "Only governor can execute"); + _onlyGovernor(); _; } + function _onlyGovernor() internal view { + require(msg.sender == _governor(), "Only governor can execute"); + } + /** * @dev Modifier to allow function calls only from the Governance. * Governance is either Governor address or Governance address. @@ -37,9 +50,7 @@ contract InitializableModule is InitializableModuleKeys { * @dev Modifier to allow function calls only from the ProxyAdmin. */ modifier onlyProxyAdmin() { - require( - msg.sender == _proxyAdmin(), "Only ProxyAdmin can execute" - ); + require(msg.sender == _proxyAdmin(), "Only ProxyAdmin can execute"); _; } @@ -51,16 +62,6 @@ contract InitializableModule is InitializableModuleKeys { _; } - /** - * @dev Initialization function for upgradable proxy contracts - * @param _nexus Nexus contract address - */ - function _initialize(address _nexus) internal { - require(_nexus != address(0), "Nexus address is zero"); - nexus = INexus(_nexus); - InitializableModuleKeys._initialize(); - } - /** * @dev Returns Governor address from the Nexus * @return Address of Governor Contract diff --git a/contracts/shared/InitializableERC20Detailed.sol b/contracts/shared/InitializableERC20Detailed.sol index 01d354e6..f800d28f 100644 --- a/contracts/shared/InitializableERC20Detailed.sol +++ b/contracts/shared/InitializableERC20Detailed.sol @@ -1,12 +1,13 @@ -pragma solidity 0.5.16; +// SPDX-License-Identifier: AGPL-3.0-or-later +pragma solidity 0.8.0; -import { IERC20 } from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import { IERC20 } from "@openzeppelin/contracts-sol8/contracts/token/ERC20/IERC20.sol"; /** * @dev Optional functions from the ERC20 standard. * Converted from openzeppelin/contracts/token/ERC20/ERC20Detailed.sol */ -contract InitializableERC20Detailed is IERC20 { +abstract contract InitializableERC20Detailed is IERC20 { string private _name; string private _symbol; uint8 private _decimals; @@ -17,7 +18,11 @@ contract InitializableERC20Detailed is IERC20 { * construction. * @notice To avoid variable shadowing appended `Arg` after arguments name. */ - function _initialize(string memory nameArg, string memory symbolArg, uint8 decimalsArg) internal { + function _initialize( + string memory nameArg, + string memory symbolArg, + uint8 decimalsArg + ) internal { _name = nameArg; _symbol = symbolArg; _decimals = decimalsArg; diff --git a/contracts/shared/InitializableModuleKeys.sol b/contracts/shared/InitializableModuleKeys.sol deleted file mode 100644 index 1f36da4f..00000000 --- a/contracts/shared/InitializableModuleKeys.sol +++ /dev/null @@ -1,44 +0,0 @@ -pragma solidity 0.5.16; - -/** - * @title InitializableModuleKeys - * @author Stability Labs Pty. Ltd. - * @notice Provides system wide access to the byte32 represntations of system modules - * This allows each system module to be able to reference and update one another in a - * friendly way. Contract is used for upgradable proxy contracts. - * @dev The contract is a replica of ModuleKeys.sol - * The following variables are to be assigned only once from initialize() function. - * Hence, the variable names are declared in UPPER_CASE to indicate constants. - */ -contract InitializableModuleKeys { - - // Governance // Phases - bytes32 internal KEY_GOVERNANCE; // 2.x - bytes32 internal KEY_STAKING; // 1.2 - bytes32 internal KEY_PROXY_ADMIN; // 1.0 - - // mStable - bytes32 internal KEY_ORACLE_HUB; // 1.2 - bytes32 internal KEY_MANAGER; // 1.2 - bytes32 internal KEY_RECOLLATERALISER; // 2.x - bytes32 internal KEY_META_TOKEN; // 1.1 - bytes32 internal KEY_SAVINGS_MANAGER; // 1.0 - - /** - * @dev Initialize function for upgradable proxy contracts. This function should be called - * via Proxy to initialize constants in the Proxy contract. - */ - function _initialize() internal { - // keccak256() values are evaluated only once at the time of this function call. - // Hence, no need to assign hard-coded values to these variables. - KEY_GOVERNANCE = keccak256("Governance"); - KEY_STAKING = keccak256("Staking"); - KEY_PROXY_ADMIN = keccak256("ProxyAdmin"); - - KEY_ORACLE_HUB = keccak256("OracleHub"); - KEY_MANAGER = keccak256("Manager"); - KEY_RECOLLATERALISER = keccak256("Recollateraliser"); - KEY_META_TOKEN = keccak256("MetaToken"); - KEY_SAVINGS_MANAGER = keccak256("SavingsManager"); - } -} \ No newline at end of file diff --git a/contracts/shared/InitializablePausableModule.sol b/contracts/shared/InitializablePausableModule.sol deleted file mode 100644 index 0b8872a2..00000000 --- a/contracts/shared/InitializablePausableModule.sol +++ /dev/null @@ -1,74 +0,0 @@ -pragma solidity 0.5.16; - -import { InitializableModule } from "./InitializableModule.sol"; - -/** - * @title InitializableModule - * @author Stability Labs Pty. Ltd. - * @dev Subscribes to module updates from a given publisher and reads from its registry. - * Contract is used for upgradable proxy contracts. - */ -contract InitializablePausableModule is InitializableModule { - - /** - * @dev Emitted when the pause is triggered by Governor - */ - event Paused(address account); - - /** - * @dev Emitted when the pause is lifted by Governor - */ - event Unpaused(address account); - - bool private _paused = false; - - /** - * @dev Modifier to make a function callable only when the contract is not paused. - */ - modifier whenNotPaused() { - require(!_paused, "Pausable: paused"); - _; - } - - /** - * @dev Modifier to make a function callable only when the contract is paused. - */ - modifier whenPaused() { - require(_paused, "Pausable: not paused"); - _; - } - - /** - * @dev Initializes the contract in unpaused state. - * Hooks into the Module to give the Governor ability to pause - * @param _nexus Nexus contract address - */ - function _initialize(address _nexus) internal { - InitializableModule._initialize(_nexus); - _paused = false; - } - - /** - * @dev Returns true if the contract is paused, and false otherwise. - * @return Returns `true` when paused, otherwise `false` - */ - function paused() external view returns (bool) { - return _paused; - } - - /** - * @dev Called by the Governor to pause, triggers stopped state. - */ - function pause() external onlyGovernor whenNotPaused { - _paused = true; - emit Paused(msg.sender); - } - - /** - * @dev Called by Governor to unpause, returns to normal state. - */ - function unpause() external onlyGovernor whenPaused { - _paused = false; - emit Unpaused(msg.sender); - } -} diff --git a/contracts/shared/InitializableReentrancyGuard.sol b/contracts/shared/InitializableReentrancyGuard.sol index 7f8488b5..083d56b8 100644 --- a/contracts/shared/InitializableReentrancyGuard.sol +++ b/contracts/shared/InitializableReentrancyGuard.sol @@ -1,4 +1,5 @@ -pragma solidity 0.5.16; +// SPDX-License-Identifier: AGPL-3.0-or-later +pragma solidity 0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. @@ -22,7 +23,7 @@ pragma solidity 0.5.16; contract InitializableReentrancyGuard { bool private _notEntered; - function _initialize() internal { + function _initializeReentrancyGuard() internal { // Storing an initial non-zero value makes deployment a bit more // expensive, but in exchange the refund on every call to nonReentrant // will be lower in amount. Since refunds are capped to a percetange of diff --git a/contracts/shared/InitializableToken.sol b/contracts/shared/InitializableToken.sol index 247e4ed7..f2f29364 100644 --- a/contracts/shared/InitializableToken.sol +++ b/contracts/shared/InitializableToken.sol @@ -1,15 +1,15 @@ -pragma solidity 0.5.16; +// SPDX-License-Identifier: AGPL-3.0-or-later +pragma solidity 0.8.0; -import { ERC20 } from "@openzeppelin/contracts/token/ERC20/ERC20.sol"; +import { ERC205 } from "./@openzeppelin-2.5/ERC205.sol"; import { InitializableERC20Detailed } from "./InitializableERC20Detailed.sol"; /** * @title InitializableToken - * @author Stability Labs Pty. Ltd. + * @author mStable * @dev Basic ERC20Detailed Token functionality for Masset */ -contract InitializableToken is ERC20, InitializableERC20Detailed { - +abstract contract InitializableToken is ERC205, InitializableERC20Detailed { /** * @dev Initialization function for implementing contract * @notice To avoid variable shadowing appended `Arg` after arguments name. @@ -17,4 +17,4 @@ contract InitializableToken is ERC20, InitializableERC20Detailed { function _initialize(string memory _nameArg, string memory _symbolArg) internal { InitializableERC20Detailed._initialize(_nameArg, _symbolArg, 18); } -} \ No newline at end of file +} diff --git a/contracts/shared/MassetHelpers.sol b/contracts/shared/MassetHelpers.sol new file mode 100644 index 00000000..36aa5ce6 --- /dev/null +++ b/contracts/shared/MassetHelpers.sol @@ -0,0 +1,33 @@ +// SPDX-License-Identifier: AGPL-3.0-or-later +pragma solidity 0.8.0; + +import { SafeERC20 } from "@openzeppelin/contracts-sol8/contracts/token/ERC20/SafeERC20.sol"; +import { IERC20 } from "@openzeppelin/contracts-sol8/contracts/token/ERC20/IERC20.sol"; + +/** + * @title MassetHelpers + * @author mStable + * @notice Helper functions to facilitate minting and redemption from off chain + * @dev VERSION: 1.0 + * DATE: 2020-03-28 + */ +library MassetHelpers { + using SafeERC20 for IERC20; + + function transferReturnBalance( + address _sender, + address _recipient, + address _bAsset, + uint256 _qty + ) internal returns (uint256 receivedQty, uint256 recipientBalance) { + uint256 balBefore = IERC20(_bAsset).balanceOf(_recipient); + IERC20(_bAsset).safeTransferFrom(_sender, _recipient, _qty); + recipientBalance = IERC20(_bAsset).balanceOf(_recipient); + receivedQty = recipientBalance - balBefore; + } + + function safeInfiniteApprove(address _asset, address _spender) internal { + IERC20(_asset).safeApprove(_spender, 0); + IERC20(_asset).safeApprove(_spender, 2**256 - 1); + } +} diff --git a/contracts/shared/Module.sol b/contracts/shared/Module.sol deleted file mode 100644 index eb97a313..00000000 --- a/contracts/shared/Module.sol +++ /dev/null @@ -1,141 +0,0 @@ -pragma solidity 0.5.16; - -import { ModuleKeys } from "../shared/ModuleKeys.sol"; -import { INexus } from "../interfaces/INexus.sol"; - -/** - * @title Module - * @author Stability Labs Pty. Ltd. - * @dev Subscribes to module updates from a given publisher by reading from its registry - */ -contract Module is ModuleKeys { - - INexus public nexus; - - /** - * @dev Initialises the Module by setting publisher addresses, - * and reading all available system module information - */ - constructor(address _nexus) internal { - require(_nexus != address(0), "Nexus is zero address"); - nexus = INexus(_nexus); - } - - /** - * @dev Modifier to allow function calls only from the Governor. - */ - modifier onlyGovernor() { - require(msg.sender == _governor(), "Only governor can execute"); - _; - } - - /** - * @dev Modifier to allow function calls only from the Governance. - * Governance is either Governor address or Governance address. - */ - modifier onlyGovernance() { - require( - msg.sender == _governor() || msg.sender == _governance(), - "Only governance can execute" - ); - _; - } - - /** - * @dev Modifier to allow function calls only from the ProxyAdmin. - */ - modifier onlyProxyAdmin() { - require( - msg.sender == _proxyAdmin(), "Only ProxyAdmin can execute" - ); - _; - } - - /** - * @dev Modifier to allow function calls only from the Manager. - */ - modifier onlyManager() { - require(msg.sender == _manager(), "Only manager can execute"); - _; - } - - /** - * @dev Returns Governor address from the Nexus - * @return Address of Governor Contract - */ - function _governor() internal view returns (address) { - return nexus.governor(); - } - - /** - * @dev Returns Governance Module address from the Nexus - * @return Address of the Governance (Phase 2) - */ - function _governance() internal view returns (address) { - return nexus.getModule(KEY_GOVERNANCE); - } - - /** - * @dev Return Staking Module address from the Nexus - * @return Address of the Staking Module contract - */ - function _staking() internal view returns (address) { - return nexus.getModule(KEY_STAKING); - } - - /** - * @dev Return ProxyAdmin Module address from the Nexus - * @return Address of the ProxyAdmin Module contract - */ - function _proxyAdmin() internal view returns (address) { - return nexus.getModule(KEY_PROXY_ADMIN); - } - - /** - * @dev Return MetaToken Module address from the Nexus - * @return Address of the MetaToken Module contract - */ - function _metaToken() internal view returns (address) { - return nexus.getModule(KEY_META_TOKEN); - } - - /** - * @dev Return OracleHub Module address from the Nexus - * @return Address of the OracleHub Module contract - */ - function _oracleHub() internal view returns (address) { - return nexus.getModule(KEY_ORACLE_HUB); - } - - /** - * @dev Return Manager Module address from the Nexus - * @return Address of the Manager Module contract - */ - function _manager() internal view returns (address) { - return nexus.getModule(KEY_MANAGER); - } - - /** - * @dev Return SavingsManager Module address from the Nexus - * @return Address of the SavingsManager Module contract - */ - function _savingsManager() internal view returns (address) { - return nexus.getModule(KEY_SAVINGS_MANAGER); - } - - /** - * @dev Return Recollateraliser Module address from the Nexus - * @return Address of the Recollateraliser Module contract (Phase 2) - */ - function _recollateraliser() internal view returns (address) { - return nexus.getModule(KEY_RECOLLATERALISER); - } - - /** - * @dev Return Recollateraliser Module address from the Nexus - * @return Address of the Recollateraliser Module contract (Phase 2) - */ - function _liquidator() internal view returns (address) { - return nexus.getModule(KEY_LIQUIDATOR); - } -} diff --git a/contracts/shared/ModuleKeys.sol b/contracts/shared/ModuleKeys.sol index facff9ef..ed95fe91 100644 --- a/contracts/shared/ModuleKeys.sol +++ b/contracts/shared/ModuleKeys.sol @@ -1,36 +1,45 @@ -pragma solidity 0.5.16; +// SPDX-License-Identifier: AGPL-3.0-or-later +pragma solidity 0.8.0; /** - * @title ModuleKeys - * @author Stability Labs Pty. Ltd. - * @notice Provides system wide access to the byte32 represntations of system modules - * This allows each system module to be able to reference and update one another in a - * friendly way - * @dev keccak256() values are hardcoded to avoid re-evaluation of the constants at runtime. - */ + * @title ModuleKeys + * @author mStable + * @notice Provides system wide access to the byte32 represntations of system modules + * This allows each system module to be able to reference and update one another in a + * friendly way + * @dev keccak256() values are hardcoded to avoid re-evaluation of the constants at runtime. + */ contract ModuleKeys { - // Governance // =========== // keccak256("Governance"); - bytes32 internal constant KEY_GOVERNANCE = 0x9409903de1e6fd852dfc61c9dacb48196c48535b60e25abf92acc92dd689078d; + bytes32 internal constant KEY_GOVERNANCE = + 0x9409903de1e6fd852dfc61c9dacb48196c48535b60e25abf92acc92dd689078d; //keccak256("Staking"); - bytes32 internal constant KEY_STAKING = 0x1df41cd916959d1163dc8f0671a666ea8a3e434c13e40faef527133b5d167034; + bytes32 internal constant KEY_STAKING = + 0x1df41cd916959d1163dc8f0671a666ea8a3e434c13e40faef527133b5d167034; //keccak256("ProxyAdmin"); - bytes32 internal constant KEY_PROXY_ADMIN = 0x96ed0203eb7e975a4cbcaa23951943fa35c5d8288117d50c12b3d48b0fab48d1; + bytes32 internal constant KEY_PROXY_ADMIN = + 0x96ed0203eb7e975a4cbcaa23951943fa35c5d8288117d50c12b3d48b0fab48d1; // mStable // ======= // keccak256("OracleHub"); - bytes32 internal constant KEY_ORACLE_HUB = 0x8ae3a082c61a7379e2280f3356a5131507d9829d222d853bfa7c9fe1200dd040; + bytes32 internal constant KEY_ORACLE_HUB = + 0x8ae3a082c61a7379e2280f3356a5131507d9829d222d853bfa7c9fe1200dd040; // keccak256("Manager"); - bytes32 internal constant KEY_MANAGER = 0x6d439300980e333f0256d64be2c9f67e86f4493ce25f82498d6db7f4be3d9e6f; + bytes32 internal constant KEY_MANAGER = + 0x6d439300980e333f0256d64be2c9f67e86f4493ce25f82498d6db7f4be3d9e6f; //keccak256("Recollateraliser"); - bytes32 internal constant KEY_RECOLLATERALISER = 0x39e3ed1fc335ce346a8cbe3e64dd525cf22b37f1e2104a755e761c3c1eb4734f; + bytes32 internal constant KEY_RECOLLATERALISER = + 0x39e3ed1fc335ce346a8cbe3e64dd525cf22b37f1e2104a755e761c3c1eb4734f; //keccak256("MetaToken"); - bytes32 internal constant KEY_META_TOKEN = 0xea7469b14936af748ee93c53b2fe510b9928edbdccac3963321efca7eb1a57a2; + bytes32 internal constant KEY_META_TOKEN = + 0xea7469b14936af748ee93c53b2fe510b9928edbdccac3963321efca7eb1a57a2; // keccak256("SavingsManager"); - bytes32 internal constant KEY_SAVINGS_MANAGER = 0x12fe936c77a1e196473c4314f3bed8eeac1d757b319abb85bdda70df35511bf1; + bytes32 internal constant KEY_SAVINGS_MANAGER = + 0x12fe936c77a1e196473c4314f3bed8eeac1d757b319abb85bdda70df35511bf1; // keccak256("Liquidator"); - bytes32 internal constant KEY_LIQUIDATOR = 0x1e9cb14d7560734a61fa5ff9273953e971ff3cd9283c03d8346e3264617933d4; + bytes32 internal constant KEY_LIQUIDATOR = + 0x1e9cb14d7560734a61fa5ff9273953e971ff3cd9283c03d8346e3264617933d4; } diff --git a/contracts/shared/PausableModule.sol b/contracts/shared/PausableModule.sol deleted file mode 100644 index 569707b7..00000000 --- a/contracts/shared/PausableModule.sol +++ /dev/null @@ -1,73 +0,0 @@ -pragma solidity 0.5.16; - -import { Module } from "./Module.sol"; - -/** - * @title PausableModule - * @author Stability Labs Pty. Ltd. - * @dev Forked from @openzeppelin/contracts/lifecycle/pausable - * Changes: `onlyGovernor` can pause - */ -contract PausableModule is Module { - - /** - * @dev Emitted when the pause is triggered by Governor - */ - event Paused(address account); - - /** - * @dev Emitted when the pause is lifted by Governor - */ - event Unpaused(address account); - - bool private _paused = false; - - /** - * @dev Modifier to make a function callable only when the contract is not paused. - */ - modifier whenNotPaused() { - require(!_paused, "Pausable: paused"); - _; - } - - /** - * @dev Modifier to make a function callable only when the contract is paused. - */ - modifier whenPaused() { - require(_paused, "Pausable: not paused"); - _; - } - - /** - * @dev Initializes the contract in unpaused state. - * Hooks into the Module to give the Governor ability to pause - * @param _nexus Nexus contract address - */ - constructor (address _nexus) internal Module(_nexus) { - _paused = false; - } - - /** - * @dev Returns true if the contract is paused, and false otherwise. - * @return Returns `true` when paused, otherwise `false` - */ - function paused() external view returns (bool) { - return _paused; - } - - /** - * @dev Called by the Governor to pause, triggers stopped state. - */ - function pause() external onlyGovernor whenNotPaused { - _paused = true; - emit Paused(msg.sender); - } - - /** - * @dev Called by Governor to unpause, returns to normal state. - */ - function unpause() external onlyGovernor whenPaused { - _paused = false; - emit Unpaused(msg.sender); - } -} diff --git a/contracts/shared/Root.sol b/contracts/shared/Root.sol index 49be2911..7d102188 100644 --- a/contracts/shared/Root.sol +++ b/contracts/shared/Root.sol @@ -1,22 +1,53 @@ -pragma solidity 0.5.16; - -import { SafeMath } from "@openzeppelin/contracts/math/SafeMath.sol"; +// SPDX-License-Identifier: AGPL-3.0-or-later +pragma solidity 0.8.0; library Root { - - using SafeMath for uint256; - /** * @dev Returns the square root of a given number * @param x Input * @return y Square root of Input */ - function sqrt(uint x) internal pure returns (uint y) { - uint z = (x.add(1)).div(2); - y = x; - while (z < y) { - y = z; - z = (x.div(z).add(z)).div(2); + function sqrt(uint256 x) internal pure returns (uint256 y) { + if (x == 0) return 0; + else { + uint256 xx = x; + uint256 r = 1; + if (xx >= 0x100000000000000000000000000000000) { + xx >>= 128; + r <<= 64; + } + if (xx >= 0x10000000000000000) { + xx >>= 64; + r <<= 32; + } + if (xx >= 0x100000000) { + xx >>= 32; + r <<= 16; + } + if (xx >= 0x10000) { + xx >>= 16; + r <<= 8; + } + if (xx >= 0x100) { + xx >>= 8; + r <<= 4; + } + if (xx >= 0x10) { + xx >>= 4; + r <<= 2; + } + if (xx >= 0x8) { + r <<= 1; + } + r = (r + x / r) >> 1; + r = (r + x / r) >> 1; + r = (r + x / r) >> 1; + r = (r + x / r) >> 1; + r = (r + x / r) >> 1; + r = (r + x / r) >> 1; + r = (r + x / r) >> 1; // Seven iterations should be enough + uint256 r1 = x / r; + return uint256(r < r1 ? r : r1); } } -} \ No newline at end of file +} diff --git a/contracts/shared/SignedSafeMath128.sol b/contracts/shared/SignedSafeMath128.sol deleted file mode 100644 index 843b223a..00000000 --- a/contracts/shared/SignedSafeMath128.sol +++ /dev/null @@ -1,94 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity 0.5.16; - -/** - * @title SignedSafeMath128 - * @author OpenZeppelin > https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/math/SignedSafeMath.sol - * @dev Signed math operations with safety checks that revert on error. - * Reverted to solc 0.5.16 & updated from int256 to int128 - */ -library SignedSafeMath128 { - int128 constant private _INT128_MIN = -2**127; - - /** - * @dev Returns the multiplication of two signed integers, reverting on - * overflow. - * - * Counterpart to Solidity's `*` operator. - * - * Requirements: - * - * - Multiplication cannot overflow. - */ - function mul(int128 a, int128 b) internal pure returns (int128) { - // Gas optimization: this is cheaper than requiring 'a' not being zero, but the - // benefit is lost if 'b' is also tested. - // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 - if (a == 0) { - return 0; - } - - require(!(a == -1 && b == _INT128_MIN), "SignedSafeMath: multiplication overflow"); - - int128 c = a * b; - require(c / a == b, "SignedSafeMath: multiplication overflow"); - - return c; - } - - /** - * @dev Returns the integer division of two signed integers. Reverts on - * division by zero. The result is rounded towards zero. - * - * Counterpart to Solidity's `/` operator. Note: this function uses a - * `revert` opcode (which leaves remaining gas untouched) while Solidity - * uses an invalid opcode to revert (consuming all remaining gas). - * - * Requirements: - * - * - The divisor cannot be zero. - */ - function div(int128 a, int128 b) internal pure returns (int128) { - require(b != 0, "SignedSafeMath: division by zero"); - require(!(b == -1 && a == _INT128_MIN), "SignedSafeMath: division overflow"); - - int128 c = a / b; - - return c; - } - - /** - * @dev Returns the subtraction of two signed integers, reverting on - * overflow. - * - * Counterpart to Solidity's `-` operator. - * - * Requirements: - * - * - Subtraction cannot overflow. - */ - function sub(int128 a, int128 b) internal pure returns (int128) { - int128 c = a - b; - require((b >= 0 && c <= a) || (b < 0 && c > a), "SignedSafeMath: subtraction overflow"); - - return c; - } - - /** - * @dev Returns the addition of two signed integers, reverting on - * overflow. - * - * Counterpart to Solidity's `+` operator. - * - * Requirements: - * - * - Addition cannot overflow. - */ - function add(int128 a, int128 b) internal pure returns (int128) { - int128 c = a + b; - require((b >= 0 && c >= a) || (b < 0 && c < a), "SignedSafeMath: addition overflow"); - - return c; - } -} \ No newline at end of file diff --git a/contracts/shared/StableMath.sol b/contracts/shared/StableMath.sol index 956f984f..8360ad1a 100644 --- a/contracts/shared/StableMath.sol +++ b/contracts/shared/StableMath.sol @@ -1,19 +1,15 @@ -pragma solidity 0.5.16; - -import { SafeMath } from "@openzeppelin/contracts/math/SafeMath.sol"; +// SPDX-License-Identifier: AGPL-3.0-or-later +pragma solidity 0.8.0; /** * @title StableMath - * @author Stability Labs Pty. Ltd. + * @author mStable * @notice A library providing safe mathematical operations to multiply and * divide with standardised precision. * @dev Derives from OpenZeppelin's SafeMath lib and uses generic system * wide variables for managing precision. */ library StableMath { - - using SafeMath for uint256; - /** * @dev Scaling unit for use in specific calculations, * where 1 * 10**18, or 1e18 represents a unit '1' @@ -21,9 +17,9 @@ library StableMath { uint256 private constant FULL_SCALE = 1e18; /** - * @notice Token Ratios are used when converting between units of bAsset, mAsset and MTA + * @dev Token Ratios are used when converting between units of bAsset, mAsset and MTA * Reasoning: Takes into account token decimals, and difference in base unit (i.e. grams to Troy oz for gold) - * @dev bAsset ratio unit for use in exact calculations, + * bAsset ratio unit for use in exact calculations, * where (1 bAsset unit * bAsset.ratio) / ratioScale == x mAsset unit */ uint256 private constant RATIO_SCALE = 1e8; @@ -49,12 +45,8 @@ library StableMath { * @param x Simple uint256 to scale * @return Scaled value a to an exact number */ - function scaleInteger(uint256 x) - internal - pure - returns (uint256) - { - return x.mul(FULL_SCALE); + function scaleInteger(uint256 x) internal pure returns (uint256) { + return x * FULL_SCALE; } /*************************************** @@ -68,11 +60,7 @@ library StableMath { * @return Result after multiplying the two inputs and then dividing by the shared * scale unit */ - function mulTruncate(uint256 x, uint256 y) - internal - pure - returns (uint256) - { + function mulTruncate(uint256 x, uint256 y) internal pure returns (uint256) { return mulTruncateScale(x, y, FULL_SCALE); } @@ -85,16 +73,15 @@ library StableMath { * @return Result after multiplying the two inputs and then dividing by the shared * scale unit */ - function mulTruncateScale(uint256 x, uint256 y, uint256 scale) - internal - pure - returns (uint256) - { + function mulTruncateScale( + uint256 x, + uint256 y, + uint256 scale + ) internal pure returns (uint256) { // e.g. assume scale = fullScale // z = 10e18 * 9e17 = 9e36 - uint256 z = x.mul(y); // return 9e38 / 1e18 = 9e18 - return z.div(scale); + return (x * y) / scale; } /** @@ -104,17 +91,13 @@ library StableMath { * @return Result after multiplying the two inputs and then dividing by the shared * scale unit, rounded up to the closest base unit. */ - function mulTruncateCeil(uint256 x, uint256 y) - internal - pure - returns (uint256) - { + function mulTruncateCeil(uint256 x, uint256 y) internal pure returns (uint256) { // e.g. 8e17 * 17268172638 = 138145381104e17 - uint256 scaled = x.mul(y); + uint256 scaled = x * y; // e.g. 138145381104e17 + 9.99...e17 = 138145381113.99...e17 - uint256 ceil = scaled.add(FULL_SCALE.sub(1)); + uint256 ceil = scaled + FULL_SCALE - 1; // e.g. 13814538111.399...e18 / 1e18 = 13814538111 - return ceil.div(FULL_SCALE); + return ceil / FULL_SCALE; } /** @@ -125,18 +108,12 @@ library StableMath { * @return Result after multiplying the left operand by the scale, and * executing the division on the right hand input. */ - function divPrecisely(uint256 x, uint256 y) - internal - pure - returns (uint256) - { + function divPrecisely(uint256 x, uint256 y) internal pure returns (uint256) { // e.g. 8e18 * 1e18 = 8e36 - uint256 z = x.mul(FULL_SCALE); // e.g. 8e36 / 10e18 = 8e17 - return z.div(y); + return (x * FULL_SCALE) / y; } - /*************************************** RATIO FUNCS ****************************************/ @@ -146,13 +123,9 @@ library StableMath { * i.e. How much mAsset is this bAsset worth? * @param x Left hand operand to multiplication (i.e Exact quantity) * @param ratio bAsset ratio - * @return Result after multiplying the two inputs and then dividing by the ratio scale + * @return c Result after multiplying the two inputs and then dividing by the ratio scale */ - function mulRatioTruncate(uint256 x, uint256 ratio) - internal - pure - returns (uint256 c) - { + function mulRatioTruncate(uint256 x, uint256 ratio) internal pure returns (uint256 c) { return mulTruncateScale(x, ratio, RATIO_SCALE); } @@ -164,38 +137,28 @@ library StableMath { * @return Result after multiplying the two inputs and then dividing by the shared * ratio scale, rounded up to the closest base unit. */ - function mulRatioTruncateCeil(uint256 x, uint256 ratio) - internal - pure - returns (uint256) - { + function mulRatioTruncateCeil(uint256 x, uint256 ratio) internal pure returns (uint256) { // e.g. How much mAsset should I burn for this bAsset (x)? // 1e18 * 1e8 = 1e26 - uint256 scaled = x.mul(ratio); + uint256 scaled = x * ratio; // 1e26 + 9.99e7 = 100..00.999e8 - uint256 ceil = scaled.add(RATIO_SCALE.sub(1)); + uint256 ceil = scaled + RATIO_SCALE - 1; // return 100..00.999e8 / 1e8 = 1e18 - return ceil.div(RATIO_SCALE); + return ceil / RATIO_SCALE; } - /** * @dev Precisely divides two ratioed units, by first scaling the left hand operand * i.e. How much bAsset is this mAsset worth? * @param x Left hand operand in division * @param ratio bAsset ratio - * @return Result after multiplying the left operand by the scale, and + * @return c Result after multiplying the left operand by the scale, and * executing the division on the right hand input. */ - function divRatioPrecisely(uint256 x, uint256 ratio) - internal - pure - returns (uint256 c) - { + function divRatioPrecisely(uint256 x, uint256 ratio) internal pure returns (uint256 c) { // e.g. 1e14 * 1e8 = 1e22 - uint256 y = x.mul(RATIO_SCALE); // return 1e22 / 1e12 = 1e10 - return y.div(ratio); + return (x * RATIO_SCALE) / ratio; } /*************************************** @@ -208,11 +171,7 @@ library StableMath { * @param y Right hand input * @return Minimum of the two inputs */ - function min(uint256 x, uint256 y) - internal - pure - returns (uint256) - { + function min(uint256 x, uint256 y) internal pure returns (uint256) { return x > y ? y : x; } @@ -222,11 +181,7 @@ library StableMath { * @param y Right hand input * @return Maximum of the two inputs */ - function max(uint256 x, uint256 y) - internal - pure - returns (uint256) - { + function max(uint256 x, uint256 y) internal pure returns (uint256) { return x > y ? x : y; } @@ -236,11 +191,7 @@ library StableMath { * @param upperBound Maximum possible value to return * @return Input x clamped to a maximum value, upperBound */ - function clamp(uint256 x, uint256 upperBound) - internal - pure - returns (uint256) - { + function clamp(uint256 x, uint256 upperBound) internal pure returns (uint256) { return x > upperBound ? upperBound : x; } } diff --git a/contracts/upgradability/DelayedProxyAdmin.sol b/contracts/upgradability/DelayedProxyAdmin.sol index fdde5fa4..9cdaad27 100644 --- a/contracts/upgradability/DelayedProxyAdmin.sol +++ b/contracts/upgradability/DelayedProxyAdmin.sol @@ -1,12 +1,14 @@ -pragma solidity 0.5.16; +// SPDX-License-Identifier: AGPL-3.0-or-later +pragma solidity 0.8.0; -import { Module } from "../shared/Module.sol"; -import { SafeMath } from "@openzeppelin/contracts/math/SafeMath.sol"; -import { AdminUpgradeabilityProxy } from "@openzeppelin/upgrades/contracts/upgradeability/AdminUpgradeabilityProxy.sol"; +import { ImmutableModule } from "../shared/ImmutableModule.sol"; +import { + TransparentUpgradeableProxy +} from "@openzeppelin/contracts-sol8/contracts/proxy/TransparentUpgradeableProxy.sol"; /** * @title DelayedProxyAdmin - * @author Stability Labs Pty. Ltd. + * @author mStable * @notice Proxy admin contract to upgrade the upgradable contracts. The upgradable contracts * are transparent proxy contracts from OpenZeppelin-SDK. * @dev The contract has a delyed upgradability. The Governor can propose a new implementation @@ -14,18 +16,16 @@ import { AdminUpgradeabilityProxy } from "@openzeppelin/upgrades/contracts/upgra * and upgrade of contract is performed. * Part of the code taken from OpenZeppelin-SDK's ProxyAdmin.sol */ -contract DelayedProxyAdmin is Module { - using SafeMath for uint256; - +contract DelayedProxyAdmin is ImmutableModule { event UpgradeProposed(address indexed proxy, address implementation, bytes data); event UpgradeCancelled(address indexed proxy); event Upgraded(address indexed proxy, address oldImpl, address newImpl, bytes data); // Request struct to store proposed upgrade requests - struct Request{ + struct Request { address implementation; // New contract implementation address - bytes data; // Data to call a function on new contract implementation - uint256 timestamp; // Timestamp when upgrade request is proposed + bytes data; // Data to call a function on new contract implementation + uint256 timestamp; // Timestamp when upgrade request is proposed } // Opt-out upgrade delay @@ -38,7 +38,7 @@ contract DelayedProxyAdmin is Module { * @dev Constructor * @param _nexus Nexus contract address */ - constructor(address _nexus) public Module(_nexus) {} + constructor(address _nexus) ImmutableModule(_nexus) {} /** * @dev The Governor can propose a new contract implementation for a given proxy. @@ -50,10 +50,7 @@ contract DelayedProxyAdmin is Module { address _proxy, address _implementation, bytes calldata _data - ) - external - onlyGovernor - { + ) external onlyGovernor { require(_proxy != address(0), "Proxy address is zero"); require(_implementation != address(0), "Implementation address is zero"); require(requests[_proxy].implementation == address(0), "Upgrade already proposed"); @@ -62,7 +59,7 @@ contract DelayedProxyAdmin is Module { Request storage request = requests[_proxy]; request.implementation = _implementation; request.data = _data; - request.timestamp = now; + request.timestamp = block.timestamp; emit UpgradeProposed(_proxy, _implementation, _data); } @@ -97,11 +94,11 @@ contract DelayedProxyAdmin is Module { // Deleting before to avoid re-entrancy delete requests[_proxy]; - if(data.length == 0) { + if (data.length == 0) { require(msg.value == 0, "msg.value should be zero"); - AdminUpgradeabilityProxy(_proxy).upgradeTo(newImpl); + TransparentUpgradeableProxy(_proxy).upgradeTo(newImpl); } else { - AdminUpgradeabilityProxy(_proxy).upgradeToAndCall.value(msg.value)(newImpl, data); + TransparentUpgradeableProxy(_proxy).upgradeToAndCall{ value: msg.value }(newImpl, data); } emit Upgraded(_proxy, oldImpl, newImpl, data); @@ -113,8 +110,7 @@ contract DelayedProxyAdmin is Module { * @return Returns `true` when upgrade delay is over, otherwise `false` */ function _isDelayOver(uint256 _timestamp) private view returns (bool) { - if(_timestamp > 0 && now >= _timestamp.add(UPGRADE_DELAY)) - return true; + if (_timestamp > 0 && block.timestamp >= _timestamp + UPGRADE_DELAY) return true; return false; } @@ -165,11 +161,11 @@ contract DelayedProxyAdmin is Module { // NOTICE: This can be removed. However, kept it for us to remind that we are not calling this fn. // We are not allowing this function call from Governor or Governance. /** - * @dev Changes the admin of a proxy. - * @param proxy Proxy to change admin. - * @param newAdmin Address to transfer proxy administration to. - */ + * @dev Changes the admin of a proxy. + * @param proxy Proxy to change admin. + * @param newAdmin Address to transfer proxy administration to. + */ // function changeProxyAdmin(AdminUpgradeabilityProxy proxy, address newAdmin) public onlyGovernor { // proxy.changeAdmin(newAdmin); // } -} \ No newline at end of file +} diff --git a/contracts/upgradability/Proxies.sol b/contracts/upgradability/Proxies.sol index 48752bea..db6d7b86 100644 --- a/contracts/upgradability/Proxies.sol +++ b/contracts/upgradability/Proxies.sol @@ -1,15 +1,24 @@ -pragma solidity 0.5.16; +// SPDX-License-Identifier: AGPL-3.0-or-later +pragma solidity 0.8.0; -import { InitializableAdminUpgradeabilityProxy } from "@openzeppelin/upgrades/contracts/upgradeability/InitializableAdminUpgradeabilityProxy.sol"; +// import { InitializableAdminUpgradeabilityProxy } from "../shared/@openzeppelin-2.5/upgrades/InitializableAdminUpgradeabilityProxy.sol"; +import { + TransparentUpgradeableProxy +} from "@openzeppelin/contracts-sol8/contracts/proxy/TransparentUpgradeableProxy.sol"; /** - * @notice MassetProxy delegates calls to a Masset implementation + * @notice AssetProxy delegates calls to a Masset implementation * @dev Extending on OpenZeppelin's InitializableAdminUpgradabilityProxy - * means that the proxy is upgradable through a ProxyAdmin. MassetProxy upgrades + * means that the proxy is upgradable through a ProxyAdmin. AssetProxy upgrades * are implemented by a DelayedProxyAdmin, which enforces a 1 week opt-out period. * All upgrades are governed through the current mStable governance. */ -contract MassetProxy is InitializableAdminUpgradeabilityProxy { +contract AssetProxy is TransparentUpgradeableProxy { + constructor( + address _logic, + address admin_, + bytes memory _data + ) payable TransparentUpgradeableProxy(_logic, admin_, _data) {} } /** @@ -19,7 +28,12 @@ contract MassetProxy is InitializableAdminUpgradeabilityProxy { * are implemented by a DelayedProxyAdmin, which enforces a 1 week opt-out period. * All upgrades are governed through the current mStable governance. */ -contract BasketManagerProxy is InitializableAdminUpgradeabilityProxy { +contract BasketManagerProxy is TransparentUpgradeableProxy { + constructor( + address _logic, + address admin_, + bytes memory _data + ) payable TransparentUpgradeableProxy(_logic, admin_, _data) {} } /** @@ -29,10 +43,14 @@ contract BasketManagerProxy is InitializableAdminUpgradeabilityProxy { * are implemented by a DelayedProxyAdmin, which enforces a 1 week opt-out period. * All upgrades are governed through the current mStable governance. */ -contract VaultProxy is InitializableAdminUpgradeabilityProxy { +contract VaultProxy is TransparentUpgradeableProxy { + constructor( + address _logic, + address admin_, + bytes memory _data + ) payable TransparentUpgradeableProxy(_logic, admin_, _data) {} } - /** * @notice LiquidatorProxy delegates calls to a Liquidator implementation * @dev Extending on OpenZeppelin's InitializableAdminUpgradabilityProxy @@ -40,5 +58,10 @@ contract VaultProxy is InitializableAdminUpgradeabilityProxy { * are implemented by a DelayedProxyAdmin, which enforces a 1 week opt-out period. * All upgrades are governed through the current mStable governance. */ -contract LiquidatorProxy is InitializableAdminUpgradeabilityProxy { -} \ No newline at end of file +contract LiquidatorProxy is TransparentUpgradeableProxy { + constructor( + address _logic, + address admin_, + bytes memory _data + ) payable TransparentUpgradeableProxy(_logic, admin_, _data) {} +} diff --git a/contracts/z_mocks/governance/Ejector.sol b/contracts/z_mocks/governance/Ejector.sol deleted file mode 100644 index 5ea0c2ac..00000000 --- a/contracts/z_mocks/governance/Ejector.sol +++ /dev/null @@ -1,20 +0,0 @@ -pragma solidity 0.5.16; - -import { IIncentivisedVotingLockup } from "../../interfaces/IIncentivisedVotingLockup.sol"; - -contract Ejector { - - IIncentivisedVotingLockup public votingLockup; - - constructor(IIncentivisedVotingLockup _votingLockup) public { - votingLockup = _votingLockup; - } - - function ejectMany(address[] calldata _users) external { - uint count = _users.length; - for(uint i = 0; i < count; i++){ - votingLockup.eject(_users[i]); - } - } - -} \ No newline at end of file diff --git a/contracts/z_mocks/governance/MockGovernable.sol b/contracts/z_mocks/governance/MockGovernable.sol deleted file mode 100644 index 036fd249..00000000 --- a/contracts/z_mocks/governance/MockGovernable.sol +++ /dev/null @@ -1,7 +0,0 @@ -pragma solidity 0.5.16; - -import { Governable } from "../../governance/Governable.sol"; - -contract MockGovernable is Governable { - -} \ No newline at end of file diff --git a/contracts/z_mocks/integrations/AbstractBuyAndMint.sol b/contracts/z_mocks/integrations/AbstractBuyAndMint.sol deleted file mode 100644 index 03ce0d78..00000000 --- a/contracts/z_mocks/integrations/AbstractBuyAndMint.sol +++ /dev/null @@ -1,77 +0,0 @@ -pragma solidity 0.5.16; - -// Internal -import { MassetHelpers } from "../../masset/shared/MassetHelpers.sol"; - -// Library -import { Ownable } from "@openzeppelin/contracts/ownership/Ownable.sol"; - -/** - * @title AbstractBuyAndMint - * @author Stability Labs Pty. Ltd. - * @notice Abstract contract to allow buy bAsset tokens with ETH and mint mAssets tokens - * from mStable. - */ -contract AbstractBuyAndMint is Ownable { - - using MassetHelpers for address; - - event MassetAdded(address indexed mAsset); - - // mAsset address => exists - mapping(address => bool) public mAssets; - - /** - * @dev Abstarct constructor - * @param _mAssets Array of valid mAsset addresses allowed to mint. - */ - constructor(address[] memory _mAssets) internal { - require(_mAssets.length > 0, "No mAssets provided"); - for(uint256 i = 0; i < _mAssets.length; i++) { - _addMasset(_mAssets[i]); - } - } - - /** - * @dev Anyone can call and perform infinite approval for bAssets - * @param _bAssets An array containing bAssets addresses - */ - function infiniteApprove(address _mAsset, address[] calldata _bAssets) external { - for(uint256 i = 0; i < _bAssets.length; i++) { - _bAssets[i].safeInfiniteApprove(_mAsset); - } - } - - /** - * @dev The Owner of the contract allowed to add a new supported mAsset. - * @param _mAsset Address of the mAsset - */ - function addMasset(address _mAsset) external onlyOwner { - _addMasset(_mAsset); - } - - /** - * @dev Add a new mAsset to the supported mAssets list - * @param _mAsset Address of the mAsset - */ - function _addMasset(address _mAsset) internal { - require(_mAsset != address(0), "mAsset address is zero"); - require(!_massetExists(_mAsset), "mAsset already exists"); - mAssets[_mAsset] = true; - emit MassetAdded(_mAsset); - } - - /** - * @dev Validate that the given mAsset supported by this contract. - * @notice Only validate mAsset address. As bAsset gets validated during minting process. - * @param _mAsset mAsset address to validate - */ - function _massetExists(address _mAsset) internal view returns (bool) { - return mAssets[_mAsset]; - } - - /** - * @dev Abstract function to get the external DEX contract address - */ - function _externalDexAddress() internal view returns(address); -} \ No newline at end of file diff --git a/contracts/z_mocks/integrations/MintWith1Inch.sol b/contracts/z_mocks/integrations/MintWith1Inch.sol deleted file mode 100644 index 3b118224..00000000 --- a/contracts/z_mocks/integrations/MintWith1Inch.sol +++ /dev/null @@ -1,107 +0,0 @@ -pragma solidity 0.5.16; - -// External -import { AbstractBuyAndMint } from "./AbstractBuyAndMint.sol"; -import { IMasset } from "../../interfaces/IMasset.sol"; - -// Libs -import { IERC20 } from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; -import { SafeMath } from "@openzeppelin/contracts/math/SafeMath.sol"; - -/** - * @dev OneSplit Exchange interface - */ -contract IOneSplit { - function swap( - IERC20 fromToken, - IERC20 toToken, - uint256 amount, - uint256 minReturn, - uint256[] memory distribution, - uint256 flags - ) public payable; -} - -/** - * @title MintWith1Inch - * @author Stability Labs Pty. Ltd. - * @notice Contract integrates with 1inch (a.k.a OneSplit) contract and allows anyone to buy - * bAsset tokens using ETH from the 1inch and mint mAssets. - */ -contract MintWith1Inch is AbstractBuyAndMint { - - using SafeMath for uint256; - - // 1inch Exchange 1Split contract address - IOneSplit public oneSplit; - - IERC20 private constant ETH_ADDRESS = IERC20(0x0000000000000000000000000000000000000000); - - /** - * @param _oneSplit OneSplit contract address - * @param _mAssets Array of mAssets addresses - */ - constructor(address _oneSplit, address[] memory _mAssets) - public - AbstractBuyAndMint(_mAssets) - { - require(_oneSplit != address(0), "1inch address is zero"); - - oneSplit = IOneSplit(_oneSplit); - } - - // @override - function _externalDexAddress() internal view returns(address) { - return address(oneSplit); - } - - // NOTICE: Make the following function call off-chain to get the `distribution` and - // pass to this function. This is to reduce gas consumption. - - // ============================================================================ - // Offchain: To calculate the distribution to mint max mAssets with ETH amount - // ============================================================================ - /* - // Parts = 20 (Suggested by 1inch to provide best rates) - uint256 parts = 20; - // Not disable any exchange - uint256 disableFlags = 0; - (,uint256[] memory distribution) = - oneSplit.getExpectedReturn( - ETH_ADDRESS, //fromToken - IERC20(_srcBasset), //toToken - msg.value, //fromAmount - parts, //parts - disableFlags //disableFlags - ); - */ - - // @override - function buyAndMint( - IERC20 _srcBasset, - address _destMasset, - uint256 _minBassetUnits, - uint256[] calldata _distribution - ) - external - payable - returns (uint256 mAssetQtyMinted) - { - require(msg.value > 0, "ETH not sent"); - require(_massetExists(_destMasset), "Not a valid mAsset"); - - // 1. Buy bAsset of worth `msg.value` ETH from OneSplit - oneSplit.swap.value(msg.value)( - ETH_ADDRESS, - _srcBasset, - msg.value, - _minBassetUnits, - _distribution, - 0 - ); - - uint256 balance = _srcBasset.balanceOf(address(this)); - // 2. Mint mAsset with all bAsset - mAssetQtyMinted = IMasset(_destMasset).mintTo(address(_srcBasset), balance, _msgSender()); - } -} \ No newline at end of file diff --git a/contracts/z_mocks/integrations/MintWithKyber.sol b/contracts/z_mocks/integrations/MintWithKyber.sol deleted file mode 100644 index 6897d1ed..00000000 --- a/contracts/z_mocks/integrations/MintWithKyber.sol +++ /dev/null @@ -1,230 +0,0 @@ -pragma solidity 0.5.16; - -// External -import { AbstractBuyAndMint } from "./AbstractBuyAndMint.sol"; - -// Internal -import { IMasset } from "../../interfaces/IMasset.sol"; - -// Libs -import { IERC20 } from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; -import { SafeERC20 } from "@openzeppelin/contracts/token/ERC20/SafeERC20.sol"; -import { SafeMath } from "@openzeppelin/contracts/math/SafeMath.sol"; -import { Address } from "@openzeppelin/contracts/utils/Address.sol"; -import { ReentrancyGuard } from "@openzeppelin/contracts/utils/ReentrancyGuard.sol"; -import { StableMath } from "../../shared/StableMath.sol"; - -/** - * @title MintWithKyber - * @author Stability Labs Pty. Ltd. - * @notice Contract integrates with Kyber Network Proxy contract and allows anyone to buy - * bAsset tokens using ETH from the Kyber platform and mint mAsset tokens from mStable. - */ -contract MintWithKyber is AbstractBuyAndMint, ReentrancyGuard { - using SafeERC20 for IERC20; - using SafeMath for uint256; - using Address for address payable; - using StableMath for uint256; - - address constant internal ETH_TOKEN_ADDRESS = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE; - - // TODO update FEE_COLLECTION_ADDRESS address once registered for Kyber Fee Sharing program - // https://developer.kyber.network/docs/Integrations-FeeSharing/ - // TODO UPDATE THIS ADDRESS - address constant public FEE_COLLECTION_ADDRESS = address(0); - - KyberNetworkProxyInterface public kyberNetworkProxy; - - /** - * @dev Constructor - * @param _kyberNetworkProxy Kyeber Network Proxy contract address - * @param _mAssets Array of mAssets addresses - */ - constructor(address _kyberNetworkProxy, address[] memory _mAssets) - public - AbstractBuyAndMint(_mAssets) - { - require(_kyberNetworkProxy != address(0), "Kyber proxy address is zero"); - - kyberNetworkProxy = KyberNetworkProxyInterface(_kyberNetworkProxy); - } - - // @override - function _externalDexAddress() internal view returns(address) { - return address(kyberNetworkProxy); - } - - // @override - function buyAndMintMaxMasset( - address _srcBasset, - address _destMasset - ) - external - payable - nonReentrant - returns (uint256 mAssetQtyMinted) - { - require(msg.value > 0, "ETH not sent"); - require(_massetExists(_destMasset), "Not a valid mAsset"); - - mAssetQtyMinted = _buyAndMint(_srcBasset, _destMasset, msg.value, _msgSender()); - } - - // @override - function buyAndMintGivenMasset( - address _srcBasset, - address _destMasset, - uint256 _amountOfBasset - ) - external - payable - nonReentrant - returns (uint256 mAssetQtyMinted) - { - require(_massetExists(_destMasset), "Not a valid mAsset"); - - // Get the rate from Kyber for `_amountOfBasset` - // Example rate to convert from DAI => ETH - (uint256 expectedRate,) = kyberNetworkProxy.getExpectedRate(_srcBasset, ETH_TOKEN_ADDRESS, _amountOfBasset); - - // amountOfBassets * expectedRate / 1e18 - uint256 amountInETH = _amountOfBasset.mulTruncate(expectedRate); - require(msg.value >= amountInETH, "Not enough ETH sent"); - - // Pass the `expectedRate` ETH to Kyber - mAssetQtyMinted = _buyAndMint(_srcBasset, _destMasset, amountInETH, _msgSender()); - - // Return remaining ETH balance to the user - // WARNING: Reentrancy Guard used for external functions - msg.sender.sendValue(msg.value.sub(amountInETH)); - } - - // @override - function buyAndMintMulti( - address[] calldata _srcBassets, - uint256[] calldata _ethAmount, - address _destMasset - ) - external - payable - nonReentrant - returns (uint256 mAssetQtyMinted) - { - require(msg.value > 0, "ETH not sent"); - uint256 bAssetsLen = _srcBassets.length; - require(bAssetsLen > 0, "No array data sent"); - require(bAssetsLen == _ethAmount.length, "Array length not matched"); - require(_massetExists(_destMasset), "Not a valid mAsset"); - // NOTICE: Assuming DApp validated that the `sum(_ethAmount[]) == msg.value`, - // otherwise tx will fail - - mAssetQtyMinted = _buyAndMintMulti(_srcBassets, _ethAmount, _destMasset, _msgSender()); - } - - /** - * @dev Buy bAssets with ETH and Mint mAsset from mStable. Send mAssets to the user. - * @param _srcBasset Source bAsset to buy from Kyber - * @param _destMasset mAsset to mint from mStable - * @param _ethAmount Amount of ETH to user to buy bAssets - * @param _recipient Recipient of the mStable tokens - * @return mAssetQtyMinted Returns the total quantity of mAssets minted - */ - function _buyAndMint( - address _srcBasset, - address _destMasset, - uint256 _ethAmount, - address _recipient - ) - internal - returns (uint256 mAssetQtyMinted) - { - // 1. Buy bAsset of worth `_ethAmount` ETH from Kyber - uint256 bAssetQtyMinted = _buyBassetsFromKyberWithETH(_srcBasset, _ethAmount); - - // 2. Mint mAsset with all bAsset - mAssetQtyMinted = IMasset(_destMasset).mintTo(address(_srcBasset), bAssetQtyMinted, _recipient); - } - - /** - * @dev Buy multiple bAssets using corrosponding ETH amount from Kyber and mint mAssets - * using these bAssets. - * @param _srcBassets Array of bAssets to buy from Kyber - * @param _ethAmounts Array of eth amount to use corrosponding bAssets - * @param _destMasset mAsset address to mint - * @param _recipient Recipient of the mStable tokens - * @return mAssetQtyMinted Returns the total quantity of mAssets minted - */ - function _buyAndMintMulti( - address[] memory _srcBassets, - uint256[] memory _ethAmounts, - address _destMasset, - address _recipient - ) - internal - returns (uint256 mAssetQtyMinted) - { - uint256[] memory bAssetsQtyMinted = new uint256[](_srcBassets.length); - - for(uint256 i = 0; i < _srcBassets.length; i++) { - bAssetsQtyMinted[i] = _buyBassetsFromKyberWithETH(_srcBassets[i], _ethAmounts[i]); - } - - mAssetQtyMinted = IMasset(_destMasset).mintMulti(_srcBassets, bAssetsQtyMinted, _recipient); - } - - /** - * @dev Buy bAsset tokens worth of ETH amount sent from Kyber - * @param _srcBasset Source bAsset to buy from Kyber - * @param _ethAmount Amount of ETH to user to buy bAssets - * @return bAssetsQtyMinted Returns the total quantity of bAssets minted from Kyber - */ - function _buyBassetsFromKyberWithETH( - address _srcBasset, - uint256 _ethAmount - ) - internal - returns (uint256 bAssetsQtyMinted) - { - bAssetsQtyMinted = - kyberNetworkProxy.tradeWithHint.value(_ethAmount)( - ETH_TOKEN_ADDRESS, - _ethAmount, - _srcBasset, - address(this), - 1 << 255, - 0, - FEE_COLLECTION_ADDRESS, - "" - ); - require(bAssetsQtyMinted > 0, "No bAsset minted"); - require(IERC20(_srcBasset).balanceOf(address(this)) >= bAssetsQtyMinted, "bAsset token not received"); - } -} - -/** - * @dev Kyber Network Proxy to integrate with Kyber Network contracts - */ -interface KyberNetworkProxyInterface { - // NOTICE: Commented out unused functions - //function maxGasPrice() public view returns(uint); - //function getUserCapInWei(address user) public view returns(uint); - //function getUserCapInTokenWei(address user, ERC20 token) public view returns(uint); - //function info(bytes32 id) public view returns(uint); - - //function enabled() external view returns(bool); - - function getExpectedRate( - address src, - address dest, - uint srcQty) external view returns (uint expectedRate, uint slippageRate); - - function tradeWithHint( - address src, - uint srcAmount, - address dest, - address destAddress, - uint maxDestAmount, - uint minConversionRate, - address walletId, - bytes calldata hint) external payable returns(uint); -} diff --git a/contracts/z_mocks/masset/ExposedInvariantValidator.sol b/contracts/z_mocks/masset/ExposedInvariantValidator.sol new file mode 100644 index 00000000..90d71eea --- /dev/null +++ b/contracts/z_mocks/masset/ExposedInvariantValidator.sol @@ -0,0 +1,18 @@ +// SPDX-License-Identifier: AGPL-3.0-or-later +pragma solidity 0.8.0; + +import { InvariantValidator } from "../../masset/InvariantValidator.sol"; + +contract ExposedInvariantValidator is InvariantValidator { + + constructor(uint256 _startingCap, uint256 _capFactor) InvariantValidator(_startingCap, _capFactor) { + } + + function getK( + BassetData[] calldata _bAssets, + InvariantConfig memory _config + ) external view returns (uint256 k) { + (uint256[] memory x, uint256 sum) = _getReserves(_bAssets); + k = _invariant(x, sum, _config.a); + } +} \ No newline at end of file diff --git a/contracts/z_mocks/masset/ExposedMasset.sol b/contracts/z_mocks/masset/ExposedMasset.sol new file mode 100644 index 00000000..7effa860 --- /dev/null +++ b/contracts/z_mocks/masset/ExposedMasset.sol @@ -0,0 +1,18 @@ +// SPDX-License-Identifier: AGPL-3.0-or-later +pragma solidity 0.8.0; + +import { Masset } from "../../masset/Masset.sol"; +import { ExposedInvariantValidator } from "./ExposedInvariantValidator.sol"; + +contract ExposedMasset is Masset { + + constructor(address _nexus) Masset(_nexus) {} + + function getK() external view returns (uint256 k) { + k = ExposedInvariantValidator(address(forgeValidator)).getK(bAssetData, _getConfig()); + } + + function getA() public view returns (uint256) { + return super._getA(); + } +} \ No newline at end of file diff --git a/contracts/z_mocks/masset/IAave.sol b/contracts/z_mocks/masset/IAave.sol new file mode 100644 index 00000000..84eb58c7 --- /dev/null +++ b/contracts/z_mocks/masset/IAave.sol @@ -0,0 +1,58 @@ +pragma solidity 0.8.0; + +/** + * @dev Interface for Aaves Lending Pool + * Documentation: https://developers.aave.com/#lendingpooladdressesprovider + */ +interface ILendingPoolAddressesProviderV2 { + + /** + * @notice Get the current address for Aave LendingPool + * @dev Lending pool is the core contract on which to call deposit + */ + function getLendingPool() external view returns (address); +} + +/** + * @dev Interface for Aaves A Token + * Documentation: https://developers.aave.com/#atokens + */ +interface IAaveATokenV2 { + + /** + * @notice returns the current total aToken balance of _user all interest collected included. + * To obtain the user asset principal balance with interests excluded , ERC20 non-standard + * method principalBalanceOf() can be used. + */ + function balanceOf(address _user) external view returns(uint256); +} + + +interface IAaveLendingPoolV2 { + + /** + * @dev deposits The underlying asset into the reserve. A corresponding amount of the overlying asset (aTokens) + * is minted. + * @param reserve the address of the reserve + * @param amount the amount to be deposited + * @param referralCode integrators are assigned a referral code and can potentially receive rewards. + **/ + function deposit( + address reserve, + uint256 amount, + address onBehalfOf, + uint16 referralCode + ) external; + + /** + * @dev withdraws the assets of user. + * @param reserve the address of the reserve + * @param amount the underlying amount to be redeemed + * @param to address that will receive the underlying + **/ + function withdraw( + address reserve, + uint256 amount, + address to + ) external; +} \ No newline at end of file diff --git a/contracts/z_mocks/masset/platform-integrations/MaliciousAaveIntegration.sol b/contracts/z_mocks/masset/MaliciousAaveIntegration.sol similarity index 60% rename from contracts/z_mocks/masset/platform-integrations/MaliciousAaveIntegration.sol rename to contracts/z_mocks/masset/MaliciousAaveIntegration.sol index cef3052f..c7ec9b73 100644 --- a/contracts/z_mocks/masset/platform-integrations/MaliciousAaveIntegration.sol +++ b/contracts/z_mocks/masset/MaliciousAaveIntegration.sol @@ -1,12 +1,119 @@ -pragma solidity 0.5.16; +pragma solidity 0.8.0; -import { - IAaveATokenV2, - IAaveLendingPoolV2, - ILendingPoolAddressesProviderV2 } from "../../../masset/platform-integrations/IAave.sol"; -import { InitializableAbstractIntegration, MassetHelpers, IERC20 } from "../../../masset/platform-integrations/InitializableAbstractIntegration.sol"; -contract MaliciousAaveIntegration is InitializableAbstractIntegration { +// Internal +import { IPlatformIntegration } from "../../interfaces/IPlatformIntegration.sol"; +import { ImmutableModule } from "../../shared/ImmutableModule.sol"; +import { IAaveATokenV2, IAaveLendingPoolV2, ILendingPoolAddressesProviderV2 } from "./IAave.sol"; + +// Libs +import { MassetHelpers } from "../../shared/MassetHelpers.sol"; +import { SafeERC20 } from "@openzeppelin/contracts-sol8/contracts/token/ERC20/SafeERC20.sol"; +import { IERC20 } from "@openzeppelin/contracts-sol8/contracts/token/ERC20/IERC20.sol"; + + +contract MaliciousAaveIntegration is + IPlatformIntegration, + ImmutableModule +{ + + using SafeERC20 for IERC20; + + event PTokenAdded(address indexed _bAsset, address _pToken); + event Whitelisted(address indexed _address); + + event Deposit(address indexed _bAsset, address _pToken, uint256 _amount); + event Withdrawal(address indexed _bAsset, address _pToken, uint256 _amount); + event PlatformWithdrawal(address indexed bAsset, address pToken, uint256 totalAmount, uint256 userAmount); + + // Core address for the given platform */ + address public platformAddress; + + // bAsset => pToken (Platform Specific Token Address) + mapping(address => address) public override bAssetToPToken; + // Full list of all bAssets supported here + address[] internal bAssetsMapped; + + mapping(address => bool) public whitelist; + + /** + * @dev Modifier to allow function calls only from the whitelisted address. + */ + modifier onlyWhitelisted() { + require(whitelist[msg.sender], "Not a whitelisted address"); + _; + } + + constructor(address _nexus, + address _platformAddress, + address[] memory _bAssets, + address[] memory _pTokens) ImmutableModule(_nexus) { + platformAddress = _platformAddress; + + uint256 bAssetCount = _bAssets.length; + require(bAssetCount == _pTokens.length, "Invalid input arrays"); + for(uint256 i = 0; i < bAssetCount; i++){ + _setPTokenAddress(_bAssets[i], _pTokens[i]); + } + } + + function addWhitelist( + address[] memory _whitelisted + ) + external + { + require(_whitelisted.length > 0, "Empty whitelist array"); + + for(uint256 i = 0; i < _whitelisted.length; i++) { + _addWhitelist(_whitelisted[i]); + } + } + + /** + * @dev Adds a new whitelist address + * @param _address Address to add in whitelist + */ + function _addWhitelist(address _address) internal { + require(_address != address(0), "Address is zero"); + require(! whitelist[_address], "Already whitelisted"); + + whitelist[_address] = true; + + emit Whitelisted(_address); + } + + + + /*************************************** + CONFIG + ****************************************/ + + /** + * @dev Provide support for bAsset by passing its pToken address. + * This method can only be called by the system Governor + * @param _bAsset Address for the bAsset + * @param _pToken Address for the corresponding platform token + */ + function setPTokenAddress(address _bAsset, address _pToken) + external + onlyGovernor + { + _setPTokenAddress(_bAsset, _pToken); + } + + function _setPTokenAddress(address _bAsset, address _pToken) + internal + { + require(bAssetToPToken[_bAsset] == address(0), "pToken already set"); + require(_bAsset != address(0) && _pToken != address(0), "Invalid addresses"); + + bAssetToPToken[_bAsset] = _pToken; + bAssetsMapped.push(_bAsset); + + emit PTokenAdded(_bAsset, _pToken); + + _abstractSetPToken(_bAsset, _pToken); + } /*************************************** CORE @@ -18,45 +125,36 @@ contract MaliciousAaveIntegration is InitializableAbstractIntegration { * (mAsset and corresponding BasketManager) * @param _bAsset Address for the bAsset * @param _amount Units of bAsset to deposit - * @param _isTokenFeeCharged Flag that signals if an xfer fee is charged on bAsset + * @param _hasTxFee Is the bAsset known to have a tx fee? * @return quantityDeposited Quantity of bAsset that entered the platform */ function deposit( address _bAsset, uint256 _amount, - bool _isTokenFeeCharged + bool _hasTxFee ) external + override onlyWhitelisted - nonReentrant returns (uint256 quantityDeposited) { require(_amount > 0, "Must deposit something"); IAaveATokenV2 aToken = _getATokenFor(_bAsset); - quantityDeposited = _amount; - if(_isTokenFeeCharged) { + if(_hasTxFee) { // If we charge a fee, account for it uint256 prevBal = _checkBalance(aToken); _getLendingPool().deposit(_bAsset, _amount, address(this), 36); uint256 newBal = _checkBalance(aToken); - quantityDeposited = _min(quantityDeposited, newBal.sub(prevBal)); + quantityDeposited = _min(quantityDeposited, newBal- prevBal); } else { _getLendingPool().deposit(_bAsset, _amount, address(this), 36); } emit Deposit(_bAsset, address(aToken), quantityDeposited); } - - /** - * @dev Withdraw a quantity of bAsset from the platform. Redemption - * should fail if we have insufficient balance on the platform. - * @param _receiver Address to which the bAsset should be sent - * @param _bAsset Address of the bAsset - * @param _amount Units of bAsset to withdraw - */ function withdraw( address _receiver, address _bAsset, @@ -65,8 +163,9 @@ contract MaliciousAaveIntegration is InitializableAbstractIntegration { bool _isTokenFeeCharged ) external + override onlyWhitelisted - nonReentrant + { _withdraw(_receiver, _bAsset, _amount, _totalAmount, _isTokenFeeCharged); } @@ -77,8 +176,8 @@ contract MaliciousAaveIntegration is InitializableAbstractIntegration { bool _isTokenFeeCharged ) external + override onlyWhitelisted - nonReentrant { _withdraw(_receiver, _bAsset, _amount, _amount, _isTokenFeeCharged); } @@ -107,14 +206,15 @@ contract MaliciousAaveIntegration is InitializableAbstractIntegration { emit PlatformWithdrawal(_bAsset, address(aToken), _totalAmount, _amount); } - function withdrawRaw( +function withdrawRaw( address _receiver, address _bAsset, uint256 _amount ) external + override onlyWhitelisted - nonReentrant + { require(_amount > 0, "Must withdraw something"); @@ -133,6 +233,7 @@ contract MaliciousAaveIntegration is InitializableAbstractIntegration { */ function checkBalance(address _bAsset) external + override returns (uint256 balance) { // balance is always with token aToken decimals @@ -144,6 +245,8 @@ contract MaliciousAaveIntegration is InitializableAbstractIntegration { APPROVALS ****************************************/ + + /** * @dev Re-approve the spending of all bAssets by the Aave lending pool core, * if for some reason is it necessary for example if the address of core changes. @@ -179,6 +282,8 @@ contract MaliciousAaveIntegration is InitializableAbstractIntegration { HELPERS ****************************************/ + + /** * @dev Get the current address of the Aave lending pool, which is the gateway to * depositing. @@ -223,4 +328,19 @@ contract MaliciousAaveIntegration is InitializableAbstractIntegration { { return _aToken.balanceOf(address(this)); } -} \ No newline at end of file + + /*************************************** + HELPERS + ****************************************/ + + /** + * @dev Simple helper func to get the min of two values + */ + function _min(uint256 x, uint256 y) + internal + pure + returns (uint256) + { + return x > y ? y : x; + } +} diff --git a/contracts/z_mocks/masset/MockAave.sol b/contracts/z_mocks/masset/MockAave.sol new file mode 100644 index 00000000..a7cfa3e0 --- /dev/null +++ b/contracts/z_mocks/masset/MockAave.sol @@ -0,0 +1,96 @@ +pragma solidity 0.8.0; + +import { + IAaveATokenV2, + IAaveLendingPoolV2, + ILendingPoolAddressesProviderV2 +} from "./IAave.sol"; + +import { MassetHelpers, SafeERC20 } from "../../shared/MassetHelpers.sol"; +import { IERC20, ERC20 } from "@openzeppelin/contracts-sol8/contracts/token/ERC20/ERC20.sol"; + + +contract MockATokenV2 is ERC20 { + + address public lendingPool; + IERC20 public underlyingToken; + using SafeERC20 for IERC20; + + constructor(address _lendingPool, IERC20 _underlyingToken) ERC20("MockAToken", "MAT") { + lendingPool = _lendingPool; + underlyingToken = _underlyingToken; + } + + function burn(address user, uint256 amount) public { + _burn(user, amount); + } + + function mint(address user, uint256 amount) public { + _mint(user, amount); + } +} + +contract MockAaveV2 is IAaveLendingPoolV2, ILendingPoolAddressesProviderV2 { + + using SafeERC20 for IERC20; + + mapping(address => address) reserveToAToken; + address pool = address(this); + address payable core = payable(address(this)); + + function addAToken(address _aToken, address _underlying) public { + MassetHelpers.safeInfiniteApprove(_underlying, _aToken); + reserveToAToken[_underlying] = _aToken; + } + + function deposit(address _reserve, uint256 _amount, address /* _onBehalfOf */, uint16 /*_referralCode*/) external override { + uint256 previousBal = IERC20(reserveToAToken[_reserve]).balanceOf(msg.sender); + uint256 factor = 2 * (10**13); // 0.002% + uint256 interest = previousBal * factor / 1e18; + MockATokenV2(reserveToAToken[_reserve]).mint(msg.sender, interest); + // Take their reserve + transferTokens(msg.sender, address(this), _reserve, true, _amount); + // Credit them with aToken + MockATokenV2(reserveToAToken[_reserve]).mint(msg.sender, _amount); + } + + function withdraw( + address reserve, + uint256 amount, + address to + ) external override { + MockATokenV2(reserveToAToken[reserve]).burn(msg.sender, amount); + IERC20(reserve).transfer(to, amount); + } + + function getLendingPool() external override view returns (address) { + return pool; + } + + function breakLendingPools() external { + pool = address(0); + core = payable(address(0)); + } + + + function transferTokens( + address _sender, + address _recipient, + address _basset, + bool _hasTxFee, + uint256 _qty + ) + internal + returns (uint256 receivedQty) + { + receivedQty = _qty; + if(_hasTxFee) { + uint256 balBefore = IERC20(_basset).balanceOf(_recipient); + IERC20(_basset).safeTransferFrom(_sender, _recipient, _qty); + uint256 balAfter = IERC20(_basset).balanceOf(_recipient); + receivedQty = _qty > balAfter - balBefore ? balAfter - balBefore : _qty; + } else { + IERC20(_basset).safeTransferFrom(_sender, _recipient, _qty); + } + } +} \ No newline at end of file diff --git a/contracts/z_mocks/masset/MockBasketManager.sol b/contracts/z_mocks/masset/MockBasketManager.sol deleted file mode 100644 index efe51a50..00000000 --- a/contracts/z_mocks/masset/MockBasketManager.sol +++ /dev/null @@ -1,173 +0,0 @@ -pragma solidity 0.5.16; -pragma experimental ABIEncoderV2; - -import { BasketManager } from "../../masset/BasketManager.sol"; -import { MassetStructs } from "../../masset/shared/MassetStructs.sol"; -import { BasketManager } from "../../masset/BasketManager.sol"; -import { StableMath } from "../../shared/StableMath.sol"; - -// This mock allows the direct setting of basket properties -contract MockBasketManager is BasketManager { - - function setBasket(bool failed, uint256 colRatio) - external - { - basket.failed = failed; - basket.collateralisationRatio = colRatio; - } - function setBassetStatus(address bAsset, BassetStatus newStatus) - external - { - (, uint8 index) = _isAssetInBasket(bAsset); - basket.bassets[index].status = newStatus; - } - function setBassetRatio(address bAsset, uint256 _newRatio) - external - { - (, uint8 index) = _isAssetInBasket(bAsset); - basket.bassets[index].ratio = _newRatio; - } - function setRecol(bool undergoingRecol) - external - { - basket.undergoingRecol = undergoingRecol; - } -} - - - -// This mock returns an invalid forge from the prepareForgeBasset call -contract MockBasketManager1 is BasketManager { - - Basset private testBasset; - Basket private testBasket; - - constructor(address _bAsset) public { - testBasset = Basset({ - addr: _bAsset, - ratio: StableMath.getRatioScale(), - maxWeight: 0, - vaultBalance: 0, - status: BassetStatus.Normal, - isTransferFeeCharged: false - }); - basket.collateralisationRatio = 1e18; - } - - function getBasket() - external - view - returns ( - Basket memory b - ) - { - return basket; - } - - function prepareForgeBasset(address /*_amts*/, uint256 /*_amt*/, bool /*_mint*/) - external - returns ( - bool isValid, - BassetDetails memory bInfo - ) - { - bInfo = BassetDetails({ - bAsset: testBasset, - integrator: address(0), - index: 0 - }); - isValid = false; - } - - function prepareForgeBassets( - address[] calldata /*_amts*/, - uint256[] calldata /*_amts*/, - bool /* _isMint */ - ) - external - returns (ForgePropsMulti memory props) - { - Basset[] memory bAssets = new Basset[](1); - address[] memory integrators = new address[](1); - uint8[] memory indexes = new uint8[](1); - bAssets[0] = testBasset; - integrators[0] = address(0); - indexes[0] = 0; - return ForgePropsMulti({ - isValid: false, - bAssets: bAssets, - integrators: integrators, - indexes: indexes - }); - } - -} - - -// This mock returns an invalid integrator from the prepareForgeBasset call -contract MockBasketManager2 is MassetStructs { - - Basset private testBasset; - - constructor(address _bAsset) public { - testBasset = Basset({ - addr: _bAsset, - ratio: StableMath.getRatioScale(), - maxWeight: 0, - vaultBalance: 0, - status: BassetStatus.Normal, - isTransferFeeCharged: false - }); - } - - function prepareForgeBasset(address /*_token*/, uint256 /*_amt*/, bool /*_mint*/) - external - returns ( - bool isValid, - BassetDetails memory bInfo - ) - { - bInfo = BassetDetails({ - bAsset: testBasset, - integrator: address(0), - index: 0 - }); - isValid = true; - } - - function prepareForgeBassets( - address[] calldata /*bassets*/, - uint256[] calldata /*_amts*/, - bool /* _isMint */ - ) - external - returns (ForgePropsMulti memory props) - { - Basset[] memory bAssets = new Basset[](1); - address[] memory integrators = new address[](1); - uint8[] memory indexes = new uint8[](1); - bAssets[0] = testBasset; - integrators[0] = address(0); - indexes[0] = 0; - return ForgePropsMulti({ - isValid: true, - bAssets: bAssets, - integrators: integrators, - indexes: indexes - }); - } -} - -contract MockBasketManager3 is BasketManager { - function failBasket() public { - basket.failed = true; - } - - function setBassetStatus(address _bAsset, BassetStatus _status) public { - (bool exists, uint8 index) = _isAssetInBasket(_bAsset); - require(exists, "bAsset does not exist"); - basket.bassets[index].status = _status; - } - -} - diff --git a/contracts/z_mocks/masset/MockInvariantValidator.sol b/contracts/z_mocks/masset/MockInvariantValidator.sol new file mode 100644 index 00000000..9d3af7ab --- /dev/null +++ b/contracts/z_mocks/masset/MockInvariantValidator.sol @@ -0,0 +1,91 @@ +// SPDX-License-Identifier: AGPL-3.0-or-later +pragma solidity 0.8.0; + +import { IInvariantValidator } from "../../masset/IInvariantValidator.sol"; + +// Mock Invariant Validator simply returns 1:1 swap for swap, accounting for decimals +// Deducts any fee, too +contract MockInvariantValidator is IInvariantValidator { + + // Set this to output a diff amount than 1:1 + uint256 public outputMultiplier = 1000e15; + + /** + * @dev Set this to multiply output + * @param _multiplier Where 1.001x = 1001e15 + */ + function setMultiplier(uint256 _multiplier) external { + outputMultiplier = _multiplier; + } + + function _multiplyOutput(uint256 _output) internal view returns (uint256) { + return _output * outputMultiplier / 1e18; + } + + function computeMint( + BassetData[] calldata _bAssets, + uint8 _i, + uint256 _rawInput, + InvariantConfig memory _config + ) external view override returns (uint256) { + uint256 scaledInput = (_rawInput * _bAssets[_i].ratio) / 1e8; + return _multiplyOutput(scaledInput); + } + + function computeMintMulti( + BassetData[] calldata _bAssets, + uint8[] calldata _indices, + uint256[] calldata _rawInputs, + InvariantConfig memory _config + ) external view override returns (uint256) { + uint256 scaledInput; + uint8 idx; + uint256 len = _indices.length; + for (uint256 i = 0; i < len; i++) { + idx = _indices[i]; + scaledInput += (_rawInputs[i] * _bAssets[idx].ratio) / 1e8; + } + return _multiplyOutput(scaledInput); + } + + // Swap + function computeSwap( + BassetData[] calldata _bAssets, + uint8 _i, + uint8 _o, + uint256 _rawInput, + uint256 _feeRate, + InvariantConfig memory _config + ) external view override returns (uint256 bAssetOutputQuantity, uint256 scaledSwapFee) { + uint256 totalReceived = (_rawInput * _bAssets[_i].ratio) / 1e8; + scaledSwapFee = (totalReceived * _feeRate) / 1e18; + uint256 delta = totalReceived - scaledSwapFee; + bAssetOutputQuantity = _multiplyOutput((delta * 1e8) / _bAssets[_o].ratio); + } + + // Redeem + function computeRedeem( + BassetData[] calldata _bAssets, + uint8 _i, + uint256 _mAssetQuantity, + InvariantConfig memory _config + ) external view override returns (uint256) { + return _multiplyOutput((_mAssetQuantity * 1e8) / _bAssets[_i].ratio); + } + + function computeRedeemExact( + BassetData[] calldata _bAssets, + uint8[] calldata _indices, + uint256[] calldata _rawOutputs, + InvariantConfig memory _config + ) external view override returns (uint256) { + uint256 scaledOutput; + uint8 idx; + uint256 len = _indices.length; + for (uint256 i = 0; i < len; i++) { + idx = _indices[i]; + scaledOutput += (_rawOutputs[i] * _bAssets[idx].ratio) / 1e8; + } + return _multiplyOutput(scaledOutput); + } +} \ No newline at end of file diff --git a/contracts/z_mocks/masset/MockMasset.sol b/contracts/z_mocks/masset/MockMasset.sol index 3bb526be..b728044f 100644 --- a/contracts/z_mocks/masset/MockMasset.sol +++ b/contracts/z_mocks/masset/MockMasset.sol @@ -1,4 +1,5 @@ -pragma solidity 0.5.16; +// SPDX-License-Identifier: AGPL-3.0-or-later +pragma solidity 0.8.0; import { MockERC20 } from "../shared/MockERC20.sol"; @@ -55,7 +56,6 @@ contract MockMasset is MockERC20 { // Set back to zero platformAmountToMint = 0; } - } contract MockMasset1 is MockERC20 { diff --git a/contracts/masset/platform-integrations/AaveV2Integration.sol b/contracts/z_mocks/masset/MockPlatformIntegration.sol similarity index 66% rename from contracts/masset/platform-integrations/AaveV2Integration.sol rename to contracts/z_mocks/masset/MockPlatformIntegration.sol index 6e494a99..d6249d0b 100644 --- a/contracts/masset/platform-integrations/AaveV2Integration.sol +++ b/contracts/z_mocks/masset/MockPlatformIntegration.sol @@ -1,47 +1,118 @@ -pragma solidity 0.5.16; +pragma solidity 0.8.0; -import { - IAaveATokenV2, - IAaveLendingPoolV2, - ILendingPoolAddressesProviderV2 -} from "./IAave.sol"; -import { InitializableAbstractIntegration, MassetHelpers, IERC20, SafeMath } from "./InitializableAbstractIntegration.sol"; +// Internal +import { IPlatformIntegration } from "../../interfaces/IPlatformIntegration.sol"; +import { ImmutableModule } from "../../shared/ImmutableModule.sol"; +import { IAaveATokenV2, IAaveLendingPoolV2, ILendingPoolAddressesProviderV2 } from "./IAave.sol"; +// Libs +import { MassetHelpers } from "../../shared/MassetHelpers.sol"; +import { SafeERC20 } from "@openzeppelin/contracts-sol8/contracts/token/ERC20/SafeERC20.sol"; +import { IERC20 } from "@openzeppelin/contracts-sol8/contracts/token/ERC20/IERC20.sol"; + + +contract MockPlatformIntegration is + IPlatformIntegration, + ImmutableModule +{ + + using SafeERC20 for IERC20; + + event PTokenAdded(address indexed _bAsset, address _pToken); + event Whitelisted(address indexed _address); + + event Deposit(address indexed _bAsset, address _pToken, uint256 _amount); + event Withdrawal(address indexed _bAsset, address _pToken, uint256 _amount); + event PlatformWithdrawal(address indexed bAsset, address pToken, uint256 totalAmount, uint256 userAmount); + + // Core address for the given platform */ + address public platformAddress; + + // bAsset => pToken (Platform Specific Token Address) + mapping(address => address) public override bAssetToPToken; + // Full list of all bAssets supported here + address[] internal bAssetsMapped; + + mapping(address => bool) public whitelist; + + /** + * @dev Modifier to allow function calls only from the whitelisted address. + */ + modifier onlyWhitelisted() { + require(whitelist[msg.sender], "Not a whitelisted address"); + _; + } + + constructor(address _nexus, + address _platformAddress, + address[] memory _bAssets, + address[] memory _pTokens) ImmutableModule(_nexus) { + platformAddress = _platformAddress; + + uint256 bAssetCount = _bAssets.length; + require(bAssetCount == _pTokens.length, "Invalid input arrays"); + for(uint256 i = 0; i < bAssetCount; i++){ + _setPTokenAddress(_bAssets[i], _pTokens[i]); + } + } + + function addWhitelist( + address[] memory _whitelisted + ) + external + { + require(_whitelisted.length > 0, "Empty whitelist array"); + + for(uint256 i = 0; i < _whitelisted.length; i++) { + _addWhitelist(_whitelisted[i]); + } + } + + /** + * @dev Adds a new whitelist address + * @param _address Address to add in whitelist + */ + function _addWhitelist(address _address) internal { + require(_address != address(0), "Address is zero"); + require(! whitelist[_address], "Already whitelisted"); + + whitelist[_address] = true; + + emit Whitelisted(_address); + } -/** - * @title AaveV2Integration - * @author Stability Labs Pty. Ltd. - * @notice A simple connection to deposit and withdraw bAssets from Aave - * @dev VERSION: 1.0 - * DATE: 2020-16-11 - */ -contract AaveV2Integration is InitializableAbstractIntegration { - event RewardTokenApproved(address rewardToken, address account); /*************************************** - ADMIN + CONFIG ****************************************/ /** - * @dev Approves Liquidator to spend reward tokens + * @dev Provide support for bAsset by passing its pToken address. + * This method can only be called by the system Governor + * @param _bAsset Address for the bAsset + * @param _pToken Address for the corresponding platform token */ - function approveRewardToken() + function setPTokenAddress(address _bAsset, address _pToken) external onlyGovernor { - address liquidator = nexus.getModule(keccak256("Liquidator")); - require(liquidator != address(0), "Liquidator address cannot be zero"); + _setPTokenAddress(_bAsset, _pToken); + } - // Official checksummed AAVE token address - // https://ethplorer.io/address/0x7Fc66500c84A76Ad7e9c93437bFc5Ac33E2DDaE9 - address aaveToken = address(0x7Fc66500c84A76Ad7e9c93437bFc5Ac33E2DDaE9); + function _setPTokenAddress(address _bAsset, address _pToken) + internal + { + require(bAssetToPToken[_bAsset] == address(0), "pToken already set"); + require(_bAsset != address(0) && _pToken != address(0), "Invalid addresses"); - MassetHelpers.safeInfiniteApprove(aaveToken, liquidator); + bAssetToPToken[_bAsset] = _pToken; + bAssetsMapped.push(_bAsset); - emit RewardTokenApproved(address(aaveToken), liquidator); - } + emit PTokenAdded(_bAsset, _pToken); + _abstractSetPToken(_bAsset, _pToken); + } /*************************************** CORE @@ -62,8 +133,8 @@ contract AaveV2Integration is InitializableAbstractIntegration { bool _hasTxFee ) external + override onlyWhitelisted - nonReentrant returns (uint256 quantityDeposited) { require(_amount > 0, "Must deposit something"); @@ -77,7 +148,7 @@ contract AaveV2Integration is InitializableAbstractIntegration { uint256 prevBal = _checkBalance(aToken); _getLendingPool().deposit(_bAsset, _amount, address(this), 36); uint256 newBal = _checkBalance(aToken); - quantityDeposited = _min(quantityDeposited, newBal.sub(prevBal)); + quantityDeposited = _min(quantityDeposited, newBal - prevBal); } else { _getLendingPool().deposit(_bAsset, _amount, address(this), 36); } @@ -99,8 +170,8 @@ contract AaveV2Integration is InitializableAbstractIntegration { bool _hasTxFee ) external + override onlyWhitelisted - nonReentrant { _withdraw(_receiver, _bAsset, _amount, _amount, _hasTxFee); } @@ -121,8 +192,8 @@ contract AaveV2Integration is InitializableAbstractIntegration { bool _hasTxFee ) external + override onlyWhitelisted - nonReentrant { _withdraw(_receiver, _bAsset, _amount, _totalAmount, _hasTxFee); } @@ -165,8 +236,8 @@ contract AaveV2Integration is InitializableAbstractIntegration { uint256 _amount ) external + override onlyWhitelisted - nonReentrant { require(_amount > 0, "Must withdraw something"); require(_receiver != address(0), "Must specify recipient"); @@ -186,6 +257,7 @@ contract AaveV2Integration is InitializableAbstractIntegration { */ function checkBalance(address _bAsset) external + override returns (uint256 balance) { // balance is always with token aToken decimals @@ -277,4 +349,18 @@ contract AaveV2Integration is InitializableAbstractIntegration { return _aToken.balanceOf(address(this)); } -} + /*************************************** + HELPERS + ****************************************/ + + /** + * @dev Simple helper func to get the min of two values + */ + function _min(uint256 x, uint256 y) + internal + pure + returns (uint256) + { + return x > y ? y : x; + } +} \ No newline at end of file diff --git a/contracts/z_mocks/masset/platform-integrations/DeadIntegration.sol b/contracts/z_mocks/masset/platform-integrations/DeadIntegration.sol deleted file mode 100644 index 6599941f..00000000 --- a/contracts/z_mocks/masset/platform-integrations/DeadIntegration.sol +++ /dev/null @@ -1,16 +0,0 @@ -pragma solidity 0.5.16; - - - -/** - * @dev This file is used purely to allow the instantiation of BasketManagers - * initialize function with dead data. This stops attackers calling the func - * and initializing the contract with data. Even though this is the implementation - * contract of a proxy and the storage will not be used. - */ -contract DeadIntegration { - - function checkBalance(address /*_bAsset*/) external returns (uint256 balance) { - return 0; - } -} \ No newline at end of file diff --git a/contracts/z_mocks/masset/platform-integrations/MockAave.sol b/contracts/z_mocks/masset/platform-integrations/MockAave.sol deleted file mode 100644 index 15755820..00000000 --- a/contracts/z_mocks/masset/platform-integrations/MockAave.sol +++ /dev/null @@ -1,237 +0,0 @@ -pragma solidity 0.5.16; - -import { - IAaveATokenV1, - IAaveATokenV2, - IAaveLendingPoolV1, - IAaveLendingPoolV2, - ILendingPoolAddressesProviderV1, - ILendingPoolAddressesProviderV2 -} from "../../../masset/platform-integrations/IAave.sol"; -import { AaveIntegration } from "../../../masset/platform-integrations/AaveIntegration.sol"; -import { AaveV2Integration } from "../../../masset/platform-integrations/AaveV2Integration.sol"; - -import { MassetHelpers, SafeERC20, SafeMath } from "../../../masset/shared/MassetHelpers.sol"; -import { StableMath } from "../../../shared/StableMath.sol"; -import { IERC20, ERC20, ERC20Mintable } from "@openzeppelin/contracts/token/ERC20/ERC20Mintable.sol"; -import { ERC20Burnable } from "@openzeppelin/contracts/token/ERC20/ERC20Burnable.sol"; - - -// 1. User calls 'getLendingPool' -// 2. User calls 'deposit' (Aave) -// - Deposit their underlying -// - Mint aToken to them -// 3. User calls redeem (aToken) -// - Retrieve their aToken -// - Return equal amount of underlying - -contract MockAToken is ERC20Mintable { - - address public lendingPool; - IERC20 public underlyingToken; - using SafeERC20 for IERC20; - - constructor(address _lendingPool, IERC20 _underlyingToken) public { - lendingPool = _lendingPool; - underlyingToken = _underlyingToken; - addMinter(_lendingPool); - } - - function redeem(uint256 _amount) external { - // Redeem these a Tokens - _burn(msg.sender, _amount); - // For the underlying - underlyingToken.safeTransferFrom(lendingPool, msg.sender, _amount); - } -} - - -contract MockATokenV2 is ERC20Mintable { - - address public lendingPool; - IERC20 public underlyingToken; - using SafeERC20 for IERC20; - - constructor(address _lendingPool, IERC20 _underlyingToken) public { - lendingPool = _lendingPool; - underlyingToken = _underlyingToken; - addMinter(_lendingPool); - } - - function burn(address user, uint256 amount) public { - _burn(user, amount); - } -} - - - -contract MockAaveV1 is IAaveLendingPoolV1, ILendingPoolAddressesProviderV1 { - - using SafeMath for uint256; - using SafeERC20 for IERC20; - - mapping(address => address) reserveToAToken; - address pool = address(this); - address payable core = address(uint160(address(this))); - - function addAToken(address _aToken, address _underlying) public { - MassetHelpers.safeInfiniteApprove(_underlying, _aToken); - reserveToAToken[_underlying] = _aToken; - } - - function deposit(address _reserve, uint256 _amount, uint16 /*_referralCode*/) external { - uint256 previousBal = IERC20(reserveToAToken[_reserve]).balanceOf(msg.sender); - uint256 factor = 2 * (10**13); // 0.002% - uint256 interest = previousBal.mul(factor).div(1e18); - ERC20Mintable(reserveToAToken[_reserve]).mint(msg.sender, interest); - // Take their reserve - transferTokens(msg.sender, address(this), _reserve, true, _amount); - // Credit them with aToken - ERC20Mintable(reserveToAToken[_reserve]).mint(msg.sender, _amount); - } - - - function transferTokens( - address _sender, - address _recipient, - address _basset, - bool _hasTxFee, - uint256 _qty - ) - internal - returns (uint256 receivedQty) - { - receivedQty = _qty; - if(_hasTxFee) { - uint256 balBefore = IERC20(_basset).balanceOf(_recipient); - IERC20(_basset).safeTransferFrom(_sender, _recipient, _qty); - uint256 balAfter = IERC20(_basset).balanceOf(_recipient); - receivedQty = StableMath.min(_qty, balAfter.sub(balBefore)); - } else { - IERC20(_basset).safeTransferFrom(_sender, _recipient, _qty); - } - } - - function getLendingPool() external view returns (address) { - return pool; - } - - function getLendingPoolCore() external view returns (address payable) { - return core; - } - - function breakLendingPools() external { - pool = address(0); - core = address(uint160(address(0))); - } - - function migrateLendingPools(address payable _new) external { - pool = _new; - core = _new; - } -} - - -contract MockAaveV2 is IAaveLendingPoolV2, ILendingPoolAddressesProviderV2 { - - using SafeMath for uint256; - using SafeERC20 for IERC20; - - mapping(address => address) reserveToAToken; - address pool = address(this); - address payable core = address(uint160(address(this))); - - function addAToken(address _aToken, address _underlying) public { - MassetHelpers.safeInfiniteApprove(_underlying, _aToken); - reserveToAToken[_underlying] = _aToken; - } - - function deposit(address _reserve, uint256 _amount, address /* _onBehalfOf */, uint16 /*_referralCode*/) external { - uint256 previousBal = IERC20(reserveToAToken[_reserve]).balanceOf(msg.sender); - uint256 factor = 2 * (10**13); // 0.002% - uint256 interest = previousBal.mul(factor).div(1e18); - ERC20Mintable(reserveToAToken[_reserve]).mint(msg.sender, interest); - // Take their reserve - transferTokens(msg.sender, address(this), _reserve, true, _amount); - // Credit them with aToken - ERC20Mintable(reserveToAToken[_reserve]).mint(msg.sender, _amount); - } - - function withdraw( - address reserve, - uint256 amount, - address to - ) external { - MockATokenV2(reserveToAToken[reserve]).burn(msg.sender, amount); - IERC20(reserve).transfer(to, amount); - } - - function getLendingPool() external view returns (address) { - return pool; - } - - function breakLendingPools() external { - pool = address(0); - core = address(uint160(address(0))); - } - - - function transferTokens( - address _sender, - address _recipient, - address _basset, - bool _hasTxFee, - uint256 _qty - ) - internal - returns (uint256 receivedQty) - { - receivedQty = _qty; - if(_hasTxFee) { - uint256 balBefore = IERC20(_basset).balanceOf(_recipient); - IERC20(_basset).safeTransferFrom(_sender, _recipient, _qty); - uint256 balAfter = IERC20(_basset).balanceOf(_recipient); - receivedQty = StableMath.min(_qty, balAfter.sub(balBefore)); - } else { - IERC20(_basset).safeTransferFrom(_sender, _recipient, _qty); - } - } -} - - -contract MockAaveIntegration is AaveIntegration { - - // event CurrentBalance(address indexed bAsset, uint256 balance); - - function logBalance(address _bAsset) - external - view - returns (uint256 balance) - { - // balance is always with token aToken decimals - IAaveATokenV1 aToken = _getATokenFor(_bAsset); - balance = _checkBalance(aToken); - - // emit CurrentBalance(_bAsset, balance); - } - - function getBassetsMapped() - external - view - returns (address[] memory bassets) - { - return bAssetsMapped; - } -} - - -contract MockAaveV2Integration is AaveV2Integration { - - function getBassetsMapped() - external - view - returns (address[] memory bassets) - { - return bAssetsMapped; - } -} diff --git a/contracts/z_mocks/masset/platform-integrations/MockCToken.sol b/contracts/z_mocks/masset/platform-integrations/MockCToken.sol deleted file mode 100644 index 775774cc..00000000 --- a/contracts/z_mocks/masset/platform-integrations/MockCToken.sol +++ /dev/null @@ -1,79 +0,0 @@ -pragma solidity 0.5.16; - -import { ICERC20 } from "../../../masset/platform-integrations/ICompound.sol"; - -import { IERC20, ERC20, ERC20Mintable } from "@openzeppelin/contracts/token/ERC20/ERC20Mintable.sol"; -import { ERC20Detailed } from "@openzeppelin/contracts/token/ERC20/ERC20Detailed.sol"; -import { StableMath } from "../../../shared/StableMath.sol"; - - -// 1. User calls 'getLendingPool' -// 2. User calls 'deposit' (Aave) -// - Deposit their underlying -// - Mint aToken to them -// 3. User calls redeem (aToken) -// - Retrieve their aToken -// - Return equal amount of underlying - -contract MockCToken is ICERC20, ERC20, ERC20Detailed, ERC20Mintable { - - using StableMath for uint; - - IERC20 public underlyingToken; - // underlying = cToken * exchangeRate - // cToken = underlying / exchangeRate - uint256 exchangeRate; - - constructor(ERC20Detailed _underlyingToken) public ERC20Detailed("cMock", "cMK", 8) { - uint8 underlyingDecimals = _underlyingToken.decimals(); - // if has 18 dp, exchange rate should be 1e26 - // if has 8 dp, echange rate should be 1e18 - if(underlyingDecimals > 8) { - exchangeRate = 10 ** uint256(18 + underlyingDecimals - 10); - } else if(underlyingDecimals < 8) { - // e.g. 18-8+6 = 16 - exchangeRate = 10 ** uint256(18 - 8 + underlyingDecimals); - } else { - exchangeRate = 1e18; - } - underlyingToken = _underlyingToken; - } - - - function mint(uint mintAmount) external returns (uint) { - // Pretend to inflate the cTokenExchangeRate - updateExchangeRate(); - // Take their reserve - underlyingToken.transferFrom(msg.sender, address(this), mintAmount); - // Credit them with cToken - _mint(msg.sender, mintAmount.add(1).divPrecisely(exchangeRate)); - return 0; - } - - function redeemUnderlying(uint redeemAmount) external returns (uint) { - // Pretend to inflate the cTokenExchangeRate - updateExchangeRate(); - - uint256 cTokens = redeemAmount.add(1).divPrecisely(exchangeRate); - // Burn the cToken - _burn(msg.sender, cTokens); - // Send them back their reserve - underlyingToken.transfer(msg.sender, redeemAmount); - return 0; - } - - function balanceOfUnderlying(address owner) external returns (uint) { - // updateExchangeRate(); - uint256 cTokenBal = this.balanceOf(owner); - return cTokenBal.mulTruncate(exchangeRate); - } - - function updateExchangeRate() internal returns (uint256){ - uint256 factor = 100002 * (10**13); // 0.002% - exchangeRate = exchangeRate.mulTruncate(factor); - } - - function exchangeRateStored() external view returns (uint) { - return exchangeRate; - } -} diff --git a/contracts/z_mocks/masset/platform-integrations/MockCompoundIntegration.sol b/contracts/z_mocks/masset/platform-integrations/MockCompoundIntegration.sol deleted file mode 100644 index 00274ec5..00000000 --- a/contracts/z_mocks/masset/platform-integrations/MockCompoundIntegration.sol +++ /dev/null @@ -1,58 +0,0 @@ -pragma solidity 0.5.16; - -import { CompoundIntegration, ICERC20, IERC20, MassetHelpers } from "../../../masset/platform-integrations/CompoundIntegration.sol"; - - -// Overrides approveRewardToken -contract MockCompoundIntegration1 is CompoundIntegration { - - address rewardToken; - - // @override - function approveRewardToken() - external - { - address liquidator = nexus.getModule(keccak256("Liquidator")); - require(liquidator != address(0), "Liquidator address cannot be zero"); - - MassetHelpers.safeInfiniteApprove(rewardToken, liquidator); - - emit RewardTokenApproved(rewardToken, liquidator); - } - - function setRewardToken(address _token) external { - rewardToken = _token; - } -} - - -// Mock contract to mock `checkBalance` -contract MockCompoundIntegration2 is CompoundIntegration { - - event CurrentBalance(address indexed bAsset, uint256 balance); - - function logBalance(address _bAsset) - external - returns (uint256 balance) - { - // balance is always with token cToken decimals - ICERC20 cToken = _getCTokenFor(_bAsset); - balance = _checkBalance(cToken); - - emit CurrentBalance(_bAsset, balance); - } - - uint256 bal; - // Inject custom balance - function setCustomBalance(uint256 _bal) external { - bal = _bal; - } - - function checkBalance(address /*_bAsset*/) - external - returns (uint256 balance) - { - balance = bal; - } - -} \ No newline at end of file diff --git a/contracts/z_mocks/masset/platform-integrations/MockUpgradedAaveIntegration.sol b/contracts/z_mocks/masset/platform-integrations/MockUpgradedAaveIntegration.sol deleted file mode 100644 index ff519213..00000000 --- a/contracts/z_mocks/masset/platform-integrations/MockUpgradedAaveIntegration.sol +++ /dev/null @@ -1,417 +0,0 @@ -pragma solidity 0.5.16; - -import { InitializableAbstractIntegration, MassetHelpers, IERC20 } from "../../../masset/platform-integrations/InitializableAbstractIntegration.sol"; - -import { IAaveATokenV1, IAaveLendingPoolV1, ILendingPoolAddressesProviderV1 } from "../../../masset/platform-integrations/IAave.sol"; - -contract AaveIntegrationV2 is InitializableAbstractIntegration { - - // new variable - uint256 public newUint = 1; - - /*************************************** - CORE - ****************************************/ - - function deposit( - address _bAsset, - uint256 _amount, - bool _hasTxFee - ) - external - onlyWhitelisted - returns (uint256 quantityDeposited) - { - // Get the Target token - IAaveATokenV1 aToken = _getATokenFor(_bAsset); - - // We should have been sent this amount, if not, the deposit will fail - quantityDeposited = _amount; - - uint16 referralCode = 9999; // temp code - - if(_hasTxFee) { - // If we charge a fee, account for it - uint256 prevBal = _checkBalance(aToken); - _getLendingPool().deposit(address(_bAsset), _amount, referralCode); - uint256 newBal = _checkBalance(aToken); - quantityDeposited = _min(quantityDeposited, newBal.sub(prevBal)); - } else { - // aTokens are 1:1 for each asset - _getLendingPool().deposit(address(_bAsset), _amount, referralCode); - } - - emit Deposit(_bAsset, address(aToken), quantityDeposited); - } - - function withdraw( - address _receiver, - address _bAsset, - uint256 _amount, - uint256 _totalAmount, - bool /*_hasTxFee*/ - ) - external - onlyWhitelisted - { - _withdraw(_receiver, _bAsset, _amount, _totalAmount, true); - } - - function withdraw( - address _receiver, - address _bAsset, - uint256 _amount, - bool /*_hasTxFee*/ - ) - external - onlyWhitelisted - { - _withdraw(_receiver, _bAsset, _amount, _amount, true); - } - - function _withdraw( - address _receiver, - address _bAsset, - uint256 _amount, - uint256 _totalAmount, - bool /*_hasTxFee*/ - ) - internal - { - // Get the Target token - IAaveATokenV1 aToken = _getATokenFor(_bAsset); - - // Don't need to Approve aToken, as it gets burned in redeem() - aToken.redeem(_totalAmount); - - // Send redeemed bAsset to the receiver - IERC20(_bAsset).safeTransfer(_receiver, _amount); - - emit Withdrawal(_bAsset, address(aToken), _amount); - } - - - - function withdrawRaw(address _receiver, address _bAsset, uint256 _amount) external { - - IERC20(_bAsset).safeTransfer(_receiver, _amount); - emit Withdrawal(_bAsset, address(0), _amount); - } - - // FUNCTION DEFINITION MODIFIED - function checkBalance(address _bAsset) - external - returns (uint256 balance) - { - // balance is always with token aToken decimals - IAaveATokenV1 aToken = _getATokenFor(_bAsset); - // ADDED 100 to the token balance just to check upgrade - return _checkBalance(aToken).add(100); - } - - - /*************************************** - APPROVALS - ****************************************/ - - function reApproveAllTokens() - external - onlyGovernor - { - uint256 bAssetCount = bAssetsMapped.length; - address lendingPoolVault = _getLendingPoolCore(); - // approve the pool to spend the bAsset - for(uint i = 0; i < bAssetCount; i++){ - MassetHelpers.safeInfiniteApprove(bAssetsMapped[i], lendingPoolVault); - } - } - - function _abstractSetPToken(address _bAsset, address /*_pToken*/) - internal - { - address lendingPoolVault = _getLendingPoolCore(); - // approve the pool to spend the bAsset - MassetHelpers.safeInfiniteApprove(_bAsset, lendingPoolVault); - } - - function _abstractUpdatePToken(address _bAsset, address _oldPToken, address _pToken) - internal - { - // No need to re-approve the pool, as it already has access to this bAsset - } - - /*************************************** - HELPERS - ****************************************/ - - function _getLendingPool() - internal - view - returns (IAaveLendingPoolV1) - { - address lendingPool = ILendingPoolAddressesProviderV1(platformAddress).getLendingPool(); - require(lendingPool != address(0), "Lending pool does not exist"); - return IAaveLendingPoolV1(lendingPool); - } - - function _getLendingPoolCore() - internal - view - returns (address) - { - address lendingPoolCore = ILendingPoolAddressesProviderV1(platformAddress).getLendingPoolCore(); - require(lendingPoolCore != address(0), "Lending pool does not exist"); - return lendingPoolCore; - } - - function _getATokenFor(address _bAsset) - internal - view - returns (IAaveATokenV1) - { - address aToken = bAssetToPToken[_bAsset]; - require(aToken != address(0), "aToken does not exist"); - return IAaveATokenV1(aToken); - } - - function _checkBalance(IAaveATokenV1 _aToken) - internal - view - returns (uint256 balance) - { - return _aToken.balanceOf(address(this)); - } - - // NEW FUNCTIONS - // =============== - function initializeNewUint() external onlyProxyAdmin { - newUint = 1; - } - - function newMethod() public pure returns (bool) { - return true; - } - - // MODIFIED FUNCTIONS - // ================== - function setPTokenAddress(address /*_bAsset*/, address /*_pToken*/) - external - onlyGovernor - { - // This is just to test upgradibility - revert("Not allowed to add more pTokens"); - } - - -} - -contract AaveIntegrationV3 is InitializableAbstractIntegration { - - uint256 public newUint = 1; - - /*************************************** - CORE - ****************************************/ - - function deposit( - address _bAsset, - uint256 _amount, - bool _hasTxFee - ) - external - onlyWhitelisted - returns (uint256 quantityDeposited) - { - // Get the Target token - IAaveATokenV1 aToken = _getATokenFor(_bAsset); - - // We should have been sent this amount, if not, the deposit will fail - quantityDeposited = _amount; - - uint16 referralCode = 9999; // temp code - - if(_hasTxFee) { - // If we charge a fee, account for it - uint256 prevBal = _checkBalance(aToken); - _getLendingPool().deposit(address(_bAsset), _amount, referralCode); - uint256 newBal = _checkBalance(aToken); - quantityDeposited = _min(quantityDeposited, newBal.sub(prevBal)); - } else { - // aTokens are 1:1 for each asset - _getLendingPool().deposit(address(_bAsset), _amount, referralCode); - } - - emit Deposit(_bAsset, address(aToken), quantityDeposited); - } - - function withdraw( - address _receiver, - address _bAsset, - uint256 _amount, - uint256 _totalAmount, - bool /*_hasTxFee*/ - ) - external - onlyWhitelisted - { - _withdraw(_receiver, _bAsset, _amount, _totalAmount, true); - } - - function withdraw( - address _receiver, - address _bAsset, - uint256 _amount, - bool /*_hasTxFee*/ - ) - external - onlyWhitelisted - { - _withdraw(_receiver, _bAsset, _amount, _amount, true); - } - - function _withdraw( - address _receiver, - address _bAsset, - uint256 _amount, - uint256 _totalAmount, - bool /*_hasTxFee*/ - ) - internal - { - // Get the Target token - IAaveATokenV1 aToken = _getATokenFor(_bAsset); - - // Don't need to Approve aToken, as it gets burned in redeem() - aToken.redeem(_totalAmount); - - // Send redeemed bAsset to the receiver - IERC20(_bAsset).safeTransfer(_receiver, _amount); - - emit Withdrawal(_bAsset, address(aToken), _amount); - } - function withdrawRaw(address _receiver, address _bAsset, uint256 _amount) external { - - IERC20(_bAsset).safeTransfer(_receiver, _amount); - emit Withdrawal(_bAsset, address(0), _amount); - } - - function checkBalance(address _bAsset) - external - returns (uint256 balance) - { - // balance is always with token aToken decimals - IAaveATokenV1 aToken = _getATokenFor(_bAsset); - // ADDED 100 to the token balance just to check upgrade - return _checkBalance(aToken).add(100); - } - - - /*************************************** - APPROVALS - ****************************************/ - - function reApproveAllTokens() - external - onlyGovernor - { - uint256 bAssetCount = bAssetsMapped.length; - address lendingPoolVault = _getLendingPoolCore(); - // approve the pool to spend the bAsset - for(uint i = 0; i < bAssetCount; i++){ - MassetHelpers.safeInfiniteApprove(bAssetsMapped[i], lendingPoolVault); - } - } - - function _abstractSetPToken(address _bAsset, address /*_pToken*/) - internal - { - address lendingPoolVault = _getLendingPoolCore(); - // approve the pool to spend the bAsset - MassetHelpers.safeInfiniteApprove(_bAsset, lendingPoolVault); - } - - function _abstractUpdatePToken(address _bAsset, address _oldPToken, address _pToken) - internal - { - // No need to re-approve the pool, as it already has access to this bAsset - } - - /*************************************** - HELPERS - ****************************************/ - - function _getLendingPool() - internal - view - returns (IAaveLendingPoolV1) - { - address lendingPool = ILendingPoolAddressesProviderV1(platformAddress).getLendingPool(); - require(lendingPool != address(0), "Lending pool does not exist"); - return IAaveLendingPoolV1(lendingPool); - } - - // NEW - function checkBalanceView(address _bAsset) - external - view - returns (uint256 balance) - { - // balance is always with token aToken decimals - IAaveATokenV1 aToken = _getATokenFor(_bAsset); - // ADDED 100 to the token balance just to check upgrade - return _checkBalance(aToken); - } - - function _getLendingPoolCore() - internal - view - returns (address) - { - address lendingPoolCore = ILendingPoolAddressesProviderV1(platformAddress).getLendingPoolCore(); - require(lendingPoolCore != address(0), "Lending pool does not exist"); - return lendingPoolCore; - } - - function _getATokenFor(address _bAsset) - internal - view - returns (IAaveATokenV1) - { - address aToken = bAssetToPToken[_bAsset]; - require(aToken != address(0), "aToken does not exist"); - return IAaveATokenV1(aToken); - } - - function _checkBalance(IAaveATokenV1 _aToken) - internal - view - returns (uint256 balance) - { - return _aToken.balanceOf(address(this)); - } - - // NEW FUNCTIONS - // =============== - function initializeNewUint() external onlyProxyAdmin { - newUint = 1; - } - - // Deleted from V3 - /* - function newMethod() public pure returns (bool) { - return true; - } - */ - - // MODIFIED FUNCTIONS - // ================== - function setPTokenAddress(address /* _bAsset*/, address /*_pToken*/) - external - onlyGovernor - { - // This is just to test upgradibility - revert("Not allowed to add more pTokens"); - } - - -} \ No newline at end of file diff --git a/contracts/z_mocks/nexus/MockNexus.sol b/contracts/z_mocks/nexus/MockNexus.sol index bcf7d543..7af5297d 100644 --- a/contracts/z_mocks/nexus/MockNexus.sol +++ b/contracts/z_mocks/nexus/MockNexus.sol @@ -1,44 +1,33 @@ -pragma solidity 0.5.16; +// SPDX-License-Identifier: AGPL-3.0-or-later +pragma solidity 0.8.0; -import { Nexus } from "../../nexus/Nexus.sol"; import { ModuleKeys } from "../../shared/ModuleKeys.sol"; -contract MockNexus is Nexus, ModuleKeys { +contract MockNexus is ModuleKeys { + address public governor; + bool private _initialized; + + mapping(bytes32 => address) public modules; constructor( address _governorAddr, - address _governance, - address _manager + address _savingsManager ) - public - Nexus(_governorAddr) { - // Initialize Nexus with Mock addresses for Modules - // Directly adding Mock modules - - // Governance and Manager addresses are required to be passed from the test, as these - // addresses needs to sign the transaction to test modifiers - modules[KEY_GOVERNANCE] = Module({addr: _governance, isLocked: false}); - modules[KEY_MANAGER] = Module({addr: _manager, isLocked: false}); - - modules[KEY_STAKING] = Module({addr: address(0x1), isLocked: false}); - modules[KEY_ORACLE_HUB] = Module({addr: address(0x2), isLocked: false}); - modules[KEY_RECOLLATERALISER] = Module({addr: address(0x3), isLocked: false}); - modules[KEY_META_TOKEN] = Module({addr: address(0x4), isLocked: false}); - modules[KEY_SAVINGS_MANAGER] = Module({addr: address(0x5), isLocked: false}); - - initialized = true; + governor = _governorAddr; + modules[KEY_SAVINGS_MANAGER] = _savingsManager; + _initialized = true; } - function setProxyAdmin(address _proxyAdmin) external { - modules[KEY_PROXY_ADMIN] = Module({addr: _proxyAdmin, isLocked: true}); + function initialized() external view returns (bool){ + return _initialized; } - function setSavingsManager(address _savingsManager) external { - modules[KEY_SAVINGS_MANAGER] = Module({addr: _savingsManager, isLocked: true}); + function getModule(bytes32 _key) external view returns (address) { + return modules[_key]; } - function setLiquidator(address _liquidator) external { - modules[KEY_LIQUIDATOR] = Module({addr: _liquidator, isLocked: true}); + function setSavingsManager(address _savingsManager) external { + modules[KEY_SAVINGS_MANAGER] = _savingsManager; } } \ No newline at end of file diff --git a/contracts/z_mocks/rewards/MockRewardsDistributionRecipient.sol b/contracts/z_mocks/rewards/MockRewardsDistributionRecipient.sol deleted file mode 100644 index 7d6e5b99..00000000 --- a/contracts/z_mocks/rewards/MockRewardsDistributionRecipient.sol +++ /dev/null @@ -1,23 +0,0 @@ -pragma solidity 0.5.16; - -import { IERC20 } from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; -import { IRewardsDistributionRecipient } from "../../interfaces/IRewardsDistributionRecipient.sol"; - -contract MockRewardsDistributionRecipient is IRewardsDistributionRecipient { - - IERC20 public rewardToken; - - constructor(IERC20 _rewardToken) public { - rewardToken = _rewardToken; - } - - function notifyRewardAmount(uint256 reward) - external - { - // do nothing - } - - function getRewardToken() external view returns (IERC20) { - return rewardToken; - } -} diff --git a/contracts/z_mocks/savings/MockRevenueRecipient.sol b/contracts/z_mocks/savings/MockRevenueRecipient.sol deleted file mode 100644 index 66a24e76..00000000 --- a/contracts/z_mocks/savings/MockRevenueRecipient.sol +++ /dev/null @@ -1,12 +0,0 @@ -pragma solidity 0.5.16; - -import { IRevenueRecipient } from "../../interfaces/ISavingsManager.sol"; -import { IERC20 } from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; - -contract MockRevenueRecipient is IRevenueRecipient { - - - function notifyRedistributionAmount(address _mAsset, uint256 _amount) external { - IERC20(_mAsset).transferFrom(msg.sender, address(this), _amount); - } -} \ No newline at end of file diff --git a/contracts/z_mocks/savings/MockSavingsManager.sol b/contracts/z_mocks/savings/MockSavingsManager.sol index 082deee7..cec3e089 100644 --- a/contracts/z_mocks/savings/MockSavingsManager.sol +++ b/contracts/z_mocks/savings/MockSavingsManager.sol @@ -1,7 +1,31 @@ -pragma solidity 0.5.16; +// SPDX-License-Identifier: AGPL-3.0-or-later +pragma solidity 0.8.0; + +import { IMasset } from "../../interfaces/IMasset.sol"; +import { ISavingsContractV1 } from "../../interfaces/ISavingsContract.sol"; +import { IERC20 } from "../shared/MockERC20.sol"; contract MockSavingsManager { - function collectAndDistributeInterest(address /* _mAsset*/) public { - return; + + address public immutable save; + + constructor(address _save) { + save = _save; + } + + function collectAndDistributeInterest(address _mAsset) public { + require(save != address(0), "Must have a valid savings contract"); + + // 1. Collect the new interest from the mAsset + IMasset mAsset = IMasset(_mAsset); + (uint256 interestCollected, uint256 totalSupply) = mAsset.collectInterest(); + + // 3. Validate that interest is collected correctly and does not exceed max APY + if(interestCollected > 0) { + + IERC20(_mAsset).approve(save, interestCollected); + + ISavingsContractV1(save).depositInterest(interestCollected); + } } } \ No newline at end of file diff --git a/contracts/z_mocks/savings/MockStakingContract.sol b/contracts/z_mocks/savings/MockStakingContract.sol new file mode 100644 index 00000000..2310b9e2 --- /dev/null +++ b/contracts/z_mocks/savings/MockStakingContract.sol @@ -0,0 +1,15 @@ +// SPDX-License-Identifier: AGPL-3.0-or-later +pragma solidity 0.8.0; + +contract MockStakingContract { + + mapping (address => uint256) private _balances; + + function setBalanceOf(address account, uint256 balance) public { + _balances[account] = balance; + } + + function balanceOf(address account) public view returns (uint256) { + return _balances[account]; + } +} \ No newline at end of file diff --git a/contracts/z_mocks/savings/connectors/MockConnector.sol b/contracts/z_mocks/savings/connectors/MockConnector.sol new file mode 100644 index 00000000..60691e77 --- /dev/null +++ b/contracts/z_mocks/savings/connectors/MockConnector.sol @@ -0,0 +1,45 @@ +// SPDX-License-Identifier: AGPL-3.0-or-later +pragma solidity 0.8.0; + +import { IERC20, ERC20 } from "@openzeppelin/contracts-sol8/contracts/token/ERC20/ERC20.sol"; +import { IConnector } from "../../../savings/peripheral/IConnector.sol"; + + +contract MockConnector is IConnector { + + address save; + address mUSD; + uint256 deposited; + + constructor( + address _save, + address _mUSD + ) public { + save = _save; + mUSD = _mUSD; + } + + modifier onlySave() { + require(save == msg.sender, "Only SAVE can call this"); + _; + } + + function deposit(uint256 _amount) external override onlySave { + IERC20(mUSD).transferFrom(save, address(this), _amount); + deposited += _amount; + } + + function withdraw(uint256 _amount) external override onlySave { + IERC20(mUSD).transfer(save, _amount); + deposited -= _amount; + } + + function withdrawAll() external override onlySave { + IERC20(mUSD).transfer(save, deposited); + deposited = 0; + } + + function checkBalance() external override view returns (uint256) { + return deposited; + } +} \ No newline at end of file diff --git a/contracts/z_mocks/savings/connectors/MockErroneousConnector1.sol b/contracts/z_mocks/savings/connectors/MockErroneousConnector1.sol new file mode 100644 index 00000000..c1ba8a18 --- /dev/null +++ b/contracts/z_mocks/savings/connectors/MockErroneousConnector1.sol @@ -0,0 +1,64 @@ +// SPDX-License-Identifier: AGPL-3.0-or-later +pragma solidity 0.8.0; + +import { IERC20, ERC20 } from "@openzeppelin/contracts-sol8/contracts/token/ERC20/ERC20.sol"; +import { IConnector } from "../../../savings/peripheral/IConnector.sol"; + + +// 1. Doesn't withdraw full amount during withdrawal +contract MockErroneousConnector1 is IConnector { + + address save; + address mUSD; + + uint256 lastValue; + uint256 lastAccrual; + uint256 constant perSecond = 31709791983; + + constructor( + address _save, + address _mUSD + ) public { + save = _save; + mUSD = _mUSD; + } + + modifier onlySave() { + require(save == msg.sender, "Only SAVE can call this"); + _; + } + + modifier _accrueValue() { + uint256 currentTime = block.timestamp; + if(lastAccrual != 0){ + uint256 timeDelta = currentTime - lastAccrual; + uint256 interest = timeDelta * perSecond; + uint256 newValue = lastValue * interest / 1e18; + lastValue += newValue; + } + lastAccrual = currentTime; + _; + } + + function poke() external _accrueValue { + + } + + function deposit(uint256 _amount) external override _accrueValue onlySave { + IERC20(mUSD).transferFrom(save, address(this), _amount); + lastValue += _amount; + } + + function withdraw(uint256 _amount) external override _accrueValue onlySave { + lastValue -= _amount; + } + + function withdrawAll() external override _accrueValue onlySave { + IERC20(mUSD).transfer(save, lastValue); + lastValue -= lastValue; + } + + function checkBalance() external override view returns (uint256) { + return lastValue; + } +} \ No newline at end of file diff --git a/contracts/z_mocks/savings/connectors/MockErroneousConnector2.sol b/contracts/z_mocks/savings/connectors/MockErroneousConnector2.sol new file mode 100644 index 00000000..a8b3f73b --- /dev/null +++ b/contracts/z_mocks/savings/connectors/MockErroneousConnector2.sol @@ -0,0 +1,55 @@ +// SPDX-License-Identifier: AGPL-3.0-or-later +pragma solidity 0.8.0; + +import { IERC20, ERC20 } from "@openzeppelin/contracts-sol8/contracts/token/ERC20/ERC20.sol"; +import { IConnector } from "../../../savings/peripheral/IConnector.sol"; + + +// 2. Returns invalid balance on checkbalance +// 3. Returns negative balance immediately after checkbalance +contract MockErroneousConnector2 is IConnector { + + address save; + address mUSD; + + uint256 lastValue; + uint256 lastAccrual; + uint256 constant perSecond = 31709791983; + + constructor( + address _save, + address _mUSD + ) public { + save = _save; + mUSD = _mUSD; + } + + modifier onlySave() { + require(save == msg.sender, "Only SAVE can call this"); + _; + } + + function poke() external { + lastValue -= 100; + } + + function deposit(uint256 _amount) external override onlySave { + IERC20(mUSD).transferFrom(save, address(this), _amount); + lastValue += _amount; + } + + function withdraw(uint256 _amount) external override onlySave { + IERC20(mUSD).transfer(save, _amount); + lastValue -= _amount; + lastValue -= 1; + } + + function withdrawAll() external override onlySave { + IERC20(mUSD).transfer(save, lastValue); + lastValue -= lastValue; + } + + function checkBalance() external override view returns (uint256) { + return lastValue; + } +} \ No newline at end of file diff --git a/contracts/z_mocks/savings/connectors/MockLendingConnector.sol b/contracts/z_mocks/savings/connectors/MockLendingConnector.sol new file mode 100644 index 00000000..4409735d --- /dev/null +++ b/contracts/z_mocks/savings/connectors/MockLendingConnector.sol @@ -0,0 +1,64 @@ +// SPDX-License-Identifier: AGPL-3.0-or-later +pragma solidity 0.8.0; + +import { IERC20, ERC20 } from "@openzeppelin/contracts-sol8/contracts/token/ERC20/ERC20.sol"; +import { IConnector } from "../../../savings/peripheral/IConnector.sol"; + + +contract MockLendingConnector is IConnector { + + address save; + address mUSD; + + uint256 lastValue; + uint256 lastAccrual; + uint256 constant perSecond = 31709791983; + + constructor( + address _save, + address _mUSD + ) public { + save = _save; + mUSD = _mUSD; + } + + modifier onlySave() { + require(save == msg.sender, "Only SAVE can call this"); + _; + } + + modifier _accrueValue() { + uint256 currentTime = block.timestamp; + if(lastAccrual != 0){ + uint256 timeDelta = currentTime - lastAccrual; + uint256 interest = timeDelta * perSecond; + uint256 newValue = lastValue * interest / 1e18; + lastValue += newValue; + } + lastAccrual = currentTime; + _; + } + + function poke() external _accrueValue { + + } + + function deposit(uint256 _amount) external override _accrueValue onlySave { + IERC20(mUSD).transferFrom(save, address(this), _amount); + lastValue += _amount; + } + + function withdraw(uint256 _amount) external override _accrueValue onlySave { + IERC20(mUSD).transfer(save, _amount); + lastValue -= _amount; + } + + function withdrawAll() external override _accrueValue onlySave { + IERC20(mUSD).transfer(save, lastValue); + lastValue -= lastValue; + } + + function checkBalance() external override view returns (uint256) { + return lastValue; + } +} \ No newline at end of file diff --git a/contracts/z_mocks/savings/connectors/MockVaultConnector.sol b/contracts/z_mocks/savings/connectors/MockVaultConnector.sol new file mode 100644 index 00000000..239f7ae7 --- /dev/null +++ b/contracts/z_mocks/savings/connectors/MockVaultConnector.sol @@ -0,0 +1,100 @@ +// SPDX-License-Identifier: AGPL-3.0-or-later +pragma solidity 0.8.0; + +import { IERC20, ERC20 } from "@openzeppelin/contracts-sol8/contracts/token/ERC20/ERC20.sol"; +import { IConnector } from "../../../savings/peripheral/IConnector.sol"; + + +// Use this as a template for any volatile vault implementations, to ensure +// connector invariant is held +contract MockVaultConnector is IConnector { + + address save; + address mUSD; + + uint256 trackedB; + uint256 realB; + uint256 lastAccrual; + uint256 constant perSecond = 31709791983; + + constructor( + address _save, + address _mUSD + ) public { + save = _save; + mUSD = _mUSD; + } + + modifier onlySave() { + require(save == msg.sender, "Only SAVE can call this"); + _; + } + + // realBalance + // trackedBalance + + // step 1: deposit 100 + // - log trackedB amount + // step 2: check Balance + // - get real balance + // - trackedB > realB ? trackedB : realB + // step 3: realB goes to 100.1 + // step 4: withdraw 10 + // - checkBalance must be >= 90.1 afterwards + // - trackedB = 90.1 + // - trackedB > realB ? trackedB : realB + // stpe 5: withdraw 10 + // - checkedBalance must be >= 80.1 after + // - trackedB = 80.1 + + modifier _accrueValue() { + _; + uint256 currentTime = block.timestamp; + if(lastAccrual != 0){ + uint256 timeDelta = currentTime - lastAccrual; + uint256 interest = timeDelta * perSecond; + uint256 newValue = realB * interest / 1e18; + realB += newValue; + } + lastAccrual = currentTime; + } + + function poke() external _accrueValue { + + } + + function deposit(uint256 _amount) external override _accrueValue onlySave { + // Mimic the expected external override balance here so we can track + // the expected resulting balance following the deposit + uint256 checkedB = _checkBalanceExt(); + trackedB = checkedB + _amount; + + IERC20(mUSD).transferFrom(save, address(this), _amount); + realB += (_amount * 995) / 1000; + } + + function withdraw(uint256 _amount) external override _accrueValue onlySave { + uint256 checkedB = _checkBalanceExt(); + trackedB = checkedB - _amount; + + IERC20(mUSD).transfer(save, _amount); + realB -= (_amount * 1005) / 1000; + } + + function withdrawAll() external override _accrueValue onlySave { + trackedB = 0; + + IERC20(mUSD).transfer(save, realB); + realB -= realB; + } + + function checkBalance() external override view returns (uint256) { + return _checkBalanceExt(); + } + + // a call to checkBalance followed by a deposit/withdraw then another checkbalance + // will always yield a sideways or increase + function _checkBalanceExt() internal view returns (uint256) { + return trackedB > realB ? trackedB : realB; + } +} \ No newline at end of file diff --git a/contracts/z_mocks/shared/MockCommonHelpers.sol b/contracts/z_mocks/shared/MockCommonHelpers.sol deleted file mode 100644 index e6a7b776..00000000 --- a/contracts/z_mocks/shared/MockCommonHelpers.sol +++ /dev/null @@ -1,14 +0,0 @@ -pragma solidity 0.5.16; - -import { CommonHelpers } from "../../shared/CommonHelpers.sol"; - -contract MockCommonHelpers { - - function getDecimals(address _token) - public - view - returns (uint256) { - return CommonHelpers.getDecimals(_token); - } -} - diff --git a/contracts/z_mocks/shared/MockCurveMetaPool.sol b/contracts/z_mocks/shared/MockCurveMetaPool.sol deleted file mode 100644 index 710546f1..00000000 --- a/contracts/z_mocks/shared/MockCurveMetaPool.sol +++ /dev/null @@ -1,42 +0,0 @@ -pragma solidity 0.5.16; - -import { ICurveMetaPool } from "../../masset/liquidator/ICurveMetaPool.sol"; -import { IERC20 } from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; -import { IBasicToken } from "../../shared/IBasicToken.sol"; - - -// Simulates the selling of bAsset for mUSD through Meta Pool -// Assumes mUSD is token 0 -contract MockCurveMetaPool is ICurveMetaPool { - - address[] public coins; - address mUSD; - // number of out per in (scaled) - uint256 ratio = 98e16; - - - constructor(address[] memory _coins, address _mUSD) public { - require(_coins[0] == _mUSD, "Coin 0 must be mUSD"); - coins = _coins; - mUSD = _mUSD; - } - - function setRatio(uint256 _newRatio) external { - ratio = _newRatio; - } - - // takes dx i from sender, returns j - function exchange_underlying(int128 i, int128 j, uint256 dx, uint256 min_dy) - external - returns (uint256) - { - require(j == 0, "Output must be mUSD"); - address in_tok = coins[uint256(i)]; - uint256 decimals = IBasicToken(in_tok).decimals(); - uint256 out_amt = dx * (10 ** (18 - decimals)) * ratio / 1e18; - require(out_amt >= min_dy, "CRV: Output amount not enough"); - IERC20(in_tok).transferFrom(msg.sender, address(this), dx); - IERC20(mUSD).transfer(msg.sender, out_amt); - return out_amt; - } -} \ No newline at end of file diff --git a/contracts/z_mocks/shared/MockERC20.sol b/contracts/z_mocks/shared/MockERC20.sol index 6187e0ab..d289088d 100644 --- a/contracts/z_mocks/shared/MockERC20.sol +++ b/contracts/z_mocks/shared/MockERC20.sol @@ -1,10 +1,9 @@ -pragma solidity 0.5.16; +// SPDX-License-Identifier: AGPL-3.0-or-later +pragma solidity 0.8.0; -import "@openzeppelin/contracts/token/ERC20/ERC20Detailed.sol"; -import "@openzeppelin/contracts/token/ERC20/ERC20Mintable.sol"; -import "@openzeppelin/contracts/token/ERC20/ERC20.sol"; +import "@openzeppelin/contracts-sol8/contracts/token/ERC20/ERC20.sol"; -contract MockERC20 is ERC20, ERC20Detailed, ERC20Mintable { +contract MockERC20 is ERC20 { constructor ( string memory _name, @@ -13,17 +12,12 @@ contract MockERC20 is ERC20, ERC20Detailed, ERC20Mintable { address _initialRecipient, uint256 _initialMint ) - ERC20Detailed( + ERC20( _name, - _symbol, - _decimals + _symbol ) - public { - _mint(_initialRecipient, _initialMint.mul(10 ** uint256(_decimals))); + _setupDecimals(_decimals); + _mint(_initialRecipient, _initialMint * (10 ** uint256(_decimals))); } -} - -contract MockUSDT { - function setParams(uint newBasisPoints, uint newMaxFee) public; -} +} \ No newline at end of file diff --git a/contracts/z_mocks/shared/MockERC20WithFee.sol b/contracts/z_mocks/shared/MockERC20WithFee.sol index cd0b37a1..9ceb6425 100644 --- a/contracts/z_mocks/shared/MockERC20WithFee.sol +++ b/contracts/z_mocks/shared/MockERC20WithFee.sol @@ -1,9 +1,8 @@ -pragma solidity 0.5.16; +// SPDX-License-Identifier: AGPL-3.0-or-later +pragma solidity 0.8.0; -import { SafeMath } from "@openzeppelin/contracts/math/SafeMath.sol"; import { StableMath } from "../../shared/StableMath.sol"; -import { MinterRole } from "@openzeppelin/contracts/access/roles/MinterRole.sol"; -import { IERC20 } from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import { IERC20 } from "@openzeppelin/contracts-sol8/contracts/token/ERC20/IERC20.sol"; /** * @dev Implementation of the `IERC20` interface. @@ -28,9 +27,8 @@ import { IERC20 } from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; * functions have been added to mitigate the well-known issues around setting * allowances. See `IERC20.approve`. */ -contract ERC20WithFee is IERC20, MinterRole { +contract ERC20WithFee is IERC20 { - using SafeMath for uint256; using StableMath for uint256; uint256 public feeRate; @@ -92,14 +90,14 @@ contract ERC20WithFee is IERC20, MinterRole { /** * @dev See `IERC20.totalSupply`. */ - function totalSupply() public view returns (uint256) { + function totalSupply() public override view returns (uint256) { return _totalSupply; } /** * @dev See `IERC20.balanceOf`. */ - function balanceOf(address account) public view returns (uint256) { + function balanceOf(address account) public override view returns (uint256) { return _balances[account]; } @@ -111,7 +109,7 @@ contract ERC20WithFee is IERC20, MinterRole { * - `recipient` cannot be the zero address. * - the caller must have a balance of at least `amount`. */ - function transfer(address recipient, uint256 amount) public returns (bool) { + function transfer(address recipient, uint256 amount) public override returns (bool) { _transfer(msg.sender, recipient, amount); return true; } @@ -119,7 +117,7 @@ contract ERC20WithFee is IERC20, MinterRole { /** * @dev See `IERC20.allowance`. */ - function allowance(address owner, address spender) public view returns (uint256) { + function allowance(address owner, address spender) public override view returns (uint256) { return _allowances[owner][spender]; } @@ -130,7 +128,7 @@ contract ERC20WithFee is IERC20, MinterRole { * * - `spender` cannot be the zero address. */ - function approve(address spender, uint256 value) public returns (bool) { + function approve(address spender, uint256 value) public override returns (bool) { _approve(msg.sender, spender, value); return true; } @@ -147,9 +145,9 @@ contract ERC20WithFee is IERC20, MinterRole { * - the caller must have allowance for `sender`'s tokens of at least * `amount`. */ - function transferFrom(address sender, address recipient, uint256 amount) public returns (bool) { + function transferFrom(address sender, address recipient, uint256 amount) public override returns (bool) { _transfer(sender, recipient, amount); - _approve(sender, msg.sender, _allowances[sender][msg.sender].sub(amount)); + _approve(sender, msg.sender, _allowances[sender][msg.sender] - amount); return true; } @@ -166,7 +164,7 @@ contract ERC20WithFee is IERC20, MinterRole { * - `spender` cannot be the zero address. */ function increaseAllowance(address spender, uint256 addedValue) public returns (bool) { - _approve(msg.sender, spender, _allowances[msg.sender][spender].add(addedValue)); + _approve(msg.sender, spender, _allowances[msg.sender][spender] + addedValue); return true; } @@ -185,7 +183,7 @@ contract ERC20WithFee is IERC20, MinterRole { * `subtractedValue`. */ function decreaseAllowance(address spender, uint256 subtractedValue) public returns (bool) { - _approve(msg.sender, spender, _allowances[msg.sender][spender].sub(subtractedValue)); + _approve(msg.sender, spender, _allowances[msg.sender][spender] - subtractedValue); return true; } @@ -208,12 +206,12 @@ contract ERC20WithFee is IERC20, MinterRole { require(recipient != address(0), "ERC20: transfer to the zero address"); uint256 fee = amount.mulTruncate(feeRate); - uint256 remainder = amount.sub(fee); + uint256 remainder = amount - fee; _burn(sender, fee); - _balances[sender] = _balances[sender].sub(remainder); - _balances[recipient] = _balances[recipient].add(remainder); + _balances[sender] = _balances[sender] - remainder; + _balances[recipient] = _balances[recipient] + remainder; emit Transfer(sender, recipient, remainder); } @@ -229,8 +227,8 @@ contract ERC20WithFee is IERC20, MinterRole { function _mint(address account, uint256 amount) internal { require(account != address(0), "ERC20: mint to the zero address"); - _totalSupply = _totalSupply.add(amount); - _balances[account] = _balances[account].add(amount); + _totalSupply = _totalSupply + amount; + _balances[account] = _balances[account] + amount; emit Transfer(address(0), account, amount); } @@ -248,8 +246,8 @@ contract ERC20WithFee is IERC20, MinterRole { function _burn(address account, uint256 value) internal { require(account != address(0), "ERC20: burn from the zero address"); - _totalSupply = _totalSupply.sub(value); - _balances[account] = _balances[account].sub(value); + _totalSupply = _totalSupply - value; + _balances[account] = _balances[account] - value; emit Transfer(account, address(0), value); } @@ -282,7 +280,7 @@ contract ERC20WithFee is IERC20, MinterRole { */ function _burnFrom(address account, uint256 amount) internal { _burn(account, amount); - _approve(account, msg.sender, _allowances[account][msg.sender].sub(amount)); + _approve(account, msg.sender, _allowances[account][msg.sender] - amount); } /** @@ -292,7 +290,7 @@ contract ERC20WithFee is IERC20, MinterRole { * * - the caller must have the `MinterRole`. */ - function mint(address account, uint256 amount) public onlyMinter returns (bool) { + function mint(address account, uint256 amount) public returns (bool) { _mint(account, amount); return true; } @@ -311,7 +309,7 @@ contract MockERC20WithFee is ERC20WithFee { { ERC20WithFee._initialize(_name, _symbol, _decimals); feeRate = 1e15; - _mint(_initialRecipient, _initialMint.mul(10 ** uint256(_decimals))); + _mint(_initialRecipient, _initialMint * (10 ** uint256(_decimals))); } } diff --git a/contracts/z_mocks/shared/MockInitializableModule.sol b/contracts/z_mocks/shared/MockInitializableModule.sol deleted file mode 100644 index 83e08c88..00000000 --- a/contracts/z_mocks/shared/MockInitializableModule.sol +++ /dev/null @@ -1,70 +0,0 @@ -pragma solidity 0.5.16; - -import { InitializableModule } from "../../shared/InitializableModule.sol"; -import { Initializable } from "@openzeppelin/upgrades/contracts/Initializable.sol"; - -contract MockInitializableModule is Initializable, InitializableModule { - - uint256 public temp; - - function initialize( - address _nexus - ) - public - initializer - { - InitializableModule._initialize(_nexus); - } - - function governor() public view returns (address) { - return super._governor(); - } - - function governance() public view returns (address) { - return super._governance(); - } - - function proxyAdmin() public view returns (address) { - return super._proxyAdmin(); - } - - function staking() public view returns (address) { - return super._staking(); - } - - function metaToken() public view returns (address) { - return super._metaToken(); - } - - function oracleHub() public view returns (address) { - return super._oracleHub(); - } - - function manager() public view returns (address) { - return super._manager(); - } - - function savingsManager() public view returns (address) { - return super._savingsManager(); - } - - function recollateraliser() public view returns (address) { - return super._recollateraliser(); - } - - function shouldAllowOnlyGovernor() public onlyGovernor { - temp = 1; - } - - function shouldAllowOnlyGovernance() public onlyGovernance { - temp = 2; - } - - function shouldAllowOnlyManager() public onlyManager { - temp = 3; - } - - function shouldAllowOnlyProxyAdmin() public onlyProxyAdmin { - temp = 4; - } -} \ No newline at end of file diff --git a/contracts/z_mocks/shared/MockInitializablePausableModule.sol b/contracts/z_mocks/shared/MockInitializablePausableModule.sol deleted file mode 100644 index 2943a4f6..00000000 --- a/contracts/z_mocks/shared/MockInitializablePausableModule.sol +++ /dev/null @@ -1,70 +0,0 @@ -pragma solidity 0.5.16; - -import { InitializablePausableModule } from "../../shared/InitializablePausableModule.sol"; -import { Initializable } from "@openzeppelin/upgrades/contracts/Initializable.sol"; - -contract MockInitializablePausableModule is Initializable, InitializablePausableModule { - - uint256 public temp; - - function initialize( - address _nexus - ) - public - initializer - { - InitializablePausableModule._initialize(_nexus); - } - - function governor() public view returns (address) { - return super._governor(); - } - - function governance() public view returns (address) { - return super._governance(); - } - - function proxyAdmin() public view returns (address) { - return super._proxyAdmin(); - } - - function staking() public view returns (address) { - return super._staking(); - } - - function metaToken() public view returns (address) { - return super._metaToken(); - } - - function oracleHub() public view returns (address) { - return super._oracleHub(); - } - - function manager() public view returns (address) { - return super._manager(); - } - - function savingsManager() public view returns (address) { - return super._savingsManager(); - } - - function recollateraliser() public view returns (address) { - return super._recollateraliser(); - } - - function shouldAllowOnlyGovernor() public onlyGovernor { - temp = 1; - } - - function shouldAllowOnlyGovernance() public onlyGovernance { - temp = 2; - } - - function shouldAllowOnlyManager() public onlyManager { - temp = 3; - } - - function shouldAllowOnlyProxyAdmin() public onlyProxyAdmin { - temp = 4; - } -} \ No newline at end of file diff --git a/contracts/z_mocks/shared/MockInitializableToken.sol b/contracts/z_mocks/shared/MockInitializableToken.sol index 458ae4a7..1a8ff006 100644 --- a/contracts/z_mocks/shared/MockInitializableToken.sol +++ b/contracts/z_mocks/shared/MockInitializableToken.sol @@ -1,15 +1,15 @@ -pragma solidity 0.5.16; +// SPDX-License-Identifier: AGPL-3.0-or-later +pragma solidity 0.8.0; -import { ERC20 } from "@openzeppelin/contracts/token/ERC20/ERC20.sol"; -import "@openzeppelin/contracts/token/ERC20/ERC20Mintable.sol"; +import { ERC205 } from "../../shared/@openzeppelin-2.5/ERC205.sol"; import { InitializableERC20Detailed } from "../../shared/InitializableERC20Detailed.sol"; /** * @title InitializableToken - * @author Stability Labs Pty. Ltd. + * @author mStable * @dev Basic ERC20Detailed Token functionality for Masset */ -contract MockInitializableToken is ERC20, ERC20Mintable, InitializableERC20Detailed { +contract MockInitializableToken is ERC205, InitializableERC20Detailed { /** * @dev Initialization function for implementing contract @@ -17,6 +17,7 @@ contract MockInitializableToken is ERC20, ERC20Mintable, InitializableERC20Detai */ function initialize(string calldata _nameArg, string calldata _symbolArg, uint8 _decimals, address _initialRecipient, uint256 _initialMint) external { InitializableERC20Detailed._initialize(_nameArg, _symbolArg, _decimals); - _mint(_initialRecipient, _initialMint.mul(10 ** uint256(_decimals))); + + _mint(_initialRecipient, _initialMint * 10 ** uint256(_decimals)); } } \ No newline at end of file diff --git a/contracts/z_mocks/shared/MockInitializableTokenWithFee.sol b/contracts/z_mocks/shared/MockInitializableTokenWithFee.sol index dee92d60..e5a7383d 100644 --- a/contracts/z_mocks/shared/MockInitializableTokenWithFee.sol +++ b/contracts/z_mocks/shared/MockInitializableTokenWithFee.sol @@ -1,4 +1,5 @@ -pragma solidity 0.5.16; +// SPDX-License-Identifier: AGPL-3.0-or-later +pragma solidity 0.8.0; import { ERC20WithFee } from "./MockERC20WithFee.sol"; @@ -16,6 +17,6 @@ contract MockInitializableTokenWithFee is ERC20WithFee { function initialize(string calldata _nameArg, string calldata _symbolArg, uint8 _decimals, address _initialRecipient, uint256 _initialMint) external { ERC20WithFee._initialize(_nameArg, _symbolArg, _decimals); feeRate = 1e15; - _mint(_initialRecipient, _initialMint.mul(10 ** uint256(_decimals))); + _mint(_initialRecipient, _initialMint * 10 ** uint256(_decimals)); } } diff --git a/contracts/z_mocks/shared/MockModule.sol b/contracts/z_mocks/shared/MockModule.sol deleted file mode 100644 index d63c3345..00000000 --- a/contracts/z_mocks/shared/MockModule.sol +++ /dev/null @@ -1,62 +0,0 @@ -pragma solidity 0.5.16; - -import { Module } from "../../shared/Module.sol"; - -contract MockModule is Module { - - uint256 public temp; - - constructor(address _nexus) public Module(_nexus) {} - - function governor() public view returns (address) { - return super._governor(); - } - - function governance() public view returns (address) { - return super._governance(); - } - - function staking() public view returns (address) { - return super._staking(); - } - - function metaToken() public view returns (address) { - return super._metaToken(); - } - - function oracleHub() public view returns (address) { - return super._oracleHub(); - } - - function manager() public view returns (address) { - return super._manager(); - } - - function savingsManager() public view returns (address) { - return super._savingsManager(); - } - - function recollateraliser() public view returns (address) { - return super._recollateraliser(); - } - - function proxyAdmin() public view returns (address) { - return super._proxyAdmin(); - } - - function shouldAllowOnlyGovernor() public onlyGovernor { - temp = 1; - } - - function shouldAllowOnlyGovernance() public onlyGovernance { - temp = 2; - } - - function shouldAllowOnlyManager() public onlyManager { - temp = 3; - } - - function shouldAllowOnlyProxyAdmin() public onlyProxyAdmin { - temp = 4; - } -} \ No newline at end of file diff --git a/contracts/z_mocks/shared/MockPausableModule.sol b/contracts/z_mocks/shared/MockPausableModule.sol deleted file mode 100644 index 6b6132f3..00000000 --- a/contracts/z_mocks/shared/MockPausableModule.sol +++ /dev/null @@ -1,8 +0,0 @@ -pragma solidity 0.5.16; - -import { PausableModule } from "../../shared/PausableModule.sol"; - -contract MockPausableModule is PausableModule { - - constructor(address _nexus) public PausableModule(_nexus) {} -} \ No newline at end of file diff --git a/contracts/z_mocks/shared/MockProxy.sol b/contracts/z_mocks/shared/MockProxy.sol deleted file mode 100644 index f709b8e4..00000000 --- a/contracts/z_mocks/shared/MockProxy.sol +++ /dev/null @@ -1,7 +0,0 @@ -pragma solidity 0.5.16; - -import { InitializableAdminUpgradeabilityProxy } from "@openzeppelin/upgrades/contracts/upgradeability/InitializableAdminUpgradeabilityProxy.sol"; - -contract MockProxy is InitializableAdminUpgradeabilityProxy { - -} \ No newline at end of file diff --git a/contracts/z_mocks/shared/MockRoot.sol b/contracts/z_mocks/shared/MockRoot.sol index fa2e114d..baa48b37 100644 --- a/contracts/z_mocks/shared/MockRoot.sol +++ b/contracts/z_mocks/shared/MockRoot.sol @@ -1,4 +1,5 @@ -pragma solidity 0.5.16; +// SPDX-License-Identifier: AGPL-3.0-or-later +pragma solidity 0.8.0; import { Root } from "../../shared/Root.sol"; diff --git a/contracts/z_mocks/shared/MockTrigger.sol b/contracts/z_mocks/shared/MockTrigger.sol deleted file mode 100644 index 055689e9..00000000 --- a/contracts/z_mocks/shared/MockTrigger.sol +++ /dev/null @@ -1,11 +0,0 @@ -pragma solidity 0.5.16; - -import { ILiquidator } from "../../masset/liquidator/ILiquidator.sol"; - - -contract MockTrigger { - - function trigger(ILiquidator _liq, address _integration) external { - _liq.triggerLiquidation(_integration); - } -} \ No newline at end of file diff --git a/contracts/z_mocks/shared/MockUniswap.sol b/contracts/z_mocks/shared/MockUniswap.sol deleted file mode 100644 index bf404c7f..00000000 --- a/contracts/z_mocks/shared/MockUniswap.sol +++ /dev/null @@ -1,58 +0,0 @@ -pragma solidity 0.5.16; - -import { IUniswapV2Router02 } from "../../masset/liquidator/IUniswapV2Router02.sol"; -import { IERC20 } from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; - - -// Simulates the selling of COMP -// Assumptions: -// COMP = $106 -// out token has 18 decimals -contract MockUniswap is IUniswapV2Router02 { - - // how many tokens to give out for 1 in - uint256 ratio = 106; - - function setRatio(uint256 _outRatio) external { - ratio = _outRatio; - } - - // takes input from sender, produces output - function swapExactTokensForTokens( - uint amountIn, - uint amountOutMin, - address[] calldata path, - address /*to*/, - uint /*deadline*/ - ) - external - returns (uint[] memory amounts) - { - uint256 len = path.length; - - amounts = new uint[](len); - amounts[0] = amountIn; - IERC20(path[0]).transferFrom(msg.sender, address(this), amountIn); - - uint256 output = amountIn * ratio; - require(output >= amountOutMin, "UNI: Output amount not enough"); - - amounts[len-1] = output; - IERC20(path[len-1]).transfer(msg.sender, output); - } - - function getAmountsIn( - uint amountOut, - address[] calldata path - ) - external - view - returns (uint[] memory amounts) - { - uint256 amountIn = amountOut / ratio; - uint256 len = path.length; - amounts = new uint[](len); - amounts[0] = amountIn; - amounts[len-1] = amountOut; - } -} \ No newline at end of file diff --git a/contracts/z_mocks/shared/PublicStableMath.sol b/contracts/z_mocks/shared/PublicStableMath.sol index 220ddbb1..a64fb41b 100644 --- a/contracts/z_mocks/shared/PublicStableMath.sol +++ b/contracts/z_mocks/shared/PublicStableMath.sol @@ -1,4 +1,5 @@ -pragma solidity 0.5.16; +// SPDX-License-Identifier: AGPL-3.0-or-later +pragma solidity 0.8.0; import { StableMath } from "../../shared/StableMath.sol"; diff --git a/contracts/z_mocks/shared/SignedSafeMath128Mock.sol b/contracts/z_mocks/shared/SignedSafeMath128Mock.sol deleted file mode 100644 index bf5da39c..00000000 --- a/contracts/z_mocks/shared/SignedSafeMath128Mock.sol +++ /dev/null @@ -1,23 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity 0.5.16; - -import { SignedSafeMath128 } from "../../shared/SignedSafeMath128.sol"; - -contract SignedSafeMath128Mock { - function mul(int128 a, int128 b) public pure returns (int128) { - return SignedSafeMath128.mul(a, b); - } - - function div(int128 a, int128 b) public pure returns (int128) { - return SignedSafeMath128.div(a, b); - } - - function sub(int128 a, int128 b) public pure returns (int128) { - return SignedSafeMath128.sub(a, b); - } - - function add(int128 a, int128 b) public pure returns (int128) { - return SignedSafeMath128.add(a, b); - } -} diff --git a/contracts/z_mocks/upgradability/MockImplementation.sol b/contracts/z_mocks/upgradability/MockImplementation.sol deleted file mode 100644 index 4a37c116..00000000 --- a/contracts/z_mocks/upgradability/MockImplementation.sol +++ /dev/null @@ -1,55 +0,0 @@ -pragma solidity 0.5.16; - -import { Initializable } from "@openzeppelin/upgrades/contracts/Initializable.sol"; - -contract MockImplementationV1 is Initializable { - string public version = ""; - uint256 public uintVal = 1; - address private proxyAdmin; - - modifier onlyProxyAdmin() { - require(msg.sender == proxyAdmin, "Only proxyAdmin can execute"); - _; - } - - function initialize(address _proxyAdmin) public initializer { - version = "V1"; - uintVal = 2; - // Initialize the proxy address (DelayedProxyAdmin's address) - proxyAdmin = _proxyAdmin; - } -} - -contract MockImplementationV2 is Initializable{ - string public version = ""; - uint256 public uintVal = 1; - address private proxyAdmin; - - modifier onlyProxyAdmin() { - require(msg.sender == proxyAdmin, "Only proxyAdmin can execute"); - _; - } - - function initializeV2() public payable onlyProxyAdmin { - // function is payable to test - version = "V2"; - uintVal = 3; - } -} - -contract MockImplementationV3 is Initializable{ - string public version = ""; - uint256 public uintVal = 1; - address private proxyAdmin; - - modifier onlyProxyAdmin() { - require(msg.sender == proxyAdmin, "Only proxyAdmin can execute"); - _; - } - - function initializeV3() public payable onlyProxyAdmin { - // function is payable to test - version = "V3"; - uintVal = 4; - } -} \ No newline at end of file diff --git a/hardhat.config.ts b/hardhat.config.ts index c28e5cb7..ebe124e0 100644 --- a/hardhat.config.ts +++ b/hardhat.config.ts @@ -1,27 +1,48 @@ -require("hardhat-gas-reporter"); -require("solidity-coverage"); -require("@nomiclabs/hardhat-truffle5"); -require("hardhat-typechain"); -require("@tenderly/hardhat-tenderly"); +import "@nomiclabs/hardhat-ethers" +import "@nomiclabs/hardhat-waffle" +import "@tenderly/hardhat-tenderly" +import "hardhat-gas-reporter" +import "hardhat-typechain" +import "solidity-coverage" -require("ts-node/register"); -require("tsconfig-paths/register"); +import "ts-node/register" +import "tsconfig-paths/register" -export default { +// chainId?: number; +// from?: string; +// gas: "auto" | number; +// gasPrice: "auto" | number; +// gasMultiplier: number; +// url: string; +// timeout: number; +// httpHeaders: { [name: string]: string }; +// accounts: HttpNetworkAccountsConfig; + +export const hardhatConfig = { networks: { - hardhat: { allowUnlimitedContractSize: true }, + hardhat: { allowUnlimitedContractSize: true, blockGasLimit: 9000000 }, localhost: { url: "http://localhost:8545" }, fork: { url: "http://localhost:7545" }, + // export the NODE_URL environment variable to use remote nodes like Alchemy or Infura. eg + // export NODE_URL=https://eth-mainnet.alchemyapi.io/v2/yourApiKey + env: { url: process.env.NODE_URL || "" }, + ropsten: { + url: process.env.NODE_URL || "", + accounts: process.env.ROPSTEN_PRIVATE_KEY1 ? [process.env.ROPSTEN_PRIVATE_KEY1] : [], + gasPrice: 30000000000, + gasLimit: 8000000, + }, }, solidity: { - version: "0.5.16", + version: "0.8.0", settings: { optimizer: { enabled: true, + runs: 200, }, }, }, - paths: { artifacts: "./build/contracts" }, + paths: { artifacts: "./build" }, gasReporter: { currency: "USD", gasPrice: 30, @@ -31,10 +52,12 @@ export default { }, typechain: { outDir: "types/generated", - target: "truffle-v5", + target: "ethers-v5", }, tenderly: { username: "mStable", project: "mStable-contracts", }, -}; +} + +export default hardhatConfig diff --git a/migrations/1_main.js b/migrations/1_main.js deleted file mode 100644 index 0231ccbf..00000000 --- a/migrations/1_main.js +++ /dev/null @@ -1,16 +0,0 @@ - -// Import TypeScript; it can't be run directly, but Truffle must use -// babel because requiring it works. -const initialMigration = require(`./src/1_initial_migration.ts`).default; -const systemMigration = require(`./src/2_system.ts`).default; -const rewardsMigration = require(`./src/3_rewards.ts`).default; -const stakingMigration = require(`./src/4_staking.ts`).default; - -// Bind the first argument of the script to the global truffle argument, -// with `web3`, `artifacts` and so on, and pass in all CLI arguments. -module.exports = async (deployer, network, accounts) => { - await initialMigration(this, deployer); - await systemMigration(this, deployer, network, accounts); - await rewardsMigration(this, deployer, network, accounts); - await stakingMigration(this, deployer, network, accounts); -}; diff --git a/migrations/src/1_initial_migration.ts b/migrations/src/1_initial_migration.ts deleted file mode 100644 index cb10c877..00000000 --- a/migrations/src/1_initial_migration.ts +++ /dev/null @@ -1,21 +0,0 @@ -/* eslint-disable @typescript-eslint/triple-slash-reference,spaced-comment */ -/// -/// - -export default async ( - { - artifacts, - }: { - artifacts: Truffle.Artifacts; - }, - deployer, -): Promise => { - process.env.NETWORK = deployer.network; - if (deployer.network === "fork") { - return; - } - - const cMigrations = artifacts.require("Migrations"); - - await deployer.deploy(cMigrations); -}; diff --git a/migrations/src/2_system.ts b/migrations/src/2_system.ts deleted file mode 100644 index 296e7af9..00000000 --- a/migrations/src/2_system.ts +++ /dev/null @@ -1,433 +0,0 @@ -/* eslint-disable @typescript-eslint/camelcase */ -/* eslint-disable spaced-comment */ -/* eslint-disable @typescript-eslint/triple-slash-reference,spaced-comment */ -/// -/// - -import { percentToWeight } from "@utils/math"; -import { - ZERO_ADDRESS, - DEAD_ADDRESS, - RopstenAccounts, - KovanAccounts, - KEY_PROXY_ADMIN, - KEY_SAVINGS_MANAGER, -} from "@utils/constants"; -import * as t from "../../types/generated"; -import { Address } from "../../types"; - -export interface ATokenDetails { - bAsset: Address; - aToken: Address; -} -export interface CTokenDetails { - bAsset: Address; - cToken: Address; -} - -export enum Platform { - aave, - compound, -} - -export interface BassetIntegrationDetails { - bAssets: Array; - platforms: Array; - aavePlatformAddress: Address; - aTokens: Array; - cTokens: Array; -} - -async function loadBassetsRopsten(artifacts: Truffle.Artifacts): Promise { - const c_MockERC20 = artifacts.require("MockERC20"); - - const ra = new RopstenAccounts(); - // load all the REAL bAssets from Ropsten - const bAsset_DAI = await c_MockERC20.at(ra.DAI); - const bAsset_USDC = await c_MockERC20.at(ra.USDC); - const bAsset_TUSD = await c_MockERC20.at(ra.TUSD); - const bAsset_USDT = await c_MockERC20.at(ra.USDT); - const bAssets = [bAsset_DAI, bAsset_USDC, bAsset_TUSD, bAsset_USDT]; - // return all the addresses - return { - bAssets, - platforms: [Platform.compound, Platform.compound, Platform.aave, Platform.aave], - aavePlatformAddress: ra.aavePlatform, - cTokens: [ - { - bAsset: bAsset_DAI.address, - cToken: ra.cDAI, - }, - { - bAsset: bAsset_USDC.address, - cToken: ra.cUSDC, - }, - ], - aTokens: [ - { - bAsset: bAsset_TUSD.address, - aToken: ra.aTUSD, - }, - { - bAsset: bAsset_USDT.address, - aToken: ra.aUSDT, - }, - ], - }; -} - -async function loadBassetsKovan(artifacts: Truffle.Artifacts): Promise { - const c_MockERC20 = artifacts.require("MockERC20"); - - const ra = new KovanAccounts(); - // load all the REAL bAssets from Ropsten - const bAsset_DAI = await c_MockERC20.at(ra.DAI); - const bAsset_USDC = await c_MockERC20.at(ra.USDC); - const bAsset_TUSD = await c_MockERC20.at(ra.TUSD); - const bAsset_USDT = await c_MockERC20.at(ra.USDT); - const bAssets = [bAsset_DAI, bAsset_USDC, bAsset_TUSD, bAsset_USDT]; - // return all the addresses - return { - bAssets, - platforms: [Platform.compound, Platform.compound, Platform.aave, Platform.aave], - aavePlatformAddress: ra.aavePlatform, - cTokens: [ - { - bAsset: bAsset_DAI.address, - cToken: ra.cDAI, - }, - { - bAsset: bAsset_USDC.address, - cToken: ra.cUSDC, - }, - ], - aTokens: [ - { - bAsset: bAsset_TUSD.address, - aToken: ra.aTUSD, - }, - { - bAsset: bAsset_USDT.address, - aToken: ra.aUSDT, - }, - ], - }; -} - -async function loadBassetsLocal( - artifacts: Truffle.Artifacts, - deployer, -): Promise { - const c_MockERC20 = artifacts.require("MockERC20"); - const c_MockAave = artifacts.require("MockAaveV2"); - const c_MockAToken = artifacts.require("MockAToken"); - const c_MockCToken = artifacts.require("MockCToken"); - // - Mock bAssets - const mockBasset1 = await c_MockERC20.new("Mock1", "MK1", 12, deployer, 100000000); - const mockBasset2 = await c_MockERC20.new("Mock2", "MK2", 18, deployer, 100000000); - const mockBasset3 = await c_MockERC20.new("Mock3", "MK3", 6, deployer, 100000000); - const mockBasset4 = await c_MockERC20.new("Mock4", "MK4", 18, deployer, 100000000); - - // - Mock Aave integration - const d_MockAave = await c_MockAave.new({ from: deployer }); - - // - Mock aTokens - const mockAToken1 = await c_MockAToken.new(d_MockAave.address, mockBasset1.address); - const mockAToken2 = await c_MockAToken.new(d_MockAave.address, mockBasset2.address); - const mockAToken3 = await c_MockAToken.new(d_MockAave.address, mockBasset3.address); - - // - Add to the Platform - await d_MockAave.addAToken(mockAToken1.address, mockBasset1.address); - await d_MockAave.addAToken(mockAToken2.address, mockBasset2.address); - await d_MockAave.addAToken(mockAToken3.address, mockBasset3.address); - - // Mock C Token - const mockCToken4 = await c_MockCToken.new(mockBasset4.address); - return { - bAssets: [mockBasset1, mockBasset2, mockBasset3, mockBasset4], - platforms: [Platform.aave, Platform.aave, Platform.aave, Platform.compound], - aavePlatformAddress: d_MockAave.address, - aTokens: [ - { - bAsset: mockBasset1.address, - aToken: mockAToken1.address, - }, - { - bAsset: mockBasset2.address, - aToken: mockAToken2.address, - }, - { - bAsset: mockBasset3.address, - aToken: mockAToken3.address, - }, - ], - cTokens: [ - { - bAsset: mockBasset4.address, - cToken: mockCToken4.address, - }, - ], - }; -} - -export default async ( - { artifacts }: { artifacts: Truffle.Artifacts }, - deployer, - network, - accounts, -): Promise => { - if (deployer.network === "fork") { - // Don't bother running these migrations -- speed up the testing - return; - } - - /*************************************** - 0. TYPECHAIN IMPORTS - Imports parallel to folder layout - ****************************************/ - - // Masset - // - ForgeValidator - const c_ForgeValidator = artifacts.require("ForgeValidator"); - // - Platforms (u) - // - Aave - const c_AaveIntegration = artifacts.require("AaveIntegration"); - // - Compound - const c_CompoundIntegration = artifacts.require("CompoundIntegration"); - // - BasketManager (u) - const c_BasketManager = artifacts.require("BasketManager"); - const c_DeadIntegration = artifacts.require("DeadIntegration"); // Merely used to initialize BM - const c_MockERC20 = artifacts.require("MockERC20"); // Merely used to initialize BM - // - mUSD - const c_Masset = artifacts.require("Masset"); - - // Nexus - const c_Nexus = artifacts.require("Nexus"); - - // Proxy - // - Admin - const c_DelayedProxyAdmin = artifacts.require("DelayedProxyAdmin"); - // - BaseProxies - const c_MassetProxy = artifacts.require("MassetProxy"); - const c_BasketManagerProxy = artifacts.require("BasketManagerProxy"); - const c_VaultProxy = artifacts.require("VaultProxy"); - - // Savings - // - Contract - const c_SavingsContract = artifacts.require("SavingsContract"); - // - Manager - const c_SavingsManager = artifacts.require("SavingsManager"); - - /*************************************** - 0. Mock platforms and bAssets - Dependencies: [] - ****************************************/ - - const [default_, governor] = accounts; - const newGovernor = governor; // This should be an external multisig - let bassetDetails: BassetIntegrationDetails; - if (deployer.network === "ropsten") { - console.log("Loading Ropsten bAssets and lending platforms"); - bassetDetails = await loadBassetsRopsten(artifacts); - } else if (deployer.network === "kovan") { - console.log("Loading Kovan bAssets and lending platforms"); - bassetDetails = await loadBassetsKovan(artifacts); - } else { - console.log( - `==============================================\n` + - `Generating mock bAssets and lending platforms\n` + - `==============================================\n`, - ); - bassetDetails = await loadBassetsLocal(artifacts, default_); - } - - /*************************************** - 1. Nexus - Dependencies: [] - ****************************************/ - - await deployer.deploy(c_Nexus, governor, { from: default_ }); - const d_Nexus = await c_Nexus.deployed(); - - /*************************************** - 2. mUSD - Dependencies: [ - BasketManager [ - ProxyAdmin, - PlatformIntegrations [ - MockPlatforms - ] - ] - ] - ****************************************/ - - // 2.0. Deploy ProxyAdmin - await deployer.deploy(c_DelayedProxyAdmin, d_Nexus.address, { from: default_ }); - const d_DelayedProxyAdmin = await c_DelayedProxyAdmin.deployed(); - - // 2.1. Deploy no Init BasketManager - // - Deploy Implementation - await deployer.deploy(c_BasketManager); - const d_BasketManager = await c_BasketManager.deployed(); - // - Initialize the BasketManager implementation to avoid someone else doing it - const d_DeadIntegration = await c_DeadIntegration.new(); - const d_DeadErc20 = await c_MockERC20.new("DEAD", "D34", 18, DEAD_ADDRESS, 1); - await d_BasketManager.initialize( - DEAD_ADDRESS, - DEAD_ADDRESS, - [d_DeadErc20.address], - [d_DeadIntegration.address], - [percentToWeight(100).toString()], - [false], - ); - // - Deploy Initializable Proxy - await deployer.deploy(c_BasketManagerProxy); - const d_BasketManagerProxy = await c_BasketManagerProxy.deployed(); - - // 2.2. Deploy no Init AaveIntegration - // - Deploy Implementation with dummy params (this storage doesn't get used) - await deployer.deploy(c_AaveIntegration); - const d_AaveIntegration = await c_AaveIntegration.deployed(); - await d_AaveIntegration.initialize(DEAD_ADDRESS, [DEAD_ADDRESS], DEAD_ADDRESS, [], []); - // - Deploy Initializable Proxy - const d_AaveIntegrationProxy = await c_VaultProxy.new(); - - // 2.3. Deploy no Init CompoundIntegration - // - Deploy Implementation - // We do not need platform address for compound - await deployer.deploy(c_CompoundIntegration); - const d_CompoundIntegration = await c_CompoundIntegration.deployed(); - await d_CompoundIntegration.initialize(DEAD_ADDRESS, [DEAD_ADDRESS], DEAD_ADDRESS, [], []); - // - Deploy Initializable Proxy - const d_CompoundIntegrationProxy = await c_VaultProxy.new(); - - // 2.4. Deploy mUSD (w/ BasketManager addr) - // 2.4.1. Deploy ForgeValidator - await deployer.deploy(c_ForgeValidator, { from: default_ }); - const d_ForgeValidator = await c_ForgeValidator.deployed(); - // 2.4.2. Deploy mUSD - await deployer.deploy(c_Masset, { from: default_ }); - const d_mUSD = await c_Masset.deployed(); - // Initialize mUSD implementation to avoid external party doing so - await d_mUSD.initialize("", "", DEAD_ADDRESS, DEAD_ADDRESS, DEAD_ADDRESS); - // Deploy mUSD proxy - await deployer.deploy(c_MassetProxy); - const d_mUSDProxy = await c_MassetProxy.deployed(); - // Initialize proxy data - const initializationData_mUSD: string = d_mUSD.contract.methods - .initialize( - "mStable USD", - "mUSD", - d_Nexus.address, - d_ForgeValidator.address, - d_BasketManagerProxy.address, - ) - .encodeABI(); - await d_mUSDProxy.methods["initialize(address,address,bytes)"]( - d_mUSD.address, - d_DelayedProxyAdmin.address, - initializationData_mUSD, - ); - - // 2.5. Init AaveIntegration - const initializationData_AaveIntegration: string = d_AaveIntegration.contract.methods - .initialize( - d_Nexus.address, - [d_mUSDProxy.address, d_BasketManagerProxy.address], - bassetDetails.aavePlatformAddress, - bassetDetails.aTokens.map((a) => a.bAsset), - bassetDetails.aTokens.map((a) => a.aToken), - ) - .encodeABI(); - await d_AaveIntegrationProxy.methods["initialize(address,address,bytes)"]( - d_AaveIntegration.address, - d_DelayedProxyAdmin.address, - initializationData_AaveIntegration, - ); - - // 2.6. Init CompoundIntegration - const initializationData_CompoundIntegration: string = d_CompoundIntegration.contract.methods - .initialize( - d_Nexus.address, - [d_mUSDProxy.address, d_BasketManagerProxy.address], - ZERO_ADDRESS, // We don't need Compound sys addr - bassetDetails.cTokens.map((c) => c.bAsset), - bassetDetails.cTokens.map((c) => c.cToken), - ) - .encodeABI(); - await d_CompoundIntegrationProxy.methods["initialize(address,address,bytes)"]( - d_CompoundIntegration.address, - d_DelayedProxyAdmin.address, - initializationData_CompoundIntegration, - ); - - // 2.7. Init BasketManager - const initializationData_BasketManager: string = d_BasketManager.contract.methods - .initialize( - d_Nexus.address, - d_mUSDProxy.address, - bassetDetails.bAssets.map((b) => b.address), - bassetDetails.platforms.map((p) => - p === Platform.aave - ? d_AaveIntegrationProxy.address - : d_CompoundIntegrationProxy.address, - ), - bassetDetails.bAssets.map(() => percentToWeight(100).toString()), - bassetDetails.bAssets.map(() => false), - ) - .encodeABI(); - await d_BasketManagerProxy.methods["initialize(address,address,bytes)"]( - d_BasketManager.address, - d_DelayedProxyAdmin.address, - initializationData_BasketManager, - ); - - /*************************************** - 3. Savings - Dependencies: [ - mUSD - ] - ****************************************/ - - // Savings Contract - await deployer.deploy(c_SavingsContract, d_Nexus.address, d_mUSDProxy.address, { - from: default_, - }); - const d_SavingsContract = await c_SavingsContract.deployed(); - - // Savings Manager - await deployer.deploy( - c_SavingsManager, - d_Nexus.address, - d_mUSDProxy.address, - d_SavingsContract.address, - { from: default_ }, - ); - const d_SavingsManager = await c_SavingsManager.deployed(); - - /*************************************** - 4. Initialize Nexus Modules - Dependencies: [ - New Governor, - SavingsManager - ] - ****************************************/ - - const module_keys = [KEY_SAVINGS_MANAGER, KEY_PROXY_ADMIN]; - const module_addresses = [d_SavingsManager.address, d_DelayedProxyAdmin.address]; - const module_isLocked = [false, true]; - await d_Nexus.initialize(module_keys, module_addresses, module_isLocked, newGovernor, { - from: governor, - }); - - console.log(`[mUSD]: '${d_mUSDProxy.address}'`); - console.log(`[mUSD impl]: '${d_mUSD.address}'`); - console.log(`[BasketManager]: '${d_BasketManagerProxy.address}'`); - console.log(`[BasketManager impl]: '${d_BasketManager.address}'`); - console.log(`[AaveIntegration]: '${d_AaveIntegrationProxy.address}'`); - console.log(`[CompoundIntegration]: '${d_CompoundIntegrationProxy.address}'`); - console.log(`[SavingsManager]: '${d_SavingsManager.address}'`); - console.log(`[SavingsContract]: '${d_SavingsContract.address}'`); - console.log(`[Nexus]: '${d_Nexus.address}'`); - console.log(`[ProxyAdmin]: '${d_DelayedProxyAdmin.address}'`); -}; diff --git a/migrations/src/3_rewards.ts b/migrations/src/3_rewards.ts deleted file mode 100644 index 89914bdf..00000000 --- a/migrations/src/3_rewards.ts +++ /dev/null @@ -1,78 +0,0 @@ -/* eslint-disable @typescript-eslint/camelcase */ -/* eslint-disable spaced-comment */ -/* eslint-disable @typescript-eslint/triple-slash-reference,spaced-comment */ -/// -/// - -export default async ( - { artifacts }: { artifacts: Truffle.Artifacts }, - deployer, - network, - accounts, -): Promise => { - if (deployer.network === "fork") { - // Don't bother running these migrations -- speed up the testing - return; - } - - const [default_] = accounts; - - /*************************************** - 0. IMPORTS - ****************************************/ - - const c_MetaToken = artifacts.require("MetaToken"); - // Rewards contracts - const c_RewardsDistributor = artifacts.require("RewardsDistributor"); - const c_StakingRewards = artifacts.require("StakingRewards"); - const c_StakingRewardsWithPlatformToken = artifacts.require("StakingRewardsWithPlatformToken"); - // Mock ERC20 - const c_MockERC20 = artifacts.require("MockERC20"); - const c_Nexus = artifacts.require("Nexus"); - - /*************************************** - 1. Meta - Dependencies: [] - ****************************************/ - const d_Nexus = await c_Nexus.deployed(); - await deployer.deploy(c_MetaToken, d_Nexus.address, default_, { from: default_ }); - const d_MetaToken = await c_MetaToken.deployed(); - - /*************************************** - 2. StakingRewards - ****************************************/ - - await deployer.deploy(c_RewardsDistributor, d_Nexus.address, [default_]); - const rewardsDistributor = await c_RewardsDistributor.deployed(); - - if (network === "development") { - const stakingToken1 = await c_MockERC20.new("STAKE", "ST8", 18, default_, 1000000); - const stakingRewards = await c_StakingRewards.new( - d_Nexus.address, - stakingToken1.address, - d_MetaToken.address, - rewardsDistributor.address, - ); - - const stakingToken2 = await c_MockERC20.new("STAKE2", "ST82", 18, default_, 1000000); - const platformToken = await c_MockERC20.new("PLATFRM", "PLAT", 14, default_, 1000000); - const stakingRewardsWithPlatformToken = await c_StakingRewardsWithPlatformToken.new( - d_Nexus.address, - stakingToken2.address, - d_MetaToken.address, - platformToken.address, - rewardsDistributor.address, - ); - - console.log(`[StakingRewards]: '${stakingRewards.address}'`); - console.log(`[StakingToken1]: '${stakingToken1.address}'`); - console.log( - `[StakingRewardsWithPlatformToken]: '${stakingRewardsWithPlatformToken.address}'`, - ); - console.log(`[StakingToken2]: '${stakingToken2.address}'`); - console.log(`[PlatformToken]: '${platformToken.address}'`); - } - - console.log(`[Meta]: '${d_MetaToken.address}'`); - console.log(`[RewardsDistributor]: '${rewardsDistributor.address}'`); -}; diff --git a/migrations/src/4_staking.ts b/migrations/src/4_staking.ts deleted file mode 100644 index 97e07b5d..00000000 --- a/migrations/src/4_staking.ts +++ /dev/null @@ -1,63 +0,0 @@ -/* eslint-disable @typescript-eslint/camelcase */ -/* eslint-disable spaced-comment */ -/* eslint-disable @typescript-eslint/triple-slash-reference,spaced-comment */ -/// -/// - -import { simpleToExactAmount } from "@utils/math"; - -export default async ( - { artifacts }: { artifacts: Truffle.Artifacts }, - deployer, - network, - accounts, -): Promise => { - if (deployer.network === "fork") { - // Don't bother running these migrations -- speed up the testing - return; - } - - const [default_] = accounts; - - /*************************************** - 0. IMPORTS - ****************************************/ - - const c_IncentivisedVotingLockup = artifacts.require("IncentivisedVotingLockup"); - - const c_RewardsDistributor = artifacts.require("RewardsDistributor"); - const c_MetaToken = artifacts.require("MetaToken"); - const c_Nexus = artifacts.require("Nexus"); - - /*************************************** - 1. IncentivisedVotingLockup - Dependencies: [] - ****************************************/ - const d_Nexus = await c_Nexus.deployed(); - const d_MetaToken = await c_MetaToken.deployed(); - const d_RewardsDistributor = await c_RewardsDistributor.deployed(); - await deployer.deploy( - c_IncentivisedVotingLockup, - d_MetaToken.address, - "Voting MTA", - "vMTA", - d_Nexus.address, - d_RewardsDistributor.address, - { - from: default_, - }, - ); - const d_IncentivisedVotingLockup = await c_IncentivisedVotingLockup.deployed(); - - if (deployer.network !== "mainnet") { - await d_MetaToken.approve(d_RewardsDistributor.address, simpleToExactAmount(10000, 18), { - from: default_, - }); - await d_RewardsDistributor.distributeRewards( - [d_IncentivisedVotingLockup.address], - [simpleToExactAmount(10000, 18)], - { from: default_ }, - ); - } - console.log(`[IncentivisedVotingLockup]: '${d_IncentivisedVotingLockup.address}'`); -}; diff --git a/package.json b/package.json index afd1746b..f2da0008 100644 --- a/package.json +++ b/package.json @@ -12,19 +12,18 @@ "/types/**/*.ts" ], "scripts": { - "migrate": "truffle migrate --network development --reset", - "migrate:ropsten": "truffle migrate --network ropsten --reset", - "migrate:kovan": "truffle migrate --network kovan --reset", "lint": "yarn run lint-ts; yarn run lint-sol", - "lint-ts": "yarn eslint ./test --ext .ts,.js --fix --quiet", - "lint-sol": "solium -d contracts/ --fix ", - "coverage": "yarn hardhat compile --force && node --max_old_space_size=6144 node_modules/.bin/hardhat coverage --temp 'build/contracts' --testfiles 'test/**/Test*.ts' --show-stack-traces", - "script": "yarn truffle exec ./scripts/main.js", - "test": "yarn hardhat test;", + "lint-ts": "yarn eslint ./test --ext .ts --fix --quiet", + "lint-sol": "solhint 'contracts/**/*.sol'", + "coverage": "yarn hardhat compile --force && node --max_old_space_size=6144 node_modules/.bin/hardhat coverage --temp 'build/contracts' --testfiles 'test/**/*.spec.ts' --show-stack-traces", + "convertTestFiles": "cd test-utils/validator-data; ts-node ./convertCsvTestFiles.ts", + "task": "yarn compile && yarn hardhat --config tasks.config.ts", + "test": "yarn hardhat test", + "test:long": "LONG_TESTS=true yarn hardhat test", "test-file": "yarn hardhat test", - "test:fork": "yarn run compile; yarn hardhat test --network fork;", + "test-file:long": "LONG_TESTS=true yarn hardhat test", "compile": "yarn hardhat compile --force", - "prettify": "prettier --write test/*.ts test/**/*.ts types/generated/*.ts types/*.ts artifacts/*.ts", + "prettify": "prettier --write tasks/**/*.ts test/**/*.ts types/*.ts contracts/**/*.sol", "flatten": "sol-merger \"./contracts/**/*.sol\" ./_flat", "prepublishOnly": "yarn run compile" }, @@ -33,56 +32,44 @@ "url": "git+https://github.com/mstable/mstable-contracts.git" }, "devDependencies": { - "@nomiclabs/hardhat-web3": "^2.0.0", - "@openzeppelin/contracts": "2.5.0", - "@openzeppelin/test-helpers": "git+https://git@github.com/alsco77/openzeppelin-test-helpers.git", - "@openzeppelin/upgrades": "2.7.2", - "@truffle/hdwallet-provider": "^1.0.34", - "@typechain/truffle-v5": "^2.0.0", - "@types/bn.js": "^4.11.6", - "@types/chai": "^4.2.2", + "@nomiclabs/hardhat-ethers": "^2.0.1", + "@nomiclabs/hardhat-waffle": "^2.0.1", + "@openzeppelin/contracts-sol8": "yarn:oz-fork@3.4.0", + "@tenderly/hardhat-tenderly": "^1.0.3", + "@typechain/ethers-v5": "^5.0.0", "@types/lodash": "^4.14.138", - "@types/mocha": "^5.2.7", - "@types/node": "^12.7.5", - "@typescript-eslint/eslint-plugin": "^2.21.0", - "@typescript-eslint/eslint-plugin-tslint": "^2.21.0", - "@typescript-eslint/parser": "^2.21.0", + "@types/mocha": "^8.2.0", + "@types/node": "^14.14.22", + "@typescript-eslint/eslint-plugin": "^4.14.0", + "@typescript-eslint/eslint-plugin-tslint": "^4.14.0", + "@typescript-eslint/parser": "^4.14.0", "chai": "^4.2.0", - "chai-bn": "^0.2.0", - "chalk": "^3.0.0", - "eslint": "^6.8.0", - "eslint-config-airbnb-typescript": "^7.0.0", - "eslint-config-prettier": "^6.10.0", + "csv-parse": "^4.15.0", + "eslint": "^7.18.0", + "eslint-config-airbnb-typescript": "^12.0.0", + "eslint-config-prettier": "^7.2.0", "eslint-import-resolver-alias": "^1.1.2", "eslint-plugin-import": "^2.20.1", "eslint-plugin-jsx-a11y": "^6.2.3", "eslint-plugin-react": "^7.18.3", - "ethlint": "^1.2.5", - "humanize-duration": "^3.21.0", - "mocha": "^7.0.1", - "parse-duration": "^0.1.2", - "prettier": "^1.18.2", - "solc": "0.5.16", - "truffle": "5.1.22", - "truffle-plugin-verify": "^0.3.10", - "truffle-typings": "^1.0.8", - "typechain": "^4.0.0", - "types-ethereumjs-util": "^0.0.8", - "typescript": "^3.6.3", - "web3": "^1.2.6", - "web3-utils": "1.2.6" - }, - "dependencies": { - "@nomiclabs/hardhat-truffle5": "^2.0.0", - "@tenderly/hardhat-tenderly": "^1.0.3", - "hardhat": "^2.0.3", + "ethereum-waffle": "^3.0.0", + "ethers": "^5.0.26", + "hardhat": "^2.0.8", "hardhat-gas-reporter": "^1.0.1", - "hardhat-typechain": "^0.3.3", + "hardhat-typechain": "0.3.3", + "humanize-duration": "^3.21.0", + "mocha": "^8.2.1", + "prettier": "^2.2.1", + "prettier-plugin-solidity": "^1.0.0-beta.3", "sol-merger": "^3.0.1", - "solidity-coverage": "^0.7.12", + "solc": "0.8.0", + "solhint": "^3.3.2", + "solidity-coverage": "0.7.12", "ts-generator": "^0.1.1", - "ts-node": "^8.4.1", - "tsconfig-paths": "^3.9.0" + "ts-node": "^9.1.1", + "tsconfig-paths": "^3.9.0", + "typechain": "4.0.0", + "typescript": "^4.1.3" }, "_moduleAliases": { "@utils": "transpiled/test-utils" diff --git a/scripts/main.js b/scripts/main.js deleted file mode 100644 index 09bedbec..00000000 --- a/scripts/main.js +++ /dev/null @@ -1,13 +0,0 @@ -const [scriptName, ...args] = process.argv.slice(4); - -// Import TypeScript; it can't be run directly, but Truffle must use -// babel because requiring it works. -const script = require(`./src/${scriptName}.ts`).default; - -// Bind the first argument of the script to the global truffle argument, -// with `web3`, `artifacts` and so on, and pass in all CLI arguments. -module.exports = (callback) => { - script(this, ...args) - .then(callback) - .catch(callback); -}; diff --git a/scripts/src/utils/logging.ts b/scripts/src/utils/logging.ts deleted file mode 100644 index 467e0eed..00000000 --- a/scripts/src/utils/logging.ts +++ /dev/null @@ -1,132 +0,0 @@ -// eslint-disable-next-line import/no-extraneous-dependencies -import chalk from "chalk"; -import { blockTimestampSimple } from "./time"; - -export const logBlockTimestamp = async (web3: any, block = "latest") => { - const timestamp = await blockTimestampSimple(web3, block); - console.log(`Current block timestamp: ${timestamp}`); -}; - -export const logSeparator = () => { - console.log(chalk.gray("------------------------------------------------")); -}; - -export const logObject = (obj: object) => { - const keys = Object.keys(obj); - console.table( - keys.sort().reduce( - (acc, key) => ({ - [key]: obj[key].toString(), - ...acc, - }), - {}, - ), - ); -}; - -export const logAndSanitizeArgs = (args: object) => { - logObject(sanitizeArgs(args)); -}; - -const sanitizeArgs = (args: object) => { - // Remove indexed keys, use named keys - return Object.keys(args) - .filter((key) => key !== "__length__" && !Number.isInteger(parseInt(key, 10))) - .reduce((acc, key) => ({ ...acc, [key]: args[key] }), {}); -}; - -const logTxResponse = ({ logs }: Truffle.TransactionResponse) => { - logs.forEach(({ event, args }) => { - console.log(chalk.gray("Event ") + chalk.italic(event)); - logAndSanitizeArgs(args); - }); -}; - -export const logTx = async ( - txPromise: Promise | Truffle.TransactionResponse[]>, - description: string, -) => { - logSeparator(); - console.log(`${chalk.blue("[tx]")} ${description}`); - let response; - try { - response = await txPromise; - } catch (error) { - console.log(chalk.blue(" --> ") + chalk.redBright("✘ Failed!")); - throw error; - } - console.log(chalk.blue(" --> ") + chalk.greenBright("✔ Success!")); - - if (Array.isArray(response)) { - response.map(logTxResponse); - } else { - logTxResponse(response); - } - - return response; -}; - -// export const logTrancheData = async (forge: ForgeRewardsMUSDInstance, trancheNumber: string) => { -// const [ -// startTime, -// endTime, -// claimEndTime, -// unlockTime, -// totalMintVolume, -// totalRewardUnits, -// unclaimedRewardUnits, -// rewardees, -// ] = await forge.getTrancheData(trancheNumber); -// const data = { -// startTime, -// endTime, -// claimEndTime, -// unlockTime, -// totalMintVolume, -// totalRewardUnits, -// unclaimedRewardUnits, -// rewardees, -// }; - -// logSeparator(); -// console.log(`Tranche ${trancheNumber} data:`); -// logObject(data); - -// return data; -// }; - -// export const logRewardeeData = async ( -// forge: ForgeRewardsMUSDInstance, -// trancheNumber: string, -// account: string, -// ): Promise<{ -// claimed: boolean; -// claimWindowClosed: boolean; -// mintVolume: BN; -// mintWindowClosed: boolean; -// redeemed: boolean; -// rewardAllocation: BN; -// unlocked: boolean; -// }> => { -// const data: { -// claimed: boolean; -// claimWindowClosed: boolean; -// mintVolume: string; -// mintWindowClosed: boolean; -// redeemed: boolean; -// rewardAllocation: string; -// unlocked: boolean; -// } = await forge.contract.methods["getRewardeeData(uint256,address)"]( -// trancheNumber, -// account, -// ).call(); - -// data.rewardAllocation = new BN(data.rewardAllocation); -// data.mintVolume = new BN(data.mintVolume); - -// logSeparator(); -// console.log(`Rewardee data for ${account} in tranche ${trancheNumber}:`); -// logAndSanitizeArgs(data); - -// return data; -// }; diff --git a/scripts/src/utils/time.ts b/scripts/src/utils/time.ts deleted file mode 100644 index b1ae91d6..00000000 --- a/scripts/src/utils/time.ts +++ /dev/null @@ -1,40 +0,0 @@ -import chalk from "chalk"; -import humanizeDuration from "humanize-duration"; -import { BN } from "../../../test-utils/tools"; - -export const nowSimple = (): number => Math.ceil(Date.now() / 1000); - -export const nowExact = (): BN => new BN(nowSimple()); - -export const blockTimestampExact = async (web3: any, block = "latest"): Promise => { - const timestamp = await blockTimestampSimple(web3, block); - return new BN(timestamp); -}; - -export const blockTimestampSimple = async (web3: any, block = "latest"): Promise => { - const { timestamp } = await web3.eth.getBlock(block); - return timestamp; -}; - -export const timeTravel = async (web3: any, seconds: number) => { - const timestamp = await blockTimestampSimple(web3); - const newTimestamp = timestamp + seconds; - console.log(`Advancing block time ${seconds} seconds...`); - - return new Promise((resolve, reject) => { - web3.currentProvider.send( - { - jsonrpc: "2.0", - method: "evm_mine", - params: [newTimestamp], - id: new Date().getTime(), - }, - (err, result) => { - if (err) { - return reject(err); - } - return resolve(result); - }, - ); - }); -}; diff --git a/tasks.config.ts b/tasks.config.ts new file mode 100644 index 00000000..c6883937 --- /dev/null +++ b/tasks.config.ts @@ -0,0 +1,4 @@ +import { hardhatConfig } from "./hardhat.config" +import "./tasks/deployMbtc" + +export default hardhatConfig diff --git a/tasks/deployMbtc.ts b/tasks/deployMbtc.ts new file mode 100644 index 00000000..5898ab78 --- /dev/null +++ b/tasks/deployMbtc.ts @@ -0,0 +1,448 @@ +/* eslint-disable no-console */ +import "ts-node/register" +import "tsconfig-paths/register" + +import { btcBassets, startingCap, capFactor, config, mBtcName, mBtcSymbol, DeployedBasset } from "@utils/btcConstants" +import { DEAD_ADDRESS, ZERO_ADDRESS } from "@utils/constants" +import { Signer } from "ethers" +import { task } from "hardhat/config" +import { formatEther } from "ethers/lib/utils" +import { + SavingsContract, + Masset, + Masset__factory, + InvariantValidator__factory, + AssetProxy__factory, + MockERC20, + MockERC20__factory, + MockInitializableToken__factory, + SavingsContract__factory, + BoostedSavingsVault__factory, + BoostedSavingsVault, + ERC20__factory, + SaveWrapper__factory, + RenWrapper__factory, +} from "types/generated" +import { simpleToExactAmount, BN } from "@utils/math" + +interface CommonAddresses { + mta: string + staking: string + nexus: string + proxyAdmin: string + rewardsDistributor: string + uniswap: string + poker: string + renGatewayRegistry: string +} + +const deployBasset = async (sender: Signer, name: string, symbol: string, decimals = 18, initialMint = 500000): Promise => { + // Implementation + const impl = await new MockInitializableToken__factory(sender).deploy() + await impl.deployTransaction.wait() + + // Initialization Data + const data = impl.interface.encodeFunctionData("initialize", [name, symbol, decimals, await sender.getAddress(), initialMint]) + // Proxy + const proxy = await new AssetProxy__factory(sender).deploy(impl.address, DEAD_ADDRESS, data) + const receipt = await proxy.deployTransaction.wait() + + console.log(`Deployed ${name} (${symbol}) to address ${proxy.address}. gas used ${receipt.gasUsed}`) + + return new MockERC20__factory(sender).attach(proxy.address) +} + +const deployMasset = async (sender: Signer, addresses: CommonAddresses, ethers, bAssetContracts: DeployedBasset[]): Promise => { + // Invariant Validator + console.log(`Deploying Invariant Validator with startingCap ${startingCap.toString()} and capfactor ${capFactor.toString()}`) + const forgeVal = await new InvariantValidator__factory(sender).deploy(startingCap, capFactor) + const receiptForgeVal = await forgeVal.deployTransaction.wait() + console.log(`Deployed Invariant Validator to ${forgeVal.address}. gas used ${receiptForgeVal.gasUsed}`) + + // External linked library + const Manager = await ethers.getContractFactory("Manager") + const managerLib = await Manager.deploy() + const receiptManager = await managerLib.deployTransaction.wait() + console.log(`Deployed Manager library to ${managerLib.address}. gas used ${receiptManager.gasUsed}`) + + const linkedAddress = { + __$1a38b0db2bd175b310a9a3f8697d44eb75$__: managerLib.address, + } + // Implementation + const massetFactory = new Masset__factory(linkedAddress, sender) + const size = massetFactory.bytecode.length / 2 / 1000 + if (size > 24.576) { + console.error(`Masset size is ${size} kb: ${size - 24.576} kb too big`) + } else { + console.log(`Masset = ${size} kb`) + } + console.log(`Deploying Masset with ManagerAddr: ${managerLib.address} and nexus ${addresses.nexus}`) + const impl = await massetFactory.deploy(addresses.nexus) + const receiptImpl = await impl.deployTransaction.wait() + console.log(`Deployed Masset to ${impl.address}. gas used ${receiptImpl.gasUsed}`) + + // Initialization Data + console.log( + `Initializing Masset with: ${mBtcName}, ${mBtcSymbol}, ${forgeVal.address}, [${bAssetContracts.map( + // eslint-disable-next-line + (b) => "{" + b.contract.address + ", " + b.integrator + ", " + b.txFee + ", " + 0 + "}", + )} ] , ${config.a.toString()}, ${config.limits.min.toString()}, ${config.limits.max.toString()}`, + ) + const data = impl.interface.encodeFunctionData("initialize", [ + mBtcName, + mBtcSymbol, + forgeVal.address, + bAssetContracts.map((b) => ({ + addr: b.contract.address, + integrator: b.integrator, + hasTxFee: b.txFee, + status: 0, + })), + config, + ]) + // Proxy + console.log(`Deploying mBTC proxy with impl: ${impl.address} and admin ${addresses.proxyAdmin}`) + const mBtcProxy = await new AssetProxy__factory(sender).deploy(impl.address, addresses.proxyAdmin, data) + const receiptProxy = await mBtcProxy.deployTransaction.wait() + + console.log(`Deployed mBTC to address ${mBtcProxy.address}. gas used ${receiptProxy.gasUsed}`) + + if (addresses.renGatewayRegistry !== DEAD_ADDRESS) { + const gateway = await new RenWrapper__factory(sender).deploy(mBtcProxy.address, addresses.renGatewayRegistry) + const receiptGateway = await gateway.deployTransaction.wait() + console.log(`Deployed Ren Gateway wrapper to address ${gateway.address}. gas used ${receiptGateway.gasUsed}`) + } + + // Create a Masset contract pointing to the deployed proxy contract + return new Masset__factory(linkedAddress, sender).attach(mBtcProxy.address) +} + +const mint = async (sender: Signer, bAssets: DeployedBasset[], mBTC: Masset) => { + // Mint 3/5 of starting cap + const scaledTestQty = startingCap.div(5) + + // Approve spending + // eslint-disable-next-line + for (const bAsset of bAssets) { + // eslint-disable-next-line + const tx = await bAsset.contract.approve(mBTC.address, scaledTestQty) + // eslint-disable-next-line + const receiptApprove = await tx.wait() + console.log( + // eslint-disable-next-line + `Approved mBTC to transfer ${formatEther(scaledTestQty)} ${bAsset.symbol} from ${await sender.getAddress()}. gas used ${ + receiptApprove.gasUsed + }`, + ) + } + + // Mint + const tx = await mBTC.mintMulti( + bAssets.map((b) => b.contract.address), + bAssets.map(() => scaledTestQty), + 1, + await sender.getAddress(), + ) + const receiptMint = await tx.wait() + + // Log minted amount + const mAssetAmount = formatEther(await mBTC.totalSupply()) + console.log(`Minted ${mAssetAmount} mBTC from ${formatEther(scaledTestQty)} BTC for each bAsset. gas used ${receiptMint.gasUsed}`) +} + +interface SaveContracts { + savingContract: SavingsContract + savingsVault: BoostedSavingsVault +} + +const deploySave = async ( + sender: Signer, + addresses: CommonAddresses, + mBTC: Masset, + bAssets: Array, + deployVault = true, +): Promise => { + // Save impl + console.log(`Deploying Savings Contract nexus: ${addresses.nexus} and underlying ${mBTC.address}`) + const sImpl = await new SavingsContract__factory(sender).deploy(addresses.nexus, mBTC.address) + const receiptSaving = await sImpl.deployTransaction.wait() + console.log(`Deployed Savings contract to ${sImpl.address}. gas used ${receiptSaving.gasUsed}`) + + // Data + const sData = sImpl.interface.encodeFunctionData("initialize", [addresses.poker, "Interest bearing mStable BTC", "imBTC"]) + // Proxy + console.log(`Deploying Savings Contract proxy, impl: ${sImpl.address}, admin: ${addresses.proxyAdmin}`) + const sProxy = await new AssetProxy__factory(sender).deploy(sImpl.address, addresses.proxyAdmin, sData) + const receiptProxy = await sProxy.deployTransaction.wait() + const savingContract = await new SavingsContract__factory(sender).attach(sProxy.address) + console.log(`Deployed Saving Proxy to ${sProxy.address}. gas used ${receiptProxy.gasUsed}`) + + // Vault impl + if (deployVault) { + const vImpl = await new BoostedSavingsVault__factory(sender).deploy( + addresses.nexus, + savingContract.address, + addresses.staking, + simpleToExactAmount(3000, 18), + addresses.mta, + ) + const receiptVaultImpl = await vImpl.deployTransaction.wait() + console.log(`Deployed Vault Impl to ${sProxy.address}. gas used ${receiptVaultImpl.gasUsed}`) + + // Data + const vData = vImpl.interface.encodeFunctionData("initialize", [addresses.rewardsDistributor]) + // Proxy + const vProxy = await new AssetProxy__factory(sender).deploy(vImpl.address, addresses.proxyAdmin, vData) + const receiptVaultProxy = await vProxy.deployTransaction.wait() + const savingsVault = await new BoostedSavingsVault__factory(sender).attach(vProxy.address) + console.log(`Deployed Vault Proxy to ${vProxy.address}. gas used ${receiptVaultProxy.gasUsed}`) + + // SaveWrapper + const wrapper = await new SaveWrapper__factory(sender).deploy( + savingContract.address, + savingsVault.address, + mBTC.address, + bAssets, + addresses.uniswap, + ) + const receiptSavingWrapper = await wrapper.deployTransaction.wait() + console.log(`Deployed Savings Wrapper to address ${wrapper.address}. gas used ${receiptSavingWrapper.gasUsed}`) + + return { savingContract, savingsVault } + } + // SaveWrapper + console.log(`Deploying Wrapper...`) + const wrapper = await new SaveWrapper__factory(sender).deploy( + savingContract.address, + DEAD_ADDRESS, + mBTC.address, + bAssets, + addresses.uniswap, + ) + const receiptSavingWrapper = await wrapper.deployTransaction.wait() + console.log(`Deployed Savings Wrapper to address ${wrapper.address}. gas used ${receiptSavingWrapper.gasUsed}`) + + return { savingContract, savingsVault: null } +} + +const depositToVault = async (sender: Signer, mBTC: Masset, save: SaveContracts): Promise => { + // Mint imBTC + const deposit = startingCap.div(BN.from(3)) + let tx = await mBTC.approve(save.savingContract.address, deposit) + await tx.wait() + tx = await save.savingContract.preDeposit(deposit, await sender.getAddress()) + await tx.wait() + const balance = await save.savingContract.balanceOf(await sender.getAddress()) + + // Deposit to vault + tx = await save.savingContract.approve(save.savingsVault.address, balance) + await tx.wait() + tx = await save.savingsVault["stake(uint256)"](balance) + tx.wait() + + console.log(`Minted ${formatEther(balance)} imBTC from ${formatEther(deposit)} mBTC and deposited to vault`) +} + +task("deployMBTC", "Deploys the mBTC contracts").setAction(async (_, hre) => { + const { ethers, network } = hre + const [deployer] = await ethers.getSigners() + + const addresses = + network.name === "ropsten" + ? { + mta: "0x273bc479E5C21CAA15aA8538DecBF310981d14C0", + staking: "0x77f9bf80e0947408f64faa07fd150920e6b52015", + nexus: "0xeD04Cd19f50F893792357eA53A549E23Baf3F6cB", + proxyAdmin: "0x2d369F83E9DC764a759a74e87a9Bc542a2BbfdF0", + rewardsDistributor: "0x99B62B75E3565bEAD786ddBE2642E9c40aA33465", + uniswap: DEAD_ADDRESS, + poker: DEAD_ADDRESS, + renGatewayRegistry: DEAD_ADDRESS, + } + : { + mta: DEAD_ADDRESS, + staking: (await new MockERC20__factory(deployer).deploy("Stake", "ST8", 18, DEAD_ADDRESS, 1)).address, + nexus: DEAD_ADDRESS, + proxyAdmin: DEAD_ADDRESS, + rewardsDistributor: DEAD_ADDRESS, + uniswap: DEAD_ADDRESS, + poker: DEAD_ADDRESS, + renGatewayRegistry: DEAD_ADDRESS, + } + + // 1. Deploy bAssets + const bAssets: DeployedBasset[] = [] + // eslint-disable-next-line + for (const btcBasset of btcBassets) { + // eslint-disable-next-line + const contract = await deployBasset(deployer, btcBasset.name, btcBasset.symbol, btcBasset.decimals, btcBasset.initialMint) + bAssets.push({ + contract, + integrator: btcBasset.integrator, + txFee: btcBasset.txFee, + symbol: btcBasset.symbol, + }) + } + + // 2. Deploy mBTC + const mBTC = await deployMasset(deployer, addresses, ethers, bAssets) + + // 3. Mint initial supply + await mint(deployer, bAssets, mBTC) + + // 4. Create savings contract & vault + const savingsContracts = await deploySave( + deployer, + addresses, + mBTC, + bAssets.map((b) => b.contract.address), + ) + + // 5. Mint imBTC and deposit to vault + await depositToVault(deployer, mBTC, savingsContracts) + + // Governance funcs to complete setup: + // - Add mBTC savingsContract to SavingsManager to enable interest collection + // - Fund the BoostedSavingsVault with MTA to enable rewards +}) + +task("reDeployMBTC", "Re-deploys the mBTC contracts given bAsset addresses").setAction(async (_, hre) => { + const { ethers, network } = hre + const [deployer] = await ethers.getSigners() + + const addresses = + network.name === "ropsten" + ? { + mta: "0x273bc479E5C21CAA15aA8538DecBF310981d14C0", + staking: "0x77f9bf80e0947408f64faa07fd150920e6b52015", + nexus: "0xeD04Cd19f50F893792357eA53A549E23Baf3F6cB", + proxyAdmin: "0x2d369F83E9DC764a759a74e87a9Bc542a2BbfdF0", + rewardsDistributor: "0x99B62B75E3565bEAD786ddBE2642E9c40aA33465", + uniswap: DEAD_ADDRESS, + poker: DEAD_ADDRESS, + renGatewayRegistry: DEAD_ADDRESS, + } + : { + mta: DEAD_ADDRESS, + staking: (await new MockERC20__factory(deployer).deploy("Stake", "ST8", 18, DEAD_ADDRESS, 1)).address, + nexus: DEAD_ADDRESS, + proxyAdmin: DEAD_ADDRESS, + rewardsDistributor: DEAD_ADDRESS, + uniswap: DEAD_ADDRESS, + poker: DEAD_ADDRESS, + renGatewayRegistry: DEAD_ADDRESS, + } + + const bAssetsRaw: any[] = [ + { + address: "0xd4Da7c3b1C985b8Baec8D2a5709409CCFE809096", + integrator: ZERO_ADDRESS, + txFee: false, + }, + { + address: "0xf08d8Ab65e709B66e77908cc4EDb530113D8d855", + integrator: ZERO_ADDRESS, + txFee: false, + }, + { + address: "0x82e6459D1B9529cC6A8203f1bFE3B04d6CfCbD43", + integrator: ZERO_ADDRESS, + txFee: false, + }, + ] + + // 1. Fetch bAssets + const erc20Factory = await new ERC20__factory(deployer) + const bAssets: DeployedBasset[] = await Promise.all( + bAssetsRaw.map(async (b) => ({ + contract: await erc20Factory.attach(b.address), + integrator: b.integrator, + txFee: b.txFee, + symbol: await (await erc20Factory.attach(b.address)).symbol(), + })), + ) + + // 2. Deploy mBTC + const mBTC = await deployMasset(deployer, addresses, ethers, bAssets) + + // 3. Mint initial supply + await mint(deployer, bAssets, mBTC) + + // 4. Create savings contract & vault + const savingsContracts = await deploySave( + deployer, + addresses, + mBTC, + bAssets.map((b) => b.contract.address), + ) + + // 5. Mint imBTC and deposit to vault + await depositToVault(deployer, mBTC, savingsContracts) + + // Governance funcs to complete setup: + // - Add mBTC savingsContract to SavingsManager to enable interest collection + // - Fund the BoostedSavingsVault with MTA to enable rewards +}) + +task("deployMBTC-mainnet", "Deploys the mBTC contracts to Mainnet").setAction(async (_, hre) => { + const { ethers, network } = hre + if (network.name !== "mainnet") throw Error("Must be mainnet") + + const [deployer] = await ethers.getSigners() + + const addresses = { + mta: "0xa3BeD4E1c75D00fa6f4E5E6922DB7261B5E9AcD2", + staking: "0xae8bc96da4f9a9613c323478be181fdb2aa0e1bf", + nexus: "0xafce80b19a8ce13dec0739a1aab7a028d6845eb3", + proxyAdmin: "0x5c8eb57b44c1c6391fc7a8a0cf44d26896f92386", + rewardsDistributor: "0x04dfdfa471b79cc9e6e8c355e6c71f8ec4916c50", + uniswap: "0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D", + poker: "0x0C2eF8a1b3Bc00Bf676053732F31a67ebbA5bD81", + renGatewayRegistry: DEAD_ADDRESS, + } + const bAssetsRaw: any[] = [ + { + address: "0xeb4c2781e4eba804ce9a9803c67d0893436bb27d", + integrator: ZERO_ADDRESS, + txFee: false, + }, + { + address: "0xfe18be6b3bd88a2d2a7f928d00292e7a9963cfc6", + integrator: ZERO_ADDRESS, + txFee: false, + }, + { + address: "0x2260fac5e5542a773aa44fbcfedf7c193bc2c599", + integrator: ZERO_ADDRESS, + txFee: false, + }, + ] + + // 1. Fetch bAssets + const erc20Factory = await new ERC20__factory(deployer) + const bAssets: DeployedBasset[] = await Promise.all( + bAssetsRaw.map(async (b) => ({ + contract: await erc20Factory.attach(b.address), + integrator: b.integrator, + txFee: b.txFee, + symbol: await (await erc20Factory.attach(b.address)).symbol(), + })), + ) + + // 2. Deploy mBTC + const mBTC = await deployMasset(deployer, addresses, ethers, bAssets) + + // 3. Create savings contract + await deploySave( + deployer, + addresses, + mBTC, + bAssets.map((b) => b.contract.address), + false, + ) + + // Governance funcs to complete setup: + // - Add mBTC savingsContract to SavingsManager to enable interest collection +}) + +module.exports = {} diff --git a/test-utils/assertions.ts b/test-utils/assertions.ts index 5c23163c..6a87f329 100644 --- a/test-utils/assertions.ts +++ b/test-utils/assertions.ts @@ -1,53 +1,47 @@ -import { MassetDetails, MassetMachine } from "@utils/machines"; -import { BN } from "./tools"; -import { simpleToExactAmount } from "./math"; -import { fullScale } from "./constants"; -import envSetup from "./env_setup"; - -const { expect, assert } = envSetup.configure(); +import { MassetMachine, MassetDetails } from "@utils/machines" +import { assert, expect } from "chai" +import { BN, simpleToExactAmount } from "./math" +import { fullScale } from "./constants" /** * Convenience method to assert that two BN.js instances are within 100 units of each other. * @param actual The BN.js instance you received * @param expected The BN.js amount you expected to receive, allowing a varience of +/- 10 units */ -export const assertBNClose = ( - actual: BN, - expected: BN, - variance: BN | number = new BN(10), -): void => { - const actualDelta = actual.gt(expected) ? actual.sub(expected) : expected.sub(actual); +export const assertBNClose = (actual: BN, expected: BN, variance: BN | number = BN.from(10), reason: string = null): void => { + const actualDelta = actual.gt(expected) ? actual.sub(expected) : expected.sub(actual) + const str = reason ? `\n\t${reason}\n\t${actual.toString()} vs ${expected.toString()}` : "" assert.ok( - actual.gte(expected.sub(new BN(variance))), - `Number is too small to be close (Delta between actual and expected is ${actualDelta.toString()}, but variance was only ${variance.toString()}`, - ); + actual.gte(expected.sub(variance)), + `Number is too small to be close (Delta between actual and expected is ${actualDelta.toString()}, but variance was only ${variance.toString()} ${str}`, + ) assert.ok( - actual.lte(expected.add(new BN(variance))), - `Number is too large to be close (Delta between actual and expected is ${actualDelta.toString()}, but variance was only ${variance.toString()})`, - ); -}; + actual.lte(expected.add(variance)), + `Number is too large to be close (Delta between actual and expected is ${actualDelta.toString()}, but variance was only ${variance.toString()}) ${str}`, + ) +} /** * Convenience method to assert that two BN.js instances are within 100 units of each other. * @param actual The BN.js instance you received * @param expected The BN.js amount you expected to receive, allowing a varience of +/- 10 units */ -export const assertBNClosePercent = (a: BN, b: BN, variance = "0.02"): void => { - if (a.eq(b)) return; - const varianceBN = simpleToExactAmount(variance.substr(0, 6), 16); +export const assertBNClosePercent = (a: BN, b: BN, variance: string | number = "0.02"): void => { + if (a.eq(b)) return + const varianceBN = simpleToExactAmount(variance.toString().substr(0, 6), 16) const diff = a .sub(b) .abs() - .muln(2) + .mul(2) .mul(fullScale) - .div(a.add(b)); - + .div(a.add(b)) + console.log(a.toString(), b.toString()) assert.ok( diff.lte(varianceBN), `Numbers exceed ${variance}% diff (Delta between a and b is ${diff.toString()}%, but variance was only ${varianceBN.toString()})`, - ); -}; + ) +} /** * Convenience method to assert that one BN.js instance is GTE the other @@ -55,11 +49,8 @@ export const assertBNClosePercent = (a: BN, b: BN, variance = "0.02"): void => { * @param expected The operant to compare against */ export const assertBnGte = (actual: BN, comparison: BN): void => { - assert.ok( - actual.gte(comparison), - `Number must be GTE comparitor, got: ${actual.toString()}; comparitor: ${comparison.toString()}`, - ); -}; + assert.ok(actual.gte(comparison), `Number must be GTE comparitor, got: ${actual.toString()}; comparitor: ${comparison.toString()}`) +} /** * Convenience method to assert that one BN.js number is eq to, or greater than an expected value by some small amount @@ -71,20 +62,20 @@ export const assertBnGte = (actual: BN, comparison: BN): void => { export const assertBNSlightlyGT = ( actual: BN, equator: BN, - maxActualShouldExceedExpected = new BN(100), + maxActualShouldExceedExpected = BN.from(100), mustBeGreater = false, + reason: string = null, ): void => { - const actualDelta = actual.gt(equator) ? actual.sub(equator) : equator.sub(actual); + const actualDelta = actual.gt(equator) ? actual.sub(equator) : equator.sub(actual) - assert.ok( - mustBeGreater ? actual.gt(equator) : actual.gte(equator), - `Actual value should be greater than the expected value`, - ); + const str = reason ? `\n\t${reason}\n\t${actual.toString()} vs ${equator.toString()}` : "" + + assert.ok(mustBeGreater ? actual.gt(equator) : actual.gte(equator), `Actual value should be greater than the expected value ${str}`) assert.ok( actual.lte(equator.add(maxActualShouldExceedExpected)), - `Actual value should not exceed ${maxActualShouldExceedExpected.toString()} units greater than expected. Variance was ${actualDelta.toString()}`, - ); -}; + `Actual value should not exceed ${maxActualShouldExceedExpected.toString()} units greater than expected. Variance was ${actualDelta.toString()} ${str}`, + ) +} /** * Convenience method to assert that one BN.js number is eq to, or greater than an expected value by some small amount @@ -93,48 +84,33 @@ export const assertBNSlightlyGT = ( * @param maxActualShouldExceedExpected Percentage amount of increase, as a string (1% = 1) * @param mustBeGreater Fail if the operands are equal */ -export const assertBNSlightlyGTPercent = ( - actual: BN, - equator: BN, - maxPercentIncrease = "0.1", - mustBeGreater = false, -): void => { - const maxIncreaseBN = simpleToExactAmount(maxPercentIncrease, 16); - const maxIncreaseUnits = equator.mul(maxIncreaseBN).div(fullScale); +export const assertBNSlightlyGTPercent = (actual: BN, equator: BN, maxPercentIncrease = "0.1", mustBeGreater = false): void => { + const maxIncreaseBN = simpleToExactAmount(maxPercentIncrease, 16) + const maxIncreaseUnits = equator.mul(maxIncreaseBN).div(fullScale) // const actualDelta = actual.gt(equator) ? actual.sub(equator) : equator.sub(actual); - assert.ok( - mustBeGreater ? actual.gt(equator) : actual.gte(equator), - `Actual value should be greater than the expected value`, - ); - assert.ok( - actual.lte(equator.add(maxIncreaseUnits)), - `Actual value should not exceed ${maxPercentIncrease}% greater than expected`, - ); -}; + assert.ok(mustBeGreater ? actual.gt(equator) : actual.gte(equator), `Actual value should be greater than the expected value`) + assert.ok(actual.lte(equator.add(maxIncreaseUnits)), `Actual value should not exceed ${maxPercentIncrease}% greater than expected`) +} -export const assertBasketIsHealthy = async ( - machine: MassetMachine, - md: MassetDetails, -): Promise => { +export const assertBasketIsHealthy = async (machine: MassetMachine, md: MassetDetails): Promise => { // Read full basket composition - const composition = await machine.getBasketComposition(md); + const composition = await machine.getBasketComposition(md) // Assert sum of bAssets in vault storage is gte to total supply of mAsset - assertBnGte(composition.sumOfBassets, composition.totalSupply.add(composition.surplus)); + assertBnGte(composition.sumOfBassets, composition.totalSupply.add(composition.surplus)) // No basket weight should be above max - composition.bAssets.forEach((b, i) => { - expect(b.overweight).to.eq(false); - }); + // composition.bAssets.forEach((b, i) => { + // expect(b.overweight).to.eq(false) + // }) // Actual tokens held should always gte vaultBalance - composition.bAssets.forEach((b) => { - expect(b.actualBalance).bignumber.gte(b.vaultBalance as any); - }); - // Should be unpaused - expect(await md.basketManager.paused()).to.eq(false); + composition.bAssets.forEach((b, i) => { + expect(b.actualBalance, `assertBasketIsHealthy: Actual balance of ${i} < vaultBalance`).gte(b.vaultBalance) + }) + // Should be not undergoing recol + expect(composition.undergoingRecol, "not undergoing recol").to.eq(false) // not failed - expect(composition.failed).to.eq(false); - expect(composition.colRatio).bignumber.eq(fullScale); + expect(composition.failed, "mAsset not failed").to.eq(false) // prepareForgeBasset works // Potentially wrap in mock and check event - await md.basketManager.prepareForgeBasset(md.bAssets[0].address, "1", false); -}; + await md.mAsset["getBasset(address)"](md.bAssets[0].address) +} diff --git a/test-utils/btcConstants.ts b/test-utils/btcConstants.ts new file mode 100644 index 00000000..2e1ce8f7 --- /dev/null +++ b/test-utils/btcConstants.ts @@ -0,0 +1,59 @@ +import { ZERO_ADDRESS } from "@utils/constants" +import { simpleToExactAmount } from "@utils/math" +import { ERC20 } from "types/generated" + +export const config = { + a: 120, + limits: { + min: simpleToExactAmount(5, 16), + max: simpleToExactAmount(75, 16), + }, +} +export const startingCap = simpleToExactAmount(9, 18) // 9 (9 BTC = 405,000) +export const capFactor = simpleToExactAmount(20, 18) // 20 (20 BTC = 900,000) + +export const mBtcName = "mStable BTC" +export const mBtcSymbol = "mBTC" + +export interface Bassets { + name: string + symbol: string + decimals: number + integrator: string + txFee: boolean + initialMint: number +} + +export interface DeployedBasset { + integrator: string + txFee: boolean + contract: ERC20 + symbol: string +} + +export const btcBassets: Bassets[] = [ + { + name: "Ren BTC", + symbol: "renBTC", + decimals: 18, + integrator: ZERO_ADDRESS, + txFee: false, + initialMint: 11000, + }, + { + name: "Synthetix BTC", + symbol: "sBTC", + decimals: 18, + integrator: ZERO_ADDRESS, + txFee: false, + initialMint: 3500, + }, + { + name: "Wrapped BTC", + symbol: "wBTC", + decimals: 18, + integrator: ZERO_ADDRESS, + txFee: false, + initialMint: 43000, + }, +] diff --git a/test-utils/constants.ts b/test-utils/constants.ts index 8be60e9e..771bd0d1 100644 --- a/test-utils/constants.ts +++ b/test-utils/constants.ts @@ -1,110 +1,116 @@ /* eslint-disable max-classes-per-file */ /* eslint-disable lines-between-class-members */ -import { Address } from "../types/common"; -import { BN } from "./tools"; -import utils from "web3-utils"; +import { utils } from "ethers" +import { Address } from "../types/common" +import { BN } from "./math" /** * @notice This file contains constants relevant across the mStable test suite * Wherever possible, it should conform to fixed on chain vars */ -export const ratioScale = new BN(10).pow(new BN(8)); -export const fullScale: BN = new BN(10).pow(new BN(18)); - -export const DEAD_ADDRESS = "0x0000000000000000000000000000000000000001"; -export const ZERO_ADDRESS = "0x0000000000000000000000000000000000000000"; - -export const MAX_UINT256 = new BN(2).pow(new BN(256)).sub(new BN(1)); -export const MAX_INT128 = new BN(2).pow(new BN(127)).sub(new BN(1)); -export const MIN_INT128 = new BN(2).pow(new BN(127)).mul(new BN(-1)); - -export const ZERO = new BN(0); -export const ONE_MIN = new BN(60); -export const TEN_MINS = new BN(60 * 10); -export const ONE_HOUR = new BN(60 * 60); -export const ONE_DAY = new BN(60 * 60 * 24); -export const FIVE_DAYS = new BN(60 * 60 * 24 * 5); -export const TEN_DAYS = new BN(60 * 60 * 24 * 10); -export const ONE_WEEK = new BN(60 * 60 * 24 * 7); -export const ONE_YEAR = new BN(60 * 60 * 24 * 365); - -export const KEY_SAVINGS_MANAGER = utils.keccak256("SavingsManager"); -export const KEY_PROXY_ADMIN = utils.keccak256("ProxyAdmin"); +export const ratioScale = BN.from(10).pow(8) +export const fullScale: BN = BN.from(10).pow(18) + +export const DEAD_ADDRESS = "0x0000000000000000000000000000000000000001" +export const ZERO_ADDRESS = "0x0000000000000000000000000000000000000000" + +export const MAX_UINT256 = BN.from(2) + .pow(256) + .sub(1) +export const MAX_INT128 = BN.from(2) + .pow(127) + .sub(1) +export const MIN_INT128 = BN.from(2) + .pow(127) + .mul(-1) + +export const ZERO = BN.from(0) +export const ONE_MIN = BN.from(60) +export const TEN_MINS = BN.from(60 * 10) +export const ONE_HOUR = BN.from(60 * 60) +export const ONE_DAY = BN.from(60 * 60 * 24) +export const FIVE_DAYS = BN.from(60 * 60 * 24 * 5) +export const TEN_DAYS = BN.from(60 * 60 * 24 * 10) +export const ONE_WEEK = BN.from(60 * 60 * 24 * 7) +export const ONE_YEAR = BN.from(60 * 60 * 24 * 365) + +export const KEY_SAVINGS_MANAGER = utils.keccak256(utils.toUtf8Bytes("SavingsManager")) +export const KEY_PROXY_ADMIN = utils.keccak256(utils.toUtf8Bytes("ProxyAdmin")) export class MainnetAccounts { // Exchange Accounts - private okex: Address = "0x6cC5F688a315f3dC28A7781717a9A798a59fDA7b"; - private binance: Address = "0x3f5CE5FBFe3E9af3971dD833D26bA9b5C936f0bE"; + private okex: Address = "0x6cC5F688a315f3dC28A7781717a9A798a59fDA7b" + private binance: Address = "0x3f5CE5FBFe3E9af3971dD833D26bA9b5C936f0bE" public FUND_SOURCES = { dai: this.okex, usdc: this.binance, tusd: "0x3dfd23a6c5e8bbcfc9581d2e864a68feb6a076d3", usdt: this.binance, - }; - public USDT_OWNER: Address = "0xc6cde7c39eb2f0f0095f41570af89efc2c1ea828"; + } + public USDT_OWNER: Address = "0xc6cde7c39eb2f0f0095f41570af89efc2c1ea828" - public COMP: Address = "0xc00e94Cb662C3520282E6f5717214004A7f26888"; + public COMP: Address = "0xc00e94Cb662C3520282E6f5717214004A7f26888" // All Native Tokens - public DAI: Address = "0x6b175474e89094c44da98b954eedeac495271d0f"; - public TUSD: Address = "0x0000000000085d4780B73119b644AE5ecd22b376"; - public USDC: Address = "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48"; - public USDT: Address = "0xdAC17F958D2ee523a2206206994597C13D831ec7"; - public allNativeTokens: Address[] = [this.DAI, this.TUSD, this.USDC, this.USDT]; + public DAI: Address = "0x6b175474e89094c44da98b954eedeac495271d0f" + public TUSD: Address = "0x0000000000085d4780B73119b644AE5ecd22b376" + public USDC: Address = "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48" + public USDT: Address = "0xdAC17F958D2ee523a2206206994597C13D831ec7" + public allNativeTokens: Address[] = [this.DAI, this.TUSD, this.USDC, this.USDT] // AAVE - public aavePlatform: Address = "0x24a42fD28C976A61Df5D00D0599C34c4f90748c8"; - public aTUSD: Address = "0x4DA9b813057D04BAef4e5800E36083717b4a0341"; - public aUSDT: Address = "0x71fc860F7D3A592A4a98740e39dB31d25db65ae8"; - public allATokens: Address[] = [this.aTUSD, this.aUSDT]; + public aavePlatform: Address = "0x24a42fD28C976A61Df5D00D0599C34c4f90748c8" + public aTUSD: Address = "0x4DA9b813057D04BAef4e5800E36083717b4a0341" + public aUSDT: Address = "0x71fc860F7D3A592A4a98740e39dB31d25db65ae8" + public allATokens: Address[] = [this.aTUSD, this.aUSDT] // Compound cTokens - public cDAI: Address = "0x5d3a536e4d6dbd6114cc1ead35777bab948e3643"; - public cUSDC: Address = "0x39aa39c021dfbae8fac545936693ac917d5e7563"; - public allCTokens: Address[] = [this.cDAI, this.cUSDC]; + public cDAI: Address = "0x5d3a536e4d6dbd6114cc1ead35777bab948e3643" + public cUSDC: Address = "0x39aa39c021dfbae8fac545936693ac917d5e7563" + public allCTokens: Address[] = [this.cDAI, this.cUSDC] } export class RopstenAccounts { // All Native Tokens - public DAI: Address = "0xb5e5d0f8c0cba267cd3d7035d6adc8eba7df7cdd"; - public USDC: Address = "0x8a9447df1fb47209d36204e6d56767a33bf20f9f"; + public DAI: Address = "0xb5e5d0f8c0cba267cd3d7035d6adc8eba7df7cdd" + public USDC: Address = "0x8a9447df1fb47209d36204e6d56767a33bf20f9f" - public TUSD: Address = "0xa2ea00df6d8594dbc76b79befe22db9043b8896f"; + public TUSD: Address = "0xa2ea00df6d8594dbc76b79befe22db9043b8896f" - public USDT: Address = "0xB404c51BBC10dcBE948077F18a4B8E553D160084"; - public allNativeTokens: Address[] = [this.DAI, this.TUSD, this.USDC, this.USDT]; + public USDT: Address = "0xB404c51BBC10dcBE948077F18a4B8E553D160084" + public allNativeTokens: Address[] = [this.DAI, this.TUSD, this.USDC, this.USDT] // AAVE - public aavePlatform: Address = "0x1c8756FD2B28e9426CDBDcC7E3c4d64fa9A54728"; - public aTUSD: Address = "0x9265d51f5abf1e23be64418827859bc83ae70a57"; - public aUSDT: Address = "0x790744bC4257B4a0519a3C5649Ac1d16DDaFAE0D"; - public allATokens: Address[] = [this.aTUSD, this.aUSDT]; + public aavePlatform: Address = "0x1c8756FD2B28e9426CDBDcC7E3c4d64fa9A54728" + public aTUSD: Address = "0x9265d51f5abf1e23be64418827859bc83ae70a57" + public aUSDT: Address = "0x790744bC4257B4a0519a3C5649Ac1d16DDaFAE0D" + public allATokens: Address[] = [this.aTUSD, this.aUSDT] // Compound cTokens - public cDAI: Address = "0x6ce27497a64fffb5517aa4aee908b1e7eb63b9ff"; - public cUSDC: Address = "0x20572e4c090f15667cf7378e16fad2ea0e2f3eff"; - public allCTokens: Address[] = [this.cDAI, this.cUSDC]; + public cDAI: Address = "0x6ce27497a64fffb5517aa4aee908b1e7eb63b9ff" + public cUSDC: Address = "0x20572e4c090f15667cf7378e16fad2ea0e2f3eff" + public allCTokens: Address[] = [this.cDAI, this.cUSDC] } export class KovanAccounts { // All Native Tokens - public DAI: Address = "0x4f96fe3b7a6cf9725f59d353f723c1bdb64ca6aa"; - public USDC: Address = "0xb7a4f3e9097c08da09517b5ab877f7a917224ede"; + public DAI: Address = "0x4f96fe3b7a6cf9725f59d353f723c1bdb64ca6aa" + public USDC: Address = "0xb7a4f3e9097c08da09517b5ab877f7a917224ede" - public TUSD: Address = "0x1c4a937d171752e1313D70fb16Ae2ea02f86303e"; - public USDT: Address = "0x13512979ade267ab5100878e2e0f485b568328a4"; - public allNativeTokens: Address[] = [this.DAI, this.TUSD, this.USDC, this.USDT]; + public TUSD: Address = "0x1c4a937d171752e1313D70fb16Ae2ea02f86303e" + public USDT: Address = "0x13512979ade267ab5100878e2e0f485b568328a4" + public allNativeTokens: Address[] = [this.DAI, this.TUSD, this.USDC, this.USDT] // AAVE - public aavePlatform: Address = "0x506B0B2CF20FAA8f38a4E2B524EE43e1f4458Cc5"; - public aTUSD: Address = "0xA79383e0d2925527ba5Ec1c1bcaA13c28EE00314"; - public aUSDT: Address = "0xA01bA9fB493b851F4Ac5093A324CB081A909C34B"; - public allATokens: Address[] = [this.aTUSD, this.aUSDT]; + public aavePlatform: Address = "0x506B0B2CF20FAA8f38a4E2B524EE43e1f4458Cc5" + public aTUSD: Address = "0xA79383e0d2925527ba5Ec1c1bcaA13c28EE00314" + public aUSDT: Address = "0xA01bA9fB493b851F4Ac5093A324CB081A909C34B" + public allATokens: Address[] = [this.aTUSD, this.aUSDT] // Compound cTokens - public cDAI: Address = "0xf0d0eb522cfa50b716b3b1604c4f0fa6f04376ad"; - public cUSDC: Address = "0x4a92e71227d294f041bd82dd8f78591b75140d63"; - public allCTokens: Address[] = [this.cDAI, this.cUSDC]; + public cDAI: Address = "0xf0d0eb522cfa50b716b3b1604c4f0fa6f04376ad" + public cUSDC: Address = "0x4a92e71227d294f041bd82dd8f78591b75140d63" + public allCTokens: Address[] = [this.cDAI, this.cUSDC] } diff --git a/test-utils/env_setup.ts b/test-utils/env_setup.ts deleted file mode 100644 index 68aa0acd..00000000 --- a/test-utils/env_setup.ts +++ /dev/null @@ -1,30 +0,0 @@ -/// -/// - -import * as chai from "chai"; -import ChaiBN from "chai-bn"; -import { BN } from "./tools"; - -/** - * @notice This file configures the environment for testing - */ -class TestEnvironmentSetup { - private isConfigured: boolean; - - constructor() { - this.isConfigured = false; - } - - public configure(): Chai.ChaiStatic { - if (this.isConfigured) { - return chai; - } - - chai.use(ChaiBN(BN)); - chai.should(); - this.isConfigured = true; - return chai; - } -} - -export default new TestEnvironmentSetup(); diff --git a/test-utils/machines/index.ts b/test-utils/machines/index.ts index a62d64cf..10d9b628 100644 --- a/test-utils/machines/index.ts +++ b/test-utils/machines/index.ts @@ -1,3 +1,2 @@ -export { SystemMachine } from "./systemMachine"; -export { MassetMachine, MassetDetails } from "./massetMachine"; -export { StandardAccounts } from "./standardAccounts"; +export { MassetMachine, MassetDetails } from "./mAssetMachine" +export { StandardAccounts, Account } from "./standardAccounts" diff --git a/test-utils/machines/mAssetMachine.ts b/test-utils/machines/mAssetMachine.ts new file mode 100644 index 00000000..d131196e --- /dev/null +++ b/test-utils/machines/mAssetMachine.ts @@ -0,0 +1,698 @@ +/* eslint-disable class-methods-use-this */ +/* eslint-disable no-nested-ternary */ + +import { Signer } from "ethers" +import { ethers } from "hardhat" +import { + InvariantValidator__factory, + MockInvariantValidator__factory, + AssetProxy__factory, + MockNexus__factory, + ExposedMasset, + ExposedMasset__factory, + Masset, + InvariantValidator, + MockERC20, + DelayedProxyAdmin, + MockInitializableToken, + MockAaveV2__factory, + MockATokenV2__factory, + MockPlatformIntegration, + MockPlatformIntegration__factory, + IPlatformIntegration, + MockInitializableToken__factory, + MockInitializableTokenWithFee__factory, + Manager, +} from "types/generated" +import { BN, minimum, simpleToExactAmount } from "@utils/math" +import { fullScale, MainnetAccounts, ratioScale, ZERO_ADDRESS, DEAD_ADDRESS } from "@utils/constants" +import { Basset } from "@utils/mstable-objects" +import { StandardAccounts } from "./standardAccounts" +import { ActionDetails, BasketComposition, BassetIntegrationDetails } from "../../types/machines" + +export interface MassetDetails { + mAsset?: ExposedMasset + forgeValidator?: InvariantValidator + bAssets?: Array + pTokens?: Array + proxyAdmin?: DelayedProxyAdmin + platform?: MockPlatformIntegration + aavePlatformAddress?: string + managerLib?: Manager +} + +export class MassetMachine { + public sa: StandardAccounts + + public ma: MainnetAccounts + + constructor() { + this.ma = new MainnetAccounts() + } + + public async initAccounts(accounts: Signer[]): Promise { + this.sa = await new StandardAccounts().initAccounts(accounts) + return this + } + + public async deployMasset(useMockValidator = false, useLendingMarkets = false, useTransferFees = false): Promise { + // 1. Bassets + const bAssets = await this.loadBassetsLocal(useLendingMarkets, useTransferFees) + + // 2. Invariant Validator + // If mocks enabled, uses mock which returns 1:1 on all actions + const forgeVal = await (useMockValidator + ? new MockInvariantValidator__factory(this.sa.default.signer).deploy() + : new InvariantValidator__factory(this.sa.default.signer).deploy(simpleToExactAmount(1, 24), simpleToExactAmount(1, 24))) + + // 3. Masset + // 3.1. Dependencies + const ManagerFactory = await ethers.getContractFactory("Manager") + const managerLib = (await ManagerFactory.deploy()) as Manager + + const nexus = await new MockNexus__factory(this.sa.default.signer).deploy( + this.sa.governor.address, + this.sa.mockSavingsManager.address, + ) + const integrationAddress = useLendingMarkets + ? ( + await new MockPlatformIntegration__factory(this.sa.default.signer).deploy( + nexus.address, + bAssets.aavePlatformAddress, + bAssets.bAssets.map((b) => b.address), + bAssets.aTokens.map((a) => a.aToken), + ) + ).address + : ZERO_ADDRESS + + // 3.2. Masset + const MassetFactory = (await ( + await ethers.getContractFactory("ExposedMasset", { + libraries: { + Manager: managerLib.address, + }, + }) + ).connect(this.sa.default.signer)) as ExposedMasset__factory + const impl = (await MassetFactory.deploy(nexus.address)) as ExposedMasset + + const data = impl.interface.encodeFunctionData("initialize", [ + "mStable BTC", + "mBTC", + forgeVal.address, + bAssets.bAssets.map((b, i) => ({ + addr: b.address, + integrator: integrationAddress, + hasTxFee: bAssets.bAssetTxFees[i], + status: 0, + })), + { + a: simpleToExactAmount(1, 2), + limits: { + min: simpleToExactAmount(5, 16), + max: simpleToExactAmount(55, 16), + }, + }, + ]) + const mAsset = await new AssetProxy__factory(this.sa.default.signer).deploy(impl.address, DEAD_ADDRESS, data) + + if (useLendingMarkets) { + await new MockPlatformIntegration__factory(this.sa.default.signer).attach(integrationAddress).addWhitelist([mAsset.address]) + } + return { + mAsset: (await MassetFactory.attach(mAsset.address)) as ExposedMasset, + bAssets: bAssets.bAssets, + pTokens: bAssets.aTokens.map((a) => a.aToken), + aavePlatformAddress: bAssets.aavePlatformAddress, + forgeValidator: forgeVal as InvariantValidator, + platform: useLendingMarkets + ? await new MockPlatformIntegration__factory(this.sa.default.signer).attach(integrationAddress) + : null, + managerLib: (await ManagerFactory.attach(mAsset.address)) as Manager, + } + } + + /** + * @dev Seeds the mAsset basket with custom weightings + * @param md Masset details object containing all deployed contracts + * @param weights Whole numbers of mAsset to mint for each given bAsset + */ + public async seedWithWeightings(md: MassetDetails, weights: Array): Promise { + const { mAsset, bAssets } = md + const approvals = await Promise.all(bAssets.map((b, i) => this.approveMasset(b, mAsset, weights[i], this.sa.default.signer))) + await mAsset.mintMulti( + bAssets.map((b) => b.address), + approvals, + 0, + this.sa.default.address, + ) + } + + // /** + // * @dev Deploys an mAsset with default parameters, modelled on original mUSD + // * @return Interface will all deployed information + // */ + // public async deployMasset(enableUSDTFee = false, useOldAave = false): Promise { + // const md: MassetDetails = {}; + + // /** ************************************* + // 0. Mock platforms and bAssets + // Dependencies: [] + // *************************************** */ + // const bassetDetails = await this.loadBassets(enableUSDTFee, useOldAave); + // md.bAssets = bassetDetails.bAssets; + + // /** ************************************* + // 2. mUSD + // Dependencies: [ + // BasketManager [ + // ProxyAdmin, + // PlatformIntegrations [ + // MockPlatforms + // ] + // ] + // ] + // *************************************** */ + + // // 2.0. Deploy ProxyAdmin + // const d_DelayedProxyAdmin: t.DelayedProxyAdminInstance = await c_DelayedProxyAdmin.new( + // this.system.nexus.address, + // { + // from: this.sa.default, + // }, + // ); + // md.proxyAdmin = d_DelayedProxyAdmin; + + // // 2.1. Deploy no Init BasketManager + // // - Deploy Implementation + // const d_BasketManager = await c_BasketManager.new(); + // // - Initialize the BasketManager implementation to avoid someone else doing it + // const d_DeadIntegration = await c_DeadIntegration.new(); + // const d_DeadErc20 = await c_MockERC20.new("DEAD", "D34", 18, DEAD_ADDRESS, 1); + // await d_BasketManager.initialize( + // DEAD_ADDRESS, + // DEAD_ADDRESS, + // [d_DeadErc20.address], + // [d_DeadIntegration.address], + // [percentToWeight(100).toString()], + // [false], + // ); + // // - Deploy Initializable Proxy + // const d_BasketManagerProxy = await c_BasketManagerProxy.new(); + + // // 2.2. Deploy no Init AaveIntegration + // // - Deploy Implementation with dummy params (this storage doesn't get used) + // const d_AaveIntegration = await (useOldAave + // ? c_AaveIntegration.new() + // : c_AaveV2Integration.new()); + // await d_AaveIntegration.initialize(DEAD_ADDRESS, [DEAD_ADDRESS], DEAD_ADDRESS, [], []); + // // - Deploy Initializable Proxy + // const d_AaveIntegrationProxy = await c_VaultProxy.new(); + + // // 2.3. Deploy no Init CompoundIntegration + // // - Deploy Implementation + // // We do not need platform address for compound + // const d_CompoundIntegration: t.CompoundIntegrationInstance = await c_CompoundIntegration.new(); + // await d_CompoundIntegration.initialize(DEAD_ADDRESS, [DEAD_ADDRESS], DEAD_ADDRESS, [], []); + // // - Deploy Initializable Proxy + // const d_CompoundIntegrationProxy = await c_VaultProxy.new(); + + // md.basketManager = await c_BasketManager.at(d_BasketManagerProxy.address); + // md.aaveIntegration = await c_AaveIntegration.at(d_AaveIntegrationProxy.address); + // md.compoundIntegration = await c_CompoundIntegration.at(d_CompoundIntegrationProxy.address); + + // // 2.4. Deploy mUSD (w/ BasketManager addr) + // // 2.4.1. Deploy ForgeValidator + // const d_ForgeValidator = await c_ForgeValidator.new({ + // from: this.sa.default, + // }); + // md.forgeValidator = d_ForgeValidator; + // // 2.4.2. Deploy mUSD + // // Deploy implementation + // const d_mUSD = await c_Masset.new(); + // await d_mUSD.initialize("", "", DEAD_ADDRESS, DEAD_ADDRESS, DEAD_ADDRESS); + // // Deploy proxy + // const d_mUSDProxy = await c_AssetProxy.new(); + // // Initialize proxy + // const initializationData_mUSD: string = d_mUSD.contract.methods + // .initialize( + // "mStable Mock", + // "mMOCK", + // this.system.nexus.address, + // d_ForgeValidator.address, + // d_BasketManagerProxy.address, + // ) + // .encodeABI(); + // await d_mUSDProxy.methods["initialize(address,address,bytes)"]( + // d_mUSD.address, + // d_DelayedProxyAdmin.address, + // initializationData_mUSD, + // ); + // md.mAsset = await c_Masset.at(d_mUSDProxy.address); + + // // 2.5. Init AaveIntegration + // const initializationData_AaveIntegration: string = d_AaveIntegration.contract.methods + // .initialize( + // this.system.nexus.address, + // [d_mUSDProxy.address, d_BasketManagerProxy.address], + // bassetDetails.aavePlatformAddress, + // bassetDetails.aTokens.map((a) => a.bAsset), + // bassetDetails.aTokens.map((a) => a.aToken), + // ) + // .encodeABI(); + // await d_AaveIntegrationProxy.methods["initialize(address,address,bytes)"]( + // d_AaveIntegration.address, + // d_DelayedProxyAdmin.address, + // initializationData_AaveIntegration, + // ); + + // // 2.6. Init CompoundIntegration + // const initializationData_CompoundIntegration: string = d_CompoundIntegration.contract.methods + // .initialize( + // this.system.nexus.address, + // [d_mUSDProxy.address, d_BasketManagerProxy.address], + // ZERO_ADDRESS, // We don't need Compound sys addr + // bassetDetails.cTokens.map((c) => c.bAsset), + // bassetDetails.cTokens.map((c) => c.cToken), + // ) + // .encodeABI(); + // await d_CompoundIntegrationProxy.methods["initialize(address,address,bytes)"]( + // d_CompoundIntegration.address, + // d_DelayedProxyAdmin.address, + // initializationData_CompoundIntegration, + // ); + + // // 2.7. Init BasketManager + // const weight = 100; + // const initializationData_BasketManager: string = d_BasketManager.contract.methods + // .initialize( + // this.system.nexus.address, + // d_mUSDProxy.address, + // bassetDetails.bAssets.map((b) => b.address), + // bassetDetails.platforms.map((p) => + // p === Platform.aave + // ? d_AaveIntegrationProxy.address + // : d_CompoundIntegrationProxy.address, + // ), + // bassetDetails.bAssets.map(() => percentToWeight(weight).toString()), + // bassetDetails.fees, + // ) + // .encodeABI(); + // await d_BasketManagerProxy.methods["initialize(address,address,bytes)"]( + // d_BasketManager.address, + // d_DelayedProxyAdmin.address, + // initializationData_BasketManager, + // ); + + // return md; + // } + + // public async loadBassets( + // enableUSDTFee = false, + // useOldAave = false, + // ): Promise { + // return this.system.isGanacheFork + // ? this.loadBassetsFork(enableUSDTFee) + // : this.loadBassetsLocal(enableUSDTFee, useOldAave); + // } + + // public async loadBassetsFork(enableUSDTFee = false): Promise { + // // load all the REAL bAssets + // const bAsset_DAI = await c_MockERC20.at(this.ma.DAI); + // await this.mintERC20(bAsset_DAI, this.ma.FUND_SOURCES.dai); + + // const bAsset_USDC = await c_MockERC20.at(this.ma.USDC); + // await this.mintERC20(bAsset_USDC, this.ma.FUND_SOURCES.usdc); + + // const bAsset_TUSD = await c_MockERC20.at(this.ma.TUSD); + // await this.mintERC20(bAsset_TUSD, this.ma.FUND_SOURCES.tusd); + + // const bAsset_USDT = await c_MockERC20.at(this.ma.USDT); + // await this.mintERC20(bAsset_USDT, this.ma.FUND_SOURCES.usdt); + + // const mockUSDT = await c_MockUSDT.at(bAsset_USDT.address); + // if (enableUSDTFee) { + // // Set fee rate to 0.1% and max fee to 30 USDT + // await mockUSDT.setParams("10", "30", { + // from: this.ma.USDT_OWNER, + // }); + // } else { + // // Set fee rate to 0.1% and max fee to 30 USDT + // await mockUSDT.setParams("0", "30", { + // from: this.ma.USDT_OWNER, + // }); + // } + // // credit sa.default with ample balances + // const bAssets = [bAsset_DAI, bAsset_USDC, bAsset_TUSD, bAsset_USDT]; + // // return all the addresses + // return { + // bAssets, + // fees: [false, false, false, enableUSDTFee], + // platforms: [Platform.compound, Platform.compound, Platform.aave, Platform.aave], + // aavePlatformAddress: this.ma.aavePlatform, + // aTokens: [ + // { + // bAsset: bAsset_TUSD.address, + // aToken: this.ma.aTUSD, + // }, + // { + // bAsset: bAsset_USDT.address, + // aToken: this.ma.aUSDT, + // }, + // ], + // cTokens: [ + // { + // bAsset: bAsset_DAI.address, + // cToken: this.ma.cDAI, + // }, + // { + // bAsset: bAsset_USDC.address, + // cToken: this.ma.cUSDC, + // }, + // ], + // }; + // } + + public async loadBassetProxy( + name: string, + sym: string, + dec: number, + recipient: string = this.sa.default.address, + init = 10000000000, + enableUSDTFee = false, + ): Promise { + // Factories + const tokenFactory = enableUSDTFee + ? await new MockInitializableTokenWithFee__factory(this.sa.default.signer) + : await new MockInitializableToken__factory(this.sa.default.signer) + const AssetProxyFactory = await ethers.getContractFactory("AssetProxy") + + // Impl + const mockInitializableToken = (await tokenFactory.deploy()) as MockInitializableToken + + // Proxy + const data = await mockInitializableToken.interface.encodeFunctionData("initialize", [name, sym, dec, recipient, init]) + const mAssetProxy = await AssetProxyFactory.deploy(mockInitializableToken.address, this.sa.governor.address, data) + const mAsset = (await ethers.getContractAt("MockERC20", mAssetProxy.address)) as MockERC20 + return mAsset + } + + public async loadBassetsLocal(useLendingMarkets = false, useTransferFees = false): Promise { + // - Mock bAssets + const mockBasset1 = await this.loadBassetProxy("Ren BTC", "renBTC", 18) + const mockBasset2 = await this.loadBassetProxy("Synthetix BTC", "sBTC", 6) + const mockBasset3 = await this.loadBassetProxy("Wrapped BTC", "wBTC", 12, this.sa.default.address, 10000000000, useTransferFees) + const mockBasset4 = await this.loadBassetProxy( + "Binance Wrapped BTC", + "bBTC", + 18, + this.sa.default.address, + 10000000000, + useTransferFees, + ) + const bAssets = [mockBasset1, mockBasset2, mockBasset3, mockBasset4] + // bAssets at index 2 and 3 only have transfer fees if useTransferFees is true + const bAssetTxFees = bAssets.map((_, i) => useTransferFees && (i === 2 || i === 3)) + + // - Mock Aave integration + const mockAave = await new MockAaveV2__factory(this.sa.default.signer).deploy() + + // - Mock aTokens + const aTokenFactory = new MockATokenV2__factory(this.sa.default.signer) + await Promise.all(bAssets.map(async (b) => b.transfer(mockAave.address, (await b.totalSupply()).div(1000)))) + const mockAToken1 = await aTokenFactory.deploy(mockAave.address, mockBasset1.address) + const mockAToken2 = await aTokenFactory.deploy(mockAave.address, mockBasset2.address) + const mockAToken3 = await aTokenFactory.deploy(mockAave.address, mockBasset3.address) + const mockAToken4 = await aTokenFactory.deploy(mockAave.address, mockBasset4.address) + + // - Add to the Platform + await mockAave.addAToken(mockAToken1.address, mockBasset1.address) + await mockAave.addAToken(mockAToken2.address, mockBasset2.address) + await mockAave.addAToken(mockAToken3.address, mockBasset3.address) + await mockAave.addAToken(mockAToken4.address, mockBasset4.address) + + return { + bAssets, + bAssetTxFees, + aavePlatformAddress: mockAave.address, + aTokens: [ + { + bAsset: mockBasset1.address, + aToken: mockAToken1.address, + }, + { + bAsset: mockBasset2.address, + aToken: mockAToken2.address, + }, + { + bAsset: mockBasset3.address, + aToken: mockAToken3.address, + }, + { + bAsset: mockBasset4.address, + aToken: mockAToken4.address, + }, + ], + } + } + + // public async mintERC20( + // erc20: t.MockERC20Instance, + // source: Address, + // recipient: string = this.sa.default, + // ): Promise> { + // const decimals = await erc20.decimals(); + // return erc20.transfer(recipient, simpleToExactAmount(1000, decimals), { + // from: source, + // }); + // } + + // /** + // * @dev Deploy a Masset via the Manager then: + // * 1. Mint with optimal weightings + // */ + // public async deployMassetAndSeedBasket( + // enableUSDTFee = false, + // initialSupply = 100, + // ): Promise { + // const mAssetDetails = await this.deployMasset(enableUSDTFee); + + // // Mint initialSupply with shared weightings + // const basketDetails = await this.getBassetsInMasset(mAssetDetails); + + // // Calc optimal weightings + // const totalWeighting = basketDetails.reduce((p, c) => { + // return p.add(new BN(c.maxWeight)); + // }, new BN(0)); + // const totalMintAmount = simpleToExactAmount(initialSupply, 18); + // const mintAmounts = await Promise.all( + // basketDetails.map(async (b) => { + // // e.g. 5e35 / 2e18 = 2.5e17 + // const relativeWeighting = new BN(b.maxWeight).mul(fullScale).div(totalWeighting); + // // e.g. 1e20 * 25e16 / 1e18 = 25e18 + // const mintAmount = totalMintAmount.mul(relativeWeighting).div(fullScale); + // // const bAssetDecimals: BN = await b.decimals(); + // // const decimalDelta = new BN(18).sub(bAssetDecimals); + // return mintAmount.mul(ratioScale).div(new BN(b.ratio)); + // }), + // ); + + // // Approve bAssets + // await Promise.all( + // mAssetDetails.bAssets.map((b, i) => + // b.approve(mAssetDetails.mAsset.address, mintAmounts[i].muln(2), { + // from: this.system.sa.default, + // }), + // ), + // ); + + // await mAssetDetails.mAsset.mintMulti( + // basketDetails.map((b) => b.addr), + // mintAmounts, + // this.system.sa.default, + // { from: this.system.sa.default }, + // ); + // await mAssetDetails.mAsset.mintMulti( + // basketDetails.map((b) => b.addr), + // mintAmounts, + // this.system.sa.default, + // { from: this.system.sa.default }, + // ); + + // return mAssetDetails; + // } + + public async getBassetsInMasset(mAssetDetails: MassetDetails): Promise { + const [personal, data] = await mAssetDetails.mAsset.getBassets() + const bArrays: Array = personal.map((b, i) => { + const d = data[i] + return { + addr: b.addr, + status: b.status, + isTransferFeeCharged: b.hasTxFee, + ratio: BN.from(d.ratio), + vaultBalance: BN.from(d.vaultBalance), + integratorAddr: b.integrator, + } + }) + const bAssetContracts: MockERC20[] = await Promise.all( + bArrays.map((b) => ethers.getContractAt("MockERC20", b.addr, this.sa.default.signer) as Promise), + ) + const integrators = (await Promise.all( + bArrays.map((b) => + b.integratorAddr === ZERO_ADDRESS + ? null + : ethers.getContractAt("MockPlatformIntegration", b.integratorAddr, this.sa.default.signer), + ), + )) as Array + return bArrays.map((b, i) => ({ + ...b, + contract: bAssetContracts[i], + integrator: integrators[i], + })) + } + + public async getBasset(mAssetDetails: MassetDetails, bAssetAddress: string): Promise { + const bAsset = await mAssetDetails.mAsset.getBasset(bAssetAddress) + const bAssetContract = (await ethers.getContractAt("MockERC20", bAsset.personal.addr, this.sa.default.signer)) as MockERC20 + const integrator = + bAsset.personal.integrator === ZERO_ADDRESS + ? null + : (((await new MockPlatformIntegration__factory(this.sa.default.signer).attach( + bAsset.personal.integrator, + )) as unknown) as IPlatformIntegration) + return { + addr: bAsset.personal.addr, + status: bAsset.personal.status, + isTransferFeeCharged: bAsset.personal.hasTxFee, + ratio: BN.from(bAsset.data.ratio), + vaultBalance: BN.from(bAsset.data.vaultBalance), + integratorAddr: bAsset.personal.integrator, + contract: bAssetContract, + pToken: integrator ? await integrator.callStatic["bAssetToPToken(address)"](bAsset.personal.addr) : null, + integrator, + } + } + + public async getBasketComposition(mAssetDetails: MassetDetails): Promise { + // raw bAsset data + const bAssets = await this.getBassetsInMasset(mAssetDetails) + + const [failed, undergoingRecol] = await mAssetDetails.mAsset.getBasket() + // total supply of mAsset + const supply = await mAssetDetails.mAsset.totalSupply() + const surplus = await mAssetDetails.mAsset.surplus() + // get actual balance of each bAsset + const rawBalances = await Promise.all( + bAssets.map((b) => + b.integrator ? b.contract.balanceOf(b.integrator.address) : b.contract.balanceOf(mAssetDetails.mAsset.address), + ), + ) + const platformBalances = await Promise.all( + bAssets.map((b) => (b.integrator ? b.integrator.callStatic.checkBalance(b.addr) : BN.from(0))), + ) + + const balances = rawBalances.map((b, i) => b.add(platformBalances[i])) + // get overweight + const currentVaultUnits = bAssets.map((b) => BN.from(b.vaultBalance).mul(BN.from(b.ratio)).div(ratioScale)) + // get total amount + const sumOfBassets = currentVaultUnits.reduce((p, c) => p.add(c), BN.from(0)) + return { + bAssets: bAssets.map((b, i) => ({ + ...b, + address: b.addr, + mAssetUnits: currentVaultUnits[i], + actualBalance: balances[i], + rawBalance: rawBalances[i], + platformBalance: platformBalances[i], + })), + totalSupply: supply, + surplus, + sumOfBassets, + failed, + undergoingRecol, + } + } + + /** + * @dev Takes a whole unit approval amount, and converts it to the equivalent + * base asset amount, before approving and returning the exact approval + * @param bAsset Asset to approve spending of + * @param mAsset Masset that gets permission to spend + * @param fullMassetUnits Whole number or fraction to approve + * @param sender Set if needed, else fall back to default + * @param inputIsBaseUnits Override the scaling up to MassetQ + */ + public async approveMasset( + bAsset: MockERC20, + mAsset: Masset | ExposedMasset, + fullMassetUnits: number | BN | string, + sender: Signer = this.sa.default.signer, + inputIsBaseUnits = false, + ): Promise { + const bAssetDecimals = await bAsset.decimals() + const approvalAmount: BN = inputIsBaseUnits ? BN.from(fullMassetUnits) : simpleToExactAmount(fullMassetUnits, bAssetDecimals) + await bAsset.connect(sender).approve(mAsset.address, approvalAmount) + return approvalAmount + } + + public async approveMassetMulti( + bAssets: Array, + mAsset: Masset | ExposedMasset, + fullMassetUnits: number, + sender: Signer, + ): Promise> { + const result = Promise.all(bAssets.map((b) => this.approveMasset(b, mAsset, fullMassetUnits, sender))) + return result + } + + public async getPlatformInteraction( + mAsset: Masset | ExposedMasset, + type: "deposit" | "withdrawal", + amount: BN, + bAsset: Basset, + ): Promise { + const hasIntegrator = bAsset.integratorAddr === ZERO_ADDRESS + const integratorBalBefore = await bAsset.contract.balanceOf(bAsset.integrator ? bAsset.integratorAddr : mAsset.address) + if (hasIntegrator) { + return { + hasLendingMarket: false, + expectInteraction: false, + rawBalance: type === "deposit" ? integratorBalBefore.add(amount) : integratorBalBefore.sub(amount), + } + } + const hasTxFee = bAsset.isTransferFeeCharged + if (hasTxFee) { + return { + hasLendingMarket: true, + expectInteraction: true, + amount, + rawBalance: BN.from(0), + } + } + const totalSupply = await mAsset.totalSupply() + const surplus = await mAsset.surplus() + const cacheSize = await mAsset.cacheSize() + const maxC = totalSupply.add(surplus).mul(ratioScale).div(BN.from(bAsset.ratio)).mul(cacheSize).div(fullScale) + const newSum = BN.from(integratorBalBefore).add(amount) + const expectInteraction = type === "deposit" ? newSum.gte(maxC) : amount.gt(BN.from(integratorBalBefore)) + return { + hasLendingMarket: true, + expectInteraction, + amount: + type === "deposit" + ? newSum.sub(maxC.div(2)) + : minimum( + maxC.div(2).add(amount).sub(BN.from(integratorBalBefore)), + BN.from(bAsset.vaultBalance).sub(BN.from(integratorBalBefore)), + ), + rawBalance: + type === "deposit" + ? expectInteraction + ? maxC.div(2) + : newSum + : expectInteraction + ? minimum(maxC.div(2), BN.from(bAsset.vaultBalance).sub(amount)) + : BN.from(integratorBalBefore).sub(amount), + } + } +} diff --git a/test-utils/machines/massetMachine.ts b/test-utils/machines/massetMachine.ts deleted file mode 100644 index b89a5777..00000000 --- a/test-utils/machines/massetMachine.ts +++ /dev/null @@ -1,636 +0,0 @@ -/* eslint-disable @typescript-eslint/camelcase */ -/* eslint-disable class-methods-use-this */ -/* eslint-disable no-nested-ternary */ - -import * as t from "types/generated"; -import { simpleToExactAmount, percentToWeight } from "@utils/math"; -import { BN } from "@utils/tools"; -import { - fullScale, - MainnetAccounts, - ratioScale, - ZERO_ADDRESS, - DEAD_ADDRESS, -} from "@utils/constants"; -import { Basset } from "@utils/mstable-objects"; -import { SystemMachine, StandardAccounts } from "."; -import { Address } from "../../types/common"; -import { - BassetIntegrationDetails, - Platform, - BasketComposition, - ActionDetails, -} from "../../types/machines"; - -// ForgeValidator -const c_ForgeValidator = artifacts.require("ForgeValidator"); - -// Proxy -const c_DelayedProxyAdmin = artifacts.require("DelayedProxyAdmin"); -const c_MassetProxy = artifacts.require("MassetProxy"); -const c_BasketManagerProxy = artifacts.require("BasketManagerProxy"); -const c_DeadIntegration = artifacts.require("DeadIntegration"); -const c_VaultProxy = artifacts.require("VaultProxy"); - -// Integrations -const c_AaveIntegration = artifacts.require("AaveIntegration"); -const c_AaveV2Integration = artifacts.require("AaveV2Integration"); -const c_MockAaveV1 = artifacts.require("MockAaveV1"); -const c_MockAaveV2 = artifacts.require("MockAaveV2"); -const c_MockAToken = artifacts.require("MockAToken"); -const c_MockATokenV2 = artifacts.require("MockATokenV2"); -const c_CompoundIntegration = artifacts.require("CompoundIntegration"); -const c_MockCToken = artifacts.require("MockCToken"); - -// Basket -const c_BasketManager = artifacts.require("MockBasketManager"); - -// Masset -const c_Masset = artifacts.require("Masset"); -const c_MockERC20 = artifacts.require("MockERC20"); -const c_MockInitializableToken = artifacts.require("MockInitializableToken"); -const c_MockInitializableTokenWithFee = artifacts.require("MockInitializableTokenWithFee"); -const c_MockUSDT = artifacts.require("MockUSDT"); -const c_PlatformIntegration = artifacts.require("IPlatformIntegration"); - -export interface MassetDetails { - mAsset?: t.MassetInstance; - forgeValidator?: t.ForgeValidatorInstance; - basketManager?: t.MockBasketManagerInstance; - bAssets?: Array; - proxyAdmin?: t.DelayedProxyAdminInstance; - aaveIntegration?: t.AaveIntegrationInstance; - compoundIntegration?: t.CompoundIntegrationInstance; -} - -export class MassetMachine { - public system: SystemMachine; - - public sa: StandardAccounts; - - public ma: MainnetAccounts; - - constructor(systemMachine: SystemMachine) { - this.system = systemMachine; - this.ma = new MainnetAccounts(); - this.sa = this.system.sa; - } - - /** - * @dev Deploys an mAsset with default parameters, modelled on original mUSD - * @return Interface will all deployed information - */ - public async deployMasset(enableUSDTFee = false, useOldAave = false): Promise { - const md: MassetDetails = {}; - - /** ************************************* - 0. Mock platforms and bAssets - Dependencies: [] - *************************************** */ - const bassetDetails = await this.loadBassets(enableUSDTFee, useOldAave); - md.bAssets = bassetDetails.bAssets; - - /** ************************************* - 2. mUSD - Dependencies: [ - BasketManager [ - ProxyAdmin, - PlatformIntegrations [ - MockPlatforms - ] - ] - ] - *************************************** */ - - // 2.0. Deploy ProxyAdmin - const d_DelayedProxyAdmin: t.DelayedProxyAdminInstance = await c_DelayedProxyAdmin.new( - this.system.nexus.address, - { - from: this.sa.default, - }, - ); - md.proxyAdmin = d_DelayedProxyAdmin; - - // 2.1. Deploy no Init BasketManager - // - Deploy Implementation - const d_BasketManager = await c_BasketManager.new(); - // - Initialize the BasketManager implementation to avoid someone else doing it - const d_DeadIntegration = await c_DeadIntegration.new(); - const d_DeadErc20 = await c_MockERC20.new("DEAD", "D34", 18, DEAD_ADDRESS, 1); - await d_BasketManager.initialize( - DEAD_ADDRESS, - DEAD_ADDRESS, - [d_DeadErc20.address], - [d_DeadIntegration.address], - [percentToWeight(100).toString()], - [false], - ); - // - Deploy Initializable Proxy - const d_BasketManagerProxy = await c_BasketManagerProxy.new(); - - // 2.2. Deploy no Init AaveIntegration - // - Deploy Implementation with dummy params (this storage doesn't get used) - const d_AaveIntegration = await (useOldAave - ? c_AaveIntegration.new() - : c_AaveV2Integration.new()); - await d_AaveIntegration.initialize(DEAD_ADDRESS, [DEAD_ADDRESS], DEAD_ADDRESS, [], []); - // - Deploy Initializable Proxy - const d_AaveIntegrationProxy = await c_VaultProxy.new(); - - // 2.3. Deploy no Init CompoundIntegration - // - Deploy Implementation - // We do not need platform address for compound - const d_CompoundIntegration: t.CompoundIntegrationInstance = await c_CompoundIntegration.new(); - await d_CompoundIntegration.initialize(DEAD_ADDRESS, [DEAD_ADDRESS], DEAD_ADDRESS, [], []); - // - Deploy Initializable Proxy - const d_CompoundIntegrationProxy = await c_VaultProxy.new(); - - md.basketManager = await c_BasketManager.at(d_BasketManagerProxy.address); - md.aaveIntegration = await c_AaveIntegration.at(d_AaveIntegrationProxy.address); - md.compoundIntegration = await c_CompoundIntegration.at(d_CompoundIntegrationProxy.address); - - // 2.4. Deploy mUSD (w/ BasketManager addr) - // 2.4.1. Deploy ForgeValidator - const d_ForgeValidator = await c_ForgeValidator.new({ - from: this.sa.default, - }); - md.forgeValidator = d_ForgeValidator; - // 2.4.2. Deploy mUSD - // Deploy implementation - const d_mUSD = await c_Masset.new(); - await d_mUSD.initialize("", "", DEAD_ADDRESS, DEAD_ADDRESS, DEAD_ADDRESS); - // Deploy proxy - const d_mUSDProxy = await c_MassetProxy.new(); - // Initialize proxy - const initializationData_mUSD: string = d_mUSD.contract.methods - .initialize( - "mStable Mock", - "mMOCK", - this.system.nexus.address, - d_ForgeValidator.address, - d_BasketManagerProxy.address, - ) - .encodeABI(); - await d_mUSDProxy.methods["initialize(address,address,bytes)"]( - d_mUSD.address, - d_DelayedProxyAdmin.address, - initializationData_mUSD, - ); - md.mAsset = await c_Masset.at(d_mUSDProxy.address); - - // 2.5. Init AaveIntegration - const initializationData_AaveIntegration: string = d_AaveIntegration.contract.methods - .initialize( - this.system.nexus.address, - [d_mUSDProxy.address, d_BasketManagerProxy.address], - bassetDetails.aavePlatformAddress, - bassetDetails.aTokens.map((a) => a.bAsset), - bassetDetails.aTokens.map((a) => a.aToken), - ) - .encodeABI(); - await d_AaveIntegrationProxy.methods["initialize(address,address,bytes)"]( - d_AaveIntegration.address, - d_DelayedProxyAdmin.address, - initializationData_AaveIntegration, - ); - - // 2.6. Init CompoundIntegration - const initializationData_CompoundIntegration: string = d_CompoundIntegration.contract.methods - .initialize( - this.system.nexus.address, - [d_mUSDProxy.address, d_BasketManagerProxy.address], - ZERO_ADDRESS, // We don't need Compound sys addr - bassetDetails.cTokens.map((c) => c.bAsset), - bassetDetails.cTokens.map((c) => c.cToken), - ) - .encodeABI(); - await d_CompoundIntegrationProxy.methods["initialize(address,address,bytes)"]( - d_CompoundIntegration.address, - d_DelayedProxyAdmin.address, - initializationData_CompoundIntegration, - ); - - // 2.7. Init BasketManager - const weight = 100; - const initializationData_BasketManager: string = d_BasketManager.contract.methods - .initialize( - this.system.nexus.address, - d_mUSDProxy.address, - bassetDetails.bAssets.map((b) => b.address), - bassetDetails.platforms.map((p) => - p === Platform.aave - ? d_AaveIntegrationProxy.address - : d_CompoundIntegrationProxy.address, - ), - bassetDetails.bAssets.map(() => percentToWeight(weight).toString()), - bassetDetails.fees, - ) - .encodeABI(); - await d_BasketManagerProxy.methods["initialize(address,address,bytes)"]( - d_BasketManager.address, - d_DelayedProxyAdmin.address, - initializationData_BasketManager, - ); - - return md; - } - - public async loadBassets( - enableUSDTFee = false, - useOldAave = false, - ): Promise { - return this.system.isGanacheFork - ? this.loadBassetsFork(enableUSDTFee) - : this.loadBassetsLocal(enableUSDTFee, useOldAave); - } - - public async loadBassetsFork(enableUSDTFee = false): Promise { - // load all the REAL bAssets - const bAsset_DAI = await c_MockERC20.at(this.ma.DAI); - await this.mintERC20(bAsset_DAI, this.ma.FUND_SOURCES.dai); - - const bAsset_USDC = await c_MockERC20.at(this.ma.USDC); - await this.mintERC20(bAsset_USDC, this.ma.FUND_SOURCES.usdc); - - const bAsset_TUSD = await c_MockERC20.at(this.ma.TUSD); - await this.mintERC20(bAsset_TUSD, this.ma.FUND_SOURCES.tusd); - - const bAsset_USDT = await c_MockERC20.at(this.ma.USDT); - await this.mintERC20(bAsset_USDT, this.ma.FUND_SOURCES.usdt); - - const mockUSDT = await c_MockUSDT.at(bAsset_USDT.address); - if (enableUSDTFee) { - // Set fee rate to 0.1% and max fee to 30 USDT - await mockUSDT.setParams("10", "30", { - from: this.ma.USDT_OWNER, - }); - } else { - // Set fee rate to 0.1% and max fee to 30 USDT - await mockUSDT.setParams("0", "30", { - from: this.ma.USDT_OWNER, - }); - } - // credit sa.default with ample balances - const bAssets = [bAsset_DAI, bAsset_USDC, bAsset_TUSD, bAsset_USDT]; - // return all the addresses - return { - bAssets, - fees: [false, false, false, enableUSDTFee], - platforms: [Platform.compound, Platform.compound, Platform.aave, Platform.aave], - aavePlatformAddress: this.ma.aavePlatform, - aTokens: [ - { - bAsset: bAsset_TUSD.address, - aToken: this.ma.aTUSD, - }, - { - bAsset: bAsset_USDT.address, - aToken: this.ma.aUSDT, - }, - ], - cTokens: [ - { - bAsset: bAsset_DAI.address, - cToken: this.ma.cDAI, - }, - { - bAsset: bAsset_USDC.address, - cToken: this.ma.cUSDC, - }, - ], - }; - } - - private async loadBassetProxy( - name: string, - sym: string, - dec: number, - recipient = this.sa.default, - init = 100000000, - enableUSDTFee = false, - ): Promise { - const x = await c_MassetProxy.new(); - const y = enableUSDTFee - ? await c_MockInitializableTokenWithFee.new() - : await c_MockInitializableToken.new(); - const data = y.contract.methods.initialize(name, sym, dec, recipient, init).encodeABI(); - await x.methods["initialize(address,address,bytes)"](y.address, this.sa.governor, data); - return (await c_MockERC20.at(x.address)) as t.MockERC20Instance; - } - - public async loadBassetsLocal( - enableUSDTFee = false, - useOldAave = false, - ): Promise { - // - Mock bAssets - - const mockBasset1 = await this.loadBassetProxy("Mock1", "MK1", 12); - const mockBasset2 = await this.loadBassetProxy( - "Mock5", - "MK5", - 6, - this.sa.default, - 100000000, - enableUSDTFee, - ); - - const mockBasset3 = await this.loadBassetProxy("Mock3", "MK3", 18); - const mockBasset4 = await this.loadBassetProxy( - "Mock4", - "MK4", - 18, - this.sa.default, - 100000000, - enableUSDTFee, - ); - - // Mock C Token - const mockCToken1 = await c_MockCToken.new(mockBasset1.address); - const mockCToken2 = await c_MockCToken.new(mockBasset2.address); - - // - Mock Aave integration - const aaveVersion = useOldAave ? c_MockAaveV1 : c_MockAaveV2; - const d_MockAave = await aaveVersion.new({ from: this.sa.default }); - - // - Mock aTokens - const aToken = useOldAave ? c_MockAToken : c_MockATokenV2; - const mockAToken3 = await aToken.new(d_MockAave.address, mockBasset3.address); - const mockAToken4 = await aToken.new(d_MockAave.address, mockBasset4.address); - - // - Add to the Platform - await d_MockAave.addAToken(mockAToken3.address, mockBasset3.address); - await d_MockAave.addAToken(mockAToken4.address, mockBasset4.address); - - return { - // DAI, USDC, TUSDT(aave), USDT(compound) - bAssets: [mockBasset1, mockBasset2, mockBasset3, mockBasset4], - fees: [false, enableUSDTFee, false, enableUSDTFee], - platforms: [Platform.compound, Platform.compound, Platform.aave, Platform.aave], - aavePlatformAddress: d_MockAave.address, - aTokens: [ - { - bAsset: mockBasset3.address, - aToken: mockAToken3.address, - }, - { - bAsset: mockBasset4.address, - aToken: mockAToken4.address, - }, - ], - cTokens: [ - { - bAsset: mockBasset1.address, - cToken: mockCToken1.address, - }, - { - bAsset: mockBasset2.address, - cToken: mockCToken2.address, - }, - ], - }; - } - - public async mintERC20( - erc20: t.MockERC20Instance, - source: Address, - recipient: string = this.sa.default, - ): Promise> { - const decimals = await erc20.decimals(); - return erc20.transfer(recipient, simpleToExactAmount(1000, decimals), { - from: source, - }); - } - - /** - * @dev Deploy a Masset via the Manager then: - * 1. Mint with optimal weightings - */ - public async deployMassetAndSeedBasket( - enableUSDTFee = false, - initialSupply = 100, - ): Promise { - const massetDetails = await this.deployMasset(enableUSDTFee); - - // Mint initialSupply with shared weightings - const basketDetails = await this.getBassetsInMasset(massetDetails); - - // Calc optimal weightings - const totalWeighting = basketDetails.reduce((p, c) => { - return p.add(new BN(c.maxWeight)); - }, new BN(0)); - const totalMintAmount = simpleToExactAmount(initialSupply, 18); - const mintAmounts = await Promise.all( - basketDetails.map(async (b) => { - // e.g. 5e35 / 2e18 = 2.5e17 - const relativeWeighting = new BN(b.maxWeight).mul(fullScale).div(totalWeighting); - // e.g. 1e20 * 25e16 / 1e18 = 25e18 - const mintAmount = totalMintAmount.mul(relativeWeighting).div(fullScale); - // const bAssetDecimals: BN = await b.decimals(); - // const decimalDelta = new BN(18).sub(bAssetDecimals); - return mintAmount.mul(ratioScale).div(new BN(b.ratio)); - }), - ); - - // Approve bAssets - await Promise.all( - massetDetails.bAssets.map((b, i) => - b.approve(massetDetails.mAsset.address, mintAmounts[i].muln(2), { - from: this.system.sa.default, - }), - ), - ); - - await massetDetails.mAsset.mintMulti( - basketDetails.map((b) => b.addr), - mintAmounts, - this.system.sa.default, - { from: this.system.sa.default }, - ); - await massetDetails.mAsset.mintMulti( - basketDetails.map((b) => b.addr), - mintAmounts, - this.system.sa.default, - { from: this.system.sa.default }, - ); - - return massetDetails; - } - - public async getBassetsInMasset(massetDetails: MassetDetails): Promise { - const response = await massetDetails.basketManager.getBassets(); - const bArrays: Array = response[0].map((b) => { - return { - addr: b.addr, - status: b.status, - isTransferFeeCharged: b.isTransferFeeCharged, - ratio: new BN(b.ratio), - maxWeight: new BN(b.maxWeight), - vaultBalance: new BN(b.vaultBalance), - }; - }); - const bAssetContracts = await Promise.all(bArrays.map((b) => c_MockERC20.at(b.addr))); - const integratorAddresses = await Promise.all( - bArrays.map((b, i) => massetDetails.basketManager.integrations(i)), - ); - const integrators = await Promise.all( - integratorAddresses.map((i) => c_PlatformIntegration.at(i)), - ); - return bArrays.map((b, i) => { - return { - ...b, - contract: bAssetContracts[i], - integrator: integrators[i], - }; - }); - } - - public async getBasketComposition(massetDetails: MassetDetails): Promise { - // raw bAsset data - const bAssets = await this.getBassetsInMasset(massetDetails); - const basket = await massetDetails.basketManager.getBasket(); - // total supply of mAsset - const supply = await massetDetails.mAsset.totalSupply(); - const surplus = await massetDetails.mAsset.surplus(); - const totalSupply = supply.add(surplus); - // get weights (relative to totalSupply) - // apply ratios, then find proportion of totalSupply all in BN - const maxWeightInUnits = bAssets.map((b) => - totalSupply.mul(new BN(b.maxWeight)).div(fullScale), - ); - // get actual balance of each bAsset - const rawBalances = await Promise.all( - bAssets.map((b) => b.contract.balanceOf(b.integrator.address)), - ); - const platformBalances = await Promise.all( - bAssets.map((b) => b.integrator.checkBalance.call(b.addr)), - ); - const balances = rawBalances.map((b, i) => b.add(platformBalances[i])); - // get overweight - const currentVaultUnits = bAssets.map((b) => - new BN(b.vaultBalance).mul(new BN(b.ratio)).div(ratioScale), - ); - const overweightBassets = bAssets.map( - (b, i) => totalSupply.gt(new BN(0)) && currentVaultUnits[i].gt(maxWeightInUnits[i]), - ); - // get total amount - const sumOfBassets = currentVaultUnits.reduce((p, c, i) => p.add(c), new BN(0)); - return { - bAssets: bAssets.map((b, i) => { - return { - ...b, - address: b.addr, - mAssetUnits: currentVaultUnits[i], - overweight: overweightBassets[i], - actualBalance: balances[i], - rawBalance: rawBalances[i], - platformBalance: platformBalances[i], - }; - }), - totalSupply: supply, - surplus, - sumOfBassets, - failed: basket.failed, - undergoingRecol: basket.undergoingRecol, - colRatio: basket.collateralisationRatio, - }; - } - - /** - * @dev Takes a whole unit approval amount, and converts it to the equivalent - * base asset amount, before approving and returning the exact approval - * @param bAsset Asset to approve spending of - * @param mAsset Masset that gets permission to spend - * @param fullMassetUnits Whole number or fraction to approve - * @param sender Set if needed, else fall back to default - * @param inputIsBaseUnits Override the scaling up to MassetQ - */ - public async approveMasset( - bAsset: t.MockERC20Instance, - mAsset: t.MassetInstance, - fullMassetUnits: number | BN | string, - sender: string = this.sa.default, - inputIsBaseUnits = false, - ): Promise { - const bAssetDecimals: BN = await bAsset.decimals(); - // let decimalDifference: BN = bAssetDecimals.sub(new BN(18)); - const approvalAmount: BN = inputIsBaseUnits - ? new BN(fullMassetUnits) - : simpleToExactAmount(fullMassetUnits, bAssetDecimals.toNumber()); - await bAsset.approve(mAsset.address, approvalAmount, { from: sender }); - return approvalAmount; - } - - public async getBasset(bm: t.MockBasketManagerInstance, addr: string): Promise { - const bAsset = await bm.getBasset(addr); - const bAssetContract = await c_MockERC20.at(addr); - const integratorAddresses = await bm.getBassetIntegrator(addr); - const integrator = await c_PlatformIntegration.at(integratorAddresses); - return { - ...bAsset, - contract: bAssetContract, - integrator, - }; - } - - public async approveMassetMulti( - bAssets: Array, - mAsset: t.MassetInstance, - fullMassetUnits: number, - sender: string, - ): Promise> { - const result = Promise.all( - bAssets.map((b) => this.approveMasset(b, mAsset, fullMassetUnits, sender)), - ); - return result; - } - - public async getPlatformInteraction( - mAsset: t.MassetInstance, - type: "deposit" | "withdrawal", - amount: BN, - integratorBalBefore: number | BN, - bAsset: Basset, - ): Promise { - const hasTxFee = bAsset.isTransferFeeCharged; - if (hasTxFee) { - return { - expectInteraction: true, - amount, - rawBalance: new BN(0), - }; - } - const totalSupply = await mAsset.totalSupply(); - const surplus = await mAsset.surplus(); - const cacheSize = await mAsset.cacheSize(); - const maxC = totalSupply - .add(surplus) - .mul(ratioScale) - .div(new BN(bAsset.ratio)) - .mul(cacheSize) - .div(fullScale); - const newSum = new BN(integratorBalBefore).add(amount); - const expectInteraction = - type === "deposit" ? newSum.gte(maxC as any) : amount.gt(new BN(integratorBalBefore)); - return { - expectInteraction, - amount: - type === "deposit" - ? newSum.sub(maxC.divn(2)) - : BN.min( - maxC - .divn(2) - .add(amount) - .sub(new BN(integratorBalBefore)), - new BN(bAsset.vaultBalance).sub(new BN(integratorBalBefore)), - ), - rawBalance: - type === "deposit" - ? expectInteraction - ? maxC.divn(2) - : newSum - : expectInteraction - ? BN.min(maxC.divn(2), new BN(bAsset.vaultBalance).sub(amount)) - : new BN(integratorBalBefore).sub(amount), - }; - } -} diff --git a/test-utils/machines/standardAccounts.ts b/test-utils/machines/standardAccounts.ts index ec6930f7..acd00e64 100644 --- a/test-utils/machines/standardAccounts.ts +++ b/test-utils/machines/standardAccounts.ts @@ -1,4 +1,9 @@ -import { Address } from "../../types/common"; +import { Signer } from "ethers" + +export interface Account { + signer: Signer + address: string +} /** * @dev Standard accounts @@ -7,30 +12,36 @@ export class StandardAccounts { /** * @dev Default accounts as per system Migrations */ - public all: Address[]; + public all: Account[] - public default: Address; + public default: Account - public governor: Address; + public governor: Account - public other: Address; + public other: Account - public dummy1: Address; + public dummy1: Account - public dummy2: Address; + public dummy2: Account - public dummy3: Address; + public dummy3: Account - public dummy4: Address; + public dummy4: Account - public fundManager: Address; + public fundManager: Account - public fundManager2: Address; + public fundManager2: Account - constructor(accounts: Address[]) { - this.all = accounts; + public mockSavingsManager: Account - [ + public async initAccounts(signers: Signer[]): Promise { + this.all = await Promise.all( + signers.map(async (s) => ({ + signer: s, + address: await s.getAddress(), + })), + ) + ;[ this.default, this.governor, this.other, @@ -40,8 +51,10 @@ export class StandardAccounts { this.dummy4, this.fundManager, this.fundManager2, - ] = accounts; + this.mockSavingsManager, + ] = this.all + return this } } -export default StandardAccounts; +export default StandardAccounts diff --git a/test-utils/machines/systemMachine.ts b/test-utils/machines/systemMachine.ts deleted file mode 100644 index 36396a58..00000000 --- a/test-utils/machines/systemMachine.ts +++ /dev/null @@ -1,126 +0,0 @@ -/* eslint-disable class-methods-use-this */ -/* eslint-disable @typescript-eslint/camelcase */ - -import { MassetMachine, MassetDetails } from "@utils/machines"; -import * as t from "types/generated"; - -import { MainnetAccounts } from "@utils/constants"; -import { StandardAccounts } from "./standardAccounts"; -import { Address } from "../../types"; - -// Nexus -const c_Nexus = artifacts.require("Nexus"); - -// Savings -const c_SavingsContract = artifacts.require("SavingsContract"); -const c_SavingsManager = artifacts.require("SavingsManager"); - -/** - * @dev The SystemMachine is responsible for creating mock versions of our contracts - * Since we will need to generate usable, customisable contracts throughout our test - * framework, this will act as a Machine to generate these various mocks - */ -export class SystemMachine { - /** @dev Default accounts as per system Migrations */ - public sa: StandardAccounts; - - public massetMachine: MassetMachine; - - public isGanacheFork = false; - - public nexus: t.NexusInstance; - - public mUSD: MassetDetails; - - public savingsContract: t.SavingsContractInstance; - - public savingsManager: t.SavingsManagerInstance; - - public delayedProxyAdmin: t.DelayedProxyAdminInstance; - - constructor(accounts: Address[]) { - this.sa = new StandardAccounts(accounts); - this.massetMachine = new MassetMachine(this); - if (process.env.NETWORK === "fork") { - this.isGanacheFork = true; - this.isRunningValidFork().then((valid: boolean) => { - if (!valid) { - throw Error("Must run on a valid fork"); - } - }); - } - /* ************************************** - Deploy Nexus at minimum, to allow MassetMachine access - *************************************** */ - this.deployNexus().then((nexus: t.NexusInstance) => { - this.nexus = nexus; - }); - } - - /** - * @dev Initialises the system to replicate current migration scripts - */ - public async initialiseMocks( - seedMasset = false, - dummySavingsManager = false, - enableUSDTFee = false, - ): Promise { - /* ************************************** - 1. Nexus (Redeploy) - *************************************** */ - this.nexus = await this.deployNexus(); - - /* ************************************** - 2. mUSD - *************************************** */ - this.mUSD = seedMasset - ? await this.massetMachine.deployMassetAndSeedBasket(enableUSDTFee) - : await this.massetMachine.deployMasset(enableUSDTFee); - - /* ************************************** - 3. Savings - *************************************** */ - this.savingsContract = await c_SavingsContract.new( - this.nexus.address, - this.mUSD.mAsset.address, - { from: this.sa.default }, - ); - this.savingsManager = await c_SavingsManager.new( - this.nexus.address, - this.mUSD.mAsset.address, - this.savingsContract.address, - { from: this.sa.default }, - ); - - /* ************************************** - 4. Init - *************************************** */ - await this.nexus.initialize( - [web3.utils.keccak256("SavingsManager"), web3.utils.keccak256("ProxyAdmin")], - [ - dummySavingsManager ? this.sa.dummy1 : this.savingsManager.address, - this.mUSD.proxyAdmin.address, - ], - [false, true], - this.sa.governor, - { from: this.sa.governor }, - ); - } - - /** - * @dev Deploy the Nexus - */ - public async deployNexus(deployer: Address = this.sa.default): Promise { - const nexus = await c_Nexus.new(this.sa.governor, { from: deployer }); - return nexus; - } - - public async isRunningValidFork(): Promise { - const testContract = new MainnetAccounts().DAI; - const code: string = await web3.eth.getCode(testContract); - if (code === "0x") return false; - return true; - } -} - -export default SystemMachine; diff --git a/test-utils/math.ts b/test-utils/math.ts index 22bfd921..6e459157 100644 --- a/test-utils/math.ts +++ b/test-utils/math.ts @@ -1,91 +1,91 @@ -import { BN } from "./tools"; -import { ratioScale } from "./constants"; +import { BigNumber as BN } from "ethers" +import { ratioScale } from "./constants" -export const simpleToExactAmount = ( - amount: number | string | BN, - decimals: number | BN = 18, -): BN => { +export { BN } + +export const simpleToExactAmount = (amount: number | string | BN, decimals: number | BN = 18): BN => { // Code is largely lifted from the guts of web3 toWei here: // https://github.com/ethjs/ethjs-unit/blob/master/src/index.js - let amountString = amount.toString(); - const decimalsBN = new BN(decimals); + let amountString = amount.toString() + const decimalsBN = BN.from(decimals) - if (decimalsBN.gt(new BN(100))) { - throw new Error(`Invalid decimals amount`); + if (decimalsBN.gt(100)) { + throw new Error(`Invalid decimals amount`) } - const scale = new BN(10).pow(new BN(decimals)); - const scaleString = scale.toString(); + const scale = BN.from(10).pow(decimals) + const scaleString = scale.toString() // Is it negative? - const negative = amountString.substring(0, 1) === "-"; + const negative = amountString.substring(0, 1) === "-" if (negative) { - amountString = amountString.substring(1); + amountString = amountString.substring(1) } if (amountString === ".") { - throw new Error(`Error converting number ${amountString} to precise unit, invalid value`); + throw new Error(`Error converting number ${amountString} to precise unit, invalid value`) } // Split it into a whole and fractional part // eslint-disable-next-line prefer-const - let [whole, fraction, ...rest] = amountString.split("."); + let [whole, fraction, ...rest] = amountString.split(".") if (rest.length > 0) { - throw new Error( - `Error converting number ${amountString} to precise unit, too many decimal points`, - ); + throw new Error(`Error converting number ${amountString} to precise unit, too many decimal points`) } if (!whole) { - whole = "0"; + whole = "0" } if (!fraction) { - fraction = "0"; + fraction = "0" } if (fraction.length > scaleString.length - 1) { - throw new Error( - `Error converting number ${amountString} to precise unit, too many decimal places`, - ); + throw new Error(`Error converting number ${amountString} to precise unit, too many decimal places`) } while (fraction.length < scaleString.length - 1) { - fraction += "0"; + fraction += "0" } - const wholeBN = new BN(whole); - const fractionBN = new BN(fraction); - let result = wholeBN.mul(scale).add(fractionBN); + const wholeBN = BN.from(whole) + const fractionBN = BN.from(fraction) + let result = wholeBN.mul(scale).add(fractionBN) if (negative) { - result = result.mul(new BN("-1")); + result = result.mul("-1") } - return result; -}; + return result +} export const percentToWeight = (percent: number | string | BN): BN => { - return simpleToExactAmount(percent, 16); -}; + return simpleToExactAmount(percent, 16) +} // How many bAssets is this mAsset worth export const applyRatioMassetToBasset = (input: BN, ratio: BN | string): BN => { - return input.mul(ratioScale).div(new BN(ratio)); -}; + return input.mul(ratioScale).div(ratio) +} // How many mAssets is this bAsset worth export const applyRatio = (bAssetQ: BN | string | number, ratio: BN | string): BN => { - return new BN(bAssetQ).mul(new BN(ratio)).div(ratioScale); -}; + return BN.from(bAssetQ) + .mul(ratio) + .div(ratioScale) +} // How many mAssets is this bAsset worth export const applyRatioCeil = (bAssetQ: BN | string, ratio: BN | string): BN => { - const scaled = new BN(bAssetQ).mul(new BN(ratio)); - const ceil = new BN(scaled).add(ratioScale.sub(new BN(1))); - return ceil.div(ratioScale); -}; + const scaled = BN.from(bAssetQ).mul(ratio) + const ceil = BN.from(scaled).add(ratioScale.sub(1)) + return ceil.div(ratioScale) +} export const createMultiple = (decimals: number): BN => { - const ratio = new BN(10).pow(new BN(18 - decimals)); - return new BN(ratio).mul(ratioScale); -}; + const ratio = BN.from(10).pow(18 - decimals) + return BN.from(ratio).mul(ratioScale) +} + +// Returns the smaller number +export const minimum = (a: BN, b: BN): BN => (a.lte(b) ? a : b) diff --git a/test-utils/mstable-objects.ts b/test-utils/mstable-objects.ts index 9b7c5af0..8507c215 100644 --- a/test-utils/mstable-objects.ts +++ b/test-utils/mstable-objects.ts @@ -1,10 +1,7 @@ -import envSetup from "@utils/env_setup"; -import { BN } from "@utils/tools"; -import * as t from "types/generated"; -import { ZERO_ADDRESS } from "./constants"; -import { createMultiple, percentToWeight, simpleToExactAmount } from "./math"; - -const { expect } = envSetup.configure(); +import { expect } from "chai" +import { BN, createMultiple, percentToWeight, simpleToExactAmount } from "@utils/math" +import { IPlatformIntegration, MockERC20 } from "types/generated" +import { ZERO_ADDRESS } from "./constants" /** * @notice Relevant object interfaces and helper methods to initialise mock instances of those interfaces @@ -12,11 +9,11 @@ const { expect } = envSetup.configure(); */ export interface Basket { - bassets: Basset[]; - maxBassets: BN; - expiredBassets: string[]; - failed: boolean; - collateralisationRatio: BN; + bassets: Basset[] + maxBassets: BN + expiredBassets: string[] + failed: boolean + collateralisationRatio: BN } export enum BassetStatus { @@ -31,25 +28,24 @@ export enum BassetStatus { } export interface Basset { - addr: string; - status: BN | BassetStatus; - isTransferFeeCharged: boolean; - ratio: BN | string; - maxWeight: BN | string; - vaultBalance: BN | string; - contract?: t.MockERC20Instance; - integrator?: t.IPlatformIntegrationInstance; + addr: string + status: BN | BassetStatus + isTransferFeeCharged: boolean + ratio: BN | string + vaultBalance: BN | string + pToken?: string + integratorAddr?: string + contract?: MockERC20 + integrator?: IPlatformIntegration } -export const createBasket = (bassets: Basset[], failed = false): Basket => { - return { - bassets, - maxBassets: new BN(16), - expiredBassets: [], - failed, - collateralisationRatio: percentToWeight(100), - }; -}; +export const createBasket = (bassets: Basset[], failed = false): Basket => ({ + bassets, + maxBassets: BN.from(16), + expiredBassets: [], + failed, + collateralisationRatio: percentToWeight(100), +}) export const createBasset = ( maxWeight: BN | number | string, @@ -57,34 +53,30 @@ export const createBasset = ( decimals = 18, status = BassetStatus.Normal, isTransferFeeCharged = false, -): Basset => { - return { - addr: ZERO_ADDRESS, - isTransferFeeCharged, - ratio: createMultiple(decimals).toString(), - maxWeight: percentToWeight(maxWeight).toString(), - vaultBalance: simpleToExactAmount(vaultBalance, decimals).toString(), - status, - }; -}; +): Basset => ({ + addr: ZERO_ADDRESS, + isTransferFeeCharged, + ratio: createMultiple(decimals).toString(), + vaultBalance: simpleToExactAmount(vaultBalance, decimals).toString(), + status, +}) export const equalBasset = (bAsset1: Basset, bAsset2: Basset): void => { - expect(bAsset1.addr).to.equal(bAsset2.addr); - expect(bAsset1.status).to.bignumber.equal(bAsset2.status); - expect(bAsset1.isTransferFeeCharged).to.equal(bAsset2.isTransferFeeCharged); - expect(bAsset1.ratio).to.bignumber.equal(bAsset2.ratio); - expect(bAsset1.maxWeight).to.bignumber.equal(bAsset2.maxWeight); - expect(bAsset1.vaultBalance).to.bignumber.equal(bAsset2.vaultBalance); - return null; -}; + expect(bAsset1.addr).to.equal(bAsset2.addr) + expect(bAsset1.status).to.equal(bAsset2.status) + expect(bAsset1.isTransferFeeCharged).to.equal(bAsset2.isTransferFeeCharged) + expect(bAsset1.ratio).to.equal(bAsset2.ratio) + expect(bAsset1.vaultBalance).to.equal(bAsset2.vaultBalance) + return null +} export const equalBassets = (bAssetArr1: Array, bAssetArr2: Array): void => { - expect(bAssetArr1.length).to.equal(bAssetArr2.length); + expect(bAssetArr1.length).to.equal(bAssetArr2.length) bAssetArr1.map((a, index) => { - equalBasset(bAssetArr1[index], bAssetArr2[index]); - return null; - }); -}; + equalBasset(bAssetArr1[index], bAssetArr2[index]) + return null + }) +} export const buildBasset = ( _addr: string, @@ -93,18 +85,15 @@ export const buildBasset = ( _ratio: BN, _maxWeight: BN, _vaultBalance: BN, -): Basset => { - return { - addr: _addr, - status: new BN(_status), - isTransferFeeCharged: _isTransferFeeCharged, - ratio: _ratio, - maxWeight: _maxWeight, - vaultBalance: _vaultBalance, - }; -}; +): Basset => ({ + addr: _addr, + status: BN.from(_status), + isTransferFeeCharged: _isTransferFeeCharged, + ratio: _ratio, + vaultBalance: _vaultBalance, +}) export const calculateRatio = (measureMultiple: BN, bAssetDecimals: BN): BN => { - const delta = new BN(18).sub(bAssetDecimals); - return measureMultiple.mul(new BN(10).pow(new BN(delta))); -}; + const delta = BN.from(18).sub(bAssetDecimals) + return measureMultiple.mul(10).pow(delta) +} diff --git a/test-utils/time.ts b/test-utils/time.ts new file mode 100644 index 00000000..6776944b --- /dev/null +++ b/test-utils/time.ts @@ -0,0 +1,12 @@ +import { ethers } from "hardhat" +import { BN } from "./math" + +export const increaseTime = async (length: BN | number): Promise => { + await ethers.provider.send("evm_increaseTime", [BN.from(length).toNumber()]) + await ethers.provider.send("evm_mine", []) +} + +export const getTimestamp = async (): Promise => + BN.from((await ethers.provider.getBlock(await ethers.provider.getBlockNumber())).timestamp) + +export const sleep = (ms: number): Promise => new Promise((resolve) => setTimeout(resolve, ms)) diff --git a/test-utils/tools.ts b/test-utils/tools.ts deleted file mode 100644 index dff1ab5d..00000000 --- a/test-utils/tools.ts +++ /dev/null @@ -1,4 +0,0 @@ -import { asciiToHex as aToH, padRight } from "web3-utils"; -import BN from "bn.js"; - -export { aToH, BN, padRight }; diff --git a/test-utils/validator-data/convertCsvTestFiles.ts b/test-utils/validator-data/convertCsvTestFiles.ts new file mode 100644 index 00000000..bf7b528f --- /dev/null +++ b/test-utils/validator-data/convertCsvTestFiles.ts @@ -0,0 +1,272 @@ +/* eslint-disable no-console */ +/* eslint-disable no-continue */ +/* eslint-disable no-restricted-syntax */ + +import parse from "csv-parse" +import fs from "fs" + +interface MintData { + bAssetIndex: string + bAssetQty: string + expectedQty: string +} + +interface MintReserves { + reserve0: string + reserve1: string + reserve2?: string + reserve3?: string + reserve4?: string + mints: MintData[] +} + +interface MultiMintData { + bAssetQtys: string[] + expectedQty: string +} + +interface MultiMintReserves { + reserve0: string + reserve1: string + reserve2?: string + reserve3?: string + reserve4?: string + mints: MultiMintData[] +} + +interface RedeemData { + bAssetIndex: string + mAssetQty: string + expectedQty: string +} + +interface RedeemReserves { + reserve0: string + reserve1: string + reserve2?: string + reserve3?: string + reserve4?: string + redeems: RedeemData[] +} + +interface RedeemExactData { + bAssetQtys: string[] + expectedQty: string +} + +interface RedeemExactReserves { + reserve0: string + reserve1: string + reserve2?: string + reserve3?: string + reserve4?: string + redeems: RedeemExactData[] +} + +interface SwapData { + inputIndex: string + inputQty: string + outputIndex: string + outputQty: string +} + +interface SwapReserves { + reserve0: string + reserve1: string + reserve2?: string + reserve3?: string + reserve4?: string + swaps: SwapData[] +} + +const parseMintTestRecords = async (parser: parse.Parser): Promise => { + const mintReserves: MintReserves[] = [] + let previousMintReserve: MintReserves + for await (const record of parser) { + // Ignore the first title record + if (record[0] === "reserve0") continue; + const mint: MintData = { + bAssetIndex: record[3], + bAssetQty: record[4], + expectedQty: record[5], + } + // If the reserves are different from the last + if ( + previousMintReserve?.reserve0 !== record[0] || + previousMintReserve?.reserve1 !== record[1] || + previousMintReserve?.reserve2 !== record[2] ) + { + previousMintReserve = { + reserve0: record[0], + reserve1: record[1], + reserve2: record[2], + mints: [mint] + } + mintReserves.push(previousMintReserve) + } + else { + // If the reserves are the save as the previous record + previousMintReserve.mints.push(mint) + } + } + return mintReserves +} + +const parseMultiMintTestRecords = async (parser: parse.Parser): Promise => { + const mintReserves: MultiMintReserves[] = [] + let previousMintReserve: MultiMintReserves + for await (const record of parser) { + // Ignore the first title record + if (record[0] === "reserve0") continue; + const mint: MultiMintData = { + bAssetQtys: [record[3], record[4], record[5]], + expectedQty: record[7], + } + // If the reserves are different from the last + if ( + previousMintReserve?.reserve0 !== record[0] || + previousMintReserve?.reserve1 !== record[1] || + previousMintReserve?.reserve2 !== record[2] ) + { + previousMintReserve = { + reserve0: record[0], + reserve1: record[1], + reserve2: record[2], + mints: [mint] + } + mintReserves.push(previousMintReserve) + } + else { + // If the reserves are the save as the previous record + previousMintReserve.mints.push(mint) + } + } + return mintReserves +} + +const parseRedeemTestRecords = async (parser: parse.Parser): Promise => { + const redeemReserves: RedeemReserves[] = [] + let previousRedeemReserve: RedeemReserves + for await (const record of parser) { + // Ignore the first title record + if (record[0] === "reserve0") continue; + const redeem: RedeemData = { + bAssetIndex: record[3], + mAssetQty: record[4], + expectedQty: record[5], + } + // If the reserves are different from the last + if ( + previousRedeemReserve?.reserve0 !== record[0] || + previousRedeemReserve?.reserve1 !== record[1] || + previousRedeemReserve?.reserve2 !== record[2] ) + { + previousRedeemReserve = { + reserve0: record[0], + reserve1: record[1], + reserve2: record[2], + redeems: [redeem] + } + redeemReserves.push(previousRedeemReserve) + } + else { + // If the reserves are the save as the previous record + previousRedeemReserve.redeems.push(redeem) + } + } + return redeemReserves +} + +const parseRedeemExactTestRecords = async (parser: parse.Parser): Promise => { + const redeemReserves: RedeemExactReserves[] = [] + let previousRedeemReserve: RedeemExactReserves + for await (const record of parser) { + // Ignore the first title record + if (record[0] === "reserve0") continue; + const mint: RedeemExactData = { + bAssetQtys: [record[3], record[4], record[5]], + expectedQty: record[7], + } + // If the reserves are different from the last + if ( + previousRedeemReserve?.reserve0 !== record[0] || + previousRedeemReserve?.reserve1 !== record[1] || + previousRedeemReserve?.reserve2 !== record[2] ) + { + previousRedeemReserve = { + reserve0: record[0], + reserve1: record[1], + reserve2: record[2], + redeems: [mint] + } + redeemReserves.push(previousRedeemReserve) + } + else { + // If the reserves are the save as the previous record + previousRedeemReserve.redeems.push(mint) + } + } + return redeemReserves +} + +const parseSwapTestRecords = async (parser: parse.Parser): Promise => { + const swapReserves: SwapReserves[] = [] + let previousSwapReserve: SwapReserves + for await (const record of parser) { + // Ignore the first title record + if (record[0] === "reserve0") continue; + const swap: SwapData = { + inputIndex: record[3], + inputQty: record[5], + outputIndex: record[4], + outputQty: record[6], + } + // If the reserves are different from the last + if ( + previousSwapReserve?.reserve0 !== record[0] || + previousSwapReserve?.reserve1 !== record[1] || + previousSwapReserve?.reserve2 !== record[2] ) + { + previousSwapReserve = { + reserve0: record[0], + reserve1: record[1], + reserve2: record[2], + swaps: [swap] + } + swapReserves.push(previousSwapReserve) + } + else { + // If the reserves are the save as the previous record + previousSwapReserve.swaps.push(swap) + } + } + return swapReserves +} + +const parseCsvFile = async (testFilename: string, recordParser: (parser: parse.Parser) => Promise): Promise => { + const parser: parse.Parser = fs + .createReadStream(testFilename) + .pipe(parse()); + return recordParser(parser) +} + +const main = async () => { + const mintData = await parseCsvFile("./mbtc_test_mint.csv", parseMintTestRecords) + fs.writeFileSync( "mintTestData.json", JSON.stringify(mintData)) + + const multiMintData = await parseCsvFile("./mbtc_test_multi_mint.csv", parseMultiMintTestRecords) + fs.writeFileSync( "multiMintTestData.json", JSON.stringify(multiMintData)) + + const redeemData = await parseCsvFile("./mbtc_test_redeem.csv", parseRedeemTestRecords) + fs.writeFileSync( "redeemTestData.json", JSON.stringify(redeemData)) + + const redeemExactData = await parseCsvFile("./mbtc_test_multi_redeem.csv", parseRedeemExactTestRecords) + fs.writeFileSync( "redeemExactTestData.json", JSON.stringify(redeemExactData)) + + const swapData = await parseCsvFile("./mbtc_test_swap.csv", parseSwapTestRecords) + fs.writeFileSync( "swapTestData.json", JSON.stringify(swapData)) +} + +main() +.then() +.catch(err => console.error(err)) \ No newline at end of file diff --git a/test-utils/validator-data/full/integrationData.json b/test-utils/validator-data/full/integrationData.json new file mode 100644 index 00000000..ed323a70 --- /dev/null +++ b/test-utils/validator-data/full/integrationData.json @@ -0,0 +1,135740 @@ +{ + "reserve0": "3333333333333333330000000", + "reserve1": "3333333333333333330000000", + "reserve2": "3333333333333333330000000", + "A": 120, + "hardMin": 50000000000000000, + "hardMax": 750000000000000000, + "swapFeeRate": 600000000000000, + "redemptionFeeRate": 300000000000000, + "actions": [ + { + "type": "redeemBassets", + "inputQtys": [ + "7273078205549974528", + "155969121455495380992", + "144531542372101226496" + ], + "expectedQty": "307773759009220050661", + "swapFee": "184775120477818721", + "reserves": [ + "3333326060255127780025472", + "3333177364211877834619008", + "3333188801790961228773504" + ], + "mAssetSupply": "9999692226240990769949339" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "734048361118712268324864", + "48623817237249994522624", + "311219938026755327000576" + ], + "expectedQty": "1094235429070908550838837", + "swapFee": "656935418693761387335", + "reserves": [ + "2599277699136415511700608", + "3284553546974627840096384", + "3021968863764205901772928" + ], + "mAssetSupply": "8905456797170082219110502" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "5917110544627535872", + "expectedQty": "5906756900185624322", + "swapFee": "3550266326776521", + "reserves": [ + "2599271792379515326076286", + "3284553546974627840096384", + "3021968863764205901772928" + ], + "mAssetSupply": "8905450883609803918351151" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "121789446577382156664832", + "expectedQty": "121725315346367419990412", + "swapFee": "73073667946429293998", + "reserves": [ + "2599271792379515326076286", + "3284553546974627840096384", + "2900243548417838481782516" + ], + "mAssetSupply": "8783734510700368190980317" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "295340756022743793664", + "expectedQty": "295353123656581259674", + "reserves": [ + "2599271792379515326076286", + "3284553546974627840096384", + "2900538889173861225576180" + ] + }, + { + "type": "redeemMasset", + "inputQty": "15123009034654849590886", + "expectedQtys": [ + "4473689043143975981877", + "5653149185013976573362", + "4992209389473296852951" + ], + "redemptionFee": "4536902710396454877", + "reserves": [ + "2594798103336371350094409", + "3278900397789613863523022", + "2895546679784387928723229" + ], + "mAssetSupply": "8768911391692080319103982" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "301324324015181066665984", + "expectedQty": "300713716118922601156584", + "swapFee": "180794594409108639999", + "reserves": [ + "2294084387217448748937825", + "3278900397789613863523022", + "2895546679784387928723229" + ], + "mAssetSupply": "8467767862271308361077997" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "56051756230399240437760", + "outputIndex": 1, + "expectedQty": "56064585403996278447371", + "swapFee": "33619030323132013007", + "reserves": [ + "2294084387217448748937825", + "3222835812385617585075651", + "2951598436014787169160989" + ], + "mAssetSupply": "8467801481301631493091004", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemMasset", + "inputQty": "9908604724032924182118", + "expectedQtys": [ + "2683619366145195855729", + "3770072560632675127971", + "3452779142785017378377" + ], + "redemptionFee": "2972581417209877254", + "reserves": [ + "2291400767851303553082096", + "3219065739824984909947680", + "2948145656872002151782612" + ], + "mAssetSupply": "8457895849159015778786140" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "90734708768013959168", + "expectedQty": "90721633474467029817", + "swapFee": "54440825260808375", + "reserves": [ + "2291400767851303553082096", + "3219065739824984909947680", + "2948054935238527684752795" + ], + "mAssetSupply": "8457805168891073025635347" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "1209345053528237015040", + "expectedQty": "1211612977780551471601", + "reserves": [ + "2292610112904831790097136", + "3219065739824984909947680", + "2948054935238527684752795" + ] + }, + { + "type": "redeemMasset", + "inputQty": "291186238385344256", + "expectedQtys": [ + "78895249780915482", + "110777229052213532", + "101450974666078849" + ], + "redemptionFee": "87355871515603", + "reserves": [ + "2292610034009582009181654", + "3219065629047755857734148", + "2948054833787553018673946" + ], + "mAssetSupply": "8459016490769971063278295" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "3850933973332442742784", + "5745025913465163743232", + "115434005736064204800" + ], + "expectedQty": "9712030143821573040308", + "swapFee": "5830716516202665423", + "reserves": [ + "2288759100036249566438870", + "3213320603134290693990916", + "2947939399781816954469146" + ], + "mAssetSupply": "8449304460626149490237987" + }, + { + "type": "redeemMasset", + "inputQty": "5403265076163042187673", + "expectedQtys": [ + "1463204709802366875219", + "2054277289618033480738", + "1884618968376532263438" + ], + "redemptionFee": "1620979522848912656", + "reserves": [ + "2287295895326447199563651", + "3211266325844672660510178", + "2946054780813440422205708" + ], + "mAssetSupply": "8443902816529509296962970" + }, + { + "type": "redeemMasset", + "inputQty": "1711578172521137255219", + "expectedQtys": [ + "463495536111337495607", + "650728054177368777646", + "596985830664296318825" + ], + "redemptionFee": "513473451756341176", + "reserves": [ + "2286832399790335862068044", + "3210615597790495291732532", + "2945457794982776125886883" + ], + "mAssetSupply": "8442191751830439916048927" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "358800792615223488", + "expectedQty": "358393429115469163", + "reserves": [ + "2286832399790335862068044", + "3210615956591287906956020", + "2945457794982776125886883" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "123309140047431217446912", + "29225268438406097010688", + "162492634658043297005568" + ], + "expectedQty": "315168004878843302905384", + "swapFee": "189214331526221714772", + "reserves": [ + "2163523259742904644621132", + "3181390688152881809945332", + "2782965160324732828881315" + ], + "mAssetSupply": "8127024105345025728612706" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "2004770994211215988752384", + "hardLimitError": true + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "21288465480056983552", + "expectedQty": "21282760857608373529", + "swapFee": "12773079288034190", + "reserves": [ + "2163523259742904644621132", + "3181390688152881809945332", + "2782943877563875220507786" + ], + "mAssetSupply": "8127002829652624959663344" + }, + { + "type": "redeemMasset", + "inputQty": "41963284353312544", + "expectedQtys": [ + "11167869274010150", + "16421989065681038", + "14365250422698717" + ], + "redemptionFee": "12588985305993", + "reserves": [ + "2163523248575035370610982", + "3181390671730892744264294", + "2782943863198624797809069" + ], + "mAssetSupply": "8127002787701929591656793" + }, + { + "type": "redeemMasset", + "inputQty": "68662288952151286323609", + "expectedQtys": [ + "18273390152584793524462", + "26870426749803508987426", + "23505094765431322173933" + ], + "redemptionFee": "20598686685645385897", + "reserves": [ + "2145249858422450577086520", + "3154520244981089235276868", + "2759438768433193475635136" + ], + "mAssetSupply": "8058361097436463950719081" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "817206035558604415696896", + "outputIndex": 2, + "expectedQty": "816055084064554311968936", + "swapFee": "490766500324224353762", + "reserves": [ + "2962455893981054992783416", + "3154520244981089235276868", + "1943383684368639163666200" + ], + "mAssetSupply": "8058851863936788175072843", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemMasset", + "inputQty": "390366989468777267", + "expectedQtys": [ + "143456918527601511", + "152757634197140784", + "94108349576705901" + ], + "redemptionFee": "117110096840633", + "reserves": [ + "2962455750524136465181905", + "3154520092223455038136084", + "1943383590260289586960299" + ], + "mAssetSupply": "8058851473686908803136209" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "31626296670497", + "40391349933409", + "10361514912368" + ], + "expectedQty": "82319963637528", + "swapFee": "49421631161", + "reserves": [ + "2962455750492510168511408", + "3154520092183063688202675", + "1943383590249928072047931" + ], + "mAssetSupply": "8058851473604588839498681" + }, + { + "type": "mintMulti", + "inputQtys": [ + "41352735484718514176", + "2786143862716305920", + "20176704195146088448" + ], + "expectedQty": "64334016863795542477", + "reserves": [ + "2962497103227994887025584", + "3154522878326926404508595", + "1943403766954123218136379" + ], + "mAssetSupply": "8058915807621452635041158" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "137693195249614011236352", + "expectedQty": "137800222272376116090390", + "swapFee": "82615917149768406741", + "reserves": [ + "2962497103227994887025584", + "3016722656054550288418205", + "1943403766954123218136379" + ], + "mAssetSupply": "7921305228288988392211547" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "545567435996840260009984", + "expectedQty": "545555890716041351940295", + "swapFee": "327340461598104156005", + "reserves": [ + "2416941212511953535085289", + "3016722656054550288418205", + "1943403766954123218136379" + ], + "mAssetSupply": "7376065132753746236357568" + }, + { + "type": "mintMulti", + "inputQtys": [ + "666114235388421256249344", + "545054779485157328945152", + "1196313873163898138394624" + ], + "expectedQty": "2408316044099353844884075", + "reserves": [ + "3083055447900374791334633", + "3561777435539707617363357", + "3139717640118021356531003" + ], + "mAssetSupply": "9784381176853100081241643" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "71127153735251632128", + "outputIndex": 0, + "expectedQty": "71000460116592538259", + "swapFee": "42645636133682555", + "reserves": [ + "3082984447440258198796374", + "3561848562693442868995485", + "3139717640118021356531003" + ], + "mAssetSupply": "9784381219498736214924198", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "1667322653332190923849728", + "expectedQty": "1660944546190015720710383", + "swapFee": "1000393591999314554309", + "reserves": [ + "1422039901250242478085991", + "3561848562693442868995485", + "3139717640118021356531003" + ], + "mAssetSupply": "8118058959758544605628779" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "694339394638019662184448", + "expectedQty": "694853343123431192025931", + "swapFee": "416603636782811797310", + "reserves": [ + "1422039901250242478085991", + "3561848562693442868995485", + "2444864296994590164505072" + ], + "mAssetSupply": "7424136168757307755241641" + }, + { + "type": "mintMulti", + "inputQtys": [ + "136178307463526970556416", + "33823881941116832972800", + "69274577206037767520256" + ], + "expectedQty": "239983471456530457180944", + "reserves": [ + "1558218208713769448642407", + "3595672444634559701968285", + "2514138874200627932025328" + ], + "mAssetSupply": "7664119640213838212422585" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "18076767285165498368", + "11045863185563906048", + "10868197050903506944" + ], + "expectedQty": "40053985824790099495", + "swapFee": "24046819586626035", + "reserves": [ + "1558200131946484283144039", + "3595661398771374138062237", + "2514128006003577028518384" + ], + "mAssetSupply": "7664079586228013422323090" + }, + { + "type": "mintMulti", + "inputQtys": [ + "30164655958507884544", + "20369638325277392896", + "9213618988052046848" + ], + "expectedQty": "59849949827842235931", + "reserves": [ + "1558230296602442791028583", + "3595681768409699415455133", + "2514137219622565080565232" + ], + "mAssetSupply": "7664139436177841264559021" + }, + { + "type": "redeemMasset", + "inputQty": "19446764098466573031833", + "expectedQtys": [ + "3952622010635302250720", + "9120841079810105534432", + "6377384738125757890698" + ], + "redemptionFee": "5834029229539971909", + "reserves": [ + "1554277674591807488777863", + "3586560927329889309920701", + "2507759834884439322674534" + ], + "mAssetSupply": "7644698506108604231499097" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "9487306187281740595200", + "outputIndex": 0, + "expectedQty": "9395426758618060362579", + "swapFee": "5673375108423775257", + "reserves": [ + "1544882247833189428415284", + "3596048233517171050515901", + "2507759834884439322674534" + ], + "mAssetSupply": "7644704179483712655274354", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemMasset", + "inputQty": "12433589650730920391475", + "expectedQtys": [ + "2511891755107134291492", + "5846972428745710789776", + "4077476624428930451347" + ], + "redemptionFee": "3730076895219276117", + "reserves": [ + "1542370356078082294123792", + "3590201261088425339726125", + "2503682358260010392223187" + ], + "mAssetSupply": "7632274319909876954158996" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "71134567957281581826048", + "expectedQty": "70890493263008435889385", + "reserves": [ + "1542370356078082294123792", + "3661335829045706921552173", + "2503682358260010392223187" + ] + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "2405982357208262569361408", + "hardLimitError": true + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "232737354977212897427456", + "expectedQty": "233365898433554516193628", + "swapFee": "139642412986327738456", + "reserves": [ + "1542370356078082294123792", + "3427969930612152405358545", + "2503682358260010392223187" + ], + "mAssetSupply": "7470567100608658820359381" + }, + { + "type": "redeemMasset", + "inputQty": "7744196965767415280435", + "expectedQtys": [ + "1598384211649358358340", + "3552462606342925891882", + "2594607927115295368327" + ], + "redemptionFee": "2323259089730224584", + "reserves": [ + "1540771971866432935765452", + "3424417468005809479466663", + "2501087750332895096854860" + ], + "mAssetSupply": "7462825226901981135303530" + }, + { + "type": "mintMulti", + "inputQtys": [ + "128049032356046850490368", + "191620114957392569958400", + "94547891439582834589696" + ], + "expectedQty": "414262064257465162277992", + "reserves": [ + "1668821004222479786255820", + "3616037582963202049425063", + "2595635641772477931444556" + ], + "mAssetSupply": "7877087291159446297581522" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "2502476695581235347456", + "expectedQty": "2494865115595518722180", + "reserves": [ + "1668821004222479786255820", + "3618540059658783284772519", + "2595635641772477931444556" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "3319259101849882984448", + "892201999830101786624", + "847220923742197776384" + ], + "expectedQty": "5072473403464615399614", + "swapFee": "3045311228816058875", + "reserves": [ + "1665501745120629903271372", + "3617647857658953182985895", + "2594788420848735733668172" + ], + "mAssetSupply": "7874509682871577200904088" + }, + { + "type": "mintMulti", + "inputQtys": [ + "79090084482260257472512", + "93104087638600497233920", + "52357028037842601771008" + ], + "expectedQty": "224645137052112526738586", + "reserves": [ + "1744591829602890160743884", + "3710751945297553680219815", + "2647145448886578335439180" + ], + "mAssetSupply": "8099154819923689727642674" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "607107027923552174080", + "expectedQty": "606875510140973405608", + "swapFee": "364264216754131304", + "reserves": [ + "1744591829602890160743884", + "3710751945297553680219815", + "2646538573376437362033572" + ], + "mAssetSupply": "8098548077159982929599898" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "679592281064666243792896", + "expectedQty": "680843848772351286845860", + "swapFee": "407755368638799746275", + "reserves": [ + "1744591829602890160743884", + "3029908096525202393373955", + "2646538573376437362033572" + ], + "mAssetSupply": "7419363551463955485553277" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "218772838972175987769344", + "expectedQty": "218765587694121154083988", + "swapFee": "131263703383305592661", + "reserves": [ + "1744591829602890160743884", + "3029908096525202393373955", + "2427772985682316207949584" + ], + "mAssetSupply": "7200721976195162803376594" + }, + { + "type": "redeemMasset", + "inputQty": "136491275302280757248", + "expectedQtys": [ + "33059202677494752237", + "57415347336579696422", + "46005167413220868635" + ], + "redemptionFee": "40947382590684227", + "reserves": [ + "1744558770400212665991647", + "3029850681177865813677533", + "2427726980514902987080949" + ], + "mAssetSupply": "7200585525867243113303573" + }, + { + "type": "mintMulti", + "inputQtys": [ + "478059257416337384800256", + "19651726114616246272000", + "66820529752799801507840" + ], + "expectedQty": "565520856816563256904398", + "reserves": [ + "2222618027816550050791903", + "3049502407292482059949533", + "2494547510267702788588789" + ], + "mAssetSupply": "7766106382683806370207971" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "3173226448094203282980864", + "expectedQty": "3161620621057727003591834", + "reserves": [ + "2222618027816550050791903", + "6222728855386685342930397", + "2494547510267702788588789" + ] + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "336513233567333604130816", + "expectedQty": "334453766843499392293160", + "reserves": [ + "2222618027816550050791903", + "6559242088954018947061213", + "2494547510267702788588789" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "406473423465423634432", + "362829301080640716800", + "156588650767507816448" + ], + "expectedQty": "927176873572347554735", + "reserves": [ + "2223024501240015474426335", + "6559604918255099587778013", + "2494704098918470296405237" + ], + "mAssetSupply": "11263107947458605113647700" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "11079786313743078", + "outputIndex": 1, + "expectedQty": "11221978257123481", + "swapFee": "6694366709617", + "reserves": [ + "2223024512319801788169413", + "6559604907033121330654532", + "2494704098918470296405237" + ], + "mAssetSupply": "11263107947465299480357317", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemMasset", + "inputQty": "3717531749450651166310", + "expectedQtys": [ + "733517337632713835523", + "2164431341473769361720", + "823161732441052866298" + ], + "redemptionFee": "1115259524835195349", + "reserves": [ + "2222290994982169074333890", + "6557440475691647561292812", + "2493880937186029243538939" + ], + "mAssetSupply": "11259391530975373664386356" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "27744279367341353992192", + "outputIndex": 1, + "expectedQty": "28034717527392457034996", + "swapFee": "16725025110633706053", + "reserves": [ + "2222290994982169074333890", + "6529405758164255104257816", + "2521625216553370597531131" + ], + "mAssetSupply": "11259408256000484298092409", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "66497874436608153878528", + "expectedQty": "66943922470213726860559", + "reserves": [ + "2288788869418777228212418", + "6529405758164255104257816", + "2521625216553370597531131" + ] + }, + { + "type": "redeemMasset", + "inputQty": "42778549449420971389747", + "expectedQtys": [ + "8641943404816740092798", + "24653543095685025619738", + "9521080210053124599811" + ], + "redemptionFee": "12833564834826291416", + "reserves": [ + "2280146926013960488119620", + "6504752215068570078638078", + "2512104136343317472931320" + ], + "mAssetSupply": "11283586462586111879854637" + }, + { + "type": "mintMulti", + "inputQtys": [ + "72924996141066674176", + "2610408488017192960", + "4560305431174331392" + ], + "expectedQty": "80571802944130401747", + "reserves": [ + "2280219851010101554793796", + "6504754825477058095831038", + "2512108696648748647262712" + ], + "mAssetSupply": "11283667034389056010256384" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "80086277263270395904", + "274084131519848218624", + "720740761028219264" + ], + "expectedQty": "353731962534506695086", + "swapFee": "212366597479191531", + "reserves": [ + "2280139764732838284397892", + "6504480741345538247612414", + "2512107975907987619043448" + ], + "mAssetSupply": "11283313302426521503561298" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "1007169083700320241975296", + "299176736478277721391104", + "474187104246107817902080" + ], + "expectedQty": "1792605925496218170380620", + "swapFee": "1076209280866250652619", + "reserves": [ + "1272970681032518042422596", + "6205304004867260526221310", + "2037920871661879801141368" + ], + "mAssetSupply": "9490707376930303333180678" + }, + { + "type": "redeemMasset", + "inputQty": "7781017044710064128", + "expectedQtys": [ + "1043340045298391616", + "5085931874155327826", + "1670301198790868675" + ], + "redemptionFee": "2334305113413019", + "reserves": [ + "1272969637692472744030980", + "6205298918935386370893484", + "2037919201360681010272693" + ], + "mAssetSupply": "9490699598247563736529569" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "157722652094670412185600", + "236859317664397419085824", + "154673058908341440348160" + ], + "expectedQty": "551345946805465839769677", + "swapFee": "331006171786351314650", + "reserves": [ + "1115246985597802331845380", + "5968439601270988951807660", + "1883246142452339569924533" + ], + "mAssetSupply": "8939353651442097896759892" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "1077065453544859893760", + "expectedQty": "1064514204517026746047", + "reserves": [ + "1115246985597802331845380", + "5969516666724533811701420", + "1883246142452339569924533" + ] + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "117592968511631151595520", + "expectedQty": "116616387544818894323173", + "swapFee": "70555781106978690957", + "reserves": [ + "1115246985597802331845380", + "5969516666724533811701420", + "1766629754907520675601360" + ], + "mAssetSupply": "8822895752916090750601376" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "84841783274341352341504", + "115456751558910447452160", + "183701926149258246881280" + ], + "expectedQty": "386645228029495421380125", + "swapFee": "232126412665296430686", + "reserves": [ + "1030405202323460979503876", + "5854059915165623364249260", + "1582927828758262428720080" + ], + "mAssetSupply": "8436250524886595329221251" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "23455628750610067619840", + "outputIndex": 1, + "expectedQty": "24016435111127788184540", + "swapFee": "14226731669308432324", + "reserves": [ + "1030405202323460979503876", + "5830043480054495576064720", + "1606383457508872496339920" + ], + "mAssetSupply": "8436264751618264637653575", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "1701876139838482321244160", + "expectedQty": "1719015988040708933203062", + "swapFee": "1021125683903089392746", + "reserves": [ + "1030405202323460979503876", + "4111027492013786642861658", + "1606383457508872496339920" + ], + "mAssetSupply": "6735409737463685405802161" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "2012307768815537094656", + "expectedQty": "2019558122603942107391", + "reserves": [ + "1030405202323460979503876", + "4111027492013786642861658", + "1608395765277688033434576" + ] + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "178113383824631201792", + "outputIndex": 1, + "expectedQty": "182003381441958591554", + "swapFee": "108393535116040236", + "reserves": [ + "1030583315707285610705668", + "4110845488632344684270104", + "1608395765277688033434576" + ], + "mAssetSupply": "6737429403979824463949788", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mintMulti", + "inputQtys": [ + "610417500926156566691840", + "1435648899744822942760960", + "595337380972156332015616" + ], + "expectedQty": "2640182060869153036515720", + "reserves": [ + "1641000816633442177397508", + "5546494388377167627031064", + "2203733146249844365450192" + ], + "mAssetSupply": "9377611464848977500465508" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "329823967768117706752", + "expectedQty": "327550521743329575196", + "reserves": [ + "1641000816633442177397508", + "5546824212344935744737816", + "2203733146249844365450192" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "778703813423478670884864", + "336300575891834372358144", + "555988608222827361861632" + ], + "expectedQty": "1684683204244682619577295", + "swapFee": "1011416772610375797224", + "reserves": [ + "862297003209963506512644", + "5210523636453101372379672", + "1647744538027017003588560" + ], + "mAssetSupply": "7693255811126038210463409" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "21246592409485332", + "118031323729715392", + "117766338337406528" + ], + "expectedQty": "257033986438627448", + "swapFee": "154312979650967", + "reserves": [ + "862296981963371097027312", + "5210523518421777642664280", + "1647744420260678666182032" + ], + "mAssetSupply": "7693255554092051771835961" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "532302322661583908503552", + "expectedQty": "534335593707293779997208", + "reserves": [ + "862296981963371097027312", + "5210523518421777642664280", + "2180046742922262574685584" + ] + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "3427431940015150730313728", + "hardLimitError": true + }, + { + "type": "mintMulti", + "inputQtys": [ + "22840319556047278702592", + "208313487341895689437184", + "105975241759318234628096" + ], + "expectedQty": "335736851908445274932050", + "reserves": [ + "885137301519418375729904", + "5418837005763673332101464", + "2286021984681580809313680" + ], + "mAssetSupply": "8563327999707790826765219" + }, + { + "type": "redeemMasset", + "inputQty": "283034887487408884940", + "expectedQtys": [ + "29246757701449661524", + "179049524473963530035", + "75534870094617178679" + ], + "redemptionFee": "84910466246222665", + "reserves": [ + "885108054761716926068380", + "5418657956239199368571429", + "2285946449811486192135001" + ], + "mAssetSupply": "8563045049730769664102944" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "167298545495576182784", + "expectedQty": "173232324812953997202", + "reserves": [ + "885275353307212502251164", + "5418657956239199368571429", + "2285946449811486192135001" + ] + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "63948933607080975138816", + "expectedQty": "61563188335711803450321", + "swapFee": "38369360164248585083", + "reserves": [ + "823712164971500698800843", + "5418657956239199368571429", + "2285946449811486192135001" + ], + "mAssetSupply": "8499307717808665891546413" + }, + { + "type": "redeemMasset", + "inputQty": "689478124769262855782", + "expectedQtys": [ + "66800868758862487193", + "439438768026965445122", + "185384185492669083309" + ], + "redemptionFee": "206843437430778856", + "reserves": [ + "823645364102741836313650", + "5418218517471172403126307", + "2285761065625993523051692" + ], + "mAssetSupply": "8498618446527334059469487" + }, + { + "type": "redeemMasset", + "inputQty": "728430778336682180608", + "expectedQtys": [ + "70574840702696688599", + "464265235292734488688", + "195857622857764246030" + ], + "redemptionFee": "218529233501004654", + "reserves": [ + "823574789262039139625051", + "5417754252235879668637619", + "2285565208003135758805662" + ], + "mAssetSupply": "8497890234278230878293533" + }, + { + "type": "redeemMasset", + "inputQty": "145069190424394598658867", + "expectedQtys": [ + "14055192764436825701450", + "92459824363679602891770", + "39005637366533349013942" + ], + "redemptionFee": "43520757127318379597", + "reserves": [ + "809519596497602313923601", + "5325294427872200065745849", + "2246559570636602409791720" + ], + "mAssetSupply": "8352864564610963598014263" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "258900394266450236276736", + "outputIndex": 2, + "expectedQty": "266005727002437978633769", + "swapFee": "160151545824754648752", + "reserves": [ + "1068419990764052550200337", + "5325294427872200065745849", + "1980553843634164431157951" + ], + "mAssetSupply": "8353024716156788352663015", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "2450226992579134095360", + "expectedQty": "2425777213590348150120", + "reserves": [ + "1068419990764052550200337", + "5327744654864779199841209", + "1980553843634164431157951" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "9488571908290083028992", + "6437382599435136008192", + "10212587236063904268288" + ], + "expectedQty": "26330782198948881703373", + "swapFee": "15807954091824423676", + "reserves": [ + "1058931418855762467171345", + "5321307272265344063833017", + "1970341256398100526889663" + ], + "mAssetSupply": "8329119711171429819109762" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "115447724213879340793856", + "outputIndex": 1, + "expectedQty": "116899117334945199192315", + "swapFee": "69506895503247804825", + "reserves": [ + "1058931418855762467171345", + "5204408154930398864640702", + "2085788980611979867683519" + ], + "mAssetSupply": "8329189218066933066914587", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemBassets", + "inputQtys": [ + "13426645720632215470080", + "32586969545503804489728", + "4858202670983985233920" + ], + "expectedQty": "50878307966845106823264", + "swapFee": "30545311967287436555", + "reserves": [ + "1045504773135130251701265", + "5171821185384895060150974", + "2080930777940995882449599" + ], + "mAssetSupply": "8278310910100087960091323" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "1060047634790708890566656", + "expectedQty": "1049321996510545843496137", + "swapFee": "636028580874425334339", + "reserves": [ + "1045504773135130251701265", + "5171821185384895060150974", + "1031608781430450038953462" + ], + "mAssetSupply": "7218899303890253494859006" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "63432239315466846208", + "79891373025438023680", + "27022881109869289472" + ], + "expectedQty": "171195459149119021154", + "swapFee": "102778942855184523", + "reserves": [ + "1045441340895814784855057", + "5171741294011869622127294", + "1031581758549340169663990" + ], + "mAssetSupply": "7218728108431104375837852" + }, + { + "type": "redeemMasset", + "inputQty": "707236863968490", + "expectedQtys": [ + "102393777947980", + "506536434851233", + "101036327327154" + ], + "redemptionFee": "212171059190", + "reserves": [ + "1045441340793421006907077", + "5171741293505333187276061", + "1031581758448303842336836" + ], + "mAssetSupply": "7218728107724079682928552" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "34583408805710110130176", + "expectedQty": "33756773295395772702102", + "swapFee": "20750045283426066078", + "reserves": [ + "1045441340793421006907077", + "5171741293505333187276061", + "997824985152908069634734" + ], + "mAssetSupply": "7184165448963652998864454" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "345274635610540153503744", + "638493561237653872967680", + "333085268888336639983616" + ], + "hardLimitError": true + }, + { + "type": "redeemMasset", + "inputQty": "642948392811460701873766", + "expectedQtys": [ + "93533923343840817184744", + "462707217349738973171071", + "89273766045093953877641" + ], + "redemptionFee": "192884517843438210562", + "reserves": [ + "951907417449580189722333", + "4709034076155594214104990", + "908551219107814115757093" + ], + "mAssetSupply": "6541409940670035735201250" + }, + { + "type": "redeemMasset", + "inputQty": "214564677366852997454233", + "expectedQtys": [ + "31214132128660994388954", + "154414609190996594463108", + "29792432834351208483603" + ], + "redemptionFee": "64369403210055899236", + "reserves": [ + "920693285320919195333379", + "4554619466964597619641882", + "878758786273462907273490" + ], + "mAssetSupply": "6326909632706392793646253" + }, + { + "type": "redeemMasset", + "inputQty": "12502770783229876319027", + "expectedQtys": [ + "1818860140408131450706", + "8997801912176723980942", + "1736017145850160832377" + ], + "redemptionFee": "3750831234968962895", + "reserves": [ + "918874425180511063882673", + "4545621665052420895660940", + "877022769127612746441113" + ], + "mAssetSupply": "6314410612754397886290121" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "113989566877181323247616", + "outputIndex": 1, + "expectedQty": "118000635340378593305835", + "swapFee": "69871315611072477922", + "reserves": [ + "918874425180511063882673", + "4427621029712042302355105", + "991012336004794069688729" + ], + "mAssetSupply": "6314480484070008958768043", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemMasset", + "inputQty": "4636575714962904711168", + "expectedQtys": [ + "674505642448948457833", + "3250123504721238214742", + "727458936775209966681" + ], + "redemptionFee": "1390972714488871413", + "reserves": [ + "918199919538062115424840", + "4424370906207321064140363", + "990284877068018859722048" + ], + "mAssetSupply": "6309845299327760542928288" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "1183882260626913735213056", + "898639076765920934232064", + "653030498021131943936000" + ], + "insufficientLiquidityError": true + }, + { + "type": "redeemMasset", + "inputQty": "35050776532630707057459", + "expectedQtys": [ + "5099010130942237904661", + "24569716892533494235411", + "5499317211037286707032" + ], + "redemptionFee": "10515232959789212117", + "reserves": [ + "913100909407119877520179", + "4399801189314787569904952", + "984785559856981573015016" + ], + "mAssetSupply": "6274805038028089625082946" + }, + { + "type": "mintMulti", + "inputQtys": [ + "1740056605959494645579776", + "2341066300943664754458624", + "1818065349888175090171904" + ], + "expectedQty": "5910668789057422113699187", + "reserves": [ + "2653157515366614523099955", + "6740867490258452324363576", + "2802850909745156663186920" + ], + "mAssetSupply": "12185473827085511738782133" + }, + { + "type": "redeemMasset", + "inputQty": "770036035732808366083276", + "expectedQtys": [ + "167610551400898798074894", + "425847508268460314224280", + "177067280685738367151876" + ], + "redemptionFee": "231010810719842509824", + "reserves": [ + "2485546963965715725025061", + "6315019981989992010139296", + "2625783629059418296035044" + ], + "mAssetSupply": "11415668802163423215208681" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "368832558301584621568", + "10025327924084492730368", + "30427733533298809372672" + ], + "expectedQty": "40894723293488810061952", + "swapFee": "24551564915042311424", + "reserves": [ + "2485178131407414140403493", + "6304994654065907517408928", + "2595355895526119486662372" + ], + "mAssetSupply": "11374774078869934405146729" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "2594707768525922269921280", + "expectedQty": "2597108373680765282729286", + "reserves": [ + "5079885899933336410324773", + "6304994654065907517408928", + "2595355895526119486662372" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "535122096831515324317696", + "171878770833454595571712", + "321959410139553954004992" + ], + "expectedQty": "1030200926939149501728537", + "swapFee": "618491651154182210363", + "reserves": [ + "4544763803101821086007077", + "6133115883232452921837216", + "2273396485386565532657380" + ], + "mAssetSupply": "12941681525611550186147478" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "33259959236553015296", + "expectedQty": "33282051329923209811", + "swapFee": "19955975541931809", + "reserves": [ + "4544730521050491162797266", + "6133115883232452921837216", + "2273396485386565532657380" + ], + "mAssetSupply": "12941648285608289175063991" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "1761247965812440956928", + "848885233671465074688", + "1429950348234602315776" + ], + "expectedQty": "4046961909197856828723", + "swapFee": "2429634926474598856", + "reserves": [ + "4542969273084678721840338", + "6132266997998781456762528", + "2271966535038330930341604" + ], + "mAssetSupply": "12937601323699091318235268" + }, + { + "type": "mintMulti", + "inputQtys": [ + "1802071590571198967185408", + "2995890766359809182662656", + "1913847388084281580453888" + ], + "expectedQty": "6712722940098256230669058", + "reserves": [ + "6345040863655877689025746", + "9128157764358590639425184", + "4185813923122612510795492" + ], + "mAssetSupply": "19650324263797347548904326" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "140911284962372054155264", + "116115707101534039834624", + "38768748294126889336832" + ], + "expectedQty": "295608507425540771077952", + "swapFee": "177471587407769124121", + "reserves": [ + "6204129578693505634870482", + "9012042057257056599590560", + "4147045174828485621458660" + ], + "mAssetSupply": "19354715756371806777826374" + }, + { + "type": "mintMulti", + "inputQtys": [ + "174406769436154170179584", + "118122564071653933842432", + "138708871441596488351744" + ], + "expectedQty": "431523903857727688330515", + "reserves": [ + "6378536348129659805050066", + "9130164621328710533432992", + "4285754046270082109810404" + ], + "mAssetSupply": "19786239660229534466156889" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "53817702002959725887488", + "expectedQty": "53948699166610223651719", + "swapFee": "32290621201775835532", + "reserves": [ + "6378536348129659805050066", + "9076215922162100309781273", + "4285754046270082109810404" + ], + "mAssetSupply": "19732454248847776516104933" + }, + { + "type": "mintMulti", + "inputQtys": [ + "1236476077785970791940096", + "358568127347979725045760", + "696304851269978261815296" + ], + "expectedQty": "2292940671745915206514659", + "reserves": [ + "7615012425915630596990162", + "9434784049510080034827033", + "4982058897540060371625700" + ], + "mAssetSupply": "22025394920593691722619592" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "7263531728532696727552", + "expectedQty": "7259022494168841830801", + "reserves": [ + "7622275957644163293717714", + "9434784049510080034827033", + "4982058897540060371625700" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "1209388782657806794752", + "12265166644408588697600", + "9401440672641821179904" + ], + "expectedQty": "22884877409265884664415", + "swapFee": "13739169947528047627", + "reserves": [ + "7621066568861505486922962", + "9422518882865671446129433", + "4972657456867418550445796" + ], + "mAssetSupply": "22009769065678594679785978" + }, + { + "type": "mintMulti", + "inputQtys": [ + "263779017474432105971712", + "104367976867117236486144", + "6104698527473364631552" + ], + "expectedQty": "373848186987529270657346", + "reserves": [ + "7884845586335937592894674", + "9526886859732788682615577", + "4978762155394891915077348" + ], + "mAssetSupply": "22383617252666123950443324" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "4045521662060541155213312", + "expectedQty": "4037134476925053548950509", + "swapFee": "2427312997236324693127", + "reserves": [ + "3847711109410884043944165", + "9526886859732788682615577", + "4978762155394891915077348" + ], + "mAssetSupply": "18340522903602819119923139" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "20891515792420679712768", + "13368296839699830407168", + "6429070069085478322176" + ], + "expectedQty": "40753795668836143367188", + "swapFee": "24466957575847194336", + "reserves": [ + "3826819593618463364231397", + "9513518562893088852208409", + "4972333085325806436755172" + ], + "mAssetSupply": "18299769107933982976555951" + }, + { + "type": "mintMulti", + "inputQtys": [ + "883075050254733521453056", + "842807633757021317103616", + "453325422878400566001664" + ], + "expectedQty": "2180606483310042338169728", + "reserves": [ + "4709894643873196885684453", + "10356326196650110169312025", + "5425658508204207002756836" + ], + "mAssetSupply": "20480375591244025314725679" + }, + { + "type": "mintMulti", + "inputQtys": [ + "8393947988211931283456", + "31382033405201799446528", + "82243572855215889580032" + ], + "expectedQty": "122089812273259038238575", + "reserves": [ + "4718288591861408816967909", + "10387708230055311968758553", + "5507902081059422892336868" + ], + "mAssetSupply": "20602465403517284352964254" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "36114743852477370597376", + "expectedQty": "36234043301964027691085", + "swapFee": "21668846311486422358", + "reserves": [ + "4718288591861408816967909", + "10351474186753347941067468", + "5507902081059422892336868" + ], + "mAssetSupply": "20566372328511118468789236" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "327876993807676879142912", + "expectedQty": "326978007277115306803163", + "swapFee": "196726196284606127485", + "reserves": [ + "4718288591861408816967909", + "10351474186753347941067468", + "5180924073782307585533705" + ], + "mAssetSupply": "20238692060899726195773809" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "80008315554733909606400", + "75827299962386395430912", + "61541726049709550731264" + ], + "expectedQty": "217518002067766180418981", + "swapFee": "130589154733499808136", + "reserves": [ + "4638280276306674907361509", + "10275646886790961545636556", + "5119382347732598034802441" + ], + "mAssetSupply": "20021174058831960015354828" + }, + { + "type": "redeemMasset", + "inputQty": "7237674554496620324454", + "expectedQtys": [ + "1676239960997899396868", + "3713542285214809538190", + "1850106667924274330053" + ], + "redemptionFee": "2171302366348986097", + "reserves": [ + "4636604036345677007964641", + "10271933344505746736098366", + "5117532241064673760472388" + ], + "mAssetSupply": "20013938555579829744016471" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "6007342313783044341760", + "8593966818053238816768", + "1506068400269188661248" + ], + "expectedQty": "16098549326745974820787", + "swapFee": "9664928553179492588", + "reserves": [ + "4630596694031893963622881", + "10263339377687693497281598", + "5116026172664404571811140" + ], + "mAssetSupply": "19997840006253083769195684" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "5227147015007544", + "expectedQty": "5245623600779992", + "swapFee": "3136288209004", + "reserves": [ + "4630596694031893963622881", + "10263339372442069896501606", + "5116026172664404571811140" + ], + "mAssetSupply": "19997840001029073042397144" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "317822177339211", + "outputIndex": 2, + "expectedQty": "318066175115405", + "swapFee": "191420795708", + "reserves": [ + "4630596694349716140962092", + "10263339372442069896501606", + "5116026172346338396695735" + ], + "mAssetSupply": "19997840001029264463192852", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "1388503086446213595136", + "expectedQty": "1382393839086573122138", + "swapFee": "833101851867728157", + "reserves": [ + "4629214300510629567839954", + "10263339372442069896501606", + "5116026172346338396695735" + ], + "mAssetSupply": "19996452331044670117325873" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "8094929841515997954048", + "expectedQty": "8059219577740304847218", + "swapFee": "4856957904909598772", + "reserves": [ + "4621155080932889262992736", + "10263339372442069896501606", + "5116026172346338396695735" + ], + "mAssetSupply": "19988362258161059028970597" + }, + { + "type": "mintMulti", + "inputQtys": [ + "511714135324754640896", + "1756725139914169778176", + "1672650599959820763136" + ], + "expectedQty": "3939877981345786621866", + "reserves": [ + "4621666795068214017633632", + "10265096097581984066279782", + "5117698822946298217458871" + ], + "mAssetSupply": "19992302136142404815592463" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "3122707143627501444530176", + "expectedQty": "3130461333317285834468225", + "swapFee": "1873624286176500866718", + "reserves": [ + "4621666795068214017633632", + "7134634764264698231811557", + "5117698822946298217458871" + ], + "mAssetSupply": "16871468616801079871929005" + }, + { + "type": "redeemMasset", + "inputQty": "278155086410087672053760", + "expectedQtys": [ + "76173242169506040958308", + "117591398468891594188165", + "84348727218256898992097" + ], + "redemptionFee": "83446525923026301616", + "reserves": [ + "4545493552898707976675324", + "7017043365795806637623392", + "5033350095728041318466774" + ], + "mAssetSupply": "16593396976916915226176861" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "138939518989627780235264", + "expectedQty": "139026274306390636745134", + "reserves": [ + "4545493552898707976675324", + "7017043365795806637623392", + "5172289614717669098702038" + ] + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "208061533676269174784", + "expectedQty": "207661104072782567184", + "reserves": [ + "4545493552898707976675324", + "7017251427329482906798176", + "5172289614717669098702038" + ] + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "5903681829135909388288", + "expectedQty": "5896944398863468087062", + "swapFee": "3542209097481545632", + "reserves": [ + "4545493552898707976675324", + "7017251427329482906798176", + "5166392670318805630614976" + ], + "mAssetSupply": "16726730772707340217646523" + }, + { + "type": "mintMulti", + "inputQtys": [ + "292506689826341768921088", + "297655506341376737411072", + "222776460097723348025344" + ], + "expectedQty": "813012993426418529667190", + "reserves": [ + "4838000242725049745596412", + "7314906933670859644209248", + "5389169130416528978640320" + ], + "mAssetSupply": "17539743766133758747313713" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "31173313736418800", + "2505002658599088", + "83633008923935264" + ], + "expectedQty": "117409200465877838", + "swapFee": "70487812967307", + "reserves": [ + "4838000211551736009177612", + "7314906931165856985610160", + "5389169046783520054705056" + ], + "mAssetSupply": "17539743648724558281435875" + }, + { + "type": "redeemMasset", + "inputQty": "190793423507277004", + "expectedQtys": [ + "52610900374875260", + "79546056837318108", + "58604593515044594" + ], + "redemptionFee": "57238027052183", + "reserves": [ + "4838000158940835634302352", + "7314906851619800148292052", + "5389168988178926539660462" + ], + "mAssetSupply": "17539743457988372801211054" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "1944128800000415851610112", + "outputIndex": 1, + "expectedQty": "1944401022949055055850227", + "swapFee": "1167071999164112806537", + "reserves": [ + "6782128958941251485912464", + "5370505828670745092441825", + "5389168988178926539660462" + ], + "mAssetSupply": "17540910529987536914017591", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "39569948875611791425536", + "expectedQty": "39517798158268754381477", + "swapFee": "23741969325367074855", + "reserves": [ + "6782128958941251485912464", + "5330988030512476338060348", + "5389168988178926539660462" + ], + "mAssetSupply": "17501364323081250489666910" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "1729315072275292094464", + "expectedQty": "1726994532369377679057", + "swapFee": "1037589043365175256", + "reserves": [ + "6782128958941251485912464", + "5329261035980106960381291", + "5389168988178926539660462" + ], + "mAssetSupply": "17499636045598018562747702" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "41612799691485986816", + "expectedQty": "41639060657891671960", + "swapFee": "24967679814891592", + "reserves": [ + "6782087319880593594240504", + "5329261035980106960381291", + "5389168988178926539660462" + ], + "mAssetSupply": "17499594457766006891652478" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "10637499324804719815163904", + "outputIndex": 2, + "hardLimitError": true + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "22257205270709094318080", + "outputIndex": 0, + "expectedQty": "22287105587323414346728", + "swapFee": "13364083683661679002", + "reserves": [ + "6759800214293270179893776", + "5351518241250816054699371", + "5389168988178926539660462" + ], + "mAssetSupply": "17499607821849690553331480", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "649407180015115882725376", + "outputIndex": 2, + "expectedQty": "647189933961586012640077", + "swapFee": "389083342349058766953", + "reserves": [ + "7409207394308386062619152", + "5351518241250816054699371", + "4741979054217340527020385" + ], + "mAssetSupply": "17499996905192039612098433", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemMasset", + "inputQty": "3342283925090307198156", + "expectedQtys": [ + "1414642859844208376792", + "1021767466669512941638", + "905387911766712254270" + ], + "redemptionFee": "1002685177527092159", + "reserves": [ + "7407792751448541854242360", + "5350496473784146541757733", + "4741073666305573814766115" + ], + "mAssetSupply": "17496655623952126831992436" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "4963570519173841033363456", + "outputIndex": 2, + "hardLimitError": true + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "104250687031708915597312", + "expectedQty": "104115778124662355364085", + "swapFee": "62550412219025349358", + "reserves": [ + "7407792751448541854242360", + "5246380695659484186393648", + "4741073666305573814766115" + ], + "mAssetSupply": "17392467487332636941744482" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "29231274848572294561792", + "expectedQty": "29160917986223099997347", + "swapFee": "17538764909143376737", + "reserves": [ + "7407792751448541854242360", + "5246380695659484186393648", + "4711912748319350714768768" + ], + "mAssetSupply": "17363253751248973790559427" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "5245998798399087711354880", + "expectedQty": "5242206481364809558069864", + "reserves": [ + "7407792751448541854242360", + "5246380695659484186393648", + "9957911546718438426123648" + ] + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "250722587260250976", + "outputIndex": 0, + "expectedQty": "249976415225203016", + "swapFee": "150055874081940", + "reserves": [ + "7407792501472126629039344", + "5246380695659484186393648", + "9957911797441025686374624" + ], + "mAssetSupply": "22605460232763839222711231", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemBassets", + "inputQtys": [ + "1446209611947401969401856", + "1030120406313229122273280", + "614461453308110382825472" + ], + "expectedQty": "3093462429123324956597848", + "swapFee": "1857191772537517484449", + "reserves": [ + "5961582889524724659637488", + "4216260289346255064120368", + "9343450344132915303549152" + ], + "mAssetSupply": "19511997803640514266113383" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "5418042696656833478656", + "expectedQty": "5399566541231053781176", + "reserves": [ + "5961582889524724659637488", + "4216260289346255064120368", + "9348868386829572137027808" + ] + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "28739037058119403307008", + "expectedQty": "28640710299809214259332", + "reserves": [ + "5961582889524724659637488", + "4216260289346255064120368", + "9377607423887691540334816" + ] + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "15912835714833591566336", + "outputIndex": 2, + "expectedQty": "15964431724471288489937", + "swapFee": "9551643157259816261", + "reserves": [ + "5977495725239558251203824", + "4216260289346255064120368", + "9361642992163220251844879" + ], + "mAssetSupply": "19546047632124711793970152", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "1312895222920114339840", + "expectedQty": "1308413115327115839088", + "reserves": [ + "5977495725239558251203824", + "4216260289346255064120368", + "9362955887386140366184719" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "38041933215196577792", + "43935902526048763904", + "35896251009242992640" + ], + "expectedQty": "117977533668247959349", + "swapFee": "70829017611515685", + "reserves": [ + "5977457683306343054626032", + "4216216353443729015356464", + "9362919991135131123192079" + ], + "mAssetSupply": "19547238067706370661849891" + }, + { + "type": "mintMulti", + "inputQtys": [ + "52540151757604962304", + "179372119354980794368", + "136753625980771221504" + ], + "expectedQty": "369080850523033310493", + "reserves": [ + "5977510223458100659588336", + "4216395725563083996150832", + "9363056744761111894413583" + ], + "mAssetSupply": "19547607148556893695160384" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "3435154477113481006940160", + "expectedQty": "3418539695862410350414160", + "swapFee": "2061092686268088604164", + "reserves": [ + "2558970527595690309174176", + "4216395725563083996150832", + "9363056744761111894413583" + ], + "mAssetSupply": "16114513764129680776824388" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "93001376467468", + "840958550645088", + "241203443890433" + ], + "expectedQty": "1176340532367936", + "swapFee": "706228056254", + "reserves": [ + "2558970527502688932706708", + "4216395724722125445505744", + "9363056744519908450523150" + ], + "mAssetSupply": "16114513762953340244456452" + }, + { + "type": "redeemMasset", + "inputQty": "76265462422024395056742", + "expectedQtys": [ + "12107254686869690986935", + "19949028857967430854267", + "44299420972286447838673" + ], + "redemptionFee": "22879638726607318517", + "reserves": [ + "2546863272815819241719773", + "4196446695864158014651477", + "9318757323547622002684477" + ], + "mAssetSupply": "16038271180170042456718227" + }, + { + "type": "redeemMasset", + "inputQty": "268854945108710161540710", + "expectedQtys": [ + "42681119223313052043408", + "70325346339630078392590", + "156166605637891492686078" + ], + "redemptionFee": "80656483532613048462", + "reserves": [ + "2504182153592506189676365", + "4126121349524527936258887", + "9162590717909730509998399" + ], + "mAssetSupply": "15769496891544864908225979" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "847272619888325", + "97927373818426624", + "212047361724904864" + ], + "expectedQty": "309577791719927476", + "swapFee": "185858189945924", + "reserves": [ + "2504182152745233569788040", + "4126121251597154117832263", + "9162590505862368785093535" + ], + "mAssetSupply": "15769496581967073188298503" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "190812112053754488946688", + "expectedQty": "189487802819330244780296", + "reserves": [ + "2504182152745233569788040", + "4126121251597154117832263", + "9353402617916123274040223" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "12791337809796847894528", + "56113556469454299201536", + "49325247196271095054336" + ], + "expectedQty": "118170901210144804379706", + "swapFee": "70945107790761339431", + "reserves": [ + "2491390814935436721893512", + "4070007695127699818630727", + "9304077370719852178985887" + ], + "mAssetSupply": "15840813483576258628699093" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "1200371397690996293632", + "expectedQty": "1208201743541034387500", + "swapFee": "720222838614597776", + "reserves": [ + "2491390814935436721893512", + "4070007695127699818630727", + "9302869168976311144598387" + ], + "mAssetSupply": "15839613832401406247003237" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "121603501128308429422592", + "expectedQty": "121232027360046131587790", + "swapFee": "72962100676985057653", + "reserves": [ + "2491390814935436721893512", + "3948775667767653687042937", + "9302869168976311144598387" + ], + "mAssetSupply": "15718083293373774802638298" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "154949293648929743699968", + "expectedQty": "156786120207749520872336", + "reserves": [ + "2646340108584366465593480", + "3948775667767653687042937", + "9302869168976311144598387" + ] + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "114937870572312380571648", + "expectedQty": "116152211221470810668732", + "reserves": [ + "2761277979156678846165128", + "3948775667767653687042937", + "9302869168976311144598387" + ] + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "1580024902340112547840", + "expectedQty": "1574439537906103369662", + "swapFee": "948014941404067528", + "reserves": [ + "2761277979156678846165128", + "3947201228229747583673275", + "9302869168976311144598387" + ], + "mAssetSupply": "15989442547915596425699054" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "734086628044465774788608", + "expectedQty": "730486709576312811105434", + "swapFee": "440451976826679464873", + "reserves": [ + "2761277979156678846165128", + "3216714518653434772567841", + "9302869168976311144598387" + ], + "mAssetSupply": "15255796371847957330375319" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "132564238362937514786816", + "471555012362947495198720", + "415196388606410613587968" + ], + "expectedQty": "1020578618129310067258180", + "swapFee": "612714799757440504657", + "reserves": [ + "2628713740793741331378312", + "2745159506290487277369121", + "8887672780369900531010419" + ], + "mAssetSupply": "14235217753718647263117139" + }, + { + "type": "mintMulti", + "inputQtys": [ + "17874299603693006", + "6818982472059892", + "10289372645346994" + ], + "expectedQty": "35117977324763119", + "reserves": [ + "2628713758668040935071318", + "2745159513109469749429013", + "8887672790659273176357413" + ], + "mAssetSupply": "14235217788836624587880258" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "684747418057660331720704", + "expectedQty": "676528486321371012286286", + "swapFee": "410848450834596199032", + "reserves": [ + "2628713758668040935071318", + "2068631026788098737142727", + "8887672790659273176357413" + ], + "mAssetSupply": "13550881219229798852358586" + }, + { + "type": "redeemMasset", + "inputQty": "176986574845615430801817", + "expectedQtys": [ + "34323042373277999437842", + "27010057733749520355659", + "116046096227760001414984" + ], + "redemptionFee": "53095972453684629240", + "reserves": [ + "2594390716294762935633476", + "2041620969054349216787068", + "8771626694431513174942429" + ], + "mAssetSupply": "13373947740356637106186009" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "399117728110874638417920", + "expectedQty": "390985028820326034804472", + "swapFee": "239470636866524783050", + "reserves": [ + "2594390716294762935633476", + "1650635940234023181982596", + "8771626694431513174942429" + ], + "mAssetSupply": "12975069482882628992551139" + }, + { + "type": "redeemMasset", + "inputQty": "59293314576997828421222", + "expectedQtys": [ + "11852258369199836349751", + "7540793109636611814122", + "40072447549091801987261" + ], + "redemptionFee": "17787994373099348526", + "reserves": [ + "2582538457925563099283725", + "1643095147124386570168474", + "8731554246882421372955168" + ], + "mAssetSupply": "12915793956300004263478443" + }, + { + "type": "mintMulti", + "inputQtys": [ + "833292494337536585367552", + "321317851300018476023808", + "1528244916707818989420544" + ], + "expectedQty": "2679178321631428870459843", + "reserves": [ + "3415830952263099684651277", + "1964412998424405046192282", + "10259799163590240362375712" + ], + "mAssetSupply": "15594972277931433133938286" + }, + { + "type": "mintMulti", + "inputQtys": [ + "30349652475477644804096", + "3943099881373984882688", + "55929277804567867686912" + ], + "expectedQty": "89877552436644453143883", + "reserves": [ + "3446180604738577329455373", + "1968356098305779031074970", + "10315728441394808230062624" + ], + "mAssetSupply": "15684849830368077587082169" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "6867712825247198609408", + "1736762684727023894528", + "17469410680263822802944" + ], + "expectedQty": "25963395837263402594203", + "swapFee": "15587389936319833456", + "reserves": [ + "3439312891913330130845965", + "1966619335621052007180442", + "10298259030714544407259680" + ], + "mAssetSupply": "15658886434530814184487966" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "2005688343635898112", + "34436429218833564", + "865222577676753536" + ], + "expectedQty": "2908256677956026921", + "swapFee": "1746001607738259", + "reserves": [ + "3439310886224986494947853", + "1966619301184622788346878", + "10298258165491966730506144" + ], + "mAssetSupply": "15658883526274136228461045" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "74404993834545305354240", + "expectedQty": "73915021129882810372782", + "swapFee": "44642996300727183212", + "reserves": [ + "3365395865095103684575071", + "1966619301184622788346878", + "10298258165491966730506144" + ], + "mAssetSupply": "15584523175435891650290017" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "5558592551754578944", + "expectedQty": "5695912571355707952", + "reserves": [ + "3365395865095103684575071", + "1966624859777174542925822", + "10298258165491966730506144" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "26599267344005875105792", + "13991950772787036028928", + "39049959935518240145408" + ], + "expectedQty": "79716830113948808063451", + "swapFee": "47858813356383114706", + "reserves": [ + "3338796597751097809469279", + "1952632909004387506896894", + "10259208205556448490360736" + ], + "mAssetSupply": "15504812041234514197934518" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "154168949070397739892736", + "39972173485864975859712", + "186340656845994443407360" + ], + "expectedQty": "380384251146685263982215", + "swapFee": "228367571230749608154", + "reserves": [ + "3184627648680700069576543", + "1912660735518522531037182", + "10072867548710454046953376" + ], + "mAssetSupply": "15124427790087828933952303" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "6185376649753795789586432", + "outputIndex": 0, + "hardLimitError": true + }, + { + "type": "redeemMasset", + "inputQty": "1099227700399926", + "expectedQtys": [ + "231385992659158", + "138968492310706", + "731865923995273" + ], + "redemptionFee": "329768310119", + "reserves": [ + "3184627648449314076917385", + "1912660735379554038726476", + "10072867547978588122958103" + ], + "mAssetSupply": "15124427788988931001862496" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "83944778146489", + "77544963846111", + "5237051930864" + ], + "expectedQty": "169186450555499", + "swapFee": "101572814021", + "reserves": [ + "3184627648365369298770896", + "1912660735302009074880365", + "10072867547973351071027239" + ], + "mAssetSupply": "15124427788819744551306997" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "206103232040387156639744", + "expectedQty": "210716398321316852833211", + "reserves": [ + "3184627648365369298770896", + "2118763967342396231520109", + "10072867547973351071027239" + ] + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "62639455936348184576", + "expectedQty": "63269106994495664202", + "swapFee": "37583673561808910", + "reserves": [ + "3184627648365369298770896", + "2118763967342396231520109", + "10072804278866356575363037" + ], + "mAssetSupply": "15335081585268798617764542" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "3169319834712187338752", + "expectedQty": "3105003768977479394124", + "swapFee": "1901591900827312403", + "reserves": [ + "3184627648365369298770896", + "2115658963573418752125985", + "10072804278866356575363037" + ], + "mAssetSupply": "15331914167025987257738193" + }, + { + "type": "mintMulti", + "inputQtys": [ + "472719408324707425976320", + "1457707813876788847706112", + "1061637954204897913077760" + ], + "expectedQty": "3004255611204908444004307", + "reserves": [ + "3657347056690076724747216", + "3573366777450207599832097", + "11134442233071254488440797" + ], + "mAssetSupply": "18336169778230895701742500" + }, + { + "type": "redeemMasset", + "inputQty": "125235438217579567513", + "expectedQtys": [ + "24972066579770034341", + "24398656101612231159", + "76025060915191303793" + ], + "redemptionFee": "37570631465273870", + "reserves": [ + "3657322084623496954712875", + "3573342378794105987600938", + "11134366208010339297137004" + ], + "mAssetSupply": "18336044580363309587448857" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "70561428023721276211200", + "expectedQty": "69973749203812239026598", + "swapFee": "42336856814232765726", + "reserves": [ + "3657322084623496954712875", + "3503368629590293748574340", + "11134366208010339297137004" + ], + "mAssetSupply": "18265525489196402544003383" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "304976679816525119488", + "expectedQty": "307414140564391003311", + "reserves": [ + "3657322084623496954712875", + "3503673606270110273693828", + "11134366208010339297137004" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "543305581233904", + "286757252089779", + "274224118752495" + ], + "expectedQty": "1108353797588211", + "reserves": [ + "3657322085166802535946779", + "3503673606556867525783607", + "11134366208284563415889499" + ], + "mAssetSupply": "18265832904445320732594905" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "5067181410053364121600", + "expectedQty": "5107600782380989626430", + "reserves": [ + "3657322085166802535946779", + "3508740787966920889905207", + "11134366208284563415889499" + ] + }, + { + "type": "redeemMasset", + "inputQty": "2154986726423396142284", + "expectedQtys": [ + "431237576487695240557", + "413718244850008025197", + "1312861429093449678053" + ], + "redemptionFee": "646496017927018842", + "reserves": [ + "3656890847590314840706222", + "3508327069722070881880010", + "11133053346855469966211446" + ], + "mAssetSupply": "18268786164997296253097893" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "16163276944260198301696", + "expectedQty": "16276498287385541207717", + "reserves": [ + "3673054124534575039007918", + "3508327069722070881880010", + "11133053346855469966211446" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "1416070010762572884606976", + "662107099757440948764672", + "202789414297593645629440" + ], + "expectedQty": "2290847299407186188731665", + "reserves": [ + "5089124135297147923614894", + "4170434169479511830644682", + "11335842761153063611840886" + ], + "mAssetSupply": "20575909962691867983037275" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "82709566430393", + "expectedQty": "82271469322718", + "reserves": [ + "5089124135297147923614894", + "4170434169479511830644682", + "11335842761235773178271279" + ] + }, + { + "type": "redeemMasset", + "inputQty": "566537791135642521", + "expectedQtys": [ + "140082076432929618", + "114794424847217723", + "312027836204153250" + ], + "redemptionFee": "169961337340692", + "reserves": [ + "5089123995215071490685276", + "4170434054685086983426959", + "11335842449207936974118029" + ], + "mAssetSupply": "20575909396406309654058164" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "2746680885327091466240", + "outputIndex": 0, + "expectedQty": "2753976996473383591100", + "swapFee": "1658186566439262887", + "reserves": [ + "5086370018218598107094176", + "4173180735570414074893199", + "11335842449207936974118029" + ], + "mAssetSupply": "20575911054592876093321051", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mintMulti", + "inputQtys": [ + "820253170228952054104064", + "712875810616501554118656", + "501671338297093821300736" + ], + "expectedQty": "2038340082402764252106759", + "reserves": [ + "5906623188447550161198240", + "4886056546186915629011855", + "11837513787505030795418765" + ], + "mAssetSupply": "22614251136995640345427810" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "234385764832163435380736", + "outputIndex": 2, + "expectedQty": "235710303537104396754675", + "swapFee": "140908807801337541193", + "reserves": [ + "6141008953279713596578976", + "4886056546186915629011855", + "11601803483967926398664090" + ], + "mAssetSupply": "22614392045803441682969003", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "380703105457619059343360", + "expectedQty": "379066408487652758646160", + "reserves": [ + "6141008953279713596578976", + "4886056546186915629011855", + "11982506589425545458007450" + ] + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "3098870529184239104", + "expectedQty": "3114909580670080997", + "reserves": [ + "6141008953279713596578976", + "4886059645057444813250959", + "11982506589425545458007450" + ] + }, + { + "type": "redeemMasset", + "inputQty": "7221663177922792", + "expectedQtys": [ + "1928156559215522", + "1534127050621588", + "3762272429826846" + ], + "redemptionFee": "2166498953376", + "reserves": [ + "6141008951351557037363454", + "4886059643523317762629371", + "11982506585663273028180604" + ], + "mAssetSupply": "22993461561981178432726744" + }, + { + "type": "redeemMasset", + "inputQty": "5980941917458468044", + "expectedQtys": [ + "1596888708918114211", + "1270555626551500770", + "3115893434249321078" + ], + "redemptionFee": "1794282575237540", + "reserves": [ + "6141007354462848119249243", + "4886058372967691211128601", + "11982503469769838778859526" + ], + "mAssetSupply": "22993455582833543549496240" + }, + { + "type": "mintMulti", + "inputQtys": [ + "13039260564271772", + "6997765481415004", + "13110904080333184" + ], + "expectedQty": "33150648741308435", + "reserves": [ + "6141007367502108683521015", + "4886058379965456692543605", + "11982503482880742859192710" + ], + "mAssetSupply": "22993455615984192290804675" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "206418562804494421196800", + "expectedQty": "207429898019372890526947", + "reserves": [ + "6141007367502108683521015", + "5092476942769951113740405", + "11982503482880742859192710" + ] + }, + { + "type": "redeemMasset", + "inputQty": "298826379610281109094", + "expectedQtys": [ + "79072174602292168262", + "65571200599396500758", + "154287814827409060319" + ], + "redemptionFee": "89647913883084332", + "reserves": [ + "6140928295327506391352753", + "5092411371569351717239647", + "11982349195065915450132391" + ], + "mAssetSupply": "23200586777271868783306860" + }, + { + "type": "mintMulti", + "inputQtys": [ + "221646021082455375872", + "1953374297045629927424", + "1474618085018754088960" + ], + "expectedQty": "3652858274955109731801", + "reserves": [ + "6141149941348588846728625", + "5094364745866397347167071", + "11983823813150934204221351" + ], + "mAssetSupply": "23204239635546823893038661" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "951860702466969369051136", + "3004528310103500052758528", + "1739766228998810903773184" + ], + "expectedQty": "5719047580587042614928536", + "swapFee": "3433488641537147857671", + "reserves": [ + "5189289238881619477677489", + "2089836435762897294408543", + "10244057584152123300448167" + ], + "mAssetSupply": "17485192054959781278110125" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "4279261875198459117568", + "expectedQty": "4277796168208948509956", + "reserves": [ + "5193568500756817936795057", + "2089836435762897294408543", + "10244057584152123300448167" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "495688396424291175890944", + "82112750081463524786176", + "110336135150516211548160" + ], + "expectedQty": "688820853113361185346340", + "reserves": [ + "5689256897181109112686001", + "2171949185844360819194719", + "10354393719302639511996327" + ], + "mAssetSupply": "18178290704241351411966421" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "465312485721832427618304", + "outputIndex": 0, + "expectedQty": "461390892867763039261659", + "swapFee": "276904141500572747998", + "reserves": [ + "5227866004313346073424342", + "2171949185844360819194719", + "10819706205024471939614631" + ], + "mAssetSupply": "18178567608382851984714419", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mintMulti", + "inputQtys": [ + "5172154078426675487440896", + "4014685008332744579612672", + "7094127032574059806195712" + ], + "expectedQty": "16291652449629501090915691", + "reserves": [ + "10400020082740021560865238", + "6186634194177105398807391", + "17913833237598531745810343" + ], + "mAssetSupply": "34470220058012353075630110" + }, + { + "type": "redeemMasset", + "inputQty": "331000763172411884018073", + "expectedQtys": [ + "99836376275761965141962", + "59389417941165419609619", + "171966225201648557245393" + ], + "redemptionFee": "99300228951723565205", + "reserves": [ + "10300183706464259595723276", + "6127244776235939979197772", + "17741867012396883188564950" + ], + "mAssetSupply": "34139318595068892915177242" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "398721335564906895769600", + "expectedQty": "400351968061472915669018", + "swapFee": "239232801338944137461", + "reserves": [ + "10300183706464259595723276", + "6127244776235939979197772", + "17341515044335410272895932" + ], + "mAssetSupply": "33740836492305324963545103" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "14750814455396185407488", + "45042924627291608711168", + "25142128653032159707136" + ], + "expectedQty": "85190809138325061708774", + "swapFee": "51145172586546965204", + "reserves": [ + "10285432892008863410315788", + "6082201851608648370486604", + "17316372915682378113188796" + ], + "mAssetSupply": "33655645683166999901836329" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "229922564441678752", + "expectedQty": "227908173759523793", + "swapFee": "137953538665007", + "reserves": [ + "10285432892008863410315788", + "6082201623700474610962811", + "17316372915682378113188796" + ], + "mAssetSupply": "33655645453382388998822584" + }, + { + "type": "mintMulti", + "inputQtys": [ + "424589024180911144960", + "164861443236067737600", + "304795602701659865088" + ], + "expectedQty": "894257104327868141543", + "reserves": [ + "10285857481033044321460748", + "6082366485143710678700411", + "17316677711285079773053884" + ], + "mAssetSupply": "33656539710486716866964127" + }, + { + "type": "redeemMasset", + "inputQty": "1686547260143022637056", + "expectedQtys": [ + "515275207332989456288", + "304699210297913253275", + "867487685344131715948" + ], + "redemptionFee": "505964178042906791", + "reserves": [ + "10285342205825711332004460", + "6082061785933412765447136", + "17315810223599735641337936" + ], + "mAssetSupply": "33654853669190751887233862" + }, + { + "type": "redeemMasset", + "inputQty": "24470290414546571598233", + "expectedQtys": [ + "7476181821186965109187", + "4420912678391618928449", + "12586469465204045747543" + ], + "redemptionFee": "7341087124363971479", + "reserves": [ + "10277866024004524366895273", + "6077640873255021146518687", + "17303223754134531595590393" + ], + "mAssetSupply": "33630390719863329679607108" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "38306549010262474752", + "expectedQty": "38621934518885039670", + "reserves": [ + "10277866024004524366895273", + "6077679179804031408993439", + "17303223754134531595590393" + ] + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "1039789924306180224", + "expectedQty": "1043982312691483766", + "swapFee": "623873954583708", + "reserves": [ + "10277866024004524366895273", + "6077679179804031408993439", + "17303222710152218904106627" + ], + "mAssetSupply": "33630428302631798213050262" + }, + { + "type": "mintMulti", + "inputQtys": [ + "596768551747695149056", + "394957366695340670976", + "1519784107008912523264" + ], + "expectedQty": "2507834489157692198521", + "reserves": [ + "10278462792556272062044329", + "6078074137170726749664415", + "17304742494259227816629891" + ], + "mAssetSupply": "33632936137120955905248783" + }, + { + "type": "mintMulti", + "inputQtys": [ + "133395083220264733900800", + "199509639965419163877376", + "107210575108671618940928" + ], + "expectedQty": "441247367387388909393055", + "reserves": [ + "10411857875776536795945129", + "6277583777136145913541791", + "17411953069367899435570819" + ], + "mAssetSupply": "34074183504508344814641838" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "2632654538819476947730432", + "expectedQty": "2594999603409184792806562", + "swapFee": "1579592723291686168638", + "reserves": [ + "10411857875776536795945129", + "3682584173726961120735229", + "17411953069367899435570819" + ], + "mAssetSupply": "31443108558412159553080044" + }, + { + "type": "redeemMasset", + "inputQty": "48981861915331742872371", + "expectedQtys": [ + "16214655944426949217429", + "5734983715278676844348", + "27116085496821347697506" + ], + "redemptionFee": "14694558574599522861", + "reserves": [ + "10395643219832109846727700", + "3676849190011682443890881", + "17384836983871078087873313" + ], + "mAssetSupply": "31394141391055402409730534" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "19650540925058842624", + "81957524576380715008", + "303233921131180608" + ], + "expectedQty": "103849064336614185507", + "swapFee": "62346846709994508", + "reserves": [ + "10395623569291184787885076", + "3676767232487106063175873", + "17384836680637156956692705" + ], + "mAssetSupply": "31394037541991065795545027" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "9341312046229462450176", + "expectedQty": "9115253378517400629254", + "swapFee": "5604787227737677470", + "reserves": [ + "10395623569291184787885076", + "3667651979108588662546619", + "17384836680637156956692705" + ], + "mAssetSupply": "31384701834732064070772321" + }, + { + "type": "redeemMasset", + "inputQty": "13714401941560624152576", + "expectedQtys": [ + "4541288615228243367668", + "1602199816713912851311", + "7594499778598945794189" + ], + "redemptionFee": "4114320582468187245", + "reserves": [ + "10391082280675956544517408", + "3666049779291874749695308", + "17377242180858558010898516" + ], + "mAssetSupply": "31370991547111085914806990" + }, + { + "type": "redeemMasset", + "inputQty": "230649156919659234276147", + "expectedQtys": [ + "76375506193750044851908", + "26945836830260220989301", + "127724488360814050897297" + ], + "redemptionFee": "69194747075897770282", + "reserves": [ + "10314706774482206499665500", + "3639103942461614528706007", + "17249517692497743960001219" + ], + "mAssetSupply": "31140411584938502578301125" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "835772391560836013883392", + "outputIndex": 1, + "expectedQty": "807072018709664894328725", + "swapFee": "500326782390186907792", + "reserves": [ + "11150479166043042513548892", + "2832031923751949634377282", + "17249517692497743960001219" + ], + "mAssetSupply": "31140911911720892765208917", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mintMulti", + "inputQtys": [ + "5579074947080022", + "39440124293242720", + "50253750763403080" + ], + "expectedQty": "96420893216218442", + "reserves": [ + "11150479171622117460628914", + "2832031963192073927620002", + "17249517742751494723404299" + ], + "mAssetSupply": "31140912008141785981427359" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "92397429705222544", + "3665257657306858", + "126487441576653072" + ], + "expectedQty": "221123596649525797", + "swapFee": "132753810275881", + "reserves": [ + "11150479079224687755406370", + "2832031959526816270313144", + "17249517616264053146751227" + ], + "mAssetSupply": "31140911787018189331901562" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "25803555971909514428416", + "146579297352290222080", + "1771088137288265236480" + ], + "expectedQty": "27606825286745083594667", + "swapFee": "16574039595804532876", + "reserves": [ + "11124675523252778240977954", + "2831885380229463980091064", + "17247746528126764881514747" + ], + "mAssetSupply": "31113304961731444248306895" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "728161574294033025466368", + "expectedQty": "730388270912977507761812", + "swapFee": "436896944576419815279", + "reserves": [ + "10394287252339800733216142", + "2831885380229463980091064", + "17247746528126764881514747" + ], + "mAssetSupply": "30385580284381987642655806" + }, + { + "type": "mintMulti", + "inputQtys": [ + "46582871979172516855808", + "107065368104491745804288", + "110913101488224590626816" + ], + "expectedQty": "267523393963731121458147", + "reserves": [ + "10440870124318973250071950", + "2938950748333955725895352", + "17358659629614989472141563" + ], + "mAssetSupply": "30653103678345718764113953" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "116695149910108352", + "1068553358914128384", + "1127234116231562880" + ], + "expectedQty": "2341855668651449492", + "swapFee": "1405956975376095", + "reserves": [ + "10440870007623823339963598", + "2938949679780596811766968", + "17358658502380873240578683" + ], + "mAssetSupply": "30653101336490050112664461" + }, + { + "type": "redeemMasset", + "inputQty": "912524658100248929894", + "expectedQtys": [ + "310725266067531622956", + "87464542757653201805", + "516601947710222890006" + ], + "redemptionFee": "273757397430074678", + "reserves": [ + "10440559282357755808340642", + "2938862215237839158565163", + "17358141900433163017688677" + ], + "mAssetSupply": "30652189085589347293809245" + }, + { + "type": "mintMulti", + "inputQtys": [ + "1348430301170171136", + "1717494406639789056", + "2746868376071871488" + ], + "expectedQty": "5847575224282987866", + "reserves": [ + "10440560630788056978511778", + "2938863932732245798354219", + "17358144647301539089560165" + ], + "mAssetSupply": "30652194933164571576797111" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "658903375009563017216", + "outputIndex": 0, + "expectedQty": "685513241404603539815", + "swapFee": "410287144474276512", + "reserves": [ + "10439875117546652374971963", + "2939522836107255361371435", + "17358144647301539089560165" + ], + "mAssetSupply": "30652195343451716051073623", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "556624967154045158424576", + "expectedQty": "551245709229444121602882", + "reserves": [ + "10439875117546652374971963", + "2939522836107255361371435", + "17914769614455584247984741" + ] + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "2024114925692976384442368", + "expectedQty": "2002656501955419421024471", + "reserves": [ + "10439875117546652374971963", + "2939522836107255361371435", + "19938884540148560632427109" + ] + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "95071181241155443490816", + "expectedQty": "93989071660789321872935", + "reserves": [ + "10439875117546652374971963", + "2939522836107255361371435", + "20033955721389716075917925" + ] + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "25599692057794696", + "outputIndex": 1, + "expectedQty": "24156169488509356", + "swapFee": "15184444020244", + "reserves": [ + "10439875117546652374971963", + "2939522811951085872862079", + "20033955746989408133712621" + ], + "mAssetSupply": "33300086626312553359594155", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "188390261120588752879616", + "expectedQty": "186226059375809970682036", + "reserves": [ + "10439875117546652374971963", + "2939522811951085872862079", + "20222346008109996886592237" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "1102033837188967594721280", + "542861498421071006662656", + "438191707112841783803904" + ], + "expectedQty": "2105809268849842666852156", + "swapFee": "1264244107774570342316", + "reserves": [ + "9337841280357684780250683", + "2396661313530014866199423", + "19784154300997155102788333" + ], + "mAssetSupply": "31380503416838520663424035" + }, + { + "type": "mintMulti", + "inputQtys": [ + "1305266532781833472", + "954437676413168256", + "296268288102226304" + ], + "expectedQty": "2612789173954207524", + "reserves": [ + "9337842585624217562084155", + "2396662267967691279367679", + "19784154597265443205014637" + ], + "mAssetSupply": "31380506029627694617631559" + }, + { + "type": "mintMulti", + "inputQtys": [ + "473889408995926608969728", + "491068587070567611367424", + "361812222647455499419648" + ], + "expectedQty": "1349014559133792677520434", + "reserves": [ + "9811731994620144171053883", + "2887730855038258890735103", + "20145966819912898704434285" + ], + "mAssetSupply": "32729520588761487295151993" + }, + { + "type": "redeemMasset", + "inputQty": "9523658104895084848742", + "expectedQtys": [ + "2854167924824999386137", + "840021801094533022766", + "5860328466320911789551" + ], + "redemptionFee": "2857097431468525454", + "reserves": [ + "9808877826695319171667746", + "2886890833237164357712337", + "20140106491446577792644734" + ], + "mAssetSupply": "32719999787754023678828705" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "6084965590449611941609472", + "expectedQty": "6176026383160945554208732", + "reserves": [ + "9808877826695319171667746", + "8971856423686776299321809", + "20140106491446577792644734" + ] + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "225713476212111469182976", + "expectedQty": "226530202854954278579935", + "swapFee": "135428085727266881509", + "reserves": [ + "9808877826695319171667746", + "8971856423686776299321809", + "19913576288591623514064799" + ], + "mAssetSupply": "38670448122788585030735970" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "37484207042197970747392", + "14060652705568335593472", + "28840360312761841876992" + ], + "expectedQty": "80414435339099821222400", + "swapFee": "48277627780127969515", + "reserves": [ + "9771393619653121200920354", + "8957795770981207963728337", + "19884735928278861672187807" + ], + "mAssetSupply": "38590033687449485209513570" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "412525713389432495669248", + "367369514437379385982976", + "219112533068339709214720" + ], + "expectedQty": "1000613440147831181550716", + "swapFee": "600728501189412356344", + "reserves": [ + "9358867906263688705251106", + "8590426256543828577745361", + "19665623395210521962973087" + ], + "mAssetSupply": "37589420247301654027962854" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "3059780703429210112", + "outputIndex": 2, + "expectedQty": "3083817992143633834", + "swapFee": "1843270290964837", + "reserves": [ + "9358867906263688705251106", + "8590429316324532006955473", + "19665620311392529819339253" + ], + "mAssetSupply": "37589420249144924318927691", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "216056494244446018207744", + "outputIndex": 0, + "expectedQty": "214326016103250200520107", + "swapFee": "129059477902837636570", + "reserves": [ + "9144541890160438504730999", + "8590429316324532006955473", + "19881676805636975837546997" + ], + "mAssetSupply": "37589549308622827156564261", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "233967763712080177266688", + "expectedQty": "232892915316509905767925", + "reserves": [ + "9144541890160438504730999", + "8590429316324532006955473", + "20115644569349056014813685" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "14451298704449167425536", + "288624929860885625700352", + "237734528662029778026496" + ], + "expectedQty": "540990344169695801807994", + "swapFee": "324789079949787353496", + "reserves": [ + "9130090591455989337305463", + "8301804386463646381255121", + "19877910040687026236787189" + ], + "mAssetSupply": "37281451879769641260524192" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "1806107151839171302129664", + "expectedQty": "1793944436864383113081573", + "swapFee": "1083664291103502781277", + "reserves": [ + "9130090591455989337305463", + "6507859949599263268173548", + "19877910040687026236787189" + ], + "mAssetSupply": "35476428392221573461175805" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "2198594794391619288170496", + "expectedQty": "2168902307749953505214718", + "swapFee": "1319156876634971572902", + "reserves": [ + "9130090591455989337305463", + "4338957641849309762958830", + "19877910040687026236787189" + ], + "mAssetSupply": "33279152754706589144578211" + }, + { + "type": "mintMulti", + "inputQtys": [ + "175598312627810729984", + "385080473767243087872", + "26197796342312808448" + ], + "expectedQty": "594590260540373805637", + "reserves": [ + "9130266189768617148035447", + "4339342722323077006046702", + "19877936238483368549595637" + ], + "mAssetSupply": "33279747344967129518383848" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "8970473810572112560128", + "outputIndex": 0, + "expectedQty": "8881374213066147029732", + "swapFee": "5337681389573472347", + "reserves": [ + "9121384815555551001005715", + "4339342722323077006046702", + "19886906712293940662155765" + ], + "mAssetSupply": "33279752682648519091856195", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemMasset", + "inputQty": "7613107378639332", + "expectedQtys": [ + "2085990544463898", + "992374301818429", + "4547982592482496" + ], + "redemptionFee": "2283932213591", + "reserves": [ + "9121384813469560456541817", + "4339342721330702704228273", + "19886906707745958069673269" + ], + "mAssetSupply": "33279752675037695645430454" + }, + { + "type": "redeemMasset", + "inputQty": "21833630412031547801", + "expectedQtys": [ + "5982412216935960976", + "2846030229009323107", + "13043159134104232672" + ], + "redemptionFee": "6550089123609464", + "reserves": [ + "9121378831057343520580841", + "4339339875300473694905166", + "19886893664586823965440597" + ], + "mAssetSupply": "33279730847957372737492117" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "1682878842708978565120", + "outputIndex": 0, + "expectedQty": "1713866521408532902041", + "swapFee": "1030037686299551437", + "reserves": [ + "9119664964535934987678800", + "4341022754143182673470286", + "19886893664586823965440597" + ], + "mAssetSupply": "33279731877995059037043554", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemMasset", + "inputQty": "758745383304490490265", + "expectedQtys": [ + "207857078397692734995", + "98941387698229196098", + "453265731976037258546" + ], + "redemptionFee": "227623614991347147", + "reserves": [ + "9119457107457537294943805", + "4340923812755484444274188", + "19886440398854847928182051" + ], + "mAssetSupply": "33278973360235369537900436" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "338777404326429851648", + "expectedQty": "339140027297089669488", + "reserves": [ + "9119795884861863724795453", + "4340923812755484444274188", + "19886440398854847928182051" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "17709189263418787364864", + "17148090207028570488832", + "6752253131143993360384" + ], + "expectedQty": "41918424983120596804701", + "swapFee": "25166154682681967263", + "reserves": [ + "9102086695598444937430589", + "4323775722548455873785356", + "19879688145723703934821667" + ], + "mAssetSupply": "33237394075279546030765223" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "13677724670696175435776", + "9335504055252731035648", + "13281008782139048591360" + ], + "expectedQty": "36387619468623397217354", + "swapFee": "21845679088627214659", + "reserves": [ + "9088408970927748761994813", + "4314440218493203142749708", + "19866407136941564886230307" + ], + "mAssetSupply": "33201006455810922633547869" + }, + { + "type": "redeemMasset", + "inputQty": "155194957652960946946048", + "expectedQtys": [ + "42470161399445128817289", + "20161391615826343872938", + "92835777992819417341958" + ], + "redemptionFee": "46558487295888284083", + "reserves": [ + "9045938809528303633177524", + "4294278826877376798876770", + "19773571358948745468888349" + ], + "mAssetSupply": "33045858056645257574885904" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "77453350361358609154048", + "expectedQty": "77319031008216132604620", + "swapFee": "46472010216815165492", + "reserves": [ + "8968619778520087500572904", + "4294278826877376798876770", + "19773571358948745468888349" + ], + "mAssetSupply": "32968451178294115780897348" + }, + { + "type": "redeemMasset", + "inputQty": "661263440372279908761", + "expectedQtys": [ + "179833779632556072319", + "86106492560090183925", + "396488664045091175593" + ], + "redemptionFee": "198379032111683972", + "reserves": [ + "8968439944740454944500585", + "4294192720384816708692845", + "19773174870284700377712756" + ], + "mAssetSupply": "32967790113232775612672559" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "13430113379481432", + "expectedQty": "13535424451267188", + "swapFee": "8058068027688", + "reserves": [ + "8968439944740454944500585", + "4294192720384816708692845", + "19773174856749275926445568" + ], + "mAssetSupply": "32967790099810720301218815" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "438043472992642138112", + "1624800837080475238400", + "297736223467806130176" + ], + "expectedQty": "2391511147490143575993", + "swapFee": "1435768149383716375", + "reserves": [ + "8968001901267462302362473", + "4292567919547736233454445", + "19772877120525808120315392" + ], + "mAssetSupply": "32965398588663230157642822" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "380292706830390784", + "expectedQty": "379613278315994425", + "swapFee": "228175624098234", + "reserves": [ + "8968001521654183986368048", + "4292567919547736233454445", + "19772877120525808120315392" + ], + "mAssetSupply": "32965398208598698951350272" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "83777527947151420686336", + "expectedQty": "83872277344423662767643", + "reserves": [ + "9051779049601335407054384", + "4292567919547736233454445", + "19772877120525808120315392" + ] + }, + { + "type": "redeemMasset", + "inputQty": "76692220884607161073664", + "expectedQtys": [ + "20998732127971795695727", + "9958095904658437220000", + "45870027071806452308132" + ], + "redemptionFee": "23007666265382148322", + "reserves": [ + "9030780317473363611358657", + "4282609823643077796234445", + "19727007093454001668007260" + ], + "mAssetSupply": "32972601272724780835192573" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "207314314133973225177088", + "expectedQty": "202855189288055103260310", + "swapFee": "124388588480383935106", + "reserves": [ + "9030780317473363611358657", + "4079754634355022692974135", + "19727007093454001668007260" + ], + "mAssetSupply": "32765411347179287993950591" + }, + { + "type": "mintMulti", + "inputQtys": [ + "1245595266112300544", + "1757482043558545664", + "1433765459706231552" + ], + "expectedQty": "4464957586363489901", + "reserves": [ + "9030781563068629723659201", + "4079756391837066251519799", + "19727008527219461374238812" + ], + "mAssetSupply": "32765415812136874357440492" + }, + { + "type": "mintMulti", + "inputQtys": [ + "198843167129808381411328", + "54405808556659689127936", + "122979367454648439930880" + ], + "expectedQty": "376544263103104567785975", + "reserves": [ + "9229624730198438105070529", + "4134162200393725940647735", + "19849987894674109814169692" + ], + "mAssetSupply": "33141960075239978925226467" + }, + { + "type": "redeemMasset", + "inputQty": "1808937989750720036864", + "expectedQtys": [ + "503615658882727009667", + "225581091468123742553", + "1083117139062221141161" + ], + "redemptionFee": "542681396925216011", + "reserves": [ + "9229121114539555378060862", + "4133936619302257816905182", + "19848904777535047593028531" + ], + "mAssetSupply": "33140151679931625130405614" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "539176217414247232", + "expectedQty": "538453217466573347", + "swapFee": "323505730448548", + "reserves": [ + "9229120576086337911487515", + "4133936619302257816905182", + "19848904777535047593028531" + ], + "mAssetSupply": "33140151141078913446606930" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "439637499793008558080", + "expectedQty": "435857013618459723196", + "reserves": [ + "9229120576086337911487515", + "4133936619302257816905182", + "19849344415034840601586611" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "5631589388506665844736", + "130824371048313585664", + "7292112653205872050176" + ], + "expectedQty": "12998894851308831157430", + "reserves": [ + "9234752165474844577332251", + "4134067443673306130490846", + "19856636527688046473636787" + ], + "mAssetSupply": "33153585892943840737487556" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "481095468293444730880", + "expectedQty": "481450355954055308024", + "reserves": [ + "9235233260943138022063131", + "4134067443673306130490846", + "19856636527688046473636787" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "794962035310474559488", + "1057837838809488293888", + "262056981432020467712" + ], + "expectedQty": "2136761615435973565370", + "swapFee": "1282826665260740583", + "reserves": [ + "9234438298907827547503643", + "4133009605834496642196958", + "19856374470706614453169075" + ], + "mAssetSupply": "33151930581684358819230210" + }, + { + "type": "redeemMasset", + "inputQty": "30631978685615852", + "expectedQtys": [ + "8529948375521363", + "3817704708414343", + "18341543218733716" + ], + "redemptionFee": "9189593605684", + "reserves": [ + "9234438290377879171982280", + "4133009602016791933782615", + "19856374452365071234435359" + ], + "mAssetSupply": "33151930551061569727220042" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "1948260696278210420146176", + "expectedQty": "1962824215889404457020366", + "swapFee": "1168956417766926252087", + "reserves": [ + "9234438290377879171982280", + "4133009602016791933782615", + "17893550236475666777414993" + ], + "mAssetSupply": "31204838811201126233325953" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "5858621865769087554027520", + "expectedQty": "5804670111550945200490919", + "reserves": [ + "9234438290377879171982280", + "4133009602016791933782615", + "23752172102244754331442513" + ] + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "33507714222098793627648", + "expectedQty": "33137202338636813380290", + "reserves": [ + "9234438290377879171982280", + "4133009602016791933782615", + "23785679816466853125070161" + ] + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "4973009404082378179084288", + "outputIndex": 1, + "hardLimitError": true + }, + { + "type": "redeemBassets", + "inputQtys": [ + "5575507584274637258752", + "4405851180887420960768", + "8622464624383741657088" + ], + "expectedQty": "18659430003023935881591", + "swapFee": "11202379429472044755", + "reserves": [ + "9228862782793604534723528", + "4128603750835904512821847", + "23777057351842469383413073" + ], + "mAssetSupply": "37023986695087684311315571" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "940769206081928806006784", + "outputIndex": 2, + "expectedQty": "972370180162735965832741", + "swapFee": "578534260749971097168", + "reserves": [ + "9228862782793604534723528", + "5069372956917833318828631", + "22804687171679733417580332" + ], + "mAssetSupply": "37024565229348434282412739", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "16173504724748254314496", + "expectedQty": "16118644874947494733181", + "swapFee": "9704102834848952588", + "reserves": [ + "9212744137918657039990347", + "5069372956917833318828631", + "22804687171679733417580332" + ], + "mAssetSupply": "37008401428726520877050831" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "36114460230122133782528", + "16798937666761091186688", + "3147594128105466232832" + ], + "expectedQty": "56449733607981344120031", + "swapFee": "33890174269350416722", + "reserves": [ + "9176629677688534906207819", + "5052574019251072227641943", + "22801539577551627951347500" + ], + "mAssetSupply": "36951951695118539532930800" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "169390779680484491264", + "4467651164991102386176", + "4754460450258869551104" + ], + "expectedQty": "9434085673415858553852", + "swapFee": "5663849713877841837", + "reserves": [ + "9176460286908854421716555", + "5048106368086081125255767", + "22796785117101369081796396" + ], + "mAssetSupply": "36942517609445123674376948" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "7061776401878284763136", + "671484101963830132736", + "2667622829402995818496" + ], + "expectedQty": "10410305118073977520774", + "swapFee": "6249933030662784182", + "reserves": [ + "9169398510506976136953419", + "5047434883984117295123031", + "22794117494271966085977900" + ], + "mAssetSupply": "36932107304327049696856174" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "652145154212604663562240", + "1045006692061766192463872", + "533908326323566820720640" + ], + "expectedQty": "2251994585853520072765236", + "swapFee": "1352007956285883573803", + "reserves": [ + "8517253356294371473391179", + "4002428191922351102659159", + "22260209167948399265257260" + ], + "mAssetSupply": "34680112718473529624090938" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "691458908608923172864", + "expectedQty": "688893129641434325836", + "swapFee": "414875345165353903", + "reserves": [ + "8516564463164730039065343", + "4002428191922351102659159", + "22260209167948399265257260" + ], + "mAssetSupply": "34679421674440265866271977" + }, + { + "type": "redeemMasset", + "inputQty": "90672204812861138534", + "expectedQtys": [ + "22260579194484948903", + "10461538819071975276", + "58183690291094160278" + ], + "redemptionFee": "27201661443858341", + "reserves": [ + "8516542202585535554116440", + "4002417730383532030683883", + "22260150984258108171096982" + ], + "mAssetSupply": "34679331029437114448991784" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "614036348741741730332672", + "expectedQty": "629189841629850146924796", + "reserves": [ + "8516542202585535554116440", + "4616454079125273761016555", + "22260150984258108171096982" + ] + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "3952451526504690483200", + "outputIndex": 2, + "expectedQty": "4001944323268352989380", + "swapFee": "2379692038229707445", + "reserves": [ + "8520494654112040244599640", + "4616454079125273761016555", + "22256149039934839818107602" + ], + "mAssetSupply": "35308523250759002825624025", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "29536973994122203365376", + "expectedQty": "29255019861153449253491", + "reserves": [ + "8520494654112040244599640", + "4616454079125273761016555", + "22285686013928962021472978" + ] + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "6308597578220112730652672", + "hardLimitError": true + }, + { + "type": "redeemMasset", + "inputQty": "289466218022081501593", + "expectedQtys": [ + "69773923694692537465", + "37803921923885922364", + "182496418170900849487" + ], + "redemptionFee": "86839865406624450", + "reserves": [ + "8520424880188345552062175", + "4616416275203349875094191", + "22285503517510791120623491" + ], + "mAssetSupply": "35337488891241999600000373" + }, + { + "type": "redeemMasset", + "inputQty": "453430948490065100564070", + "expectedQtys": [ + "109296541119504428725239", + "59217508321763297840381", + "285869365180840200420789" + ], + "redemptionFee": "136029284547019530169", + "reserves": [ + "8411128339068841123336936", + "4557198766881586577253810", + "21999634152329950920202702" + ], + "mAssetSupply": "34884193972036481518966472" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "3400873902978998730752", + "2732640882417535025152", + "6631362876440069537792" + ], + "expectedQty": "12771625376689278700535", + "swapFee": "7667575771476453092", + "reserves": [ + "8407727465165862124606184", + "4554466125999169042228658", + "21993002789453510850664910" + ], + "mAssetSupply": "34871422346659792240265937" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "10816729869031936360448", + "21702041365864597422080", + "15001391454986067509248" + ], + "expectedQty": "47879140388985467907933", + "swapFee": "28744731072034501445", + "reserves": [ + "8396910735296830188245736", + "4532764084633304444806578", + "21978001397998524783155662" + ], + "mAssetSupply": "34823543206270806772358004" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "4736671979440877600768", + "expectedQty": "4691215696654232682154", + "reserves": [ + "8396910735296830188245736", + "4532764084633304444806578", + "21982738069977965660756430" + ] + }, + { + "type": "redeemMasset", + "inputQty": "120031871870049996", + "expectedQtys": [ + "28930394007392578", + "15617011427758622", + "75738482136346039" + ], + "redemptionFee": "36009561561014", + "reserves": [ + "8396910706366436180853158", + "4532764069016293017047956", + "21982737994239483524410391" + ], + "mAssetSupply": "34828234301971598696551176" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "3407561549512836221239296", + "429792589014081248165888", + "2299547634219674874413056" + ], + "expectedQty": "6145855122781697843538141", + "swapFee": "3689726909814907650713", + "reserves": [ + "4989349156853599959613862", + "4102971480002211768882068", + "19683190360019808649997335" + ], + "mAssetSupply": "28682379179189900853013035" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "2954733743142800", + "expectedQty": "2993250204627314", + "reserves": [ + "4989349159808333702756662", + "4102971480002211768882068", + "19683190360019808649997335" + ] + }, + { + "type": "redeemMasset", + "inputQty": "746096239095298654208", + "expectedQtys": [ + "129745787810547013941", + "106695933675153539190", + "511852539897977286701" + ], + "redemptionFee": "223828871728589596", + "reserves": [ + "4989219414020523155742721", + "4102864784068536615342878", + "19682678507479910672710634" + ], + "mAssetSupply": "28681633309772927487575737" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "10110295201377979203584", + "3317140386770876628992", + "2745888591930055458816" + ], + "expectedQty": "16339275305290453362035", + "swapFee": "9809450853686483907", + "reserves": [ + "4979109118819145176539137", + "4099547643681765738713886", + "19679932618887980617251818" + ], + "mAssetSupply": "28665294034467637034213702" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "4792252239589629237395456", + "outputIndex": 0, + "hardLimitError": true + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "1080746522509588589182976", + "expectedQty": "1050623120856190684900758", + "swapFee": "648447913505753153509", + "reserves": [ + "4979109118819145176539137", + "3048924522825575053813128", + "19679932618887980617251818" + ], + "mAssetSupply": "27585195959871554198184235" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "37454405598496751616", + "23588889200688992256", + "26817522934787330048" + ], + "expectedQty": "88852910373103169652", + "swapFee": "53343752475347110", + "reserves": [ + "4979071664413546679787521", + "3048900933936374364820872", + "19679905801365045829921770" + ], + "mAssetSupply": "27585107106961181095014583" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "6249547867164318720", + "expectedQty": "6015618651639793016", + "swapFee": "3749728720298591", + "reserves": [ + "4979071664413546679787521", + "3048894918317722725027856", + "19679905801365045829921770" + ], + "mAssetSupply": "27585100861163042650994454" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "152126217497905440", + "301344821838192576", + "248378766261962848" + ], + "expectedQty": "711568929218049065", + "swapFee": "427197676136511", + "reserves": [ + "4979071512287329181882081", + "3048894616972900886835280", + "19679905552986279567958922" + ], + "mAssetSupply": "27585100149594113432945389" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "74574536717923713024", + "expectedQty": "73411446969912757828", + "reserves": [ + "4979071512287329181882081", + "3048894616972900886835280", + "19679980127522997491671946" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "148501326331408099049472", + "621353255646068765360128", + "595457665445109354725376" + ], + "expectedQty": "1386343354884468286609857", + "swapFee": "832305396168382001166", + "reserves": [ + "4830570185955921082832609", + "2427541361326832121475152", + "19084522462077888136946570" + ], + "mAssetSupply": "26198830206156615059093360" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "20156990838668107776", + "expectedQty": "19864444393710833172", + "swapFee": "12094194503200864", + "reserves": [ + "4830550321511527371999437", + "2427541361326832121475152", + "19084522462077888136946570" + ], + "mAssetSupply": "26198810061259970894186448" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "35085151555971824222208", + "expectedQty": "37063042500980907448679", + "reserves": [ + "4830550321511527371999437", + "2462626512882803945697360", + "19084522462077888136946570" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "1595155314239121391616", + "1290834385460955447296", + "604946729384774074368" + ], + "expectedQty": "3574159494064555815064", + "swapFee": "2145783166338536611", + "reserves": [ + "4828955166197288250607821", + "2461335678497342990250064", + "19083917515348503362872202" + ], + "mAssetSupply": "26232298944266887245820063" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "8674845342901542912", + "outputIndex": 1, + "expectedQty": "8328490577456907590", + "swapFee": "5278205581553339", + "reserves": [ + "4828963841042631152150733", + "2461327350006765533342474", + "19083917515348503362872202" + ], + "mAssetSupply": "26232298949545092827373402", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemMasset", + "inputQty": "22774840674818315413094", + "expectedQtys": [ + "4191241059391783361475", + "2136279456531398508655", + "16563656572567105204681" + ], + "redemptionFee": "6832452202445494623", + "reserves": [ + "4824772599983239368789258", + "2459191070550234134833819", + "19067353858775936257667521" + ], + "mAssetSupply": "26209530941322476957454931" + }, + { + "type": "redeemMasset", + "inputQty": "1788755127812675862528", + "expectedQtys": [ + "329183595351140344169", + "167785183961200178652", + "1300923508205569417373" + ], + "redemptionFee": "536626538343802758", + "reserves": [ + "4824443416387888228445089", + "2459023285366272934655167", + "19066052935267730688250148" + ], + "mAssetSupply": "26207742722821202625395161" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "219213760143508809711616", + "expectedQty": "206534029279899502216120", + "swapFee": "131528256086105285826", + "reserves": [ + "4824443416387888228445089", + "2252489256086373432439047", + "19066052935267730688250148" + ], + "mAssetSupply": "25988660490933779920969371" + }, + { + "type": "mintMulti", + "inputQtys": [ + "6167871193275934179328", + "58131651699236006789120", + "39393757156187570176000" + ], + "expectedQty": "106785822980083882976413", + "reserves": [ + "4830611287581164162624417", + "2310620907785609439228167", + "19105446692423918258426148" + ], + "mAssetSupply": "26095446313913863803945784" + }, + { + "type": "redeemMasset", + "inputQty": "21145906299412423272038", + "expectedQtys": [ + "3913211835182545897049", + "1871802251241471187057", + "15477059871376852130251" + ], + "redemptionFee": "6343771889823726981", + "reserves": [ + "4826698075745981616727368", + "2308749105534367968041110", + "19089969632552541406295897" + ], + "mAssetSupply": "26074306751386341204400727" + }, + { + "type": "redeemMasset", + "inputQty": "7803652773317434775961", + "expectedQtys": [ + "1444125683610421437308", + "690767027063210011446", + "5711630396821817638856" + ], + "redemptionFee": "2341095831995230432", + "reserves": [ + "4825253950062371195290060", + "2308058338507304758029664", + "19084258002155719588657041" + ], + "mAssetSupply": "26066505439708855764855198" + }, + { + "type": "mintMulti", + "inputQtys": [ + "54328540513870962688", + "51742305491512000512", + "49246071405737582592" + ], + "expectedQty": "158426655429219199593", + "reserves": [ + "4825308278602885066252748", + "2308110080812796270030176", + "19084307248227125326239633" + ], + "mAssetSupply": "26066663866364284984054791" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "787226844437070592606208", + "expectedQty": "771658952000492670647555", + "reserves": [ + "4825308278602885066252748", + "2308110080812796270030176", + "19871534092664195918845841" + ] + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "14357632215548094840832", + "outputIndex": 1, + "expectedQty": "13142845894231117910590", + "swapFee": "8439131122382103318", + "reserves": [ + "4825308278602885066252748", + "2294967234918565152119586", + "19885891724879744013686673" + ], + "mAssetSupply": "26838331257495900036805664", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "296679598219282257805312", + "expectedQty": "315044902442008205273692", + "reserves": [ + "4825308278602885066252748", + "2591646833137847409924898", + "19885891724879744013686673" + ] + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "983865452080830215094272", + "expectedQty": "995773832007489149113741", + "reserves": [ + "5809173730683715281347020", + "2591646833137847409924898", + "19885891724879744013686673" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "64342287781579120967680", + "132673364491950845067264", + "66365337234640428072960" + ], + "expectedQty": "269694988037543973909506", + "reserves": [ + "5873516018465294402314700", + "2724320197629798254992162", + "19952257062114384441759633" + ], + "mAssetSupply": "28418844979982941365102603" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "4444183292324316971008", + "outputIndex": 0, + "expectedQty": "4618496958924988924027", + "swapFee": "2797039124261210174", + "reserves": [ + "5868897521506369413390673", + "2728764380922122571963170", + "19952257062114384441759633" + ], + "mAssetSupply": "28418847777022065626312777", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "17094706776339774439424", + "expectedQty": "16283810629337080177017", + "swapFee": "10256824065803864663", + "reserves": [ + "5868897521506369413390673", + "2712480570292785491786153", + "19952257062114384441759633" + ], + "mAssetSupply": "28401763327069791655738016" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "524959144471551191023616", + "62445126453425740972032", + "464612706732916699299840" + ], + "expectedQty": "1052734606972434592730375", + "swapFee": "632019976169162252990", + "reserves": [ + "5343938377034818222367057", + "2650035443839359750814121", + "19487644355381467742459793" + ], + "mAssetSupply": "27349028720097357063007641" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "52128602583823313534976", + "expectedQty": "49590235498679896753368", + "swapFee": "31277161550293988120", + "reserves": [ + "5343938377034818222367057", + "2600445208340679854060753", + "19487644355381467742459793" + ], + "mAssetSupply": "27296931394675084043460785" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "81798235724031568379904", + "expectedQty": "83144448075280347391217", + "swapFee": "49078941434418941027", + "reserves": [ + "5343938377034818222367057", + "2600445208340679854060753", + "19404499907306187395068576" + ], + "mAssetSupply": "27215182237892486894021908" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "319228165136450400026624", + "expectedQty": "301599355826092126015970", + "swapFee": "191536899081870240015", + "reserves": [ + "5343938377034818222367057", + "2298845852514587728044783", + "19404499907306187395068576" + ], + "mAssetSupply": "26896145609655118364235299" + }, + { + "type": "mintMulti", + "inputQtys": [ + "301719787232652100108288", + "737766263356418804416512", + "5540109368373263990784" + ], + "expectedQty": "1084380645909347210304401", + "reserves": [ + "5645658164267470322475345", + "3036612115871006532461295", + "19410040016674560659059360" + ], + "mAssetSupply": "27980526255564465574539700" + }, + { + "type": "mintMulti", + "inputQtys": [ + "23987543581404729344", + "4768318220431024128", + "32997981196013031424" + ], + "expectedQty": "61679141667272661194", + "reserves": [ + "5645682151811051727204689", + "3036616884189226963485423", + "19410073014655756672090784" + ], + "mAssetSupply": "27980587934706132847200894" + }, + { + "type": "mintMulti", + "inputQtys": [ + "141920415750624836059136", + "136150392074321598087168", + "130591378640796987162624" + ], + "expectedQty": "412964273190864882443848", + "reserves": [ + "5787602567561676563263825", + "3172767276263548561572591", + "19540664393296553659253408" + ], + "mAssetSupply": "28393552207896997729644742" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "65333883774679419715584", + "expectedQty": "65880850715140793479906", + "reserves": [ + "5852936451336355982979409", + "3172767276263548561572591", + "19540664393296553659253408" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "114168989432251687108608", + "9924719520808802713600", + "32724800674046444306432" + ], + "expectedQty": "157681833640253344256026", + "swapFee": "94665899723986398392", + "reserves": [ + "5738767461904104295870801", + "3162842556742739758858991", + "19507939592622507214946976" + ], + "mAssetSupply": "28301751224971885178868622" + }, + { + "type": "redeemMasset", + "inputQty": "8474747769951666176", + "expectedQtys": [ + "1717915473906024245", + "946805425699202119", + "5839754182873039262" + ], + "redemptionFee": "2542424330985499", + "reserves": [ + "5738765743988630389846556", + "3162841609937314059656872", + "19507933752868324341907714" + ], + "mAssetSupply": "28301742752766539558187945" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "1803172098208524218138624", + "expectedQty": "1776003646137010665235910", + "swapFee": "1081903258925114530883", + "reserves": [ + "3962762097851619724610646", + "3162841609937314059656872", + "19507933752868324341907714" + ], + "mAssetSupply": "26499652557816940454580204" + }, + { + "type": "redeemMasset", + "inputQty": "31929059744336176742", + "expectedQtys": [ + "4773244076260565738", + "3809720242092868267", + "23497784355120498598" + ], + "redemptionFee": "9578717923300853", + "reserves": [ + "3962757324607543464044908", + "3162837800217071966788605", + "19507910255083969221409116" + ], + "mAssetSupply": "26499620638335914041704315" + }, + { + "type": "redeemMasset", + "inputQty": "13137614506129473352499", + "expectedQtys": [ + "1964011502991446550182", + "1567557463877173007946", + "9668459863134356862557" + ], + "redemptionFee": "3941284351838842005", + "reserves": [ + "3960793313104552017494726", + "3161270242753194793780659", + "19498241795220834864546559" + ], + "mAssetSupply": "26486486965114136407193821" + }, + { + "type": "mintMulti", + "inputQtys": [ + "39398871545114645233664", + "118651126494171962015744", + "153215737813201691082752" + ], + "expectedQty": "313681912472120911329928", + "reserves": [ + "4000192184649666662728390", + "3279921369247366755796403", + "19651457533034036555629311" + ], + "mAssetSupply": "26800168877586257318523749" + }, + { + "type": "mintMulti", + "inputQtys": [ + "17948618493878471753728", + "5283455007759993405440", + "17255819382903139205120" + ], + "expectedQty": "40782628073700554071875", + "reserves": [ + "4018140803143545134482118", + "3285204824255126749201843", + "19668713352416939694834431" + ], + "mAssetSupply": "26840951505659957872595624" + }, + { + "type": "redeemMasset", + "inputQty": "28691630943248102457344", + "expectedQtys": [ + "4293902430157786122378", + "3510665670899147045878", + "21018560622850050391737" + ], + "redemptionFee": "8607489282974430737", + "reserves": [ + "4013846900713387348359740", + "3281694158584227602155965", + "19647694791794089644442694" + ], + "mAssetSupply": "26812268482205992744569017" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "1213449568565438976", + "1267685218795633664", + "1322578695621929728" + ], + "expectedQty": "3851661670465323085", + "swapFee": "2312384432938957", + "reserves": [ + "4013845687263818782920764", + "3281692890899008806522301", + "19647693469215394022512966" + ], + "mAssetSupply": "26812264630544322279245932" + }, + { + "type": "mintMulti", + "inputQtys": [ + "608750042818862433435648", + "1200116823386170954088448", + "60135354961018751025152" + ], + "expectedQty": "1908302859236366869602446", + "reserves": [ + "4622595730082681216356412", + "4481809714285179760610749", + "19707828824176412773538118" + ], + "mAssetSupply": "28720567489780689148848378" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "3274150066827603476480", + "782835206899250364416", + "6732890086017455882240" + ], + "expectedQty": "10772540680194556551895", + "swapFee": "6467404851027350341", + "reserves": [ + "4619321580015853612879932", + "4481026879078280510246333", + "19701095934090395317655878" + ], + "mAssetSupply": "28709794949100494592296483" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "44418567967334933200896", + "544068114273386564157440", + "1000860035798903174463488" + ], + "expectedQty": "1587645582446246660381461", + "swapFee": "953159245014756850339", + "reserves": [ + "4574903012048518679679036", + "3936958764804893946088893", + "18700235898291492143192390" + ], + "mAssetSupply": "27122149366654247931915022" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "14095088636976500310016", + "80632540921348505993216", + "63169762436428442107904" + ], + "expectedQty": "158943782846258570050005", + "swapFee": "95423523822048371052", + "reserves": [ + "4560807923411542179369020", + "3856326223883545440095677", + "18637066135855063701084486" + ], + "mAssetSupply": "26963205583807989361865017" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "48792353348291328475136", + "expectedQty": "49386851646133303554527", + "swapFee": "29275412008974797085", + "reserves": [ + "4560807923411542179369020", + "3856326223883545440095677", + "18587679284208930397529959" + ], + "mAssetSupply": "26914442505871707008186966" + }, + { + "type": "mintMulti", + "inputQtys": [ + "30182251968742780043264", + "76836279021800039383040", + "183207692053642215424000" + ], + "expectedQty": "289917462682906528327569", + "reserves": [ + "4590990175380284959412284", + "3933162502905345479478717", + "18770886976262572612953959" + ], + "mAssetSupply": "27204359968554613536514535" + }, + { + "type": "redeemMasset", + "inputQty": "14377863917219889964646", + "expectedQtys": [ + "2425671086310845207044", + "2078104765334031726746", + "9917685741716357356402" + ], + "redemptionFee": "4313359175165966989", + "reserves": [ + "4588564504293974114205240", + "3931084398140011447751971", + "18760969290520856255597557" + ], + "mAssetSupply": "27189986417996568812516878" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "3436200374268402176", + "expectedQty": "3505490493661085092", + "reserves": [ + "4588564504293974114205240", + "3931087834340385716154147", + "18760969290520856255597557" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "1286492127529209167872", + "267006425755919613952", + "6725233661064925675520" + ], + "expectedQty": "8218101997381509641661", + "reserves": [ + "4589850996421503323373112", + "3931354840766141635768099", + "18767694524181921181273077" + ], + "mAssetSupply": "27198208025484443983243631" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "3335332140977132832555008", + "expectedQty": "3287890954530913580806902", + "reserves": [ + "4589850996421503323373112", + "3931354840766141635768099", + "22103026665159054013828085" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "1658631725999037952", + "2020261656157258496", + "237243298925195328" + ], + "expectedQty": "4007521021052727772", + "swapFee": "2405956186343442", + "reserves": [ + "4589849337789777324335160", + "3931352820504485478509603", + "22103026427915755088632757" + ], + "mAssetSupply": "30486094972494336511322761" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "4723813471571015303692288", + "outputIndex": 0, + "hardLimitError": true + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "47065061890906205978624", + "expectedQty": "46034598465715226522820", + "swapFee": "28239037134543723587", + "reserves": [ + "4543814739324062097812340", + "3931352820504485478509603", + "22103026427915755088632757" + ], + "mAssetSupply": "30439058149640564849067724" + }, + { + "type": "redeemMasset", + "inputQty": "107732824007165452746752", + "expectedQtys": [ + "16077078857988659184381", + "13910045400140824082179", + "78205675025974135712557" + ], + "redemptionFee": "32319847202149635824", + "reserves": [ + "4527737660466073438627959", + "3917442775104344654427424", + "22024820752889780952920200" + ], + "mAssetSupply": "30331357645480601545956796" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "32051266915767992320", + "expectedQty": "31114270024008849485", + "swapFee": "19230760149460795", + "reserves": [ + "4527737660466073438627959", + "3917411660834320645577939", + "22024820752889780952920200" + ], + "mAssetSupply": "30331325613444445927425271" + }, + { + "type": "redeemMasset", + "inputQty": "224118454330314521", + "expectedQtys": [ + "33445460120520813", + "28937108397885989", + "162692788185207621" + ], + "redemptionFee": "67235536299094", + "reserves": [ + "4527737627020613318107146", + "3917411631897212247691950", + "22024820590196992767712579" + ], + "mAssetSupply": "30331325389393227133409844" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "132006028639902336286720", + "109209960484369179082752", + "25549650536040782364672" + ], + "expectedQty": "272686261697518171584815", + "swapFee": "163709983008315892486", + "reserves": [ + "4395731598380710981820426", + "3808201671412843068609198", + "21999270939660951985347907" + ], + "mAssetSupply": "30058639127695708961825029" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "1539017697354786680078336", + "expectedQty": "1562902758095526012722544", + "swapFee": "923410618412872008047", + "reserves": [ + "4395731598380710981820426", + "3808201671412843068609198", + "20436368181565425972625363" + ], + "mAssetSupply": "28520544840959335153754740" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "2053998107750207062016", + "outputIndex": 2, + "expectedQty": "2124961927318041362683", + "swapFee": "1256594794136312428", + "reserves": [ + "4397785596488461188882442", + "3808201671412843068609198", + "20434243219638107931262680" + ], + "mAssetSupply": "28520546097554129290067168", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "977190243069263744", + "expectedQty": "957814153127971298", + "swapFee": "586314145841558", + "reserves": [ + "4397784638674308060911144", + "3808201671412843068609198", + "20434243219638107931262680" + ], + "mAssetSupply": "28520545120950200366644982" + }, + { + "type": "mintMulti", + "inputQtys": [ + "8482477482219702059008", + "5400363913573768888320", + "6887709356824165613568" + ], + "expectedQty": "20976003525831813867264", + "reserves": [ + "4406267116156527762970152", + "3813602035326416837497518", + "20441130928994932096876248" + ], + "mAssetSupply": "28541521124476032180512246" + }, + { + "type": "mintMulti", + "inputQtys": [ + "1518738093674468994973696", + "3686562719309066001186816", + "6241394974557582758248448" + ], + "expectedQty": "11455229227376429599000578", + "reserves": [ + "5925005209830996757943848", + "7500164754635482838684334", + "26682525903552514855124696" + ], + "mAssetSupply": "39996750351852461779512824" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "1806305631329428015415296", + "outputIndex": 2, + "expectedQty": "1835077309254081374915603", + "swapFee": "1091761663526095940508", + "reserves": [ + "5925005209830996757943848", + "9306470385964910854099630", + "24847448594298433480209093" + ], + "mAssetSupply": "39997842113515987875453332", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemBassets", + "inputQtys": [ + "188029007105795559522304", + "221082487839137929887744", + "311843975744566090268672" + ], + "expectedQty": "722201552172090184473778", + "swapFee": "433581079951224845591", + "reserves": [ + "5736976202725201198421544", + "9085387898125772924211886", + "24535604618553867389940421" + ], + "mAssetSupply": "39275640561343897690979554" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "623534651608842236854272", + "outputIndex": 1, + "expectedQty": "614362394427958399409879", + "swapFee": "370779680470268316914", + "reserves": [ + "5736976202725201198421544", + "8471025503697814524802007", + "25159139270162709626794693" + ], + "mAssetSupply": "39276011341024367959296468", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "2948608062967717036032", + "expectedQty": "2929491018535257581419", + "swapFee": "1769164837780630221", + "reserves": [ + "5736976202725201198421544", + "8468096012679279267220588", + "25159139270162709626794693" + ], + "mAssetSupply": "39273064502126238022890657" + }, + { + "type": "redeemMasset", + "inputQty": "101012337740131153320345", + "expectedQtys": [ + "14751370526536557861234", + "21773843488836638644007", + "64691184412898590494581" + ], + "redemptionFee": "30303701322039345996", + "reserves": [ + "5722224832198664640560310", + "8446322169190442628576581", + "25094448085749811036300112" + ], + "mAssetSupply": "39172082468087428908916308" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "7325898559655438712832", + "7215424373804717047808", + "7905443751126214115328" + ], + "expectedQty": "22539052249346508506569", + "swapFee": "13531550279775770566", + "reserves": [ + "5714898933639009201847478", + "8439106744816637911528773", + "25086542641998684822184784" + ], + "mAssetSupply": "39149543415838082400409739" + }, + { + "type": "mintMulti", + "inputQtys": [ + "2339753337378708480", + "2082113588812246272", + "1337538854761854976" + ], + "expectedQty": "5798878347833403723", + "reserves": [ + "5714901273392346580555958", + "8439108826930226723775045", + "25086543979537539584039760" + ], + "mAssetSupply": "39149549214716430233813462" + }, + { + "type": "redeemMasset", + "inputQty": "14206673003514432", + "expectedQtys": [ + "2073213570690398", + "3061483323602415", + "9100728242191650" + ], + "redemptionFee": "4262001901054", + "reserves": [ + "5714901271319133009865560", + "8439108823868743400172630", + "25086543970436811341848110" + ], + "mAssetSupply": "39149549200514019232200084" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "680792099896838656", + "expectedQty": "692380195337395046", + "reserves": [ + "5714901952111232906704216", + "8439108823868743400172630", + "25086543970436811341848110" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "132471824406571941888", + "319345618945506344960", + "332068909953436286976" + ], + "expectedQty": "784880993882669876984", + "reserves": [ + "5715034423935639478646104", + "8439428169487688906517590", + "25086876039346764778135086" + ], + "mAssetSupply": "39150334773888097239472114" + }, + { + "type": "mintMulti", + "inputQtys": [ + "7076498112927492997120", + "27179966784386298281984", + "17056769208742660014080" + ], + "expectedQty": "51432358596215494130062", + "reserves": [ + "5722110922048566971643224", + "8466608136272075204799574", + "25103932808555507438149166" + ], + "mAssetSupply": "39201767132484312733602176" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "1060388716722178530213888", + "410330589021235729924096", + "210997850352807089012736" + ], + "expectedQty": "1704236838094630397613788", + "swapFee": "1023155996454651029185", + "reserves": [ + "4661722205326388441429336", + "8056277547250839474875478", + "24892934958202700349136430" + ], + "mAssetSupply": "37497530294389682335988388" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "604411756964729728", + "424600314448108160", + "858738118088376448" + ], + "expectedQty": "1896189936767324747", + "swapFee": "1138397000260551", + "reserves": [ + "4661721600914631476699608", + "8056277122650525026767318", + "24892934099464582260759982" + ], + "mAssetSupply": "37497528398199745568663641" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "449263262790112426065920", + "expectedQty": "459751939361457580364370", + "reserves": [ + "5110984863704743902765528", + "8056277122650525026767318", + "24892934099464582260759982" + ] + }, + { + "type": "redeemMasset", + "inputQty": "5626427597615617644953", + "expectedQtys": [ + "757376689177850403490", + "1193827932769397194204", + "3688785726222811376371" + ], + "redemptionFee": "1687928279284685293", + "reserves": [ + "5110227487015566052362038", + "8055083294717755629573114", + "24889245313738359449383611" + ], + "mAssetSupply": "37951655597891866816068351" + }, + { + "type": "redeemMasset", + "inputQty": "4821380253770220516147", + "expectedQtys": [ + "649008798303107807124", + "1023011195219670798628", + "3160982408862258562519" + ], + "redemptionFee": "1446414076131066154", + "reserves": [ + "5109578478217262944554914", + "8054060283522535958774486", + "24886084331329497190821092" + ], + "mAssetSupply": "37946835664052172726618358" + }, + { + "type": "redeemMasset", + "inputQty": "52044373021177184256", + "expectedQtys": [ + "7005723302263862500", + "11042890924692929297", + "34121214038565428633" + ], + "redemptionFee": "15613311906353155", + "reserves": [ + "5109571472493960680692414", + "8054049240631611265845189", + "24886050210115458625392459" + ], + "mAssetSupply": "37946783635292463455787257" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "2799185197576153297059840", + "outputIndex": 1, + "expectedQty": "2722909048625488425455940", + "swapFee": "1660230283086392995402", + "reserves": [ + "5109571472493960680692414", + "5331140192006122840389249", + "27685235407691611922452299" + ], + "mAssetSupply": "37948443865575549848782659", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "2106198369355678976", + "expectedQty": "2164288529789080625", + "reserves": [ + "5109573578692330036371390", + "5331140192006122840389249", + "27685235407691611922452299" + ] + }, + { + "type": "redeemMasset", + "inputQty": "342636230980328209199923", + "expectedQtys": [ + "46120460743836160114195", + "48120383855638915816111", + "249894789289067012034402" + ], + "redemptionFee": "102790869294098462759", + "reserves": [ + "5063453117948493876257195", + "5283019808150483924573138", + "27435340618402544910417897" + ], + "mAssetSupply": "37605912589753045527126120" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "432209890807689726918656", + "outputIndex": 2, + "expectedQty": "448829752457391585636779", + "swapFee": "265339925099600156420", + "reserves": [ + "5063453117948493876257195", + "5715229698958173651491794", + "26986510865945153324781118" + ], + "mAssetSupply": "37606177929678145127282540", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "37383376504876584", + "outputIndex": 0, + "expectedQty": "37150205385501071", + "swapFee": "22886258571056", + "reserves": [ + "5063453080798288490756124", + "5715229736341550156368378", + "26986510865945153324781118" + ], + "mAssetSupply": "37606177929701031385853596", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "1055143244338102", + "expectedQty": "1033488724118637", + "swapFee": "633085946602", + "reserves": [ + "5063453080798288490756124", + "5715229735308061432249741", + "26986510865945153324781118" + ], + "mAssetSupply": "37606177928646521227462096" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "129773350883328819200", + "expectedQty": "127109969820726577602", + "swapFee": "77864010529997291", + "reserves": [ + "5063453080798288490756124", + "5715102625338240705672139", + "26986510865945153324781118" + ], + "mAssetSupply": "37606048233159648428640187" + }, + { + "type": "redeemMasset", + "inputQty": "3889460855902877568204", + "expectedQtys": [ + "523537974546854900138", + "590915567904358735040", + "2790282246797508918143" + ], + "redemptionFee": "1166838256770863270", + "reserves": [ + "5062929542823741635855986", + "5714511709770336346937099", + "26983720583698355815862975" + ], + "mAssetSupply": "37602159939142002321935253" + }, + { + "type": "redeemMasset", + "inputQty": "310278321282002565726208", + "expectedQtys": [ + "41764781775151569617092", + "47139770066204762511721", + "222592313822973760150135" + ], + "redemptionFee": "93083496384600769717", + "reserves": [ + "5021164761048590066238894", + "5667371939704131584425378", + "26761128269875382055712840" + ], + "mAssetSupply": "37291974701356384356978762" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "1962184911503428419584", + "123026697604898619392", + "2093736083124451016704" + ], + "expectedQty": "4201111835360901849118", + "swapFee": "2522180409462218440", + "reserves": [ + "5019202576137086637819310", + "5667248913006526685805986", + "26759034533792257604696136" + ], + "mAssetSupply": "37287773589521023455129644" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "93209332281701247746048", + "expectedQty": "91797714120173873169318", + "reserves": [ + "5019202576137086637819310", + "5667248913006526685805986", + "26852243866073958852442184" + ] + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "27798863850446855864320", + "expectedQty": "28210180954200653130053", + "swapFee": "16679318310268113518", + "reserves": [ + "5019202576137086637819310", + "5667248913006526685805986", + "26824033685119758199312131" + ], + "mAssetSupply": "37351789119109060740548160" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "1989861178082463842304", + "expectedQty": "2042162547796909682287", + "reserves": [ + "5021192437315169101661614", + "5667248913006526685805986", + "26824033685119758199312131" + ] + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "1905099984935143", + "expectedQty": "1865778955375641", + "swapFee": "1143059990961", + "reserves": [ + "5021192437315169101661614", + "5667248911140747730430345", + "26824033685119758199312131" + ], + "mAssetSupply": "37353831279752900725286265" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "24517262198658207580160", + "expectedQty": "24879349270342380948837", + "swapFee": "14710357319194924548", + "reserves": [ + "5021192437315169101661614", + "5667248911140747730430345", + "26799154335849415818363294" + ], + "mAssetSupply": "37329328727911561712630653" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "38960367692074237952", + "292289700820380712960", + "241221378999975280640" + ], + "expectedQty": "575809276385709584310", + "swapFee": "345692981620397989", + "reserves": [ + "5021153476947477027423662", + "5666956621439927349717385", + "26798913114470415843082654" + ], + "mAssetSupply": "37328752918635176003046343" + }, + { + "type": "mintMulti", + "inputQtys": [ + "342611157849173888", + "400214299588538688", + "152912997483260192" + ], + "expectedQty": "910576910315002453", + "reserves": [ + "5021153819558634876597550", + "5666957021654226938256073", + "26798913267383413326342846" + ], + "mAssetSupply": "37328753829212086318048796" + }, + { + "type": "mintMulti", + "inputQtys": [ + "430562303852342816014336", + "244998423327816997142528", + "223123263498846621138944" + ], + "expectedQty": "910597948545861048266621", + "reserves": [ + "5451716123410977692611886", + "5911955444982043935398601", + "27022036530882259947481790" + ], + "mAssetSupply": "38239351777757947366315417" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "465427871556419996090368", + "expectedQty": "471651116414609459629960", + "swapFee": "279256722933851997654", + "reserves": [ + "5451716123410977692611886", + "5911955444982043935398601", + "26550385414467650487851830" + ], + "mAssetSupply": "37774203162924461222222703" + }, + { + "type": "redeemMasset", + "inputQty": "285030877357301411977625", + "expectedQtys": [ + "41124395154801267810764", + "44596157678309934049490", + "200279786507608876074398" + ], + "redemptionFee": "85509263207190423593", + "reserves": [ + "5410591728256176424801122", + "5867359287303734001349111", + "26350105627960041611777432" + ], + "mAssetSupply": "37489257794830367000668671" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "461433679665420288", + "expectedQty": "453070085803164989", + "swapFee": "276860207799252", + "reserves": [ + "5410591728256176424801122", + "5867358834233648198184122", + "26350105627960041611777432" + ], + "mAssetSupply": "37489257333673547543047635" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "1283973988544005103681536", + "expectedQty": "1302041861084887148873495", + "reserves": [ + "5410591728256176424801122", + "7151332822777653301865658", + "26350105627960041611777432" + ] + }, + { + "type": "redeemMasset", + "inputQty": "19446629599317370470", + "expectedQtys": [ + "2711592808285356924", + "3583989261401682322", + "13205719541763392804" + ], + "redemptionFee": "5833988879795211", + "reserves": [ + "5410589016663368139444198", + "7151329238788391900183336", + "26350092422240499848384628" + ], + "mAssetSupply": "38791279753962824254345871" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "307578784679178587340800", + "487460855827892644347904", + "20771745989433476775936" + ], + "expectedQty": "828289497353701462637557", + "swapFee": "497272061649210403824", + "reserves": [ + "5103010231984189552103398", + "6663868382960499255835432", + "26329320676251066371608692" + ], + "mAssetSupply": "37962990256609122791708314" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "200535070381917530488832", + "expectedQty": "205125450326458101406260", + "reserves": [ + "5303545302366107082592230", + "6663868382960499255835432", + "26329320676251066371608692" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "1469310449744268230656", + "13660223625458853347328", + "16664037343631629090816" + ], + "expectedQty": "31794320032047458235954", + "reserves": [ + "5305014612815851350822886", + "6677528606585958109182760", + "26345984713594698000699508" + ], + "mAssetSupply": "38199910026967628351350528" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "8947768866912910442496", + "expectedQty": "9056636148746050553834", + "swapFee": "5368661320147746265", + "reserves": [ + "5305014612815851350822886", + "6677528606585958109182760", + "26336928077445951950145674" + ], + "mAssetSupply": "38190967626762035588654297" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "403563392508629056", + "expectedQty": "398124011017539759", + "swapFee": "242138035505177", + "reserves": [ + "5305014612815851350822886", + "6677528208461947091643001", + "26336928077445951950145674" + ], + "mAssetSupply": "38190967223440781115530418" + }, + { + "type": "mintMulti", + "inputQtys": [ + "136135685848454551044096", + "69680092584141974929408", + "89947779334802891603968" + ], + "expectedQty": "298459555916520144029260", + "reserves": [ + "5441150298664305901866982", + "6747208301046089066572409", + "26426875856780754841749642" + ], + "mAssetSupply": "38489426779357301259559678" + }, + { + "type": "redeemMasset", + "inputQty": "25740761793143376", + "expectedQtys": [ + "3637812969134356", + "4511009715909112", + "17668328652693191" + ], + "redemptionFee": "7722228537943", + "reserves": [ + "5441150295026492932732626", + "6747208296535079350663297", + "26426875839112426189056451" + ], + "mAssetSupply": "38489426753624261694954245" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "610267910776731008499712", + "expectedQty": "601253567433943178470785", + "swapFee": "366160746466038605099", + "reserves": [ + "5441150295026492932732626", + "6145954729101136172192512", + "26426875839112426189056451" + ], + "mAssetSupply": "37879525003593996725059632" + }, + { + "type": "redeemMasset", + "inputQty": "7500018072212089706905", + "expectedQtys": [ + "1077006190673884841776", + "1216513224582989307161", + "5230862471288457079358" + ], + "redemptionFee": "2250005421663626912", + "reserves": [ + "5440073288835819047890850", + "6144738215876553182885351", + "26421644976641137731977093" + ], + "mAssetSupply": "37872027235527206298979639" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "309671076258899065569280", + "expectedQty": "315797033039395430147938", + "reserves": [ + "5749744365094718113460130", + "6144738215876553182885351", + "26421644976641137731977093" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "54885670406056216363008", + "411666200247570905694208", + "122999852237207954784256" + ], + "expectedQty": "595185540123240080578658", + "reserves": [ + "5804630035500774329823138", + "6556404416124124088579559", + "26544644828878345686761349" + ], + "mAssetSupply": "38783009808689841809706235" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "686471969411162502594560", + "outputIndex": 0, + "expectedQty": "662907814183541582376213", + "swapFee": "406824474034139236208", + "reserves": [ + "5141722221317232747446925", + "6556404416124124088579559", + "27231116798289508189355909" + ], + "mAssetSupply": "38783416633163875948942443", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemMasset", + "inputQty": "3778405968371075", + "expectedQtys": [ + "500772942679448", + "638554513747708", + "2652147647142582" + ], + "redemptionFee": "1133521790511", + "reserves": [ + "5141722220816459804767477", + "6556404415485569574831851", + "27231116795637360542213327" + ], + "mAssetSupply": "38783416629386603502361879" + }, + { + "type": "redeemMasset", + "inputQty": "516981906593945497", + "expectedQtys": [ + "68518458006960531", + "87370476530286796", + "362881161703099210" + ], + "redemptionFee": "155094571978183", + "reserves": [ + "5141722152298001797806946", + "6556404328115093044545055", + "27231116432756198839114117" + ], + "mAssetSupply": "38783416112559791480394565" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "28423089953075871350784", + "expectedQty": "29139287505021903084907", + "reserves": [ + "5170145242251077669157730", + "6556404328115093044545055", + "27231116432756198839114117" + ] + }, + { + "type": "redeemMasset", + "inputQty": "39024195936625638", + "expectedQtys": [ + "5196777966487506", + "6590178023102662", + "27371390792686547" + ], + "redemptionFee": "11707258780987", + "reserves": [ + "5170145237054299702670224", + "6556404321524915021442393", + "27231116405384808046427570" + ], + "mAssetSupply": "38812555361052324705634821" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "219897416895157606809600", + "expectedQty": "214151453274711361055915", + "swapFee": "131938450137094564085", + "reserves": [ + "4955993783779588341614309", + "6556404321524915021442393", + "27231116405384808046427570" + ], + "mAssetSupply": "38592789882607304193389306" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "49786434209558808", + "132402253753233776", + "129163240599505824" + ], + "expectedQty": "312879892591657979", + "swapFee": "187840639938958", + "reserves": [ + "4955993733993154132055501", + "6556404189122661268208617", + "27231116276221567446921746" + ], + "mAssetSupply": "38592789569727411601731327" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "2194636052985044533248", + "439229474409999920791552", + "195197039526236404056064" + ], + "expectedQty": "640989905824102051113621", + "swapFee": "384824838397499730506", + "reserves": [ + "4953799097940169087522253", + "6117174714712661347417065", + "27035919236695331042865682" + ], + "mAssetSupply": "37951799663903309550617706" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "8067673871018312597504", + "expectedQty": "8208445189078596314178", + "reserves": [ + "4953799097940169087522253", + "6125242388583679660014569", + "27035919236695331042865682" + ] + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "1019101095570674871697408", + "expectedQty": "1003735670218169971185872", + "reserves": [ + "4953799097940169087522253", + "6125242388583679660014569", + "28055020332266005914563090" + ] + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "1140325755228787943931904", + "expectedQty": "1122129776817038106395885", + "reserves": [ + "4953799097940169087522253", + "6125242388583679660014569", + "29195346087494793858494994" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "796632658058753081344", + "8334433080389736071168", + "3351917384593779982336" + ], + "expectedQty": "12630554780669642176860", + "reserves": [ + "4954595730598227840603597", + "6133576821664069396085737", + "29198698004879387638477330" + ], + "mAssetSupply": "40098504110908265866690501" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "88393317019046838272", + "expectedQty": "90264797513107677366", + "reserves": [ + "4954595730598227840603597", + "6133665214981088442924009", + "29198698004879387638477330" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "506824688956938584064", + "1508602453646693629952", + "1543039108341469020160" + ], + "expectedQty": "3581543679678090429137", + "reserves": [ + "4955102555287184779187661", + "6135173817434735136553961", + "29200241043987729107497490" + ], + "mAssetSupply": "40102175919385457064797004" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "1446564975574953754624", + "expectedQty": "1477168740218068091664", + "reserves": [ + "4955102555287184779187661", + "6136620382410310090308585", + "29200241043987729107497490" + ] + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "924998174173924687872", + "expectedQty": "909821455797547708133", + "reserves": [ + "4955102555287184779187661", + "6136620382410310090308585", + "29201166042161903032185362" + ] + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "125965189660255396560896", + "expectedQty": "129949790756329187554701", + "reserves": [ + "5081067744947440175748557", + "6136620382410310090308585", + "29201166042161903032185362" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "846938174793234018992128", + "1084816641499382671212544", + "564725156242377156853760" + ], + "hardLimitError": true + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "6569518871614373943574528", + "outputIndex": 2, + "expectedQty": "6676194010205990049321311", + "swapFee": "3972590035850588500314", + "reserves": [ + "5081067744947440175748557", + "12706139254024684033883113", + "22524972031955912982864051" + ], + "mAssetSupply": "40238485290373652456651816", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "42201221975374471168", + "expectedQty": "42220062007914468350", + "swapFee": "25320733185224682", + "reserves": [ + "5081067744947440175748557", + "12706097033962676119414763", + "22524972031955912982864051" + ], + "mAssetSupply": "40238443114472410267405330" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "75081205453790192", + "439434605255024256", + "3434254118103800832" + ], + "expectedQty": "3924744229345185662", + "swapFee": "2356260293783381", + "reserves": [ + "5081067669866234721958365", + "12706096594528070864390507", + "22524968597701794879063219" + ], + "mAssetSupply": "40238439189728180922219668" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "98122187023462367756288", + "expectedQty": "98783277575044364850186", + "swapFee": "58873312214077420653", + "reserves": [ + "5081067669866234721958365", + "12706096594528070864390507", + "22426185320126750514213033" + ], + "mAssetSupply": "40140375876016932631884033" + }, + { + "type": "redeemMasset", + "inputQty": "590002753121352217211699", + "expectedQtys": [ + "74661596844522362094702", + "186704354880829191257950", + "329532081822466471020367" + ], + "redemptionFee": "177000825936405665163", + "reserves": [ + "5006406073021712359863663", + "12519392239647241673132557", + "22096653238304284043192666" + ], + "mAssetSupply": "39550550123721516820337497" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "16908230890289", + "outputIndex": 2, + "expectedQty": "17003553606083", + "swapFee": "10134084595", + "reserves": [ + "5006406073021712359863663", + "12519392239664149904022846", + "22096653238287280489586583" + ], + "mAssetSupply": "39550550123721526954422092", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "6200358259197923557376", + "outputIndex": 1, + "expectedQty": "6329508356866782615062", + "swapFee": "3795948232337730312", + "reserves": [ + "5012606431280910283421039", + "12513062731307283121407784", + "22096653238287280489586583" + ], + "mAssetSupply": "39550553919669759292152404", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemMasset", + "inputQty": "350634528158447619276", + "expectedQtys": [ + "44425815541740719220", + "110900990210243466694", + "195838602992636463004" + ], + "redemptionFee": "105190358447534285", + "reserves": [ + "5012562005465368542701819", + "12512951830317072877941090", + "22096457399684287853123579" + ], + "mAssetSupply": "39550203390331959292067413" + }, + { + "type": "mintMulti", + "inputQtys": [ + "98796427403242730684416", + "194769874947932193554432", + "5238850526940579758080" + ], + "expectedQty": "300531499077140929552309", + "reserves": [ + "5111358432868611273386235", + "12707721705265005071495522", + "22101696250211228432881659" + ], + "mAssetSupply": "39850734889409100221619722" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "30603287251072344653824", + "outputIndex": 0, + "expectedQty": "29955949435867740101743", + "swapFee": "18341130865665899419", + "reserves": [ + "5081402483432743533284492", + "12738324992516077416149346", + "22101696250211228432881659" + ], + "mAssetSupply": "39850753230539965887519141", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "10059796869887633129472", + "expectedQty": "10125743292820406097524", + "swapFee": "6035878121932579877", + "reserves": [ + "5081402483432743533284492", + "12738324992516077416149346", + "22091570506918408026784135" + ], + "mAssetSupply": "39840699469548200186969546" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "76020944638995767230464", + "146909654714935920295936", + "302741782925584451502080" + ], + "expectedQty": "524865304071448102242690", + "swapFee": "315108247391303643531", + "reserves": [ + "5005381538793747766054028", + "12591415337801141495853410", + "21788828723992823575282055" + ], + "mAssetSupply": "39315834165476752084726856" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "31886111530978350465024", + "2745018061514255892480", + "334468548379121385734144" + ], + "expectedQty": "367371614154770824849146", + "swapFee": "220555301673866814998", + "reserves": [ + "4973495427262769415589004", + "12588670319739627239960930", + "21454360175613702189547911" + ], + "mAssetSupply": "38948462551321981259877710" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "12440917440297894412288", + "expectedQty": "12449611823217042855930", + "swapFee": "7464550464178736647", + "reserves": [ + "4973495427262769415589004", + "12576220707916410197105000", + "21454360175613702189547911" + ], + "mAssetSupply": "38936029098432147544202069" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "1895664234827344462741504", + "expectedQty": "1891997702242148519298009", + "reserves": [ + "4973495427262769415589004", + "14471884942743754659846504", + "21454360175613702189547911" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "46447630897270824960", + "129387477403495153664", + "100337544529827774464" + ], + "expectedQty": "276180532438273524585", + "swapFee": "165807804145451385", + "reserves": [ + "4973448979631872144764044", + "14471755555266351164692840", + "21454259838069172361773447" + ], + "mAssetSupply": "40827750620141857789975493" + }, + { + "type": "mintMulti", + "inputQtys": [ + "638133567893250944", + "338985290994643648", + "690747575453311616" + ], + "expectedQty": "1676171161406690520", + "reserves": [ + "4973449617765440038014988", + "14471755894251642159336488", + "21454260528816747815085063" + ], + "mAssetSupply": "40827752296313019196666013" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "12261531405900492800", + "9714967675799019520", + "15932676809009608704" + ], + "expectedQty": "38043020715954427782", + "swapFee": "22839516139256210", + "reserves": [ + "4973437356234034137522188", + "14471746179283966360316968", + "21454244596139938805476359" + ], + "mAssetSupply": "40827714253292303242238231" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "39591895703582765219840", + "51285677286534336741376", + "47958007023822069301248" + ], + "expectedQty": "139243684766491885494866", + "swapFee": "83596368681103793573", + "reserves": [ + "4933845460530451372302348", + "14420460501997432023575592", + "21406286589116116736175111" + ], + "mAssetSupply": "40688470568525811356743365" + }, + { + "type": "mintMulti", + "inputQtys": [ + "543495719095170170880", + "1118546028150591848448", + "999351797235443695616" + ], + "expectedQty": "2663709091839485307269", + "reserves": [ + "4934388956249546542473228", + "14421579048025582615424040", + "21407285940913352179870727" + ], + "mAssetSupply": "40691134277617650842050634" + }, + { + "type": "redeemMasset", + "inputQty": "3110677837668007333068", + "expectedQtys": [ + "377101544420919761448", + "1102142490228893322093", + "1636012211796626430734" + ], + "redemptionFee": "933203351300402199", + "reserves": [ + "4934011854705125622711780", + "14420476905535353722101947", + "21405649928701555553439993" + ], + "mAssetSupply": "40688024532983334135119765" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "273084604922824092549120", + "expectedQty": "272367812678246818407170", + "reserves": [ + "4934011854705125622711780", + "14693561510458177814651067", + "21405649928701555553439993" + ] + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "38468291828630603956224", + "expectedQty": "37610031420736885124049", + "swapFee": "23080975097178362373", + "reserves": [ + "4896401823284388737587731", + "14693561510458177814651067", + "21405649928701555553439993" + ], + "mAssetSupply": "40921947134808047527933084" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "18315356177391142912", + "expectedQty": "18265140661897934558", + "reserves": [ + "4896401823284388737587731", + "14693579825814355205793979", + "21405649928701555553439993" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "25986259641977", + "22557614797741", + "34958129340245" + ], + "expectedQty": "83788232863373", + "swapFee": "50303121590", + "reserves": [ + "4896401823258402477945754", + "14693579825791797590996238", + "21405649928666597424099748" + ], + "mAssetSupply": "40921965399864921193004269" + }, + { + "type": "redeemMasset", + "inputQty": "103896251837999434275225", + "expectedQtys": [ + "12427682214693786620907", + "37294149308533833108755", + "54330225442041326148359" + ], + "redemptionFee": "31168875551399830282", + "reserves": [ + "4883974141043708691324847", + "14656285676483263757887483", + "21351319703224556097951389" + ], + "mAssetSupply": "40818100316902473158559326" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "28440994681022536744960", + "expectedQty": "28501839479090099872045", + "swapFee": "17064596808613522046", + "reserves": [ + "4883974141043708691324847", + "14627783837004173658015438", + "21351319703224556097951389" + ], + "mAssetSupply": "40789676386818259235336412" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "186765761229769070870528", + "expectedQty": "185509957795095971196108", + "reserves": [ + "4883974141043708691324847", + "14627783837004173658015438", + "21538085464454325168821917" + ] + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "230391024063289059442688", + "expectedQty": "235364108972678997058384", + "reserves": [ + "5114365165106997750767535", + "14627783837004173658015438", + "21538085464454325168821917" + ] + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "2543709313120274", + "outputIndex": 0, + "expectedQty": "2484718523386912", + "swapFee": "1522455566680", + "reserves": [ + "5114365162622279227380623", + "14627783839547882971135712", + "21538085464454325168821917" + ], + "mAssetSupply": "41210550453587556659157584", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "1102421889391596301975552", + "expectedQty": "1095054573982897517827980", + "reserves": [ + "5114365162622279227380623", + "14627783839547882971135712", + "22640507353845921470797469" + ] + }, + { + "type": "redeemMasset", + "inputQty": "528610235830006474971545", + "expectedQtys": [ + "63885027084254506404364", + "182719914800333545519662", + "282809181493819142335295" + ], + "redemptionFee": "158583070749001942491", + "reserves": [ + "5050480135538024720976259", + "14445063924747549425616050", + "22357698172352102328462174" + ], + "mAssetSupply": "41777153374811196703956510" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "693979109956163821633536", + "expectedQty": "689075180128341076650261", + "reserves": [ + "5050480135538024720976259", + "14445063924747549425616050", + "23051677282308266150095710" + ] + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "81312278846782379655168", + "expectedQty": "81135014286770201302827", + "reserves": [ + "5050480135538024720976259", + "14526376203594331805271218", + "23051677282308266150095710" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "63803939970676087062528", + "91392829875444378501120", + "86205010023115051237376" + ], + "expectedQty": "242064138433151216001206", + "swapFee": "145325678466970912148", + "reserves": [ + "4986676195567348633913731", + "14434983373718887426770098", + "22965472272285151098858334" + ], + "mAssetSupply": "42305299430793156765908392" + }, + { + "type": "mintMulti", + "inputQtys": [ + "50432175992728998379520", + "22905426178884623138816", + "18423477519862303031296" + ], + "expectedQty": "92752916310208112809615", + "reserves": [ + "5037108371560077632293251", + "14457888799897772049908914", + "22983895749805013401889630" + ], + "mAssetSupply": "42398052347103364878718007" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "285810281201987649536", + "outputIndex": 0, + "expectedQty": "277177520236627733136", + "swapFee": "170250808862109198", + "reserves": [ + "5036831194039841004560115", + "14457888799897772049908914", + "22984181560086215389539166" + ], + "mAssetSupply": "42398052517354173740827205", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "48689740905896491352064", + "expectedQty": "49013112416081463583541", + "swapFee": "29213844543537894811", + "reserves": [ + "5036831194039841004560115", + "14457888799897772049908914", + "22935168447670133925955625" + ], + "mAssetSupply": "42349391990292820787369952" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "2327691144535450570457088", + "outputIndex": 0, + "expectedQty": "2204516166787881622557640", + "swapFee": "1385874640563732203921", + "reserves": [ + "2832315027251959382002475", + "14457888799897772049908914", + "25262859592205584496412713" + ], + "mAssetSupply": "42350777864933384519573873", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mintMulti", + "inputQtys": [ + "154449051472740604706816", + "53742163997803734368256", + "1394252816179875337469952" + ], + "expectedQty": "1594706766383577583736152", + "reserves": [ + "2986764078724699986709291", + "14511630963895575784277170", + "26657112408385459833882665" + ], + "mAssetSupply": "43945484631316962103310025" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "2902907835727462023561216", + "outputIndex": 0, + "hardLimitError": true + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "124592820439921796841472", + "expectedQty": "134348203197789232590416", + "reserves": [ + "3111356899164621783550763", + "14511630963895575784277170", + "26657112408385459833882665" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "622666633232955239038976", + "312959821114573701775360", + "41785596629656048500736" + ], + "expectedQty": "1033183733887526223543176", + "swapFee": "620282409778382763784", + "reserves": [ + "2488690265931666544511787", + "14198671142781002082501810", + "26615326811755803785381929" + ], + "mAssetSupply": "43046649100627225112357265" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "10757948730069070381056", + "8269237203606986293248", + "693008442345802301440" + ], + "expectedQty": "20905896989910579936924", + "swapFee": "12551068835247496460", + "reserves": [ + "2477932317201597474130731", + "14190401905577395096208562", + "26614633803313457983080489" + ], + "mAssetSupply": "43025743203637314532420341" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "3361727147060789760", + "expectedQty": "3751852472022239467", + "reserves": [ + "2477935678928744534920491", + "14190401905577395096208562", + "26614633803313457983080489" + ] + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "57026190129246748672", + "expectedQty": "56026729853310383241", + "reserves": [ + "2477935678928744534920491", + "14190401905577395096208562", + "26614690829503587229829161" + ] + }, + { + "type": "redeemMasset", + "inputQty": "6292421712867", + "expectedQtys": [ + "362283502546", + "2074690052941", + "3891167755043" + ], + "redemptionFee": "1887726513", + "reserves": [ + "2477935678928382251417945", + "14190401905575320406155621", + "26614690829499696062074118" + ], + "mAssetSupply": "43025802982213349331056695" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "67875373006314509697024", + "expectedQty": "67497931173724610399292", + "reserves": [ + "2477935678928382251417945", + "14258277278581634915852645", + "26614690829499696062074118" + ] + }, + { + "type": "redeemMasset", + "inputQty": "1178378838703258311065", + "expectedQtys": [ + "67738393712138747734", + "389773151969421910951", + "727555772034874078056" + ], + "redemptionFee": "353513651610977493", + "reserves": [ + "2477867940534670112670211", + "14257887505429665493941694", + "26613963273727661187996062" + ], + "mAssetSupply": "43092122888062022294122415" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "24466176345476201185280", + "expectedQty": "24037691214733762961580", + "reserves": [ + "2477867940534670112670211", + "14257887505429665493941694", + "26638429450073137389181342" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "82508197417760358400", + "44938256511403253760", + "149924490498499215360" + ], + "expectedQty": "284099723380862749566", + "swapFee": "170562171331316439", + "reserves": [ + "2477785432337252352311811", + "14257842567173154090687934", + "26638279525582638889965982" + ], + "mAssetSupply": "43115876479553375194334429" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "3691032516125321886433280", + "expectedQty": "3865633816937272758119229", + "reserves": [ + "6168817948462574238745091", + "14257842567173154090687934", + "26638279525582638889965982" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "366801053098741334016", + "67331551249323376640", + "163295920888018894848" + ], + "expectedQty": "603160519959177097926", + "swapFee": "362113580123580406", + "reserves": [ + "6168451147409475497411075", + "14257775235621904767311294", + "26638116229661750871071134" + ], + "mAssetSupply": "46980907135970688775355732" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "2321448457957221335040", + "expectedQty": "2304516513556819644572", + "reserves": [ + "6168451147409475497411075", + "14257775235621904767311294", + "26640437678119708092406174" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "864225822793729441792", + "2069866911720016445440", + "855881329682151899136" + ], + "expectedQty": "3799234968799277911254", + "swapFee": "2280909526995764205", + "reserves": [ + "6167586921586681767969283", + "14255705368710184750865854", + "26639581796790025940507038" + ], + "mAssetSupply": "46979412417515446317089050" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "1604621178954849976320", + "1738318165405206839296", + "2692942837830177521664" + ], + "expectedQty": "6045923421619692457621", + "swapFee": "3629731892107079722", + "reserves": [ + "6165982300407726917992963", + "14253967050544779544026558", + "26636888853952195762985374" + ], + "mAssetSupply": "46973366494093826624631429" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "8761725709794641182720", + "expectedQty": "8593264599595104408977", + "swapFee": "5257035425876784709", + "reserves": [ + "6157389035808131813583986", + "14253967050544779544026558", + "26636888853952195762985374" + ], + "mAssetSupply": "46964610025419457860233418" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "53646032278675114688512", + "42986925164251391721472", + "97812353751244800524288" + ], + "expectedQty": "194735811755900340840011", + "swapFee": "116911634033960580852", + "reserves": [ + "6103743003529456698895474", + "14210980125380528152305086", + "26539076500200950962461086" + ], + "mAssetSupply": "46769874213663557519393407" + }, + { + "type": "mintMulti", + "inputQtys": [ + "8607866465131568300032", + "18980611917612278874112", + "13423668214355244089344" + ], + "expectedQty": "41070342473658280627371", + "reserves": [ + "6112350869994588267195506", + "14229960737298140431179198", + "26552500168415306206550430" + ], + "mAssetSupply": "46810944556137215800020778" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "1523321229712484990976", + "178451616684045893632", + "6371638161858317254656" + ], + "expectedQty": "8055868250475545516974", + "swapFee": "4836422803967707934", + "reserves": [ + "6110827548764875782204530", + "14229782285681456385285566", + "26546128530253447889295774" + ], + "mAssetSupply": "46802888687886740254503804" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "1826221501183206621184", + "outputIndex": 1, + "expectedQty": "1861015454692134877857", + "swapFee": "1116763849023742964", + "reserves": [ + "6112653770266058988825714", + "14227921270226764250407709", + "26546128530253447889295774" + ], + "mAssetSupply": "46802889804650589278246768", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "10195129034568468480", + "expectedQty": "10193711162464816517", + "swapFee": "6117077420741081", + "reserves": [ + "6112653770266058988825714", + "14227911076515601785591192", + "26546128530253447889295774" + ], + "mAssetSupply": "46802879615638632130519369" + }, + { + "type": "redeemMasset", + "inputQty": "1308235278752383028428", + "expectedQtys": [ + "170809794993829246684", + "397579621798910212725", + "741795452932233028024" + ], + "redemptionFee": "392470583625714908", + "reserves": [ + "6112482960471065159579030", + "14227513496893802875378467", + "26545386734800515656267750" + ], + "mAssetSupply": "46801571772830463373205849" + }, + { + "type": "mintMulti", + "inputQtys": [ + "322814578435342961999872", + "703218752280204679315456", + "1595135486534052785160192" + ], + "expectedQty": "2615339129068406373304888", + "reserves": [ + "6435297538906408121578902", + "14930732249174007554693923", + "28140522221334568441427942" + ], + "mAssetSupply": "49416910901898869746510737" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "3914978165842100", + "expectedQty": "3941839180571707", + "swapFee": "2348986899505", + "reserves": [ + "6435297538906408121578902", + "14930732249174007554693923", + "28140522217392729260856235" + ], + "mAssetSupply": "49416910897986240567568142" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "52141404678097819664384", + "expectedQty": "52129299659076929139198", + "swapFee": "31284842806858691798", + "reserves": [ + "6435297538906408121578902", + "14878602949514930625554725", + "28140522217392729260856235" + ], + "mAssetSupply": "49364800778150949606595556" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "130044524230636", + "expectedQty": "130938315127262", + "swapFee": "78026714538", + "reserves": [ + "6435297538906408121578902", + "14878602949514930625554725", + "28140522217261790945728973" + ], + "mAssetSupply": "49364800778020983109079458" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "21452207086983377321984", + "240773612844501040103424", + "64890809702220023463936" + ], + "expectedQty": "326979645583554821333054", + "swapFee": "196305570692548421852", + "reserves": [ + "6413845331819424744256918", + "14637829336670429585451301", + "28075631407559570922265037" + ], + "mAssetSupply": "49037821132437428287746404" + }, + { + "type": "mintMulti", + "inputQtys": [ + "2809674027777160192", + "2535647146116590080", + "1789510368877215744" + ], + "expectedQty": "7175021998427978719", + "reserves": [ + "6413848141493452521417110", + "14637831872317575702041381", + "28075633197069939799480781" + ], + "mAssetSupply": "49037828307459426715725123" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "457801859356865450737664", + "579687912259407696625664", + "680301012266867744571392" + ], + "expectedQty": "1721678548648558403841047", + "swapFee": "1033627305572478529422", + "reserves": [ + "5956046282136587070679446", + "14058143960058168005415717", + "27395332184803072054909389" + ], + "mAssetSupply": "47316149758810868311884076" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "355755517444035585245184", + "outputIndex": 0, + "expectedQty": "347501991933489143770674", + "swapFee": "213375300717959305579", + "reserves": [ + "5608544290203097926908772", + "14413899477502203590660901", + "27395332184803072054909389" + ], + "mAssetSupply": "47316363134111586271189655", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemBassets", + "inputQtys": [ + "100515407890719", + "164596732994268", + "225336958647363" + ], + "expectedQty": "490897004598605", + "swapFee": "294715031778", + "reserves": [ + "5608544290102582519018053", + "14413899477337606857666633", + "27395332184577735096262026" + ], + "mAssetSupply": "47316363133620689266591050" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "751558190599475719831552", + "expectedQty": "751444782131684066231044", + "swapFee": "450934914359685431898", + "reserves": [ + "5608544290102582519018053", + "13662454695205922791435589", + "27395332184577735096262026" + ], + "mAssetSupply": "46565255877935573232191396" + }, + { + "type": "mintMulti", + "inputQtys": [ + "50943052576177036197888", + "85472975892391149961216", + "27800472038017442250752" + ], + "expectedQty": "165165610917269533439598", + "reserves": [ + "5659487342678759555215941", + "13747927671098313941396805", + "27423132656615752538512778" + ], + "mAssetSupply": "46730421488852842765630994" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "94241096571478", + "119036153411274", + "199308736026695" + ], + "expectedQty": "413093915685947", + "swapFee": "248005152503", + "reserves": [ + "5659487342584518458644463", + "13747927670979277787985531", + "27423132656416443802486083" + ], + "mAssetSupply": "46730421488439748849945047" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "1347473049757465706496000", + "expectedQty": "1335798030329105630084191", + "reserves": [ + "5659487342584518458644463", + "13747927670979277787985531", + "28770605706173909508982083" + ] + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "782539806903590584320", + "expectedQty": "781911140077838660143", + "swapFee": "469523884142154350", + "reserves": [ + "5659487342584518458644463", + "13747145759839199949325388", + "28770605706173909508982083" + ], + "mAssetSupply": "48065437448485835031599268" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "3896673117607191642112", + "expectedQty": "3861783373788791115993", + "reserves": [ + "5659487342584518458644463", + "13747145759839199949325388", + "28774502379291516700624195" + ] + }, + { + "type": "redeemMasset", + "inputQty": "237548993054761", + "expectedQtys": [ + "27959679447343", + "67915301421187", + "142155254368753" + ], + "redemptionFee": "71264697916", + "reserves": [ + "5659487342556558779197120", + "13747145759771284647904201", + "28774502379149361446255442" + ], + "mAssetSupply": "48069299231622146094358416" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "661365727495491780870144", + "expectedQty": "661314269369289277835447", + "reserves": [ + "5659487342556558779197120", + "14408511487266776428774345", + "28774502379149361446255442" + ] + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "724210137662943859310592", + "expectedQty": "703094149571170548442776", + "swapFee": "434526082597766315586", + "reserves": [ + "4956393192985388230754344", + "14408511487266776428774345", + "28774502379149361446255442" + ], + "mAssetSupply": "48006837889411089279198857" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "188191551737739513692160", + "347102655723813715574784", + "245162241828609698299904" + ], + "expectedQty": "784174224477915823045173", + "swapFee": "470787006890884024241", + "reserves": [ + "4768201641247648717062184", + "14061408831542962713199561", + "28529340137320751747955538" + ], + "mAssetSupply": "47222663664933173456153684" + }, + { + "type": "mintMulti", + "inputQtys": [ + "13044873679289831424", + "16210039732695590912", + "3544725434171073536" + ], + "expectedQty": "33212733536029873593", + "reserves": [ + "4768214686121328006893608", + "14061425041582695408790473", + "28529343682046185919029074" + ], + "mAssetSupply": "47222696877666709486027277" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "899964409456926336", + "1125843482617944832", + "997255028773753728" + ], + "expectedQty": "3043804647153983680", + "swapFee": "1827379215821883", + "reserves": [ + "4768213786156918549967272", + "14061423915739212790845641", + "28529342684791157145275346" + ], + "mAssetSupply": "47222693833862062332043597" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "10342465298876046", + "expectedQty": "10333778536320104", + "reserves": [ + "4768213786156918549967272", + "14061423926081678089721687", + "28529342684791157145275346" + ] + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "1375998167614558", + "expectedQty": "1376328563841388", + "swapFee": "825598900568", + "reserves": [ + "4768213786156918549967272", + "14061423924705349525880299", + "28529342684791157145275346" + ], + "mAssetSupply": "47222693842820668299649711" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "88026188169573346312192", + "42370325404217226821632", + "50282404666591949094912" + ], + "expectedQty": "183298304788573137693755", + "swapFee": "110045009879071325411", + "reserves": [ + "4680187597987345203655080", + "14019053599301132299058667", + "28479060280124565196180434" + ], + "mAssetSupply": "47039395538032095161955956" + }, + { + "type": "mintMulti", + "inputQtys": [ + "5834407827335503937536", + "6298696548265343582208", + "2201012247739979005952" + ], + "expectedQty": "14519398221931376338920", + "reserves": [ + "4686022005814680707592616", + "14025352295849397642640875", + "28481261292372305175186386" + ], + "mAssetSupply": "47053914936254026538294876" + }, + { + "type": "redeemMasset", + "inputQty": "10060241612621776053862", + "expectedQtys": [ + "1001582352718809639925", + "2997754883087618982058", + "6087536221173596459689" + ], + "redemptionFee": "3018072483786532816", + "reserves": [ + "4685020423461961897952691", + "14022354540966310023658817", + "28475173756151131578726697" + ], + "mAssetSupply": "47043857712713888548773830" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "214939905445590532096", + "expectedQty": "222813349139781890765", + "reserves": [ + "4685235363367407488484787", + "14022354540966310023658817", + "28475173756151131578726697" + ] + }, + { + "type": "redeemMasset", + "inputQty": "20518809084189503756697", + "expectedQtys": [ + "2042905467080053557849", + "6114174108957884647270", + "12416043940359429714517" + ], + "redemptionFee": "6155642725256851127", + "reserves": [ + "4683192457900327434926938", + "14016240366857352139011547", + "28462757712210772149012180" + ], + "mAssetSupply": "47023567872621564083759025" + }, + { + "type": "redeemMasset", + "inputQty": "1872170059555777664149094", + "expectedQtys": [ + "186398071850921098069671", + "557867352765723446310452", + "1132860373518507494115896" + ], + "redemptionFee": "561651017866733299244", + "reserves": [ + "4496794386049406336857267", + "13458373014091628692701095", + "27329897338692264654896284" + ], + "mAssetSupply": "45151959464083653152909175" + }, + { + "type": "mintMulti", + "inputQtys": [ + "130098369475567616000", + "300945770285846888448", + "257481026856582610944" + ], + "expectedQty": "690328362434266501421", + "reserves": [ + "4496924484418881904473267", + "13458673959861914539589543", + "27330154819719121237507228" + ], + "mAssetSupply": "45152649792446087419410596" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "38465864564423680", + "expectedQty": "38431333736250791", + "reserves": [ + "4496924484418881904473267", + "13458673998327779104013223", + "27330154819719121237507228" + ] + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "45521770948438742007808", + "outputIndex": 0, + "expectedQty": "43829438569274667263396", + "swapFee": "27287951963424743484", + "reserves": [ + "4453095045849607237209871", + "13504195769276217846021031", + "27330154819719121237507228" + ], + "mAssetSupply": "45152677118829384580404871", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mintMulti", + "inputQtys": [ + "6285651525495115743232", + "12488755009532494610432", + "2796867463703477878784" + ], + "expectedQty": "21764301114246572122886", + "reserves": [ + "4459380697375102352953103", + "13516684524285750340631463", + "27332951687182824715386012" + ], + "mAssetSupply": "45174441419943631152527757" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "350321123419078640271360", + "expectedQty": "336530132728722541260792", + "swapFee": "210192674051447184162", + "reserves": [ + "4122850564646379811692311", + "13516684524285750340631463", + "27332951687182824715386012" + ], + "mAssetSupply": "44824330489198603959440559" + }, + { + "type": "mintMulti", + "inputQtys": [ + "80730285065859137536", + "43802441254380314624", + "84477994882550382592" + ], + "expectedQty": "211517068185884115168", + "reserves": [ + "4122931294931445670829847", + "13516728326727004720946087", + "27333036165177707265768604" + ], + "mAssetSupply": "44824542006266789843555727" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "16904322240707904", + "expectedQty": "16917058985602843", + "swapFee": "10142593344424", + "reserves": [ + "4122931294931445670829847", + "13516728309809945735343244", + "27333036165177707265768604" + ], + "mAssetSupply": "44824541989372610196192247" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "8505514080363303", + "expectedQty": "8511922652069510", + "swapFee": "5103308448217", + "reserves": [ + "4122931294931445670829847", + "13516728301298023083273734", + "27333036165177707265768604" + ], + "mAssetSupply": "44824541980872199424277161" + }, + { + "type": "redeemMasset", + "inputQty": "2386941925240152", + "expectedQtys": [ + "219483451893070", + "719560422827512", + "1455068905859878" + ], + "redemptionFee": "716082577572", + "reserves": [ + "4122931294711962218936777", + "13516728300578462660446222", + "27333036163722638359908726" + ], + "mAssetSupply": "44824541978485973581614581" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "88677962224574354423808", + "93591896085962768252928", + "29145619241238226010112" + ], + "expectedQty": "214900187136643451577125", + "swapFee": "129017522795663469027", + "reserves": [ + "4034253332487387864512969", + "13423136404492499892193294", + "27303890544481400133898614" + ], + "mAssetSupply": "44609641791349330130037456" + }, + { + "type": "redeemMasset", + "inputQty": "9063262240745342", + "expectedQtys": [ + "819386244348925", + "2726336801233797", + "5545619098630739" + ], + "redemptionFee": "2718978672223", + "reserves": [ + "4034253331668001620164044", + "13423136401766163090959497", + "27303890538935781035267875" + ], + "mAssetSupply": "44609641782288786867964337" + }, + { + "type": "redeemMasset", + "inputQty": "11187998795941299827507", + "expectedQtys": [ + "1011478215203089089714", + "3365482763193858066906", + "6845700604281247349763" + ], + "redemptionFee": "3356399638782389948", + "reserves": [ + "4033241853452798531074330", + "13419770919002969232892591", + "27297044838331499787918112" + ], + "mAssetSupply": "44598457139892484350526778" + }, + { + "type": "redeemMasset", + "inputQty": "58477391717000576", + "expectedQtys": [ + "5286790683701283", + "17590693156983183", + "35781083204896905" + ], + "redemptionFee": "17543217515100", + "reserves": [ + "4033241848166007847373047", + "13419770901412276075909408", + "27297044802550416583021207" + ], + "mAssetSupply": "44598457081432635851041302" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "953854470515166334156800", + "expectedQty": "942548388415251382967189", + "reserves": [ + "4033241848166007847373047", + "13419770901412276075909408", + "28250899273065582917178007" + ] + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "251138494649959284736", + "expectedQty": "248093887122119829472", + "reserves": [ + "4033241848166007847373047", + "13419770901412276075909408", + "28251150411560232876462743" + ] + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "1243469464430005333262336", + "outputIndex": 2, + "expectedQty": "1254938637760885655825352", + "swapFee": "744827030147927128394", + "reserves": [ + "4033241848166007847373047", + "14663240365842281409171744", + "26996211773799347220637391" + ], + "mAssetSupply": "45541998390765157280966357", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "2861661311775873955790848", + "outputIndex": 2, + "expectedQty": "2877509432849627385528468", + "swapFee": "1710648158408317125912", + "reserves": [ + "4033241848166007847373047", + "17524901677618155364962592", + "24118702340949719835108923" + ], + "mAssetSupply": "45543709038923565598092269", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "377585081790637914718208", + "expectedQty": "392609343447660135545881", + "reserves": [ + "4410826929956645762091255", + "17524901677618155364962592", + "24118702340949719835108923" + ] + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "254179325546682548224", + "outputIndex": 1, + "expectedQty": "253066519426727753846", + "swapFee": "151245363039930619", + "reserves": [ + "4410826929956645762091255", + "17524648611098728637208746", + "24118956520275266517657147" + ], + "mAssetSupply": "45936318533616588773568769", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "123990247598879248744448", + "outputIndex": 0, + "expectedQty": "118882801895777356753303", + "swapFee": "74055889860562500605", + "reserves": [ + "4291944128060868405337952", + "17648638858697607885953194", + "24118956520275266517657147" + ], + "mAssetSupply": "45936392589506449336069374", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemMasset", + "inputQty": "9112423722007397990", + "expectedQtys": [ + "851139549233081684", + "3499918469245342591", + "4783053359530650883" + ], + "redemptionFee": "2733727116602219", + "reserves": [ + "4291943276921319172256268", + "17648635358779138640610603", + "24118951737221906987006264" + ], + "mAssetSupply": "45936383479816454445273603" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "357593304615181462011904", + "381640382116452764745728", + "657591496288975454208" + ], + "expectedQty": "752941405784559252366647", + "swapFee": "452036065109801432279", + "reserves": [ + "3934349972306137710244364", + "17266994976662685875864875", + "24118294145725618011552056" + ], + "mAssetSupply": "45183442074031895192906956" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "195138905774366975328256", + "expectedQty": "196015789216352144363787", + "swapFee": "117083343464620185196", + "reserves": [ + "3934349972306137710244364", + "17070979187446333731501088", + "24118294145725618011552056" + ], + "mAssetSupply": "44988420251600992837763896" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "15415546365025366048768", + "expectedQty": "15552058233725534082790", + "swapFee": "9249327819015219629", + "reserves": [ + "3934349972306137710244364", + "17070979187446333731501088", + "24102742087491892477469266" + ], + "mAssetSupply": "44973013954563786486934757" + }, + { + "type": "mintMulti", + "inputQtys": [ + "582098103613248652705792", + "1148738200994318234157056", + "1127176092128622350958592" + ], + "expectedQty": "2866405879898586621111818", + "reserves": [ + "4516448075919386362950156", + "18219717388440651965658144", + "25229918179620514828427858" + ], + "mAssetSupply": "47839419834462373108046575" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "2156353384380531583483904", + "expectedQty": "2145266012825657845732285", + "reserves": [ + "4516448075919386362950156", + "20376070772821183549142048", + "25229918179620514828427858" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "85594786604902026051584", + "119060948554430501879808", + "34017174176551458045952" + ], + "expectedQty": "241188086114712639818731", + "reserves": [ + "4602042862524288389001740", + "20495131721375614051021856", + "25263935353797066286473810" + ], + "mAssetSupply": "50225873933402743593597591" + }, + { + "type": "mintMulti", + "inputQtys": [ + "5404822696732269740032", + "247300249506757541888", + "735855815823874850816" + ], + "expectedQty": "6595729486330280185714", + "reserves": [ + "4607447685221020658741772", + "20495379021625120808563744", + "25264671209612890161324626" + ], + "mAssetSupply": "50232469662889073873783305" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "3434885092376303894528", + "expectedQty": "3415706326905269251822", + "reserves": [ + "4607447685221020658741772", + "20498813906717497112458272", + "25264671209612890161324626" + ] + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "622801118347643441905664", + "expectedQty": "627404013875442573110756", + "swapFee": "373680671008586065143", + "reserves": [ + "4607447685221020658741772", + "20498813906717497112458272", + "24637267195737447588213870" + ], + "mAssetSupply": "49613457931539344287194606" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "573259120221509451776", + "expectedQty": "595381622458007946197", + "reserves": [ + "4608020944341242168193548", + "20498813906717497112458272", + "24637267195737447588213870" + ] + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "45746717458497674412032", + "expectedQty": "45389497257412051926917", + "reserves": [ + "4608020944341242168193548", + "20498813906717497112458272", + "24683013913195945262625902" + ] + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "830513051005903471378432", + "expectedQty": "834558923035729912079737", + "swapFee": "498307830603542082827", + "reserves": [ + "4608020944341242168193548", + "19664254983681767200378535", + "24683013913195945262625902" + ], + "mAssetSupply": "48829428067243914417772115" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "19132269310882315501568", + "outputIndex": 1, + "expectedQty": "19069563889338360185560", + "swapFee": "11388604672933419096", + "reserves": [ + "4608020944341242168193548", + "19645185419792428840192975", + "24702146182506827578127470" + ], + "mAssetSupply": "48829439455848587351191211", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "2909435945698703966208", + "expectedQty": "2894198683492077694027", + "reserves": [ + "4608020944341242168193548", + "19648094855738127544159183", + "24702146182506827578127470" + ] + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "33427497195914328539136", + "expectedQty": "33673620650915464685583", + "swapFee": "20056498317548597123", + "reserves": [ + "4608020944341242168193548", + "19648094855738127544159183", + "24668472561855912113441887" + ], + "mAssetSupply": "48798926213834482648943225" + }, + { + "type": "redeemMasset", + "inputQty": "63901947708370360729", + "expectedQtys": [ + "6032369927166295670", + "25721362373453713982", + "32293549406282080242" + ], + "redemptionFee": "19170584312511108", + "reserves": [ + "4608014911971315001897878", + "19648069134375754090445201", + "24668440268306505831361645" + ], + "mAssetSupply": "48798862331057358591093604" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "737042684498109848879104", + "619528191946840787124224", + "651941308566886923894784" + ], + "expectedQty": "2031156331058973881528235", + "swapFee": "1219425453907728966296", + "reserves": [ + "3870972227473205153018774", + "19028540942428913303320977", + "24016498959739618907466861" + ], + "mAssetSupply": "46767705999998384709565369" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "349561211007536159784960", + "expectedQty": "365547589471788103999673", + "reserves": [ + "4220533438480741312803734", + "19028540942428913303320977", + "24016498959739618907466861" + ] + }, + { + "type": "redeemMasset", + "inputQty": "4242950080010812620", + "expectedQtys": [ + "379819746640245956", + "1712441260100177799", + "2161324079772637233" + ], + "redemptionFee": "1272885024003243", + "reserves": [ + "4220533058660994672557778", + "19028539229987653203143178", + "24016496798415539134829628" + ], + "mAssetSupply": "47133249347792977826755665" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "305406367098262580625408", + "expectedQty": "307798261858921625349858", + "swapFee": "183243820258957548375", + "reserves": [ + "4220533058660994672557778", + "19028539229987653203143178", + "23708698536556617509479770" + ], + "mAssetSupply": "46828026224514974203678632" + }, + { + "type": "redeemMasset", + "inputQty": "30078982678706540", + "expectedQtys": [ + "2710155994097889", + "12218909065822856", + "15224207596064678" + ], + "redemptionFee": "9023694803611", + "reserves": [ + "4220533055950838678459889", + "19028539217768744137320322", + "23708698521332409913415092" + ], + "mAssetSupply": "46828026194445015219775703" + }, + { + "type": "redeemMasset", + "inputQty": "455854954324893685409382", + "expectedQtys": [ + "41073132362864783826042", + "185180805268518876947824", + "230726900988235143764589" + ], + "redemptionFee": "136756486297468105622", + "reserves": [ + "4179459923587973894633847", + "18843358412500225260372498", + "23477971620344174769650503" + ], + "mAssetSupply": "46372307996606419002471943" + }, + { + "type": "redeemMasset", + "inputQty": "980474563895157738124083", + "expectedQtys": [ + "88342050819494141432921", + "398295702536121644607932", + "496258416145434422107702" + ], + "redemptionFee": "294142369168547321437", + "reserves": [ + "4091117872768479753200926", + "18445062709964103615764566", + "22981713204198740347542801" + ], + "mAssetSupply": "45392127575080429811669297" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "158907401001458762514432", + "expectedQty": "160134476423051486204896", + "swapFee": "95344440600875257508", + "reserves": [ + "4091117872768479753200926", + "18445062709964103615764566", + "22821578727775688861337905" + ], + "mAssetSupply": "45233315518519571924412373" + }, + { + "type": "redeemMasset", + "inputQty": "2072270074113276090777", + "expectedQtys": [ + "187369810722737201313", + "844768597780896360063", + "1045209407208728357205" + ], + "redemptionFee": "621681022233982827", + "reserves": [ + "4090930502957757015999613", + "18444217941366322719404503", + "22820533518368480132980700" + ], + "mAssetSupply": "45231243870126480882304423" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "15685661191785282535424", + "outputIndex": 2, + "expectedQty": "16451163498996025639619", + "swapFee": "9795802062292305530", + "reserves": [ + "4106616164149542298535037", + "18444217941366322719404503", + "22804082354869484107341081" + ], + "mAssetSupply": "45231253665928543174609953", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemBassets", + "inputQtys": [ + "6041493384995214983168", + "620640794942571413504", + "3369613191432837791744" + ], + "expectedQty": "10246613712418399458377", + "swapFee": "6151659222984830573", + "reserves": [ + "4100574670764547083551869", + "18443597300571380147990999", + "22800712741678051269549337" + ], + "mAssetSupply": "45221007052216124775151576" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "238946270529728380928", + "expectedQty": "240774978575321727028", + "swapFee": "143367762317837028", + "reserves": [ + "4100574670764547083551869", + "18443597300571380147990999", + "22800471966699475947822309" + ], + "mAssetSupply": "45220768249313357364607676" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "131091724691654104317952", + "expectedQty": "132090847817687710197501", + "swapFee": "78655034814992462590", + "reserves": [ + "4100574670764547083551869", + "18443597300571380147990999", + "22668381118881788237624808" + ], + "mAssetSupply": "45089755179656518252752314" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "1814735835432399142912", + "expectedQty": "1888174075871747623447", + "reserves": [ + "4102389406599979482694781", + "18443597300571380147990999", + "22668381118881788237624808" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "5870047160536092639232", + "5261253181533379887104", + "3382823252133051629568" + ], + "expectedQty": "14694026060724972634577", + "reserves": [ + "4108259453760515575334013", + "18448858553752913527878103", + "22671763942133921289254376" + ], + "mAssetSupply": "45106337379793114973010338" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "130690953429944848", + "outputIndex": 1, + "expectedQty": "130290048067823511", + "swapFee": "77778388985313", + "reserves": [ + "4108259453760515575334013", + "18448858423462865460054592", + "22671764072824874719199224" + ], + "mAssetSupply": "45106337379870893361995651", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "601500634807620599808", + "expectedQty": "604560227035013917330", + "swapFee": "360900380884572359", + "reserves": [ + "4108259453760515575334013", + "18448253863235830446137262", + "22671764072824874719199224" + ], + "mAssetSupply": "45105736240136466625968202" + }, + { + "type": "redeemMasset", + "inputQty": "1044196673770027692851", + "expectedQtys": [ + "95077572495711601655", + "426948495790729532490", + "524693320006008712101" + ], + "redemptionFee": "313259002131008307", + "reserves": [ + "4108164376188019863732358", + "18447826914740039716604772", + "22671239379504868710487123" + ], + "mAssetSupply": "45104692356721698729283658" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "777769851201157765005312", + "expectedQty": "740922221340017855000022", + "swapFee": "466661910720694659003", + "reserves": [ + "3367242154848002008732336", + "18447826914740039716604772", + "22671239379504868710487123" + ], + "mAssetSupply": "44327389167431261658937349" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "1334216408623137423360", + "expectedQty": "1258228102004678564303", + "swapFee": "800529845173882454", + "reserves": [ + "3365983926745997330168033", + "18447826914740039716604772", + "22671239379504868710487123" + ], + "mAssetSupply": "44326055751552483695396443" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "737162705633186651570176", + "expectedQty": "773416145766836510938863", + "reserves": [ + "4103146632379183981738209", + "18447826914740039716604772", + "22671239379504868710487123" + ] + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "1986640349660322988032", + "outputIndex": 2, + "expectedQty": "2082627532513185879121", + "swapFee": "1240175270673742764", + "reserves": [ + "4105133272728844304726241", + "18447826914740039716604772", + "22669156751972355524608002" + ], + "mAssetSupply": "45099473137494590880078070", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "8689477036374980608", + "outputIndex": 2, + "expectedQty": "8705760885380221576", + "swapFee": "5184160182815494", + "reserves": [ + "4105133272728844304726241", + "18447835604217076091585380", + "22669148046211470144386426" + ], + "mAssetSupply": "45099473142678751062893564", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "122768456963261726720", + "expectedQty": "123393592324278313496", + "swapFee": "73661074177957036", + "reserves": [ + "4105133272728844304726241", + "18447712210624751813271884", + "22669148046211470144386426" + ], + "mAssetSupply": "45099350447882861979123880" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "95285094691096936579072", + "276328978883424727072768", + "269158615273481292480512" + ], + "expectedQty": "640890365024517042259523", + "swapFee": "384765078061547153647", + "reserves": [ + "4009848178037747368147169", + "18171383231741327086199116", + "22399989430937988851905914" + ], + "mAssetSupply": "44458460082858344936864357" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "568648304371855251210240", + "outputIndex": 0, + "expectedQty": "537244229766422827523193", + "swapFee": "338335952983669926071", + "reserves": [ + "3472603948271324540623976", + "18171383231741327086199116", + "22968637735309844103116154" + ], + "mAssetSupply": "44458798418811328606790428", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "139190882298507777015808", + "expectedQty": "146748083217868407989700", + "reserves": [ + "3611794830569832317639784", + "18171383231741327086199116", + "22968637735309844103116154" + ] + }, + { + "type": "redeemMasset", + "inputQty": "23442598321277727539", + "expectedQtys": [ + "1897621733463924767", + "9547167922108684019", + "12067625155692207129" + ], + "redemptionFee": "7032779496383318", + "reserves": [ + "3611792932948098853715017", + "18171373684573404977515097", + "22968625667684688410909025" + ], + "mAssetSupply": "44605523066463655233435907" + }, + { + "type": "redeemMasset", + "inputQty": "39970261104252330757324", + "expectedQtys": [ + "3235496130768618363969", + "16278178272860804706047", + "20575625695188346351472" + ], + "redemptionFee": "11991078331275699227", + "reserves": [ + "3608557436817330235351048", + "18155095506300544172809050", + "22948050041989500064557553" + ], + "mAssetSupply": "44565564796437734178377810" + }, + { + "type": "mintMulti", + "inputQtys": [ + "121474361142081633648640", + "10698549620305171578880", + "43585847242002362531840" + ], + "expectedQty": "181434031822799402617746", + "reserves": [ + "3730031797959411868999688", + "18165794055920849344387930", + "22991635889231502427089393" + ], + "mAssetSupply": "44746998828260533580995556" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "387429066132113300914176", + "outputIndex": 0, + "expectedQty": "364634291762093284799545", + "swapFee": "230994007783644625978", + "reserves": [ + "3365397506197318584200143", + "18553223122052962645302106", + "22991635889231502427089393" + ], + "mAssetSupply": "44747229822268317225621534", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mintMulti", + "inputQtys": [ + "444861859502780701474816", + "44025414806980729503744", + "253860069649476136992768" + ], + "expectedQty": "764231775046867987546382", + "reserves": [ + "3810259365700099285674959", + "18597248536859943374805850", + "23245495958880978564082161" + ], + "mAssetSupply": "45511461597315185213167916" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "389240881643843289088", + "outputIndex": 2, + "expectedQty": "390115282595751650602", + "swapFee": "232088305817298179", + "reserves": [ + "3810259365700099285674959", + "18597637777741587218094938", + "23245105843598382812431559" + ], + "mAssetSupply": "45511461829403491030466095", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "1395693648304743330611200", + "outputIndex": 0, + "expectedQty": "1281858894367861018469469", + "swapFee": "829540141768855422484", + "reserves": [ + "2528400471332238267205490", + "18597637777741587218094938", + "24640799491903126143042759" + ], + "mAssetSupply": "45512291369545259885888579", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "48589073966212969398272", + "expectedQty": "49288040040098672196701", + "swapFee": "29153444379727781638", + "reserves": [ + "2528400471332238267205490", + "18597637777741587218094938", + "24591511451863027470846058" + ], + "mAssetSupply": "45463731449023426644271945" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "3155332583584922408583168", + "expectedQty": "3197058640342581377710829", + "swapFee": "1893199550150953445149", + "reserves": [ + "2528400471332238267205490", + "18597637777741587218094938", + "21394452811520446093135229" + ], + "mAssetSupply": "42310292064988655189133926" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "1403602858748632239177728", + "766351270205178536525824", + "1480228243218990274445312" + ], + "hardLimitError": true + }, + { + "type": "mintMulti", + "inputQtys": [ + "5710849690368480378880", + "14721989597883753562112", + "34511382757405444014080" + ], + "expectedQty": "54923104377463849513911", + "reserves": [ + "2534111321022606747584370", + "18612359767339470971657050", + "21428964194277851537149309" + ], + "mAssetSupply": "42365215169366119038647837" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "1813924754880927845318656", + "4124440483477878195879936", + "1910104849196735730286592" + ], + "hardLimitError": true + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "4385780756361144715706368", + "expectedQty": "4545786999723517360625967", + "reserves": [ + "6919892077383751463290738", + "18612359767339470971657050", + "21428964194277851537149309" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "3869846205555786240", + "13213865968491214848", + "4118996677186481152" + ], + "expectedQty": "21199098628659732242", + "reserves": [ + "6919895947229957019076978", + "18612372981205439462871898", + "21428968313274528723630461" + ], + "mAssetSupply": "46911023368188265059006046" + }, + { + "type": "redeemMasset", + "inputQty": "17564104422635454464", + "expectedQtys": [ + "2590122827309963795", + "6966626737837765899", + "8020880720920728969" + ], + "redemptionFee": "5269231326790636", + "reserves": [ + "6919893357107129709113183", + "18612366014578701625105999", + "21428960292393807802901492" + ], + "mAssetSupply": "46911005809353073750342218" + }, + { + "type": "redeemMasset", + "inputQty": "7210529586619887616", + "expectedQtys": [ + "1063313951563021525", + "2859984602880141789", + "3292783756991009073" + ], + "redemptionFee": "2163158875985966", + "reserves": [ + "6919892293793178146091658", + "18612363154594098744964210", + "21428956999610050811892419" + ], + "mAssetSupply": "46910998600986646006440568" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "109873995480043333091328", + "expectedQty": "109417301228278918857629", + "reserves": [ + "6919892293793178146091658", + "18612363154594098744964210", + "21538830995090094144983747" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "14867716368442819870720", + "18952907882198988750848", + "29651354837070592868352" + ], + "expectedQty": "63492930852988442715997", + "swapFee": "38118629689606829727", + "reserves": [ + "6905024577424735326220938", + "18593410246711899756213362", + "21509179640253023552115395" + ], + "mAssetSupply": "46956922971361936482582200" + }, + { + "type": "redeemMasset", + "inputQty": "12316944845545", + "expectedQtys": [ + "1810665751821", + "4875645374727", + "5640231180599" + ], + "redemptionFee": "3695083453", + "reserves": [ + "6905024577422924660469117", + "18593410246707024110838635", + "21509179640247383320934796" + ], + "mAssetSupply": "46956922971349623232820108" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "21506718712746176512", + "outputIndex": 1, + "expectedQty": "21844821891650749070", + "swapFee": "13077075359207546", + "reserves": [ + "6905046084141637406645629", + "18593388401885132460089565", + "21509179640247383320934796" + ], + "mAssetSupply": "46956922984426698592027654", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mintMulti", + "inputQtys": [ + "11874380376427196317696", + "10543266175504059727872", + "10388677554483601866752" + ], + "expectedQty": "32891723934706760631948", + "reserves": [ + "6916920464518064602963325", + "18603931668060636519817437", + "21519568317801866922801548" + ], + "mAssetSupply": "46989814708361405352659602" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "1231366829455446466625536", + "expectedQty": "1225983720364523461167699", + "reserves": [ + "6916920464518064602963325", + "18603931668060636519817437", + "22750935147257313389427084" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "208307807780866516582400", + "50945339745685892759552", + "1075165251185095213056" + ], + "expectedQty": "263250263181736654097981", + "swapFee": "158044984899981981647", + "reserves": [ + "6708612656737198086380925", + "18552986328314950627057885", + "22749859982006128294214028" + ], + "mAssetSupply": "47952548165544192159729320" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "195594245483627839488", + "expectedQty": "194667106593634194774", + "reserves": [ + "6708612656737198086380925", + "18552986328314950627057885", + "22750055576251611922053516" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "774384684942842496", + "1926305005584850688", + "4088360507601636864" + ], + "expectedQty": "6775933084641163970", + "reserves": [ + "6708613431121883029223421", + "18552988254619956211908573", + "22750059664612119523690380" + ], + "mAssetSupply": "47952749608583870435088064" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "20622384285102528", + "expectedQty": "20935601219853694", + "reserves": [ + "6708613451744267314325949", + "18552988254619956211908573", + "22750059664612119523690380" + ] + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "66819258248856348917760", + "expectedQty": "66969485255555215088570", + "swapFee": "40091554949313809350", + "reserves": [ + "6708613451744267314325949", + "18486018769364400996820003", + "22750059664612119523690380" + ], + "mAssetSupply": "47885970462825564619833348" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "183539344384775104", + "outputIndex": 0, + "expectedQty": "179835316448536874", + "swapFee": "109600787608356", + "reserves": [ + "6708613271908950865789075", + "18486018769364400996820003", + "22750059848151463908465484" + ], + "mAssetSupply": "47885970462935165407441704", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "1349950780219371980587008", + "expectedQty": "1343242932195348619870235", + "reserves": [ + "6708613271908950865789075", + "18486018769364400996820003", + "24100010628370835889052492" + ] + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "1852935429093380434427904", + "outputIndex": 2, + "expectedQty": "1882133030719509961929788", + "swapFee": "1125801047723940183987", + "reserves": [ + "8561548701002331300216979", + "18486018769364400996820003", + "22217877597651325927122704" + ], + "mAssetSupply": "49230339196178237967495926", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "569991619025818697596928", + "expectedQty": "574659084834485509877519", + "reserves": [ + "9131540320028149997813907", + "18486018769364400996820003", + "22217877597651325927122704" + ] + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "607468689172959365955584", + "expectedQty": "605506165225100535236275", + "reserves": [ + "9131540320028149997813907", + "18486018769364400996820003", + "22825346286824285293078288" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "10744267432161822720", + "25160663282271539200", + "41977481435780038656" + ], + "expectedQty": "77788862274349521321", + "swapFee": "46701338167510218", + "reserves": [ + "9131529575760717835991187", + "18485993608701118725280803", + "22825304309342849513039632" + ], + "mAssetSupply": "50410426657375549663088399" + }, + { + "type": "redeemMasset", + "inputQty": "32674785350888608", + "expectedQtys": [ + "5917054811100012", + "11978566844998335", + "14790356375445204" + ], + "redemptionFee": "9802435605266", + "reserves": [ + "9131529569843663024891175", + "18485993596722551880282468", + "22825304294552493137594428" + ], + "mAssetSupply": "50410426624710566747805057" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "977671971016324284416", + "2845845653791980912640", + "2570725153476701061120" + ], + "expectedQty": "6389001598542030369994", + "swapFee": "3835702380553550352", + "reserves": [ + "9130551897872646700606759", + "18483147751068759899369828", + "22822733569399016436533308" + ], + "mAssetSupply": "50404037623112024717435063" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "22893662914707935232", + "outputIndex": 1, + "expectedQty": "23096514725751852531", + "swapFee": "13844605505170917", + "reserves": [ + "9130574791535561408541991", + "18483124654554034147517297", + "22822733569399016436533308" + ], + "mAssetSupply": "50404037636956630222605980", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "70333457913300826193920", + "expectedQty": "70524288751425185839340", + "swapFee": "42200074747980495716", + "reserves": [ + "9130574791535561408541991", + "18483124654554034147517297", + "22752209280647591250693968" + ], + "mAssetSupply": "50333746379118077376907776" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "37051326138518806528", + "expectedQty": "37087232254235826526", + "swapFee": "22230795683111283", + "reserves": [ + "9130574791535561408541991", + "18483087567321779911690771", + "22752209280647591250693968" + ], + "mAssetSupply": "50333709350022734541212531" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "115948346385952480952320", + "34880987554050465595392", + "119914623122126212694016" + ], + "expectedQty": "271212451104784608699146", + "swapFee": "162825165762328162116", + "reserves": [ + "9014626445149608927589671", + "18448206579767729446095379", + "22632294657525465037999952" + ], + "mAssetSupply": "50062496898917949932513385" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "19647403317517459914752", + "outputIndex": 0, + "expectedQty": "19414204177796617766937", + "swapFee": "11749295668754542378", + "reserves": [ + "8995212240971812309822734", + "18448206579767729446095379", + "22651942060842982497914704" + ], + "mAssetSupply": "50062508648213618687055763", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "48880808597303681089536", + "expectedQty": "49272682181855843239368", + "reserves": [ + "9044093049569115990912270", + "18448206579767729446095379", + "22651942060842982497914704" + ] + }, + { + "type": "redeemMasset", + "inputQty": "120618952726031529672704", + "expectedQtys": [ + "21762582297682656422919", + "44391473167779213622350", + "54506820153173987825731" + ], + "redemptionFee": "36185685817809458901", + "reserves": [ + "9022330467271433334489351", + "18403815106599950232473029", + "22597435240689808510088973" + ], + "mAssetSupply": "49991198563355260810081328" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "12342734197295161344", + "17734424296818208768", + "20238697235994456064" + ], + "expectedQty": "50318813309535980394", + "swapFee": "30209413633901929", + "reserves": [ + "9022318124537236039328007", + "18403797372175653414264261", + "22597415001992572515632909" + ], + "mAssetSupply": "49991148244541951274100934" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "2756118270623927500800", + "outputIndex": 0, + "expectedQty": "2723631074911787360356", + "swapFee": "1648196577049823467", + "reserves": [ + "9019594493462324251967651", + "18403797372175653414264261", + "22600171120263196443133709" + ], + "mAssetSupply": "49991149892738528323924401", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "178181203212023571152896", + "expectedQty": "176634368724749783507581", + "swapFee": "106908721927214142691", + "reserves": [ + "8842960124737574468460070", + "18403797372175653414264261", + "22600171120263196443133709" + ], + "mAssetSupply": "49813075598248431966914196" + }, + { + "type": "mintMulti", + "inputQtys": [ + "1481213286972021301837824", + "2311188600425395488030720", + "2259781477294963593052160" + ], + "expectedQty": "6052733714472487375735718", + "reserves": [ + "10324173411709595770297894", + "20714985972601048902294981", + "24859952597558160036185869" + ], + "mAssetSupply": "55865809312720919342649914" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "2379589498608577150976", + "4504685547117665058816", + "3716710502120901050368" + ], + "expectedQty": "10599988622265740230554", + "swapFee": "6363811460235585489", + "reserves": [ + "10321793822210987193146918", + "20710481287053931237236165", + "24856235887056039135135501" + ], + "mAssetSupply": "55855209324098653602419360" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "267531819957865412558848", + "expectedQty": "269470907096887446626215", + "reserves": [ + "10589325642168852605705766", + "20710481287053931237236165", + "24856235887056039135135501" + ] + }, + { + "type": "redeemMasset", + "inputQty": "15003394122579283148", + "expectedQtys": [ + "2829916583928845961", + "5534718303683969238", + "6642639628600590307" + ], + "redemptionFee": "4501018236773784", + "reserves": [ + "10589322812252268676859805", + "20710475752335627553266927", + "24856229244416410534545194" + ], + "mAssetSupply": "56124665232302436706536211" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "1826920120632178959712256", + "expectedQty": "1823685448632714601262890", + "reserves": [ + "10589322812252268676859805", + "22537395872967806512979183", + "24856229244416410534545194" + ] + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "182259281903081469509632", + "expectedQty": "182661599043434287425670", + "swapFee": "109355569141848881705", + "reserves": [ + "10589322812252268676859805", + "22537395872967806512979183", + "24673567645372976247119524" + ], + "mAssetSupply": "57766200754601211687171174" + }, + { + "type": "mintMulti", + "inputQtys": [ + "683059692124632543920128", + "524244380264273406853120", + "361991792629488495362048" + ], + "expectedQty": "1572229071863120995351025", + "reserves": [ + "11272382504376901220779933", + "23061640253232079919832303", + "25035559438002464742481572" + ], + "mAssetSupply": "59338429826464332682522199" + }, + { + "type": "mintMulti", + "inputQtys": [ + "1074716830152849656643584", + "491600946366127494135808", + "609327242949329120395264" + ], + "expectedQty": "2180103009385418831777618", + "reserves": [ + "12347099334529750877423517", + "23553241199598207413968111", + "25644886680951793862876836" + ], + "mAssetSupply": "61518532835849751514299817" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "113102055933188581097472", + "expectedQty": "113297998419047058347711", + "swapFee": "67861233559913148658", + "reserves": [ + "12347099334529750877423517", + "23553241199598207413968111", + "25531588682532746804529125" + ], + "mAssetSupply": "61405498641150122846351003" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "2405322929898107961344", + "610305759638853779456", + "2002901867137633615872" + ], + "expectedQty": "5026923102057755345818", + "swapFee": "3017964640018664406", + "reserves": [ + "12344694011599852769462173", + "23552630893838568560188655", + "25529585780665609170913253" + ], + "mAssetSupply": "61400471718048065091005185" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "348010889665848384", + "1330264703234956032", + "660000547764276480" + ], + "expectedQty": "2336553169092737388", + "swapFee": "1402773565594999", + "reserves": [ + "12344693663588963103613789", + "23552629563573865325232623", + "25529585120665061406636773" + ], + "mAssetSupply": "61400469381494895998267797" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "124794355042849631764480", + "expectedQty": "124926794306451376707479", + "swapFee": "74876613025709779058", + "reserves": [ + "12344693663588963103613789", + "23427702769267413948525144", + "25529585120665061406636773" + ], + "mAssetSupply": "61275749903065072076282375" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "159667615771659010048", + "expectedQty": "159944103842426685054", + "swapFee": "95800569462995406", + "reserves": [ + "12344693663588963103613789", + "23427702769267413948525144", + "25529425176561218979951719" + ], + "mAssetSupply": "61275590331249869880267733" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "149472153234187468406784", + "expectedQty": "149223652436924770268196", + "reserves": [ + "12344693663588963103613789", + "23577174922501601416931928", + "25529425176561218979951719" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "5589950468095377145856", + "2100728926274736619520", + "3068494182297667371008" + ], + "expectedQty": "10781234706103410444812", + "reserves": [ + "12350283614057058480759645", + "23579275651427876153551448", + "25532493670743516647322727" + ], + "mAssetSupply": "61435595218392898060980741" + }, + { + "type": "redeemMasset", + "inputQty": "15082850623220726366208", + "expectedQtys": [ + "3031167827028876876100", + "5787133637797877341587", + "6266517901701250720391" + ], + "redemptionFee": "4524855186966217909", + "reserves": [ + "12347252446230029603883545", + "23573488517790078276209861", + "25526227152841815396602336" + ], + "mAssetSupply": "61420516892624864300832442" + }, + { + "type": "redeemMasset", + "inputQty": "5859818777720018016665", + "expectedQtys": [ + "1177635090007392508580", + "2248351800801819061951", + "2434596760825472196318" + ], + "redemptionFee": "1757945633316005404", + "reserves": [ + "12346074811140022211374965", + "23571240165989276457147910", + "25523792556080989924406018" + ], + "mAssetSupply": "61414658831792777598821181" + }, + { + "type": "redeemMasset", + "inputQty": "20287159288302349058048", + "expectedQtys": [ + "4077066469241542632490", + "7783972994597497546767", + "8428767878870945179200" + ], + "redemptionFee": "6086147786490704717", + "reserves": [ + "12341997744670780668742475", + "23563456192994678959601143", + "25515363788202118979226818" + ], + "mAssetSupply": "61394377758652261740467850" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "579527952332956434432", + "expectedQty": "582915329158648837022", + "reserves": [ + "12342577272623113625176907", + "23563456192994678959601143", + "25515363788202118979226818" + ] + }, + { + "type": "redeemMasset", + "inputQty": "219293940057276992716800", + "expectedQtys": [ + "44072679176769282720161", + "84140015667003635669316", + "91109856351500647845830" + ], + "redemptionFee": "65788182017183097815", + "reserves": [ + "12298504593446344342456746", + "23479316177327675323931827", + "25424253931850618331380988" + ], + "mAssetSupply": "61175732522106160579685887" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "404560705991685505024", + "138750511614956060672", + "179234452538054541312" + ], + "expectedQty": "724262789695597943511", + "swapFee": "434818564956332565", + "reserves": [ + "12298100032740352656951722", + "23479177426816060367871155", + "25424074697398080276839676" + ], + "mAssetSupply": "61175008259316464981742376" + }, + { + "type": "mintMulti", + "inputQtys": [ + "154376680365211549696", + "204816633653205794816", + "236560082891784880128" + ], + "expectedQty": "595764697811882173701", + "reserves": [ + "12298254409420717868501418", + "23479382243449713573665971", + "25424311257480972061719804" + ], + "mAssetSupply": "61175604024014276863916077" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "7231954213097901947617280", + "expectedQty": "7121802983616985708043076", + "swapFee": "4339172527858741168570", + "reserves": [ + "5176451425803732160458342", + "23479382243449713573665971", + "25424311257480972061719804" + ], + "mAssetSupply": "53947988983444233657467367" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "137365286566313567715328", + "expectedQty": "142143459265486035831416", + "reserves": [ + "5313816712370045728173670", + "23479382243449713573665971", + "25424311257480972061719804" + ] + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "25865055644138956", + "expectedQty": "26024263968966623", + "swapFee": "15519033386483", + "reserves": [ + "5313816712370045728173670", + "23479382243449713573665971", + "25424311231456708092753181" + ], + "mAssetSupply": "54090132416860183082546310" + }, + { + "type": "mintMulti", + "inputQtys": [ + "153672072024541544579072", + "311778232933873694539776", + "221389043272162843033600" + ], + "expectedQty": "688686626264127355822673", + "reserves": [ + "5467488784394587272752742", + "23791160476383587268205747", + "25645700274728870935786781" + ], + "mAssetSupply": "54778819043124310438368983" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "52343172425267464372224", + "expectedQty": "52656524293560799061523", + "swapFee": "31405903455160478623", + "reserves": [ + "5467488784394587272752742", + "23791160476383587268205747", + "25593043750435310136725258" + ], + "mAssetSupply": "54726507276602498134475382" + }, + { + "type": "redeemMasset", + "inputQty": "8186781199840270981529", + "expectedQtys": [ + "817660550196179472879", + "3557957616748808040281", + "3827428470252088896915" + ], + "redemptionFee": "2456034359952081294", + "reserves": [ + "5466671123844391093279863", + "23787602518766838460165466", + "25589216321965058047828343" + ], + "mAssetSupply": "54718322951437017815575147" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "483955261820806430195712", + "expectedQty": "486804356283118886976528", + "swapFee": "290373157092483858117", + "reserves": [ + "5466671123844391093279863", + "23787602518766838460165466", + "25102411965681939160851815" + ], + "mAssetSupply": "54234658062773303869237552" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "131147555535670296576", + "outputIndex": 1, + "expectedQty": "130991055842701404809", + "swapFee": "78188042567789256", + "reserves": [ + "5466671123844391093279863", + "23787471527710995758760657", + "25102543113237474831148391" + ], + "mAssetSupply": "54234658140961346437026808", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "4964117724255828240760832", + "outputIndex": 0, + "hardLimitError": true + }, + { + "type": "redeemBassets", + "inputQtys": [ + "2475652929473458688", + "2062924411255140096", + "2247832617065702144" + ], + "expectedQty": "6839411762240576661", + "swapFee": "4106110723778613", + "reserves": [ + "5466668648191461619821175", + "23787469464786584503620561", + "25102540865404857765446247" + ], + "mAssetSupply": "54234651301549584196450147" + }, + { + "type": "redeemMasset", + "inputQty": "96022544617190350389248", + "expectedQtys": [ + "9675842741762280698356", + "42103121403177101030677", + "44430759108231914975325" + ], + "redemptionFee": "28806763385157105116", + "reserves": [ + "5456992805449699339122819", + "23745366343383407402589884", + "25058110106296625850470922" + ], + "mAssetSupply": "54138657563695779003166015" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "1769248141368481021952", + "2268208063972970594304", + "3471852911779987324928" + ], + "expectedQty": "7530748947744737932273", + "swapFee": "4521162065886374584", + "reserves": [ + "5455223557308330858100867", + "23743098135319434431995580", + "25054638253384845863145994" + ], + "mAssetSupply": "54131126814748034265233742" + }, + { + "type": "redeemMasset", + "inputQty": "113578092068277072586342", + "expectedQtys": [ + "11442732522449694473476", + "49802894118382804191447", + "52553945950782779523422" + ], + "redemptionFee": "34073427620483121775", + "reserves": [ + "5443780824785881163627391", + "23693295241201051627804133", + "25002084307434063083622572" + ], + "mAssetSupply": "54017582796107377675769175" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "9980374579431959380885504", + "outputIndex": 2, + "expectedQty": "9928920850947010166831712", + "swapFee": "5942840456101695747380", + "reserves": [ + "5443780824785881163627391", + "33673669820633011008689637", + "15073163456487052916790860" + ], + "mAssetSupply": "54023525636563479371516555", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemMasset", + "inputQty": "15416222991416511430656", + "expectedQtys": [ + "1552978287903164214443", + "9606279126331282735160", + "4300006986203475008756" + ], + "redemptionFee": "4624866897424953429", + "reserves": [ + "5442227846497977999412948", + "33664063541506679725954477", + "15068863449500849441782104" + ], + "mAssetSupply": "54008114038438960285039328" + }, + { + "type": "redeemMasset", + "inputQty": "12630290162209798907494", + "expectedQtys": [ + "1272332814772451456268", + "7870286568396023925303", + "3522933987496043649177" + ], + "redemptionFee": "3789087048662939672", + "reserves": [ + "5440955513683205547956680", + "33656193254938283702029174", + "15065340515513353398132927" + ], + "mAssetSupply": "53995487537363799149071506" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "280007276274491213217792", + "outputIndex": 2, + "expectedQty": "276573838195157397399860", + "swapFee": "166136149940659142104", + "reserves": [ + "5440955513683205547956680", + "33936200531212774915246966", + "14788766677318196000733067" + ], + "mAssetSupply": "53995653673513739808213610", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemMasset", + "inputQty": "5066856825432023708467", + "expectedQtys": [ + "510416489913193945262", + "3183557798362919271390", + "1387335433748496164359" + ], + "redemptionFee": "1520057047629607112", + "reserves": [ + "5440445097193292354011418", + "33933016973414411995975576", + "14787379341884447504568708" + ], + "mAssetSupply": "53990588336745355414112255" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "5118420735278336442368", + "7923855534468493213696", + "15728446248123451310080" + ], + "expectedQty": "28882530155733818728943", + "swapFee": "17339922046668292212", + "reserves": [ + "5435326676458014017569050", + "33925093117879943502761880", + "14771650895636324053258628" + ], + "mAssetSupply": "53961705806589621595383312" + }, + { + "type": "mintMulti", + "inputQtys": [ + "652495621027272", + "805773549963914", + "1529453956006124" + ], + "expectedQty": "3003966523382448", + "reserves": [ + "5435326677110509638596322", + "33925093118685717052725794", + "14771650897165778009264752" + ], + "mAssetSupply": "53961705809593588118765760" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "32656750000610538946560", + "outputIndex": 1, + "expectedQty": "33031748159913064582847", + "swapFee": "19607517708151364543", + "reserves": [ + "5435326677110509638596322", + "33892061370525803988142947", + "14804307647166388548211312" + ], + "mAssetSupply": "53961725417111296270130303", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mintMulti", + "inputQtys": [ + "2096855697394109184", + "202474416944035104", + "2134337745398510080" + ], + "expectedQty": "4510671231187384893", + "reserves": [ + "5435328773966207032705506", + "33892061573000220932178051", + "14804309781504133946721392" + ], + "mAssetSupply": "53961729927782527457515196" + }, + { + "type": "mintMulti", + "inputQtys": [ + "329539732204158606901248", + "188545707582164939309056", + "241488070953950227988480" + ], + "expectedQty": "769285935472218264333524", + "reserves": [ + "5764868506170365639606754", + "34080607280582385871487107", + "15045797852458084174709872" + ], + "mAssetSupply": "54731015863254745721848720" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "198324719313259040", + "142716370904711760", + "213244966818867520" + ], + "expectedQty": "559546797312457060", + "swapFee": "335929636169175", + "reserves": [ + "5764868307845646326347714", + "34080607137866014966775347", + "15045797639213117355842352" + ], + "mAssetSupply": "54731015303707948409391660" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "679424180958373740544", + "expectedQty": "672175552129270732347", + "reserves": [ + "5764868307845646326347714", + "34081286562046973340515891", + "15045797639213117355842352" + ] + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "33388248488183532", + "outputIndex": 0, + "expectedQty": "32310481087927384", + "swapFee": "20046899806050", + "reserves": [ + "5764868275535165238420330", + "34081286562046973340515891", + "15045797672601365844025884" + ], + "mAssetSupply": "54731687479280124579930057", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "1246540882401549090816", + "expectedQty": "1233241294340163956400", + "reserves": [ + "5764868275535165238420330", + "34082533102929374889606707", + "15045797672601365844025884" + ] + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "407693924915067234549760", + "expectedQty": "411806785487522253299543", + "swapFee": "244616354949040340729", + "reserves": [ + "5764868275535165238420330", + "33670726317441852636307164", + "15045797672601365844025884" + ], + "mAssetSupply": "54325471412014346549677426" + }, + { + "type": "redeemMasset", + "inputQty": "988826020398393344", + "expectedQtys": [ + "104899993895526059", + "612686850130966832", + "273779730702118441" + ], + "redemptionFee": "296647806119518", + "reserves": [ + "5764868170635171342894271", + "33670725704755002505340332", + "15045797398821635141907443" + ], + "mAssetSupply": "54325470423484973957403600" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "13082692786878115840", + "expectedQty": "12660093806539579123", + "swapFee": "7849615672126869", + "reserves": [ + "5764855510541364803315148", + "33670725704755002505340332", + "15045797398821635141907443" + ], + "mAssetSupply": "54325457348641802751414629" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "1043824754306308767744", + "expectedQty": "1032871226331787759600", + "reserves": [ + "5764855510541364803315148", + "33671769529509308814108076", + "15045797398821635141907443" + ] + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "3700714882341862375424", + "expectedQty": "3581096247844952059601", + "swapFee": "2220428929405117425", + "reserves": [ + "5761274414293519851255547", + "33671769529509308814108076", + "15045797398821635141907443" + ], + "mAssetSupply": "54322791725414722081916230" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "22644132392699489681408", + "expectedQty": "22656702386881321262013", + "reserves": [ + "5761274414293519851255547", + "33671769529509308814108076", + "15068441531214334631588851" + ] + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "3488173861487799", + "expectedQty": "3602647659258940", + "reserves": [ + "5761274417781693712743346", + "33671769529509308814108076", + "15068441531214334631588851" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "2978631328336238346240", + "3881140919701353791488", + "218890347850193436672" + ], + "expectedQty": "7135775128585164449273", + "reserves": [ + "5764253049110029951089586", + "33675650670429010167899564", + "15068660421562184825025523" + ], + "mAssetSupply": "54352584206532836226886456" + }, + { + "type": "mintMulti", + "inputQtys": [ + "4517582052250780958720", + "4093934546118317703168", + "3849500771214431879168" + ], + "expectedQty": "12568232971935555346001", + "reserves": [ + "5768770631162280732048306", + "33679744604975128485602732", + "15072509922333399256904691" + ], + "mAssetSupply": "54365152439504771782232457" + }, + { + "type": "mintMulti", + "inputQtys": [ + "1712697051086540505088", + "2735131791691214225408", + "2336967539173555699712" + ], + "expectedQty": "6813484311189700537656", + "reserves": [ + "5770483328213367272553394", + "33682479736766819699828140", + "15074846889872572812604403" + ], + "mAssetSupply": "54371965923815961482770113" + }, + { + "type": "mintMulti", + "inputQtys": [ + "1536972473385265659904", + "529965054709355315200", + "931779591447765975040" + ], + "expectedQty": "3043973235405423938128", + "reserves": [ + "5772020300686752538213298", + "33683009701821529055143340", + "15075778669464020578579443" + ], + "mAssetSupply": "54375009897051366906708241" + }, + { + "type": "mintMulti", + "inputQtys": [ + "1067350129188101051908096", + "2518544731968246403563520", + "2217477767219134672666624" + ], + "expectedQty": "5811073860597699326726200", + "reserves": [ + "6839370429874853590121394", + "36201554433789775458706860", + "17293256436683155251246067" + ], + "mAssetSupply": "60186083757649066233434441" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "92150261056580565860352", + "expectedQty": "89604596476951636757620", + "swapFee": "55290156633948339516", + "reserves": [ + "6749765833397901953363774", + "36201554433789775458706860", + "17293256436683155251246067" + ], + "mAssetSupply": "60093988786749119615913605" + }, + { + "type": "redeemMasset", + "inputQty": "1352108797226103550771", + "expectedQtys": [ + "151823502174255982743", + "814287030684005343414", + "388979828488807880737" + ], + "redemptionFee": "405632639167831065", + "reserves": [ + "6749614009895727697381031", + "36200740146759091453363446", + "17292867456854666443365330" + ], + "mAssetSupply": "60092637083584532680193899" + }, + { + "type": "redeemMasset", + "inputQty": "1888623273031916689817", + "expectedQtys": [ + "212066810147055492695", + "1137394742370497244189", + "543326364217921667690" + ], + "redemptionFee": "566586981909575006", + "reserves": [ + "6749401943085580641888336", + "36199602752016720956119257", + "17292324130490448521697640" + ], + "mAssetSupply": "60090749026898482673079088" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "17550799892082971377664", + "outputIndex": 1, + "expectedQty": "18203912585921895334720", + "swapFee": "10826313231617901539", + "reserves": [ + "6766952742977663613266000", + "36181398839430799060784537", + "17292324130490448521697640" + ], + "mAssetSupply": "60090759853211714290980627", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "2034063211060278", + "expectedQty": "2032823525814493", + "swapFee": "1220437926636", + "reserves": [ + "6766952742977663613266000", + "36181398839430799060784537", + "17292324128457624995883147" + ], + "mAssetSupply": "60090759851178871517846985" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "235610624232264331952128", + "expectedQty": "235446884601103373405192", + "swapFee": "141366374539358599171", + "reserves": [ + "6766952742977663613266000", + "36181398839430799060784537", + "17056877243856521622477955" + ], + "mAssetSupply": "59855290593321146544494028" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "100096134196055523328", + "outputIndex": 0, + "expectedQty": "97341961945770286311", + "swapFee": "60068574958981773", + "reserves": [ + "6766855401015717842979689", + "36181398839430799060784537", + "17056977339990717678001283" + ], + "mAssetSupply": "59855290653389721503475801", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mintMulti", + "inputQtys": [ + "31384166691752804089856", + "25053789674622729322496", + "125962575298169652903936" + ], + "expectedQty": "183055252264856619291466", + "reserves": [ + "6798239567707470647069545", + "36206452629105421790107033", + "17182939915288887330905219" + ], + "mAssetSupply": "60038345905654578122767267" + }, + { + "type": "redeemMasset", + "inputQty": "275170120308596055579033", + "expectedQtys": [ + "31148612937330617834941", + "165893062100210160319428", + "78729903413396877528558" + ], + "redemptionFee": "82551036092578816673", + "reserves": [ + "6767090954770140029234604", + "36040559567005211629787605", + "17104210011875490453376661" + ], + "mAssetSupply": "59763258336382074646004907" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "20553709238069047066624", + "outputIndex": 2, + "expectedQty": "21105960284192869173558", + "swapFee": "12672846397672854244", + "reserves": [ + "6787644664008209076301228", + "36040559567005211629787605", + "17083104051591297584203103" + ], + "mAssetSupply": "59763271009228472318859151", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mintMulti", + "inputQtys": [ + "62689961515181200", + "175056422835002016", + "144819483908742112" + ], + "expectedQty": "382673468453603365", + "reserves": [ + "6787644726698170591482428", + "36040559742061634464789621", + "17083104196410781492945215" + ], + "mAssetSupply": "59763271391901940772462516" + }, + { + "type": "mintMulti", + "inputQtys": [ + "1272080129671457536", + "2270918608681417728", + "3195871742838458880" + ], + "expectedQty": "6753078679364861616", + "reserves": [ + "6787645998778300262939964", + "36040562012980243146207349", + "17083107392282524331404095" + ], + "mAssetSupply": "59763278144980620137324132" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "716087712063279320793088", + "695768105269300928970752", + "164932404881589083832320" + ], + "expectedQty": "1591651699138149225434895", + "swapFee": "955564358097748184171", + "reserves": [ + "6071558286715020942146876", + "35344793907710942217236597", + "16918174987400935247571775" + ], + "mAssetSupply": "58171626445842470911889237" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "87957008762141772087296", + "16612604257407674089472", + "78133586297872707485696" + ], + "expectedQty": "185471020548124729868455", + "swapFee": "111349421982064076366", + "reserves": [ + "5983601277952879170059580", + "35328181303453534543147125", + "16840041401103062540086079" + ], + "mAssetSupply": "57986155425294346182020782" + }, + { + "type": "mintMulti", + "inputQtys": [ + "22761378775832940", + "6366091226565284", + "20940418599265776" + ], + "expectedQty": "50772634361284156", + "reserves": [ + "5983601300714257945892520", + "35328181309819625769712409", + "16840041422043481139351855" + ], + "mAssetSupply": "57986155476066980543304938" + }, + { + "type": "mintMulti", + "inputQtys": [ + "121738746705527862984704", + "17582711257263939518464", + "18628797244563913703424" + ], + "expectedQty": "161843575361777055727581", + "reserves": [ + "6105340047419785808877224", + "35345764021076889709230873", + "16858670219288045053055279" + ], + "mAssetSupply": "58147999051428757599032519" + }, + { + "type": "mintMulti", + "inputQtys": [ + "296789080735360875495424", + "177762105366461143842816", + "109617263000724959133696" + ], + "expectedQty": "591727150948350053095041", + "reserves": [ + "6402129128155146684372648", + "35523526126443350853073689", + "16968287482288770012188975" + ], + "mAssetSupply": "58739726202377107652127560" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "161182634957615281471488", + "outputIndex": 1, + "expectedQty": "162624689807734091160108", + "swapFee": "96691404134155006972", + "reserves": [ + "6402129128155146684372648", + "35360901436635616761913581", + "17129470117246385293660463" + ], + "mAssetSupply": "58739822893781241807134532", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "16846390496167714619392", + "expectedQty": "16684308294141538342076", + "reserves": [ + "6402129128155146684372648", + "35377747827131784476532973", + "17129470117246385293660463" + ] + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "3355231027896677920931840", + "expectedQty": "3349378830409054987642031", + "swapFee": "2013138616738006752559", + "reserves": [ + "6402129128155146684372648", + "35377747827131784476532973", + "13780091286837330306018432" + ], + "mAssetSupply": "55403289312795443431297327" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "423321977502707528761344", + "expectedQty": "434543823872018604571668", + "reserves": [ + "6825451105657854213133992", + "35377747827131784476532973", + "13780091286837330306018432" + ] + }, + { + "type": "redeemMasset", + "inputQty": "38509166095687577", + "expectedQtys": [ + "4705834070128519", + "24391327177090081", + "9500738055734729" + ], + "redemptionFee": "11552749828706", + "reserves": [ + "6825451100952020143005473", + "35377747802740457299442892", + "13780091277336592250283703" + ], + "mAssetSupply": "55837833098169848690010124" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "96991099140239", + "6573597501412", + "423486637680514" + ], + "expectedQty": "530663353880566", + "swapFee": "318589165827", + "reserves": [ + "6825451100855029043865234", + "35377747802733883701941480", + "13780091276913105612603189" + ], + "mAssetSupply": "55837833097639185336129558" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "53470501035491647488", + "expectedQty": "52144352205902978470", + "swapFee": "32082300621294988", + "reserves": [ + "6825398956502823140886764", + "35377747802733883701941480", + "13780091276913105612603189" + ], + "mAssetSupply": "55837779659220450465777058" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "1172111024530482266112", + "expectedQty": "1143035900941761132159", + "swapFee": "703266614718289359", + "reserves": [ + "6824255920601881379754605", + "35377747802733883701941480", + "13780091276913105612603189" + ], + "mAssetSupply": "55836608251462534701800305" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "71668492134804715732992", + "24459108301836929466368", + "67614055946970934018048" + ], + "expectedQty": "165495054316204802641647", + "swapFee": "99356646577669483274", + "reserves": [ + "6752587428467076664021613", + "35353288694432046772475112", + "13712477220966134678585141" + ], + "mAssetSupply": "55671113197146329899158658" + }, + { + "type": "mintMulti", + "inputQtys": [ + "72141458752423774388224", + "224165131127182587854848", + "279886098315942920454144" + ], + "expectedQty": "576565996223057779814225", + "reserves": [ + "6824728887219500438409837", + "35577453825559229360329960", + "13992363319282077599039285" + ], + "mAssetSupply": "56247679193369387678972883" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "412882481676799311872", + "expectedQty": "411469474123538816741", + "swapFee": "247729489006079587", + "reserves": [ + "6824728887219500438409837", + "35577453825559229360329960", + "13991951849807954060222544" + ], + "mAssetSupply": "56247266558617199885740598" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "1349706951306831724544", + "outputIndex": 0, + "expectedQty": "1302530103167621495029", + "swapFee": "801669848355407830", + "reserves": [ + "6823426357116332816914808", + "35578803532510536192054504", + "13991951849807954060222544" + ], + "mAssetSupply": "56247267360287048241148428", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "4734226906500387831808", + "outputIndex": 0, + "expectedQty": "4568608883403129063923", + "swapFee": "2811925788652281415", + "reserves": [ + "6818857748232929687850885", + "35583537759417036579886312", + "13991951849807954060222544" + ], + "mAssetSupply": "56247270172212836893429843", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mintMulti", + "inputQtys": [ + "450403608970950185320448", + "191348137051035124367360", + "2389249181360291993092096" + ], + "expectedQty": "3044313167496477965093625", + "reserves": [ + "7269261357203879873171333", + "35774885896468071704253672", + "16381201031168246053314640" + ], + "mAssetSupply": "59291583339709314858523468" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "15068728302174667276288", + "expectedQty": "15046845410734245395573", + "swapFee": "9041236981304800365", + "reserves": [ + "7269261357203879873171333", + "35774885896468071704253672", + "16366154185757511807919067" + ], + "mAssetSupply": "59276523652644121496047545" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "1939742404990133390540800", + "expectedQty": "1940071752411192995984687", + "reserves": [ + "7269261357203879873171333", + "35774885896468071704253672", + "18305896590747645198459867" + ] + }, + { + "type": "redeemMasset", + "inputQty": "845359737130406917229772", + "expectedQtys": [ + "100353462768525038969449", + "493878745507147984320418", + "252716200682965691289094" + ], + "redemptionFee": "253607921139122075168", + "reserves": [ + "7168907894435354834201884", + "35281007150960923719933254", + "18053180390064679507170773" + ], + "mAssetSupply": "60371489275846046696877628" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "876006715643193458688", + "1697335026077198974976", + "118840244883433521152" + ], + "expectedQty": "2699098557287405589925", + "swapFee": "1620431393208368374", + "reserves": [ + "7168031887719711640743196", + "35279309815934846520958278", + "18053061549819796073649621" + ], + "mAssetSupply": "60368790177288759291287703" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "225929951413975616", + "outputIndex": 2, + "expectedQty": "223996332190724059", + "swapFee": "134415706500768", + "reserves": [ + "7168031887719711640743196", + "35279310041864797934933894", + "18053061325823463882925562" + ], + "mAssetSupply": "60368790177423174997788471", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemBassets", + "inputQtys": [ + "54408996623607903813632", + "14244415093960708456448", + "12674807076751639838720" + ], + "expectedQty": "82532794976736955203860", + "swapFee": "49549406630020185233", + "reserves": [ + "7113622891096103736929564", + "35265065626770837226477446", + "18040386518746712243086842" + ], + "mAssetSupply": "60286257382446438042584611" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "617750316323156902543360", + "1003927875805710724890624", + "443956905155070431068160" + ], + "expectedQty": "2072805081323197658502997", + "swapFee": "1244429706617889328699", + "reserves": [ + "6495872574772946834386204", + "34261137750965126501586822", + "17596429613591641812018682" + ], + "mAssetSupply": "58213452301123240384081614" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "165701098473943501635584", + "expectedQty": "165560844126527418526782", + "reserves": [ + "6495872574772946834386204", + "34261137750965126501586822", + "17762130712065585313654266" + ] + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "167449684945322752", + "expectedQty": "162775629670977626", + "swapFee": "100469810967193", + "reserves": [ + "6495872411997317163408578", + "34261137750965126501586822", + "17762130712065585313654266" + ], + "mAssetSupply": "58379012977900552668252837" + }, + { + "type": "mintMulti", + "inputQtys": [ + "1352643303813306", + "1294062085371108", + "526594917089064" + ], + "expectedQty": "3199249475821002", + "reserves": [ + "6495872413349960467221884", + "34261137752259188586957930", + "17762130712592180230743330" + ], + "mAssetSupply": "58379012981099802144073839" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "1763682059205340741763072", + "outputIndex": 0, + "expectedQty": "1692975718583406395613675", + "swapFee": "1056698341336216474647", + "reserves": [ + "4802896694766554071608209", + "34261137752259188586957930", + "19525812771797520972506402" + ], + "mAssetSupply": "58380069679441138360548486", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemMasset", + "inputQty": "1901031383324615822540", + "expectedQtys": [ + "156349902638560540112", + "1115311423976484248111", + "635628688232214673283" + ], + "redemptionFee": "570309414997384746", + "reserves": [ + "4802740344863915511068097", + "34260022440835212102709819", + "19525177143109288757833119" + ], + "mAssetSupply": "58378169218367228742110692" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "21803609974149010685952", + "outputIndex": 0, + "expectedQty": "20438400040853157161424", + "swapFee": "12930517320175605176", + "reserves": [ + "4782301944823062353906673", + "34281826050809361113395771", + "19525177143109288757833119" + ], + "mAssetSupply": "58378182148884548917715868", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemMasset", + "inputQty": "4304108021801982256742", + "expectedQtys": [ + "352483896255346558506", + "2526773038707493224502", + "1439120865617704760230" + ], + "redemptionFee": "1291232406540594677", + "reserves": [ + "4781949460926807007348167", + "34279299277770653620171269", + "19523738022243671053072889" + ], + "mAssetSupply": "58373879332095153476053803" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "8084511784990004641529856", + "expectedQty": "7975812647573620840826356", + "reserves": [ + "4781949460926807007348167", + "42363811062760658261701125", + "19523738022243671053072889" + ] + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "869073618693700452352", + "expectedQty": "870069929399063430791", + "swapFee": "521444171216220271", + "reserves": [ + "4781949460926807007348167", + "42363811062760658261701125", + "19522867952314271989642098" + ], + "mAssetSupply": "66348823427494251832648078" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "300731222723385728", + "outputIndex": 1, + "expectedQty": "328327555526110143", + "swapFee": "194100559138386", + "reserves": [ + "4781949761658029730733895", + "42363810734433102735590982", + "19522867952314271989642098" + ], + "mAssetSupply": "66348823427688352391786464", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemMasset", + "inputQty": "2384450773717137699635", + "expectedQtys": [ + "171802641298418572098", + "1522018202282065206335", + "701404332354359810569" + ], + "redemptionFee": "715335232115141309", + "reserves": [ + "4781777959016731312161797", + "42362288716230820670384647", + "19522166547981917629831529" + ], + "mAssetSupply": "66346439692249867369228138" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "935107020885926477824", + "61016794760576715718656", + "56419454726115212394496" + ], + "expectedQty": "117411796739956694707869", + "swapFee": "70489371666974201345", + "reserves": [ + "4780842851995845385683973", + "42301271921470243954665991", + "19465747093255802417437033" + ], + "mAssetSupply": "66229027895509910674520269" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "538407362024121594544128", + "expectedQty": "530111368913345173348774", + "reserves": [ + "4780842851995845385683973", + "42839679283494365549210119", + "19465747093255802417437033" + ] + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "173774206063059310477312", + "expectedQty": "173489808841523569082655", + "reserves": [ + "4780842851995845385683973", + "42839679283494365549210119", + "19639521299318861727914345" + ] + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "697996801194623963758592", + "expectedQty": "640548695984075990581267", + "swapFee": "418798080716774378255", + "reserves": [ + "4140294156011769395102706", + "42839679283494365549210119", + "19639521299318861727914345" + ], + "mAssetSupply": "66235051070150872227571361" + }, + { + "type": "redeemMasset", + "inputQty": "1907700025426420799897", + "expectedQtys": [ + "119212857955731309100", + "1233497043652514217533", + "565487227417085874197" + ], + "redemptionFee": "572310007627926239", + "reserves": [ + "4140174943153813663793606", + "42838445786450713034992586", + "19638955812091444642040148" + ], + "mAssetSupply": "66233143942435453434697703" + }, + { + "type": "redeemMasset", + "inputQty": "952649908064860294768230", + "expectedQtys": [ + "59531434008494726044004", + "615972547870140709659933", + "282387874419786486425995" + ], + "redemptionFee": "285794972419458088430", + "reserves": [ + "4080643509145318937749602", + "42222473238580572325332653", + "19356567937671658155614153" + ], + "mAssetSupply": "65280779829343012598017903" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "474223621645648510582784", + "outputIndex": 1, + "expectedQty": "525902311779692915649343", + "swapFee": "310724146872140468458", + "reserves": [ + "4554867130790967448332386", + "41696570926800879409683310", + "19356567937671658155614153" + ], + "mAssetSupply": "65281090553489884738486361", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemBassets", + "inputQtys": [ + "91520577741928624", + "169003506035358816", + "11534887975568424" + ], + "expectedQty": "276783300650573957", + "swapFee": "166169682199664", + "reserves": [ + "4554867039270389706403762", + "41696570757797373374324494", + "19356567926136770180045729" + ], + "mAssetSupply": "65281090276706584087912404" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "3729761950901738961633280", + "expectedQty": "3727859356887209788755851", + "swapFee": "2237857170541043376979", + "reserves": [ + "4554867039270389706403762", + "41696570757797373374324494", + "15628708569249560391289878" + ], + "mAssetSupply": "61553566182975386169656103" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "704242752283145255518208", + "expectedQty": "751524303932219710616082", + "reserves": [ + "5259109791553534961921970", + "41696570757797373374324494", + "15628708569249560391289878" + ] + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "1166080842943238556876800", + "expectedQty": "1182805172237041891645567", + "swapFee": "699648505765943134126", + "reserves": [ + "5259109791553534961921970", + "40513765585560331482678927", + "15628708569249560391289878" + ], + "mAssetSupply": "61139709292470133266529511" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "1063927181759289990578176", + "6229887585424657640062976", + "2726824717950944857292800" + ], + "expectedQty": "9996020981010517677922269", + "swapFee": "6001213316596268367774", + "reserves": [ + "4195182609794244971343794", + "34283878000135673842615951", + "12901883851298615533997078" + ], + "mAssetSupply": "51143688311459615588607242" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "1062180967968016240214016", + "outputIndex": 2, + "expectedQty": "1040654736966583835709508", + "swapFee": "627279001674910011019", + "reserves": [ + "4195182609794244971343794", + "35346058968103690082829967", + "11861229114332031698287570" + ], + "mAssetSupply": "51144315590461290498618261", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mintMulti", + "inputQtys": [ + "2835647819848683618304", + "248405966519648307380224", + "179023623822384551690240" + ], + "expectedQty": "427182145850272059353525", + "reserves": [ + "4198018257614093654962098", + "35594464934623338390210191", + "12040252738154416249977810" + ], + "mAssetSupply": "51571497736311562557971786" + }, + { + "type": "redeemMasset", + "inputQty": "503765973625459943302758", + "expectedQtys": [ + "40995208633030787486668", + "347593180074759155650879", + "117577543189530935720299" + ], + "redemptionFee": "151129792087637982990", + "reserves": [ + "4157023048981062867475430", + "35246871754548579234559312", + "11922675194964885314257511" + ], + "mAssetSupply": "51067882892478190252652018" + }, + { + "type": "redeemMasset", + "inputQty": "204893001491091", + "expectedQtys": [ + "16673677428280", + "141373998427890", + "47821442878875" + ], + "redemptionFee": "61467900447", + "reserves": [ + "4157023048964389190047150", + "35246871754407205236131422", + "11922675194917063871378636" + ], + "mAssetSupply": "51067882892273358719061374" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "1831367294421815263232", + "outputIndex": 1, + "expectedQty": "1984005576340332674737", + "swapFee": "1171172336776998013", + "reserves": [ + "4158854416258811005310382", + "35244887748830864903456685", + "11922675194917063871378636" + ], + "mAssetSupply": "51067884063445695496059387", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemMasset", + "inputQty": "23817284760445603597516", + "expectedQtys": [ + "1939044586227149372940", + "16432748526704161121585", + "5558886288413408762229" + ], + "redemptionFee": "7145185428133681079", + "reserves": [ + "4156915371672583855937442", + "35228455000304160742335100", + "11917116308628650462616407" + ], + "mAssetSupply": "51044073923870678026142950" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "571013192142529163689984", + "974878171272373029830656", + "33459602601265067982848" + ], + "expectedQty": "1604693138548338003217244", + "swapFee": "963393919480691216660", + "reserves": [ + "3585902179530054692247458", + "34253576829031787712504444", + "11883656706027385394633559" + ], + "mAssetSupply": "49439380785322340022925706" + }, + { + "type": "mintMulti", + "inputQtys": [ + "139693184274616211734528", + "2117803726370445849526272", + "609824470216558006763520" + ], + "expectedQty": "2842265508670991656237673", + "reserves": [ + "3725595363804670903981986", + "36371380555402233562030716", + "12493481176243943401397079" + ], + "mAssetSupply": "52281646293993331679163379" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "297426450742863298822144", + "expectedQty": "291781605252183730285625", + "reserves": [ + "3725595363804670903981986", + "36668807006145096860852860", + "12493481176243943401397079" + ] + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "580612446031690112", + "outputIndex": 0, + "expectedQty": "522917238354660559", + "swapFee": "341719016305837", + "reserves": [ + "3725594840887432549321427", + "36668807586757542892542972", + "12493481176243943401397079" + ], + "mAssetSupply": "52573427899587234425754841", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mintMulti", + "inputQtys": [ + "20533352830972440576", + "50105299458388615168", + "8590336789826117632" + ], + "expectedQty": "80128015247587278182", + "reserves": [ + "3725615374240263521762003", + "36668857692057001281158140", + "12493489766580733227514711" + ], + "mAssetSupply": "52573508027602482013033023" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "1395917361191110358073344", + "outputIndex": 2, + "expectedQty": "1475648625335194949264531", + "swapFee": "891627400141069378573", + "reserves": [ + "5121532735431373879835347", + "36668857692057001281158140", + "11017841141245538278250180" + ], + "mAssetSupply": "52574399655002623082411596", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mintMulti", + "inputQtys": [ + "49208616774706249728", + "13965914956217151488", + "106014742101547778048" + ], + "expectedQty": "172141945285810714435", + "reserves": [ + "5121581944048148586085075", + "36668871657971957498309628", + "11017947155987639826028228" + ], + "mAssetSupply": "52574571796947908893126031" + }, + { + "type": "redeemMasset", + "inputQty": "1543383456728", + "expectedQtys": [ + "150304476196", + "1076131478032", + "323346730393" + ], + "redemptionFee": "463015037", + "reserves": [ + "5121581944047998281608879", + "36668871657970881366831596", + "11017947155987316479297835" + ], + "mAssetSupply": "52574571796946365972684340" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "2143072407038723358720", + "outputIndex": 2, + "expectedQty": "2091842371811429126331", + "swapFee": "1266088442839650317", + "reserves": [ + "5121581944047998281608879", + "36671014730377920090190316", + "11015855313615505050171504" + ], + "mAssetSupply": "52574573063034808812334657", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mintMulti", + "inputQtys": [ + "8846867134672778821632", + "5865039137383864336384", + "901395202191719399424" + ], + "expectedQty": "15944221870048195184788", + "reserves": [ + "5130428811182671060430511", + "36676879769515303954526700", + "11016756708817696769570928" + ], + "mAssetSupply": "52590517284904857007519445" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "38933978582309677301760", + "expectedQty": "39516559834665632812647", + "swapFee": "23360387149385806381", + "reserves": [ + "5130428811182671060430511", + "36637363209680638321714053", + "11016756708817696769570928" + ], + "mAssetSupply": "52551606666709696716024066" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "778545838939240495316992", + "222230211349749082095616", + "35888010411840559382528" + ], + "expectedQty": "1075830676005648259093070", + "swapFee": "645885937165688368476", + "reserves": [ + "4351882972243430565113519", + "36415132998330889239618437", + "10980868698405856210188400" + ], + "mAssetSupply": "51475775990704048456930996" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "24896033676884099072", + "20035040011647258624", + "144286482738549456896" + ], + "expectedQty": "191626186737756425382", + "swapFee": "115044738885985446", + "reserves": [ + "4351858076209753681014447", + "36415112963290877592359813", + "10980724411923117660731504" + ], + "mAssetSupply": "51475584364517310700505614" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "29927292626690641920", + "34442701626256445440", + "38801694298642235392" + ], + "expectedQty": "104796497002680308540", + "swapFee": "62915647590162282", + "reserves": [ + "4351828148917126990372527", + "36415078520589251335914373", + "10980685610228819018496112" + ], + "mAssetSupply": "51475479568020308020197074" + }, + { + "type": "redeemMasset", + "inputQty": "891085968715275147673", + "expectedQtys": [ + "75311384729053162581", + "630188025481932410070", + "190028330688218246576" + ], + "redemptionFee": "267325790614582544", + "reserves": [ + "4351752837532397937209946", + "36414448332563769403504303", + "10980495581898130800249536" + ], + "mAssetSupply": "51474588749377383359631945" + }, + { + "type": "mintMulti", + "inputQtys": [ + "1293539117489365504", + "3149175310602912768", + "195355235024485920" + ], + "expectedQty": "4667156832292946785", + "reserves": [ + "4351754131071515426575450", + "36414451481739080006417071", + "10980495777253365824735456" + ], + "mAssetSupply": "51474593416534215652578730" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "274019823761711614132224", + "expectedQty": "271554381147589926968210", + "swapFee": "164411894257026968479", + "reserves": [ + "4351754131071515426575450", + "36414451481739080006417071", + "10708941396105775897767246" + ], + "mAssetSupply": "51200738004666761065414985" + }, + { + "type": "mintMulti", + "inputQtys": [ + "31214709472931570778112", + "22415242082286204616704", + "22981276282437091983360" + ], + "expectedQty": "78403352762127210213429", + "reserves": [ + "4382968840544446997353562", + "36436866723821366211033775", + "10731922672388212989750606" + ], + "mAssetSupply": "51279141357428888275628414" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "1982496788434179840", + "expectedQty": "1863482930309291551", + "swapFee": "1189498073060507", + "reserves": [ + "4382966977061516688062011", + "36436866723821366211033775", + "10731922672388212989750606" + ], + "mAssetSupply": "51279139376121597914509081" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "1684780782595494903808", + "86862507809587101696", + "389224949389732347904" + ], + "expectedQty": "2269329509594329287445", + "swapFee": "1362415154849507276", + "reserves": [ + "4381282196278921193158203", + "36436779861313556623932079", + "10731533447438823257402702" + ], + "mAssetSupply": "51276870046612003585221636" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "25847067526754070528", + "expectedQty": "27482566382338878530", + "reserves": [ + "4381308043346447947228731", + "36436779861313556623932079", + "10731533447438823257402702" + ] + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "1373191855596906389438464", + "outputIndex": 1, + "expectedQty": "1404678333901721499519168", + "swapFee": "829675349657722276540", + "reserves": [ + "4381308043346447947228731", + "35032101527411835124412911", + "12104725303035729646841166" + ], + "mAssetSupply": "51277727204528043646376706", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemMasset", + "inputQty": "1160035217832603", + "expectedQtys": [ + "99086819287054", + "792279264308727", + "273758137240043" + ], + "redemptionFee": "348010565349", + "reserves": [ + "4381308043247361127941677", + "35032101526619555860104184", + "12104725302761971509601123" + ], + "mAssetSupply": "51277727203368356439109452" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "370540260799411193380864", + "expectedQty": "368550471244408418294760", + "swapFee": "222324156479646716028", + "reserves": [ + "4381308043247361127941677", + "35032101526619555860104184", + "11736174831517563091306363" + ], + "mAssetSupply": "50907409266725424892444616" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "286742053956259479552", + "expectedQty": "282161216744933208959", + "reserves": [ + "4381308043247361127941677", + "35032388268673512119583736", + "11736174831517563091306363" + ] + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "56812983560577974272", + "expectedQty": "55905363625180933213", + "reserves": [ + "4381308043247361127941677", + "35032445081657072697558008", + "11736174831517563091306363" + ] + }, + { + "type": "redeemMasset", + "inputQty": "58667081837105779", + "expectedQtys": [ + "5047590188525011", + "40359961985952987", + "13520939487850953" + ], + "redemptionFee": "17600124551131", + "reserves": [ + "4381308038199770939416666", + "35032445041297110711605021", + "11736174817996623603455410" + ], + "mAssetSupply": "50907747274656313294032140" + }, + { + "type": "mintMulti", + "inputQtys": [ + "832706195531327770460160", + "989472418179842014445568", + "416421470300467055558656" + ], + "expectedQty": "2268092799942809559608893", + "reserves": [ + "5214014233731098709876826", + "36021917459476952726050589", + "12152596288297090659014066" + ], + "mAssetSupply": "53175840074599122853641033" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "315264354099919060992", + "outputIndex": 0, + "expectedQty": "303443797557473498377", + "swapFee": "190141700381411375", + "reserves": [ + "5213710789933541236378449", + "36021917459476952726050589", + "12152911552651190578075058" + ], + "mAssetSupply": "53175840264740823235052408", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "62387477491520188186624", + "expectedQty": "62024057918620744627758", + "swapFee": "37432486494912112911", + "reserves": [ + "5213710789933541236378449", + "36021917459476952726050589", + "12090887494732569833447300" + ], + "mAssetSupply": "53113490219735797958978695" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "5565098447623536246784", + "outputIndex": 0, + "expectedQty": "5253777218598085487633", + "swapFee": "3292223831642007589", + "reserves": [ + "5208457012714943150890816", + "36027482557924576262297373", + "12090887494732569833447300" + ], + "mAssetSupply": "53113493511959629600986284", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "632394491925224620032", + "expectedQty": "605481613890753378678", + "swapFee": "379436695155134772", + "reserves": [ + "5207851531101052397512138", + "36027482557924576262297373", + "12090887494732569833447300" + ], + "mAssetSupply": "53112861496904399531501024" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "292645618856994275328", + "outputIndex": 0, + "expectedQty": "276254866795781875973", + "swapFee": "173121780255775992", + "reserves": [ + "5207575276234256615636165", + "36027775203543433256572701", + "12090887494732569833447300" + ], + "mAssetSupply": "53112861670026179787277016", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "10874833350324557709312", + "expectedQty": "11023068799579941681922", + "swapFee": "6524900010194734625", + "reserves": [ + "5207575276234256615636165", + "36016752134743853314890779", + "12090887494732569833447300" + ], + "mAssetSupply": "53101993361575865424302329" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "1607862416109306051035136", + "expectedQty": "1661430768765590879167698", + "reserves": [ + "6815437692343562666671301", + "36016752134743853314890779", + "12090887494732569833447300" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "402108213553246505009152", + "1053152136803687484882944", + "694634594558522513424384" + ], + "expectedQty": "2152054803763872346947801", + "reserves": [ + "7217545905896809171680453", + "37069904271547540799773723", + "12785522089291092346871684" + ], + "mAssetSupply": "56915478934105328650417828" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "7498006702799188205240320", + "expectedQty": "7405989922979669592551068", + "reserves": [ + "7217545905896809171680453", + "44567910974346729005014043", + "12785522089291092346871684" + ] + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "4863582026199768064", + "expectedQty": "4815326673203984374", + "swapFee": "2918149215719860", + "reserves": [ + "7217545905896809171680453", + "44567910974346729005014043", + "12785517273964419142887310" + ], + "mAssetSupply": "64321463996421121258920692" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "1131455048513433728", + "expectedQty": "1092908159998119843", + "swapFee": "678873029108060", + "reserves": [ + "7217544812988649173560610", + "44567910974346729005014043", + "12785517273964419142887310" + ], + "mAssetSupply": "64321462865644945774595024" + }, + { + "type": "mintMulti", + "inputQtys": [ + "1102703616877470848", + "1552103532722369792", + "1482746985273827072" + ], + "expectedQty": "4168131153979264297", + "reserves": [ + "7217545915692266051031458", + "44567912526450261727383835", + "12785518756711404416714382" + ], + "mAssetSupply": "64321467033776099753859321" + }, + { + "type": "redeemMasset", + "inputQty": "917345864595003287168614", + "expectedQtys": [ + "102904985034617478596667", + "635432101870960799066045", + "182290993599174668563391" + ], + "redemptionFee": "275203759378500986150", + "reserves": [ + "7114640930657648572434791", + "43932480424579300928317790", + "12603227763112229748150991" + ], + "mAssetSupply": "63404396372940474967676857" + }, + { + "type": "redeemMasset", + "inputQty": "1781649760945372564081868", + "expectedQtys": [ + "199859888252677707073683", + "1234122805900726018633277", + "354041717201014167261242" + ], + "redemptionFee": "534494928283611769224", + "reserves": [ + "6914781042404970865361108", + "42698357618678574909684513", + "12249186045911215580889749" + ], + "mAssetSupply": "61623281106923386015364213" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "3058533031393372", + "1937134989713067", + "1844122965844661" + ], + "expectedQty": "6936181635386359", + "swapFee": "4164207505735", + "reserves": [ + "6914781039346437833967736", + "42698357616741439919971446", + "12249186044067092615045088" + ], + "mAssetSupply": "61623281099987204379977854" + }, + { + "type": "mintMulti", + "inputQtys": [ + "111101769029080", + "230144698161970", + "229223679713001" + ], + "expectedQty": "573276421459246", + "reserves": [ + "6914781039457539602996816", + "42698357616971584618133416", + "12249186044296316294758089" + ], + "mAssetSupply": "61623281100560480801437100" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "8089868682619587133440", + "expectedQty": "7977318116006482419422", + "reserves": [ + "6914781039457539602996816", + "42706447485654204205266856", + "12249186044296316294758089" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "215748416881003331584", + "246686563428362911744", + "235590733890290450432" + ], + "expectedQty": "704291221327557382801", + "swapFee": "422828429854447097", + "reserves": [ + "6914565291040658599665232", + "42706200799090775842355112", + "12248950453562426004307657" + ], + "mAssetSupply": "61630554127455159726473721" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "4225934000229438671814656", + "expectedQty": "4249735556267187232294729", + "reserves": [ + "6914565291040658599665232", + "42706200799090775842355112", + "16474884453791864676122313" + ] + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "427934348807299475177472", + "outputIndex": 0, + "expectedQty": "413086631357112634127259", + "swapFee": "257399254374887276630", + "reserves": [ + "6501478659683545965537973", + "42706200799090775842355112", + "16902818802599164151299785" + ], + "mAssetSupply": "65880547082976721846045080", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "88328008870027241455616", + "expectedQty": "84809815880100740408630", + "swapFee": "52996805322016344873", + "reserves": [ + "6416668843803445225129343", + "42706200799090775842355112", + "16902818802599164151299785" + ], + "mAssetSupply": "65792272070912016620934337" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "6654384637295486", + "expectedQty": "6734559990544750", + "swapFee": "3992630782377", + "reserves": [ + "6416668843803445225129343", + "42706200792356215851810362", + "16902818802599164151299785" + ], + "mAssetSupply": "65792272064261624614421228" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "4693122414916293632", + "outputIndex": 0, + "expectedQty": "4447553783541250662", + "swapFee": "2780680888531061", + "reserves": [ + "6416664396249661683878681", + "42706205485478630768103994", + "16902818802599164151299785" + ], + "mAssetSupply": "65792272067042305502952289", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "1430740241048912737075200", + "expectedQty": "1412445223484445033175222", + "reserves": [ + "6416664396249661683878681", + "44136945726527543505179194", + "16902818802599164151299785" + ] + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "29835336813659583152128", + "expectedQty": "28555908019027451728760", + "swapFee": "17901202088195749891", + "reserves": [ + "6388108488230634232149921", + "44136945726527543505179194", + "16902818802599164151299785" + ], + "mAssetSupply": "67174899854915179148725274" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "2394864676822371314696192", + "expectedQty": "2471868961738536241201756", + "reserves": [ + "8782973165053005546846113", + "44136945726527543505179194", + "16902818802599164151299785" + ] + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "1462172638843233552564224", + "expectedQty": "1421730230414110186800466", + "swapFee": "877303583305940131538", + "reserves": [ + "7361242934638895360045647", + "44136945726527543505179194", + "16902818802599164151299785" + ], + "mAssetSupply": "68185473481393787777494344" + }, + { + "type": "redeemMasset", + "inputQty": "1052011282913150212505", + "expectedQtys": [ + "113540128051326465232", + "680770151736639154401", + "260709805166839164013" + ], + "redemptionFee": "315603384873945063", + "reserves": [ + "7361129394510844033580415", + "44136264956375806866024793", + "16902558092793997312135772" + ], + "mAssetSupply": "68184421785714259501226902" + }, + { + "type": "mintMulti", + "inputQtys": [ + "7106422645620474904576", + "2794122992353078149120", + "29016820743981500465152" + ], + "expectedQty": "39206077161325965797230", + "reserves": [ + "7368235817156464508484991", + "44139059079368159944173913", + "16931574913537978812600924" + ], + "mAssetSupply": "68223627862875585467024132" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "2750935418458977299595264", + "expectedQty": "2755410001318197013170628", + "reserves": [ + "7368235817156464508484991", + "44139059079368159944173913", + "19682510331996956112196188" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "1470853362553102592", + "1183196777958624000", + "1019315054884650752" + ], + "expectedQty": "3711837583001108110", + "swapFee": "2228439613568806", + "reserves": [ + "7368234346303101955382399", + "44139057896171381985549913", + "19682509312681901227545436" + ], + "mAssetSupply": "70979034152356199479086650" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "764689585814436608737280", + "expectedQty": "756370377132379279044027", + "reserves": [ + "7368234346303101955382399", + "44903747481985818594287193", + "19682509312681901227545436" + ] + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "1130191346032103837925376", + "expectedQty": "1117536961006979653112594", + "reserves": [ + "7368234346303101955382399", + "46033938828017922432212569", + "19682509312681901227545436" + ] + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "54303052268425483124736", + "expectedQty": "54216295700455951023213", + "swapFee": "32581831361055289874", + "reserves": [ + "7368234346303101955382399", + "46033938828017922432212569", + "19628293016981445276522223" + ], + "mAssetSupply": "72798671020058493983408409" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "892377878044081389568", + "expectedQty": "902127670534443036094", + "swapFee": "535426726826448833", + "reserves": [ + "7368234346303101955382399", + "46033036700347387989176475", + "19628293016981445276522223" + ], + "mAssetSupply": "72797779177607176728467674" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "1024890324708636772794368", + "1099233276123599748464640", + "852823205850623206490112" + ], + "expectedQty": "3007372706048776648002316", + "swapFee": "1805506927785937551332", + "reserves": [ + "6343344021594465182588031", + "44933803424223788240711835", + "18775469811130822070032111" + ], + "mAssetSupply": "69790406471558400080465358" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "2030249757560684150784", + "expectedQty": "2004037802362344431735", + "reserves": [ + "6343344021594465182588031", + "44935833673981348924862619", + "18775469811130822070032111" + ] + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "16199455263542791372800", + "expectedQty": "16401443942641345732254", + "swapFee": "9719673158125674823", + "reserves": [ + "6343344021594465182588031", + "44919432230038707579130365", + "18775469811130822070032111" + ], + "mAssetSupply": "69776220773770377759199116" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "98493866864408199692288", + "82367799569401377718272", + "65750610446518807691264" + ], + "expectedQty": "250333503609379438544819", + "swapFee": "150290276331426519038", + "reserves": [ + "6244850154730056982895743", + "44837064430469306201412093", + "18709719200684303262340847" + ], + "mAssetSupply": "69525887270160998320654297" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "34504343112726102016", + "12282038126200629248", + "952825897628289280" + ], + "expectedQty": "49260034292456740966", + "swapFee": "29573764834374669", + "reserves": [ + "6244815650386944256793727", + "44837052148431180000782845", + "18709718247858405634051567" + ], + "mAssetSupply": "69525838010126705863913331" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "2052407804268334358200320", + "expectedQty": "2024727463558169528474803", + "reserves": [ + "6244815650386944256793727", + "46889459952699514358983165", + "18709718247858405634051567" + ] + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "460702687884501061730304", + "expectedQty": "461304032044953420433152", + "reserves": [ + "6244815650386944256793727", + "46889459952699514358983165", + "19170420935742906695781871" + ] + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "44982077387114127360", + "expectedQty": "44363596149039045195", + "reserves": [ + "6244815650386944256793727", + "46889504934776901473110525", + "19170420935742906695781871" + ] + }, + { + "type": "redeemMasset", + "inputQty": "1733383547323037900", + "expectedQtys": [ + "150272541372411362", + "1128328755358302428", + "461308713414857352" + ], + "redemptionFee": "520015064196911", + "reserves": [ + "6244815500114402884382365", + "46889503806448146114808097", + "19170420474434193280924519" + ], + "mAssetSupply": "72011912136462445593025492" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "156924146159561536", + "outputIndex": 1, + "expectedQty": "159188752082427479", + "swapFee": "94256544534044", + "reserves": [ + "6244815500114402884382365", + "46889503647259394032380618", + "19170420631358339440486055" + ], + "mAssetSupply": "72011912136556702137559536", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemBassets", + "inputQtys": [ + "2681247636781390102528", + "3806283695545176293376", + "2345572107186304712704" + ], + "expectedQty": "8925510648740032498187", + "swapFee": "5358521502145306682", + "reserves": [ + "6242134252477621494279837", + "46885697363563848856087242", + "19168075059251153135773351" + ], + "mAssetSupply": "72002986625907962105061349" + }, + { + "type": "mintMulti", + "inputQtys": [ + "23630729961244209152", + "9806067068656453632", + "101139981866492362752" + ], + "expectedQty": "135805239990670417233", + "reserves": [ + "6242157883207582738488989", + "46885707169630917512540874", + "19168176199233019628136103" + ], + "mAssetSupply": "72003122431147952775478582" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "394167145024509483941888", + "329666951975333131190272", + "84330266551040249692160" + ], + "expectedQty": "825751946600944374768445", + "swapFee": "495748617130845131940", + "reserves": [ + "5847990738183073254547101", + "46556040217655584381350602", + "19083845932681979378443943" + ], + "mAssetSupply": "71177370484547008400710137" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "3778759726891005440", + "5573305687150920704", + "5068740987326482432" + ], + "expectedQty": "14569382993382475481", + "swapFee": "8746877922783155", + "reserves": [ + "5847986959423346363541661", + "46556034644349897230429898", + "19083840863940992051961511" + ], + "mAssetSupply": "71177355915164015018234656" + }, + { + "type": "mintMulti", + "inputQtys": [ + "1909104875138683136", + "6397224356281821184", + "5047775334618534912" + ], + "expectedQty": "13379317587313091978", + "reserves": [ + "5847988868528221502224797", + "46556041041574253512251082", + "19083845911716326670496423" + ], + "mAssetSupply": "71177369294481602331326634" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "3489159123784755937542144", + "expectedQty": "3535724036503884779765867", + "swapFee": "2093495474270853562525", + "reserves": [ + "5847988868528221502224797", + "43020317005070368732485215", + "19083845911716326670496423" + ], + "mAssetSupply": "67690303666171117247347015" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "1783217116881039357116416", + "outputIndex": 0, + "expectedQty": "1657783487453206718452315", + "swapFee": "1068933658311523933732", + "reserves": [ + "4190205381075014783772482", + "43020317005070368732485215", + "20867063028597366027612839" + ], + "mAssetSupply": "67691372599829428771280747", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mintMulti", + "inputQtys": [ + "3658358152942299648", + "57910399203662456", + "2382833173774778368" + ], + "expectedQty": "6465374918120802265", + "reserves": [ + "4190209039433167726072130", + "43020317062980767936147671", + "20867065411430539802391207" + ], + "mAssetSupply": "67691379065204346892083012" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "108771463589482907828224", + "outputIndex": 2, + "expectedQty": "119989735958736721356787", + "swapFee": "71798908164442660679", + "reserves": [ + "4298980503022650633900354", + "43020317062980767936147671", + "20747075675471803081034420" + ], + "mAssetSupply": "67691450864112511334743691", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "3881927085407743488", + "outputIndex": 1, + "expectedQty": "4330959331949091147", + "swapFee": "2556225992874050", + "reserves": [ + "4298984384949736041643842", + "43020312732021435987056524", + "20747075675471803081034420" + ], + "mAssetSupply": "67691450866668737327617741", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mintMulti", + "inputQtys": [ + "9129368328199762944", + "9058586782516996096", + "70546842825231417344" + ], + "expectedQty": "89242229866106672017", + "reserves": [ + "4298993514318064241406786", + "43020321790608218504052620", + "20747146222314628312451764" + ], + "mAssetSupply": "67691540108898603434289758" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "289997686912710934003712", + "expectedQty": "290733364051012018167363", + "swapFee": "173998612147626560402", + "reserves": [ + "4298993514318064241406786", + "43020321790608218504052620", + "20456412858263616294284401" + ], + "mAssetSupply": "67401716420598040126846448" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "15119370924849769742336", + "outputIndex": 0, + "expectedQty": "13535343081829604257455", + "swapFee": "8917683825846938196", + "reserves": [ + "4285458171236234637149331", + "43035441161533068273794956", + "20456412858263616294284401" + ], + "mAssetSupply": "67401725338281865973784644", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mintMulti", + "inputQtys": [ + "1101015624486160487677952", + "1460321479440313129893888", + "1219741910159865092767744" + ], + "expectedQty": "3844334881364276943465487", + "reserves": [ + "5386473795722395124827283", + "44495762640973381403688844", + "21676154768423481387052145" + ], + "mAssetSupply": "71246060219646142917250131" + }, + { + "type": "mintMulti", + "inputQtys": [ + "670514918820994", + "1952363709240007", + "432087738547944" + ], + "expectedQty": "3071582368334947", + "reserves": [ + "5386473796392910043648277", + "44495762642925745112928851", + "21676154768855569125600089" + ], + "mAssetSupply": "71246060222717725285585078" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "1718388315259542784", + "1935194057053305088", + "1772970588118136320" + ], + "expectedQty": "5510698925192491543", + "swapFee": "3308404397754147", + "reserves": [ + "5386472078004594784105493", + "44495760707731688059623763", + "21676152995884981007463769" + ], + "mAssetSupply": "71246054712018800093093535" + }, + { + "type": "mintMulti", + "inputQtys": [ + "42434106885130936123392", + "45149390842387366936576", + "8823931212758239936512" + ], + "expectedQty": "98584550422914194353092", + "reserves": [ + "5428906184889725720228885", + "44540910098574075426560339", + "21684976927097739247400281" + ], + "mAssetSupply": "71344639262441714287446627" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "4533377246099446207348736", + "outputIndex": 2, + "expectedQty": "4685478162946593449734134", + "swapFee": "2818358841207331054161", + "reserves": [ + "9962283430989171927577621", + "44540910098574075426560339", + "16999498764151145797666147" + ], + "mAssetSupply": "71347457621282921618500788", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemMasset", + "inputQty": "13944647073264036111974", + "expectedQtys": [ + "1946514353296251904575", + "8702775966608276916048", + "3321504409353726058686" + ], + "redemptionFee": "4183394121979210833", + "reserves": [ + "9960336916635875675673046", + "44532207322607467149644291", + "16996177259741792071607461" + ], + "mAssetSupply": "71333517157603779561599647" + }, + { + "type": "mintMulti", + "inputQtys": [ + "645574409135793242112", + "557620543670243622912", + "385780419284152549376" + ], + "expectedQty": "1597113279821697340767", + "reserves": [ + "9960982491045011468915158", + "44532764943151137393267203", + "16996563040161076224156837" + ], + "mAssetSupply": "71335114270883601258940414" + }, + { + "type": "mintMulti", + "inputQtys": [ + "171160184251773344", + "179973891372593504", + "181083130588594784" + ], + "expectedQty": "534377961979714022", + "reserves": [ + "9960982662205195720688502", + "44532765123125028765860707", + "16996563221244206812751621" + ], + "mAssetSupply": "71335114805261563238654436" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "322326938383905015726080", + "124536238666657887682560", + "213046763108404056555520" + ], + "expectedQty": "665599540631609628161619", + "swapFee": "399599484069407421349", + "reserves": [ + "9638655723821290704962422", + "44408228884458370878178147", + "16783516458135802756196101" + ], + "mAssetSupply": "70669515264629953610492817" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "17575147877856", + "expectedQty": "17498517562378", + "swapFee": "10545088726", + "reserves": [ + "9638655723821290704962422", + "44408228884458370878178147", + "16783516458118304238633723" + ], + "mAssetSupply": "70669515264612389007703687" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "196807552848662708092928", + "1159642467630231601545216", + "1803566741737715754074112" + ], + "expectedQty": "3160932715004447252862850", + "swapFee": "1897698247951439215246", + "reserves": [ + "9441848170972627996869494", + "43248586416828139276632931", + "14979949716380588484559611" + ], + "mAssetSupply": "67508582549607941754840837" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "8199814082669462945792", + "expectedQty": "8243265170393863372470", + "reserves": [ + "9441848170972627996869494", + "43248586416828139276632931", + "14988149530463257947505403" + ] + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "13720536606877295837184", + "expectedQty": "13977300933330431373381", + "reserves": [ + "9455568707579505292706678", + "43248586416828139276632931", + "14988149530463257947505403" + ] + }, + { + "type": "redeemMasset", + "inputQty": "709650607815685671642726", + "expectedQtys": [ + "99334477394833324227028", + "454343452270323175359526", + "157456420313538880841616" + ], + "redemptionFee": "212895182344705701492", + "reserves": [ + "9356234230184671968479650", + "42794242964557816101273405", + "14830693110149719066663787" + ], + "mAssetSupply": "66821365403078325083645454" + }, + { + "type": "redeemMasset", + "inputQty": "81679633997263245882163", + "expectedQtys": [ + "11433237240355770704445", + "52294194469472798706875", + "18122978603957493057570" + ], + "redemptionFee": "24503890199178973764", + "reserves": [ + "9344800992944316197775205", + "42741948770088343302566530", + "14812570131545761573606217" + ], + "mAssetSupply": "66739710272971261016737055" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "172059196149863456", + "expectedQty": "173632375856461110", + "swapFee": "103235517689918", + "reserves": [ + "9344800992944316197775205", + "42741948596455967446105420", + "14812570131545761573606217" + ], + "mAssetSupply": "66739710101015300384563517" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "479616402054798385348608", + "expectedQty": "476657195739159617076559", + "swapFee": "287769841232879031209", + "reserves": [ + "9344800992944316197775205", + "42741948596455967446105420", + "14335912935806601956529658" + ], + "mAssetSupply": "66260381468801734878246118" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "4870149526316600262656", + "expectedQty": "4898971832684886997365", + "reserves": [ + "9344800992944316197775205", + "42741948596455967446105420", + "14340783085332918556792314" + ] + }, + { + "type": "redeemMasset", + "inputQty": "121708695412844183683072", + "expectedQtys": [ + "17158341851449574992564", + "78480105244489171583442", + "26331653160020828359738" + ], + "redemptionFee": "36512608623853255104", + "reserves": [ + "9327642651092866622782641", + "42663468491211478274521978", + "14314451432172897728432576" + ], + "mAssetSupply": "66143608257830199434815515" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "207007273003610865664", + "outputIndex": 2, + "expectedQty": "209491015575079586445", + "swapFee": "126514001920808096", + "reserves": [ + "9327849658365870233648305", + "42663468491211478274521978", + "14314241941157322648846131" + ], + "mAssetSupply": "66143608384344201355623611", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "43340390765385501114368", + "expectedQty": "42519838833550353908607", + "swapFee": "26004234459231300668", + "reserves": [ + "9285329819532319879739698", + "42663468491211478274521978", + "14314241941157322648846131" + ], + "mAssetSupply": "66100293997813275085809911" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "91803890028137007808512", + "expectedQty": "90040217807015053426531", + "swapFee": "55082334016882204685", + "reserves": [ + "9195289601725304826313167", + "42663468491211478274521978", + "14314241941157322648846131" + ], + "mAssetSupply": "66008545190119154960206084" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "61636247230257322524672", + "114587742216605168304128", + "64918545721983160549376" + ], + "expectedQty": "241568486901992077087104", + "swapFee": "145028109006599205775", + "reserves": [ + "9133653354495047503788495", + "42548880748994873106217850", + "14249323395435339488296755" + ], + "mAssetSupply": "65766976703217162883118980" + }, + { + "type": "redeemMasset", + "inputQty": "26813016252291", + "expectedQtys": [ + "3722648323989", + "17341858012373", + "5807667293383" + ], + "redemptionFee": "8043904875", + "reserves": [ + "9133653354491324855464506", + "42548880748977531248205477", + "14249323395429531821003372" + ], + "mAssetSupply": "65766976703190357910771564" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "43742112898818760507392", + "35947787257460077625344", + "66058764673663434227712" + ], + "expectedQty": "146630514128711618246825", + "swapFee": "88031127153519082397", + "reserves": [ + "9089911241592506094957114", + "42512932961720071170580133", + "14183264630755868386775660" + ], + "mAssetSupply": "65620346189061646292524739" + }, + { + "type": "mintMulti", + "inputQtys": [ + "385705666911135546212352", + "34891886956134168264704", + "330407592685449043247104" + ], + "expectedQty": "759788058884452535259567", + "reserves": [ + "9475616908503641641169466", + "42547824848676205338844837", + "14513672223441317430022764" + ], + "mAssetSupply": "66380134247946098827784306" + }, + { + "type": "mintMulti", + "inputQtys": [ + "34141946450144376389632", + "46749515520091956969472", + "46736493811273620783104" + ], + "expectedQty": "128052244488469403082808", + "reserves": [ + "9509758854953786017559098", + "42594574364196297295814309", + "14560408717252591050805868" + ], + "mAssetSupply": "66508186492434568230867114" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "218770797389699847553024", + "169283740831471124873216", + "80609511728399641477120" + ], + "expectedQty": "471462011244048070392900", + "swapFee": "283047034967409287808", + "reserves": [ + "9290988057564086170006074", + "42425290623364826170941093", + "14479799205524191409328748" + ], + "mAssetSupply": "66036724481190520160474214" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "3290661888908688478961664", + "expectedQty": "3319185600835700277651697", + "swapFee": "1974397133345213087376", + "reserves": [ + "9290988057564086170006074", + "39106105022529125893289396", + "14479799205524191409328748" + ], + "mAssetSupply": "62748036989415176894599926" + }, + { + "type": "redeemMasset", + "inputQty": "109878896482561464729", + "expectedQtys": [ + "16264688090807662237", + "68458660876221444496", + "25348156324842106170" + ], + "redemptionFee": "32963668944768439", + "reserves": [ + "9290971792875995362343837", + "39106036563868249671844900", + "14479773857367866567222578" + ], + "mAssetSupply": "62747927143482363277903636" + }, + { + "type": "mintMulti", + "inputQtys": [ + "1713400904403303", + "544614938148458", + "927755433181069" + ], + "expectedQty": "3212170299772145", + "reserves": [ + "9290971794589396266747140", + "39106036564412864609993358", + "14479773858295622000403647" + ], + "mAssetSupply": "62747927146694533577675781" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "79161346478768098639872", + "51052357479109339643904", + "411364152686334516920320" + ], + "expectedQty": "544255408981613135564163", + "swapFee": "326749294965947449808", + "reserves": [ + "9211810448110628168107268", + "39054984206933755270349454", + "14068409705609287483483327" + ], + "mAssetSupply": "62203671737712920442111618" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "435195458953277800448", + "expectedQty": "432873734554685615035", + "swapFee": "261117275371966680", + "reserves": [ + "9211810448110628168107268", + "39054984206933755270349454", + "14067976831874732797868292" + ], + "mAssetSupply": "62203236803371242536277850" + }, + { + "type": "mintMulti", + "inputQtys": [ + "32986102767906021376", + "1639423781919782144", + "24238532663773110272" + ], + "expectedQty": "59491922449359409977", + "reserves": [ + "9211843434213396074128644", + "39054985846357537190131598", + "14068001070407396570978564" + ], + "mAssetSupply": "62203296295293691895687827" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "59547136141644733087744", + "expectedQty": "60491818995253710863492", + "reserves": [ + "9271390570355040807216388", + "39054985846357537190131598", + "14068001070407396570978564" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "17948550370141", + "40411932046931", + "30617224959207" + ], + "expectedQty": "89050881180340", + "reserves": [ + "9271390570372989357586529", + "39054985846397949122178529", + "14068001070438013795937771" + ], + "mAssetSupply": "62263788114377996487731659" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "1274632615054385920", + "1500646843632736512", + "1103214726696544640" + ], + "expectedQty": "3890630802274553109", + "swapFee": "2335779949334332", + "reserves": [ + "9271389295740374303200609", + "39054984345751105489442017", + "14067999967223287099393131" + ], + "mAssetSupply": "62263784223747194213178550" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "3911367360884269121536", + "955366549220908335104", + "801531322933168570368" + ], + "expectedQty": "5725324938196321178487", + "swapFee": "3437257317308177613", + "reserves": [ + "9267477928379490034079073", + "39054028979201884581106913", + "14067198435900353930822763" + ], + "mAssetSupply": "62258058898808997892000063" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "1420855556619369971712", + "expectedQty": "1397957526471760765388", + "swapFee": "852513333971621983", + "reserves": [ + "9266079970853018273313685", + "39054028979201884581106913", + "14067198435900353930822763" + ], + "mAssetSupply": "62256638895765712493650334" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "17595175178525222912", + "77788369751759454208", + "17751636494728945664" + ], + "expectedQty": "112812317361755714105", + "swapFee": "67728027233393464", + "reserves": [ + "9266062375677839748090773", + "39053951190832132821652705", + "14067180684263859201877099" + ], + "mAssetSupply": "62256526083448350737936229" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "11251398671576221089792", + "36651015857272684544", + "5256920075663028781056" + ], + "expectedQty": "16747440716020099875008", + "swapFee": "10054497127888793200", + "reserves": [ + "9254810977006263527000981", + "39053914539816275548968161", + "14061923764188196173096043" + ], + "mAssetSupply": "62239778642732330638061221" + }, + { + "type": "mintMulti", + "inputQtys": [ + "146814379777445786025984", + "184096579938339264659456", + "107802937248434117148672" + ], + "expectedQty": "439907493659269314180895", + "reserves": [ + "9401625356783709313026965", + "39238011119754614813627617", + "14169726701436630290244715" + ], + "mAssetSupply": "62679686136391599952242116" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "230634908711530784", + "670961283876619648", + "254592156951932640" + ], + "expectedQty": "1155108564019759023", + "swapFee": "693481227148144", + "reserves": [ + "9401625126148800601496181", + "39238010448793330937007969", + "14169726446844473338312075" + ], + "mAssetSupply": "62679684981283035932483093" + }, + { + "type": "redeemMasset", + "inputQty": "7812544943106422944563", + "expectedQtys": [ + "1171489353728435922167", + "4889251686327978317185", + "1765618545197441603710" + ], + "redemptionFee": "2343763482931926883", + "reserves": [ + "9400453636795072165574014", + "39233121197107002958690784", + "14167960828299275896708365" + ], + "mAssetSupply": "62671874780103412441465413" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "2183811517627970355200", + "59320293871659261952", + "2730871460816165011456" + ], + "expectedQty": "5020205653653223461911", + "swapFee": "3013931751242679684", + "reserves": [ + "9398269825277444195218814", + "39233061876813131299428832", + "14165229956838459731696909" + ], + "mAssetSupply": "62666854574449759218003502" + }, + { + "type": "redeemMasset", + "inputQty": "257369011219156330086", + "expectedQtys": [ + "38586550761153949050", + "161079492477803289956", + "58158296679551877773" + ], + "redemptionFee": "77210703365746899", + "reserves": [ + "9398231238726683041269764", + "39232900797320653496138876", + "14165171798541780179819136" + ], + "mAssetSupply": "62666597282649243427420315" + }, + { + "type": "mintMulti", + "inputQtys": [ + "719932927537703628570624", + "973640784120833401421824", + "2162207008095930723336192" + ], + "expectedQty": "3866789202180447701814898", + "reserves": [ + "10118164166264386669840388", + "40206541581441486897560700", + "16327378806637710903155328" + ], + "mAssetSupply": "66533386484829691129235213" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "568876904341092375199744", + "167439645336190159159296", + "244332531481689777504256" + ], + "expectedQty": "988670685108266968542069", + "swapFee": "593558546192675786597", + "reserves": [ + "9549287261923294294640644", + "40039101936105296738401404", + "16083046275156021125651072" + ], + "mAssetSupply": "65544715799721424160693144" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "1654765278051852282232832", + "expectedQty": "1622135662637775405198581", + "swapFee": "992859166831111369339", + "reserves": [ + "7927151599285518889442063", + "40039101936105296738401404", + "16083046275156021125651072" + ], + "mAssetSupply": "63890943380836402989829651" + }, + { + "type": "redeemMasset", + "inputQty": "13671678668906404249", + "expectedQtys": [ + "1695779565164611592", + "8565181329055175194", + "3440491944352946420" + ], + "redemptionFee": "4101503600671921", + "reserves": [ + "7927149903505953724830471", + "40039093370923967683226210", + "16083042834664076772704652" + ], + "mAssetSupply": "63890929713259237684097323" + }, + { + "type": "mintMulti", + "inputQtys": [ + "64306525040226879930368", + "57899722630256845127680", + "69020226539650566586368" + ], + "expectedQty": "192358706728368669467405", + "reserves": [ + "7991456428546180604760839", + "40096993093554224528353890", + "16152063061203727339291020" + ], + "mAssetSupply": "64083288419987606353564728" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "10747910898173085359276032", + "1783777594390817336721408", + "4190222368818933144748032" + ], + "insufficientLiquidityError": true + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "35992212368596442021888", + "expectedQty": "35878117240068940377567", + "swapFee": "21595327421157865213", + "reserves": [ + "7991456428546180604760839", + "40096993093554224528353890", + "16116184943963658398913453" + ], + "mAssetSupply": "64047317802946431069408053" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "48368209683096641536", + "117742375255438655488", + "107118669145990250496" + ], + "expectedQty": "273504318422005944549", + "swapFee": "164201111720235708", + "reserves": [ + "7991408060336497508119303", + "40096875351178969089698402", + "16116077825294512408662957" + ], + "mAssetSupply": "64047044298628009063463504" + }, + { + "type": "redeemMasset", + "inputQty": "5528544370340", + "expectedQtys": [ + "689611835650", + "3460126126215", + "1390723377994" + ], + "redemptionFee": "1658563311", + "reserves": [ + "7991408060335807896283653", + "40096875351175508963572187", + "16116077825293121685284963" + ], + "mAssetSupply": "64047044298622482177656475" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "55196492143672640", + "outputIndex": 2, + "expectedQty": "54491109218505161", + "swapFee": "32799192202939", + "reserves": [ + "7991408060335807896283653", + "40096875406372001107244827", + "16116077770802012466779802" + ], + "mAssetSupply": "64047044298655281369859414", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemBassets", + "inputQtys": [ + "423874820902252707840", + "1297179245801721561088", + "13156356327771232796672" + ], + "expectedQty": "14909048733797192112401", + "swapFee": "8950799720110381496", + "reserves": [ + "7990984185514905643575813", + "40095578227126199385683739", + "16102921414474241233983130" + ], + "mAssetSupply": "64032135249921484177747013" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "1777319157724751706718208", + "expectedQty": "1810977477571551354476788", + "reserves": [ + "9768303343239657350294021", + "40095578227126199385683739", + "16102921414474241233983130" + ] + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "2789891048733259857920", + "outputIndex": 1, + "expectedQty": "2819734853926073707306", + "swapFee": "1679191899152736616", + "reserves": [ + "9768303343239657350294021", + "40092758492272273311976433", + "16105711305522974493841050" + ], + "mAssetSupply": "65843114406684934684960417", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemMasset", + "inputQty": "114165921154565819439513", + "expectedQtys": [ + "16932260831516801763709", + "69496310709472726517548", + "27917448416562074948525" + ], + "redemptionFee": "34249776346369745831", + "reserves": [ + "9751371082408140548530312", + "40023262181562800585458885", + "16077793857106412418892525" + ], + "mAssetSupply": "65728982735306715235266735" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "1380749188366861312", + "expectedQty": "1369604354960099945", + "reserves": [ + "9751371082408140548530312", + "40023263562311988952320197", + "16077793857106412418892525" + ] + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "29443604915252468121600", + "expectedQty": "29665256472987837619378", + "swapFee": "17666162949151480872", + "reserves": [ + "9751371082408140548530312", + "39993598305839001114700819", + "16077793857106412418892525" + ], + "mAssetSupply": "65699558166158766878725952" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "567121463224945260625920", + "306227564720585349005312", + "190302670588080474292224" + ], + "expectedQty": "1070866917623445312040931", + "swapFee": "642905894110533507328", + "reserves": [ + "9184249619183195287904392", + "39687370741118415765695507", + "15887491186518331944600301" + ], + "mAssetSupply": "64628691248535321566685021" + }, + { + "type": "mintMulti", + "inputQtys": [ + "524083318247074496512", + "346463527789703725056", + "8790385940417022976" + ], + "expectedQty": "885375641671432512524", + "reserves": [ + "9184773702501442362400904", + "39687717204646205469420563", + "15887499976904272361623277" + ], + "mAssetSupply": "64629576624176992999197545" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "2561048264182813687808", + "816095757009726734336", + "7771455754638298447872" + ], + "expectedQty": "11209152837256043964800", + "swapFee": "6729529420005629756", + "reserves": [ + "9182212654237259548713096", + "39686901108889195742686227", + "15879728521149634063175405" + ], + "mAssetSupply": "64618367471339736955232745" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "1600723612241740322308096", + "401587017307673134628864", + "995042586246375486259200" + ], + "expectedQty": "3029695873988654994716888", + "swapFee": "1818908869715022010036", + "reserves": [ + "7581489041995519226405000", + "39285314091581522608057363", + "14884685934903258576916205" + ], + "mAssetSupply": "61588671597351081960515857" + }, + { + "type": "mintMulti", + "inputQtys": [ + "476084430588183763222528", + "691724401879482942619648", + "539686127988067639754752" + ], + "expectedQty": "1713653488500188293684404", + "reserves": [ + "8057573472583702989627528", + "39977038493461005550677011", + "15424372062891326216670957" + ], + "mAssetSupply": "63302325085851270254200261" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "3147750207719174832128", + "expectedQty": "3158021672867714871368", + "reserves": [ + "8057573472583702989627528", + "39977038493461005550677011", + "15427519813099045391503085" + ] + }, + { + "type": "redeemMasset", + "inputQty": "493424533884878035353", + "expectedQtys": [ + "62784635682685211866", + "311501198968255331949", + "120211278773762291934" + ], + "redemptionFee": "148027360165463410", + "reserves": [ + "8057510687948020304415662", + "39976726992262037295345062", + "15427399601820271629211151" + ], + "mAssetSupply": "63304989831017613256499686" + }, + { + "type": "redeemMasset", + "inputQty": "10932945155505375097651", + "expectedQtys": [ + "1391136701539314998944", + "6902019032942283875568", + "2663554865339031249975" + ], + "redemptionFee": "3279883546651612529", + "reserves": [ + "8056119551246480989416718", + "39969824973229095011469494", + "15424736046954932597961176" + ], + "mAssetSupply": "63294060165745654533014564" + }, + { + "type": "redeemMasset", + "inputQty": "4262202407266837489254", + "expectedQtys": [ + "542333846351764159903", + "2690748167011023018197", + "1038385338759210309554" + ], + "redemptionFee": "1278660722180051246", + "reserves": [ + "8055577217400129225256815", + "39967134225062083988451297", + "15423697661616173387651622" + ], + "mAssetSupply": "63289799241999109875576556" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "1160830405248893976576", + "expectedQty": "1134466829082976308553", + "swapFee": "696498243149336385", + "reserves": [ + "8054442750571046248948262", + "39967134225062083988451297", + "15423697661616173387651622" + ], + "mAssetSupply": "63288639108092104130936365" + }, + { + "type": "redeemMasset", + "inputQty": "438129790898159284440268", + "expectedQtys": [ + "55741957805226136033388", + "276598441203306034557773", + "106741972210730426515620" + ], + "redemptionFee": "131438937269447785332", + "reserves": [ + "7998700792765820112914874", + "39690535783858777953893524", + "15316955689405442961136002" + ], + "mAssetSupply": "62850640756131214294281429" + }, + { + "type": "mintMulti", + "inputQtys": [ + "190438605697204617216", + "297053379429612060672", + "80223708177302224896" + ], + "expectedQty": "569393887661376877493", + "reserves": [ + "7998891231371517317532090", + "39690832837238207565954196", + "15317035913113620263360898" + ], + "mAssetSupply": "62851210150018875671158922" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "2420421542779947057152", + "22498558372275493535744", + "8334022391269549932544" + ], + "expectedQty": "33115878882246581432980", + "swapFee": "19881456203069790734", + "reserves": [ + "7996470809828737370474938", + "39668334278865932072418452", + "15308701890722350713428354" + ], + "mAssetSupply": "62818094271136629089725942" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "431322370046360513675264", + "expectedQty": "429563089177326869730169", + "swapFee": "258793422027816308205", + "reserves": [ + "7996470809828737370474938", + "39668334278865932072418452", + "14879138801545023843698185" + ], + "mAssetSupply": "62387030694512296392358883" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "3866324048024156241920", + "expectedQty": "3902589588799597076004", + "swapFee": "2319794428814493745", + "reserves": [ + "7996470809828737370474938", + "39664431689277132475342448", + "14879138801545023843698185" + ], + "mAssetSupply": "62383166690258701050610708" + }, + { + "type": "mintMulti", + "inputQtys": [ + "171114892564163952640", + "357464612130482094080", + "296033385955463659520" + ], + "expectedQty": "826029801216817571042", + "reserves": [ + "7996641924721301534427578", + "39664789153889262957436528", + "14879434834930979307357705" + ], + "mAssetSupply": "62383992720059917868181750" + }, + { + "type": "redeemMasset", + "inputQty": "266583225113781731328", + "expectedQtys": [ + "34161504743005891120", + "169447237423744138521", + "63564667328086858595" + ], + "redemptionFee": "79974967534134519", + "reserves": [ + "7996607763216558528536458", + "39664619706651839213298007", + "14879371270263651220499110" + ], + "mAssetSupply": "62383726216809771620584941" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "574061222781655632052224", + "528658483211439502786560", + "817934509977765643550720" + ], + "expectedQty": "1932220266740895567875477", + "swapFee": "1160028176950707765384", + "reserves": [ + "7422546540434902896484234", + "39135961223440399710511447", + "14061436760285885576948390" + ], + "mAssetSupply": "60451505950068876052709464" + }, + { + "type": "redeemMasset", + "inputQty": "16320612836296", + "expectedQtys": [ + "2003327531547", + "10562702189257", + "3795148099313" + ], + "redemptionFee": "4896183850", + "reserves": [ + "7422546540432899568952687", + "39135961223429837008322190", + "14061436760282090428849077" + ], + "mAssetSupply": "60451505950052560336057018" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "3364492625852189504438272", + "expectedQty": "3326351758784264374581058", + "reserves": [ + "7422546540432899568952687", + "42500453849282026512760462", + "14061436760282090428849077" + ] + }, + { + "type": "redeemMasset", + "inputQty": "25327479371358958387", + "expectedQtys": [ + "2946759311443763674", + "16872727902579586017", + "5582406183636035319" + ], + "redemptionFee": "7598243811407687", + "reserves": [ + "7422543593673588125189013", + "42500436976554123933174445", + "14061431177875906792813758" + ], + "mAssetSupply": "63777832388955697163087376" + }, + { + "type": "mintMulti", + "inputQtys": [ + "5176912599637947318272", + "98369758257867685888", + "4511026292772548116480" + ], + "expectedQty": "9965658086009434599226", + "reserves": [ + "7427720506273226072507285", + "42500535346312381800860333", + "14065942204168679340930238" + ], + "mAssetSupply": "63787798047041706597686602" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "147737536293661369696256", + "expectedQty": "145960954933958086449768", + "reserves": [ + "7427720506273226072507285", + "42648272882606043170556589", + "14065942204168679340930238" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "604205572962014976", + "357360573491940480", + "376836799207793408" + ], + "expectedQty": "1354423279530537020", + "swapFee": "813141852830020", + "reserves": [ + "7427719902067653110492309", + "42648272525245469678616109", + "14065941827331880133136830" + ], + "mAssetSupply": "63933757647552385153599350" + }, + { + "type": "redeemMasset", + "inputQty": "4711415542529591450009", + "expectedQtys": [ + "547200379845022360457", + "3141899699132703335939", + "1036238416670964012413" + ], + "redemptionFee": "1413424662758877435", + "reserves": [ + "7427172701687808088131852", + "42645130625546336975280170", + "14064905588915209169124417" + ], + "mAssetSupply": "63929047645434518321026776" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "13718328778479070347264", + "101395544334372175872000", + "32809555899931462467584" + ], + "expectedQty": "147306813355813815875818", + "swapFee": "88437150303670491820", + "reserves": [ + "7413454372909329017784588", + "42543735081211964799408170", + "14032096033015277706656833" + ], + "mAssetSupply": "63781740832078704505150958" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "44580177230513079058432", + "41801972712241444683776", + "12487749591326168973312" + ], + "expectedQty": "99779479050535687980914", + "swapFee": "59903629608086264547", + "reserves": [ + "7368874195678815938726156", + "42501933108499723354724394", + "14019608283423951537683521" + ], + "mAssetSupply": "63681961353028168817170044" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "3816404010352454771146752", + "expectedQty": "3767226683995723187800577", + "reserves": [ + "7368874195678815938726156", + "46318337118852178125871146", + "14019608283423951537683521" + ] + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "2863159429890862743552", + "expectedQty": "2838889821898269559958", + "swapFee": "1717895657934517646", + "reserves": [ + "7368874195678815938726156", + "46318337118852178125871146", + "14016769393602053268123563" + ], + "mAssetSupply": "67446326595489659076744715" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "701519713654217526738944", + "outputIndex": 1, + "expectedQty": "715645773161482598737111", + "swapFee": "423990657675938724215", + "reserves": [ + "7368874195678815938726156", + "45602691345690695527134035", + "14718289107256270794862507" + ], + "mAssetSupply": "67446750586147335015468930", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mintMulti", + "inputQtys": [ + "25567164281341068967936", + "17308908223051906154496", + "12856264433154134114304" + ], + "expectedQty": "56477739324783147468979", + "reserves": [ + "7394441359960157007694092", + "45620000253913747433288531", + "14731145371689424928976811" + ], + "mAssetSupply": "67503228325472118162937909" + }, + { + "type": "mintMulti", + "inputQtys": [ + "849909941838160513204224", + "2131142709001115867807744", + "197257286534903141236736" + ], + "expectedQty": "3180045907735234411001972", + "reserves": [ + "8244351301798317520898316", + "47751142962914863301096275", + "14928402658224328070213547" + ], + "mAssetSupply": "70683274233207352573939881" + }, + { + "type": "redeemMasset", + "inputQty": "290491519370689721139", + "expectedQtys": [ + "33872166896868884005", + "196187016388213811778", + "61333794234694717691" + ], + "redemptionFee": "87147455811206916", + "reserves": [ + "8244317429631420652014311", + "47750946775898475087284497", + "14928341324430093375495856" + ], + "mAssetSupply": "70682983828835437695425658" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "2076519442176879886336", + "expectedQty": "2060510252822474749695", + "swapFee": "1245911665306127931", + "reserves": [ + "8244317429631420652014311", + "47750946775898475087284497", + "14926280814177270900746161" + ], + "mAssetSupply": "70680908555304926121667253" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "11346814023151126528", + "2183072784090550528", + "9591187813439358976" + ], + "expectedQty": "23507232117490387446", + "swapFee": "14112806954667032", + "reserves": [ + "8244306082817397500887783", + "47750944592825690996733969", + "14926271222989457461387185" + ], + "mAssetSupply": "70680885048072808631279807" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "4037432277736639488", + "expectedQty": "3986861359377883035", + "reserves": [ + "8244306082817397500887783", + "47750948630257968733373457", + "14926271222989457461387185" + ] + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "3281912780337105600512", + "expectedQty": "3321545632002773331692", + "swapFee": "1969147668202263360", + "reserves": [ + "8244306082817397500887783", + "47747627084625965960041765", + "14926271222989457461387185" + ], + "mAssetSupply": "70677609091301499105825690" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "41185933950098", + "outputIndex": 1, + "expectedQty": "41981932073575", + "swapFee": "24888616640", + "reserves": [ + "8244306082817397500887783", + "47747627084583984027968190", + "14926271223030643395337283" + ], + "mAssetSupply": "70677609091301523994442330", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemMasset", + "inputQty": "1219386546373862096896", + "expectedQtys": [ + "142194680210767544792", + "823533053711560246301", + "257442693414981277033" + ], + "redemptionFee": "365815963912158629", + "reserves": [ + "8244163888137186733342991", + "47746803551530272467721889", + "14926013780337228414060250" + ], + "mAssetSupply": "70676390070571114044504063" + }, + { + "type": "mintMulti", + "inputQtys": [ + "1310120070633998254080", + "2352165784381053730816", + "2562014766850240413696" + ], + "expectedQty": "6252994072661154490511", + "reserves": [ + "8245474008207820731597071", + "47749155717314653521452705", + "14928575795104078654473946" + ], + "mAssetSupply": "70682643064643775198994574" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "1669430830011621398544384", + "expectedQty": "1647999456259228026996669", + "reserves": [ + "8245474008207820731597071", + "49418586547326274919997089", + "14928575795104078654473946" + ] + }, + { + "type": "redeemMasset", + "inputQty": "30531962446914373917081", + "expectedQtys": [ + "3479507009108136922106", + "20854145935148393687479", + "6299708672098152314686" + ], + "redemptionFee": "9159588734074312175", + "reserves": [ + "8241994501198712594674965", + "49397732401391126526309610", + "14922276086431980502159260" + ], + "mAssetSupply": "72300119718044822926386337" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "637155019120404352", + "expectedQty": "642254677571021145", + "reserves": [ + "8241994501198712594674965", + "49397732401391126526309610", + "14922276723586999622563612" + ] + }, + { + "type": "redeemMasset", + "inputQty": "61381068869655973068", + "expectedQtys": [ + "6995156562000480369", + "41924909305057042813", + "12664854596518489315" + ], + "redemptionFee": "18414320660896791", + "reserves": [ + "8241987506042150594194596", + "49397690476481821469266797", + "14922264058732403104074297" + ], + "mAssetSupply": "72300058997644951502331205" + }, + { + "type": "redeemMasset", + "inputQty": "10849884190903989226700", + "expectedQtys": [ + "1236482843857207277012", + "7410760663682321168858", + "2238674043924869869347" + ], + "redemptionFee": "3254965257271196768", + "reserves": [ + "8240751023198293386917584", + "49390279715818139148097939", + "14920025384688478234204950" + ], + "mAssetSupply": "72289212368419304784301273" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "934169217183883722752", + "expectedQty": "926194896424535375719", + "swapFee": "560501530310330233", + "reserves": [ + "8240751023198293386917584", + "49390279715818139148097939", + "14919099189792053698829231" + ], + "mAssetSupply": "72288278759703651210908754" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "139546646454597809340416", + "outputIndex": 2, + "expectedQty": "142766611327675309591957", + "swapFee": "86408623513357372953", + "reserves": [ + "8380297669652891196258000", + "49390279715818139148097939", + "14776332578464378389237274" + ], + "mAssetSupply": "72288365168327164568281707", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemBassets", + "inputQtys": [ + "690847900531560808448", + "303105076504042995712", + "673559289480777826304" + ], + "expectedQty": "1690858568712342926907", + "swapFee": "1015124215756859872", + "reserves": [ + "8379606821752359635449552", + "49389976610741635105102227", + "14775659019174897611410970" + ], + "mAssetSupply": "72286674309758452225354800" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "73394856460592800071680", + "outputIndex": 2, + "expectedQty": "75013288825636775180250", + "swapFee": "45410109263527979390", + "reserves": [ + "8453001678212952435521232", + "49389976610741635105102227", + "14700645730349260836230720" + ], + "mAssetSupply": "72286719719867715753334190", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mintMulti", + "inputQtys": [ + "38637105702967816749056", + "4372924283097443729408", + "570894143110661734400" + ], + "expectedQty": "44717407595018786634174", + "reserves": [ + "8491638783915920252270288", + "49394349535024732548831635", + "14701216624492371497965120" + ], + "mAssetSupply": "72331437127462734539968364" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "893693104558286315716608", + "expectedQty": "900522494792968231652209", + "reserves": [ + "8491638783915920252270288", + "49394349535024732548831635", + "15594909729050657813681728" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "52264133925303287283712", + "34842429121641794502656", + "56614017381479036747776" + ], + "expectedQty": "145289403401720445467168", + "swapFee": "87225977627608832579", + "reserves": [ + "8439374649990616964986576", + "49359507105903090754328979", + "15538295711669178776933952" + ], + "mAssetSupply": "73086670218853982326153405" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "120852653021861", + "122816100438726", + "45004291908787" + ], + "expectedQty": "291190749030965", + "swapFee": "174819341023", + "reserves": [ + "8439374649869764311964715", + "49359507105780274653890253", + "15538295711624174485025165" + ], + "mAssetSupply": "73086670218562791577122440" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "3958521212266575254519808", + "expectedQty": "4040411105488954539286129", + "reserves": [ + "12397895862136339566484523", + "49359507105780274653890253", + "15538295711624174485025165" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "312920687851050536796160", + "7443115172612888391057408", + "2545487481763701073117184" + ], + "expectedQty": "10253494947835269509888592", + "reserves": [ + "12710816549987390103280683", + "56802622278393163044947661", + "18083783193387875558142349" + ], + "mAssetSupply": "87380576271887015626297161" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "399086300829814464970752", + "expectedQty": "395082560630245776110850", + "reserves": [ + "12710816549987390103280683", + "57201708579222977509918413", + "18083783193387875558142349" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "34633356327318064201728", + "12632840767466090004480", + "320794929720335666249728" + ], + "expectedQty": "370789863445377353333677", + "reserves": [ + "12745449906314708167482411", + "57214341419990443599922893", + "18404578123108211224392077" + ], + "mAssetSupply": "88146448695962638755741688" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "989849767030917699731456", + "expectedQty": "996046897657436129811530", + "reserves": [ + "12745449906314708167482411", + "57214341419990443599922893", + "19394427890139128924123533" + ] + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "507323205544597541355520", + "expectedQty": "510114914824392773297325", + "reserves": [ + "12745449906314708167482411", + "57214341419990443599922893", + "19901751095683726465479053" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "1222369943358264997576704", + "1103354567851806379999232", + "1586805708503578780368896" + ], + "expectedQty": "3934523463841222483055227", + "swapFee": "2362131357119004892768", + "reserves": [ + "11523079962956443169905707", + "56110986852138637219923661", + "18314945387180147685110157" + ], + "mAssetSupply": "85718087044603245175795316" + }, + { + "type": "mintMulti", + "inputQtys": [ + "28058796367954782978048", + "42580694945077422718976", + "40942734229048129486848" + ], + "expectedQty": "111987645873142270159937", + "reserves": [ + "11551138759324397952883755", + "56153567547083714642642637", + "18355888121409195814597005" + ], + "mAssetSupply": "85830074690476387445955253" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "15336525413123708944384", + "outputIndex": 2, + "expectedQty": "15551629043060251055679", + "swapFee": "9395961063536470253", + "reserves": [ + "11566475284737521661828139", + "56153567547083714642642637", + "18340336492366135563541326" + ], + "mAssetSupply": "85830084086437450982425506", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "58305814389950339088384", + "expectedQty": "57900147778394445267816", + "swapFee": "34983488633970203453", + "reserves": [ + "11566475284737521661828139", + "56153567547083714642642637", + "18282436344587741118273510" + ], + "mAssetSupply": "85771813255536134613540575" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "2059235629716653320699904", + "1443627980946698542252032", + "2100392125192283294269440" + ], + "expectedQty": "5653659886614667949794507", + "swapFee": "3394232471451671772940", + "reserves": [ + "9507239655020868341128235", + "54709939566137016100390605", + "16182044219395457824004070" + ], + "mAssetSupply": "80118153368921466663746068" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "15513725747997437853696", + "expectedQty": "15053037173866141869623", + "swapFee": "9308235448798462712", + "reserves": [ + "9492186617847002199258612", + "54709939566137016100390605", + "16182044219395457824004070" + ], + "mAssetSupply": "80102648951408918024355084" + }, + { + "type": "redeemMasset", + "inputQty": "21883786693577972855603", + "expectedQtys": [ + "2592456958950374264343", + "14942095985061514407163", + "4419556297780597843892" + ], + "redemptionFee": "6565136008073391856", + "reserves": [ + "9489594160888051824994269", + "54694997470151954585983442", + "16177624663097677226160178" + ], + "mAssetSupply": "80080771729851348124891337" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "1237663233997414144", + "709750351385353856", + "717026561501131648" + ], + "expectedQty": "2698606039398402704", + "swapFee": "1620135705062078", + "reserves": [ + "9489592923224817827580125", + "54694996760401603200629586", + "16177623946071115725028530" + ], + "mAssetSupply": "80080769031245308726488633" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "463588295349676141445120", + "expectedQty": "459200452247333042509321", + "swapFee": "278152977209805684867", + "reserves": [ + "9489592923224817827580125", + "54694996760401603200629586", + "15718423493823782682519209" + ], + "mAssetSupply": "79617458888872842390728380" + }, + { + "type": "mintMulti", + "inputQtys": [ + "508744023551989298233344", + "80279720254974956929024", + "2280082811226911445876736" + ], + "expectedQty": "2899962647211009795336085", + "reserves": [ + "9998336946776807125813469", + "54775276480656578157558610", + "17998506305050694128395945" + ], + "mAssetSupply": "82517421536083852186064465" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "376141984259523330703360", + "expectedQty": "378345649819727824713841", + "reserves": [ + "9998336946776807125813469", + "54775276480656578157558610", + "18374648289310217459099305" + ] + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "11148020420607913984", + "expectedQty": "11451344282332344053", + "reserves": [ + "9998348094797227733727453", + "54775276480656578157558610", + "18374648289310217459099305" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "141364196072281526501376", + "173834188926969442205696", + "213876997030314107731968" + ], + "expectedQty": "532089897080105355444889", + "reserves": [ + "10139712290869509260228829", + "54949110669583547599764306", + "18588525286340531566831273" + ], + "mAssetSupply": "83427868534327967698567248" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "381946558237178003456", + "expectedQty": "379636081772143770088", + "swapFee": "229167934942306802", + "reserves": [ + "10139712290869509260228829", + "54949110669583547599764306", + "18588145650258759423061185" + ], + "mAssetSupply": "83427486816937665462870594" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "178201148323282833899520", + "expectedQty": "179160741882784724587884", + "reserves": [ + "10139712290869509260228829", + "54949110669583547599764306", + "18766346798582042256960705" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "4022403123434697523200", + "7029322218980603068416", + "6800346896401389584384" + ], + "expectedQty": "17916207523348857536290", + "swapFee": "10756178220941879649", + "reserves": [ + "10135689887746074562705629", + "54942081347364566996695890", + "18759546451685640867376321" + ], + "mAssetSupply": "83588731351297101329922188" + }, + { + "type": "mintMulti", + "inputQtys": [ + "233661999774978720", + "22167437440129544", + "242970026108291168" + ], + "expectedQty": "506066688167260190", + "reserves": [ + "10135690121408074337684349", + "54942081369532004436825434", + "18759546694655666975667489" + ], + "mAssetSupply": "83588731857363789497182378" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "4690046566837002923147264", + "expectedQty": "4647613810663935881899899", + "swapFee": "2814027940102201753888", + "reserves": [ + "10135690121408074337684349", + "54942081369532004436825434", + "14111932883991731093767590" + ], + "mAssetSupply": "78901499318466888775789002" + }, + { + "type": "mintMulti", + "inputQtys": [ + "47032858423979799478272", + "87488196073155557588992", + "21450285503741163470848" + ], + "expectedQty": "156315631430524656708364", + "reserves": [ + "10182722979832054137162621", + "55029569565605159994414426", + "14133383169495472257238438" + ], + "mAssetSupply": "79057814949897413432497366" + }, + { + "type": "redeemMasset", + "inputQty": "228007632970629513216", + "expectedQtys": [ + "29358793229093736113", + "158661073031496529167", + "40749323626165731062" + ], + "redemptionFee": "68402289891188853", + "reserves": [ + "10182693621038825043426508", + "55029410904532128497885259", + "14133342420171846091507376" + ], + "mAssetSupply": "79057587010666732694173003" + }, + { + "type": "mintMulti", + "inputQtys": [ + "49977743672600957026304", + "11712291929414006996992", + "7811258003295546900480" + ], + "expectedQty": "70753872131304900100118", + "reserves": [ + "10232671364711426000452812", + "55041123196461542504882251", + "14141153678175141638407856" + ], + "mAssetSupply": "79128340882798037594273121" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "585124362614318957592576", + "outputIndex": 1, + "expectedQty": "606808144910827503616083", + "swapFee": "359698983671231068546", + "reserves": [ + "10817795727325744958045388", + "54434315051550715001266168", + "14141153678175141638407856" + ], + "mAssetSupply": "79128700581781708825341667", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "2193339914537173459664896", + "expectedQty": "2233760645214886235290478", + "reserves": [ + "13011135641862918417710284", + "54434315051550715001266168", + "14141153678175141638407856" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "30984878554638995947520", + "56145700428089349111808", + "64012067369419941085184" + ], + "expectedQty": "151776281597236087935592", + "reserves": [ + "13042120520417557413657804", + "54490460751978804350377976", + "14205165745544561579493040" + ], + "mAssetSupply": "81514237508593831148567737" + }, + { + "type": "redeemMasset", + "inputQty": "56432033441195667908198", + "expectedQtys": [ + "9026307622154124814546", + "37712246290799453325695", + "9831238381997903113221" + ], + "redemptionFee": "16929610032358700372", + "reserves": [ + "13033094212795403288843258", + "54452748505688004897052281", + "14195334507162563676379819" + ], + "mAssetSupply": "81457822404762667839359911" + }, + { + "type": "redeemMasset", + "inputQty": "7184950864140546867", + "expectedQtys": [ + "1149233383861217501", + "4801539481261329837", + "1251717515760157007" + ], + "redemptionFee": "2155485259242164", + "reserves": [ + "13033093063562019427625757", + "54452743704148523635722444", + "14195333255445047916222812" + ], + "mAssetSupply": "81457815221967288958055208" + }, + { + "type": "mintMulti", + "inputQtys": [ + "11845911478410112139264", + "24957777081287665778688", + "26984817971922160582656" + ], + "expectedQty": "64021791126462057413540", + "reserves": [ + "13044938975040429539765021", + "54477701481229811301501132", + "14222318073416970076805468" + ], + "mAssetSupply": "81521837013093751015468748" + }, + { + "type": "mintMulti", + "inputQtys": [ + "10435155828940698812416", + "4379496236762487324672", + "13419094855819947147264" + ], + "expectedQty": "28503836062885253147731", + "reserves": [ + "13055374130869370238577437", + "54482080977466573788825804", + "14235737168272790023952732" + ], + "mAssetSupply": "81550340849156636268616479" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "22578373043294", + "outputIndex": 1, + "expectedQty": "23150580762940", + "swapFee": "13748475432", + "reserves": [ + "13055374130891948611620731", + "54482080977443423208062864", + "14235737168272790023952732" + ], + "mAssetSupply": "81550340849156650017091911", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "13739476050314564468736", + "expectedQty": "13905120431873735009402", + "reserves": [ + "13055374130891948611620731", + "54482080977443423208062864", + "14249476644323104588421468" + ] + }, + { + "type": "redeemMasset", + "inputQty": "24770086370567213652377", + "expectedQtys": [ + "3963571613465952029268", + "16540592972650008827739", + "4326097480465423541538" + ], + "redemptionFee": "7431025911170164095", + "reserves": [ + "13051410559278482659591463", + "54465540384470773199235125", + "14245150546842639164879930" + ], + "mAssetSupply": "81539483314243867708613031" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "646547090935420032", + "expectedQty": "653214038353656160", + "swapFee": "387928254561252", + "reserves": [ + "13051410559278482659591463", + "54465539731256734845578965", + "14245150546842639164879930" + ], + "mAssetSupply": "81539482668084705027754251" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "215607070062907162624", + "46220866408330878976", + "15015640976259223552" + ], + "expectedQty": "279731530258059333875", + "swapFee": "167939681964014008", + "reserves": [ + "13051194952208419752428839", + "54465493510390326514699989", + "14245135531201662905656378" + ], + "mAssetSupply": "81539202936554446968420376" + }, + { + "type": "mintMulti", + "inputQtys": [ + "7387023425565102178304", + "2659314433837933527040", + "2650501289721113608192" + ], + "expectedQty": "12809826687129652094381", + "reserves": [ + "13058581975633984854607143", + "54468152824824164448227029", + "14247786032491384019264570" + ], + "mAssetSupply": "81552012763241576620514757" + }, + { + "type": "mintMulti", + "inputQtys": [ + "3517738269681648640", + "682100901659945088", + "1697141515361928960" + ], + "expectedQty": "5962299029953826120", + "reserves": [ + "13058585493372254536255783", + "54468153506925066108172117", + "14247787729632899381193530" + ], + "mAssetSupply": "81552018725540606574340877" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "71209419122839883087872", + "55808097494034892718080", + "23427621450377615900672" + ], + "expectedQty": "151186913576995014571700", + "swapFee": "90766608111063646931", + "reserves": [ + "12987376074249414653167911", + "54412345409431031215454037", + "14224360108182521765292858" + ], + "mAssetSupply": "81400831811963611559769177" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "7777301715454198", + "expectedQty": "7871054558446561", + "reserves": [ + "12987376074249414653167911", + "54412345409431031215454037", + "14224360115959823480747056" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "263768142616841472", + "98598792608511248", + "155249237936491552" + ], + "expectedQty": "522377489103664254", + "swapFee": "313614662259554", + "reserves": [ + "12987375810481272036326439", + "54412345310832238606942789", + "14224359960710585544255504" + ], + "mAssetSupply": "81400831297457177014551484" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "37948815675112237826048", + "expectedQty": "38516385288913002701448", + "reserves": [ + "13025324626156384274152487", + "54412345310832238606942789", + "14224359960710585544255504" + ] + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "115027006469998135738368", + "outputIndex": 1, + "expectedQty": "117592374346441985500080", + "swapFee": "69840006500608673224", + "reserves": [ + "13025324626156384274152487", + "54294752936485796621442709", + "14339386967180583679993872" + ], + "mAssetSupply": "81439417522752590625926156", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemMasset", + "inputQty": "197341481999247631974", + "expectedQtys": [ + "31553095691892789265", + "131525899287943380305", + "34736335724788949873" + ], + "redemptionFee": "59202444599774289", + "reserves": [ + "13025293073060692381363222", + "54294621410586508678062404", + "14339352230844858891043999" + ], + "mAssetSupply": "81439220240473035978068471" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "6390090248695583254511616", + "outputIndex": 0, + "expectedQty": "6083279691598466334377919", + "swapFee": "3789362286191215739212", + "reserves": [ + "6942013381462226046985303", + "60684711659282091932574020", + "14339352230844858891043999" + ], + "mAssetSupply": "81443009602759227193807683", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "26581178498572416450560", + "expectedQty": "27133844040029687997294", + "swapFee": "15948707099143449870", + "reserves": [ + "6942013381462226046985303", + "60657577815242062244576726", + "14339352230844858891043999" + ], + "mAssetSupply": "81416444372967753920806993" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "7760865607727153573527552", + "hardLimitError": true + }, + { + "type": "redeemMasset", + "inputQty": "14723665130752039924531", + "expectedQtys": [ + "1255043960525344921959", + "10966260436836055909889", + "2592406039323535284206" + ], + "redemptionFee": "4417099539225611977", + "reserves": [ + "6940758337501700702063344", + "60646611554805226188666837", + "14336759824805535355759793" + ], + "mAssetSupply": "81401725124936541106494439" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "874418709458387074023424", + "expectedQty": "888602530176225882946016", + "reserves": [ + "6940758337501700702063344", + "60646611554805226188666837", + "15211178534263922429783217" + ] + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "1016620176598184360935424", + "expectedQty": "995814894224700418744375", + "reserves": [ + "6940758337501700702063344", + "61663231731403410549602261", + "15211178534263922429783217" + ] + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "8109329680603578105856", + "expectedQty": "8275848952742116977047", + "swapFee": "4865597808362146863", + "reserves": [ + "6940758337501700702063344", + "61654955882450668432625214", + "15211178534263922429783217" + ], + "mAssetSupply": "83278038085254672192225837" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "495984788155648770048", + "expectedQty": "503776376729063209518", + "reserves": [ + "6940758337501700702063344", + "61654955882450668432625214", + "15211674519052078078553265" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "258141038238384764485632", + "240715147468919659298816", + "184887494337359656255488" + ], + "expectedQty": "701217770299751293354574", + "swapFee": "420983252131129453684", + "reserves": [ + "6682617299263315937577712", + "61414240734981748773326398", + "15026787024714718422297777" + ], + "mAssetSupply": "82577324091331649962080781" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "4196134220027399680", + "expectedQty": "4264358038275575708", + "reserves": [ + "6682617299263315937577712", + "61414240734981748773326398", + "15026791220848938449697457" + ] + }, + { + "type": "redeemMasset", + "inputQty": "69375506826435940161945", + "expectedQtys": [ + "5612568101968005457145", + "51580330448332135604430", + "12620637289878478651879" + ], + "redemptionFee": "20812652047930782048", + "reserves": [ + "6677004731161347932120567", + "61362660404533416637721968", + "15014170583559059971045578" + ], + "mAssetSupply": "82507973661515300228276592" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "14268924585238660644864", + "expectedQty": "14572463251728683223994", + "swapFee": "8561354751143196386", + "reserves": [ + "6677004731161347932120567", + "61348087941281687954497974", + "15014170583559059971045578" + ], + "mAssetSupply": "82493713298284812710828114" + }, + { + "type": "mintMulti", + "inputQtys": [ + "1031743471210713866829824", + "630726946711149261881344", + "889585333265035664818176" + ], + "expectedQty": "2623362692749107963261671", + "reserves": [ + "7708748202372061798950391", + "61978814887992837216379318", + "15903755916824095635863754" + ], + "mAssetSupply": "85117075991033920674089785" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "2696164391980594364416", + "outputIndex": 1, + "expectedQty": "2909521643663553738763", + "swapFee": "1714309258100554070", + "reserves": [ + "7711444366764042393314807", + "61975905366349173662640555", + "15903755916824095635863754" + ], + "mAssetSupply": "85117077705343178774643855", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "25824121173416742912", + "expectedQty": "25344369990272438334", + "reserves": [ + "7711444366764042393314807", + "61975931190470347079383467", + "15903755916824095635863754" + ] + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "82805074675418116653056", + "outputIndex": 1, + "expectedQty": "89284640259466876503556", + "swapFee": "52617147318492594236", + "reserves": [ + "7794249441439460509967863", + "61886646550210880202879911", + "15903755916824095635863754" + ], + "mAssetSupply": "85117155666860487539676425", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemBassets", + "inputQtys": [ + "56682792235362328510464", + "113411133749412111581184", + "166083740333725888544768" + ], + "expectedQty": "339685418706645101972042", + "swapFee": "203933611390821554115", + "reserves": [ + "7737566649204098181457399", + "61773235416461468091298727", + "15737672176490369747318986" + ], + "mAssetSupply": "84777470248153842437704383" + }, + { + "type": "mintMulti", + "inputQtys": [ + "106853131968906944", + "70242910520353568", + "51403052726251360" + ], + "expectedQty": "234209916044974228", + "reserves": [ + "7737566756057230150364343", + "61773235486704378611652295", + "15737672227893422473570346" + ], + "mAssetSupply": "84777470482363758482678611" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "3122832643406906831929344", + "expectedQty": "3155775671640489619475707", + "reserves": [ + "7737566756057230150364343", + "61773235486704378611652295", + "18860504871300329305499690" + ] + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "3033816414304584335360", + "expectedQty": "3210544473511610021843", + "reserves": [ + "7740600572471534734699703", + "61773235486704378611652295", + "18860504871300329305499690" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "1418386401890790679773184", + "83069800745092199219200", + "1805329212087793124114432" + ], + "expectedQty": "3387148817469482668510891", + "reserves": [ + "9158986974362325414472887", + "61856305287449470810871495", + "20665834083388122429614122" + ], + "mAssetSupply": "91323605515947242380687052" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "8263222071935741460480", + "expectedQty": "8373652718520208222566", + "swapFee": "4957933243161444876", + "reserves": [ + "9158986974362325414472887", + "61847931634730950602648929", + "20665834083388122429614122" + ], + "mAssetSupply": "91315347251808549800671448" + }, + { + "type": "redeemMasset", + "inputQty": "205394432737086365761536", + "expectedQtys": [ + "20595010906318949107223", + "139072020750333622109581", + "46469449026068587770544" + ], + "redemptionFee": "61618329821125909728", + "reserves": [ + "9138391963456006465365664", + "61708859613980616980539348", + "20619364634362053841843578" + ], + "mAssetSupply": "91110014437401284560819640" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "7177988697128340291584", + "expectedQty": "7079077644610156983298", + "reserves": [ + "9138391963456006465365664", + "61716037602677745320830932", + "20619364634362053841843578" + ] + }, + { + "type": "redeemMasset", + "inputQty": "1419145131537326489", + "expectedQtys": [ + "142287394752534274", + "960936479858919809", + "321049445789625458" + ], + "redemptionFee": "425743539461197", + "reserves": [ + "9138391821168611712831390", + "61716036641741265461911123", + "20619364313312608052218120" + ], + "mAssetSupply": "91117092096326506719937646" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "11520886459957602083143680", + "expectedQty": "11653869758075945980001791", + "swapFee": "6912531875974561249886", + "reserves": [ + "9138391821168611712831390", + "50062166883665319481909332", + "20619364313312608052218120" + ], + "mAssetSupply": "79603118168244879198043852" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "6130018787259176714240", + "33680045468279736631296", + "73223230113689746014208" + ], + "expectedQty": "113005334507108084361814", + "swapFee": "67843907048493946985", + "reserves": [ + "9132261802381352536117150", + "50028486838197039745278036", + "20546141083198918306203912" + ], + "mAssetSupply": "79490112833737771113682038" + }, + { + "type": "redeemMasset", + "inputQty": "5065329037127124726579", + "expectedQtys": [ + "581758307548372904843", + "3186996656688729275813", + "1308863950888380076696" + ], + "redemptionFee": "1519598711138137417", + "reserves": [ + "9131680044073804163212307", + "50025299841540351016002223", + "20544832219248029926127216" + ], + "mAssetSupply": "79485049024299355127092876" + }, + { + "type": "redeemMasset", + "inputQty": "2502372153257865982771", + "expectedQtys": [ + "287400044116608506753", + "1574439020203702755777", + "646604530347305447925" + ], + "redemptionFee": "750711645977359794", + "reserves": [ + "9131392644029687554705554", + "50023725402520147313246446", + "20544185614717682620679291" + ], + "mAssetSupply": "79482547402857743238469899" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "608608769931532288", + "outputIndex": 2, + "expectedQty": "624096554086854909", + "swapFee": "375438495872067", + "reserves": [ + "9131393252638457486237842", + "50023725402520147313246446", + "20544184990621128533824382" + ], + "mAssetSupply": "79482547403233181734341966", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemMasset", + "inputQty": "321322494708498982502", + "expectedQtys": [ + "36904225132633272372", + "202169238926843342116", + "83028647117051929086" + ], + "redemptionFee": "96396748412549694", + "reserves": [ + "9131356348413324852965470", + "50023523233281220469904330", + "20544101961974011481895296" + ], + "mAssetSupply": "79482226177135221647909158" + }, + { + "type": "redeemMasset", + "inputQty": "20146366328693325824", + "expectedQtys": [ + "2313831278053175568", + "12675662659435908088", + "5205752999376584138" + ], + "redemptionFee": "6043909898607997", + "reserves": [ + "9131354034582046799789902", + "50023510557618561033996242", + "20544096756221012105311158" + ], + "mAssetSupply": "79482206036812802853191331" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "1029235206789285806080", + "expectedQty": "1039319278439059372738", + "swapFee": "617541124073571483", + "reserves": [ + "9131354034582046799789902", + "50022471238340121974623504", + "20544096756221012105311158" + ], + "mAssetSupply": "79481177419147137640956734" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "219597211094143762432", + "expectedQty": "220040075293393421744", + "reserves": [ + "9131354034582046799789902", + "50022471238340121974623504", + "20544316353432106249073590" + ] + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "4927518609657759847677952", + "expectedQty": "4903447134172692152296118", + "swapFee": "2956511165794655908606", + "reserves": [ + "9131354034582046799789902", + "50022471238340121974623504", + "15640869219259414096777472" + ], + "mAssetSupply": "74556835360730465842609132" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "7820553902602500177920", + "10208667731774809309184", + "17034624610936568152064" + ], + "expectedQty": "35276464799934889653524", + "swapFee": "21178586031579881721", + "reserves": [ + "9123533480679444299611982", + "50012262570608347165314320", + "15623834594648477528625408" + ], + "mAssetSupply": "74521558895930530952955608" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "91625106038173917511680", + "outputIndex": 1, + "expectedQty": "93336148897510020618140", + "swapFee": "55368337617146173983", + "reserves": [ + "9123533480679444299611982", + "49918926421710837144696180", + "15715459700686651446137088" + ], + "mAssetSupply": "74521614264268148099129591", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemMasset", + "inputQty": "1680403925226549464268", + "expectedQtys": [ + "205666802279356639428", + "1125294930096226220866", + "354264973086898290152" + ], + "redemptionFee": "504121177567964839", + "reserves": [ + "9123327813877164942972554", + "49917801126780740918475314", + "15715105435713564547846936" + ], + "mAssetSupply": "74519934364464099117630162" + }, + { + "type": "redeemMasset", + "inputQty": "7509505188954965960294", + "expectedQtys": [ + "919098019069660611869", + "5028795749523767337899", + "1583163793968399095225" + ], + "redemptionFee": "2252851556686489788", + "reserves": [ + "9122408715858095282360685", + "49912772331031217151137415", + "15713522271919596148751711" + ], + "mAssetSupply": "74512427112126700838159656" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "134175050375102208", + "expectedQty": "135120085351235554", + "reserves": [ + "9122408715858095282360685", + "49912772331031217151137415", + "15713522406094646523853919" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "8147553822195465584640", + "14599290786726539165696", + "4378380971227833434112" + ], + "expectedQty": "27202456989039497213902", + "reserves": [ + "9130556269680290747945325", + "49927371621817943690303111", + "15717900787065874357288031" + ], + "mAssetSupply": "74539629704235825686609112" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "999785481670203801600", + "expectedQty": "1011199344774447120812", + "swapFee": "599871289002122280", + "reserves": [ + "9130556269680290747945325", + "49926360422473169243182299", + "15717900787065874357288031" + ], + "mAssetSupply": "74538630518625444484929792" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "309826921417396518912", + "expectedQty": "307475192691433078381", + "swapFee": "185896152850437911", + "reserves": [ + "9130556269680290747945325", + "49926360422473169243182299", + "15717593311873182924209650" + ], + "mAssetSupply": "74538320877600179938848791" + }, + { + "type": "redeemMasset", + "inputQty": "438029488425566470144", + "expectedQtys": [ + "53640235101980721228", + "293307618040829343994", + "92337791431815859167" + ], + "redemptionFee": "131408846527669941", + "reserves": [ + "9130502629445188767224097", + "49926067114855128413838305", + "15717500974081751108350483" + ], + "mAssetSupply": "74537882979520600900048588" + }, + { + "type": "redeemMasset", + "inputQty": "25161098278644056064", + "expectedQtys": [ + "3081178922317812447", + "16848047901812343776", + "5304027026581461162" + ], + "redemptionFee": "7548329483593216", + "reserves": [ + "9130499548266266449411650", + "49926050266807226601494529", + "15717495670054724526889321" + ], + "mAssetSupply": "74537857825970651739585740" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "3443252413527642158923776", + "expectedQty": "3406467207702665162348065", + "swapFee": "2065951448116585295354", + "reserves": [ + "9130499548266266449411650", + "49926050266807226601494529", + "12311028462352059364541256" + ], + "mAssetSupply": "71096671363891126165957318" + }, + { + "type": "redeemMasset", + "inputQty": "158747221576154349568", + "expectedQtys": [ + "20380793849584677298", + "111443249389899270241", + "27480263466549342657" + ], + "redemptionFee": "47624166472846304", + "reserves": [ + "9130479167472416864734352", + "49925938823557836702224288", + "12311000982088592815198599" + ], + "mAssetSupply": "71096512664293716484454054" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "4880988021214695915520", + "3907291420095362891776", + "1973757201964474564608" + ], + "expectedQty": "10868031464720208600153", + "swapFee": "6524733719063563298", + "reserves": [ + "9125598179451202168818832", + "49922031532137741339332512", + "12309027224886628340633991" + ], + "mAssetSupply": "71085644632828996275853901" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "16351441849137017913344", + "outputIndex": 0, + "expectedQty": "15688426512418886407843", + "swapFee": "9674736079943520604", + "reserves": [ + "9109909752938783282410989", + "49938382973986878357245856", + "12309027224886628340633991" + ], + "mAssetSupply": "71085654307565076219374505", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemMasset", + "inputQty": "189864230265585477353472", + "expectedQtys": [ + "24324557831997696331463", + "133341505857984064492125", + "32866587343612391699182" + ], + "redemptionFee": "56959269079675643206", + "reserves": [ + "9085585195106785586079526", + "49805041468128894292753731", + "12276160637543015948934809" + ], + "mAssetSupply": "70895847036568570417664239" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "396335077485906644434944", + "outputIndex": 1, + "expectedQty": "406987118930439220272477", + "swapFee": "241033936012861203901", + "reserves": [ + "9085585195106785586079526", + "49398054349198455072481254", + "12672495715028922593369753" + ], + "mAssetSupply": "70896088070504583278868140", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "894415337276870651543552", + "expectedQty": "882230413939243163563677", + "reserves": [ + "9085585195106785586079526", + "50292469686475325724024806", + "12672495715028922593369753" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "3044432790485288961966080", + "334401675388976132784128", + "1144617161628035420520448" + ], + "expectedQty": "4595310249413968305043487", + "reserves": [ + "12130017985592074548045606", + "50626871361864301856808934", + "13817112876656958013890201" + ], + "mAssetSupply": "76373628733857794747475304" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "105448092604451684352", + "98101002049857388544", + "109514423119257288704" + ], + "expectedQty": "314791851494963173615", + "swapFee": "188988503999377530", + "reserves": [ + "12129912537499470096361254", + "50626773260862251999420390", + "13817003362233838756601497" + ], + "mAssetSupply": "76373313942006299784301689" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "547173383315276311822336", + "expectedQty": "538396935868644635978471", + "swapFee": "328304029989165787093", + "reserves": [ + "11591515601630825460382783", + "50626773260862251999420390", + "13817003362233838756601497" + ], + "mAssetSupply": "75826468862721012638266446" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "6228188487015643620573184", + "expectedQty": "6008385178303957454533643", + "swapFee": "3736913092209386172343", + "reserves": [ + "5583130423326868005849140", + "50626773260862251999420390", + "13817003362233838756601497" + ], + "mAssetSupply": "69602017288797578403865605" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "35270325526170873856", + "878898164625737646080", + "2638423557430507470848" + ], + "expectedQty": "3568420753264102867819", + "swapFee": "2142337854671264479", + "reserves": [ + "5583095153001341834975284", + "50625894362697626261774310", + "13814364938676408249130649" + ], + "mAssetSupply": "69598448868044314300997786" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "914128669292699451392", + "expectedQty": "895946025882450388490", + "reserves": [ + "5583095153001341834975284", + "50626808491366918961225702", + "13814364938676408249130649" + ] + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "330490889927769", + "expectedQty": "334331016249545", + "reserves": [ + "5583095153001341834975284", + "50626808491366918961225702", + "13814364939006899139058418" + ] + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "480773289774372855218176", + "expectedQty": "471145480867732915266456", + "reserves": [ + "5583095153001341834975284", + "51107581781141291816443878", + "13814364939006899139058418" + ] + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "57278001687615112216576", + "expectedQty": "56559925507383023158759", + "swapFee": "34366801012569067329", + "reserves": [ + "5583095153001341834975284", + "51107581781141291816443878", + "13757805013499516115899659" + ], + "mAssetSupply": "70013246660385658139753030" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "7035448752789797023514624", + "hardLimitError": true + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "4614494590394086398623744", + "expectedQty": "4700579180590254128369560", + "swapFee": "2768696754236451839174", + "reserves": [ + "5583095153001341834975284", + "46407002600551037688074318", + "13757805013499516115899659" + ], + "mAssetSupply": "65401520766745808192968460" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "6325826285542569515417600", + "hardLimitError": true + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "4717992388830562210545664", + "hardLimitError": true + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "8119436055625866", + "expectedQty": "8632559430855803", + "reserves": [ + "5583095161120777890601150", + "46407002600551037688074318", + "13757805013499516115899659" + ] + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "10292503676001195172823040", + "expectedQty": "10081674218749970391331280", + "reserves": [ + "5583095161120777890601150", + "56699506276552232860897358", + "13757805013499516115899659" + ] + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "31802827379307316248576", + "expectedQty": "32348915639824665753073", + "reserves": [ + "5583095161120777890601150", + "56699506276552232860897358", + "13789607840878823432148235" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "551124535686785644101632", + "2228505315074709664038912", + "969436173720621892501504" + ], + "expectedQty": "3764150494265324716842262", + "reserves": [ + "6134219696807563534702782", + "58928011591626942524936270", + "14759044014599445324649739" + ], + "mAssetSupply": "79279694404033487397750878" + }, + { + "type": "redeemMasset", + "inputQty": "992500274558831427584", + "expectedQtys": [ + "76771086400101683093", + "737496811801735307716", + "184712628375113619439" + ], + "redemptionFee": "297750082367649428", + "reserves": [ + "6134142925721163433019689", + "58927274094815140789628554", + "14758859301971070211030300" + ], + "mAssetSupply": "79278702201509010933972722" + }, + { + "type": "redeemMasset", + "inputQty": "3627656832688192487424", + "expectedQtys": [ + "280603606136046595472", + "2695601620470621836937", + "675137373343926997603" + ], + "redemptionFee": "1088297049806457746", + "reserves": [ + "6133862322115027386424217", + "58924578493194670167791617", + "14758184164597726284032697" + ], + "mAssetSupply": "79275075632973372547943044" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "24014972996981524267008", + "expectedQty": "22104268027055979050971", + "swapFee": "14408983798188914560", + "reserves": [ + "6111758054087971407373246", + "58924578493194670167791617", + "14758184164597726284032697" + ], + "mAssetSupply": "79251075068960189212590596" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "3416496366872657687216128", + "outputIndex": 0, + "hardLimitError": true + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "1567697301437907315195904", + "expectedQty": "1532519835459364032255019", + "reserves": [ + "6111758054087971407373246", + "60492275794632577482987521", + "14758184164597726284032697" + ] + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "1954188433617875028148224", + "hardLimitError": true + }, + { + "type": "redeemBassets", + "inputQtys": [ + "3752886325249506816", + "4863313128014606336", + "25915493892270702592" + ], + "expectedQty": "35197710743192049531", + "swapFee": "21131305229052661", + "reserves": [ + "6111754301201646157866430", + "60492270931319449468381185", + "14758158249103834013330105" + ], + "mAssetSupply": "80783559706708810052796084" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "96315270548285898752", + "expectedQty": "94666442499058289319", + "swapFee": "57789162328971539", + "reserves": [ + "6111754301201646157866430", + "60492270931319449468381185", + "14758063582661334955040786" + ], + "mAssetSupply": "80783463449227424095868871" + }, + { + "type": "mintMulti", + "inputQtys": [ + "302195080004532544", + "83471640945038352", + "32195075278266524" + ], + "expectedQty": "444005991882305338", + "reserves": [ + "6111754603396726162398974", + "60492271014791090413419537", + "14758063614856410233307310" + ], + "mAssetSupply": "80783463893233415978174209" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "718114676962059194728448", + "expectedQty": "729369883227319843920868", + "reserves": [ + "6111754603396726162398974", + "60492271014791090413419537", + "15476178291818469428035758" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "1419091440579553280", + "171754960060981968896", + "51528851325686177792" + ], + "expectedQty": "221761704184155591921", + "reserves": [ + "6111756022488166741952254", + "60492442769751151395388433", + "15476229820669795114213550" + ], + "mAssetSupply": "81513055538164919977686998" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "73129541748974700986368", + "outputIndex": 1, + "expectedQty": "75825142082667440250020", + "swapFee": "44513206632943527204", + "reserves": [ + "6111756022488166741952254", + "60416617627668483955138413", + "15549359362418769815199918" + ], + "mAssetSupply": "81513100051371552921214202", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mintMulti", + "inputQtys": [ + "35281112322193358848", + "33194139209600749568", + "449044496349096192" + ], + "expectedQty": "71375811967921076829", + "reserves": [ + "6111791303600488935311102", + "60416650821807693555887981", + "15549359811463266164296110" + ], + "mAssetSupply": "81513171427183520842291031" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "9106783542641330181111808", + "outputIndex": 1, + "expectedQty": "9302528319403229984783237", + "swapFee": "5495680224889638091058", + "reserves": [ + "6111791303600488935311102", + "51114122502404463571104744", + "24656143354104596345407918" + ], + "mAssetSupply": "81518667107408410480382089", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "695379192118770304", + "expectedQty": "705009737036621764", + "swapFee": "417227515271262", + "reserves": [ + "6111791303600488935311102", + "51114121797394726534482980", + "24656143354104596345407918" + ], + "mAssetSupply": "81518666412446445876883047" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "500369262019766321152", + "expectedQty": "534666376520802797987", + "reserves": [ + "6112291672862508701632254", + "51114121797394726534482980", + "24656143354104596345407918" + ] + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "49524890202118385827840", + "expectedQty": "48818675553514973910437", + "reserves": [ + "6112291672862508701632254", + "51163646687596844920310820", + "24656143354104596345407918" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "222505409370059647746048", + "146162741700162932965376", + "109917563100261131485184" + ], + "expectedQty": "492010807341553485561501", + "swapFee": "295383714633712318728", + "reserves": [ + "5889786263492449053886206", + "51017483945896681987345444", + "24546225791004335213922734" + ], + "mAssetSupply": "81076008947034928168029970" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "3791604046976917440561152", + "expectedQty": "3732988253083884177410286", + "reserves": [ + "5889786263492449053886206", + "54809087992873599427906596", + "24546225791004335213922734" + ] + }, + { + "type": "redeemMasset", + "inputQty": "85295697751942994329", + "expectedQtys": [ + "5921809401196500785", + "55107088445472116690", + "24679685161761531067" + ], + "redemptionFee": "25588709325582898", + "reserves": [ + "5889780341683047857385421", + "54809032885785153955789906", + "24546201111319173452391667" + ], + "mAssetSupply": "84808911930009769728028825" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "3390751212213900419268608", + "expectedQty": "3381756336306760696216749", + "reserves": [ + "5889780341683047857385421", + "54809032885785153955789906", + "27936952323533073871660275" + ] + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "1093492440282347339776", + "expectedQty": "1187717729391330723426", + "reserves": [ + "5890873834123330204725197", + "54809032885785153955789906", + "27936952323533073871660275" + ] + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "4138110015294846370054144", + "outputIndex": 2, + "expectedQty": "4074485161800774252910951", + "swapFee": "2442565867725098574234", + "reserves": [ + "5890873834123330204725197", + "58947142901080000325844050", + "23862467161732299618749324" + ], + "mAssetSupply": "88194298549913646853543234", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "19805754616500636", + "expectedQty": "19790262468486876", + "swapFee": "11883452769900", + "reserves": [ + "5890873834123330204725197", + "58947142901080000325844050", + "23862467141942037150262448" + ], + "mAssetSupply": "88194298530119775689812498" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "1859024731799865786368", + "1983632193741451165696", + "2387039081774331199488" + ], + "expectedQty": "6367950855593756876753", + "swapFee": "3823064351967434586", + "reserves": [ + "5889014809391530338938829", + "58945159268886258874678354", + "23860080102860262819062960" + ], + "mAssetSupply": "88187930579264181932935745" + }, + { + "type": "mintMulti", + "inputQtys": [ + "83998721544391344128", + "85940055713960165376", + "55351945968124674048" + ], + "expectedQty": "231596265131640031708", + "reserves": [ + "5889098808113074730282957", + "58945245208941972834843730", + "23860135454806230943737008" + ], + "mAssetSupply": "88188162175529313572967453" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "1140615338891426505162752", + "outputIndex": 2, + "expectedQty": "1117953107170683142126781", + "swapFee": "671899839065217756588", + "reserves": [ + "5889098808113074730282957", + "60085860547833399340006482", + "22742182347635547801610227" + ], + "mAssetSupply": "88188834075368378790724041", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "4961642755651277824", + "expectedQty": "4950484604629765558", + "swapFee": "2976985653390766", + "reserves": [ + "5889098808113074730282957", + "60085860547833399340006482", + "22742177397150943171844669" + ], + "mAssetSupply": "88188829116702608792836983" + }, + { + "type": "redeemMasset", + "inputQty": "10164375702530143027", + "expectedQtys": [ + "678555954654347622", + "6923235590663611765", + "2620407705400140564" + ], + "redemptionFee": "3049312710759042", + "reserves": [ + "5889098129557120075935335", + "60085853624597808676394717", + "22742174776743237771704105" + ], + "mAssetSupply": "88188818955376218973452998" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "68683584454322292785152", + "15542324106185280585728", + "51103385806781687005184" + ], + "expectedQty": "141781164455709754650997", + "swapFee": "85119770535747301171", + "reserves": [ + "5820414545102797783150183", + "60070311300491623395808989", + "22691071390936456084698921" + ], + "mAssetSupply": "88047037790920509218802001" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "233299476021943482712064", + "expectedQty": "237671134674201257302051", + "swapFee": "139979685613166089627", + "reserves": [ + "5820414545102797783150183", + "59832640165817422138506938", + "22691071390936456084698921" + ], + "mAssetSupply": "87813878294584178902179564" + }, + { + "type": "redeemMasset", + "inputQty": "747213076183291289", + "expectedQtys": [ + "49511366704086291", + "508966460235369407", + "193021639238827460" + ], + "redemptionFee": "224163922854987", + "reserves": [ + "5820414495591431079063892", + "59832639656850961903137531", + "22691071197914816845871461" + ], + "mAssetSupply": "87813877547595266641743262" + }, + { + "type": "mintMulti", + "inputQtys": [ + "8060619997970771738624", + "21988263990884476911616", + "15776491007631167586304" + ], + "expectedQty": "46218220464589934733731", + "reserves": [ + "5828475115589401850802516", + "59854627920841846380049147", + "22706847688922448013457765" + ], + "mAssetSupply": "87860095768059856576476993" + }, + { + "type": "redeemMasset", + "inputQty": "51328885992432", + "expectedQtys": [ + "3404041178908", + "34957276843454", + "13261623845587" + ], + "redemptionFee": "15398665797", + "reserves": [ + "5828475115585997809623608", + "59854627920806889103205693", + "22706847688909186389612178" + ], + "mAssetSupply": "87860095768008543089150358" + }, + { + "type": "mintMulti", + "inputQtys": [ + "1301452946854387019415552", + "2269295490847903982813184", + "1227002350173725537599488" + ], + "expectedQty": "4867691479927480717873903", + "reserves": [ + "7129928062440384829039160", + "62123923411654793086018877", + "23933850039082911927211666" + ], + "mAssetSupply": "92727787247936023807024261" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "1923751873110025198108672", + "286229958527945432629248", + "3012629741112253034266624" + ], + "expectedQty": "5408161354394753517909497", + "swapFee": "3246844919588605273910", + "reserves": [ + "5206176189330359630930488", + "61837693453126847653389629", + "20921220297970658892945042" + ], + "mAssetSupply": "87319625893541270289114764" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "967404145806016380928", + "677129374003514834944", + "1608933964980896399360" + ], + "expectedQty": "3368833084240529286209", + "swapFee": "2022513358559453243", + "reserves": [ + "5205208785184553614549560", + "61837016323752844138554685", + "20919611364005677996545682" + ], + "mAssetSupply": "87316257060457029759828555" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "165422404815014382796800", + "59358488963689182396416", + "83909392446258864455680" + ], + "expectedQty": "329499300713122263091809", + "swapFee": "197818271390707782524", + "reserves": [ + "5039786380369539231752760", + "61777657834789154956158269", + "20835701971559419132090002" + ], + "mAssetSupply": "86986757759743907496736746" + }, + { + "type": "redeemMasset", + "inputQty": "34226149813345294116454", + "expectedQtys": [ + "1982379161814022272127", + "24299986609429067235199", + "8195637333175642078933" + ], + "redemptionFee": "10267844944003588234", + "reserves": [ + "5037804001207725209480633", + "61753357848179725888923070", + "20827506334226243490011069" + ], + "mAssetSupply": "86952541877775506206208526" + }, + { + "type": "mintMulti", + "inputQtys": [ + "1286570307915501056", + "46695000739550617600", + "118129912268443254784" + ], + "expectedQty": "165718562349078211662", + "reserves": [ + "5037805287778033124981689", + "61753404543180465439540670", + "20827624464138511933265853" + ], + "mAssetSupply": "86952707596337855284420188" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "93050232457995573264384", + "expectedQty": "81711918906520888114085", + "swapFee": "55830139474797343958", + "reserves": [ + "4956093368871512236867604", + "61753404543180465439540670", + "20827624464138511933265853" + ], + "mAssetSupply": "86859713194019334508499762" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "315748984018564546560", + "outputIndex": 2, + "expectedQty": "306724541571058777471", + "swapFee": "184956624652946638", + "reserves": [ + "4956093368871512236867604", + "61753720292164484004087230", + "20827317739596940874488382" + ], + "mAssetSupply": "86859713378975959161446400", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemMasset", + "inputQty": "6784204875450928647372", + "expectedQtys": [ + "386981081825503129897", + "4821846504246293489323", + "1626236099790812497122" + ], + "redemptionFee": "2035261462635278594", + "reserves": [ + "4955706387789686733737707", + "61748898445660237710597907", + "20825691503497150061991260" + ], + "mAssetSupply": "86852931209361970868077622" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "386666490129235584", + "expectedQty": "440912638200190891", + "reserves": [ + "4955706774456176862973291", + "61748898445660237710597907", + "20825691503497150061991260" + ] + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "202910071111307789074432", + "expectedQty": "201866574851729320050652", + "swapFee": "121746042666784673444", + "reserves": [ + "4955706774456176862973291", + "61748898445660237710597907", + "20623824928645420741940608" + ], + "mAssetSupply": "86650143325205968063867525" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "4452968984903245312", + "expectedQty": "4429359708268269825", + "swapFee": "2671781390941947", + "reserves": [ + "4955706774456176862973291", + "61748898445660237710597907", + "20623820499285712473670783" + ], + "mAssetSupply": "86650138874908764551564160" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "8674800239745916993536", + "expectedQty": "8468164037735886610047", + "reserves": [ + "4955706774456176862973291", + "61757573245899983627591443", + "20623820499285712473670783" + ] + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "13837061188676", + "expectedQty": "15778016314495", + "reserves": [ + "4955706774470013924161967", + "61757573245899983627591443", + "20623820499285712473670783" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "16745247863273611591680", + "11533758713920843939840", + "3719859884738837217280" + ], + "expectedQty": "34083728598170492417886", + "reserves": [ + "4972452022333287535753647", + "61769107004613904471531283", + "20627540359170451310888063" + ], + "mAssetSupply": "86692690767560448946906588" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "140753554200645886541824", + "expectedQty": "123086848861823734248348", + "swapFee": "84452132520387531925", + "reserves": [ + "4849365173471463801505299", + "61769107004613904471531283", + "20627540359170451310888063" + ], + "mAssetSupply": "86552021665492323447896689" + }, + { + "type": "redeemMasset", + "inputQty": "166516233042445729792", + "expectedQtys": [ + "9326827454674482383", + "118801076522959644781", + "39673133051886264375" + ], + "redemptionFee": "49954869912733718", + "reserves": [ + "4849355846644009127022916", + "61768988203537381511886502", + "20627500686037399424623688" + ], + "mAssetSupply": "86551855199214150914900615" + }, + { + "type": "mintMulti", + "inputQtys": [ + "607617882333753", + "1366113880835213", + "8766690684627496" + ], + "expectedQty": "10837396798528670", + "reserves": [ + "4849355847251627009356669", + "61768988204903495392721715", + "20627500694804090109251184" + ], + "mAssetSupply": "86551855210051547713429285" + }, + { + "type": "redeemMasset", + "inputQty": "933472295563116748", + "expectedQtys": [ + "52285202922033160", + "665986201943177793", + "222403365224983288" + ], + "redemptionFee": "280041688668935", + "reserves": [ + "4849355794966424087323509", + "61768987538917293449543922", + "20627500472400724884267896" + ], + "mAssetSupply": "86551854276859293838981472" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "1592247152864498359992320", + "expectedQty": "1768838882860592926335860", + "reserves": [ + "6441602947830922447315829", + "61768987538917293449543922", + "20627500472400724884267896" + ] + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "15477065572446170513408", + "expectedQty": "15764414022467696883691", + "swapFee": "9286239343467702308", + "reserves": [ + "6441602947830922447315829", + "61753223124894825752660231", + "20627500472400724884267896" + ], + "mAssetSupply": "88305225380386784062506232" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "697375972094493058924544", + "124083130890584928026624", + "182181286536612421828608" + ], + "expectedQty": "1067477652987153245445016", + "swapFee": "640871114460968528384", + "reserves": [ + "5744226975736429388391285", + "61629139994004240824633607", + "20445319185864112462439288" + ], + "mAssetSupply": "87237747727399630817061216" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "39282210918547536740352", + "expectedQty": "38461573532045323642166", + "reserves": [ + "5744226975736429388391285", + "61668422204922788361373959", + "20445319185864112462439288" + ] + }, + { + "type": "redeemMasset", + "inputQty": "66258309021405250846720", + "expectedQtys": [ + "4359591098940642262295", + "46803356772967258434233", + "15517010716009588167437" + ], + "redemptionFee": "19877492706421575254", + "reserves": [ + "5739867384637488746128990", + "61621618848149821102939726", + "20429802175148102874271851" + ], + "mAssetSupply": "87209970869402977311431916" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "298773799078463503597568", + "expectedQty": "269037844833111095487077", + "swapFee": "179264279447078102158", + "reserves": [ + "5470829539804377650641913", + "61621618848149821102939726", + "20429802175148102874271851" + ], + "mAssetSupply": "86911376334603960885936506" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "5876542733386", + "199048997106", + "13100209110690" + ], + "expectedQty": "19914717011144", + "swapFee": "11956003808", + "reserves": [ + "5470829539798501107908527", + "61621618848149622053942620", + "20429802175135002665161161" + ], + "mAssetSupply": "86911376334584046168925362" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "9878359078145862936821760", + "expectedQty": "9638708700878698786057962", + "reserves": [ + "5470829539798501107908527", + "71499977926295484990764380", + "20429802175135002665161161" + ] + }, + { + "type": "redeemMasset", + "inputQty": "663051725853238283468", + "expectedQtys": [ + "37559311666994944077", + "490874361114877949042", + "140258310299905393423" + ], + "redemptionFee": "198915517755971485", + "reserves": [ + "5470791980486834112964450", + "71499487051934370112815338", + "20429661916824702759767738" + ], + "mAssetSupply": "96549422182652409472671341" + }, + { + "type": "mintMulti", + "inputQtys": [ + "288708184792987008", + "235572874451955392", + "27061243023276804" + ], + "expectedQty": "589847762691771901", + "reserves": [ + "5470792269195018905951458", + "71499487287507244564770730", + "20429661943885945783044542" + ], + "mAssetSupply": "96549422772500172164443242" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "170617301337244897902592", + "357145550156450907553792", + "318699333972503891542016" + ], + "expectedQty": "867279202631550297671098", + "swapFee": "520679929536652169904", + "reserves": [ + "5300174967857774008048866", + "71142341737350793657216938", + "20110962609913441891502526" + ], + "mAssetSupply": "95682143569868621866772144" + }, + { + "type": "mintMulti", + "inputQtys": [ + "427265516058000752640", + "354878856402942099456", + "384500983961291653120" + ], + "expectedQty": "1230637365213397562185", + "reserves": [ + "5300602233373832008801506", + "71142696616207196599316394", + "20111347110897403183155646" + ], + "mAssetSupply": "95683374207233835264334329" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "91735175454891383455744", + "expectedQty": "90648547128058240858513", + "swapFee": "55041105272934830073", + "reserves": [ + "5300602233373832008801506", + "71142696616207196599316394", + "20020698563769344942297133" + ], + "mAssetSupply": "95591694072884216815708658" + }, + { + "type": "redeemMasset", + "inputQty": "100994326968864106086", + "expectedQtys": [ + "5598500592056450101", + "75140976740074187183", + "21145878869560781002" + ], + "redemptionFee": "30298298090659231", + "reserves": [ + "5300596634873239952351405", + "71142621475230456525129211", + "20020677417890475381516131" + ], + "mAssetSupply": "95591593108855546042261803" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "322246992693327569092608", + "expectedQty": "274990388351653391004798", + "swapFee": "193348195615996541455", + "reserves": [ + "5025606246521586561346607", + "71142621475230456525129211", + "20020677417890475381516131" + ], + "mAssetSupply": "95269539464357834469710650" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "253143541405164624674816", + "expectedQty": "245801285938342836972793", + "reserves": [ + "5025606246521586561346607", + "71395765016635621149804027", + "20020677417890475381516131" + ] + }, + { + "type": "redeemMasset", + "inputQty": "166549098459542368079052", + "expectedQtys": [ + "8760468003788689604809", + "124454699463802425549650", + "34899372400095752717605" + ], + "redemptionFee": "49964729537862710423", + "reserves": [ + "5016845778517797871741798", + "71271310317171818724254377", + "19985778045490379628798526" + ], + "mAssetSupply": "95348841616566172801314814" + }, + { + "type": "redeemMasset", + "inputQty": "173055486239796048691", + "expectedQtys": [ + "9102703431637613803", + "129316632330903058271", + "36262747238042801033" + ], + "redemptionFee": "51916645871938814", + "reserves": [ + "5016836675814366234127995", + "71271181000539487821196106", + "19985741782743141585997493" + ], + "mAssetSupply": "95348668612996578877204937" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "26678409840297728", + "outputIndex": 0, + "expectedQty": "21910570855226443", + "swapFee": "15541635388822", + "reserves": [ + "5016836653903795378901552", + "71271181027217897661493834", + "19985741782743141585997493" + ], + "mAssetSupply": "95348668613012120512593759", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "12131597837920651706368", + "expectedQty": "12487349110233839871189", + "swapFee": "7278958702752391023", + "reserves": [ + "5016836653903795378901552", + "71258693678107663821622645", + "19985741782743141585997493" + ], + "mAssetSupply": "95336544294132902613278414" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "36677370863894598254592", + "expectedQty": "37752361711591554705536", + "swapFee": "22006422518336758952", + "reserves": [ + "5016836653903795378901552", + "71220941316396072266917109", + "19985741782743141585997493" + ], + "mAssetSupply": "95299888929691526351782774" + }, + { + "type": "mintMulti", + "inputQtys": [ + "171911802758688799719424", + "97072984054214420332544", + "94275357465252970102784" + ], + "expectedQty": "391775947341287231850364", + "reserves": [ + "5188748456662484178620976", + "71318014300450286687249653", + "20080017140208394556100277" + ], + "mAssetSupply": "95691664877032813583633138" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "138372259743321952", + "expectedQty": "136711968794653059", + "swapFee": "83023355845993", + "reserves": [ + "5188748456662484178620976", + "71318014300450286687249653", + "20080017003496425761447218" + ], + "mAssetSupply": "95691664738743577196157179" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "6073501345801652142080", + "expectedQty": "6245870679739371249374", + "swapFee": "3644100807480991285", + "reserves": [ + "5188748456662484178620976", + "71311768429770547316000279", + "20080017003496425761447218" + ], + "mAssetSupply": "95685594881498583025006384" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "38670959465704095744", + "expectedQty": "45251637310362584131", + "reserves": [ + "5188787127621949882716720", + "71311768429770547316000279", + "20080017003496425761447218" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "147193564741599762579456", + "296486993060421619941376", + "6528995556861185884160" + ], + "expectedQty": "467494140157398082927119", + "swapFee": "280664883024253401797", + "reserves": [ + "5041593562880350120137264", + "71015281436710125696058903", + "20073488007939564575563058" + ], + "mAssetSupply": "95218145992978495304663396" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "1381445595028673347452928", + "expectedQty": "1420897288608340591228054", + "swapFee": "828867357017204008471", + "reserves": [ + "5041593562880350120137264", + "69594384148101785104830849", + "20073488007939564575563058" + ], + "mAssetSupply": "93837529265306839161218939" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "1161962375169164531728384", + "expectedQty": "1172664425562601642474766", + "reserves": [ + "5041593562880350120137264", + "69594384148101785104830849", + "21235450383108729107291442" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "154726000737255200", + "5695666492273224704", + "7862530488666048512" + ], + "expectedQty": "13647558983680936365", + "swapFee": "8193451461085212", + "reserves": [ + "5041593408154349382882064", + "69594378452435292831606145", + "21235442520578240441242930" + ], + "mAssetSupply": "95010180043310457122757340" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "94752969384747232919552", + "expectedQty": "93932890428910741090309", + "swapFee": "56851781630848339751", + "reserves": [ + "5041593408154349382882064", + "69594378452435292831606145", + "21141509630149329700152621" + ], + "mAssetSupply": "94915483925707340738177539" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "726241312257578368", + "expectedQty": "850411739742884261", + "reserves": [ + "5041594134395661640460432", + "69594378452435292831606145", + "21141509630149329700152621" + ] + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "1858415542322413051052032", + "expectedQty": "2092444827556704164390652", + "reserves": [ + "6900009676718074691512464", + "69594378452435292831606145", + "21141509630149329700152621" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "143301578619230682611712", + "441388716860691374407680", + "222025344355486452940800" + ], + "expectedQty": "812520566601406995074281", + "reserves": [ + "7043311255337305374124176", + "70035767169295984206013825", + "21363534974504816153093421" + ], + "mAssetSupply": "97820450170277191640526733" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "50176560060139772575744", + "expectedQty": "45977294114135012533987", + "swapFee": "30105936036083863545", + "reserves": [ + "6997333961223170361590189", + "70035767169295984206013825", + "21363534974504816153093421" + ], + "mAssetSupply": "97770303716153087951814534" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "32732321829114217496576", + "expectedQty": "29966218346138897325947", + "swapFee": "19639393097468530497", + "reserves": [ + "6967367742877031464264242", + "70035767169295984206013825", + "21363534974504816153093421" + ], + "mAssetSupply": "97737591033717071202848455" + }, + { + "type": "mintMulti", + "inputQtys": [ + "2141494295033243500544", + "2077590829896194064384", + "6153413012035745087488" + ], + "expectedQty": "10574949569652580538480", + "reserves": [ + "6969509237172064707764786", + "70037844760125880400078209", + "21369688387516851898180909" + ], + "mAssetSupply": "97748165983286723783386935" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "5294452663528455143424", + "outputIndex": 2, + "expectedQty": "5142579612215159914262", + "swapFee": "3111504612868662459", + "reserves": [ + "6969509237172064707764786", + "70043139212789408855221633", + "21364545807904636738266647" + ], + "mAssetSupply": "97748169094791336652049394", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mintMulti", + "inputQtys": [ + "12681242852948143243264", + "13352347351577031344128", + "2689792435356356313088" + ], + "expectedQty": "29635480497932107295792", + "reserves": [ + "6982190480025012851008050", + "70056491560140985886565761", + "21367235600339993094579735" + ], + "mAssetSupply": "97777804575289268759345186" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "1304115880288442029965312", + "expectedQty": "1277048793318183258721952", + "reserves": [ + "6982190480025012851008050", + "71360607440429427916531073", + "21367235600339993094579735" + ] + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "505027035512529408", + "expectedQty": "500492168944549556", + "swapFee": "303016221307517", + "reserves": [ + "6982190480025012851008050", + "71360607440429427916531073", + "21367235099847824150030179" + ], + "mAssetSupply": "99054852863883432726845247" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "3157071662536117394079744", + "expectedQty": "3220770381660485754946805", + "swapFee": "1894242997521670436447", + "reserves": [ + "6982190480025012851008050", + "68139837058768942161584268", + "21367235099847824150030179" + ], + "mAssetSupply": "95899675444344837003201950" + }, + { + "type": "mintMulti", + "inputQtys": [ + "25019759168988175663104", + "57398785810428036382720", + "23949694581497535660032" + ], + "expectedQty": "107569594548545688409467", + "reserves": [ + "7007210239194001026671154", + "68197235844579370197966988", + "21391184794429321685690211" + ], + "mAssetSupply": "96007245038893382691611417" + }, + { + "type": "mintMulti", + "inputQtys": [ + "221055026685735203766272", + "124990607672448854786048", + "43021156974202877640704" + ], + "expectedQty": "405481552365595548562624", + "reserves": [ + "7228265265879736230437426", + "68322226452251819052753036", + "21434205951403524563330915" + ], + "mAssetSupply": "96412726591258978240174041" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "1206701923023614", + "1324208617350379", + "885176606026605" + ], + "expectedQty": "3495172671932352", + "swapFee": "2098362620731", + "reserves": [ + "7228265264673034307413812", + "68322226450927610435402657", + "21434205950518347957304310" + ], + "mAssetSupply": "96412726587763805568241689" + }, + { + "type": "redeemMasset", + "inputQty": "97898743301975266295808", + "expectedQtys": [ + "7337473166420054323432", + "69354469557701316065142", + "21758043631034834000573" + ], + "redemptionFee": "29369622990592579888", + "reserves": [ + "7220927791506614253090380", + "68252871981369909119337515", + "21412447906887313123303737" + ], + "mAssetSupply": "96314857214084820894525769" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "1247245084991858520621056", + "246692390860085782380544", + "2356151883385945540526080" + ], + "expectedQty": "3987883675632485938623456", + "swapFee": "2394166705402733203095", + "reserves": [ + "5973682706514755732469324", + "68006179590509823336956971", + "19056296023501367582777657" + ], + "mAssetSupply": "92326973538452334955902313" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "8391983784888756224", + "expectedQty": "8592519333932369924", + "swapFee": "5035190270933253", + "reserves": [ + "5973682706514755732469324", + "68006170997990489404587047", + "19056296023501367582777657" + ], + "mAssetSupply": "92326965151503740338079342" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "302730297803192670355456", + "1139876044399857593483264", + "511328317994789196791808" + ], + "expectedQty": "1968992996358060876957457", + "swapFee": "1182105060851347334575", + "reserves": [ + "5670952408711563062113868", + "66866294953590631811103783", + "18544967705506578385985849" + ], + "mAssetSupply": "90357972155145679461121885" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "1617793534497285632", + "expectedQty": "1636753911181662099", + "reserves": [ + "5670952408711563062113868", + "66866294953590631811103783", + "18544969323300112883271481" + ] + }, + { + "type": "redeemMasset", + "inputQty": "37051816458892168396", + "expectedQtys": [ + "2324709632733995313", + "27410690265193325401", + "7602191963100455638" + ], + "redemptionFee": "11115544937667650", + "reserves": [ + "5670950084001930328118555", + "66866267542900366617778382", + "18544961721108149782815843" + ], + "mAssetSupply": "90357936751198676688283238" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "1521830042135000252416", + "outputIndex": 1, + "expectedQty": "1756783534888933714295", + "swapFee": "1028545143763045161", + "reserves": [ + "5672471914044065328370971", + "66864510759365477684064087", + "18544961721108149782815843" + ], + "mAssetSupply": "90357937779743820451328399", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "11528031934760259420160", + "expectedQty": "12982227165312322259904", + "reserves": [ + "5683999945978825587791131", + "66864510759365477684064087", + "18544961721108149782815843" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "775680756620578390016", + "1274001312350469357568", + "1112159335356956147712" + ], + "expectedQty": "3240969947847096928962", + "reserves": [ + "5684775626735446166181147", + "66865784760677828153421655", + "18546073880443506738963555" + ], + "mAssetSupply": "90374160976856979870517265" + }, + { + "type": "mintMulti", + "inputQtys": [ + "19438885569641", + "19543918289232", + "10042931143023" + ], + "expectedQty": "51106231120890", + "reserves": [ + "5684775626754885051750788", + "66865784760697372071710887", + "18546073880453549670106578" + ], + "mAssetSupply": "90374160976908086101638155" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "42608603171647163203584", + "103067525392424322990080", + "98231041240091301249024" + ], + "expectedQty": "247901033276979534042347", + "swapFee": "148829917916937883155", + "reserves": [ + "5642167023583237888547204", + "66762717235304947748720807", + "18447842839213458368857554" + ], + "mAssetSupply": "90126259943631106567595808" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "90130155440693034614784", + "outputIndex": 0, + "expectedQty": "77760017038372866655201", + "swapFee": "52728506902224603684", + "reserves": [ + "5564407006544865021892003", + "66852847390745640783335591", + "18447842839213458368857554" + ], + "mAssetSupply": "90126312672138008792199492", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mintMulti", + "inputQtys": [ + "2684099267953389056", + "5872796207540169728", + "12661917057832683520" + ], + "expectedQty": "21574546537033801772", + "reserves": [ + "5564409690644132975281059", + "66852853263541848323505319", + "18447855501130516201541074" + ], + "mAssetSupply": "90126334246684545826001264" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "1096322351861760945815552", + "expectedQty": "1108114391833390439107380", + "reserves": [ + "5564409690644132975281059", + "66852853263541848323505319", + "19544177852992277147356626" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "61318624667510627106816", + "20309904372012238766080", + "347705025622326968320" + ], + "expectedQty": "89416629824405255903068", + "reserves": [ + "5625728315311643602387875", + "66873163167913860562271399", + "19544525558017899474324946" + ], + "mAssetSupply": "91323865268342341521011712" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "280457249994334831378432", + "outputIndex": 2, + "expectedQty": "311463065180081544298206", + "swapFee": "188820835229547643183", + "reserves": [ + "5906185565305978433766307", + "66873163167913860562271399", + "19233062492837817930026740" + ], + "mAssetSupply": "91324054089177571068654895", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "110156300310887645184", + "expectedQty": "122992775164847211385", + "reserves": [ + "5906295721606289321411491", + "66873163167913860562271399", + "19233062492837817930026740" + ] + }, + { + "type": "redeemMasset", + "inputQty": "32487817324184888934", + "expectedQtys": [ + "2100485301905097165", + "23782435378617123737", + "6839949603106074528" + ], + "redemptionFee": "9746345197255466", + "reserves": [ + "5906293621120987416314326", + "66873139385478481945147662", + "19233055652888214823952212" + ], + "mAssetSupply": "91324144603881756928232812" + }, + { + "type": "mintMulti", + "inputQtys": [ + "178006791507673939968", + "166269068114275401728", + "219720170339352838144" + ], + "expectedQty": "583052990698951819521", + "reserves": [ + "5906471627912495090254294", + "66873305654546596220549390", + "19233275373058554176790356" + ], + "mAssetSupply": "91324727656872455880052333" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "264224778070809049563136", + "outputIndex": 1, + "expectedQty": "273015139054428530123557", + "swapFee": "160094519868306318641", + "reserves": [ + "5906471627912495090254294", + "66600290515492167690425833", + "19497500151129363226353492" + ], + "mAssetSupply": "91324887751392324186370974", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemBassets", + "inputQtys": [ + "2580990386717801316352", + "2582851662469971574784", + "1090178272383833079808" + ], + "expectedQty": "6502530005519112556768", + "swapFee": "3903860319503169435", + "reserves": [ + "5903890637525777288937942", + "66597707663829697718851049", + "19496409972856979393273684" + ], + "mAssetSupply": "91318385221386805073814206" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "5690571512604309585920", + "1111460648958529241088", + "6471656200529194778624" + ], + "expectedQty": "13967109803707099102309", + "swapFee": "8385297060460535782", + "reserves": [ + "5898200066013172979352022", + "66596596203180739189609961", + "19489938316656450198495060" + ], + "mAssetSupply": "91304418111583097974711897" + }, + { + "type": "redeemMasset", + "inputQty": "1849260377169462886", + "expectedQtys": [ + "119425058632617800", + "1348428726947810017", + "394626665789943119" + ], + "redemptionFee": "554778113150838", + "reserves": [ + "5898199946588114346734222", + "66596594854752012241799944", + "19489937922029784408551941" + ], + "mAssetSupply": "91304416262877498918399849" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "1420740958876380168192", + "781584460708729978880", + "1511565468617004285952" + ], + "expectedQty": "3874522629718471664842", + "swapFee": "2326109243377109264", + "reserves": [ + "5896779205629237966566030", + "66595813270291303511821064", + "19488426356561167404265989" + ], + "mAssetSupply": "91300541740247780446735007" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "2701058005892805007769600", + "outputIndex": 1, + "expectedQty": "2962881313620255145312280", + "swapFee": "1750042398776758537376", + "reserves": [ + "8597837211522042974335630", + "63632931956671048366508784", + "19488426356561167404265989" + ], + "mAssetSupply": "91302291782646557205272383", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mintMulti", + "inputQtys": [ + "537686126265559148396544", + "188871286259741058138112", + "814325728076160789643264" + ], + "expectedQty": "1569207272487431694644209", + "reserves": [ + "9135523337787602122732174", + "63821803242930789424646896", + "20302752084637328193909253" + ], + "mAssetSupply": "92871499055133988899916592" + }, + { + "type": "mintMulti", + "inputQtys": [ + "9568349390517219360768", + "3401381365908147011584", + "53091342351906335883264" + ], + "expectedQty": "66787012060230209013303", + "reserves": [ + "9145091687178119342092942", + "63825204624296697571658480", + "20355843426989234529792517" + ], + "mAssetSupply": "92938286067194219108929895" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "2857968577584180024573952", + "expectedQty": "2815086484815904275264913", + "reserves": [ + "9145091687178119342092942", + "66683173201880877596232432", + "20355843426989234529792517" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "237272922979316678000640", + "551347737631083596873728", + "401420591506742539452416" + ], + "expectedQty": "1196309451357571489431140", + "swapFee": "718216600775007898397", + "reserves": [ + "8907818764198802664092302", + "66131825464249793999358704", + "19954422835482491990340101" + ], + "mAssetSupply": "94557063100652551894763668" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "389452694480026016415744", + "expectedQty": "408242808612023082287420", + "reserves": [ + "9297271458678828680508046", + "66131825464249793999358704", + "19954422835482491990340101" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "13150046847043018686464", + "55511061965708992512", + "15911791117603241459712" + ], + "expectedQty": "29850723287821682840982", + "reserves": [ + "9310421505525871699194510", + "66131880975311759708351216", + "19970334626600095231799813" + ], + "mAssetSupply": "94995156632552396659892070" + }, + { + "type": "mintMulti", + "inputQtys": [ + "1948029754645797888", + "3977593360682724352", + "3818789779877111808" + ], + "expectedQty": "9804196020965008696", + "reserves": [ + "9310423453555626344992398", + "66131884952905120391075568", + "19970338445389875108911621" + ], + "mAssetSupply": "94995166436748417624900766" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "3150497016199546880", + "7411338505108680704", + "4261577419908139520" + ], + "expectedQty": "14889897645504560538", + "swapFee": "8939302168603898", + "reserves": [ + "9310420303058610145445518", + "66131877541566615282394864", + "19970334183812455200772101" + ], + "mAssetSupply": "94995151546850772120340228" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "23913576429755506688", + "33335468498068697088", + "62662688002564104192" + ], + "expectedQty": "121007595865219253079", + "swapFee": "72648146406975737", + "reserves": [ + "9310396389482180389938830", + "66131844206098117213697776", + "19970271521124452636667909" + ], + "mAssetSupply": "94995030539254906901087149" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "11661368497096236204032", + "expectedQty": "12197998006342305847332", + "reserves": [ + "9322057757979276626142862", + "66131844206098117213697776", + "19970271521124452636667909" + ] + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "2183087301681943788126208", + "expectedQty": "2214639683394078969552233", + "swapFee": "1309852381009166272875", + "reserves": [ + "9322057757979276626142862", + "63917204522704038244145543", + "19970271521124452636667909" + ], + "mAssetSupply": "92825451087960314585081148" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "170638915465973367570432", + "21614373463551530500096", + "27261469514249109766144" + ], + "expectedQty": "226850243799135819228120", + "swapFee": "136191861396319283106", + "reserves": [ + "9151418842513303258572430", + "63895590149240486713645447", + "19943010051610203526901765" + ], + "mAssetSupply": "92598600844161178765853028" + }, + { + "type": "mintMulti", + "inputQtys": [ + "461715336677712396288", + "484593820745276325888", + "634991949871289991168" + ], + "expectedQty": "1599230920705345266403", + "reserves": [ + "9151880557849980970968718", + "63896074743061231989971335", + "19943645043560074816892933" + ], + "mAssetSupply": "92600200075081884111119431" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "11705489839970282635264", + "1386523678585131892736", + "8582437401875574685696" + ], + "expectedQty": "22236701525090481709441", + "swapFee": "13350030933614457700", + "reserves": [ + "9140175068010010688333454", + "63894688219382646858078599", + "19935062606158199242207237" + ], + "mAssetSupply": "92577963373556793629409990" + }, + { + "type": "redeemMasset", + "inputQty": "262453871027063881728", + "expectedQtys": [ + "25904163137496001940", + "181083886789784106208", + "56497945615230815447" + ], + "redemptionFee": "78736161308119164", + "reserves": [ + "9140149163846873192331514", + "63894507135495857073972391", + "19935006108212584011391790" + ], + "mAssetSupply": "92577700998421927873647426" + }, + { + "type": "redeemMasset", + "inputQty": "351850101099886595276", + "expectedQtys": [ + "34727559487572051343", + "242764123177957687395", + "75742102026778571271" + ], + "redemptionFee": "105555030329965978", + "reserves": [ + "9140114436287385620280171", + "63894264371372679116284996", + "19934930366110557232820519" + ], + "mAssetSupply": "92577349253875858317018128" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "57732633063843608657920", + "expectedQty": "55218858053930733923895", + "swapFee": "34639579838306165194", + "reserves": [ + "9084895578233454886356276", + "63894264371372679116284996", + "19934930366110557232820519" + ], + "mAssetSupply": "92519651260391853014525402" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "377087880407617848213504", + "60657815667089017405440", + "510164232844435622199296" + ], + "expectedQty": "968544385277066787796233", + "swapFee": "581475516476125748126", + "reserves": [ + "8707807697825837038142772", + "63833606555705590098879556", + "19424766133266121610621223" + ], + "mAssetSupply": "91551106875114786226729169" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "2391337017731137312653312", + "expectedQty": "2353108175467649154679752", + "reserves": [ + "8707807697825837038142772", + "66224943573436727411532868", + "19424766133266121610621223" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "16155462364028563619840", + "1220616201029148475392", + "967448401141135572992" + ], + "expectedQty": "19188399988581215935887", + "swapFee": "11519951964327325957", + "reserves": [ + "8691652235461808474522932", + "66223722957235698263057476", + "19423798684864980475048231" + ], + "mAssetSupply": "93885026650593854165473034" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "36854448193671512064", + "outputIndex": 1, + "expectedQty": "39436251709582600985", + "swapFee": "23286921265918476", + "reserves": [ + "8691689089910002146034996", + "66223683520983988680456491", + "19423798684864980475048231" + ], + "mAssetSupply": "93885026673880775431391510", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemMasset", + "inputQty": "92832275915686065628774", + "expectedQtys": [ + "8591649249734521106108", + "65461460361970891242261", + "19200234116927273468067" + ], + "redemptionFee": "27849682774705819688", + "reserves": [ + "8683097440660267624928888", + "66158222060622017789214230", + "19404598450748053201580164" + ], + "mAssetSupply": "93792222247647864071582424" + }, + { + "type": "redeemMasset", + "inputQty": "32965695776147478937", + "expectedQtys": [ + "3050982996898129901", + "23246037717690281831", + "6818200571795756194" + ], + "redemptionFee": "9889708732844243", + "reserves": [ + "8683094389677270726798987", + "66158198814584300098932399", + "19404591632547481405823970" + ], + "mAssetSupply": "93792189291841796656947730" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "11805584228293002919936", + "18547718710592945520640", + "12123215810961183080448" + ], + "expectedQty": "42906883919424245457884", + "swapFee": "25759586103316537197", + "reserves": [ + "8671288805448977723879051", + "66139651095873707153411759", + "19392468416736520222743522" + ], + "mAssetSupply": "93749282407922372411489846" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "13392758460414116757504", + "11366567392183576428544", + "11287281838785545895936" + ], + "expectedQty": "36673654640540557415237", + "swapFee": "22017403226260090503", + "reserves": [ + "8657896046988563607121547", + "66128284528481523576983215", + "19381181134897734676847586" + ], + "mAssetSupply": "93712608753281831854074609" + }, + { + "type": "redeemMasset", + "inputQty": "152042597967095472219750", + "expectedQtys": [ + "14042657810064728437191", + "107256643664953701438975", + "31435269395145505963127" + ], + "redemptionFee": "45612779390128641665", + "reserves": [ + "8643853389178498878684356", + "66021027884816569875544240", + "19349745865502589170884459" + ], + "mAssetSupply": "93560611768094126510496524" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "277221787465337179996160", + "expectedQty": "291553678518300721819003", + "reserves": [ + "8921075176643836058680516", + "66021027884816569875544240", + "19349745865502589170884459" + ] + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "2510012879471929458688", + "expectedQty": "2532303930388208248328", + "reserves": [ + "8921075176643836058680516", + "66021027884816569875544240", + "19352255878382061100343147" + ] + }, + { + "type": "redeemMasset", + "inputQty": "2691396636729352074035", + "expectedQtys": [ + "255745841776707222415", + "1892664619122508810733", + "554782789282243537696" + ], + "redemptionFee": "807418991018805622", + "reserves": [ + "8920819430802059351458101", + "66019135220197447366733507", + "19351701095592778856805451" + ], + "mAssetSupply": "93852007161325077107295442" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "1018847731137944972427264", + "expectedQty": "1034635975730001545955237", + "swapFee": "611308638682766983456", + "reserves": [ + "8920819430802059351458101", + "64984499244467445820778270", + "19351701095592778856805451" + ], + "mAssetSupply": "92833770738825814901851634" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "37321746670437051400192", + "expectedQty": "37892984616704416504571", + "swapFee": "22393048002262230840", + "reserves": [ + "8920819430802059351458101", + "64946606259850741404273699", + "19351701095592778856805451" + ], + "mAssetSupply": "92796471385203380112682282" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "5231678002690234368", + "27521430298982461440", + "23231653934194655232" + ], + "expectedQty": "56002018457076091791", + "swapFee": "33621383904588408", + "reserves": [ + "8920814199124056661223733", + "64946578738420442421812259", + "19351677863938844662150219" + ], + "mAssetSupply": "92796415383184923036590491" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "80997563737723764736", + "outputIndex": 2, + "expectedQty": "79018660460640098858", + "swapFee": "47837509105762806", + "reserves": [ + "8920814199124056661223733", + "64946659735984180145576995", + "19351598845278384022051361" + ], + "mAssetSupply": "92796415431022432142353297", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemMasset", + "inputQty": "593309808111979593728", + "expectedQtys": [ + "57019645577256030675", + "415123041116144639020", + "123690650077585577421" + ], + "redemptionFee": "177992942433593878", + "reserves": [ + "8920757179478479405193058", + "64946244612943064000937975", + "19351475154628306436473940" + ], + "mAssetSupply": "92795822299207262596353447" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "2795262207752985378816", + "outputIndex": 2, + "expectedQty": "2904487333451761612198", + "swapFee": "1758366090609000606", + "reserves": [ + "8923552441686232390571874", + "64946244612943064000937975", + "19348570667294854674861742" + ], + "mAssetSupply": "92795824057573353205354053", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemBassets", + "inputQtys": [ + "2088107495250682707968", + "714203299413561049088", + "2489251274075093860352" + ], + "expectedQty": "5402367894559803855462", + "swapFee": "3243366756789956287", + "reserves": [ + "8921464334190981707863906", + "64945530409643650439888887", + "19346081416020779581001390" + ], + "mAssetSupply": "92790421689678793401498591" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "908939509634549441101824", + "expectedQty": "862148136078398246117926", + "swapFee": "545363705780729664661", + "reserves": [ + "8059316198112583461745980", + "64945530409643650439888887", + "19346081416020779581001390" + ], + "mAssetSupply": "91882027543750024690061428" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "20655788263915672", + "expectedQty": "20302471031885941", + "reserves": [ + "8059316198112583461745980", + "64945530430299438703804559", + "19346081416020779581001390" + ] + }, + { + "type": "redeemMasset", + "inputQty": "139999639983508868300", + "expectedQtys": [ + "12276207934710916735", + "98927107014261076616", + "29468569336011058503" + ], + "redemptionFee": "41999891995052660", + "reserves": [ + "8059303921904648750829245", + "64945431503192424442727943", + "19346051947451443569942887" + ], + "mAssetSupply": "91881887606412404208131729" + }, + { + "type": "redeemMasset", + "inputQty": "21205565254813858188492", + "expectedQtys": [ + "1859461413413924720739", + "14984361556272402448793", + "4463566264130382397840" + ], + "redemptionFee": "6361669576444157456", + "reserves": [ + "8057444460491234826108506", + "64930447141636152040279150", + "19341588381187313187545047" + ], + "mAssetSupply": "91860688402827166794100693" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "39634331042444088442880", + "9531643283502870298624", + "13826196281040559931392" + ], + "expectedQty": "65311036975495378787902", + "swapFee": "39210148274261784343", + "reserves": [ + "8017810129448790737665626", + "64920915498352649169980526", + "19327762184906272627613655" + ], + "mAssetSupply": "91795377365851671415312791" + }, + { + "type": "mintMulti", + "inputQtys": [ + "416618466165801227386880", + "789893008996977048813568", + "142309982852228233297920" + ], + "expectedQty": "1360708429111228532907149", + "reserves": [ + "8434428595614591965052506", + "65710808507349626218794094", + "19470072167758500860911575" + ], + "mAssetSupply": "93156085794962899948219940" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "6845887095418475", + "3774488065622879", + "9049604621821854" + ], + "expectedQty": "20064849686831765", + "swapFee": "12046137494595", + "reserves": [ + "8434428588768704869634031", + "65710808503575138153171215", + "19470072158708896239089721" + ], + "mAssetSupply": "93156085774898050261388175" + }, + { + "type": "redeemMasset", + "inputQty": "18106953344231649627340", + "expectedQtys": [ + "1638926615804054754479", + "12768522712483421998764", + "3783305429252781630879" + ], + "redemptionFee": "5432086003269494888", + "reserves": [ + "8432789662152900814879552", + "65698039980862654731172451", + "19466288853279643457458842" + ], + "mAssetSupply": "93137984253639821881255723" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "1472827999804959638945792", + "expectedQty": "1542350156959076254660766", + "reserves": [ + "9905617661957860453825344", + "65698039980862654731172451", + "19466288853279643457458842" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "2856664616568712960409600", + "2160876845983718984122368", + "6033676945528068419616768" + ], + "expectedQty": "11150410077973317162305710", + "reserves": [ + "12762282278526573414234944", + "67858916826846373715294819", + "25499965798807711877075610" + ], + "mAssetSupply": "105830744488572215298222199" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "1278281862074553587466240", + "expectedQty": "1241678234458617172367732", + "swapFee": "766969117244732152479", + "reserves": [ + "11520604044067956241867212", + "67858916826846373715294819", + "25499965798807711877075610" + ], + "mAssetSupply": "104553229595614906442908438" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "62285061827657329541120", + "outputIndex": 2, + "expectedQty": "64018066390139548300794", + "swapFee": "38562079305155863646", + "reserves": [ + "11582889105895613571408332", + "67858916826846373715294819", + "25435947732417572328774816" + ], + "mAssetSupply": "104553268157694211598772084", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemBassets", + "inputQtys": [ + "1355367677716222967808", + "2399701995458793570304", + "373833916661183021056" + ], + "expectedQty": "4145631034457865442951", + "swapFee": "2488871943841023880", + "reserves": [ + "11581533738217897348440524", + "67856517124850914921724515", + "25435573898500911145753760" + ], + "mAssetSupply": "104549122526659753733329133" + }, + { + "type": "mintMulti", + "inputQtys": [ + "530488921778151101562880", + "4612703608586782231232512", + "3286914060244121188040704" + ], + "expectedQty": "8404110893212525243990164", + "reserves": [ + "12112022659996048450003404", + "72469220733437697152957027", + "28722487958745032333794464" + ], + "mAssetSupply": "112953233419872278977319297" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "494153368760018406473728", + "expectedQty": "477252149708112862400412", + "swapFee": "296492021256011043884", + "reserves": [ + "11634770510287935587602992", + "72469220733437697152957027", + "28722487958745032333794464" + ], + "mAssetSupply": "112459376543133516581889453" + }, + { + "type": "redeemMasset", + "inputQty": "1079894558185834439245824", + "expectedQtys": [ + "111689718085672074758950", + "695679113434072133466721", + "275725815132725996185505" + ], + "redemptionFee": "323968367455750331773", + "reserves": [ + "11523080792202263512844042", + "71773541620003625019490306", + "28446762143612306337608959" + ], + "mAssetSupply": "111379805953315137892975402" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "41127120108786869600256", + "expectedQty": "42612046593743131985145", + "reserves": [ + "11564207912311050382444298", + "71773541620003625019490306", + "28446762143612306337608959" + ] + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "14828980430025848258560", + "expectedQty": "15361778094554092412903", + "reserves": [ + "11579036892741076230702858", + "71773541620003625019490306", + "28446762143612306337608959" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "2385798447960188518400", + "2853856992866045263872", + "1993152523178137616384" + ], + "expectedQty": "7289433867319083539354", + "reserves": [ + "11581422691189036419221258", + "71776395476996491064754178", + "28448755296135484475225343" + ], + "mAssetSupply": "111445069211870754200912804" + }, + { + "type": "redeemMasset", + "inputQty": "138200221688447104", + "expectedQtys": [ + "14357521854941652", + "88981396690919862", + "35268000901210296" + ], + "redemptionFee": "41460066506534", + "reserves": [ + "11581422676831514564279606", + "71776395388015094373834316", + "28448755260867483574015047" + ], + "mAssetSupply": "111445069073711992578972234" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "53129789058169169772544", + "expectedQty": "53247572098583137145436", + "reserves": [ + "11581422676831514564279606", + "71776395388015094373834316", + "28501885049925652743787591" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "2561542458497859464462336", + "1510426759661346971713536", + "700313558532677825462272" + ], + "expectedQty": "4834289152274787853929694", + "reserves": [ + "14142965135329374028741942", + "73286822147676441345547852", + "29202198608458330569249863" + ], + "mAssetSupply": "116332605798085363570047364" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "243573374330690726789120", + "40594012303559499972608", + "125003098268562605735936" + ], + "expectedQty": "415268902687912449007226", + "swapFee": "249310928169649258959", + "reserves": [ + "13899391760998683301952822", + "73246228135372881845575244", + "29077195510189767963513927" + ], + "mAssetSupply": "115917336895397451121040138" + }, + { + "type": "redeemMasset", + "inputQty": "132994431708991099345305", + "expectedQtys": [ + "15942284349663330381762", + "84011747891802991112329", + "33350878001361710669388" + ], + "redemptionFee": "39898329512697329803", + "reserves": [ + "13883449476649019971571060", + "73162216387481078854462915", + "29043844632188406252844539" + ], + "mAssetSupply": "115784382362017972719024636" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "2063250022306791555072", + "expectedQty": "2083086302410884477920", + "swapFee": "1237950013384074933", + "reserves": [ + "13883449476649019971571060", + "73160133301178667969984995", + "29043844632188406252844539" + ], + "mAssetSupply": "115782320349945679311544497" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "490435726749033234956288", + "outputIndex": 0, + "expectedQty": "472383719432295080723156", + "swapFee": "291270467625670953444", + "reserves": [ + "13411065757216724890847904", + "73650569027927701204941283", + "29043844632188406252844539" + ], + "mAssetSupply": "115782611620413304982497941", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mintMulti", + "inputQtys": [ + "3851524647144642314240", + "101164256479962030145536", + "55335194209777231069184" + ], + "expectedQty": "159539585064348803261988", + "reserves": [ + "13414917281863869533162144", + "73751733284407663235086819", + "29099179826398183483913723" + ], + "mAssetSupply": "115942151205477653785759929" + }, + { + "type": "mintMulti", + "inputQtys": [ + "6175686764858677657600", + "4441855294035773095936", + "717108877605293260800" + ], + "expectedQty": "11463130085005104786964", + "reserves": [ + "13421092968628728210819744", + "73756175139701699008182755", + "29099896935275788777174523" + ], + "mAssetSupply": "115953614335562658890546893" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "64915731021616902045696", + "12635053732528857808896", + "84206758083646908792832" + ], + "expectedQty": "163677862304628822073513", + "swapFee": "98265676788850603606", + "reserves": [ + "13356177237607111308774048", + "73743540085969170150373859", + "29015690177192141868381691" + ], + "mAssetSupply": "115789936473258030068473380" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "1466684320341029940101120", + "expectedQty": "1481277315563756889062599", + "swapFee": "880010592204617964060", + "reserves": [ + "13356177237607111308774048", + "72262262770405413261311260", + "29015690177192141868381691" + ], + "mAssetSupply": "114324132163509204746336320" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "3299204547987545088", + "expectedQty": "3331531695372988271", + "swapFee": "1979522728792527", + "reserves": [ + "13356177237607111308774048", + "72262259438873717888322989", + "29015690177192141868381691" + ], + "mAssetSupply": "114324128866284179487583759" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "56849893032597352", + "expectedQty": "56679595088466852", + "swapFee": "34109935819558", + "reserves": [ + "13356177237607111308774048", + "72262259438873717888322989", + "29015690120512546779914839" + ], + "mAssetSupply": "114324128809468396390805965" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "4555747702589265989861376", + "expectedQty": "4598275074335200766325821", + "swapFee": "2733448621553559593916", + "reserves": [ + "13356177237607111308774048", + "67663984364538517121997168", + "29015690120512546779914839" + ], + "mAssetSupply": "109771114555500683960538505" + }, + { + "type": "redeemMasset", + "inputQty": "3301395731396947030835", + "expectedQtys": [ + "401570107860877772429", + "2034401986150385719639", + "872392871408134144977" + ], + "redemptionFee": "990418719419084109", + "reserves": [ + "13355775667499250431001619", + "67661949962552366736277529", + "29014817727641138645769862" + ], + "mAssetSupply": "109767814150188006432591779" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "150585530801266848", + "expectedQty": "150829979343306333", + "reserves": [ + "13355775667499250431001619", + "67661949962552366736277529", + "29014817878226669447036710" + ] + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "1454500779004906059071488", + "expectedQty": "1415164322440035493860590", + "swapFee": "872700467402943635442", + "reserves": [ + "11940611345059214937141029", + "67661949962552366736277529", + "29014817878226669447036710" + ], + "mAssetSupply": "108314186222480482660462066" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "1517172722472567313530880", + "expectedQty": "1518532340735528594002919", + "reserves": [ + "11940611345059214937141029", + "67661949962552366736277529", + "30531990600699236760567590" + ] + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "1931182194679996932423680", + "expectedQty": "1861774630237284130963295", + "swapFee": "1158709316807998159454", + "reserves": [ + "10078836714821930806177734", + "67661949962552366736277529", + "30531990600699236760567590" + ], + "mAssetSupply": "107902695077852822320200759" + }, + { + "type": "mintMulti", + "inputQtys": [ + "137834111694478999552", + "45985412359197671424", + "105162136022709862400" + ], + "expectedQty": "294411452008746609293", + "reserves": [ + "10078974548933625285177286", + "67661995947964725933948953", + "30532095762835259470429990" + ], + "mAssetSupply": "107902989489304831066810052" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "13464308468009593208832", + "expectedQty": "13457691748452861842645", + "swapFee": "8078585080805755925", + "reserves": [ + "10078974548933625285177286", + "67661995947964725933948953", + "30518638071086806608587345" + ], + "mAssetSupply": "107889533259421902279357145" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "91612484503567866003456", + "3010498859505488494592", + "176387950629951161499648" + ], + "expectedQty": "274973358700963661299892", + "swapFee": "165083065059613965159", + "reserves": [ + "9987362064430057419173830", + "67658985449105220445454361", + "30342250120456855447087697" + ], + "mAssetSupply": "107614559900720938618057253" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "674601584473663", + "expectedQty": "682400929021521", + "swapFee": "404760950684", + "reserves": [ + "9987362064430057419173830", + "67658985448422819516432840", + "30342250120456855447087697" + ], + "mAssetSupply": "107614559900046741794534274" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "43736134873321439232", + "expectedQty": "45667672975421360421", + "reserves": [ + "9987405800564930740613062", + "67658985448422819516432840", + "30342250120456855447087697" + ] + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "1746590511813198336", + "expectedQty": "1746493164305744408", + "reserves": [ + "9987405800564930740613062", + "67658985448422819516432840", + "30342251867047367260286033" + ] + }, + { + "type": "redeemMasset", + "inputQty": "39810481261961406054", + "expectedQtys": [ + "3693589191743996511", + "25021962896763760950", + "11221313701197661289" + ], + "redemptionFee": "11943144378588421", + "reserves": [ + "9987402106975738996616551", + "67658960426459922752671890", + "30342240645733666062624744" + ], + "mAssetSupply": "107614567515674763938821470" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "45447309114688392", + "expectedQty": "47454409805691183", + "reserves": [ + "9987402152423048111304943", + "67658960426459922752671890", + "30342240645733666062624744" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "314749004151308419072", + "168417634683579498496", + "11650132033774766080" + ], + "expectedQty": "506692060644560882384", + "swapFee": "304197755039760385", + "reserves": [ + "9987087403418896802885871", + "67658792008825239173173394", + "30342228995601632287858664" + ], + "mAssetSupply": "107614060871068529183630269" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "546566375640544960", + "outputIndex": 2, + "expectedQty": "570395385787211148", + "swapFee": "342423559413179", + "reserves": [ + "9987087949985272443430831", + "67658792008825239173173394", + "30342228425206246500647516" + ], + "mAssetSupply": "107614060871410952743043448", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "127010459865819467743232", + "expectedQty": "128476919384614693992383", + "swapFee": "76206275919491680645", + "reserves": [ + "9987087949985272443430831", + "67530315089440624479181011", + "30342228425206246500647516" + ], + "mAssetSupply": "107487126617821052766980861" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "19365827151733645639680", + "12968351124580707860480", + "1180534103344879108096" + ], + "expectedQty": "34213008931287449455246", + "swapFee": "20540129436434330271", + "reserves": [ + "9967722122833538797791151", + "67517346738316043771320531", + "30341047891102901621539420" + ], + "mAssetSupply": "107452913608889765317525615" + }, + { + "type": "redeemMasset", + "inputQty": "316379494869027214327808", + "expectedQtys": [ + "29339705266856667863999", + "198735380991864436334096", + "89308007551025559046432" + ], + "redemptionFee": "94913848460708164298", + "reserves": [ + "9938382417566682129927152", + "67318611357324179334986435", + "30251739883551876062492988" + ], + "mAssetSupply": "107136629027869198811362105" + }, + { + "type": "mintMulti", + "inputQtys": [ + "70732956834264808161280", + "64156815862771547635712", + "68573453888562755796992" + ], + "expectedQty": "205795633352583025663242", + "reserves": [ + "10009115374400946938088432", + "67382768173186950882622147", + "30320313337440438818289980" + ], + "mAssetSupply": "107342424661221781837025347" + }, + { + "type": "redeemMasset", + "inputQty": "610628726899118545305", + "expectedQtys": [ + "56920829222246884622", + "383199003731914086013", + "172428562653945384670" + ], + "redemptionFee": "183188618069735563", + "reserves": [ + "10009058453571724691203810", + "67382384974183218968536134", + "30320140908877784872905310" + ], + "mAssetSupply": "107341814215683500788215605" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "63242182735204548870144", + "expectedQty": "62486856692833804584137", + "reserves": [ + "10009058453571724691203810", + "67445627156918423517406278", + "30320140908877784872905310" + ] + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "26733865902886006816768", + "expectedQty": "26414286437913348030956", + "reserves": [ + "10009058453571724691203810", + "67472361022821309524223046", + "30320140908877784872905310" + ] + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "22584620320611337502720", + "expectedQty": "22582993773648231368139", + "reserves": [ + "10009058453571724691203810", + "67472361022821309524223046", + "30342725529198396210408030" + ] + }, + { + "type": "redeemMasset", + "inputQty": "89350617942844032575078", + "expectedQtys": [ + "8320333362422024959194", + "56088446187386498603934", + "25223310733819641833321" + ], + "redemptionFee": "26805185382853209772", + "reserves": [ + "10000738120209302666244616", + "67416272576633923025619112", + "30317502218464576568574709" + ], + "mAssetSupply": "107363974539830434992833531" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "284395894809890104803328", + "outputIndex": 1, + "expectedQty": "299801747815252959493421", + "swapFee": "177899220490193210549", + "reserves": [ + "10285134015019192771047944", + "67116470828818670066125691", + "30317502218464576568574709" + ], + "mAssetSupply": "107364152439050925186044080", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "3735626127269176851562496", + "expectedQty": "3690748119278381494726314", + "reserves": [ + "10285134015019192771047944", + "70852096956087846917688187", + "30317502218464576568574709" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "1349063015656621080576", + "1241470105348905107456", + "86286546398061379584" + ], + "expectedQty": "2722258472633491335389", + "reserves": [ + "10286483078034849392128520", + "70853338426193195822795643", + "30317588505010974629954293" + ], + "mAssetSupply": "111057622816801940172105783" + }, + { + "type": "redeemMasset", + "inputQty": "14234342391504832351436", + "expectedQtys": [ + "1318031054761438110132", + "9078603412925204969215", + "3884663285978672400242" + ], + "redemptionFee": "4270302717451449705", + "reserves": [ + "10285165046980087954018388", + "70844259822780270617826428", + "30313703841724995957554051" + ], + "mAssetSupply": "111043392744713152791204052" + }, + { + "type": "mintMulti", + "inputQtys": [ + "22646623619830492692480", + "26861702959666974162944", + "21298234614782349017088" + ], + "expectedQty": "71504972891588548946675", + "reserves": [ + "10307811670599918446710868", + "70871121525739937591989372", + "30335002076339778306571139" + ], + "mAssetSupply": "111114897717604741340150727" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "295660488118194671714304", + "225457309019011576496128", + "2610152932114394251264" + ], + "expectedQty": "534534373922501142424564", + "swapFee": "320913172256854798333", + "reserves": [ + "10012151182481723774996564", + "70645664216720926015493244", + "30332391923407663912319875" + ], + "mAssetSupply": "110580363343682240197726163" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "119206678318709056", + "109678610533068032", + "122426081074653232" + ], + "expectedQty": "355619762062112738", + "swapFee": "213499957211594", + "reserves": [ + "10012151063275045456287508", + "70645664107042315482425212", + "30332391800981582837666643" + ], + "mAssetSupply": "110580362988062478135613425" + }, + { + "type": "redeemMasset", + "inputQty": "202318405543094579", + "expectedQtys": [ + "18312788018838949", + "129214897284937763", + "55479652438848237" + ], + "redemptionFee": "60695521662928", + "reserves": [ + "10012151044962257437448559", + "70645663977827418197487449", + "30332391745501930398818406" + ], + "mAssetSupply": "110580362785804768114181774" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "105213831137525839691776", + "159944835326731792416768", + "29978795799088231088128" + ], + "expectedQty": "298134787948975769188683", + "swapFee": "178988265728822755166", + "reserves": [ + "9906937213824731597756783", + "70485719142500686405070681", + "30302412949702842167730278" + ], + "mAssetSupply": "110282227997855792344993091" + }, + { + "type": "redeemMasset", + "inputQty": "106514137178244081254", + "expectedQtys": [ + "9565569356916387021", + "68056960549709565980", + "29258268877268758710" + ], + "redemptionFee": "31954241153473224", + "reserves": [ + "9906927648255374681369762", + "70485651085540136695504701", + "30302383691433964898971568" + ], + "mAssetSupply": "110282121515672855254385061" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "73834989595282873778176", + "expectedQty": "74747191342434020460259", + "swapFee": "44300993757169724266", + "reserves": [ + "9906927648255374681369762", + "70410903894197702675044442", + "30302383691433964898971568" + ], + "mAssetSupply": "110208330827071329550331151" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "239449634972634848428032", + "outputIndex": 2, + "expectedQty": "236118332362259428435125", + "swapFee": "141828414760212927932", + "reserves": [ + "9906927648255374681369762", + "70650353529170337523472474", + "30066265359071705470536443" + ], + "mAssetSupply": "110208472655486089763259083", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemBassets", + "inputQtys": [ + "536108177195636591951872", + "295303816862944217530368", + "255662546264912050520064" + ], + "expectedQty": "1110528075652839731373281", + "swapFee": "666716875517014047252", + "reserves": [ + "9370819471059738089417890", + "70355049712307393305942106", + "29810602812806793420016379" + ], + "mAssetSupply": "109097944579833250031885802" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "3743663598291770671104", + "expectedQty": "3739717079430780724544", + "swapFee": "2246198158975062402", + "reserves": [ + "9370819471059738089417890", + "70355049712307393305942106", + "29806863095727362639291835" + ], + "mAssetSupply": "109094203162433117236277100" + }, + { + "type": "mintMulti", + "inputQtys": [ + "3784482138988793103908864", + "279554967811722737352704", + "3851414892707747658203136" + ], + "expectedQty": "8059751809937505277935761", + "reserves": [ + "13155301610048531193326754", + "70634604680119116043294810", + "33658277988435110297494971" + ], + "mAssetSupply": "117153954972370622514212861" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "213477965424244", + "expectedQty": "219499235023484", + "reserves": [ + "13155301610262009158750998", + "70634604680119116043294810", + "33658277988435110297494971" + ] + }, + { + "type": "redeemMasset", + "inputQty": "124587601954198559653888", + "expectedQtys": [ + "13985834150848074544287", + "75093973185399879300797", + "35783223197420729239891" + ], + "redemptionFee": "37376280586259567896", + "reserves": [ + "13141315776111161084206711", + "70559510706933716163994013", + "33622494765237689568255080" + ], + "mAssetSupply": "117029404746916509449150353" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "13294158177877249490944", + "outputIndex": 1, + "expectedQty": "13413042193885651938170", + "swapFee": "7976718018911976525", + "reserves": [ + "13141315776111161084206711", + "70546097664739830512055843", + "33635788923415566817746024" + ], + "mAssetSupply": "117029412723634528361126878", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "27831258363577188352", + "expectedQty": "27813895976956001676", + "swapFee": "16698755018146313", + "reserves": [ + "13141315776111161084206711", + "70546097664739830512055843", + "33635761109519589861744348" + ], + "mAssetSupply": "117029384909074919802084839" + }, + { + "type": "redeemMasset", + "inputQty": "70211213321751456487833", + "expectedQtys": [ + "7881703605330383941960", + "42311092875260800247923", + "20173558273887227528685" + ], + "redemptionFee": "21063363996525436946", + "reserves": [ + "13133434072505830700264751", + "70503786571864569711807920", + "33615587551245702634215663" + ], + "mAssetSupply": "116959194759117164871033952" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "22627371545566365351936", + "outputIndex": 1, + "expectedQty": "22829388346808452179124", + "swapFee": "13576689830249475386", + "reserves": [ + "13133434072505830700264751", + "70480957183517761259628796", + "33638214922791268999567599" + ], + "mAssetSupply": "116959208335806995120509338", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "1919428536185780736", + "expectedQty": "1901343481362865528", + "reserves": [ + "13133434072505830700264751", + "70480959102946297445409532", + "33638214922791268999567599" + ] + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "1899996513502339916627968", + "outputIndex": 0, + "expectedQty": "1818324118245359843724234", + "swapFee": "1129057486344523732819", + "reserves": [ + "11315109954260470856540517", + "72380955616448637362037500", + "33638214922791268999567599" + ], + "mAssetSupply": "116960339294636821007107685", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemMasset", + "inputQty": "57603880232586979364044", + "expectedQtys": [ + "5571108157533060574537", + "35637491276256039189706", + "16562113343905276756116" + ], + "redemptionFee": "17281164069776093809", + "reserves": [ + "11309538846102937795965980", + "72345318125172381322847794", + "33621652809447363722811483" + ], + "mAssetSupply": "116902752695568303803837450" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "3658760658683208746926080", + "expectedQty": "3458785932087040431742652", + "swapFee": "2195256395209925248155", + "reserves": [ + "7850752914015897364223328", + "72345318125172381322847794", + "33621652809447363722811483" + ], + "mAssetSupply": "113246187293280304982159525" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "38896109307515971305472", + "17145294805884404236288", + "15581525881272458543104" + ], + "expectedQty": "74522671016244350283529", + "swapFee": "44740446877873334170", + "reserves": [ + "7811856804708381392917856", + "72328172830366496918611506", + "33606071283566091264268379" + ], + "mAssetSupply": "113171664622264060631875996" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "434006351934122752", + "outputIndex": 0, + "expectedQty": "399737022394564956", + "swapFee": "259849692881996", + "reserves": [ + "7811856404971358998352900", + "72328172830366496918611506", + "33606071717572443198391131" + ], + "mAssetSupply": "113171664622523910324757992", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "11500739476738158592", + "outputIndex": 2, + "expectedQty": "11335288674303872130", + "swapFee": "6790775352854855", + "reserves": [ + "7811856404971358998352900", + "72328184331105973656770098", + "33606060382283768894519001" + ], + "mAssetSupply": "113171664629314685677612847", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemBassets", + "inputQtys": [ + "413055100062565531648", + "350679684796515876864", + "286039318023222689792" + ], + "expectedQty": "1077781823703059030057", + "swapFee": "647057328619006822", + "reserves": [ + "7811443349871296432821252", + "72327833651421177140893234", + "33605774342965745671829209" + ], + "mAssetSupply": "113170586847490982618582790" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "277551998094622538596352", + "expectedQty": "277956684518799401325377", + "swapFee": "166531198856773523157", + "reserves": [ + "7811443349871296432821252", + "72327833651421177140893234", + "33327817658446946270503832" + ], + "mAssetSupply": "112893201380595216853509595" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "5706201397219186180096", + "outputIndex": 2, + "expectedQty": "5622998910234614007266", + "swapFee": "3369143673548549673", + "reserves": [ + "7811443349871296432821252", + "72333539852818396327073330", + "33322194659536711656496566" + ], + "mAssetSupply": "112893204749738890402059268", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mintMulti", + "inputQtys": [ + "72995257472284401664", + "49316181814253903872", + "15824665353789478912" + ], + "expectedQty": "143346902180088377322", + "reserves": [ + "7811516345128768717222916", + "72333589169000210580977202", + "33322210484202065445975478" + ], + "mAssetSupply": "112893348096641070490436590" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "3338296664392030748672", + "7166382130535496417280", + "5248210872783370977280" + ], + "expectedQty": "15904017661282214286516", + "swapFee": "9548139480457603133", + "reserves": [ + "7808178048464376686474244", + "72326422786869675084559922", + "33316962273329282074998198" + ], + "mAssetSupply": "112877444078979788276150074" + }, + { + "type": "mintMulti", + "inputQtys": [ + "586872207199328838615040", + "300539435032156548628480", + "899058999254950816514048" + ], + "expectedQty": "1825554608875984861281224", + "reserves": [ + "8395050255663705525089284", + "72626962221901831633188402", + "34216021272584232891512246" + ], + "mAssetSupply": "114702998687855773137431298" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "2993332006314634752", + "outputIndex": 1, + "expectedQty": "3030550769154366716", + "swapFee": "1792427346670209", + "reserves": [ + "8395050255663705525089284", + "72626959191351062478821686", + "34216024265916239206146998" + ], + "mAssetSupply": "114702998689648200484101507", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemBassets", + "inputQtys": [ + "2034837322340532674887680", + "480911760233653835137024", + "2581924500492089909313536" + ], + "expectedQty": "5274941061225357529794696", + "swapFee": "3166864755588567658471", + "reserves": [ + "6360212933323172850201604", + "72146047431117408643684662", + "31634099765424149296833462" + ], + "mAssetSupply": "109428057628422842954306811" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "26170048352198116507648", + "outputIndex": 2, + "expectedQty": "25696731443668351146739", + "swapFee": "15394035655227102901", + "reserves": [ + "6360212933323172850201604", + "72172217479469606760192310", + "31608403033980480945686723" + ], + "mAssetSupply": "109428073022458498181409712", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemBassets", + "inputQtys": [ + "141021735099223253188608", + "109575388978757874221056", + "41983259868041983295488" + ], + "expectedQty": "307774112732310281442832", + "swapFee": "184775332839089622639", + "reserves": [ + "6219191198223949597012996", + "72062642090490848885971254", + "31566419774112438962391235" + ], + "mAssetSupply": "109120298909726187899966880" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "1503021862667791106048", + "outputIndex": 2, + "expectedQty": "1475418399710069614113", + "swapFee": "883768314371437379", + "reserves": [ + "6219191198223949597012996", + "72064145112353516677077302", + "31564944355712728892777122" + ], + "mAssetSupply": "109120299793494502271404259", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemBassets", + "inputQtys": [ + "510136019112230874251264", + "560005814364675839623168", + "359091741028761559105536" + ], + "expectedQty": "1486200455148046556797374", + "swapFee": "892255626464706758133", + "reserves": [ + "5709055179111718722761732", + "71504139297988840837454134", + "31205852614683967333671586" + ], + "mAssetSupply": "107634099338346455714606885" + }, + { + "type": "mintMulti", + "inputQtys": [ + "5001236073183109447680", + "25827601590391540809728", + "3961183224032951533568" + ], + "expectedQty": "34957356294605071962004", + "reserves": [ + "5714056415184901832209412", + "71529966899579232378263862", + "31209813797908000285205154" + ], + "mAssetSupply": "107669056694641060786568889" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "211236586756058120192", + "outputIndex": 2, + "expectedQty": "242723278302365257392", + "swapFee": "145333732498650812", + "reserves": [ + "5714267651771657890329604", + "71529966899579232378263862", + "31209571074629697919947762" + ], + "mAssetSupply": "107669056839974793285219701", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mintMulti", + "inputQtys": [ + "3001852287555136512", + "2282161739367420928", + "586614343332676096" + ], + "expectedQty": "6260261772915482665", + "reserves": [ + "5714270653623945445466116", + "71529969181740971745684790", + "31209571661244041252623858" + ], + "mAssetSupply": "107669063100236566200702366" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "440013624753843404800", + "expectedQty": "383493461039335420179", + "swapFee": "264008174852306042", + "reserves": [ + "5713887160162906110045937", + "71529969181740971745684790", + "31209571661244041252623858" + ], + "mAssetSupply": "107668623350619987209603608" + }, + { + "type": "mintMulti", + "inputQtys": [ + "80409136882546786304", + "81503605203594952704", + "14119943729432582144" + ], + "expectedQty": "186036536332104949392", + "reserves": [ + "5713967569299788656832241", + "71530050685346175340637494", + "31209585781187770685206002" + ], + "mAssetSupply": "107668809387156319314553000" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "140665315097604062707712", + "expectedQty": "137633099698784540872701", + "reserves": [ + "5713967569299788656832241", + "71670716000443779403345206", + "31209585781187770685206002" + ] + }, + { + "type": "redeemMasset", + "inputQty": "16725280495326547148", + "expectedQtys": [ + "886209004033186602", + "11115784798351953468", + "4840457282263514744" + ], + "redemptionFee": "5017584148597964", + "reserves": [ + "5713966683090784623645639", + "71670704884658981051391738", + "31209580940730488421691258" + ], + "mAssetSupply": "107806425766592192677476517" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "88667817615786204200960", + "expectedQty": "86752587173224742807992", + "reserves": [ + "5713966683090784623645639", + "71759372702274767255592698", + "31209580940730488421691258" + ] + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "27183666304819388416", + "expectedQty": "27112810175832211846", + "reserves": [ + "5713966683090784623645639", + "71759372702274767255592698", + "31209608124396793241079674" + ] + }, + { + "type": "redeemMasset", + "inputQty": "93803664846334686396416", + "expectedQtys": [ + "4966301780190052863754", + "62369754701449743515496", + "27125872617686580753821" + ], + "redemptionFee": "28141099453900405918", + "reserves": [ + "5709000381310594570781885", + "71697002947573317512077202", + "31182482251779106660325853" + ], + "mAssetSupply": "107799429942828712466505857" + }, + { + "type": "redeemMasset", + "inputQty": "839095047175026303932825", + "expectedQtys": [ + "44424695275611291442794", + "557911594917314279158602", + "242647079952450849015457" + ], + "redemptionFee": "251728514152507891179", + "reserves": [ + "5664575686034983279339091", + "71139091352656003232918600", + "30939835171826655811310396" + ], + "mAssetSupply": "106960586624167838670464211" + }, + { + "type": "redeemMasset", + "inputQty": "1337882214209053286", + "expectedQtys": [ + "70832273269871644", + "889553576145928021", + "386884910941955648" + ], + "redemptionFee": "401364664262715", + "reserves": [ + "5664575615202710009467447", + "71139090463102427086990579", + "30939834784941744869354748" + ], + "mAssetSupply": "106960585286686989125673640" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "727665748766360155979776", + "expectedQty": "823095955775276030865299", + "reserves": [ + "6392241363969070165447223", + "71139090463102427086990579", + "30939834784941744869354748" + ] + }, + { + "type": "redeemMasset", + "inputQty": "94514453067909862260736", + "expectedQtys": [ + "5603612176466901541092", + "62362456428632135516565", + "27122698450660797062881" + ], + "redemptionFee": "28354335920372958678", + "reserves": [ + "6386637751792603263906131", + "71076728006673794951474014", + "30912712086491084072291867" + ], + "mAssetSupply": "107689195143730275667236881" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "187384210602097967104", + "expectedQty": "190961205290023333689", + "swapFee": "112430526361258780", + "reserves": [ + "6386637751792603263906131", + "71076537045468504928140325", + "30912712086491084072291867" + ], + "mAssetSupply": "107689007871950199930528557" + }, + { + "type": "mintMulti", + "inputQtys": [ + "116974118284683057823744", + "65252317514365268918272", + "33228145356731815297024" + ], + "expectedQty": "227554214383893024281995", + "reserves": [ + "6503611870077286321729875", + "71141789362982870197058597", + "30945940231847815887588891" + ], + "mAssetSupply": "107916562086334092954810552" + }, + { + "type": "mintMulti", + "inputQtys": [ + "919000920362576510976", + "3654224661846477504512", + "3726910254180796989440" + ], + "expectedQty": "8327585579644863228572", + "reserves": [ + "6504530870997648898240851", + "71145443587644716674563109", + "30949667142101996684578331" + ], + "mAssetSupply": "107924889671913737818039124" + }, + { + "type": "redeemMasset", + "inputQty": "2615641454988679027097", + "expectedQtys": [ + "157594940212238107446", + "1723746439356714811025", + "749863601170076978388" + ], + "redemptionFee": "784692436496603708", + "reserves": [ + "6504373276057436660133405", + "71143719841205359959752084", + "30948917278500826607599943" + ], + "mAssetSupply": "107922274815151185635615735" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "56160953223792", + "expectedQty": "56060215818865", + "reserves": [ + "6504373276057436660133405", + "71143719841205359959752084", + "30948917278556987560823735" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "4014825614927796736", + "4469342961588763648", + "342902763788057024" + ], + "expectedQty": "9194067165046021802", + "reserves": [ + "6504377290883051587930141", + "71143724310548321548515732", + "30948917621459751348880759" + ], + "mAssetSupply": "107922284009274410897456402" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "444931679041677143572480", + "outputIndex": 0, + "expectedQty": "396158968159531158157957", + "swapFee": "266440035270493956311", + "reserves": [ + "6108218322723520429772184", + "71143724310548321548515732", + "31393849300501428492453239" + ], + "mAssetSupply": "107922550449309681391412713", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemBassets", + "inputQtys": [ + "11281565885763818618880", + "1264462132086610067456", + "22373454824765837541376" + ], + "expectedQty": "36283791989049568165303", + "swapFee": "21783345200550070941", + "reserves": [ + "6096936756837756611153304", + "71142459848416234938448276", + "31371475845676662654911863" + ], + "mAssetSupply": "107886266657320631823247410" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "4753594345839868772352", + "expectedQty": "4762458863859062021194", + "swapFee": "2852156607503921263", + "reserves": [ + "6096936756837756611153304", + "71142459848416234938448276", + "31366713386812803592890669" + ], + "mAssetSupply": "107881515915131399458396321" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "1233681117122861465600", + "expectedQty": "1235979114348795866531", + "swapFee": "740208670273716879", + "reserves": [ + "6096936756837756611153304", + "71142459848416234938448276", + "31365477407698454797024138" + ], + "mAssetSupply": "107880282974222946870647600" + }, + { + "type": "redeemMasset", + "inputQty": "3545513853466458456064", + "expectedQtys": [ + "200317315705597409271", + "2337414206165959176530", + "1030525408204084201980" + ], + "redemptionFee": "1063654156039937536", + "reserves": [ + "6096736439522051013744033", + "71140122434210068979271746", + "31364446882290250712822158" + ], + "mAssetSupply": "107876738524023636452129072" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "12305529688373790941118464", + "outputIndex": 2, + "hardLimitError": true + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "149096990717384222310400", + "expectedQty": "149366874267311387328740", + "swapFee": "89458194430430533386", + "reserves": [ + "6096736439522051013744033", + "71140122434210068979271746", + "31215080008022939325493418" + ], + "mAssetSupply": "107727730991500682660352058" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "53142209437457507680256", + "expectedQty": "47037697503945700608236", + "swapFee": "31885325662474504608", + "reserves": [ + "6049698742018105313135797", + "71140122434210068979271746", + "31215080008022939325493418" + ], + "mAssetSupply": "107674620667388887627176410" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "105244624914177434058752", + "29663952431030560882688", + "133698533664519251558400" + ], + "expectedQty": "281591892880680398404440", + "swapFee": "169056569670210365261", + "reserves": [ + "5944454117103927879077045", + "71110458481779038418389058", + "31081381474358420073935018" + ], + "mAssetSupply": "107393028774508207228771970" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "4405266229569350795264", + "outputIndex": 2, + "expectedQty": "4322250157782317345429", + "swapFee": "2588637147558017911", + "reserves": [ + "5944454117103927879077045", + "71114863748008607769184322", + "31077059224200637756589589" + ], + "mAssetSupply": "107393031363145354786789881", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemMasset", + "inputQty": "624647972585995637044019", + "expectedQtys": [ + "34565345701654371585839", + "413513133679216533698642", + "180704447256902197404204" + ], + "redemptionFee": "187394391775798691113", + "reserves": [ + "5909888771402273507491206", + "70701350614329391235485680", + "30896354776943735559185385" + ], + "mAssetSupply": "106768570784951134948436975" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "943003605919575703552", + "expectedQty": "830788040238287796186", + "swapFee": "565802163551745422", + "reserves": [ + "5909057983362035219695020", + "70701350614329391235485680", + "30896354776943735559185385" + ], + "mAssetSupply": "106767628347147378924478845" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "21178396539941281595392", + "outputIndex": 0, + "expectedQty": "18605565876488476415613", + "swapFee": "12676246388302952755", + "reserves": [ + "5890452417485546743279407", + "70701350614329391235485680", + "30917533173483676840780777" + ], + "mAssetSupply": "106767641023393767227431600", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "154680604696416293486592", + "expectedQty": "175081395358497829033433", + "reserves": [ + "6045133022181963036765999", + "70701350614329391235485680", + "30917533173483676840780777" + ] + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "30936334052167606337536", + "expectedQty": "34895204569353500487898", + "reserves": [ + "6076069356234130643103535", + "70701350614329391235485680", + "30917533173483676840780777" + ] + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "103714287454029334183936", + "expectedQty": "116704785069730308428313", + "reserves": [ + "6179783643688159977287471", + "70701350614329391235485680", + "30917533173483676840780777" + ] + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "3569804905154630962380800", + "expectedQty": "3637277228554758112232280", + "swapFee": "2141882943092778577428", + "reserves": [ + "6179783643688159977287471", + "67064073385774633123253400", + "30917533173483676840780777" + ], + "mAssetSupply": "103526659386179810681577872" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "99984849799522228895744", + "15379950011684967415808", + "81364918513366122627072" + ], + "expectedQty": "207643373975669587171067", + "swapFee": "124660820877928509408", + "reserves": [ + "6079798793888637748391727", + "67048693435762948155837592", + "30836168254970310718153705" + ], + "mAssetSupply": "103319016012204141094406805" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "9630722425513115123712", + "4843009414182393085952", + "10159530738199608426496" + ], + "expectedQty": "25632510435402974313340", + "swapFee": "15388739504944751438", + "reserves": [ + "6070168071463124633268015", + "67043850426348765762751640", + "30826008724232111109727209" + ], + "mAssetSupply": "103293383501768738120093465" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "1519852907436855158374400", + "747587179765696603095040", + "679030914467015335870464" + ], + "hardLimitError": true + }, + { + "type": "mintMulti", + "inputQtys": [ + "297916887693730110242816", + "795436815027370800971776", + "740369021124034596700160" + ], + "expectedQty": "1850385543136947593162133", + "reserves": [ + "6368084959156854743510831", + "67839287241376136563723416", + "31566377745356145706427369" + ], + "mAssetSupply": "105143769044905685713255598" + }, + { + "type": "redeemMasset", + "inputQty": "152672079561869065243852", + "expectedQtys": [ + "9243886858326066141356", + "98475240175155101711257", + "45821628680640021121814" + ], + "redemptionFee": "45801623868560719573", + "reserves": [ + "6358841072298528677369475", + "67740812001200981462012159", + "31520556116675505685305555" + ], + "mAssetSupply": "104991142766967685208731319" + }, + { + "type": "redeemMasset", + "inputQty": "3473313541851135659212", + "expectedQtys": [ + "210299862925182858445", + "2240327021279632706937", + "1042449175139754456622" + ], + "redemptionFee": "1041994062555340697", + "reserves": [ + "6358630772435603494511030", + "67738571674179701829305222", + "31519513667500365930848933" + ], + "mAssetSupply": "104987670495419896628412804" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "1567521347993956096", + "outputIndex": 2, + "expectedQty": "1742510606600753355", + "swapFee": "1043002625215902", + "reserves": [ + "6358632339956951488467126", + "67738571674179701829305222", + "31519511924989759330095578" + ], + "mAssetSupply": "104987670496462899253628706", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "46854657001834872832", + "expectedQty": "51960477332602557155", + "reserves": [ + "6358679194613953323339958", + "67738571674179701829305222", + "31519511924989759330095578" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "3491324241795342693040128", + "3046404730479567263760384", + "4790432054334034632769536" + ], + "hardLimitError": true + }, + { + "type": "mintMulti", + "inputQtys": [ + "148607907782798811856896", + "111822054531408865525760", + "169419868334695873773568" + ], + "expectedQty": "443209831466354260061162", + "reserves": [ + "6507287102396752135196854", + "67850393728711110694830982", + "31688931793324455203869146" + ], + "mAssetSupply": "105430932288406586116247023" + }, + { + "type": "mintMulti", + "inputQtys": [ + "13751998208546396160", + "4958353511045337088", + "9160796982542747648" + ], + "expectedQty": "29194987362247258489", + "reserves": [ + "6507300854394960681593014", + "67850398687064621740168070", + "31688940954121437746616794" + ], + "mAssetSupply": "105430961483393948363505512" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "8347666656772371775488", + "expectedQty": "8367139781855118905923", + "swapFee": "5008599994063423065", + "reserves": [ + "6507300854394960681593014", + "67850398687064621740168070", + "31680573814339582627710871" + ], + "mAssetSupply": "105422618825337170055153089" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "685863414796646481920", + "outputIndex": 0, + "expectedQty": "618720974216784170297", + "swapFee": "410314916107927216", + "reserves": [ + "6506682133420743897422717", + "67850398687064621740168070", + "31681259677754379274192791" + ], + "mAssetSupply": "105422619235652086163080305", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "14266940545360212262912", + "outputIndex": 2, + "expectedQty": "14046351161203234315574", + "swapFee": "8408266697512291254", + "reserves": [ + "6506682133420743897422717", + "67864665627609981952430982", + "31667213326593176039877217" + ], + "mAssetSupply": "105422627643918783675371559", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemBassets", + "inputQtys": [ + "21271503116383764480", + "53178684079799410688", + "19334153759876648960" + ], + "expectedQty": "95010105250328327420", + "swapFee": "57040287322590550", + "reserves": [ + "6506660861917627513658237", + "67864612448925902153020294", + "31667193992439416163228257" + ], + "mAssetSupply": "105422532633813533347044139" + }, + { + "type": "mintMulti", + "inputQtys": [ + "53332615358587361820672", + "1216548251819986386944", + "28427506842914089074688" + ], + "expectedQty": "88410413586087787823870", + "reserves": [ + "6559993477276214875478909", + "67865828997177722139407238", + "31695621499282330252302945" + ], + "mAssetSupply": "105510943047399621134868009" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "3180394642793110175744", + "1705074974291848069120", + "5719463616924252897280" + ], + "expectedQty": "10886222675890044746058", + "swapFee": "6535654998533146735", + "reserves": [ + "6556813082633421765303165", + "67864123922203430291338118", + "31689902035665405999405665" + ], + "mAssetSupply": "105500056824723731090121951" + }, + { + "type": "mintMulti", + "inputQtys": [ + "115356117983876808704", + "322707944305475952050176", + "59537887079724325273600" + ], + "expectedQty": "376501675675910893525947", + "reserves": [ + "6556928438751405642111869", + "68186831866508906243388294", + "31749439922745130324679265" + ], + "mAssetSupply": "105876558500399641983647898" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "1834149768024874454876160", + "outputIndex": 1, + "expectedQty": "2010383148332715781668097", + "swapFee": "1190325466741727441531", + "reserves": [ + "8391078206776280096988029", + "66176448718176190461720197", + "31749439922745130324679265" + ], + "mAssetSupply": "105877748825866383711089429", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemMasset", + "inputQty": "18303703417504058363084", + "expectedQtys": [ + "1450179402287678337891", + "11436876225292057038883", + "5487064078720324914993" + ], + "redemptionFee": "5491111025251217508", + "reserves": [ + "8389628027373992418650138", + "66165011841950898404681314", + "31743952858666409999764272" + ], + "mAssetSupply": "105859450613559904903943853" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "524333152186508", + "expectedQty": "493915762654880", + "swapFee": "314599891311", + "reserves": [ + "8389628026880076655995258", + "66165011841950898404681314", + "31743952858666409999764272" + ], + "mAssetSupply": "105859450613035886351648656" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "3364545448978037", + "outputIndex": 2, + "expectedQty": "3323035201525655", + "swapFee": "1991456926290", + "reserves": [ + "8389628026880076655995258", + "66165011845315443853659351", + "31743952855343374798238617" + ], + "mAssetSupply": "105859450613037877808574946", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemBassets", + "inputQtys": [ + "366406788077662867816448", + "70900765482341999050752", + "135888605399826535809024" + ], + "expectedQty": "595263884573856422523285", + "swapFee": "357372754396952024728", + "reserves": [ + "8023221238802413788178810", + "66094111079833101854608599", + "31608064249943548262429593" + ], + "mAssetSupply": "105264186728464021386051661" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "209089288891786915217408", + "119657394721387832147968", + "113362477885967751446528" + ], + "expectedQty": "454383892393223591305078", + "swapFee": "272794011843039978770", + "reserves": [ + "7814131949910626872961402", + "65974453685111714022460631", + "31494701772057580510983065" + ], + "mAssetSupply": "104809802836070797794746583" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "4640883233745431125032960", + "hardLimitError": true + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "207885565932768881278976", + "outputIndex": 1, + "expectedQty": "210342180699753233119490", + "swapFee": "124466420463958511122", + "reserves": [ + "7814131949910626872961402", + "65764111504411960789341141", + "31702587337990349392262041" + ], + "mAssetSupply": "104809927302491261753257705", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemBassets", + "inputQtys": [ + "4073148730339334029312", + "36336790822431924158464", + "36344923120618879057920" + ], + "expectedQty": "76436201560821430679245", + "swapFee": "45889254489186370229", + "reserves": [ + "7810058801180287538932090", + "65727774713589528865182677", + "31666242414869730513204121" + ], + "mAssetSupply": "104733491100930440322578460" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "198270398319230304", + "expectedQty": "212025006878450256", + "reserves": [ + "7810058999450685858162394", + "65727774713589528865182677", + "31666242414869730513204121" + ] + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "211117609394317310296064", + "expectedQty": "210641993527769379514579", + "reserves": [ + "7810058999450685858162394", + "65727774713589528865182677", + "31877360024264047823500185" + ] + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "31017917188142432256", + "expectedQty": "28984201019580506157", + "swapFee": "18610750312885459", + "reserves": [ + "7810030015249666277656237", + "65727774713589528865182677", + "31877360024264047823500185" + ], + "mAssetSupply": "104944102307176778750996498" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "17773245668810790273024", + "expectedQty": "16605658868508533134962", + "swapFee": "10663947401286474163", + "reserves": [ + "7793424356381157744521275", + "65727774713589528865182677", + "31877360024264047823500185" + ], + "mAssetSupply": "104926339725455369247197637" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "1383857774747978752", + "expectedQty": "1292770629085978262", + "swapFee": "830314664848787", + "reserves": [ + "7793423063610528658543013", + "65727774713589528865182677", + "31877360024264047823500185" + ], + "mAssetSupply": "104926338342427909164067672" + }, + { + "type": "mintMulti", + "inputQtys": [ + "34477529849216416", + "39728459310369904", + "25671509184838772" + ], + "expectedQty": "101655452815302755", + "reserves": [ + "7793423098088058507759429", + "65727774753317988175552581", + "31877360049935557008338957" + ], + "mAssetSupply": "104926338444083361979370427" + }, + { + "type": "redeemMasset", + "inputQty": "67002355839101420175360", + "expectedQtys": [ + "4975119327056985058704", + "41958907964319742701757", + "20349680504179993322869" + ], + "redemptionFee": "20100706751730426052", + "reserves": [ + "7788447978761001522700725", + "65685815845353668432850824", + "31857010369431377015016088" + ], + "mAssetSupply": "104859356188951012289621119" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "587089917420169844490240", + "840241261989870365048832", + "1947369204666806017458176" + ], + "expectedQty": "3401452035423619578427638", + "swapFee": "2042096479141656741101", + "reserves": [ + "7201358061340831678210485", + "64845574583363798067801992", + "29909641164764570997557912" + ], + "mAssetSupply": "101457904153527392711193481" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "799142471337478455296", + "outputIndex": 0, + "expectedQty": "739363892903418237631", + "swapFee": "478599939252850702", + "reserves": [ + "7200618697447928259972854", + "64845574583363798067801992", + "29910440307235908476013208" + ], + "mAssetSupply": "101457904632127331964044183", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemMasset", + "inputQty": "277682630436609879493836", + "expectedQtys": [ + "19701637855659121276090", + "177424202094795888481145", + "81838059727468698199395" + ], + "redemptionFee": "83304789130982963848", + "reserves": [ + "7180917059592269138696764", + "64668150381269002179320847", + "29828602247508439777813813" + ], + "mAssetSupply": "101180305306479853067514195" + }, + { + "type": "mintMulti", + "inputQtys": [ + "97933870877861507760128", + "31034431461878340255744", + "201406559967372736724992" + ], + "expectedQty": "337089672141805964182555", + "reserves": [ + "7278850930470130646456892", + "64699184812730880519576591", + "30030008807475812514538805" + ], + "mAssetSupply": "101517394978621659031696750" + }, + { + "type": "mintMulti", + "inputQtys": [ + "140965648325326158168064", + "2893684553132771115008", + "23030289710279030734848" + ], + "expectedQty": "177369314901124322464023", + "reserves": [ + "7419816578795456804624956", + "64702078497284013290691599", + "30053039097186091545273653" + ], + "mAssetSupply": "101694764293522783354160773" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "1773376566375917484507136", + "expectedQty": "1774572048647755857004614", + "swapFee": "1064025939825550490704", + "reserves": [ + "7419816578795456804624956", + "64702078497284013290691599", + "28278467048538335688269039" + ], + "mAssetSupply": "99922451753086691420144341" + }, + { + "type": "mintMulti", + "inputQtys": [ + "285707850656884981760", + "363458612993420492800", + "744524327995158298624" + ], + "expectedQty": "1408237916285291792601", + "reserves": [ + "7420102286646113689606716", + "64702441955897006711184399", + "28279211572866330846567663" + ], + "mAssetSupply": "99923859991002976711936942" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "101482046577431105503232", + "expectedQty": "108727818209611507322061", + "reserves": [ + "7521584333223544795109948", + "64702441955897006711184399", + "28279211572866330846567663" + ] + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "1528602087207107297280", + "expectedQty": "1528702691054780425828", + "swapFee": "917161252324264378", + "reserves": [ + "7521584333223544795109948", + "64702441955897006711184399", + "28277682870175276066141835" + ], + "mAssetSupply": "100031060124286633436226101" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "2761018006385580032", + "expectedQty": "2955528803750008220", + "reserves": [ + "7521587094241551180689980", + "64702441955897006711184399", + "28277682870175276066141835" + ] + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "91784048655570042880", + "expectedQty": "98250057641725296157", + "reserves": [ + "7521678878290206750732860", + "64702441955897006711184399", + "28277682870175276066141835" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "5582676160653587120128", + "5960212877165998374912", + "5051961317602753511424" + ], + "expectedQty": "16894556485926747486134", + "swapFee": "10142819583306032110", + "reserves": [ + "7516096202129553163612732", + "64696481743019840712809487", + "28272630908857673312630411" + ], + "mAssetSupply": "100014266773387152164044344" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "2501874272020662560227328", + "outputIndex": 0, + "expectedQty": "2225061572180412509179760", + "swapFee": "1477750682348248803670", + "reserves": [ + "5291034629949140654432972", + "67198356015040503273036815", + "28272630908857673312630411" + ], + "mAssetSupply": "100015744524069500412848014", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemBassets", + "inputQtys": [ + "5588879919738177716224", + "3095667933825691287552", + "4952383283483038973952" + ], + "expectedQty": "14396391537884866898913", + "swapFee": "8643020735172023353", + "reserves": [ + "5285445750029402476716748", + "67195260347106677581749263", + "28267678525574190273656459" + ], + "mAssetSupply": "100001348132531615545949101" + }, + { + "type": "mintMulti", + "inputQtys": [ + "8088997331240369923293184", + "2689462318574924529139712", + "3667002736112723709394944" + ], + "expectedQty": "14910697687560117531828808", + "reserves": [ + "13374443081269772400009932", + "69884722665681602110888975", + "31934681261686913983051403" + ], + "mAssetSupply": "114912045820091733077777909" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "4305410617034563125248", + "620283878975087312896", + "1147067175712767344640" + ], + "expectedQty": "6181048408594993795313", + "swapFee": "3710855558492091532", + "reserves": [ + "13370137670652737836884684", + "69884102381802627023576079", + "31933534194511201215706763" + ], + "mAssetSupply": "114905864771683138083982596" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "14089374264630308", + "expectedQty": "14098733380410425", + "reserves": [ + "13370137670652737836884684", + "69884102381802627023576079", + "31933534208600575480337071" + ] + }, + { + "type": "redeemMasset", + "inputQty": "5195510244363060", + "expectedQtys": [ + "604354250844492", + "3158887019809741", + "1443453135551265" + ], + "redemptionFee": "1558653073308", + "reserves": [ + "13370137670048383586040192", + "69884102378643740003766338", + "31933534207157122344785806" + ], + "mAssetSupply": "114905864780587919873103269" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "1981464856481487912960", + "922616462822395609088", + "215329576524522356736" + ], + "expectedQty": "3163088616523879430192", + "swapFee": "1898992565453599818", + "reserves": [ + "13368156205191902098127232", + "69883179762180917608157250", + "31933318877580597822429070" + ], + "mAssetSupply": "114902701691971395993673077" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "46208565886684118384640", + "17496393745125567627264", + "27040570044979620085760" + ], + "expectedQty": "91820128906805443507098", + "swapFee": "55125152435544592859", + "reserves": [ + "13321947639305217979742592", + "69865683368435792040529986", + "31906278307535618202343310" + ], + "mAssetSupply": "114810881563064590550165979" + }, + { + "type": "redeemMasset", + "inputQty": "1250966613435107980083", + "expectedQtys": [ + "145110915466956927990", + "761020351364104898751", + "347542970420462428844" + ], + "redemptionFee": "375289984030532394", + "reserves": [ + "13321802528389751022814602", + "69864922348084427935631235", + "31905930764565197739914466" + ], + "mAssetSupply": "114809630971741139472718290" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "1555585465906205518987264", + "expectedQty": "1553115350398644722947729", + "swapFee": "933351279543723311392", + "reserves": [ + "13321802528389751022814602", + "69864922348084427935631235", + "30352815414166553016966737" + ], + "mAssetSupply": "113254978857114477677042418" + }, + { + "type": "redeemMasset", + "inputQty": "8836901599693096550", + "expectedQtys": [ + "1039143199037450449", + "5449687364346998038", + "2367616667643452956" + ], + "redemptionFee": "2651070479907928", + "reserves": [ + "13321801489246551985364153", + "69864916898397063588633197", + "30352813046549885373513781" + ], + "mAssetSupply": "113254970022863948463853796" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "478753579098036109312", + "expectedQty": "466290065144979178301", + "swapFee": "287252147458821665", + "reserves": [ + "13321335199181407006185852", + "69864916898397063588633197", + "30352813046549885373513781" + ], + "mAssetSupply": "113254491556536997886566149" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "963597854193308722528256", + "expectedQty": "972293272472906320230481", + "swapFee": "578158712515985233516", + "reserves": [ + "13321335199181407006185852", + "68892623625924157268402716", + "30352813046549885373513781" + ], + "mAssetSupply": "112291471861056205149271409" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "211724119907962", + "expectedQty": "209724403611407", + "reserves": [ + "13321335199181407006185852", + "68892623626135881388310678", + "30352813046549885373513781" + ] + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "3378875047437568609091584", + "expectedQty": "3370070661357696763157312", + "swapFee": "2027325028462541165454", + "reserves": [ + "13321335199181407006185852", + "68892623626135881388310678", + "26982742385192188610356469" + ], + "mAssetSupply": "108914624138856823484956686" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "2595669042424843522277376", + "outputIndex": 2, + "expectedQty": "2636406004279234454706283", + "swapFee": "1589399005882935873931", + "reserves": [ + "15917004241606250528463228", + "68892623626135881388310678", + "24346336380912954155650186" + ], + "mAssetSupply": "108916213537862706420830617", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemBassets", + "inputQtys": [ + "523731832956121920831488", + "402473373235556202315776", + "362027804688549071028224" + ], + "expectedQty": "1295335480588704189953666", + "swapFee": "777667889086674518683", + "reserves": [ + "15393272408650128607631740", + "68490150252900325185994902", + "23984308576224405084621962" + ], + "mAssetSupply": "107620878057274002230876951" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "103086003140105972219904", + "expectedQty": "101225812303801454508017", + "swapFee": "61851601884063583331", + "reserves": [ + "15292046596346327153123723", + "68490150252900325185994902", + "23984308576224405084621962" + ], + "mAssetSupply": "107517853905735780322240378" + }, + { + "type": "redeemMasset", + "inputQty": "568095901318218649", + "expectedQtys": [ + "80774889694761772", + "361775272982590337", + "126688724589194899" + ], + "redemptionFee": "170428770395465", + "reserves": [ + "15292046515571437458361951", + "68490149891125052203404565", + "23984308449535680495427063" + ], + "mAssetSupply": "107517853337810307774417194" + }, + { + "type": "redeemMasset", + "inputQty": "85293249511225741960806", + "expectedQtys": [ + "12127446800778576844458", + "54316513380742303945926", + "19020895893759241857364" + ], + "redemptionFee": "25587974853367722588", + "reserves": [ + "15279919068770658881517493", + "68435833377744309899458639", + "23965287553641921253569699" + ], + "mAssetSupply": "107432585676273935400178976" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "6310283914081187397632", + "3221982115048823717888", + "2524784279841329381376" + ], + "expectedQty": "12152610149223706888939", + "swapFee": "7295943655727660729", + "reserves": [ + "15273608784856577694119861", + "68432611395629261075740751", + "23962762769362079924188323" + ], + "mAssetSupply": "107420433066124711693290037" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "1090206715036765354196992", + "outputIndex": 2, + "expectedQty": "1072889693418796447714092", + "swapFee": "647884472042306583999", + "reserves": [ + "15273608784856577694119861", + "69522818110666026429937743", + "22889873075943283476474231" + ], + "mAssetSupply": "107421080950596753999874036", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemBassets", + "inputQtys": [ + "103739754115406632058880", + "100869685139873057472512", + "122569458891581663739904" + ], + "expectedQty": "328866043299716095010628", + "swapFee": "197438088833129534727", + "reserves": [ + "15169869030741171062060981", + "69421948425526153372465231", + "22767303617051701812734327" + ], + "mAssetSupply": "107092214907297037904863408" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "1048392320005810688", + "expectedQty": "1037918953826700908", + "reserves": [ + "15169869030741171062060981", + "69421949473918473378275919", + "22767303617051701812734327" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "504672422722234875904", + "1109401538559800115200", + "803524806292809187328" + ], + "expectedQty": "2421002391715181090790", + "swapFee": "1453473519140593010", + "reserves": [ + "15169364358318448827185077", + "69420840072379913578160719", + "22766500092245409003546999" + ], + "mAssetSupply": "107089794942824276550473526" + }, + { + "type": "redeemMasset", + "inputQty": "210460455565178778419", + "expectedQtys": [ + "29802966471173532411", + "136389826244979523693", + "44728916972917447946" + ], + "redemptionFee": "63138136669553633", + "reserves": [ + "15169334555351977653652666", + "69420703682553668598637026", + "22766455363328436086099053" + ], + "mAssetSupply": "107089584545506848041248740" + }, + { + "type": "mintMulti", + "inputQtys": [ + "44951287206957352484864", + "24501779911406283390976", + "797864324813894975488" + ], + "expectedQty": "70843538399083332066630", + "reserves": [ + "15214285842558935006137530", + "69445205462465074882028002", + "22767253227653249981074541" + ], + "mAssetSupply": "107160428083905931373315370" + }, + { + "type": "mintMulti", + "inputQtys": [ + "8169385255729164713984", + "24300274342128846372864", + "42417584598211543171072" + ], + "expectedQty": "75065876247450971525752", + "reserves": [ + "15222455227814664170851514", + "69469505736807203728400866", + "22809670812251461524245613" + ], + "mAssetSupply": "107235493960153382344841122" + }, + { + "type": "mintMulti", + "inputQtys": [ + "70962002108595335856128", + "16312567253932701646848", + "30469671868037578358784" + ], + "expectedQty": "119078772252002293929660", + "reserves": [ + "15293417229923259506707642", + "69485818304061136430047714", + "22840140484119499102604397" + ], + "mAssetSupply": "107354572732405384638770782" + }, + { + "type": "mintMulti", + "inputQtys": [ + "257870099611173421056", + "450498729906768445440", + "62132797428484628480" + ], + "expectedQty": "771141898540519069691", + "reserves": [ + "15293675100022870680128698", + "69486268802791043198493154", + "22840202616916927587232877" + ], + "mAssetSupply": "107355343874303925157840473" + }, + { + "type": "mintMulti", + "inputQtys": [ + "230032557511634583552", + "63364111025158365184", + "7839589546962705408" + ], + "expectedQty": "304862707169329629637", + "reserves": [ + "15293905132580382314712250", + "69486332166902068356858338", + "22840210456506474549938285" + ], + "mAssetSupply": "107355648737011094487470110" + }, + { + "type": "mintMulti", + "inputQtys": [ + "126735466430740538851328", + "13085157933250636677120", + "92259569257743808200704" + ], + "expectedQty": "234829722886247468529917", + "reserves": [ + "15420640599011122853563578", + "69499417324835318993535458", + "22932470025764218358138989" + ], + "mAssetSupply": "107590478459897341956000027" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "343059789343009931264", + "expectedQty": "339688381087654151126", + "reserves": [ + "15420640599011122853563578", + "69499760384624662003466722", + "22932470025764218358138989" + ] + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "14020120777175978637000704", + "hardLimitError": true + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "67411909436845137920", + "expectedQty": "66749418391791605906", + "reserves": [ + "15420640599011122853563578", + "69499827796534098848604642", + "22932470025764218358138989" + ] + }, + { + "type": "redeemMasset", + "inputQty": "7359238752286588", + "expectedQtys": [ + "1054458569947040", + "4752376437240777", + "1568115111266609" + ], + "redemptionFee": "2207771625685", + "reserves": [ + "15420640597956664283616538", + "69499827791781722411363865", + "22932470024196103246872380" + ], + "mAssetSupply": "107590884890339790421096156" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "546311270163628639125504", + "expectedQty": "555766641028678356929357", + "reserves": [ + "15966951868120292922742042", + "69499827791781722411363865", + "22932470024196103246872380" + ] + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "5983790035774455414784", + "expectedQty": "6021631304480131328431", + "reserves": [ + "15966951868120292922742042", + "69499827791781722411363865", + "22938453814231877702287164" + ] + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "226644016595189530624", + "expectedQty": "228691760666718395974", + "swapFee": "135986409957113718", + "reserves": [ + "15966951868120292922742042", + "69499599100021055692967891", + "22938453814231877702287164" + ], + "mAssetSupply": "108152446654642763676937038" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "17395717576121122816000", + "24432897053496220581888", + "1806799568647057571840" + ], + "expectedQty": "43703600207140693975111", + "swapFee": "26237902866004018796", + "reserves": [ + "15949556150544171799926042", + "69475166202967559472386003", + "22936647014663230644715324" + ], + "mAssetSupply": "108108743054435622982961927" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "47475010802419965952", + "expectedQty": "47904149335204221264", + "swapFee": "28485006481451979", + "reserves": [ + "15949556150544171799926042", + "69475118298818224268164739", + "22936647014663230644715324" + ], + "mAssetSupply": "108108695607909827044447954" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "41478910192356220928", + "expectedQty": "41740834455142918688", + "reserves": [ + "15949556150544171799926042", + "69475118298818224268164739", + "22936688493573423000936252" + ] + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "54360140018250525179904", + "expectedQty": "54851211588263335147488", + "swapFee": "32616084010950315107", + "reserves": [ + "15949556150544171799926042", + "69420267087229960933017251", + "22936688493573423000936252" + ], + "mAssetSupply": "108054409824810042612501845" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "352509315924240621371392", + "2400604362129094693879808", + "3158228868274612426768384" + ], + "expectedQty": "5917071129177184835392693", + "swapFee": "3552374101967491396073", + "reserves": [ + "15597046834619931178554650", + "67019662725100866239137443", + "19778459625298810574167868" + ], + "mAssetSupply": "102137338695632857777109152" + }, + { + "type": "mintMulti", + "inputQtys": [ + "8420495216052112719872", + "6083581213029063196672", + "2383990499785109929984" + ], + "expectedQty": "16981823171470630812570", + "reserves": [ + "15605467329835983291274522", + "67025746306313895302334115", + "19780843615798595684097852" + ], + "mAssetSupply": "102154320518804328407921722" + }, + { + "type": "mintMulti", + "inputQtys": [ + "3900136182969708032", + "678728129402565248", + "5353444362879160320" + ], + "expectedQty": "10034779384259424080", + "reserves": [ + "15605471229972166260982554", + "67025746985042024704899363", + "19780848969242958563258172" + ], + "mAssetSupply": "102154330553583712667345802" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "818867752973596306178048", + "outputIndex": 2, + "expectedQty": "823021225842942915725031", + "swapFee": "498733705135315303790", + "reserves": [ + "16424338982945762567160602", + "67025746985042024704899363", + "18957827743400015647533141" + ], + "mAssetSupply": "102154829287288847982649592", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mintMulti", + "inputQtys": [ + "611939366303462936543232", + "378683349446954921754624", + "468096821245898779525120" + ], + "expectedQty": "1467893189315080494338381", + "reserves": [ + "17036278349249225503703834", + "67404430334488979626653987", + "19425924564645914427058261" + ], + "mAssetSupply": "103622722476603928476987973" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "562755629066343481344", + "893434109716464009216", + "3452252555575687118848" + ], + "expectedQty": "4939885554516299767635", + "swapFee": "2965710759165279027", + "reserves": [ + "17035715593620159160222490", + "67403536900379263162644771", + "19422472312090338739939413" + ], + "mAssetSupply": "103617782591049412177220338" + }, + { + "type": "redeemMasset", + "inputQty": "2606615765356241747968", + "expectedQtys": [ + "428423018336603302285", + "1695099132568142018559", + "488446415166795782733" + ], + "redemptionFee": "781984729606872524", + "reserves": [ + "17035287170601822556920205", + "67401841801246695020626212", + "19421983865675171944156680" + ], + "mAssetSupply": "103615176757268785542344894" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "30282400230023905280", + "outputIndex": 2, + "expectedQty": "29690106839540674237", + "swapFee": "17993396147327677", + "reserves": [ + "17035287170601822556920205", + "67401872083646925044531492", + "19421954175568332403482443" + ], + "mAssetSupply": "103615176775262181689672571", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "2076326518564059724382208", + "outputIndex": 2, + "expectedQty": "2076085016260401755559157", + "swapFee": "1260189658905096430279", + "reserves": [ + "19111613689165882281302413", + "67401872083646925044531492", + "17345869159307930647923286" + ], + "mAssetSupply": "103616436964921086786102850", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemBassets", + "inputQtys": [ + "13474894328035211264", + "2874509912824734720", + "18719535269106962432" + ], + "expectedQty": "35411384911644013376", + "swapFee": "21259586699005811", + "reserves": [ + "19111600214271554246091149", + "67401869209137012219796772", + "17345850439772661540960854" + ], + "mAssetSupply": "103616401553536175142089474" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "6920569511154759499776", + "2164666977493830336512", + "2939526002536271052800" + ], + "expectedQty": "12109499051666296541841", + "swapFee": "7270061467880506228", + "reserves": [ + "19104679644760399486591373", + "67399704542159518389460260", + "17342910913770125269908054" + ], + "mAssetSupply": "103604292054484508845547633" + }, + { + "type": "mintMulti", + "inputQtys": [ + "435478011142448545792", + "239029635917321633792", + "743254932854939189248" + ], + "expectedQty": "1429173223455120005056", + "reserves": [ + "19105115122771541935137165", + "67399943571795435711094052", + "17343654168702980209097302" + ], + "mAssetSupply": "103605721227707963965552689" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "24179115810592", + "outputIndex": 0, + "expectedQty": "23696561923655", + "swapFee": "14367206907", + "reserves": [ + "19105115122747845373213510", + "67399943571819614826904644", + "17343654168702980209097302" + ], + "mAssetSupply": "103605721227707978332759596", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "42980352865997401620480", + "expectedQty": "43523115929634368914784", + "reserves": [ + "19105115122747845373213510", + "67399943571819614826904644", + "17386634521568977610717782" + ] + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "19401549200344924291072", + "outputIndex": 2, + "expectedQty": "18963511814068203687478", + "swapFee": "11528568177377304199", + "reserves": [ + "19105115122747845373213510", + "67419345121019959751195716", + "17367671009754909407030304" + ], + "mAssetSupply": "103649255872205790078978579", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemBassets", + "inputQtys": [ + "2044001876026416168960", + "4391572896960351305728", + "3726876508827760459776" + ], + "expectedQty": "10187340300793464601939", + "swapFee": "6116073824770941325", + "reserves": [ + "19103071120871818957044550", + "67414953548122999399889988", + "17363944133246081646570528" + ], + "mAssetSupply": "103639068531904996614376640" + }, + { + "type": "redeemMasset", + "inputQty": "139073868185586331602124", + "expectedQtys": [ + "25626831765550682298982", + "90437378478509121405129", + "23293787280252251348186" + ], + "redemptionFee": "41722160455675899480", + "reserves": [ + "19077444289106268274745568", + "67324516169644490278484859", + "17340650345965829395222342" + ], + "mAssetSupply": "103500036385879865958673996" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "481350811130328866881536", + "247666588916425586376704", + "473653877956595521945600" + ], + "expectedQty": "1211281070771522380433566", + "swapFee": "727204965442178735501", + "reserves": [ + "18596093477975939407864032", + "67076849580728064692108155", + "16866996468009233873276742" + ], + "mAssetSupply": "102288755315108343578240430" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "127692214390876749824", + "expectedQty": "128903829988102905806", + "swapFee": "76615328634526049", + "reserves": [ + "18596093477975939407864032", + "67076720676898076589202349", + "16866996468009233873276742" + ], + "mAssetSupply": "102288627699509281336016655" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "1721803476138753523712", + "expectedQty": "1698115618129012233726", + "swapFee": "1033082085683252114", + "reserves": [ + "18596093477975939407864032", + "67076720676898076589202349", + "16865298352391104861043016" + ], + "mAssetSupply": "102286906929115228265745057" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "351183808677556921565184", + "outputIndex": 1, + "expectedQty": "358069661510664810959484", + "swapFee": "212858622674470557457", + "reserves": [ + "18947277286653496329429216", + "66718651015387411778242865", + "16865298352391104861043016" + ], + "mAssetSupply": "102287119787737902736302514", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemBassets", + "inputQtys": [ + "105978735193636628070400", + "60308278787713320091648", + "83278321122486958161920" + ], + "expectedQty": "251125155152561387192477", + "swapFee": "150765552422990626691", + "reserves": [ + "18841298551459859701358816", + "66658342736599698458151217", + "16782020031268617902881096" + ], + "mAssetSupply": "102035994632585341349110037" + }, + { + "type": "mintMulti", + "inputQtys": [ + "100968652560696971624448", + "94907268251264196018176", + "87674869811568204316672" + ], + "expectedQty": "284780671734232967321574", + "reserves": [ + "18942267204020556672983264", + "66753250004850962654169393", + "16869694901080186107197768" + ], + "mAssetSupply": "102320775304319574316431611" + }, + { + "type": "redeemMasset", + "inputQty": "162387618893893310873", + "expectedQtys": [ + "30053201431153085635", + "105908593040757822857", + "26764923833227791624" + ], + "redemptionFee": "48716285668167993", + "reserves": [ + "18942237150819125519897629", + "66753144096257921896346536", + "16869668136156352879406144" + ], + "mAssetSupply": "102320612965416966091288731" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "37607436860186498695168", + "expectedQty": "37217577041276121240174", + "swapFee": "22564462116111899217", + "reserves": [ + "18905019573777849398657455", + "66753144096257921896346536", + "16869668136156352879406144" + ], + "mAssetSupply": "102283028093018895704492780" + }, + { + "type": "mintMulti", + "inputQtys": [ + "482257518429898673225728", + "412330713982834793512960", + "629517269649569769062400" + ], + "expectedQty": "1532832096637078494924386", + "reserves": [ + "19387277092207748071883183", + "67165474810240756689859496", + "17499185405805922648468544" + ], + "mAssetSupply": "103815860189655974199417166" + }, + { + "type": "mintMulti", + "inputQtys": [ + "15961421513329127456768", + "51544039049958638223360", + "36735294838011464777728" + ], + "expectedQty": "104356654637984929830460", + "reserves": [ + "19403238513721077199339951", + "67217018849290715328082856", + "17535920700643934113246272" + ], + "mAssetSupply": "103920216844293959129247626" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "70295163533076406272", + "1204945997648077783040", + "1847490884904294809600" + ], + "expectedQty": "3134717996578299557877", + "swapFee": "1881959973931338537", + "reserves": [ + "19403168218557544122933679", + "67215813903293067250299816", + "17534073209759029818436672" + ], + "mAssetSupply": "103917082126297380829689749" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "2392911396323631038464000", + "expectedQty": "2413681754740702355711439", + "swapFee": "1435746837794178623078", + "reserves": [ + "19403168218557544122933679", + "64802132148552364894588377", + "17534073209759029818436672" + ], + "mAssetSupply": "101525606476811543969848827" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "13052585749888392", + "3754817335191865", + "4453137907245514" + ], + "expectedQty": "21390291505030736", + "swapFee": "12841880031037", + "reserves": [ + "19403168205504958373045287", + "64802132144797547559396512", + "17534073205305891911191158" + ], + "mAssetSupply": "101525606455421252464818091" + }, + { + "type": "redeemMasset", + "inputQty": "3494156777294110549606", + "expectedQtys": [ + "667588943706503852536", + "2229593976111635815732", + "603280520275118704144" + ], + "redemptionFee": "1048247033188233164", + "reserves": [ + "19402500616561251869192751", + "64799902550821435923580780", + "17533469924785616792487014" + ], + "mAssetSupply": "101522113346890991542501649" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "16213463547857539072", + "outputIndex": 2, + "expectedQty": "16160813785557064445", + "swapFee": "9812237125453685", + "reserves": [ + "19402516830024799726731823", + "64799902550821435923580780", + "17533453763971831235422569" + ], + "mAssetSupply": "101522113356703228667955334", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mintMulti", + "inputQtys": [ + "1143224632568042749952", + "1119375378179037200384", + "1309894533359660695552" + ], + "expectedQty": "3587201058083941717098", + "reserves": [ + "19403660054657367769481775", + "64801021926199614960781164", + "17534763658505190896118121" + ], + "mAssetSupply": "101525700557761312609672432" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "3738697440837612544", + "expectedQty": "3704410026036667109", + "swapFee": "2243218464502567", + "reserves": [ + "19403656350247341732814666", + "64801021926199614960781164", + "17534763658505190896118121" + ], + "mAssetSupply": "101525696821307090236562455" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "7638300981807709945856", + "1730698361181310812160", + "36231866852631962976256" + ], + "expectedQty": "46062888253711228110397", + "swapFee": "27654325547555270028", + "reserves": [ + "19396018049265534022868810", + "64799291227838433649969004", + "17498531791652558933141865" + ], + "mAssetSupply": "101479633933053379008452058" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "5044299007065496", + "outputIndex": 2, + "expectedQty": "4939820562003140", + "swapFee": "2999430003994", + "reserves": [ + "19396018049265534022868810", + "64799291232882732657034500", + "17498531786712738371138725" + ], + "mAssetSupply": "101479633933056378438456052", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "2345592991526281749200896", + "expectedQty": "2313125594562339959787413", + "swapFee": "1407355794915769049520", + "reserves": [ + "19396018049265534022868810", + "64799291232882732657034500", + "15185406192150398411351312" + ], + "mAssetSupply": "99135448297325012458304676" + }, + { + "type": "redeemMasset", + "inputQty": "394045060137996645721702", + "expectedQtys": [ + "77072453480165232099671", + "257487920789141011306397", + "60341071520411536394049" + ], + "redemptionFee": "118213518041398993716", + "reserves": [ + "19318945595785368790769139", + "64541803312093591645728103", + "15125065120629986874957263" + ], + "mAssetSupply": "98741521450705057211576690" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "5134449647956846968832", + "outputIndex": 1, + "expectedQty": "5227082363096699041180", + "swapFee": "3106719636828512357", + "reserves": [ + "19324080045433325637737971", + "64536576229730494946686923", + "15125065120629986874957263" + ], + "mAssetSupply": "98741524557424694040089047", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "1642074603088582400", + "expectedQty": "1615616905101627205", + "swapFee": "985244761853149", + "reserves": [ + "19324080045433325637737971", + "64536576229730494946686923", + "15125063505013081773330058" + ], + "mAssetSupply": "98741522916335335713359796" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "70194832475885656", + "expectedQty": "70862001443206459", + "swapFee": "42116899485531", + "reserves": [ + "19324080045433325637737971", + "64536576158868493503480464", + "15125063505013081773330058" + ], + "mAssetSupply": "98741522846182620136959671" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "4759362251941790", + "expectedQty": "4804597758371881", + "swapFee": "2855617351165", + "reserves": [ + "19324080045433325637737971", + "64536576154063895745108583", + "15125063505013081773330058" + ], + "mAssetSupply": "98741522841426113502369046" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "82765998703787049484288", + "100560717760812164317184", + "25021830056702138908672" + ], + "expectedQty": "208437636225275891382944", + "swapFee": "125137664333765794306", + "reserves": [ + "19241314046729538588253683", + "64436015436303083580791399", + "15100041674956379634421386" + ], + "mAssetSupply": "98533085205200837610986102" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "7646050012295000473206784", + "outputIndex": 1, + "expectedQty": "7768338467328476609837536", + "swapFee": "4632300539323011092199", + "reserves": [ + "19241314046729538588253683", + "56667676968974606970953863", + "22746091687251380107628170" + ], + "mAssetSupply": "98537717505740160622078301", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemBassets", + "inputQtys": [ + "4264064122624201457664", + "2863253923224340135936", + "1787897831328757841920" + ], + "expectedQty": "8935356507530631719124", + "swapFee": "5364432564056813119", + "reserves": [ + "19237049982606914386796019", + "56664813715051382630817927", + "22744303789420051349786250" + ], + "mAssetSupply": "98528782149232629990359177" + }, + { + "type": "mintMulti", + "inputQtys": [ + "280627110747524726521856", + "29164502291287002578944", + "234476054271573532606464" + ], + "expectedQty": "547000746094697479371671", + "reserves": [ + "19517677093354439113317875", + "56693978217342669633396871", + "22978779843691624882392714" + ], + "mAssetSupply": "99075782895327327469730848" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "212440494851263366692864", + "expectedQty": "210833370066598274732044", + "swapFee": "127464296910758020015", + "reserves": [ + "19306843723287840838585831", + "56693978217342669633396871", + "22978779843691624882392714" + ], + "mAssetSupply": "98863469864772974861057999" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "14219011133947431092224", + "expectedQty": "14132817515709164106275", + "reserves": [ + "19306843723287840838585831", + "56708197228476617064489095", + "22978779843691624882392714" + ] + }, + { + "type": "redeemMasset", + "inputQty": "15232602661628796941107", + "expectedQtys": [ + "2973426165963697914135", + "8733568255923493085348", + "3538937085129957634925" + ], + "redemptionFee": "4569780798488639082", + "reserves": [ + "19303870297121877140671696", + "56699463660220693571403747", + "22975240906606494924757789" + ], + "mAssetSupply": "98862374649407853716862249" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "262395296530570656", + "outputIndex": 2, + "expectedQty": "263072055539714167", + "swapFee": "158557810158638", + "reserves": [ + "19303870559517173671242352", + "56699463660220693571403747", + "22975240643534439385043622" + ], + "mAssetSupply": "98862374649566411527020887", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "17866922266674635735040", + "expectedQty": "17758569474907735341841", + "reserves": [ + "19303870559517173671242352", + "56717330582487368207138787", + "22975240643534439385043622" + ] + }, + { + "type": "redeemMasset", + "inputQty": "579752071925494", + "expectedQtys": [ + "113148123401002", + "332444185218535", + "134667571225538" + ], + "redemptionFee": "173925621577", + "reserves": [ + "19303870559404025547841350", + "56717330582154924021920252", + "22975240643399771813818084" + ], + "mAssetSupply": "98880133218461741116058811" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "1998940949729375980355584", + "4262412059197685089959936", + "3922773273373545789915136" + ], + "expectedQty": "10189530405534213116099092", + "swapFee": "6117388676526443735900", + "reserves": [ + "17304929609674649567485766", + "52454918522957238931960316", + "19052467370026226023902948" + ], + "mAssetSupply": "88690602812927527999959719" + }, + { + "type": "mintMulti", + "inputQtys": [ + "5075371829788829286400", + "5486544272960335642624", + "2076628434683810545664" + ], + "expectedQty": "12650249312694727884015", + "reserves": [ + "17310004981504438396772166", + "52460405067230199267602940", + "19054543998460909834448612" + ], + "mAssetSupply": "88703253062240222727843734" + }, + { + "type": "mintMulti", + "inputQtys": [ + "4389213397630032805888", + "18278371608365235175424", + "16460288675485799415808" + ], + "expectedQty": "39126620286138822464327", + "reserves": [ + "17314394194902068429578054", + "52478683438838564502778364", + "19071004287136395633864420" + ], + "mAssetSupply": "88742379682526361550308061" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "1235745234640198743097344", + "expectedQty": "1241835415896189892718865", + "reserves": [ + "17314394194902068429578054", + "52478683438838564502778364", + "20306749521776594376961764" + ] + }, + { + "type": "redeemMasset", + "inputQty": "8316503321353", + "expectedQtys": [ + "1599747445777", + "4848719443721", + "1876223349995" + ], + "redemptionFee": "2494950996", + "reserves": [ + "17314394194900468682132277", + "52478683438833715783334643", + "20306749521774718153611769" + ], + "mAssetSupply": "89984215098414237434656569" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "3719551537423317504", + "outputIndex": 1, + "expectedQty": "3758061328887760760", + "swapFee": "2241705721841869", + "reserves": [ + "17314394194900468682132277", + "52478679680772386895573883", + "20306753241326255576929273" + ], + "mAssetSupply": "89984215100655943156498438", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mintMulti", + "inputQtys": [ + "1341219561312761151488", + "851836395273146204160", + "1639098585264680599552" + ], + "expectedQty": "3844122765896593392548", + "reserves": [ + "17315735414461781443283765", + "52479531517167660041778043", + "20308392339911520257528825" + ], + "mAssetSupply": "89988059223421839749890986" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "113769772252991537152", + "4272932024417689534464", + "186174285757742546944" + ], + "expectedQty": "4547137326467337766558", + "swapFee": "2729920348089256213", + "reserves": [ + "17315621644689528451746613", + "52475258585143242352243579", + "20308206165625762514981881" + ], + "mAssetSupply": "89983512086095372412124428" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "40320094530634906599424", + "286738240191441135468544", + "184452063962252653363200" + ], + "expectedQty": "510802085902070882132645", + "swapFee": "306665250691657523793", + "reserves": [ + "17275301550158893545147189", + "52188520344951801216775035", + "20123754101663509861618681" + ], + "mAssetSupply": "89472710000193301529991783" + }, + { + "type": "mintMulti", + "inputQtys": [ + "3774388084858734080", + "7604691539468514304", + "379263670520979072" + ], + "expectedQty": "11739429681008796427", + "reserves": [ + "17275305324546978403881269", + "52188527949643340685289339", + "20123754480927180382597753" + ], + "mAssetSupply": "89472721739622982538788210" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "151548704587118272", + "outputIndex": 2, + "expectedQty": "151900750306123721", + "swapFee": "91608168014767", + "reserves": [ + "17275305476095682990999541", + "52188527949643340685289339", + "20123754329026430076474032" + ], + "mAssetSupply": "89472721739714590706802977", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "5485602149739274436608", + "expectedQty": "5450387966867925785505", + "reserves": [ + "17275305476095682990999541", + "52194013551793079959725947", + "20123754329026430076474032" + ] + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "883885672650760704", + "outputIndex": 0, + "expectedQty": "871178022631361464", + "swapFee": "526926736009797", + "reserves": [ + "17275304604917660359638077", + "52194014435678752610486651", + "20123754329026430076474032" + ], + "mAssetSupply": "89478172128208385368598279", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "52937363715305689317376", + "expectedQty": "53176171972038198544474", + "reserves": [ + "17275304604917660359638077", + "52194014435678752610486651", + "20176691692741735765791408" + ] + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "229472946872533695594496", + "outputIndex": 2, + "expectedQty": "226811833853844536582483", + "swapFee": "136798572727491968351", + "reserves": [ + "17275304604917660359638077", + "52423487382551286306081147", + "19949879858887891229208925" + ], + "mAssetSupply": "89531485098753151059111104", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mintMulti", + "inputQtys": [ + "2628733616244253557522432", + "2655255851055647847088128", + "220400500218675450609664" + ], + "expectedQty": "5506013152227631137976443", + "reserves": [ + "19904038221161913917160509", + "55078743233606934153169275", + "20170280359106566679818589" + ], + "mAssetSupply": "95037498250980782197087547" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "3144054771552021905408", + "expectedQty": "3162272475450613826713", + "reserves": [ + "19907182275933465939065917", + "55078743233606934153169275", + "20170280359106566679818589" + ] + }, + { + "type": "redeemMasset", + "inputQty": "52402304742774784", + "expectedQtys": [ + "10972874891440700", + "30359502932306142", + "11117895030947155" + ], + "redemptionFee": "15720691422832", + "reserves": [ + "19907182264960591047625217", + "55078743203247431220863133", + "20170280347988671648871434" + ], + "mAssetSupply": "95040660471069648759562308" + }, + { + "type": "redeemMasset", + "inputQty": "173256722168810180496588", + "expectedQtys": [ + "36279403087162521632274", + "100377034761071062393795", + "36758880357154472675444" + ], + "redemptionFee": "51977016650643054148", + "reserves": [ + "19870902861873428525992943", + "54978366168486360158469338", + "20133521467631517176195990" + ], + "mAssetSupply": "94867455725917489222119868" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "17055997474760634138624", + "expectedQty": "16949829824378290004667", + "reserves": [ + "19870902861873428525992943", + "54995422165961120792607962", + "20133521467631517176195990" + ] + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "78446560396932183752704", + "outputIndex": 2, + "expectedQty": "78412918529685531967004", + "swapFee": "47339317386687177030", + "reserves": [ + "19949349422270360709745647", + "54995422165961120792607962", + "20055108549101831644228986" + ], + "mAssetSupply": "94884452895059254199301565", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mintMulti", + "inputQtys": [ + "310408017050743993270272", + "524491789299288285118464", + "440335489888484348395520" + ], + "expectedQty": "1276197787851074810238304", + "reserves": [ + "20259757439321104703015919", + "55519913955260409077726426", + "20495444038990315992624506" + ], + "mAssetSupply": "96160650682910329009539869" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "2881954614807590663618560", + "expectedQty": "2894896122414462663409750", + "reserves": [ + "20259757439321104703015919", + "55519913955260409077726426", + "23377398653797906656243066" + ] + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "2865228032865025916928", + "expectedQty": "2846190138183524743255", + "swapFee": "1719136819719015550", + "reserves": [ + "20256911249182921178272664", + "55519913955260409077726426", + "23377398653797906656243066" + ], + "mAssetSupply": "99052683296428746366048241" + }, + { + "type": "mintMulti", + "inputQtys": [ + "3137774817746901008384", + "12158344401417901441024", + "39055268695209123250176" + ], + "expectedQty": "54444271463319260395956", + "reserves": [ + "20260049024000668079281048", + "55532072299661826979167450", + "23416453922493115779493242" + ], + "mAssetSupply": "99107127567892065626444197" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "69032344300966153027584", + "34589303578482702286848", + "256415423378194235392" + ], + "expectedQty": "104108144259658612775166", + "swapFee": "62502387988588320657", + "reserves": [ + "20191016679699701926253464", + "55497482996083344276880602", + "23416197507069737585257850" + ], + "mAssetSupply": "99003019423632407013669031" + }, + { + "type": "mintMulti", + "inputQtys": [ + "1384657163121906421858304", + "2775634157415901215850496", + "2646634508507123678183424" + ], + "expectedQty": "6808958597452137861674566", + "reserves": [ + "21575673842821608348111768", + "58273117153499245492731098", + "26062832015576861263441274" + ], + "mAssetSupply": "105811978021084544875343597" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "1015777468391714073870336", + "expectedQty": "1018572597440994067677949", + "reserves": [ + "21575673842821608348111768", + "58273117153499245492731098", + "27078609483968575337311610" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "384449750420787232768", + "488829146163064602624", + "539579094548224147456" + ], + "expectedQty": "1414104070717554927540", + "reserves": [ + "21576058292572029135344536", + "58273605982645408557333722", + "27079149063063123561459066" + ], + "mAssetSupply": "106831964722596256497949086" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "126489060939000643584", + "144635711894705061888", + "31191974159634567168" + ], + "expectedQty": "302437544664415031503", + "swapFee": "181571469680457293", + "reserves": [ + "21575931803511090134700952", + "58273461346933513852271834", + "27079117871088963926891898" + ], + "mAssetSupply": "106831662285051592082917583" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "60122428070167601741824", + "expectedQty": "59714295640027255820668", + "swapFee": "36073456842100561045", + "reserves": [ + "21516217507871062878880284", + "58273461346933513852271834", + "27079117871088963926891898" + ], + "mAssetSupply": "106771575930438266581736804" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "27545543681710110015488", + "expectedQty": "27615276771110578768429", + "reserves": [ + "21516217507871062878880284", + "58273461346933513852271834", + "27106663414770674036907386" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "9701081697242218233856", + "2180865535950836465664", + "15142655039054282752000" + ], + "expectedQty": "27112362099163471922096", + "swapFee": "16277183569639867073", + "reserves": [ + "21506516426173820660646428", + "58271280481397563015806170", + "27091520759731619754155386" + ], + "mAssetSupply": "106772078845110213688583137" + }, + { + "type": "redeemMasset", + "inputQty": "32448188880613566683545", + "expectedQtys": [ + "6533900626964402467422", + "17703413631789112603114", + "8230682318313585758421" + ], + "redemptionFee": "9734456664184070005", + "reserves": [ + "21499982525546856258179006", + "58253577067765773903203056", + "27083290077413306168396965" + ], + "mAssetSupply": "106739640390686264305969597" + }, + { + "type": "mintMulti", + "inputQtys": [ + "515663628469984533938176", + "578491733234267541471232", + "555951571175876493049856" + ], + "expectedQty": "1651722908002479896592051", + "reserves": [ + "22015646154016840792117182", + "58832068801000041444674288", + "27639241648589182661446821" + ], + "mAssetSupply": "108391363298688744202561648" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "277268498040899330113536", + "462915764439832441389056", + "6094565623142299992064000" + ], + "expectedQty": "6857092870303575669651931", + "swapFee": "4116725757636727438254", + "reserves": [ + "21738377655975941462003646", + "58369153036560209003285232", + "21544676025446882669382821" + ], + "mAssetSupply": "101534270428385168532909717" + }, + { + "type": "mintMulti", + "inputQtys": [ + "80810315822001766400", + "500173839856822321152", + "54615914026545020928" + ], + "expectedQty": "633308302598909253575", + "reserves": [ + "21738458466291763463770046", + "58369653210400065825606384", + "21544730641360909214403749" + ], + "mAssetSupply": "101534903736687767442163292" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "1014827315018363699200", + "4156830653850152075264", + "2626814665512954888192" + ], + "expectedQty": "7793244699043803284373", + "swapFee": "4678754071869403612", + "reserves": [ + "21737443638976745100070846", + "58365496379746215673531120", + "21542103826695396259515557" + ], + "mAssetSupply": "101527110491988723638878919" + }, + { + "type": "redeemMasset", + "inputQty": "19849628705155792", + "expectedQtys": [ + "4248626195378680", + "11407651283366009", + "4210446644128653" + ], + "redemptionFee": "5954888611546", + "reserves": [ + "21737443634728118904692166", + "58365496368338564390165111", + "21542103822484949615386904" + ], + "mAssetSupply": "101527110472145049822334673" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "195610785135969389510656", + "expectedQty": "194407688623577213208281", + "swapFee": "117366471081581633706", + "reserves": [ + "21737443634728118904692166", + "58365496368338564390165111", + "21347696133861372402178623" + ], + "mAssetSupply": "101331617053480162014457723" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "55311513280220634284032", + "expectedQty": "55616807132293032509457", + "swapFee": "33186907968132380570", + "reserves": [ + "21737443634728118904692166", + "58309879561206271357655654", + "21347696133861372402178623" + ], + "mAssetSupply": "101276338727107909512554261" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "1191457161912822530048", + "1241632845615045541888", + "1285179260478798430208" + ], + "expectedQty": "3724299923879802417330", + "swapFee": "2235921507232220782", + "reserves": [ + "21736252177566206082162118", + "58308637928360656312113766", + "21346410954600893603748415" + ], + "mAssetSupply": "101272614427184029710136931" + }, + { + "type": "redeemMasset", + "inputQty": "65241460651957479171686", + "expectedQtys": [ + "13998645317196649802007", + "37552101191133445000157", + "13747578621533909695926" + ], + "redemptionFee": "19572438195587243751", + "reserves": [ + "21722253532249009432360111", + "58271085827169522867113609", + "21332663375979359694052489" + ], + "mAssetSupply": "101207392538970267818208996" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "36806329693567958646784", + "outputIndex": 1, + "expectedQty": "37217304531196075294896", + "swapFee": "22208138854922909709", + "reserves": [ + "21722253532249009432360111", + "58233868522638326791818713", + "21369469705672927652699273" + ], + "mAssetSupply": "101207414747109122741118705", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mintMulti", + "inputQtys": [ + "150277756324764320", + "41199271037392424", + "3388716646649400" + ], + "expectedQty": "195432635038591149", + "reserves": [ + "21722253682526765757124431", + "58233868563837597829211137", + "21369469709061644299348673" + ], + "mAssetSupply": "101207414942541757779709854" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "539013459748958429511680", + "expectedQty": "535579286237446249626710", + "swapFee": "323408075849375057707", + "reserves": [ + "21722253682526765757124431", + "58233868563837597829211137", + "20833890422824198049721963" + ], + "mAssetSupply": "100668724890868648725255881" + }, + { + "type": "redeemMasset", + "inputQty": "3520670326046223604121", + "expectedQtys": [ + "759460805425069182170", + "2035992276348613347751", + "728401547643430361584" + ], + "redemptionFee": "1056201097813867081", + "reserves": [ + "21721494221721340687942261", + "58231832571561249215863386", + "20833162021276554619360379" + ], + "mAssetSupply": "100665205276743700315518841" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "926526768262389858041856", + "expectedQty": "920095489030353413071714", + "swapFee": "555916060957433914825", + "reserves": [ + "21721494221721340687942261", + "58231832571561249215863386", + "19913066532246201206288665" + ], + "mAssetSupply": "99739234424542267891391810" + }, + { + "type": "mintMulti", + "inputQtys": [ + "2344973137506747", + "3023642443528798", + "2596463427922735" + ], + "expectedQty": "7975278112256318", + "reserves": [ + "21721494224066313825449008", + "58231832574584891659392184", + "19913066534842664634211400" + ], + "mAssetSupply": "99739234432517546003648128" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "407668543454192271360", + "expectedQty": "405057204876844532825", + "reserves": [ + "21721494224066313825449008", + "58232240243128345851663544", + "19913066534842664634211400" + ] + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "194467382854751291965440", + "expectedQty": "195447532996625740083821", + "reserves": [ + "21915961606921065117414448", + "58232240243128345851663544", + "19913066534842664634211400" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "4595733388205228032000", + "19231418321811066060800", + "12189560483554256748544" + ], + "expectedQty": "36000100060508594167350", + "swapFee": "21613027853016966680", + "reserves": [ + "21911365873532859889382448", + "58213008824806534785602744", + "19900876974359110377462856" + ], + "mAssetSupply": "99899086922658539994097424" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "7959203316067012182016", + "8933412992125501440000", + "14151190326740682539008" + ], + "expectedQty": "31122893637802495374607", + "swapFee": "18684947150972080473", + "reserves": [ + "21903406670216792877200432", + "58204075411814409284162744", + "19886725784032369694923848" + ], + "mAssetSupply": "99867964029020737498722817" + }, + { + "type": "mintMulti", + "inputQtys": [ + "31510375999104847872", + "23637771301815517184", + "27463072337684750336" + ], + "expectedQty": "82804555443966052823", + "reserves": [ + "21903438180592791982048304", + "58204099049585711099679928", + "19886753247104707379674184" + ], + "mAssetSupply": "99868046833576181464775640" + }, + { + "type": "redeemMasset", + "inputQty": "12826936877057582930329", + "expectedQtys": [ + "2812408389195480890298", + "7473424724601358621834", + "2553465405973267864688" + ], + "redemptionFee": "3848081063117274879", + "reserves": [ + "21900625772203596501158006", + "58196625624861109741058094", + "19884199781698734111809496" + ], + "mAssetSupply": "99855223744780186999120190" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "12003915124744755200", + "outputIndex": 2, + "expectedQty": "11974738728300552851", + "swapFee": "7238162761414894", + "reserves": [ + "21900637776118721245913206", + "58196625624861109741058094", + "19884187806960005811256645" + ], + "mAssetSupply": "99855223752018349760535084", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemBassets", + "inputQtys": [ + "1412296197627905310720", + "1898592320490379411456", + "943214517332726120448" + ], + "expectedQty": "4255462708347062170300", + "swapFee": "2554810511315026317", + "reserves": [ + "21899225479921093340602486", + "58194727032540619361646638", + "19883244592442673085136197" + ], + "mAssetSupply": "99850968289310002698364784" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "52359609745139472269312", + "expectedQty": "52663407952910206229839", + "swapFee": "31415765847083683361", + "reserves": [ + "21899225479921093340602486", + "58142063624587709155416799", + "19883244592442673085136197" + ], + "mAssetSupply": "99798640095330710309778833" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "680427814855710561271808", + "outputIndex": 0, + "expectedQty": "672064477754376573478619", + "swapFee": "405637055776230306445", + "reserves": [ + "21227161002166716767123867", + "58822491439443419716688607", + "19883244592442673085136197" + ], + "mAssetSupply": "99799045732386486540085278", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemBassets", + "inputQtys": [ + "97932451924888485101568", + "248615846884492642877440", + "106744875088306753241088" + ], + "expectedQty": "452929873161320142137573", + "swapFee": "271921076542717715912", + "reserves": [ + "21129228550241828282022299", + "58573875592558927073811167", + "19776499717354366331895109" + ], + "mAssetSupply": "99346115859225166397947705" + }, + { + "type": "mintMulti", + "inputQtys": [ + "286703521760465780736", + "5572594658026912219136", + "20306020620813186629632" + ], + "expectedQty": "26269971091118365192462", + "reserves": [ + "21129515253763588747803035", + "58579448187216953986030303", + "19796805737975179518524741" + ], + "mAssetSupply": "99372385830316284763140167" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "387046888542407319617536", + "expectedQty": "384604818557234002019396", + "swapFee": "232228133125444391770", + "reserves": [ + "20744910435206354745783639", + "58579448187216953986030303", + "19796805737975179518524741" + ], + "mAssetSupply": "98985571169907002887914401" + }, + { + "type": "mintMulti", + "inputQtys": [ + "21411205330976624345088", + "6402924513294612955136", + "12054972267262405246976" + ], + "expectedQty": "40034566985835776784863", + "reserves": [ + "20766321640537331370128727", + "58585851111730248598985439", + "19808860710242441923771717" + ], + "mAssetSupply": "99025605736892838664699264" + }, + { + "type": "redeemMasset", + "inputQty": "273947965634644", + "expectedQtys": [ + "57431457826981", + "162025364704604", + "54783498405421" + ], + "redemptionFee": "82184389690", + "reserves": [ + "20766321640479899912301746", + "58585851111568223234280835", + "19808860710187658425366296" + ], + "mAssetSupply": "99025605736618972883454310" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "4701631303823863578624", + "expectedQty": "4730523782744923949990", + "swapFee": "2820978782294318147", + "reserves": [ + "20766321640479899912301746", + "58581120587785478310330845", + "19808860710187658425366296" + ], + "mAssetSupply": "99020906926293931314193833" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "269545463769613", + "expectedQty": "267808628565376", + "swapFee": "161727278261", + "reserves": [ + "20766321640212091283736370", + "58581120587785478310330845", + "19808860710187658425366296" + ], + "mAssetSupply": "99020906926024547577702481" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "1398797717382411807883264", + "expectedQty": "1388972989244303280451565", + "swapFee": "839278630429447084729", + "reserves": [ + "19377348650967788003284805", + "58581120587785478310330845", + "19808860710187658425366296" + ], + "mAssetSupply": "97622948487272565216903946" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "12226181415286243065856", + "expectedQty": "12132691665326468199421", + "swapFee": "7335708849171745839", + "reserves": [ + "19365215959302461535085384", + "58581120587785478310330845", + "19808860710187658425366296" + ], + "mAssetSupply": "97610729641566128145583929" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "944828736150104541495296", + "314780385500647770816512", + "93377970521709886832640" + ], + "expectedQty": "1358457246742857130485566", + "swapFee": "815563686257468759547", + "reserves": [ + "18420387223152356993590088", + "58266340202284830539514333", + "19715482739665948538533656" + ], + "mAssetSupply": "96252272394823271015098363" + }, + { + "type": "redeemMasset", + "inputQty": "715906345678082452488192", + "expectedQtys": [ + "136966282387535728123526", + "433244095748635932541384", + "146596070083349187346208" + ], + "redemptionFee": "214771903703424735746", + "reserves": [ + "18283420940764821265466562", + "57833096106536194606972949", + "19568886669582599351187448" + ], + "mAssetSupply": "95536580821048891987345917" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "55757327328504186929152", + "expectedQty": "55350228114693897179319", + "reserves": [ + "18283420940764821265466562", + "57888853433864698793902101", + "19568886669582599351187448" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "2195183512349389881344", + "2695780495443939557376", + "3387198301705735766016" + ], + "expectedQty": "8298095707009356659589", + "reserves": [ + "18285616124277170655347906", + "57891549214360142733459477", + "19572273867884305086953464" + ], + "mAssetSupply": "95600229144870595241184825" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "6397357692577970072322048", + "expectedQty": "6310369171256977837680599", + "swapFee": "3838414615546782043393", + "reserves": [ + "11975246953020192817667307", + "57891549214360142733459477", + "19572273867884305086953464" + ], + "mAssetSupply": "89206709866908171950906170" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "3942904485354544824320", + "expectedQty": "4025481853808973438587", + "reserves": [ + "11979189857505547362491627", + "57891549214360142733459477", + "19572273867884305086953464" + ] + }, + { + "type": "redeemMasset", + "inputQty": "8521796708484844303155", + "expectedQtys": [ + "1143960926146683177981", + "5528393075248916080177", + "1869067675446606155727" + ], + "redemptionFee": "2556539012545453290", + "reserves": [ + "11978045896579400679313646", + "57886020821284893817379300", + "19570404800208858480797737" + ], + "mAssetSupply": "89202216108592508625494892" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "191128206873393392254976", + "470908972307783427817472", + "276686306991778081800192" + ], + "expectedQty": "939484156999981808752277", + "swapFee": "564028911546917235592", + "reserves": [ + "11786917689706007287058670", + "57415111848977110389561828", + "19293718493217080398997545" + ], + "mAssetSupply": "88262731951592526816742615" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "420113853137171578880", + "expectedQty": "411115314254946446931", + "swapFee": "252068311882302947", + "reserves": [ + "11786506574391752340611739", + "57415111848977110389561828", + "19293718493217080398997545" + ], + "mAssetSupply": "88262312089807701527466682" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "91874697174951152058368", + "expectedQty": "92401567631331298413789", + "reserves": [ + "11786506574391752340611739", + "57415111848977110389561828", + "19385593190392031551055913" + ] + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "91394065118316593152", + "expectedQty": "93339668555173893754", + "reserves": [ + "11786597968456870657204891", + "57415111848977110389561828", + "19385593190392031551055913" + ] + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "150882450522004214775808", + "outputIndex": 2, + "expectedQty": "148367467618571068907944", + "swapFee": "89591641354566366620", + "reserves": [ + "11786597968456870657204891", + "57565994299499114604337636", + "19237225722773460482147969" + ], + "mAssetSupply": "88354896588748942566140845", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemMasset", + "inputQty": "29938350841598168268", + "expectedQtys": [ + "3992596420082148413", + "19499925540324544994", + "6516424735840313435" + ], + "redemptionFee": "8981505252479450", + "reserves": [ + "11786593975860450575056478", + "57565974799573574279792642", + "19237219206348724641834534" + ], + "mAssetSupply": "88354866659379606220452027" + }, + { + "type": "redeemMasset", + "inputQty": "2565913720894393837158", + "expectedQtys": [ + "342191792409890193903", + "1671271967018835385514", + "558500490869914207274" + ], + "redemptionFee": "769774116268318151", + "reserves": [ + "11786251784068040684862575", + "57564303527606555444407128", + "19236660705857854727627260" + ], + "mAssetSupply": "88352301515432828094933020" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "5110023859807853740032", + "expectedQty": "5140105652294360985478", + "reserves": [ + "11786251784068040684862575", + "57564303527606555444407128", + "19241770729717662581367292" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "8051965407696571596800", + "14905064389575763296256", + "11823711241430575874048" + ], + "expectedQty": "34867016678638236644217", + "reserves": [ + "11794303749475737256459375", + "57579208591996131207703384", + "19253594440959093157241340" + ], + "mAssetSupply": "88392308637763760692562715" + }, + { + "type": "redeemMasset", + "inputQty": "673453560638529204335411", + "expectedQtys": [ + "89832849746247757810552", + "438559537198842008611728", + "146647508257259453500440" + ], + "redemptionFee": "202036068191558761300", + "reserves": [ + "11704470899729489498648823", + "57140649054797289199091656", + "19106946932701833703740900" + ], + "mAssetSupply": "87719057113193423046988604" + }, + { + "type": "mintMulti", + "inputQtys": [ + "33199006425151766003712", + "126318238940143871328256", + "284375965997564619128832" + ], + "expectedQty": "444927389678825254019721", + "reserves": [ + "11737669906154641264652535", + "57266967293737433070419912", + "19391322898699398322869732" + ], + "mAssetSupply": "88163984502872248301008325" + }, + { + "type": "redeemMasset", + "inputQty": "887747262403216251289", + "expectedQtys": [ + "118154350210251397363", + "576463758412164729248", + "195197954545614083473" + ], + "redemptionFee": "266324178720964875", + "reserves": [ + "11737551751804431013255172", + "57266390829979020905690664", + "19391127700744852708786259" + ], + "mAssetSupply": "88163097021934023805721911" + }, + { + "type": "redeemMasset", + "inputQty": "24252223941794325961113", + "expectedQtys": [ + "3227839591686279974880", + "15748320220660126437894", + "5332581363084214150707" + ], + "redemptionFee": "7275667182538297788", + "reserves": [ + "11734323912212744733280292", + "57250642509758360779252770", + "19385795119381768494635552" + ], + "mAssetSupply": "88138852073659412018058586" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "149334913970753830912", + "outputIndex": 0, + "expectedQty": "146945459721752358358", + "swapFee": "90105216951746797", + "reserves": [ + "11734176966753022980921934", + "57250642509758360779252770", + "19385944454295739248466464" + ], + "mAssetSupply": "88138852163764628969805383", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "70883189579247857434624", + "expectedQty": "71279559847815611967287", + "reserves": [ + "11734176966753022980921934", + "57250642509758360779252770", + "19456827643874987105901088" + ] + }, + { + "type": "redeemMasset", + "inputQty": "255107136495190323", + "expectedQtys": [ + "33925516093856852", + "165521416572422530", + "56253022366879477" + ], + "redemptionFee": "76532140948557", + "reserves": [ + "11734176932827506887065082", + "57250642344236944206830240", + "19456827587621964739021611" + ], + "mAssetSupply": "88210131468581840227530904" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "38328274020722951585792", + "outputIndex": 2, + "expectedQty": "37699388573784267147866", + "swapFee": "22759667609467297341", + "reserves": [ + "11734176932827506887065082", + "57288970618257667158416032", + "19419128199048180471873745" + ], + "mAssetSupply": "88210154228249449694828245", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemBassets", + "inputQtys": [ + "250785555838722417623040", + "187990508327633871175680", + "166566873791608345591808" + ], + "expectedQty": "609791883595312511709273", + "swapFee": "366094787029405150115", + "reserves": [ + "11483391376988784469442042", + "57100980109930033287240352", + "19252561325256572126281937" + ], + "mAssetSupply": "87600362344654137183118972" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "2984707400681319424", + "outputIndex": 2, + "expectedQty": "3031998218295013447", + "swapFee": "1830634863621198", + "reserves": [ + "11483394361696185150761466", + "57100980109930033287240352", + "19252558293258353831268490" + ], + "mAssetSupply": "87600362346484772046740170", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemBassets", + "inputQtys": [ + "276931769211245492699136", + "9055811753909536851755008", + "2069104013263206571048960" + ], + "expectedQty": "11329714656085469810396616", + "swapFee": "6801909939615050916788", + "reserves": [ + "11206462592484939658062330", + "48045168356020496435485344", + "17183454279995147260219530" + ], + "mAssetSupply": "76270647690399302236343554" + }, + { + "type": "redeemMasset", + "inputQty": "1242189385505836441", + "expectedQtys": [ + "182460397783409949", + "782257599796845181", + "279776055766561583" + ], + "redemptionFee": "372656815651750", + "reserves": [ + "11206462410024541874652381", + "48045167573762896638640163", + "17183454000219091493657947" + ], + "mAssetSupply": "76270646448582573546158863" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "85683215856514039808", + "expectedQty": "86099578437003671899", + "reserves": [ + "11206462410024541874652381", + "48045167573762896638640163", + "17183539683434948007697755" + ] + }, + { + "type": "redeemMasset", + "inputQty": "9158013620177134105395", + "expectedQtys": [ + "1345183706470983698620", + "5767170247863469630031", + "2062650705987031988923" + ], + "redemptionFee": "2747404086053140231", + "reserves": [ + "11205117226318070890953761", + "48039400403515033169010132", + "17181477032728960975708832" + ], + "mAssetSupply": "76261577281944919468865598" + }, + { + "type": "redeemMasset", + "inputQty": "23626058376758660431872", + "expectedQtys": [ + "3470336482851106801167", + "14878281098482641874010", + "5321274679385058909185" + ], + "redemptionFee": "7087817513027598129", + "reserves": [ + "11201646889835219784152594", + "48024522122416550527136122", + "17176155758049575916799647" + ], + "mAssetSupply": "76237958311385673836031855" + }, + { + "type": "redeemMasset", + "inputQty": "260475598122417266255462", + "expectedQtys": [ + "38260210681012556990838", + "164031981397838435594041", + "58666671468567495956622" + ], + "redemptionFee": "78142679436725179876", + "reserves": [ + "11163386679154207227161756", + "47860490141018712091542081", + "17117489086581008420843025" + ], + "mAssetSupply": "75977560855942693294956269" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "950983018938669184581632", + "expectedQty": "933647599029819472328808", + "swapFee": "570589811363201510748", + "reserves": [ + "10229739080124387754832948", + "47860490141018712091542081", + "17117489086581008420843025" + ], + "mAssetSupply": "75027148426815387311885385" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "329519222148432400482304", + "expectedQty": "335798808273020984877762", + "reserves": [ + "10559258302272820155315252", + "47860490141018712091542081", + "17117489086581008420843025" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "674634044698641911775232", + "190624054227648661946368", + "286688579829498569031680" + ], + "expectedQty": "1164736736638725650745586", + "swapFee": "699261598942600951017", + "reserves": [ + "9884624257574178243540020", + "47669866086791063429595713", + "16830800506751509851811345" + ], + "mAssetSupply": "74198210498449682646017561" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "244373366940035583049728", + "expectedQty": "241923912873872326283922", + "reserves": [ + "9884624257574178243540020", + "47914239453731099012645441", + "16830800506751509851811345" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "236623640060871093256192", + "250821059428532984217600", + "463982801534122635296768" + ], + "expectedQty": "956069791320553586838375", + "reserves": [ + "10121247897635049336796212", + "48165060513159631996863041", + "17294783308285632487108113" + ], + "mAssetSupply": "75396204202644108559139858" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "7970490858829792", + "expectedQty": "8133460558228059", + "reserves": [ + "10121247905605540195626004", + "48165060513159631996863041", + "17294783308285632487108113" + ] + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "342915697570779735523328", + "expectedQty": "339545588194260621462931", + "reserves": [ + "10121247905605540195626004", + "48507976210730411732386369", + "17294783308285632487108113" + ] + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "137322020015283323797504", + "expectedQty": "135962836693487157890205", + "reserves": [ + "10121247905605540195626004", + "48645298230745695056183873", + "17294783308285632487108113" + ] + }, + { + "type": "redeemMasset", + "inputQty": "1962952100477226136371", + "expectedQtys": [ + "261778255536200836399", + "1258173046411609522390", + "447316205130413634200" + ], + "redemptionFee": "588885630143167840", + "reserves": [ + "10120986127350003994789605", + "48644040057699283446661483", + "17294335992080502073473913" + ], + "mAssetSupply": "75869750272450469813752522" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "5332734158427140096", + "expectedQty": "5279845062515207602", + "reserves": [ + "10120986127350003994789605", + "48644045390433441873801579", + "17294335992080502073473913" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "5114901599432346697728", + "15070755505390110113792", + "18303137464550623805440" + ], + "expectedQty": "38532486111523605860893", + "reserves": [ + "10126101028949436341487333", + "48659116145938831983915371", + "17312639129545052697279353" + ], + "mAssetSupply": "75908288038407055934821017" + }, + { + "type": "mintMulti", + "inputQtys": [ + "827775218569272017027072", + "1636071015809919249022976", + "968643809266224949362688" + ], + "expectedQty": "3437580007741513279472394", + "reserves": [ + "10953876247518708358514405", + "50295187161748751232938347", + "18281282938811277646642041" + ], + "mAssetSupply": "79345868046148569214293411" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "22623708646651035648", + "expectedQty": "23053430407234256308", + "reserves": [ + "10953898871227355009550053", + "50295187161748751232938347", + "18281282938811277646642041" + ] + }, + { + "type": "redeemMasset", + "inputQty": "57104899504392149401", + "expectedQtys": [ + "7881109269409465723", + "36186372579020214666", + "13153014293769836571" + ], + "redemptionFee": "17131469851317644", + "reserves": [ + "10953890990118085600084330", + "50295150975376172212723681", + "18281269785796983876805470" + ], + "mAssetSupply": "79345834011810941907717962" + }, + { + "type": "redeemMasset", + "inputQty": "17014128523766044976742", + "expectedQtys": [ + "2348138376624989800425", + "10781554633871286227801", + "3918876972227568406924" + ], + "redemptionFee": "5104238557129813493", + "reserves": [ + "10951542851741460610283905", + "50284369420742300926495880", + "18277350908824756308398546" + ], + "mAssetSupply": "79328824987525732992554713" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "35888919417747262144512", + "expectedQty": "36208185193140156003735", + "swapFee": "21533351650648357286", + "reserves": [ + "10951542851741460610283905", + "50248161235549160770492145", + "18277350908824756308398546" + ], + "mAssetSupply": "79292957601459636378767487" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "20015581940297756672", + "expectedQty": "19631211919618401970", + "swapFee": "12009349164178654", + "reserves": [ + "10951523220529540991881935", + "50248161235549160770492145", + "18277350908824756308398546" + ], + "mAssetSupply": "79292937597887045245189469" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "150848363188773280", + "expectedQty": "151515876227361218", + "reserves": [ + "10951523220529540991881935", + "50248161235549160770492145", + "18277351059673119497171826" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "160268162246656851968", + "48973998172072181760", + "270353971836734865408" + ], + "expectedQty": "483371623058647727537", + "reserves": [ + "10951683488691787648733903", + "50248210209547332842673905", + "18277621413644956232037234" + ], + "mAssetSupply": "79293421121025980120278224" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "482114925608891523792896", + "outputIndex": 2, + "expectedQty": "474980260180642331933491", + "swapFee": "286528995684164526618", + "reserves": [ + "10951683488691787648733903", + "50730325135156224366466801", + "17802641153464313900103743" + ], + "mAssetSupply": "79293707650021664284804842", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "12437189326328580", + "expectedQty": "12499894850917236", + "reserves": [ + "10951683488691787648733903", + "50730325135156224366466801", + "17802641165901503226432323" + ] + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "66674912842169188352", + "expectedQty": "66300632688539329003", + "swapFee": "40004947705301513", + "reserves": [ + "10951683488691787648733903", + "50730325135156224366466801", + "17802574865268814687103320" + ], + "mAssetSupply": "79293641027613664671835239" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "6139046977958134784", + "11520284051868344320", + "61160491826895298560" + ], + "expectedQty": "79134692628357411291", + "swapFee": "47509321169716276", + "reserves": [ + "10951677349644809690599119", + "50730313614872172498122481", + "17802513704776987791804760" + ], + "mAssetSupply": "79293561892921036314423948" + }, + { + "type": "redeemMasset", + "inputQty": "288140812179912510773657", + "expectedQtys": [ + "39784800220694394091141", + "184290983733767558923138", + "64672234997289929330572" + ], + "redemptionFee": "86442243653973753232", + "reserves": [ + "10911892549424115296507978", + "50546022631138404939199343", + "17737841469779697862474188" + ], + "mAssetSupply": "79005507522984777777403523" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "144919497598514457739264", + "expectedQty": "144095252985673124297850", + "swapFee": "86951698559108674643", + "reserves": [ + "10911892549424115296507978", + "50546022631138404939199343", + "17593746216794024738176338" + ], + "mAssetSupply": "78860674977084822428338902" + }, + { + "type": "redeemMasset", + "inputQty": "660462566242498222489", + "expectedQtys": [ + "91360294454515617756", + "423198770531252035632", + "147304404588290472239" + ], + "redemptionFee": "198138769872749466", + "reserves": [ + "10911801189129660780890222", + "50545599432367873687163711", + "17593598912389436447704099" + ], + "mAssetSupply": "78860014712657349802865879" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "1543154790090323613712384", + "1925962901738677507981312", + "1165222948394072411209728" + ], + "expectedQty": "4654102072592744451972247", + "swapFee": "2794137726191361488076", + "reserves": [ + "9368646399039337167177838", + "48619636530629196179182399", + "16428375963995364036494371" + ], + "mAssetSupply": "74205912640064605350893632" + }, + { + "type": "mintMulti", + "inputQtys": [ + "10875206034879454117888", + "4317351866570876387328", + "12629959636085848932352" + ], + "expectedQty": "28110013623496292903370", + "reserves": [ + "9379521605074216621295726", + "48623953882495767055569727", + "16441005923631449885426723" + ], + "mAssetSupply": "74234022653688101643797002" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "150045661456683237376000", + "100846477423064817598464", + "127446424979941678383104" + ], + "expectedQty": "381641069275945446185879", + "swapFee": "229122114834467948480", + "reserves": [ + "9229475943617533383919726", + "48523107405072702237971263", + "16313559498651508207043619" + ], + "mAssetSupply": "73852381584412156197611123" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "5648262609466530", + "outputIndex": 0, + "expectedQty": "5538446601894799", + "swapFee": "3408121294284", + "reserves": [ + "9229475938079086782024927", + "48523107405072702237971263", + "16313559504299770816510149" + ], + "mAssetSupply": "73852381584415564318905407", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "232369024485586741755904", + "expectedQty": "233649477710508662033277", + "reserves": [ + "9229475938079086782024927", + "48523107405072702237971263", + "16545928528785357558266053" + ] + }, + { + "type": "redeemMasset", + "inputQty": "61552816550783430636339", + "expectedQtys": [ + "7665815013472943688326", + "40302306191784029206348", + "13742711739948654736079" + ], + "redemptionFee": "18465844965235029190", + "reserves": [ + "9221810123065613838336601", + "48482805098880918208764915", + "16532185817045408903529974" + ], + "mAssetSupply": "74024496711420254785331535" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "2605659182888407531520", + "outputIndex": 2, + "expectedQty": "2561774876302031621717", + "swapFee": "1546247388242544853", + "reserves": [ + "9221810123065613838336601", + "48485410758063806616296435", + "16529624042169106871908257" + ], + "mAssetSupply": "74024498257667643027876388", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "1392433154445977499729920", + "outputIndex": 0, + "expectedQty": "1334511297107835821004544", + "swapFee": "826106201860742967825", + "reserves": [ + "7887298825957778017332057", + "49877843912509784116026355", + "16529624042169106871908257" + ], + "mAssetSupply": "74025324363869503770844213", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mintMulti", + "inputQtys": [ + "36153519993453446955008", + "55446938144935635845120", + "3695698214161582915584" + ], + "expectedQty": "95908653896795159370165", + "reserves": [ + "7923452345951231464287065", + "49933290850654719751871475", + "16533319740383268454823841" + ], + "mAssetSupply": "74121233017766298930214378" + }, + { + "type": "mintMulti", + "inputQtys": [ + "2714852406346695311360", + "26168620926424770936832", + "6928687532448325566464" + ], + "expectedQty": "35609191598104323204801", + "reserves": [ + "7926167198357578159598425", + "49959459471581144522808307", + "16540248427915716780390305" + ], + "mAssetSupply": "74156842209364403253419179" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "1446253321933116432973824", + "expectedQty": "1384419321844971918672158", + "swapFee": "867751993159869859784", + "reserves": [ + "6541747876512606240926267", + "49959459471581144522808307", + "16540248427915716780390305" + ], + "mAssetSupply": "72711456639424446690305139" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "3628017445518972416", + "16914670984400357376", + "16367377513756526592" + ], + "expectedQty": "36933359421666438976", + "swapFee": "22173319644786735", + "reserves": [ + "6541744248495160721953851", + "49959442556910160122450931", + "16540232060538203023863713" + ], + "mAssetSupply": "72711419706065025023866163" + }, + { + "type": "redeemMasset", + "inputQty": "4934960908990465179648", + "expectedQtys": [ + "443858300357212432970", + "3389755456307385924471", + "1122257155130021639501" + ], + "redemptionFee": "1480488272697139553", + "reserves": [ + "6541300390194803509520881", + "49956052801453852736526460", + "16539109803383073002224212" + ], + "mAssetSupply": "72706486225644307255826068" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "659167453271573397504", + "expectedQty": "625363130324106895739", + "swapFee": "395500471962944038", + "reserves": [ + "6540675027064479402625142", + "49956052801453852736526460", + "16539109803383073002224212" + ], + "mAssetSupply": "72705827453691507645372602" + }, + { + "type": "mintMulti", + "inputQtys": [ + "6173787821021860864", + "15770108363569975296", + "34357338190174224384" + ], + "expectedQty": "56577680406000026967", + "reserves": [ + "6540681200852300424486006", + "49956068571562216306501756", + "16539144160721263176448596" + ], + "mAssetSupply": "72705884031371913645399569" + }, + { + "type": "mintMulti", + "inputQtys": [ + "1028059507842020016128", + "802690023124378058752", + "2431843916836574855168" + ], + "expectedQty": "4318568578867397338783", + "reserves": [ + "6541709260360142444502134", + "49956871261585340684560508", + "16541576004638099751303764" + ], + "mAssetSupply": "72710202599950781042738352" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "13183212393716692", + "expectedQty": "13256056899181222", + "reserves": [ + "6541709260360142444502134", + "49956871261585340684560508", + "16541576017821312145020456" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "323617598634154075881472", + "206158302700372890746880", + "1713277120544207372550144" + ], + "expectedQty": "2269607431291020557855677", + "swapFee": "1362582007979399974698", + "reserves": [ + "6218091661725988368620662", + "49750712958884967793813628", + "14828298897277104772470312" + ], + "mAssetSupply": "70440595181915817384063897" + }, + { + "type": "redeemMasset", + "inputQty": "14273434019532538013286", + "expectedQtys": [ + "1259598882939476264377", + "10078002364323384145919", + "3003768638836443131177" + ], + "redemptionFee": "4282030205859761403", + "reserves": [ + "6216832062843048892356285", + "49740634956520644409667709", + "14825295128638268329339135" + ], + "mAssetSupply": "70426326029926490705812014" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "200060920544874419191808", + "expectedQty": "188555597422455764708445", + "swapFee": "120036552326924651515", + "reserves": [ + "6028276465420593127647840", + "49740634956520644409667709", + "14825295128638268329339135" + ], + "mAssetSupply": "70226385145933943211271721" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "611788053033218002124800", + "826417428879840055918592", + "1371103047735865931464704" + ], + "expectedQty": "2849135412764532855403411", + "swapFee": "1710507552190033733482", + "reserves": [ + "5416488412387375125523040", + "48914217527640804353749117", + "13454192080902402397874431" + ], + "mAssetSupply": "67377249733169410355868310" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "5609309248026424320", + "7858922839303515136", + "1011994219915180928" + ], + "expectedQty": "14756425010822166735", + "swapFee": "8859170508798579", + "reserves": [ + "5416482803078127099098720", + "48914209668717965050233981", + "13454191068908182482693503" + ], + "mAssetSupply": "67377234976744399533701575" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "75261381691762704121856", + "outputIndex": 0, + "expectedQty": "68520242879312473574058", + "swapFee": "44264813792022303435", + "reserves": [ + "5347962560198814625524662", + "48989471050409727754355837", + "13454191068908182482693503" + ], + "mAssetSupply": "67377279241558191556005010", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemMasset", + "inputQty": "78575794360839756", + "expectedQtys": [ + "6234955536741601", + "57114680652595917", + "15685652648688315" + ], + "redemptionFee": "23572738308251", + "reserves": [ + "5347962553963859088783061", + "48989470993295047101759920", + "13454191053222529834005188" + ], + "mAssetSupply": "67377279163005969933473505" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "3849959217103486977048576", + "expectedQty": "3921660960248633767519448", + "swapFee": "2309975530262092186229", + "reserves": [ + "5347962553963859088783061", + "45067810033046413334240472", + "13454191053222529834005188" + ], + "mAssetSupply": "63529629921432745048611158" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "179357815468350240718848", + "1624812624702655374032896", + "3014615133648636495265792" + ], + "expectedQty": "4836266062800704418972911", + "swapFee": "2903501738723656845491", + "reserves": [ + "5168604738495508848064213", + "43442997408343757960207576", + "10439575919573893338739396" + ], + "mAssetSupply": "58693363858632040629638247" + }, + { + "type": "redeemMasset", + "inputQty": "14598126539829760819", + "expectedQtys": [ + "1285142058049304895", + "10801836457210071619", + "2595736907974205275" + ], + "redemptionFee": "4379437961948928", + "reserves": [ + "5168603453353450798759318", + "43442986606507300750135957", + "10439573323836985364534121" + ], + "mAssetSupply": "58693349264884938761826356" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "121549258367048515584", + "expectedQty": "113966093476879203337", + "swapFee": "72929555020229109", + "reserves": [ + "5168489487259973919555981", + "43442986606507300750135957", + "10439573323836985364534121" + ], + "mAssetSupply": "58693227788556126733539881" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "85689660743704356323328", + "expectedQty": "87389861007747960070431", + "swapFee": "51413796446222613793", + "reserves": [ + "5168489487259973919555981", + "43355596745499552790065526", + "10439573323836985364534121" + ], + "mAssetSupply": "58607589541608868599830346" + }, + { + "type": "redeemMasset", + "inputQty": "1335720357671089261772", + "expectedQtys": [ + "117759245577816598092", + "987817113087079636634", + "237856008375296959239" + ], + "redemptionFee": "400716107301326778", + "reserves": [ + "5168371728014396102957889", + "43354608928386465710428892", + "10439335467828610067574882" + ], + "mAssetSupply": "58606254221967304811895352" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "100541374105264886644736", + "218674157371271547977728", + "92986087860219720761344" + ], + "expectedQty": "416037336409059974125837", + "swapFee": "249772265204558719707", + "reserves": [ + "5067830353909131216313153", + "43135934771015194162451164", + "10346349379968390346813538" + ], + "mAssetSupply": "58190216885558244837769515" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "1744856965371707260928", + "outputIndex": 2, + "expectedQty": "1680187846240828691480", + "swapFee": "1025650253736105974", + "reserves": [ + "5067830353909131216313153", + "43137679627980565869712092", + "10344669192122149518122058" + ], + "mAssetSupply": "58190217911208498573875489", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mintMulti", + "inputQtys": [ + "3583029704247471505408", + "2766538259526872203264", + "462532128733035560960" + ], + "expectedQty": "7005776349106054415400", + "reserves": [ + "5071413383613378687818561", + "43140446166240092741915356", + "10345131724250882553683018" + ], + "mAssetSupply": "58197223687557604628290889" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "777115428505640570454016", + "expectedQty": "788901838851870089389325", + "reserves": [ + "5071413383613378687818561", + "43140446166240092741915356", + "11122247152756523124137034" + ] + }, + { + "type": "redeemMasset", + "inputQty": "244900631370024670881382", + "expectedQtys": [ + "21049352382494280564739", + "179058259424359299567349", + "46163876200673308568336" + ], + "redemptionFee": "73470189411007401264", + "reserves": [ + "5050364031230884407253822", + "42961387906815733442348007", + "11076083276555849815568698" + ], + "mAssetSupply": "58741298365228861054200096" + }, + { + "type": "mintMulti", + "inputQtys": [ + "170080154260900860133376", + "56622354833897798238208", + "42523257119277393641472" + ], + "expectedQty": "279729858224919017438117", + "reserves": [ + "5220444185491785267387198", + "43018010261649631240586215", + "11118606533675127209210170" + ], + "mAssetSupply": "59021028223453780071638213" + }, + { + "type": "mintMulti", + "inputQtys": [ + "51111686215108435968", + "291437811141211095040", + "219875368924249882624" + ], + "expectedQty": "563078804062118093810", + "reserves": [ + "5220495297178000375823166", + "43018301699460772451681255", + "11118826409044051459092794" + ], + "mAssetSupply": "59021591302257842189732023" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "577118266122724848959488", + "expectedQty": "539073057690981297122792", + "swapFee": "346270959673634909375", + "reserves": [ + "4681422239487019078700374", + "43018301699460772451681255", + "11118826409044051459092794" + ], + "mAssetSupply": "58444819307094790975681910" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "12246426359061737897984", + "expectedQty": "12415543789353332899223", + "reserves": [ + "4681422239487019078700374", + "43018301699460772451681255", + "11131072835403113196990778" + ] + }, + { + "type": "redeemMasset", + "inputQty": "103054531677790607612313", + "expectedQtys": [ + "8250425206968047187888", + "75814413343983875984769", + "19617133256467451895341" + ], + "redemptionFee": "30916359503337182283", + "reserves": [ + "4673171814280051031512486", + "42942487286116788575696486", + "11111455702146645745095437" + ], + "mAssetSupply": "58354211235565857038151103" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "582479030058565047943168", + "outputIndex": 1, + "expectedQty": "634255945654565623768019", + "swapFee": "373718803277399637359", + "reserves": [ + "5255650844338616079455654", + "42308231340462222951928467", + "11111455702146645745095437" + ], + "mAssetSupply": "58354584954369134437788462", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemBassets", + "inputQtys": [ + "18658933049678773616640", + "7871038149242967293952", + "10144565261021919313920" + ], + "expectedQty": "37777905587388181485815", + "swapFee": "22680351563370931450", + "reserves": [ + "5236991911288937305839014", + "42300360302312979984634515", + "11101311136885623825781517" + ], + "mAssetSupply": "58316807048781746256302647" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "4310628707559", + "13305714539820", + "14993945947731" + ], + "expectedQty": "32816316716122", + "swapFee": "19701610996", + "reserves": [ + "5236991911284626677131455", + "42300360302299674270094695", + "11101311136870629879833786" + ], + "mAssetSupply": "58316807048748929939586525" + }, + { + "type": "redeemMasset", + "inputQty": "4675462024571608524390", + "expectedQtys": [ + "419741965239913197903", + "3390350159866552046940", + "889763862970488873181" + ], + "redemptionFee": "1402638607371482557", + "reserves": [ + "5236572169319386763933552", + "42296969952139807718047755", + "11100421373007659390960605" + ], + "mAssetSupply": "58312132989362965702544692" + }, + { + "type": "redeemMasset", + "inputQty": "390511489015477436416", + "expectedQtys": [ + "35058366207805950461", + "283174300690563018036", + "74316294127660100808" + ], + "redemptionFee": "117153446704643230", + "reserves": [ + "5236537110953178957983091", + "42296686777839117155029719", + "11100347056713531730859797" + ], + "mAssetSupply": "58311742595027396929751506" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "1463709176019118966439936", + "expectedQty": "1489565177172741831411841", + "swapFee": "878225505611471379863", + "reserves": [ + "5236537110953178957983091", + "40807121600666375323617878", + "11100347056713531730859797" + ], + "mAssetSupply": "56848911644513889434691433" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "843122617982600454602752", + "596911720105299652116480", + "14279034566748802121728" + ], + "expectedQty": "1498528669793154655677178", + "swapFee": "899656996073536915555", + "reserves": [ + "4393414492970578503380339", + "40210209880561075671501398", + "11086068022146782928738069" + ], + "mAssetSupply": "55350382974720734779014255" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "674828184709284495360", + "expectedQty": "726679623669027114025", + "reserves": [ + "4394089321155287787875699", + "40210209880561075671501398", + "11086068022146782928738069" + ] + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "271056172551403695243264", + "outputIndex": 2, + "expectedQty": "287172579153877376178054", + "swapFee": "174406270235431842028", + "reserves": [ + "4665145493706691483118963", + "40210209880561075671501398", + "10798895442992905552560015" + ], + "mAssetSupply": "55351284060614639237970308", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "65165532415990733733888", + "expectedQty": "64341246935247448463822", + "swapFee": "39099319449594440240", + "reserves": [ + "4665145493706691483118963", + "40210209880561075671501398", + "10734554196057658104096193" + ], + "mAssetSupply": "55286157627518098098676660" + }, + { + "type": "mintMulti", + "inputQtys": [ + "128684332002404384", + "27647513944750872", + "199568059046109056" + ], + "expectedQty": "366625792941016234", + "reserves": [ + "4665145622391023485523347", + "40210209908208589616252270", + "10734554395625717150205249" + ], + "mAssetSupply": "55286157994143891039692894" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "4102215950111648121880576", + "expectedQty": "4130311535949077273212344", + "reserves": [ + "4665145622391023485523347", + "40210209908208589616252270", + "14836770345737365272085825" + ] + }, + { + "type": "redeemMasset", + "inputQty": "46875555432201324", + "expectedQtys": [ + "3679378622846175", + "31713605261606435", + "11701691664279733" + ], + "redemptionFee": "14062666629660", + "reserves": [ + "4665145618711644862677172", + "40210209876494984354645835", + "14836770334035673607806092" + ], + "mAssetSupply": "59416469483231475547333574" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "1075515157584180674560", + "expectedQty": "1078457704192181963584", + "reserves": [ + "4665145618711644862677172", + "40210209876494984354645835", + "14837845849193257788480652" + ] + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "984527911610019479552", + "expectedQty": "1000259803466636336286", + "swapFee": "590716746966011687", + "reserves": [ + "4665145618711644862677172", + "40209209616691517718309549", + "14837845849193257788480652" + ], + "mAssetSupply": "59416564003740804675829293" + }, + { + "type": "mintMulti", + "inputQtys": [ + "418078387998516045676544", + "66006323037268403552256", + "833364000410807971086336" + ], + "expectedQty": "1344784533831690454257739", + "reserves": [ + "5083224006710160908353716", + "40275215939728786121861805", + "15671209849604065759566988" + ], + "mAssetSupply": "60761348537572495130087032" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "14679780636831969705984", + "12897107530294048587776", + "38544027526762384588800" + ], + "expectedQty": "66862463179989808541263", + "swapFee": "40141562845701305908", + "reserves": [ + "5068544226073328938647732", + "40262318832198492073274029", + "15632665822077303374978188" + ], + "mAssetSupply": "60694486074392505321545769" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "11734474455689130409984", + "expectedQty": "11756468152030423743749", + "reserves": [ + "5068544226073328938647732", + "40262318832198492073274029", + "15644400296532992505388172" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "36964011342256899358720", + "2954062475615930941440", + "26035350945937777229824" + ], + "expectedQty": "68114988149521040114902", + "reserves": [ + "5105508237415585838006452", + "40265272894674108004215469", + "15670435647478930282617996" + ], + "mAssetSupply": "60774357530694056785404420" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "5725303964074092003328", + "expectedQty": "5641153881280677168750", + "reserves": [ + "5105508237415585838006452", + "40270998198638182096218797", + "15670435647478930282617996" + ] + }, + { + "type": "redeemMasset", + "inputQty": "32838374433631485558784", + "expectedQtys": [ + "2757589631857388297573", + "21751191445207872011506", + "8463923444779437119678" + ], + "redemptionFee": "9851512330089445667", + "reserves": [ + "5102750647783728449708879", + "40249247007192974224207291", + "15661971724034150845498318" + ], + "mAssetSupply": "60747170161654036066460053" + }, + { + "type": "mintMulti", + "inputQtys": [ + "336834941450031267840", + "1901156200345806569472", + "3738689152600020353024" + ], + "expectedQty": "5975201280301430272431", + "reserves": [ + "5103087482725178480976719", + "40251148163393320030776763", + "15665710413186750865851342" + ], + "mAssetSupply": "60753145362934337496732484" + }, + { + "type": "redeemMasset", + "inputQty": "2871727892365050275430", + "expectedQtys": [ + "241144424213805863193", + "1902052430154036702812", + "740277083290517018940" + ], + "redemptionFee": "861518367709515082", + "reserves": [ + "5102846338300964675113526", + "40249246110963165994073951", + "15664970136103460348832402" + ], + "mAssetSupply": "60750274496560340155972136" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "4477551033722209304576", + "outputIndex": 2, + "expectedQty": "4400901183970624345780", + "swapFee": "2647041450317777636", + "reserves": [ + "5102846338300964675113526", + "40253723661996888203378527", + "15660569234919489724486622" + ], + "mAssetSupply": "60750277143601790473749772", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemMasset", + "inputQty": "1792845365698511257", + "expectedQtys": [ + "150548610725719055", + "1187600364989319012", + "462031733896199272" + ], + "redemptionFee": "537853609709553", + "reserves": [ + "5102846187752353949394471", + "40253722474396523214059515", + "15660568772887755828287350" + ], + "mAssetSupply": "60750275351294278384948068" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "543015485613314144206848", + "expectedQty": "543844873527602115637699", + "reserves": [ + "5102846187752353949394471", + "40253722474396523214059515", + "16203584258501069972494198" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "1792235929362944917241856", + "1154339481204775322648576", + "12478567043063229710336" + ], + "expectedQty": "3023484261786013607884651", + "reserves": [ + "6895082117115298866636327", + "41408061955601298536708091", + "16216062825544133202204534" + ], + "mAssetSupply": "64317604486607894108470418" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "296707145004897665024", + "expectedQty": "295782000681162118414", + "swapFee": "178024287002938599", + "reserves": [ + "6895082117115298866636327", + "41408061955601298536708091", + "16215767043543452040086120" + ], + "mAssetSupply": "64317307957487176213743993" + }, + { + "type": "mintMulti", + "inputQtys": [ + "254894147795609037307904", + "21425435337850424918016", + "134279890525061113708544" + ], + "expectedQty": "418954946113866874671882", + "reserves": [ + "7149976264910907903944231", + "41429487390939148961626107", + "16350046934068513153794664" + ], + "mAssetSupply": "64736262903601043088415875" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "40828163576856190976", + "outputIndex": 2, + "expectedQty": "41974934645372514506", + "swapFee": "25262911003009048", + "reserves": [ + "7150017093074484760135207", + "41429487390939148961626107", + "16350004959133867781280158" + ], + "mAssetSupply": "64736262928863954091424923", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "11688386672771353999835136", + "outputIndex": 0, + "hardLimitError": true + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "37781047031865800", + "outputIndex": 0, + "expectedQty": "36209092651249920", + "swapFee": "22418252681046", + "reserves": [ + "7150017056865392108885287", + "41429487428720195993491907", + "16350004959133867781280158" + ], + "mAssetSupply": "64736262928886372344105969", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemMasset", + "inputQty": "53453199565649357465190", + "expectedQtys": [ + "5902049546350046522358", + "34198364219202499422666", + "13496267013687735221980" + ], + "redemptionFee": "16035959869694807239", + "reserves": [ + "7144115007319042062362929", + "41395289064500993494069241", + "16336508692120180046058178" + ], + "mAssetSupply": "64682825765280592681448018" + }, + { + "type": "redeemMasset", + "inputQty": "168365788738191564", + "expectedQtys": [ + "18590154286698583", + "107717304335550684", + "42510264291850316" + ], + "redemptionFee": "50509736621457", + "reserves": [ + "7144114988728887775664346", + "41395288956783689158518557", + "16336508649609915754207862" + ], + "mAssetSupply": "64682825596965313679877911" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "5569596195294221312", + "24907220969525563392", + "25910524904004841472" + ], + "expectedQty": "56351002390298280392", + "swapFee": "33830899974163466", + "reserves": [ + "7144109419132692481443034", + "41395264049562719632955165", + "16336482739085011749366390" + ], + "mAssetSupply": "64682769245962923381597519" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "1225378062476222464", + "expectedQty": "1238320119477210834", + "swapFee": "735226837485733", + "reserves": [ + "7144109419132692481443034", + "41395262811242600155744331", + "16336482739085011749366390" + ], + "mAssetSupply": "64682768021320087742860788" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "58568531783281593548800", + "expectedQty": "57921002822089652283514", + "reserves": [ + "7144109419132692481443034", + "41453831343025881749293131", + "16336482739085011749366390" + ] + }, + { + "type": "redeemMasset", + "inputQty": "34885899091798372279910", + "expectedQtys": [ + "3848490268610355227841", + "22330938282243978974109", + "8800368409296051105823" + ], + "redemptionFee": "10465769727539511683", + "reserves": [ + "7140260928864082126215193", + "41431500404743637770319022", + "16327682370675715698260567" + ], + "mAssetSupply": "64705813590820106562376075" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "48729743507189", + "expectedQty": "48578429166846", + "swapFee": "29237846104", + "reserves": [ + "7140260928864082126215193", + "41431500404743637770319022", + "16327682370627137269093721" + ], + "mAssetSupply": "64705813590771406056714990" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "97954185420221808640", + "expectedQty": "94919562436896137676", + "swapFee": "58772511252133085", + "reserves": [ + "7140166009301645230077517", + "41431500404743637770319022", + "16327682370627137269093721" + ], + "mAssetSupply": "64705715695358497087039435" + }, + { + "type": "redeemMasset", + "inputQty": "124957890181059733094", + "expectedQtys": [ + "13784754630336513485", + "79987365322047820492", + "31522109551508860135" + ], + "redemptionFee": "37487367054317919", + "reserves": [ + "7140152224547014893564032", + "41431420417378315722498530", + "16327650848517585760233586" + ], + "mAssetSupply": "64705590774955683081624260" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "22130712160327960625152", + "45331926017002417684480", + "28108471535004721086464" + ], + "expectedQty": "95834810965146773633996", + "swapFee": "57535407823782333580", + "reserves": [ + "7118021512386686932938880", + "41386088491361313304814050", + "16299542376982581039147122" + ], + "mAssetSupply": "64609755963990536307990264" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "954180845428498497536", + "outputIndex": 2, + "expectedQty": "981148926278086286698", + "swapFee": "590526475089082859", + "reserves": [ + "7118975693232115431436416", + "41386088491361313304814050", + "16298561228056302952860424" + ], + "mAssetSupply": "64609756554517011397073123", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemMasset", + "inputQty": "22130226710588444744089", + "expectedQtys": [ + "2437670269531030263809", + "14171369847979955540393", + "5580931843823418323920" + ], + "redemptionFee": "6639068013176533423", + "reserves": [ + "7116538022962584401172607", + "41371917121513333349273657", + "16292980296212479534536504" + ], + "mAssetSupply": "64587632966874436128862457" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "5691420553259389722558464", + "expectedQty": "5788399922673312593939493", + "reserves": [ + "12807958576221974123731071", + "41371917121513333349273657", + "16292980296212479534536504" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "73339142364276645888", + "42647459535732924416", + "131797517375960203264" + ], + "expectedQty": "248682904148017853926", + "reserves": [ + "12808031915364338400376959", + "41371959768972869082198073", + "16293112093729855494739768" + ], + "mAssetSupply": "70376281572451896740655876" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "298069525922718874075136", + "expectedQty": "300639959095033972584461", + "reserves": [ + "13106101441287057274452095", + "41371959768972869082198073", + "16293112093729855494739768" + ] + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "10620127050537003008", + "expectedQty": "10570304927127585880", + "swapFee": "6372076230322201", + "reserves": [ + "13106101441287057274452095", + "41371959768972869082198073", + "16293101523424928367153888" + ], + "mAssetSupply": "70676910917791956406559530" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "5216318745556439531520", + "expectedQty": "5169799585879261632538", + "swapFee": "3129791247333863718", + "reserves": [ + "13100931641701178012819557", + "41371959768972869082198073", + "16293101523424928367153888" + ], + "mAssetSupply": "70671697728837647300891728" + }, + { + "type": "mintMulti", + "inputQtys": [ + "189376655144315840", + "275574129722045216", + "13457126741892998" + ], + "expectedQty": "478246557377938369", + "reserves": [ + "13100931831077833157135397", + "41371960044546998804243289", + "16293101536882055109046886" + ], + "mAssetSupply": "70671698207084204678830097" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "582800610732504504074240", + "expectedQty": "577334865733780318213931", + "swapFee": "349680366439502702444", + "reserves": [ + "12523596965344052838921466", + "41371960044546998804243289", + "16293101536882055109046886" + ], + "mAssetSupply": "70089247276718139677458301" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "2248586610559949501104128", + "expectedQty": "2232671940196697605788902", + "reserves": [ + "12523596965344052838921466", + "43620546655106948305347417", + "16293101536882055109046886" + ] + }, + { + "type": "redeemMasset", + "inputQty": "4177086944471306240", + "expectedQtys": [ + "723106636300566455", + "2518629979282455208", + "940756068711023293" + ], + "redemptionFee": "1253126083341391", + "reserves": [ + "12523596242237416538355011", + "43620544136476969022892209", + "16293100596125986398023593" + ], + "mAssetSupply": "72321915041081018895282354" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "62852846084198512984064", + "expectedQty": "63141891112370122536377", + "reserves": [ + "12523596242237416538355011", + "43620544136476969022892209", + "16355953442210184911007657" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "101710041538768928768", + "101364909606280347648", + "93008771155751682048" + ], + "expectedQty": "296822676590152436728", + "reserves": [ + "12523697952278955307283779", + "43620645501386575303239857", + "16356046450981340662689705" + ], + "mAssetSupply": "72385353754869979170255459" + }, + { + "type": "mintMulti", + "inputQtys": [ + "142458047898352416", + "692586920805698816", + "1058237243562814976" + ], + "expectedQty": "1894518182169800573", + "reserves": [ + "12523698094737003205636195", + "43620646193973496108938673", + "16356047509218584225504681" + ], + "mAssetSupply": "72385355649388161340056032" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "238443784752846652571648", + "expectedQty": "235794558570361487279436", + "swapFee": "143066270851707991542", + "reserves": [ + "12287903536166641718356759", + "43620646193973496108938673", + "16356047509218584225504681" + ], + "mAssetSupply": "72147054930906166395475926" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "2110092339370286645248", + "expectedQty": "2094370512821448253114", + "reserves": [ + "12287903536166641718356759", + "43622756286312866395583921", + "16356047509218584225504681" + ] + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "116141566109722917994496", + "expectedQty": "116941505589929998048636", + "swapFee": "69684939665833750796", + "reserves": [ + "12287903536166641718356759", + "43505814780722936397535285", + "16356047509218584225504681" + ], + "mAssetSupply": "72033077420248930759485340" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "7469485753456101662130176", + "expectedQty": "7513851140686156407050730", + "swapFee": "4481691452073660997278", + "reserves": [ + "12287903536166641718356759", + "35991963640036779990484555", + "16356047509218584225504681" + ], + "mAssetSupply": "64568073358244902758352442" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "22380773202786003189760", + "8808691763222037921792", + "5932965336450310602752" + ], + "expectedQty": "37256058986988489014046", + "swapFee": "22367055625568434469", + "reserves": [ + "12265522762963855715166999", + "35983154948273557952562763", + "16350114543882133914901929" + ], + "mAssetSupply": "64530817299257914269338396" + }, + { + "type": "redeemMasset", + "inputQty": "118864528644145118026137", + "expectedQtys": [ + "22586079986560992878592", + "66260397663975172297921", + "30107562638310379669975" + ], + "redemptionFee": "35659358593243535407", + "reserves": [ + "12242936682977294722288407", + "35916894550609582780264842", + "16320006981243823535231954" + ], + "mAssetSupply": "64411988429972362394847666" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "7419809509018403388522496", + "expectedQty": "7449234397654538630692949", + "reserves": [ + "19662746191995698110810903", + "35916894550609582780264842", + "16320006981243823535231954" + ] + }, + { + "type": "redeemMasset", + "inputQty": "63999611853753008993075", + "expectedQtys": [ + "17506390127077790784234", + "31977993410302331943691", + "14530239382665271608893" + ], + "redemptionFee": "19199883556125902697", + "reserves": [ + "19645239801868620320026669", + "35884916557199280448321151", + "16305476741861158263623061" + ], + "mAssetSupply": "71797242415656704142450237" + }, + { + "type": "mintMulti", + "inputQtys": [ + "3521881237181302784", + "3105051745802541568", + "637088700346162176" + ], + "expectedQty": "7260495962962689391", + "reserves": [ + "19645243323749857501329453", + "35884919662251026250862719", + "16305477378949858609785237" + ], + "mAssetSupply": "71797249676152667105139628" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "8664958752966073344", + "expectedQty": "8645779492873892231", + "swapFee": "5198975251779644", + "reserves": [ + "19645234677970364627437222", + "35884919662251026250862719", + "16305477378949858609785237" + ], + "mAssetSupply": "71797241016392889390845928" + }, + { + "type": "mintMulti", + "inputQtys": [ + "12382943257292787712", + "14331102353806559232", + "11444873805005088768" + ], + "expectedQty": "38171006777850260849", + "reserves": [ + "19645247060913621920224934", + "35884933993353380057421951", + "16305488823823663614874005" + ], + "mAssetSupply": "71797279187399667241106777" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "5494460158617288940978176", + "expectedQty": "5497906392079514655242267", + "reserves": [ + "25139707219530910861203110", + "35884933993353380057421951", + "16305488823823663614874005" + ] + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "394806836270430945280", + "expectedQty": "392560999516617511805", + "swapFee": "236884101762258567", + "reserves": [ + "25139707219530910861203110", + "35884933993353380057421951", + "16305096262824146997362200" + ], + "mAssetSupply": "77294791009527013227662331" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "14071627920177377574912", + "expectedQty": "14068660871796953144876", + "reserves": [ + "25153778847451088238778022", + "35884933993353380057421951", + "16305096262824146997362200" + ] + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "3554266171212937906094080", + "expectedQty": "3568314818133472359538180", + "reserves": [ + "25153778847451088238778022", + "35884933993353380057421951", + "19859362434037084903456280" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "478955641500300804096", + "5453841035379967262720", + "3329346643885174554624" + ], + "expectedQty": "9258582803173728334960", + "swapFee": "5558484772767897739", + "reserves": [ + "25153299891809587937973926", + "35879480152318000090159231", + "19856033087393199728901656" + ], + "mAssetSupply": "80867915905729108812010427" + }, + { + "type": "redeemMasset", + "inputQty": "1739488457645942169", + "expectedQtys": [ + "540891256824893966", + "771544775329076831", + "426979948491526917" + ], + "redemptionFee": "521846537293782", + "reserves": [ + "25153299350918331113079960", + "35879479380773224761082400", + "19856032660413251237374739" + ], + "mAssetSupply": "80867914166762497703362040" + }, + { + "type": "redeemMasset", + "inputQty": "95638459857733522187878", + "expectedQtys": [ + "29738631794805418695388", + "42420145818968767527946", + "23475697400790559709346" + ], + "redemptionFee": "28691537957320056656", + "reserves": [ + "25123560719123525694384572", + "35837059234954255993554454", + "19832556963012460677665393" + ], + "mAssetSupply": "80772304398442721501230818" + }, + { + "type": "redeemMasset", + "inputQty": "8375501566731461486182", + "expectedQtys": [ + "2604349312612880241442", + "3714928056100649233655", + "2055875226900528912174" + ], + "redemptionFee": "2512650470019438445", + "reserves": [ + "25120956369810912814143130", + "35833344306898155344320799", + "19830501087785560148753219" + ], + "mAssetSupply": "80763931409526460059183081" + }, + { + "type": "redeemMasset", + "inputQty": "67227980422348480", + "expectedQtys": [ + "20904436970886077", + "29818764719475936", + "16501977631268874" + ], + "redemptionFee": "20168394126704", + "reserves": [ + "25120956348906475843257053", + "35833344277079390624844863", + "19830501071283582517484345" + ], + "mAssetSupply": "80763931342318648030961305" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "147294913580400713400320", + "81312414543287249010688", + "49537993770947034742784" + ], + "expectedQty": "278147728231919608965342", + "swapFee": "166988830237294141864", + "reserves": [ + "24973661435326075129856733", + "35752031862536103375834175", + "19780963077512635482741561" + ], + "mAssetSupply": "80485783614086728421995963" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "403679771314055217152", + "2307811179587221061632", + "2614398469658299072512" + ], + "expectedQty": "5328001166686312046883", + "swapFee": "3198719931970969810", + "reserves": [ + "24973257755554761074639581", + "35749724051356516154772543", + "19778348679042977183669049" + ], + "mAssetSupply": "80480455612920042109949080" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "22091229647580692480000", + "expectedQty": "22133492809922874266392", + "swapFee": "13254737788548415488", + "reserves": [ + "24973257755554761074639581", + "35727590558546593280506151", + "19778348679042977183669049" + ], + "mAssetSupply": "80458377638010249965884568" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "911074718385454608023552", + "expectedQty": "907643825283346437692247", + "swapFee": "546644831031272764814", + "reserves": [ + "24973257755554761074639581", + "35727590558546593280506151", + "18870704853759630745976802" + ], + "mAssetSupply": "79547849564455826630625830" + }, + { + "type": "redeemMasset", + "inputQty": "9991880204600647614464", + "expectedQtys": [ + "3135910552428521324823", + "4486340121983937903083", + "2369608445238040023771" + ], + "redemptionFee": "2997564061380194284", + "reserves": [ + "24970121845002332553314758", + "35723104218424609342603068", + "18868335245314392705953031" + ], + "mAssetSupply": "79537860681815287363205650" + }, + { + "type": "mintMulti", + "inputQtys": [ + "1979206081503823753379840", + "2685739804700687252586496", + "3838584788255746748841984" + ], + "expectedQty": "8508750014797646311054964", + "reserves": [ + "26949327926506156306694598", + "38408844023125296595189564", + "22706920033570139454795015" + ], + "mAssetSupply": "88046610696612933674260614" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "3069237340895935201280", + "expectedQty": "3060080671665418333859", + "swapFee": "1841542404537561120", + "reserves": [ + "26949327926506156306694598", + "38408844023125296595189564", + "22703859952898474036461156" + ], + "mAssetSupply": "88043543300814442276620454" + }, + { + "type": "mintMulti", + "inputQtys": [ + "124305187735400", + "120336101770543", + "111204707088155" + ], + "expectedQty": "355907109933603", + "reserves": [ + "26949327926630461494429998", + "38408844023245632696960107", + "22703859953009678743549311" + ], + "mAssetSupply": "88043543301170349386554057" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "3750210814706536960", + "expectedQty": "3741572609048120599", + "reserves": [ + "26949327926630461494429998", + "38408847773456447403497067", + "22703859953009678743549311" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "19301481268833551384576", + "18111894194837287600128", + "14803224497084962963456" + ], + "expectedQty": "52221513230045026027423", + "reserves": [ + "26968629407899295045814574", + "38426959667651284691097195", + "22718663177506763706512767" + ], + "mAssetSupply": "88095768555973003460702079" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "496909575177027916398592", + "expectedQty": "498052408193730428735712", + "reserves": [ + "26968629407899295045814574", + "38426959667651284691097195", + "23215572752683791622911359" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "8086866280818281545728", + "5995413460771066085376", + "3011450952625891573760" + ], + "expectedQty": "17092183317029330832565", + "swapFee": "10261466870339802380", + "reserves": [ + "26960542541618476764268846", + "38420964254190513625011819", + "23212561301731165731337599" + ], + "mAssetSupply": "88576728780849704558605226" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "39286721420233465856", + "8877959136445126656", + "121949367888694968320" + ], + "expectedQty": "170389109983681911327", + "swapFee": "102294842895946714", + "reserves": [ + "26960503254897056530802990", + "38420955376231377179885163", + "23212439352363277036369279" + ], + "mAssetSupply": "88576558391739720876693899" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "5296951564417243593834496", + "expectedQty": "5283173961239681975928739", + "reserves": [ + "26960503254897056530802990", + "43717906940648620773719659", + "23212439352363277036369279" + ] + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "1086625534114319480913920", + "outputIndex": 0, + "expectedQty": "1081150629698247805563873", + "swapFee": "650001807022226701062", + "reserves": [ + "25879352625198808725239117", + "44804532474762940254633579", + "23212439352363277036369279" + ], + "mAssetSupply": "93860382354786425079323700", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemMasset", + "inputQty": "420978902473207881243033", + "expectedQtys": [ + "116038234590448110812227", + "200895243606656987775251", + "104080288328517927416827" + ], + "redemptionFee": "126293670741962364372", + "reserves": [ + "25763314390608360614426890", + "44603637231156283266858328", + "23108359064034759108952452" + ], + "mAssetSupply": "93439529745983959160445039" + }, + { + "type": "mintMulti", + "inputQtys": [ + "12675311884781826", + "5154047358593936", + "12160265437365422" + ], + "expectedQty": "30028236786133764", + "reserves": [ + "25763314403283672499208716", + "44603637236310330625452264", + "23108359076195024546317874" + ], + "mAssetSupply": "93439529776012195946578803" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "7465134635695094104064", + "6176853535723229282304", + "601683477076226342912" + ], + "expectedQty": "14237388706762681244650", + "swapFee": "8547561761114277313", + "reserves": [ + "25755849268647977405104652", + "44597460382774607396169960", + "23107757392717948319974962" + ], + "mAssetSupply": "93425292387305433265334153" + }, + { + "type": "redeemMasset", + "inputQty": "556877284394979033088", + "expectedQtys": [ + "153476046768465891791", + "265750969578524083843", + "137696381793793278899" + ], + "redemptionFee": "167063185318493709", + "reserves": [ + "25755695792601208939212861", + "44597194631805028872086117", + "23107619696336154526696063" + ], + "mAssetSupply": "93424735677084223604794774" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "55486289669413306368", + "expectedQty": "55631693445608917319", + "swapFee": "33291773801647983", + "reserves": [ + "25755695792601208939212861", + "44597139000111583263168798", + "23107619696336154526696063" + ], + "mAssetSupply": "93424680224086327993136389" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "137270419097894895616", + "153362082520604966912", + "299938835187096223744" + ], + "expectedQty": "591161619019071702303", + "swapFee": "354909917361860137", + "reserves": [ + "25755558522182111044317245", + "44596985638029062658201886", + "23107319757500967430472319" + ], + "mAssetSupply": "93424089062467308921434086" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "3592051940644599046864896", + "expectedQty": "3581980216793398115786780", + "swapFee": "2155231164386759428118", + "reserves": [ + "22173578305388712928530465", + "44596985638029062658201886", + "23107319757500967430472319" + ], + "mAssetSupply": "89834192352987096633997308" + }, + { + "type": "redeemMasset", + "inputQty": "56769423326419158984294", + "expectedQtys": [ + "14008069601821586516266", + "28173967694565895134730", + "14597957037721622770800" + ], + "redemptionFee": "17030826997925747695", + "reserves": [ + "22159570235786891342014199", + "44568811670334496763067156", + "23092721800463245807701519" + ], + "mAssetSupply": "89777439960487675400760709" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "102961524463358143627264", + "expectedQty": "102583315241916647536866", + "reserves": [ + "22159570235786891342014199", + "44671773194797854906694420", + "23092721800463245807701519" + ] + }, + { + "type": "redeemMasset", + "inputQty": "2133978639740", + "expectedQtys": [ + "525966298306", + "1060302475909", + "548115025425" + ], + "redemptionFee": "640193591", + "reserves": [ + "22159570235786365375715893", + "44671773194796794604218511", + "23092721800462697692676094" + ], + "mAssetSupply": "89880023275727458709851426" + }, + { + "type": "mintMulti", + "inputQtys": [ + "11057210881224094", + "19659338602950072", + "17419088276860696" + ], + "expectedQty": "48137500123558662", + "reserves": [ + "22159570246843576256939987", + "44671773214456133207168583", + "23092721817881785969536790" + ], + "mAssetSupply": "89880023323864958833410088" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "2707698059551335424", + "2701433815318109184", + "1862719556946139648" + ], + "expectedQty": "7274315512552607811", + "swapFee": "4367209633311551", + "reserves": [ + "22159567539145516705604563", + "44671770513022317889059399", + "23092719955162229023397142" + ], + "mAssetSupply": "89880016049549446280802277" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "27625940175955468", + "expectedQty": "27711360829284897", + "swapFee": "16575564105573", + "reserves": [ + "22159567539145516705604563", + "44671770485310957059774502", + "23092719955162229023397142" + ], + "mAssetSupply": "89880016021940081668952382" + }, + { + "type": "redeemMasset", + "inputQty": "917364889407983704237670", + "expectedQtys": [ + "226104885174350100228894", + "455807881551538438416473", + "235626294809303743346159" + ], + "redemptionFee": "275209466822395111271", + "reserves": [ + "21933462653971166605375669", + "44215962603759418621358029", + "22857093660352925280050983" + ], + "mAssetSupply": "88962926341998920359825983" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "2661982227728536961024", + "expectedQty": "2652183853108966369386", + "reserves": [ + "21933462653971166605375669", + "44218624585987147158319053", + "22857093660352925280050983" + ] + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "3852742930715054803255296", + "outputIndex": 1, + "expectedQty": "3870123090164835089473202", + "swapFee": "2316660141935319005603", + "reserves": [ + "25786205584686221408630965", + "40348501495822312068845851", + "22857093660352925280050983" + ], + "mAssetSupply": "88967895185993964645200972", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mintMulti", + "inputQtys": [ + "471713781072481608531968", + "154784814975691584962560", + "203055922645515225792512" + ], + "expectedQty": "830134279058595410361482", + "reserves": [ + "26257919365758703017162933", + "40503286310798003653808411", + "23060149582998440505843495" + ], + "mAssetSupply": "89798029465052560055562454" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "2122088173579601707008", + "expectedQty": "2116541817191845768334", + "reserves": [ + "26257919365758703017162933", + "40505408398971583255515419", + "23060149582998440505843495" + ] + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "123720616683976112734208", + "expectedQty": "123843066558899607871989", + "reserves": [ + "26381639982442679129897141", + "40505408398971583255515419", + "23060149582998440505843495" + ] + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "560198164585624553652224", + "outputIndex": 2, + "expectedQty": "556919757845461614619119", + "swapFee": "335231637337092940236", + "reserves": [ + "26381639982442679129897141", + "41065606563557207809167643", + "22503229825152978891224376" + ], + "mAssetSupply": "89924324305065988602143013", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemBassets", + "inputQtys": [ + "4665507641262000128", + "7729758653819413504", + "585242918652514048" + ], + "expectedQty": "12965298887253346218", + "swapFee": "7783849642137290", + "reserves": [ + "26381635316935037867897013", + "41065598833798553989754139", + "22503229239910060238710328" + ], + "mAssetSupply": "89924311339767101348796795" + }, + { + "type": "mintMulti", + "inputQtys": [ + "221672925012103622819840", + "57294670282725953372160", + "4639081593314936356864" + ], + "expectedQty": "283667846896801403774587", + "reserves": [ + "26603308241947141490716853", + "41122893504081279943126299", + "22507868321503375175067192" + ], + "mAssetSupply": "90207979186663902752571382" + }, + { + "type": "redeemMasset", + "inputQty": "4481374335919993126912", + "expectedQtys": [ + "1321209255165409103017", + "2042300416273228896140", + "1117816012578668492992" + ], + "redemptionFee": "1344412300775997938", + "reserves": [ + "26601987032691976081613836", + "41120851203665006714230159", + "22506750505490796506574200" + ], + "mAssetSupply": "90203499156740283535442408" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "37596734488704047906816", + "outputIndex": 0, + "expectedQty": "37643881781597629170429", + "swapFee": "22620478553966996363", + "reserves": [ + "26564343150910378452443407", + "41120851203665006714230159", + "22544347239979500554481016" + ], + "mAssetSupply": "90203521777218837502438771", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "119043725958310914949120", + "outputIndex": 1, + "expectedQty": "119403627123738083735424", + "swapFee": "71490538752891873842", + "reserves": [ + "26683386876868689367392527", + "41001447576541268630494735", + "22544347239979500554481016" + ], + "mAssetSupply": "90203593267757590394312613", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemBassets", + "inputQtys": [ + "2799028150884546641920", + "10053968088918004858880", + "19532788228813309870080" + ], + "expectedQty": "32414876321133658993556", + "swapFee": "19460602153972578943", + "reserves": [ + "26680587848717804820750607", + "40991393608452350625635855", + "22524814451750687244610936" + ], + "mAssetSupply": "90171178391436456735319057" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "443155280706940", + "455008876042169", + "238938898077376" + ], + "expectedQty": "1136915981990042", + "swapFee": "682559124668", + "reserves": [ + "26680587848274649540043667", + "40991393607997341749593686", + "22524814451511748346533560" + ], + "mAssetSupply": "90171178390299540753329015" + }, + { + "type": "redeemMasset", + "inputQty": "108682546096544", + "expectedQtys": [ + "32148235790929", + "49391752333295", + "27140820519101" + ], + "redemptionFee": "32604763828", + "reserves": [ + "26680587848242501304252738", + "40991393607947949997260391", + "22524814451484607526014459" + ], + "mAssetSupply": "90171178390190890811996299" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "2096650137327433416704", + "expectedQty": "2102438948926756006432", + "reserves": [ + "26680587848242501304252738", + "40991393607947949997260391", + "22526911101621934959431163" + ] + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "7395835571902019010560", + "expectedQty": "7416241167555643158098", + "reserves": [ + "26680587848242501304252738", + "40991393607947949997260391", + "22534306937193836978441723" + ] + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "878325781765569380352", + "expectedQty": "880747674236108307545", + "reserves": [ + "26680587848242501304252738", + "40991393607947949997260391", + "22535185262975602547822075" + ] + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "19266671693930713579520", + "outputIndex": 0, + "expectedQty": "19186151841421286136907", + "swapFee": "11528691428927518818", + "reserves": [ + "26661401696401080018115831", + "41010660279641880710839911", + "22535185262975602547822075" + ], + "mAssetSupply": "90181589346673038246987192", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "33038087411497743417344", + "expectedQty": "33107971477171005249888", + "swapFee": "19822852446898646050", + "reserves": [ + "26661401696401080018115831", + "40977552308164709705590023", + "22535185262975602547822075" + ], + "mAssetSupply": "90148571082113987402215898" + }, + { + "type": "mintMulti", + "inputQtys": [ + "4535055336123160068096", + "4988630477055569428480", + "11948363150351969288192" + ], + "expectedQty": "21495388090448971846258", + "reserves": [ + "26665936751737203178183927", + "40982540938641765275018503", + "22547133626125954517110267" + ], + "mAssetSupply": "90170066470204436374062156" + }, + { + "type": "mintMulti", + "inputQtys": [ + "2569013638664211417530368", + "920088384775971554721792", + "1137374770841007247327232" + ], + "expectedQty": "4628973104618984832256308", + "reserves": [ + "29234950390401414595714295", + "41902629323417736829740295", + "23684508396966961764437499" + ], + "mAssetSupply": "94799039574823421206318464" + }, + { + "type": "redeemMasset", + "inputQty": "17169522576570106825932", + "expectedQtys": [ + "5293297885308380343767", + "7586915531737371829246", + "4288331484680600380344" + ], + "redemptionFee": "5150856772971032047", + "reserves": [ + "29229657092516106215370528", + "41895042407885999457911049", + "23680220065482281164057155" + ], + "mAssetSupply": "94781875203103624070524579" + }, + { + "type": "redeemMasset", + "inputQty": "4193339687163182605926", + "expectedQtys": [ + "1292790524573497667272", + "1852964394350943678250", + "1047345989163483196848" + ], + "redemptionFee": "1258001906148954781", + "reserves": [ + "29228364301991532717703256", + "41893189443491648514232799", + "23679172719493117680860307" + ], + "mAssetSupply": "94777683121418367036873434" + }, + { + "type": "redeemMasset", + "inputQty": "14169501104017730279833", + "expectedQtys": [ + "4368402784368799100638", + "6261257849402438123399", + "3539033624003904409302" + ], + "redemptionFee": "4250850331205319083", + "reserves": [ + "29223995899207163918602618", + "41886928185642246076109400", + "23675633685869113776451005" + ], + "mAssetSupply": "94763517871164680511912684" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "1737927556277974784", + "1517493440783475200", + "4009493868544290816" + ], + "expectedQty": "7273108337048165864", + "swapFee": "4366484893164798", + "reserves": [ + "29223994161279607640627834", + "41886926668148805292634200", + "23675629676375245232160189" + ], + "mAssetSupply": "94763510598056343463746820" + }, + { + "type": "redeemMasset", + "inputQty": "31508356856669", + "expectedQtys": [ + "9713905605545", + "13922999351674", + "7869657739422" + ], + "redemptionFee": "9452507057", + "reserves": [ + "29223994161269893735022289", + "41886926668134882293282526", + "23675629676367375574420767" + ], + "mAssetSupply": "94763510598024844559397208" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "1888455520611741017833472", + "expectedQty": "1891719899065571291292446", + "swapFee": "1133073312367044610700", + "reserves": [ + "29223994161269893735022289", + "39995206769069311001990080", + "23675629676367375574420767" + ], + "mAssetSupply": "92876188150725470586174436" + }, + { + "type": "redeemMasset", + "inputQty": "48529951288778678704537", + "expectedQtys": [ + "15265630186126159412999", + "20892148841290726840272", + "12367351467038238033579" + ], + "redemptionFee": "14558985386633603611", + "reserves": [ + "29208728531083767575609290", + "39974314620228020275149808", + "23663262324900337336387188" + ], + "mAssetSupply": "92827672758422078541073510" + }, + { + "type": "redeemMasset", + "inputQty": "487453951689934410822451", + "expectedQtys": [ + "153334004293240563921921", + "209848974530832300800548", + "124222550908268434657919" + ], + "redemptionFee": "146236185506980323246", + "reserves": [ + "29055394526790527011687369", + "39764465645697187974349260", + "23539039773992068901729269" + ], + "mAssetSupply": "92340365042917651110574305" + }, + { + "type": "redeemMasset", + "inputQty": "128185349101822905679872", + "expectedQtys": [ + "40322112071033026151655", + "55183805497190596669544", + "32666698052792023204232" + ], + "redemptionFee": "38455604730546871703", + "reserves": [ + "29015072414719493985535714", + "39709281840199997377679716", + "23506373075939276878525037" + ], + "mAssetSupply": "92212218149420558751766136" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "43500330280614617088", + "expectedQty": "43610166034551471146", + "reserves": [ + "29015072414719493985535714", + "39709281840199997377679716", + "23506416576269557493142125" + ] + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "74719879647757233815552", + "expectedQty": "74839280655965006520867", + "swapFee": "44831927788654340289", + "reserves": [ + "29015072414719493985535714", + "39634442559544032371158849", + "23506416576269557493142125" + ], + "mAssetSupply": "92137586711866624723762019" + }, + { + "type": "redeemMasset", + "inputQty": "4138697474078923", + "expectedQtys": [ + "1302927348274917", + "1779792185466461", + "1055560109566610" + ], + "redemptionFee": "1241609242223", + "reserves": [ + "29015072413416566637260797", + "39634442557764240185692388", + "23506416575213997383575515" + ], + "mAssetSupply": "92137586707729168858925319" + }, + { + "type": "mintMulti", + "inputQtys": [ + "89499470262680464", + "1576463530604093184", + "639350093221580928" + ], + "expectedQty": "2303498604905839801", + "reserves": [ + "29015072502916036899941261", + "39634444134227770789785572", + "23506417214564090605156443" + ], + "mAssetSupply": "92137589011227773764765120" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "178955966685239672832", + "expectedQty": "179241029549538840881", + "swapFee": "107373580011143803", + "reserves": [ + "29015072502916036899941261", + "39634264893198221250944691", + "23506417214564090605156443" + ], + "mAssetSupply": "92137410162634668536236091" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "251919187101216174768128", + "outputIndex": 2, + "expectedQty": "251190378927930508555585", + "swapFee": "151195844234713187265", + "reserves": [ + "29266991690017253074709389", + "39634264893198221250944691", + "23255226835636160096600858" + ], + "mAssetSupply": "92137561358478903249423356", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "108137723450653912596480", + "expectedQty": "108421056181867503655037", + "reserves": [ + "29266991690017253074709389", + "39634264893198221250944691", + "23363364559086814009197338" + ] + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "663399319180630342762496", + "expectedQty": "665044493723794289865309", + "reserves": [ + "29266991690017253074709389", + "39634264893198221250944691", + "24026763878267444351959834" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "25586388785164374016", + "13229230213887678464", + "65204678584557551616" + ], + "expectedQty": "104154963480999942426", + "swapFee": "62530496386431824", + "reserves": [ + "29266966103628467910335373", + "39634251663968007363266227", + "24026698673588859794408218" + ], + "mAssetSupply": "92910922753421084043001276" + }, + { + "type": "redeemMasset", + "inputQty": "47532015824121995303321", + "expectedQtys": [ + "14968106218078807429382", + "20270283113041559140195", + "12288058029064530292547" + ], + "redemptionFee": "14259604747236598590", + "reserves": [ + "29251997997410389102905991", + "39613981380854965804126032", + "24014410615559795264115671" + ], + "mAssetSupply": "92863404997201709284296545" + }, + { + "type": "mintMulti", + "inputQtys": [ + "365214872439570980405248", + "406662179734345167667200", + "37256813806955014389760" + ], + "expectedQty": "808476933896149140462047", + "reserves": [ + "29617212869849960083311239", + "40020643560589310971793232", + "24051667429366750278505431" + ], + "mAssetSupply": "93671881931097858424758592" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "1850999388798671912960000", + "outputIndex": 0, + "expectedQty": "1852517503460875919449026", + "swapFee": "1112973671942887272851", + "reserves": [ + "27764695366389084163862213", + "40020643560589310971793232", + "25902666818165422191465431" + ], + "mAssetSupply": "93672994904769801312031443", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "9899299557760616448", + "expectedQty": "9877201747689680081", + "swapFee": "5939579734656369", + "reserves": [ + "27764695366389084163862213", + "40020643560589310971793232", + "25902656940963674501785350" + ], + "mAssetSupply": "93672985011409823286071364" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "80193330378128539648", + "expectedQty": "80324518781252703073", + "reserves": [ + "27764695366389084163862213", + "40020643560589310971793232", + "25902737134294052630324998" + ] + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "3150848300067831939072", + "expectedQty": "3153776446597321295397", + "reserves": [ + "27767846214689151995801285", + "40020643560589310971793232", + "25902737134294052630324998" + ] + }, + { + "type": "redeemMasset", + "inputQty": "359152233751610182860", + "expectedQtys": [ + "106429275474050121037", + "153392094771308912979", + "99280640085774492639" + ], + "redemptionFee": "107745670125483054", + "reserves": [ + "27767739785413677945680248", + "40020490168494539662880253", + "25902637853653966855832359" + ], + "mAssetSupply": "93675860067887120375370028" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "7208332436647323499495424", + "expectedQty": "7209642651180631525383795", + "reserves": [ + "34976072222061001445175672", + "40020490168494539662880253", + "25902637853653966855832359" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "1081886084820973518848", + "205818587803187511296", + "73131093440825524224" + ], + "expectedQty": "1360195596956664917451", + "reserves": [ + "34977154108145822418694520", + "40020695987082342850391549", + "25902710984747407681356583" + ], + "mAssetSupply": "100886862914664708565671274" + }, + { + "type": "mintMulti", + "inputQtys": [ + "1344765701579117690880", + "5465170113087424954368", + "7471767022406532595712" + ], + "expectedQty": "14291073333277958687514", + "reserves": [ + "34978498873847401536385400", + "40026161157195430275345917", + "25910182751769814213952295" + ], + "mAssetSupply": "100901153987997986524358788" + }, + { + "type": "mintMulti", + "inputQtys": [ + "1307686750509189824512", + "1046763459010384232448", + "1241551497357061783552" + ], + "expectedQty": "3596840513838556731361", + "reserves": [ + "34979806560597910726209912", + "40027207920654440659578365", + "25911424303267171275735847" + ], + "mAssetSupply": "100904750828511825081090149" + }, + { + "type": "redeemMasset", + "inputQty": "3366594087011769548", + "expectedQtys": [ + "1166718911865937902", + "1335070289463011456", + "864251456497698453" + ], + "redemptionFee": "1009978226103530", + "reserves": [ + "34979805393878998860272010", + "40027206585584151196566909", + "25911423439015714778037394" + ], + "mAssetSupply": "100904747462927716295424131" + }, + { + "type": "mintMulti", + "inputQtys": [ + "96687812433675699617792", + "71667167471327908986880", + "7227601486172653617152" + ], + "expectedQty": "175445792574158129582843", + "reserves": [ + "35076493206312674559889802", + "40098873753055479105553789", + "25918651040501887431654546" + ], + "mAssetSupply": "101080193255501874425006974" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "338861775585081458425856", + "expectedQty": "338811017236381910075869", + "swapFee": "203317065351048875055", + "reserves": [ + "34737682189076292649813933", + "40098873753055479105553789", + "25918651040501887431654546" + ], + "mAssetSupply": "100741534796982144015456173" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "466898616230001408", + "expectedQty": "468031562295766825", + "reserves": [ + "34737682189076292649813933", + "40098873753055479105553789", + "25918651507400503661655954" + ] + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "518297713347001151651840", + "expectedQty": "518184192542832682309951", + "swapFee": "310978628008200690991", + "reserves": [ + "34219497996533459967503982", + "40098873753055479105553789", + "25918651507400503661655954" + ], + "mAssetSupply": "100223548530294713360262149" + }, + { + "type": "redeemMasset", + "inputQty": "1709049303787817559654", + "expectedQtys": [ + "583348576672114801643", + "683575806178377568872", + "441841913275124879677" + ], + "redemptionFee": "512714791136345267", + "reserves": [ + "34218914647956787852702339", + "40098190177249300727984917", + "25918209665487228536776277" + ], + "mAssetSupply": "100221839993705716679047762" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "2893722332454280757248", + "outputIndex": 0, + "expectedQty": "2899816341599668310727", + "swapFee": "1740345745000188769", + "reserves": [ + "34216014831615188184391612", + "40098190177249300727984917", + "25921103387819682817533525" + ], + "mAssetSupply": "100221841734051461679236531", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "383607150642926592", + "expectedQty": "383001757722486844", + "reserves": [ + "34216014831615188184391612", + "40098190560856451370911509", + "25921103387819682817533525" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "79418902028273298964480", + "146055380859776613220352", + "457924854929196868173824" + ], + "expectedQty": "684203562816681559048303", + "reserves": [ + "34295433733643461483356092", + "40244245941716227984131861", + "26379028242748879685707349" + ], + "mAssetSupply": "100906045679869900960771678" + }, + { + "type": "mintMulti", + "inputQtys": [ + "25107378838780998844416", + "32252235102583173152768", + "11088031135738059816960" + ], + "expectedQty": "68415551813873266909945", + "reserves": [ + "34320541112482242482200508", + "40276498176818811157284629", + "26390116273884617745524309" + ], + "mAssetSupply": "100974461231683774227681623" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "164275976569082118144", + "3375814544877796458496", + "3261360414417829756928" + ], + "expectedQty": "6803542741132239683938", + "swapFee": "4084576390513652001", + "reserves": [ + "34320376836505673400082364", + "40273122362273933360826133", + "26386854913470199915767381" + ], + "mAssetSupply": "100967657688942641987997685" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "89840405096233175089152", + "expectedQty": "89812044856374210536728", + "swapFee": "53904243057739905053", + "reserves": [ + "34230564791649299189545636", + "40273122362273933360826133", + "26386854913470199915767381" + ], + "mAssetSupply": "100877871188089466552813586" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "990430997036824133632", + "expectedQty": "987620220799775383557", + "swapFee": "594258598222094480", + "reserves": [ + "34230564791649299189545636", + "40273122362273933360826133", + "26385867293249400140383824" + ], + "mAssetSupply": "100876881351351027950774434" + }, + { + "type": "mintMulti", + "inputQtys": [ + "43376553539694125056", + "33990879741489717248", + "28555574947111010304" + ], + "expectedQty": "105922405732652005160", + "reserves": [ + "34230608168202838883670692", + "40273156353153674850543381", + "26385895848824347251394128" + ], + "mAssetSupply": "100876987273756760602779594" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "592920168187988279296", + "4674833167127342481408", + "7703492568493503545344" + ], + "expectedQty": "12981133285655130115477", + "swapFee": "7793355984984068510", + "reserves": [ + "34230015248034650895391396", + "40268481519986547508061973", + "26378192356255853747848784" + ], + "mAssetSupply": "100864006140471105472664117" + }, + { + "type": "mintMulti", + "inputQtys": [ + "20104977825850454016", + "11736214460570884096", + "20207852561654693888" + ], + "expectedQty": "52070653474742493250", + "reserves": [ + "34230035353012476745845412", + "40268493256201008078946069", + "26378212564108415402542672" + ], + "mAssetSupply": "100864058211124580215157367" + }, + { + "type": "redeemMasset", + "inputQty": "200544059862957256867840", + "expectedQtys": [ + "68037822308354250412594", + "80040250047519925951714", + "52431033761431936362958" + ], + "redemptionFee": "60163217958887177060", + "reserves": [ + "34161997530704122495432818", + "40188453006153488152994355", + "26325781530346983466179714" + ], + "mAssetSupply": "100663574314479581845466587" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "209694283590681195708416", + "908255244497899699044352", + "712119783317881407668224" + ], + "expectedQty": "1830238917071428227103733", + "swapFee": "1098802631821950106326", + "reserves": [ + "33952303247113441299724402", + "39280197761655588453950003", + "25613661747029102058511490" + ], + "mAssetSupply": "98833335397408153618362854" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "194600716690527245828096", + "outputIndex": 2, + "expectedQty": "193720579361151748854762", + "swapFee": "116581078101143538827", + "reserves": [ + "33952303247113441299724402", + "39474798478346115699778099", + "25419941167667950309656728" + ], + "mAssetSupply": "98833451978486254761901681", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "5199702450407092518912", + "expectedQty": "5191535098193328699272", + "reserves": [ + "33952303247113441299724402", + "39479998180796522792297011", + "25419941167667950309656728" + ] + }, + { + "type": "redeemMasset", + "inputQty": "108324879748264473", + "expectedQtys": [ + "37199780085659596", + "43256189113848501", + "27851312894598607" + ], + "redemptionFee": "32497463924479", + "reserves": [ + "33952303209913661214064806", + "39479998137540333678448510", + "25419941139816637415058121" + ], + "mAssetSupply": "98838643405292065806260959" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "53115392298188398592", + "expectedQty": "53104406835174141746", + "swapFee": "31869235378913039", + "reserves": [ + "33952250105506826039923060", + "39479998137540333678448510", + "25419941139816637415058121" + ], + "mAssetSupply": "98838590321769002996775406" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "22123037128329785245696", + "expectedQty": "22114296666674033515409", + "reserves": [ + "33974373142635155825168756", + "39479998137540333678448510", + "25419941139816637415058121" + ] + }, + { + "type": "redeemMasset", + "inputQty": "94537166652584548001382", + "expectedQtys": [ + "32478803745152681126221", + "37742068293205001104142", + "24300942243357033654500" + ], + "redemptionFee": "28361149995775364400", + "reserves": [ + "33941894338890003144042535", + "39442256069247128677344368", + "25395640197573280381403621" + ], + "mAssetSupply": "98766195812933088257653833" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "37364109477578534813696", + "expectedQty": "37454783735896755163137", + "reserves": [ + "33941894338890003144042535", + "39442256069247128677344368", + "25433004307050858916217317" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "806237650146387864584192", + "879108432987278016512000", + "1345353391421004997197824" + ], + "expectedQty": "3032362207661914002314343", + "swapFee": "1820509630375373625563", + "reserves": [ + "33135656688743615279458343", + "38563147636259850660832368", + "24087650915629853919019493" + ], + "mAssetSupply": "95771288389007071010502627" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "39735588110936313954304", + "expectedQty": "39841920434857179920986", + "reserves": [ + "33135656688743615279458343", + "38563147636259850660832368", + "24127386503740790232973797" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "38967204485929703047168", + "76368077551032963432448", + "1011638199218199068672" + ], + "expectedQty": "116204539695444594159670", + "reserves": [ + "33174623893229544982505511", + "38639515713810883624264816", + "24128398141940008432042469" + ], + "mAssetSupply": "95927334849137372784583283" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "128270750542625161347072", + "expectedQty": "128056359285564540937786", + "reserves": [ + "33174623893229544982505511", + "38767786464353508785611888", + "24128398141940008432042469" + ] + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "311501173868861797171200", + "outputIndex": 0, + "expectedQty": "310913748416959658226967", + "swapFee": "186582782675256492883", + "reserves": [ + "32863710144812585324278544", + "39079287638222370582783088", + "24128398141940008432042469" + ], + "mAssetSupply": "96055577791205612582013952", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemMasset", + "inputQty": "6897763421494107340", + "expectedQtys": [ + "2359239277023032873", + "2805446795505160189", + "1732143581393526325" + ], + "redemptionFee": "2069329026448232", + "reserves": [ + "32863707785573308301245671", + "39079284832775575077622899", + "24128396409796427038516144" + ], + "mAssetSupply": "96055570895511520114354844" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "224433368101739724800", + "expectedQty": "223695244170725519263", + "swapFee": "134660020861043834", + "reserves": [ + "32863707785573308301245671", + "39079284832775575077622899", + "24128172714552256312996881" + ], + "mAssetSupply": "96055346596803439235673878" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "1335418760017413358485504", + "outputIndex": 1, + "expectedQty": "1339922558012647949737557", + "swapFee": "803229027369228044196", + "reserves": [ + "32863707785573308301245671", + "37739362274762927127885342", + "25463591474569669671482385" + ], + "mAssetSupply": "96056149825830808463718074", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemBassets", + "inputQtys": [ + "6514661345164", + "13856657416113", + "12091890564766" + ], + "expectedQty": "32466942186994", + "swapFee": "19491860428", + "reserves": [ + "32863707785566793639900507", + "37739362274749070470469229", + "25463591474557577780917619" + ], + "mAssetSupply": "96056149825798341521531080" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "40491566404026455031808", + "expectedQty": "40480460449523435553552", + "swapFee": "24294939842415873019", + "reserves": [ + "32823227325117270204346955", + "37739362274749070470469229", + "25463591474557577780917619" + ], + "mAssetSupply": "96015682554334157482372291" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "76664782976615792", + "expectedQty": "76825578096286911", + "reserves": [ + "32823227325117270204346955", + "37739362274749070470469229", + "25463591551222360757533411" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "38645713234284802736128", + "31401775224089202393088", + "43362569216720401072128" + ], + "expectedQty": "113444119955215409166530", + "reserves": [ + "32861873038351555007083083", + "37770764049973159672862317", + "25506954120439081158605539" + ], + "mAssetSupply": "96129126751114950987825732" + }, + { + "type": "redeemMasset", + "inputQty": "94421581907124635985510", + "expectedQtys": [ + "32268463061485686989300", + "37088710772153513535280", + "25046357092483191370765" + ], + "redemptionFee": "28326474572137390795", + "reserves": [ + "32829604575290069320093783", + "37733675339201006159327037", + "25481907763346597967234774" + ], + "mAssetSupply": "96034733495682398489231017" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "697804284245662629888", + "expectedQty": "697579676576942748092", + "reserves": [ + "32830302379574314982723671", + "37733675339201006159327037", + "25481907763346597967234774" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "6999008063796629471232", + "9963242557060631494656", + "14487027447574976004096" + ], + "expectedQty": "31463297004393856512702", + "swapFee": "18889311789710139991", + "reserves": [ + "32823303371510518353252439", + "37723712096643945527832381", + "25467420735899022991230678" + ], + "mAssetSupply": "96003967778354581575466407" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "21082030956147931873280", + "outputIndex": 0, + "expectedQty": "21120179927596603676032", + "swapFee": "12675671786965114724", + "reserves": [ + "32802183191582921749576407", + "37723712096643945527832381", + "25488502766855170923103958" + ], + "mAssetSupply": "96003980454026368540581131", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemMasset", + "inputQty": "1050041785786829897728", + "expectedQtys": [ + "358665648595484746394", + "412478632521142659965", + "278696400273373475232" + ], + "redemptionFee": "315012535736048969", + "reserves": [ + "32801824525934326264830013", + "37723299618011424385172416", + "25488224070454897549628726" + ], + "mAssetSupply": "96002930727253117446732372" + }, + { + "type": "redeemMasset", + "inputQty": "69465897373511116", + "expectedQtys": [ + "23727656817074297", + "27287674398604186", + "18437262023101439" + ], + "redemptionFee": "20839769212053", + "reserves": [ + "32801824502206669447755716", + "37723299590723749986568230", + "25488224052017635526527287" + ], + "mAssetSupply": "96002930657808059842433309" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "577195657959752269824", + "expectedQty": "577663612389576192010", + "swapFee": "346317394775851361", + "reserves": [ + "32801824502206669447755716", + "37722721927111360410376220", + "25488224052017635526527287" + ], + "mAssetSupply": "96002353808467494866014846" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "680205919966730555228160", + "expectedQty": "679951171204450452460639", + "reserves": [ + "33482030422173400002983876", + "37722721927111360410376220", + "25488224052017635526527287" + ] + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "440166641141750247194624", + "expectedQty": "439554504173004302984336", + "reserves": [ + "33482030422173400002983876", + "38162888568253110657570844", + "25488224052017635526527287" + ] + }, + { + "type": "redeemMasset", + "inputQty": "2041608480012326718668", + "expectedQtys": [ + "703618015984707537094", + "801985291813634727391", + "535629811344344807860" + ], + "redemptionFee": "612482544003698015", + "reserves": [ + "33481326804157415295446782", + "38162086582961297022843453", + "25487688422206291181719427" + ], + "mAssetSupply": "97119818487847481298439168" + }, + { + "type": "mintMulti", + "inputQtys": [ + "17303776235719871168512", + "130085482440272279240704", + "156260093791006120476672" + ], + "expectedQty": "303800662797475038109824", + "reserves": [ + "33498630580393135166615294", + "38292172065401569302084157", + "25643948515997297302196099" + ], + "mAssetSupply": "97423619150644956336548992" + }, + { + "type": "redeemMasset", + "inputQty": "2466211808298340135731", + "expectedQtys": [ + "847740359101131964866", + "969049156191055650544", + "648964144117778988069" + ], + "redemptionFee": "739863542489502040", + "reserves": [ + "33497782840034034034650428", + "38291203016245378246433613", + "25643299551853179523208030" + ], + "mAssetSupply": "97421153678700200485915301" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "64050761461569639415808", + "outputIndex": 2, + "expectedQty": "63847790967841103643023", + "swapFee": "38415795074877459342", + "reserves": [ + "33561833601495603674066236", + "38291203016245378246433613", + "25579451760885338419565007" + ], + "mAssetSupply": "97421192094495275363374643", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mintMulti", + "inputQtys": [ + "15995009542238603575296", + "10596273900734545657856", + "13345328725928513110016" + ], + "expectedQty": "39944653424852111601900", + "reserves": [ + "33577828611037842277641532", + "38301799290146112792091469", + "25592797089611266932675023" + ], + "mAssetSupply": "97461136747920127474976543" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "4096018814472350500651008", + "320415898411633098096640", + "793706039028940938412032" + ], + "expectedQty": "5210915514345936573990708", + "swapFee": "3128426364426217674999", + "reserves": [ + "29481809796565491776990524", + "37981383391734479693994829", + "24799091050582325994262991" + ], + "mAssetSupply": "92250221233574190900985835" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "744793212154926989312", + "676838010007565500416", + "488102567076384604160" + ], + "expectedQty": "1909661879612016248279", + "swapFee": "1146485018778476835", + "reserves": [ + "29481065003353336850001212", + "37980706553724472128494413", + "24798602948015249609658831" + ], + "mAssetSupply": "92248311571694578884737556" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "137015788315179600", + "expectedQty": "137282401858540421", + "reserves": [ + "29481065003353336850001212", + "37980706553724472128494413", + "24798603085031037924838431" + ] + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "46026213396517421056", + "expectedQty": "46080451844317677506", + "swapFee": "27615728037910452", + "reserves": [ + "29481065003353336850001212", + "37980660473272627810816907", + "24798603085031037924838431" + ], + "mAssetSupply": "92248265710379312263767373" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "107781860997503154913280", + "expectedQty": "107506205474804627172409", + "swapFee": "64669116598501892947", + "reserves": [ + "29481065003353336850001212", + "37980660473272627810816907", + "24691096879556233297666022" + ], + "mAssetSupply": "92140548518498407610747040" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "1047012844502356697546752", + "expectedQty": "1047143683029934710720195", + "reserves": [ + "30528077847855693547547964", + "37980660473272627810816907", + "24691096879556233297666022" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "497828134099259621376", + "2295612378408279605248", + "1363958768636611526656" + ], + "expectedQty": "4156365251896820297952", + "reserves": [ + "30528575675989792807169340", + "37982956085651036090422155", + "24692460838324869909192678" + ], + "mAssetSupply": "93191848566780239141765187" + }, + { + "type": "redeemMasset", + "inputQty": "901156379328453611932876", + "expectedQtys": [ + "295119882682709256872508", + "367181412683983589288044", + "238702133473102577681424" + ], + "redemptionFee": "270346913798536083579", + "reserves": [ + "30233455793307083550296832", + "37615774672967052501134111", + "24453758704851767331511254" + ], + "mAssetSupply": "92290962534365584065915890" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "608030593237573406031872", + "530559125980347499544576", + "617577585886147960111104" + ], + "expectedQty": "1756584456162727588835888", + "swapFee": "1054583423751887685913", + "reserves": [ + "29625425200069510144264960", + "37085215546986705001589535", + "23836181118965619371400150" + ], + "mAssetSupply": "90534378078202856477080002" + }, + { + "type": "mintMulti", + "inputQtys": [ + "9731573409286012", + "1599591321646344", + "13933021127622804" + ], + "expectedQty": "25291870565905522", + "reserves": [ + "29625425209801083553550972", + "37085215548586296323235879", + "23836181132898640499022954" + ], + "mAssetSupply": "90534378103494727042985524" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "1604147089016034951168", + "expectedQty": "1601338415064486439080", + "reserves": [ + "29625425209801083553550972", + "37086819695675312358187047", + "23836181132898640499022954" + ] + }, + { + "type": "redeemMasset", + "inputQty": "134329592193540580966", + "expectedQtys": [ + "43942501535086911954", + "55009763399768812324", + "35355490042940753681" + ], + "redemptionFee": "40298877658062174", + "reserves": [ + "29625381267299548466639018", + "37086764685911912589374723", + "23836145777408597558269273" + ], + "mAssetSupply": "90535845152616475646905812" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "27245438776664672", + "expectedQty": "27276853152756678", + "swapFee": "16347263265998", + "reserves": [ + "29625381267299548466639018", + "37086764658635059436618045", + "23836145777408597558269273" + ], + "mAssetSupply": "90535845125387384133507138" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "47268372191482409385984", + "outputIndex": 0, + "expectedQty": "47340459966863176066358", + "swapFee": "28422353949624369595", + "reserves": [ + "29578040807332685290572660", + "37086764658635059436618045", + "23883414149600079967655257" + ], + "mAssetSupply": "90535873547741333757876733", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemBassets", + "inputQtys": [ + "69647649217749152956416", + "45410952923703433756672", + "33866085370357339914240" + ], + "expectedQty": "148920962481763594450283", + "swapFee": "89406221221791231409", + "reserves": [ + "29508393158114936137616244", + "37041353705711356002861373", + "23849548064229722627741017" + ], + "mAssetSupply": "90386952585259570163426450" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "510431718249856352911360", + "expectedQty": "508989210167182348412956", + "swapFee": "306259030949913811746", + "reserves": [ + "29508393158114936137616244", + "37041353705711356002861373", + "23340558854062540279328061" + ], + "mAssetSupply": "89876827126040663724326836" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "133513497620887168352256", + "98301891636436261666816", + "399243729195364765401088" + ], + "expectedQty": "631823120552360354149371", + "swapFee": "379321465210542538012", + "reserves": [ + "29374879660494048969263988", + "36943051814074919741194557", + "22941315124867175513926973" + ], + "mAssetSupply": "89245004005488303370177465" + }, + { + "type": "mintMulti", + "inputQtys": [ + "581343800987765765570560", + "145036006212677849317376", + "68614205244245968683008" + ], + "expectedQty": "794841059245906373775849", + "reserves": [ + "29956223461481814734834548", + "37088087820287597590511933", + "23009929330111421482609981" + ], + "mAssetSupply": "90039845064734209743953314" + }, + { + "type": "redeemMasset", + "inputQty": "1645343790286248960", + "expectedQtys": [ + "547241054573953294", + "677526134661221728", + "420345976136587349" + ], + "redemptionFee": "493603137085874", + "reserves": [ + "29956222914240760160881254", + "37088087142761462929290205", + "23009928909765445346022632" + ], + "mAssetSupply": "90039843419884022594790228" + }, + { + "type": "mintMulti", + "inputQtys": [ + "460416414659872685031424", + "1764264211419615801114624", + "1133411725682018160214016" + ], + "expectedQty": "3357548646730395668322299", + "reserves": [ + "30416639328900632845912678", + "38852351354181078730404829", + "24143340635447463506236648" + ], + "mAssetSupply": "93397392066614418263112527" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "1487476414297255444480", + "2181162292164735008768", + "3458664443340684525568" + ], + "expectedQty": "7131439792637562460859", + "swapFee": "4281432735223671679", + "reserves": [ + "30415151852486335590468198", + "38850170191888913995396061", + "24139881971004122821711080" + ], + "mAssetSupply": "93390260626821780700651668" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "18060529102208450428928", + "expectedQty": "18006946292186162054890", + "swapFee": "10836317461325070257", + "reserves": [ + "30415151852486335590468198", + "38850170191888913995396061", + "24121875024711936659656190" + ], + "mAssetSupply": "93372210934037033575292997" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "145834516952036261888", + "72564269497516408832", + "134771267521909833728" + ], + "expectedQty": "353359284366663543879", + "swapFee": "212142856333798405", + "reserves": [ + "30415006017969383554206310", + "38850097627619416478987229", + "24121740253444414749822462" + ], + "mAssetSupply": "93371857574752666911749118" + }, + { + "type": "mintMulti", + "inputQtys": [ + "239566155746620014592", + "462681990867279085568", + "263082455426248015872" + ], + "expectedQty": "965089148731296571776", + "reserves": [ + "30415245584125130174220902", + "38850560309610283758072797", + "24122003335899840997838334" + ], + "mAssetSupply": "93372822663901398208320894" + }, + { + "type": "mintMulti", + "inputQtys": [ + "34972568656791589617664", + "4195577028817492901888", + "15743361574171702198272" + ], + "expectedQty": "54942453733454033057647", + "reserves": [ + "30450218152781921763838566", + "38854755886639101250974685", + "24137746697474012700036606" + ], + "mAssetSupply": "93427765117634852241378541" + }, + { + "type": "mintMulti", + "inputQtys": [ + "420857579083608161779712", + "2130137534797113016188928", + "11001702358288238553071616" + ], + "expectedQty": "13561647835430688812372949", + "reserves": [ + "30871075731865529925618278", + "40984893421436214267163613", + "35139449055762251253108222" + ], + "mAssetSupply": "106989412953065541053751490" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "2819562773645248492994560", + "1278389007813206974922752", + "1526455148259082305011712" + ], + "expectedQty": "5626919159977201700320799", + "swapFee": "3378178403028137902934", + "reserves": [ + "28051512958220281432623718", + "39706504413623007292240861", + "33612993907503168948096510" + ], + "mAssetSupply": "101362493793088339353430691" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "311637062129472724008960", + "40777306307531959697408", + "720562854809612043943936" + ], + "expectedQty": "1073441330662850831348692", + "swapFee": "644451469279278065648", + "reserves": [ + "27739875896090808708614758", + "39665727107315475332543453", + "32892431052693556904152574" + ], + "mAssetSupply": "100289052462425488522081999" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "12088758167757774848", + "23837751523953704960", + "14821830262966757376" + ], + "expectedQty": "50735084688421469127", + "swapFee": "30459326408898220", + "reserves": [ + "27739863807332640950839910", + "39665703269563951378838493", + "32892416230863293937395198" + ], + "mAssetSupply": "100289001727340800100612872" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "478537240311264641024", + "outputIndex": 0, + "expectedQty": "477481391861991463083", + "swapFee": "287136833397484634", + "reserves": [ + "27739386325940778959376827", + "39665703269563951378838493", + "32892894768103605202036222" + ], + "mAssetSupply": "100289002014477633498097506", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemMasset", + "inputQty": "2621473173652902297", + "expectedQtys": [ + "724867535120365582", + "1036518263958008193", + "859535653506213472" + ], + "redemptionFee": "786441952095870", + "reserves": [ + "27739385601073243839011245", + "39665702233045687420830300", + "32892893908567951695822750" + ], + "mAssetSupply": "100288999393790901797291079" + }, + { + "type": "mintMulti", + "inputQtys": [ + "195655756352454623232", + "499310286193456381952", + "125993046942642257920" + ], + "expectedQty": "820576562751158608989", + "reserves": [ + "27739581256829596293634477", + "39666201543331880877212252", + "32893019901614894338080670" + ], + "mAssetSupply": "100289819970353652955900068" + }, + { + "type": "mintMulti", + "inputQtys": [ + "3384877255708316237037568", + "4771612086928357623595008", + "4900203301849820882272256" + ], + "expectedQty": "13055674354765142767110972", + "reserves": [ + "31124458512537912530672045", + "44437813630260238500807260", + "37793223203464715220352926" + ], + "mAssetSupply": "113345494325118795723011040" + }, + { + "type": "mintMulti", + "inputQtys": [ + "2307965910373567909855232", + "2035935808012633602260992", + "6279737180613518213251072" + ], + "expectedQty": "10623156582941319061950451", + "reserves": [ + "33432424422911480440527277", + "46473749438272872103068252", + "44072960384078233433603998" + ], + "mAssetSupply": "123968650908060114784961491" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "4282811359875493265408", + "expectedQty": "4278410221364054424203", + "reserves": [ + "33432424422911480440527277", + "46478032249632747596333660", + "44072960384078233433603998" + ] + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "169692036057999245312", + "expectedQty": "169264259378921054809", + "swapFee": "101815221634799547", + "reserves": [ + "33432255158652101519472468", + "46478032249632747596333660", + "44072960384078233433603998" + ], + "mAssetSupply": "123972759728060642474939929" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "125210943131521843200", + "expectedQty": "125264572882064367718", + "swapFee": "75126565878913105", + "reserves": [ + "33432255158652101519472468", + "46477906985059865531965942", + "44072960384078233433603998" + ], + "mAssetSupply": "123972634592244076832009834" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "123813093411010979561472", + "expectedQty": "124049809312112056187834", + "reserves": [ + "33556068252063112499033940", + "46477906985059865531965942", + "44072960384078233433603998" + ] + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "663446685377998868185088", + "expectedQty": "663019006787268177877636", + "reserves": [ + "33556068252063112499033940", + "46477906985059865531965942", + "44736407069456232301789086" + ] + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "316248112038164627456", + "expectedQty": "315937832561440544006", + "reserves": [ + "33556068252063112499033940", + "46478223233171903696593398", + "44736407069456232301789086" + ] + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "96327265813665142538240", + "expectedQty": "96080759770622193457526", + "swapFee": "57796359488199085522", + "reserves": [ + "33459987492292490305576414", + "46478223233171903696593398", + "44736407069456232301789086" + ], + "mAssetSupply": "124663749876721841563166592" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "99453678113138832", + "outputIndex": 2, + "expectedQty": "99659313191881913", + "swapFee": "59790055565895", + "reserves": [ + "33459987591746168418715246", + "46478223233171903696593398", + "44736406969796919109907173" + ], + "mAssetSupply": "124663749876781631618732487", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemBassets", + "inputQtys": [ + "2504367949182439424", + "2592860511751939072", + "88829038620163616" + ], + "expectedQty": "5188377399496325176", + "swapFee": "3114895376923949", + "reserves": [ + "33459985087378219236275822", + "46478220640311391944654326", + "44736406880967880489743557" + ], + "mAssetSupply": "124663744688404232122407311" + }, + { + "type": "redeemMasset", + "inputQty": "15725918408680003128524", + "expectedQtys": [ + "4219600013267186055574", + "5861314639511700756371", + "5641656521229773465064" + ], + "redemptionFee": "4717775522604000938", + "reserves": [ + "33455765487364952050220248", + "46472359325671880243897955", + "44730765224446650716278493" + ], + "mAssetSupply": "124648023487771074723279725" + }, + { + "type": "redeemMasset", + "inputQty": "40345107767646408094515", + "expectedQtys": [ + "10825454695075987050794", + "15037301138524240566695", + "14473764547285710493503" + ], + "redemptionFee": "12103532330293922428", + "reserves": [ + "33444940032669876063169454", + "46457322024533356003331260", + "44716291459899365005784990" + ], + "mAssetSupply": "124607690483535758609107638" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "1448141318319298314240", + "outputIndex": 0, + "expectedQty": "1442990623126480009573", + "swapFee": "868025321946034974", + "reserves": [ + "33443497042046749583159881", + "46458770165851675301645500", + "44716291459899365005784990" + ], + "mAssetSupply": "124607691351561080555142612", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "201294525113044318552064", + "expectedQty": "201152713963966532017266", + "reserves": [ + "33443497042046749583159881", + "46458770165851675301645500", + "44917585985012409324337054" + ] + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "2709135747158767566848", + "expectedQty": "2710161364040421373090", + "swapFee": "1625481448295260540", + "reserves": [ + "33443497042046749583159881", + "46456060004487634880272410", + "44917585985012409324337054" + ], + "mAssetSupply": "124806136555259336614853570" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "82598025448398776172544", + "expectedQty": "82761784023039736950499", + "reserves": [ + "33526095067495148359332425", + "46456060004487634880272410", + "44917585985012409324337054" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "4844694461162142720", + "63129673983773794304", + "71425173966286651392" + ], + "expectedQty": "139297097864524614352", + "swapFee": "83628435780182878", + "reserves": [ + "33526090222800687197189705", + "46455996874813651106478106", + "44917514559838443037685662" + ], + "mAssetSupply": "124888759042184511827189717" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "893153286721174591504384", + "168366817462638115553280", + "1082258186426053721849856" + ], + "expectedQty": "2144668488359555499247649", + "swapFee": "1287573637198052130827", + "reserves": [ + "32632936936079512605685321", + "46287630057351012990924826", + "43835256373412389315835806" + ], + "mAssetSupply": "122744090553824956327942068" + }, + { + "type": "redeemMasset", + "inputQty": "65917639089644992", + "expectedQtys": [ + "17519709697118337", + "24850531926098373", + "23533921193340371" + ], + "redemptionFee": "19775291726893", + "reserves": [ + "32632936918559802908566984", + "46287630032500481064826453", + "43835256349878468122495435" + ], + "mAssetSupply": "122744090487927092530023969" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "13507777634466291712", + "51037867673965395968", + "9340634017669345280" + ], + "expectedQty": "73852627640719073846", + "swapFee": "44338179492126720", + "reserves": [ + "32632923410782168442275272", + "46287578994632807099430485", + "43835247009244450453150155" + ], + "mAssetSupply": "122744016635299451810950123" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "25093247216245803057152", + "expectedQty": "25145215885153147545463", + "reserves": [ + "32658016657998414245332424", + "46287578994632807099430485", + "43835247009244450453150155" + ] + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "14646264901618412417974272", + "expectedQty": "14630924889504392890219426", + "swapFee": "8787758940971047450784", + "reserves": [ + "32658016657998414245332424", + "46287578994632807099430485", + "29204322119740057562930729" + ], + "mAssetSupply": "108131684708507163587972098" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "908842854655823446016", + "outputIndex": 1, + "expectedQty": "911929368738603979469", + "swapFee": "546333286774827160", + "reserves": [ + "32658016657998414245332424", + "46286667065264068495451016", + "29205230962594713386376745" + ], + "mAssetSupply": "108131685254840450362799258", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "118660007599962975109120", + "expectedQty": "118881731345697227237502", + "reserves": [ + "32658016657998414245332424", + "46286667065264068495451016", + "29323890970194676361485865" + ] + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "11108894264840003584", + "expectedQty": "11117262584837868536", + "reserves": [ + "32658027766892679085336008", + "46286667065264068495451016", + "29323890970194676361485865" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "190048816251383119872", + "590111503840707936256", + "389522578928097951744" + ], + "expectedQty": "1169311870343835440420", + "reserves": [ + "32658217815708930468455880", + "46287257176767909203387272", + "29324280492773604459437609" + ], + "mAssetSupply": "108251747415319076263345716" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "5855559624159441977344", + "expectedQty": "5864327029143530558588", + "swapFee": "3513335774495665186", + "reserves": [ + "32658217815708930468455880", + "46281392849738765672828684", + "29324280492773604459437609" + ], + "mAssetSupply": "108245895369030691317033558" + }, + { + "type": "redeemMasset", + "inputQty": "327181056556719400393113", + "expectedQtys": [ + "98682214496201430326112", + "139846894345350312050599", + "88608170655984804561013" + ], + "redemptionFee": "98154316967015820117", + "reserves": [ + "32559535601212729038129768", + "46141545955393415360778085", + "29235672322117619654876596" + ], + "mAssetSupply": "107918812466790938932460562" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "11161902398253262", + "expectedQty": "11170306121776925", + "reserves": [ + "32559535612374631436383030", + "46141545955393415360778085", + "29235672322117619654876596" + ] + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "9721305555296327827456", + "expectedQty": "9735852389404662748274", + "swapFee": "5832783333177796696", + "reserves": [ + "32559535612374631436383030", + "46131810103004010698029811", + "29235672322117619654876596" + ], + "mAssetSupply": "107909097005189281904206727" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "95472038378731403739136", + "367815369444284891660288", + "570128799036841998155776" + ], + "expectedQty": "1033797510168394873827666", + "swapFee": "620650896639020336498", + "reserves": [ + "32464063573995900032643894", + "45763994733559725806369523", + "28665543523080777656720820" + ], + "mAssetSupply": "106875299495020887030379061" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "19691960283529901768704", + "10667466677943921541120", + "25053143256197727518720" + ], + "expectedQty": "55452624806320409799151", + "swapFee": "33291549813680454151", + "reserves": [ + "32444371613712370130875190", + "45753327266881781884828403", + "28640490379824579929202100" + ], + "mAssetSupply": "106819846870214566620579910" + }, + { + "type": "redeemMasset", + "inputQty": "171906010240048281", + "expectedQtys": [ + "52197315643876216", + "73609096010281227", + "46077536478446437" + ], + "redemptionFee": "51571803072014", + "reserves": [ + "32444371561515054486998974", + "45753327193272685874547176", + "28640490333747043450755663" + ], + "mAssetSupply": "106819846698360128183603643" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "220950668707736748032", + "outputIndex": 2, + "expectedQty": "219919412348692099113", + "swapFee": "132290018285558622", + "reserves": [ + "32444371561515054486998974", + "45753548143941393611295208", + "28640270414334694758656550" + ], + "mAssetSupply": "106819846830650146469162265", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mintMulti", + "inputQtys": [ + "161509174200595384369152", + "115116527887314443042816", + "177070957734839946575872" + ], + "expectedQty": "453910046135825685192463", + "reserves": [ + "32605880735715649871368126", + "45868664671828708054338024", + "28817341372069534705232422" + ], + "mAssetSupply": "107273756876785972154354728" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "16118864549103771058176", + "7391493348535674339328", + "27656962788076761907200" + ], + "expectedQty": "51216545795054359454794", + "swapFee": "30748376502934376298", + "reserves": [ + "32589761871166546100309950", + "45861273178480172379998696", + "28789684409281457943325222" + ], + "mAssetSupply": "107222540330990917794899934" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "2449617116187284", + "outputIndex": 0, + "expectedQty": "2451250724766682", + "swapFee": "1472633033719", + "reserves": [ + "32589761868715295375543268", + "45861273178480172379998696", + "28789684411731075059512506" + ], + "mAssetSupply": "107222540330992390427933653", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mintMulti", + "inputQtys": [ + "58959169560740068589568", + "229353599934038542385152", + "410050266419273029124096" + ], + "expectedQty": "698706319002085695427111", + "reserves": [ + "32648721038276035444132836", + "46090626778414210922383848", + "29199734678150348088636602" + ], + "mAssetSupply": "107921246649994476123360764" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "98693082085515239358464", + "144707641957679724756992", + "247219376251473749868544" + ], + "expectedQty": "490854876240965119269681", + "swapFee": "294689739588332070804", + "reserves": [ + "32550027956190520204774372", + "45945919136456531197626856", + "28952515301898874338768058" + ], + "mAssetSupply": "107430391773753511004091083" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "9278077917446491078656", + "expectedQty": "9295768459134185858726", + "reserves": [ + "32550027956190520204774372", + "45945919136456531197626856", + "28961793379816320829846714" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "1563694206978453214855168", + "801980975003264889126912", + "166957264973967698952192" + ], + "expectedQty": "2532534839487112455715292", + "swapFee": "1520433163590421726465", + "reserves": [ + "30986333749212066989919204", + "45143938161453266308499944", + "28794836114842353130894522" + ], + "mAssetSupply": "104907152702725532734234517" + }, + { + "type": "redeemMasset", + "inputQty": "6734732774866595872768", + "expectedQtys": [ + "1988635347502965928904", + "2897239534045774348133", + "1847989806957609769955" + ], + "redemptionFee": "2020419832459978761", + "reserves": [ + "30984345113864564023990300", + "45141040921919220534151811", + "28792988125035395521124567" + ], + "mAssetSupply": "104900419990370498598340510" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "5068726802072529272832", + "expectedQty": "5076577190026724145834", + "swapFee": "3041236081243517563", + "reserves": [ + "30984345113864564023990300", + "45135964344729193810005977", + "28792988125035395521124567" + ], + "mAssetSupply": "104895354304804507312585241" + }, + { + "type": "redeemMasset", + "inputQty": "48540226499944062019174", + "expectedQtys": [ + "14333675152776722667017", + "20880359040900427465264", + "13319930982738119855378" + ], + "redemptionFee": "14562067949983218605", + "reserves": [ + "30970011438711787301323283", + "45115083985688293382540713", + "28779668194052657401269189" + ], + "mAssetSupply": "104846828640372513233784672" + }, + { + "type": "mintMulti", + "inputQtys": [ + "24343940009646260224", + "131097926625786396672", + "158170846567137247232" + ], + "expectedQty": "313625231774413842684", + "reserves": [ + "30970035782651796947583507", + "45115215083614919168937385", + "28779826364899224538516421" + ], + "mAssetSupply": "104847142265604287647627356" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "3954149171725034485448704", + "expectedQty": "3959335575277312875408415", + "swapFee": "2372489503035020691269", + "reserves": [ + "30970035782651796947583507", + "41155879508337606293528970", + "28779826364899224538516421" + ], + "mAssetSupply": "100895365583382288182869921" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "2073773936377814319104", + "77162856156561571840", + "29138005916469115748352" + ], + "expectedQty": "31329339232344441629649", + "swapFee": "18808888872730303159", + "reserves": [ + "30967962008715419133264403", + "41155802345481449731957130", + "28750688358982755422768069" + ], + "mAssetSupply": "100864036244149943741240272" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "34804862808253824", + "expectedQty": "34737113817795555", + "swapFee": "20882917684952", + "reserves": [ + "30967962008715419133264403", + "41155802345481449731957130", + "28750688324245641604972514" + ], + "mAssetSupply": "100864036209365963850671400" + }, + { + "type": "mintMulti", + "inputQtys": [ + "7427945108556399771648", + "11006667790343225737216", + "354256276773032755200" + ], + "expectedQty": "18775642034585255748491", + "reserves": [ + "30975389953823975533036051", + "41166809013271792957694346", + "28751042580522414637727714" + ], + "mAssetSupply": "100882811851400549106419891" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "2892547785030618706870272", + "expectedQty": "2895119526460525839093606", + "swapFee": "1735528671018371224122", + "reserves": [ + "30975389953823975533036051", + "38271689486811267118600740", + "28751042580522414637727714" + ], + "mAssetSupply": "97991999595040948770773741" + }, + { + "type": "redeemMasset", + "inputQty": "1061554081997308454502", + "expectedQtys": [ + "335457865614467282771", + "414475468681562484101", + "311368586243158787248" + ], + "redemptionFee": "318466224599192536", + "reserves": [ + "30975054495958361065753280", + "38271275011342585556116639", + "28750731211936171478940466" + ], + "mAssetSupply": "97990938359425176061511775" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "184491182242062865006592", + "expectedQty": "184249120535446756354463", + "reserves": [ + "30975054495958361065753280", + "38455766193584648421123231", + "28750731211936171478940466" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "1368170639891302144", + "8328441946698673152", + "6255649191109025792" + ], + "expectedQty": "15948707782428445765", + "swapFee": "9574969651247816", + "reserves": [ + "30975053127787721174451136", + "38455757865142701722450079", + "28750724956286980369914674" + ], + "mAssetSupply": "98175171531252840389420473" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "213372427061097125642240", + "expectedQty": "213602900333088728466264", + "reserves": [ + "30975053127787721174451136", + "38455757865142701722450079", + "28964097383348077495556914" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "109548834674248211496960", + "164935055949681569824768", + "171197165927148336185344" + ], + "expectedQty": "445693802112358862228222", + "reserves": [ + "31084601962461969385948096", + "38620692921092383292274847", + "29135294549275225831742258" + ], + "mAssetSupply": "98834468233698287980114959" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "28476650294141044", + "expectedQty": "28489296004315111", + "reserves": [ + "31084601990938619680089140", + "38620692921092383292274847", + "29135294549275225831742258" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "487453981804911808", + "1001158499981118080", + "552233148238093056" + ], + "expectedQty": "2040333810393356140", + "reserves": [ + "31084602478392601485000948", + "38620693922250883273392927", + "29135295101508374069835314" + ], + "mAssetSupply": "98834470302521394377786210" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "6707134362538407555497984", + "outputIndex": 2, + "expectedQty": "6684154847604061373967114", + "swapFee": "4023748273113809827442", + "reserves": [ + "37791736840931009040498932", + "38620693922250883273392927", + "22451140253904312695868200" + ], + "mAssetSupply": "98838494050794508187613652", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "464010931489734262784", + "expectedQty": "464464152829002645031", + "swapFee": "278406558893840557", + "reserves": [ + "37791736840931009040498932", + "38620229458098054270747896", + "22451140253904312695868200" + ], + "mAssetSupply": "98838030318269577347191425" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "5332227090560298516480", + "expectedQty": "5324724354975378458537", + "reserves": [ + "37797069068021569339015412", + "38620229458098054270747896", + "22451140253904312695868200" + ] + }, + { + "type": "redeemMasset", + "inputQty": "1788521064965043", + "expectedQtys": [ + "683713881794942", + "698604088880210", + "406120279487667" + ], + "redemptionFee": "536556319489", + "reserves": [ + "37797069067337855457220470", + "38620229457399450181867686", + "22451140253498192416380533" + ], + "mAssetSupply": "98843355040836568217004408" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "3876267296824833817444352", + "outputIndex": 0, + "expectedQty": "3888726852963987803687134", + "swapFee": "2333124357263018604845", + "reserves": [ + "33908342214373867653533336", + "38620229457399450181867686", + "26327407550323026233824885" + ], + "mAssetSupply": "98845688165193831235609253", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemBassets", + "inputQtys": [ + "2144464263868768845824", + "1378425180806735462400", + "2820448694537838657536" + ], + "expectedQty": "6346508012213415154904", + "swapFee": "3810190921881177799", + "reserves": [ + "33906197750109998884687512", + "38618851032218643446405286", + "26324587101628488395167349" + ], + "mAssetSupply": "98839341657181617820454349" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "3107301557781349504385024", + "outputIndex": 2, + "expectedQty": "3094573984736016071030609", + "swapFee": "1863281521955681923205", + "reserves": [ + "37013499307891348389072536", + "38618851032218643446405286", + "23230013116892472324136740" + ], + "mAssetSupply": "98841204938703573502377554", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "10433741834874936885248", + "expectedQty": "10470321768884452634940", + "reserves": [ + "37013499307891348389072536", + "38618851032218643446405286", + "23240446858727347261021988" + ] + }, + { + "type": "redeemMasset", + "inputQty": "1207424320895913767731", + "expectedQtys": [ + "451965956553671532051", + "471568651280132594400", + "283785402397768610544" + ], + "redemptionFee": "362227296268774130", + "reserves": [ + "37013047341934794717540485", + "38618379463567363313810886", + "23240163073324949492411444" + ], + "mAssetSupply": "98850468198378858310018893" + }, + { + "type": "mintMulti", + "inputQtys": [ + "78598695983946661888", + "197761914314610933760", + "393836039138793619456" + ], + "expectedQty": "671183159205445941522", + "reserves": [ + "37013125940630778664202373", + "38618577225481677924744646", + "23240556909364088286030900" + ], + "mAssetSupply": "98851139381538063755960415" + }, + { + "type": "redeemMasset", + "inputQty": "19803413746338755719987", + "expectedQtys": [ + "7412826556760922727110", + "7734359300010380757476", + "4654516825408983458499" + ], + "redemptionFee": "5941024123901626715", + "reserves": [ + "37005713114074017741475263", + "38610842866181667543987170", + "23235902392538679302572401" + ], + "mAssetSupply": "98831341908815848901867143" + }, + { + "type": "mintMulti", + "inputQtys": [ + "877182180716815187968", + "1402385609558231613440", + "1283341616067601760256" + ], + "expectedQty": "3564236385225612292127", + "reserves": [ + "37006590296254734556663231", + "38612245251791225775600610", + "23237185734154746904332657" + ], + "mAssetSupply": "98834906145201074514159270" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "12607597516483548", + "expectedQty": "12588473160515593", + "reserves": [ + "37006590296254734556663231", + "38612245264398823292084158", + "23237185734154746904332657" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "57938630884942149582848", + "83307900659023394897920", + "80029373673169743773696" + ], + "expectedQty": "221360784736702557858069", + "reserves": [ + "37064528927139676706246079", + "38695553165057846686982078", + "23317215107827916648106353" + ], + "mAssetSupply": "99056266942526250232532932" + }, + { + "type": "redeemMasset", + "inputQty": "815035332042577402029670", + "expectedQtys": [ + "304875591450089726443667", + "318291638911052510859814", + "191796576207466829885028" + ], + "redemptionFee": "244510599612773220608", + "reserves": [ + "36759653335689586979802412", + "38377261526146794176122264", + "23125418531620449818221325" + ], + "mAssetSupply": "98241476121083285603723870" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "1270719557585764352", + "263696192044634734592", + "285827776870993952768" + ], + "expectedQty": "551390804199686804256", + "swapFee": "331033102381240827", + "reserves": [ + "36759652064970029394038060", + "38376997829954749541387672", + "23125132703843578824268557" + ], + "mAssetSupply": "98240924730279085916919614" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "49108521218068635648", + "29884586607756095488", + "65570574172146442240" + ], + "expectedQty": "144689154376479383726", + "swapFee": "86865611993083480", + "reserves": [ + "36759602956448811325402412", + "38376967945368141785292184", + "23125067133269406677826317" + ], + "mAssetSupply": "98240780041124709437535888" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "360603881183673253888", + "expectedQty": "359134828345828384616", + "swapFee": "216362328710203952", + "reserves": [ + "36759602956448811325402412", + "38376967945368141785292184", + "23124707998441060849441701" + ], + "mAssetSupply": "98240419653605854474485952" + }, + { + "type": "redeemMasset", + "inputQty": "389812427543469824", + "expectedQtys": [ + "145816266965044798", + "152231954459917597", + "91730005870420832" + ], + "redemptionFee": "116943728263040", + "reserves": [ + "36759602810632544360357614", + "38376967793136187325374587", + "23124707906711054979020869" + ], + "mAssetSupply": "98240419263910370659279168" + }, + { + "type": "redeemMasset", + "inputQty": "6399859411640593612", + "expectedQtys": [ + "2393981162651550901", + "2499312586421070941", + "1506004170003517750" + ], + "redemptionFee": "1919957823492178", + "reserves": [ + "36759600416651381708806713", + "38376965293823600904303646", + "23124706400706884975503119" + ], + "mAssetSupply": "98240412865970916842177734" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "13429721152424409088", + "expectedQty": "13409382784569546218", + "reserves": [ + "36759600416651381708806713", + "38376978723544753328712734", + "23124706400706884975503119" + ] + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "103176106019801589088256", + "expectedQty": "103019111716214678352205", + "reserves": [ + "36759600416651381708806713", + "38480154829564554917800990", + "23124706400706884975503119" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "251110887479863851089920", + "593568213542255665872896", + "464410979913473923743744" + ], + "expectedQty": "1309499937242062827407088", + "reserves": [ + "37010711304131245559896633", + "39073723043106810583673886", + "23589117380620358899246863" + ], + "mAssetSupply": "99652945324311978917483245" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "5157748352913849481953280", + "expectedQty": "5158313830875371938340094", + "swapFee": "3094649011748309689171", + "reserves": [ + "31852397473255873621556539", + "39073723043106810583673886", + "23589117380620358899246863" + ], + "mAssetSupply": "94498291620409877745219136" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "114680001853564039200768", + "outputIndex": 1, + "expectedQty": "115140449992572725991892", + "swapFee": "68997166878171048888", + "reserves": [ + "31852397473255873621556539", + "38958582593114237857681994", + "23703797382473922938447631" + ], + "mAssetSupply": "94498360617576755916268024", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "1459041356777374089216", + "expectedQty": "1460871782521349234326", + "swapFee": "875424814066424453", + "reserves": [ + "31852397473255873621556539", + "38957121721331716508447668", + "23703797382473922938447631" + ], + "mAssetSupply": "94496902451644792608603261" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "130970569150055246200832", + "63091199127995591688192", + "237314292712194913075200" + ], + "expectedQty": "431873843805539312288964", + "swapFee": "259279874207848296351", + "reserves": [ + "31721426904105818375355707", + "38894030522203720916759476", + "23466483089761728025372431" + ], + "mAssetSupply": "94065028607839253296314297" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "67813042456692640", + "87835069999875664", + "148858388087570848" + ], + "expectedQty": "304735660637973698", + "swapFee": "182951167083034", + "reserves": [ + "31721426836292775918663067", + "38894030434368650916883812", + "23466482940903339937801583" + ], + "mAssetSupply": "94065028303103592658340599" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "882222680232057699827712", + "expectedQty": "883303163828554741101022", + "swapFee": "529333608139234619896", + "reserves": [ + "31721426836292775918663067", + "38010727270540096175782790", + "23466482940903339937801583" + ], + "mAssetSupply": "93183334956479674193132783" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "3996360378291161281855488", + "outputIndex": 1, + "expectedQty": "4006232303109711484022170", + "swapFee": "2402663743780801757871", + "reserves": [ + "31721426836292775918663067", + "34004494967430384691760620", + "27462843319194501219657071" + ], + "mAssetSupply": "93185737620223454994890654", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "3805811808012558812577792", + "expectedQty": "3801879624549215508274085", + "reserves": [ + "31721426836292775918663067", + "37810306775442943504338412", + "27462843319194501219657071" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "573305208115248005906432", + "3293290493791398162071552", + "3193781034585811392135168" + ], + "expectedQty": "7061467729411650932200471", + "swapFee": "4239424292222323953692", + "reserves": [ + "31148121628177527912756635", + "34517016281651545342266860", + "24269062284608689827521903" + ], + "mAssetSupply": "89926149515361019570964268" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "281228797334452514586624", + "expectedQty": "281168295050124762332146", + "swapFee": "168737278400671508751", + "reserves": [ + "30866953333127403150424489", + "34517016281651545342266860", + "24269062284608689827521903" + ], + "mAssetSupply": "89645089455304967727886395" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "3945121046635622170624", + "5551342579805059022848", + "373212754013272408064" + ], + "expectedQty": "9862117961430354507353", + "swapFee": "5920823270820705127", + "reserves": [ + "30863008212080767528253865", + "34511464939071740283244012", + "24268689071854676555113839" + ], + "mAssetSupply": "89635227337343537373379042" + }, + { + "type": "mintMulti", + "inputQtys": [ + "27456871420219400192", + "243861336844157517824", + "341321890232419418112" + ], + "expectedQty": "612972352820532453244", + "reserves": [ + "30863035668952187747654057", + "34511708800408584440761836", + "24269030393744908974531951" + ], + "mAssetSupply": "89635840309696357905832286" + }, + { + "type": "mintMulti", + "inputQtys": [ + "74979067637300373487616", + "193609561792782973009920", + "97322923265232969138176" + ], + "expectedQty": "365828601379506722519086", + "reserves": [ + "30938014736589488121141673", + "34705318362201367413771756", + "24366353317010141943670127" + ], + "mAssetSupply": "90001668911075864628351372" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "5381697676979532201984", + "outputIndex": 0, + "expectedQty": "5390456038414022574473", + "swapFee": "3235097003211946840", + "reserves": [ + "30932624280551074098567200", + "34705318362201367413771756", + "24371735014687121475872111" + ], + "mAssetSupply": "90001672146172867840298212", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "688347657779282960187392", + "expectedQty": "688068285857226760083908", + "reserves": [ + "31620971938330357058754592", + "34705318362201367413771756", + "24371735014687121475872111" + ] + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "2745779253540353998848", + "expectedQty": "2745410371107343137609", + "swapFee": "1647467552124212399", + "reserves": [ + "31618226527959249715616983", + "34705318362201367413771756", + "24371735014687121475872111" + ], + "mAssetSupply": "90686996300244106370595671" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "7351302455537623367680", + "50017314790956381241344", + "75551138570131027787776" + ], + "expectedQty": "133005411325585704413831", + "swapFee": "79851157489845329846", + "reserves": [ + "31610875225503712092249303", + "34655301047410411032530412", + "24296183876116990448084335" + ], + "mAssetSupply": "90553990888918520666181840" + }, + { + "type": "mintMulti", + "inputQtys": [ + "611877895646042783744", + "233328616326511853568", + "374793665486386561024" + ], + "expectedQty": "1220171184754471145291", + "reserves": [ + "31611487103399358135033047", + "34655534376026737544383980", + "24296558669782476834645359" + ], + "mAssetSupply": "90555211060103275137327131" + }, + { + "type": "mintMulti", + "inputQtys": [ + "65475513339142740115456", + "107548164721877717090304", + "56202746060729674104832" + ], + "expectedQty": "229177972711612356237147", + "reserves": [ + "31676962616738500875148503", + "34763082540748615261474284", + "24352761415843206508750191" + ], + "mAssetSupply": "90784389032814887493564278" + }, + { + "type": "mintMulti", + "inputQtys": [ + "33096534172706512306176", + "9466947587721845014528", + "21256977014036474363904" + ], + "expectedQty": "63835488164067416113654", + "reserves": [ + "31710059150911207387454679", + "34772549488336337106488812", + "24374018392857242983114095" + ], + "mAssetSupply": "90848224520978954909677932" + }, + { + "type": "redeemMasset", + "inputQty": "37848971256156291072", + "expectedQtys": [ + "13207006143764369451", + "14482510819082215895", + "10151599185946051390" + ], + "redemptionFee": "11354691376846887", + "reserves": [ + "31710045943905063623085228", + "34772535005825518024272917", + "24374008241258057037062705" + ], + "mAssetSupply": "90848186683362390130233747" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "91193736738544356950016", + "90503133280505507610624", + "41109195991159268179968" + ], + "expectedQty": "222736019678352008343915", + "swapFee": "133721844913959580754", + "reserves": [ + "31618852207166519266135212", + "34682031872545012516662293", + "24332899045266897768882737" + ], + "mAssetSupply": "90625450663684038121889832" + }, + { + "type": "mintMulti", + "inputQtys": [ + "56752047083042149236736", + "23642125799415194058752", + "9046967840971649187840" + ], + "expectedQty": "89403853434833772263690", + "reserves": [ + "31675604254249561415371948", + "34705673998344427710721045", + "24341946013107869418070577" + ], + "mAssetSupply": "90714854517118871894153522" + }, + { + "type": "redeemMasset", + "inputQty": "150626680610520468501299", + "expectedQtys": [ + "52579699247739430740546", + "57609442471116413297386", + "40406244193501466058791" + ], + "redemptionFee": "45188004183156140550", + "reserves": [ + "31623024555001821984631402", + "34648064555873311297423659", + "24301539768914367952011786" + ], + "mAssetSupply": "90564273024512534581792773" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "71406638621918568120320", + "expectedQty": "71397538992269446415132", + "swapFee": "42843983173151140872", + "reserves": [ + "31551627016009552538216270", + "34648064555873311297423659", + "24301539768914367952011786" + ], + "mAssetSupply": "90492909229873789164813325" + }, + { + "type": "mintMulti", + "inputQtys": [ + "2424631917229131983486976", + "2790252005656154467205120", + "680491509165896123809792" + ], + "expectedQty": "5892017876734404836544716", + "reserves": [ + "33976258933238684521703246", + "37438316561529465764628779", + "24982031278080264075821578" + ], + "mAssetSupply": "96384927106608194001358041" + }, + { + "type": "redeemMasset", + "inputQty": "60567856813740829494476", + "expectedQtys": [ + "21344123890903443747242", + "23519012747292377537227", + "15693887066657768393152" + ], + "redemptionFee": "18170357044122248848", + "reserves": [ + "33954914809347781077956004", + "37414797548782173387091552", + "24966337391013606307428426" + ], + "mAssetSupply": "96324377420151497294112413" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "204382838393484896894976", + "5562137320933590919282688", + "1203037397994098581831680" + ], + "expectedQty": "6966432249150762237724555", + "swapFee": "4182368770752909088087", + "reserves": [ + "33750531970954296181061028", + "31852660227848582467808864", + "23763299993019507725596746" + ], + "mAssetSupply": "89357945171000735056387858" + }, + { + "type": "mintMulti", + "inputQtys": [ + "15582853836725179908096", + "2681806284988256616448", + "8688674884991657705472" + ], + "expectedQty": "26952458369906648617141", + "reserves": [ + "33766114824791021360969124", + "31855342034133570724425312", + "23771988667904499383302218" + ], + "mAssetSupply": "89384897629370641705004999" + }, + { + "type": "mintMulti", + "inputQtys": [ + "393139430526961088", + "410576623929794304", + "226945072630359104" + ], + "expectedQty": "1030432734229846237", + "reserves": [ + "33766115217930451887930212", + "31855342444710194654219616", + "23771988894849572013661322" + ], + "mAssetSupply": "89384898659803375934851236" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "2630240051235487133728768", + "expectedQty": "2631005107734880692703479", + "swapFee": "1578144030741292280237", + "reserves": [ + "31135110110195571195226733", + "31855342444710194654219616", + "23771988894849572013661322" + ], + "mAssetSupply": "86756236752598630093402705" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "660714944613635309174784", + "949195495701129585491968", + "1300760940090111933022208" + ], + "expectedQty": "2911793718418726340960756", + "swapFee": "1748125106114904747424", + "reserves": [ + "30474395165581935886051949", + "30906146949009065068727648", + "22471227954759460080639114" + ], + "mAssetSupply": "83844443034179903752441949" + }, + { + "type": "mintMulti", + "inputQtys": [ + "117394782006255747596288", + "121587923325920345063424", + "5776762785454723432448" + ], + "expectedQty": "244567038589162037427911", + "reserves": [ + "30591789947588191633648237", + "31027734872334985413791072", + "22477004717544914804071562" + ], + "mAssetSupply": "84089010072769065789869860" + }, + { + "type": "redeemMasset", + "inputQty": "22412576217851990166732", + "expectedQtys": [ + "8151304564062814092298", + "8267463829697701012600", + "5989087642615361225360" + ], + "redemptionFee": "6723772865355597050", + "reserves": [ + "30583638643024128819555939", + "31019467408505287712778472", + "22471015629902299442846202" + ], + "mAssetSupply": "84066604220324079155300178" + }, + { + "type": "mintMulti", + "inputQtys": [ + "59231521085173780185088", + "22134877023078790987776", + "82926010169763871850496" + ], + "expectedQty": "164391425779993633514974", + "reserves": [ + "30642870164109302599741027", + "31041602285528366503766248", + "22553941640072063314696698" + ], + "mAssetSupply": "84230995646104072788815152" + }, + { + "type": "redeemMasset", + "inputQty": "180781012970749", + "expectedQtys": [ + "65747616674673", + "66603139885604", + "48391939185619" + ], + "redemptionFee": "54234303891", + "reserves": [ + "30642870164043554983066354", + "31041602285461763363880644", + "22553941640023671375511079" + ], + "mAssetSupply": "84230995645923346010148294" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "1819551511116848037888", + "expectedQty": "1818093712512467069341", + "reserves": [ + "30644689715554671831104242", + "31041602285461763363880644", + "22553941640023671375511079" + ] + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "64872002117991942586368", + "outputIndex": 2, + "expectedQty": "64650225003665509700746", + "swapFee": "38891792632456405180", + "reserves": [ + "30709561717672663773690610", + "31041602285461763363880644", + "22489291415020005865810333" + ], + "mAssetSupply": "84232852631428490933622815", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "1533160842373881397248", + "outputIndex": 0, + "expectedQty": "1536611514029076175020", + "swapFee": "921763757757838651", + "reserves": [ + "30708025106158634697515590", + "31041602285461763363880644", + "22490824575862379747207581" + ], + "mAssetSupply": "84232853553192248691461466", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemBassets", + "inputQtys": [ + "202249048233929900032", + "190641868629504655360", + "100042542254566096896" + ], + "expectedQty": "492798305752575409863", + "swapFee": "295856497349955219", + "reserves": [ + "30707822857110400767615558", + "31041411643593133859225284", + "22490724533320125181110685" + ], + "mAssetSupply": "84232360754886496116051603" + }, + { + "type": "mintMulti", + "inputQtys": [ + "14698635855831215636480", + "69366777354908178841600", + "150853695284969287450624" + ], + "expectedQty": "235147863860320739664155", + "reserves": [ + "30722521492966231983252038", + "31110778420948042038066884", + "22641578228605094468561309" + ], + "mAssetSupply": "84467508618746816855715758" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "777297202661452289146880", + "expectedQty": "776550382647035305271353", + "reserves": [ + "30722521492966231983252038", + "31888075623609494327213764", + "22641578228605094468561309" + ] + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "338902258175095655628800", + "expectedQty": "339589246720342483649999", + "reserves": [ + "30722521492966231983252038", + "31888075623609494327213764", + "22980480486780190124190109" + ] + }, + { + "type": "redeemMasset", + "inputQty": "7083497311464", + "expectedQtys": [ + "2542046477108", + "2638486893705", + "1901453612036" + ], + "redemptionFee": "2125049193", + "reserves": [ + "30722521492963689936774930", + "31888075623606855840320059", + "22980480486778288670578073" + ], + "mAssetSupply": "85583648248107113272374839" + }, + { + "type": "redeemMasset", + "inputQty": "172796508759344575152128", + "expectedQtys": [ + "62011282991189291132097", + "64363873323119452846624", + "46384509131696357741160" + ], + "redemptionFee": "51838952627803372545", + "reserves": [ + "30660510209972500645642833", + "31823711750283736387473435", + "22934095977646592312836913" + ], + "mAssetSupply": "85410903578300396500595256" + }, + { + "type": "redeemMasset", + "inputQty": "149530501648805529", + "expectedQtys": [ + "53661837962667340", + "55697666203836148", + "40139114898761368" + ], + "redemptionFee": "44859150494641", + "reserves": [ + "30660510156310662682975493", + "31823711694586070183637287", + "22934095937507477414075545" + ], + "mAssetSupply": "85410903428814754002284368" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "3346912434208067", + "12625463874765756", + "12077235893583598" + ], + "expectedQty": "28058665130860811", + "swapFee": "16845306262273", + "reserves": [ + "30660510152963750248767426", + "31823711681960606308871531", + "22934095925430241520491947" + ], + "mAssetSupply": "85410903400756088871423557" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "1505447900662268428288", + "outputIndex": 2, + "expectedQty": "1500541683476234021909", + "swapFee": "902641151798752057", + "reserves": [ + "30662015600864412517195714", + "31823711681960606308871531", + "22932595383746765286470038" + ], + "mAssetSupply": "85410904303397240670175614", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "26028732829528388", + "expectedQty": "26003123354873709", + "reserves": [ + "30662015600864412517195714", + "31823711707989339138399919", + "22932595383746765286470038" + ] + }, + { + "type": "redeemMasset", + "inputQty": "11828688254135017", + "expectedQtys": [ + "4245156039567941", + "4405992864827561", + "3175017815643403" + ], + "redemptionFee": "3548606476240", + "reserves": [ + "30662015596619256477627773", + "31823711703583346273572358", + "22932595380571747470826635" + ], + "mAssetSupply": "85410904317575224377390546" + }, + { + "type": "mintMulti", + "inputQtys": [ + "2011920722468849735172096", + "600763580735470270676992", + "843620994776070361186304" + ], + "expectedQty": "3455849424470873575921945", + "reserves": [ + "32673936319088106212799869", + "32424475284318816544249350", + "23776216375347817832012939" + ], + "mAssetSupply": "88866753742046097953312491" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "2820091403669315363274752", + "expectedQty": "2820050090051431482926487", + "swapFee": "1692054842201589217964", + "reserves": [ + "32673936319088106212799869", + "29604425194267385061322863", + "23776216375347817832012939" + ], + "mAssetSupply": "86048354393218984179255703" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "141121055515827048022016", + "outputIndex": 0, + "expectedQty": "141140270402674525665107", + "swapFee": "84643111030788855370", + "reserves": [ + "32532796048685431687134762", + "29745546249783212109344879", + "23776216375347817832012939" + ], + "mAssetSupply": "86048439036330014968111073", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "424708040299418199523328", + "outputIndex": 1, + "expectedQty": "425259548509429629535832", + "swapFee": "255236276539349741733", + "reserves": [ + "32532796048685431687134762", + "29320286701273782479809047", + "24200924415647236031536267" + ], + "mAssetSupply": "86048694272606554317852806", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemMasset", + "inputQty": "33669161924890360754995", + "expectedQtys": [ + "12725624504773130861734", + "11469009868513290292937", + "9466505009930346793252" + ], + "redemptionFee": "10100748577467108226", + "reserves": [ + "32520070424180658556273028", + "29308817691405269189516110", + "24191457910637305684743015" + ], + "mAssetSupply": "86015035211430241424206037" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "191071167314739855360", + "133722250859945852928", + "63625596918938615808" + ], + "expectedQty": "388279232563838111022", + "swapFee": "233107403980691281", + "reserves": [ + "32519879353013343816417668", + "29308683969154409243663182", + "24191394285040386746127207" + ], + "mAssetSupply": "86014646932197677586095015" + }, + { + "type": "redeemMasset", + "inputQty": "567752340152501248", + "expectedQtys": [ + "214587855570908103", + "193398246477919992", + "159630955777703869" + ], + "redemptionFee": "170325702045750", + "reserves": [ + "32519879138425488245509565", + "29308683775756162765743190", + "24191394125409430968423338" + ], + "mAssetSupply": "86014646364615663135639517" + }, + { + "type": "mintMulti", + "inputQtys": [ + "86014018106017640873984", + "74194509303706462191616", + "9736925307360423968768" + ], + "expectedQty": "169850281437276912676762", + "reserves": [ + "32605893156531505886383549", + "29382878285059869227934806", + "24201131050716791392392106" + ], + "mAssetSupply": "86184496646052940048316279" + }, + { + "type": "redeemMasset", + "inputQty": "1674899240626400460", + "expectedQtys": [ + "633468945538178304", + "570852049191144107", + "470180801180041968" + ], + "redemptionFee": "502469772187920", + "reserves": [ + "32605892523062560348205245", + "29382877714207820036790699", + "24201130580535990212350138" + ], + "mAssetSupply": "86184494971656169194103739" + }, + { + "type": "redeemMasset", + "inputQty": "6765114629509634169241", + "expectedQtys": [ + "2558655426458745549801", + "2305738432255928853333", + "1899115444931514686866" + ], + "redemptionFee": "2029534388852890250", + "reserves": [ + "32603333867636101602655444", + "29380571975775564107937366", + "24199231465091058697663272" + ], + "mAssetSupply": "86177731886561048412824748" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "252632568651347755008", + "325550359055995437056", + "28776716539301777408" + ], + "expectedQty": "606652246905645295294", + "swapFee": "364209874067827873", + "reserves": [ + "32603081235067450254900436", + "29380246425416508112500310", + "24199202688374519395885864" + ], + "mAssetSupply": "86177125234314142767529454" + }, + { + "type": "redeemMasset", + "inputQty": "333977850790445721", + "expectedQtys": [ + "126314730949040125", + "113828441418945117", + "93755426204181957" + ], + "redemptionFee": "100193355237133", + "reserves": [ + "32603081108752719305860311", + "29380246311588066693555193", + "24199202594619093191703907" + ], + "mAssetSupply": "86177124900436485332320866" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "50710386365447536640000", + "outputIndex": 1, + "expectedQty": "50637907743483675621715", + "swapFee": "30393645648604651905", + "reserves": [ + "32653791495118166842500311", + "29329608403844583017933478", + "24199202594619093191703907" + ], + "mAssetSupply": "86177155294082133936972771", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemMasset", + "inputQty": "56023912059114545060249", + "expectedQtys": [ + "21221915703010161249214", + "19061507060879691247549", + "15727222292696051743358" + ], + "redemptionFee": "16807173617734363518", + "reserves": [ + "32632569579415156681251097", + "29310546896783703326685929", + "24183475372326397139960549" + ], + "mAssetSupply": "86121148189196637126276040" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "13547574677333388296192", + "expectedQty": "13532939568710074487190", + "reserves": [ + "32646117154092490069547289", + "29310546896783703326685929", + "24183475372326397139960549" + ] + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "273759182385684351549440", + "expectedQty": "273885168972197426390600", + "swapFee": "164255509431410610929", + "reserves": [ + "32372231985120292643156689", + "29310546896783703326685929", + "24183475372326397139960549" + ], + "mAssetSupply": "85861086201889094259824719" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "5271291469544510455808", + "expectedQty": "5279136777058501002972", + "reserves": [ + "32372231985120292643156689", + "29310546896783703326685929", + "24188746663795941650416357" + ] + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "306620043179051072", + "expectedQty": "306540982141273011", + "reserves": [ + "32372231985120292643156689", + "29310547203403746505737001", + "24188746663795941650416357" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "4875813822316559728640", + "9363502099812796334080", + "3925926350549896658944" + ], + "expectedQty": "18163611674225002727317", + "swapFee": "10904709830433261593", + "reserves": [ + "32367356171297976083428049", + "29301183701303933709402921", + "24184820737445391753757413" + ], + "mAssetSupply": "85848202033532909899373385" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "399783917911627859492864", + "401849331446426955153408", + "665001917048673924022272" + ], + "expectedQty": "1467124112894925150215067", + "swapFee": "880802949506659085580", + "reserves": [ + "31967572253386348223935185", + "28899334369857506754249513", + "23519818820396717829735141" + ], + "mAssetSupply": "84381077920637984749158318" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "1099043540928654606336", + "expectedQty": "1096639068544342013076", + "swapFee": "659426124557192763", + "reserves": [ + "31967572253386348223935185", + "28899334369857506754249513", + "23518722181328173487722065" + ], + "mAssetSupply": "84379979536523180651744745" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "256997170615659331059712", + "44576151631781005623296", + "299457734352464620027904" + ], + "expectedQty": "601223964634746605077941", + "swapFee": "360950949350458237989", + "reserves": [ + "31710575082770688892875473", + "28854758218225725748626217", + "23219264446975708867694161" + ], + "mAssetSupply": "83778755571888434046666804" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "55016635507650863104", + "expectedQty": "55002418340178030947", + "swapFee": "33009981304590517", + "reserves": [ + "31710575082770688892875473", + "28854703215807385570595270", + "23219264446975708867694161" + ], + "mAssetSupply": "83778700588262907700394217" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "35141133785695084609536", + "expectedQty": "35131935336505243993104", + "swapFee": "21084680271417050765", + "reserves": [ + "31710575082770688892875473", + "28819571280470880326602166", + "23219264446975708867694161" + ], + "mAssetSupply": "83743580539157484032835446" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "488747188065093659131904", + "293597427104530202361856", + "236071326489325305069568" + ], + "expectedQty": "1018178604743185122526993", + "swapFee": "611273927202232412963", + "reserves": [ + "31221827894705595233743569", + "28525973853366350124240310", + "22983193120486383562624593" + ], + "mAssetSupply": "82725401934414298910308453" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "181253768156206720", + "145143940523048320", + "149762547805906176" + ], + "expectedQty": "476161460356986399", + "swapFee": "285868397252543", + "reserves": [ + "31221827713451827077536849", + "28525973708222409601191990", + "22983192970723835756718417" + ], + "mAssetSupply": "82725401458252838553322054" + }, + { + "type": "mintMulti", + "inputQtys": [ + "647723062367261032448", + "674121161498455441408", + "565348113973303246848" + ], + "expectedQty": "1887191348558428548447", + "reserves": [ + "31222475436514194338569297", + "28526647829383908056633398", + "22983758318837809059965265" + ], + "mAssetSupply": "82727288649601396981870501" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "13242531597125833556230144", + "outputIndex": 0, + "expectedQty": "13191526565618599260629700", + "swapFee": "7934235403606123753705", + "reserves": [ + "18030948870895595077939597", + "41769179426509741612863542", + "22983758318837809059965265" + ], + "mAssetSupply": "82735222885005003105624206", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mintMulti", + "inputQtys": [ + "7585454837507059351552", + "543100678319326232576", + "29821023217758567923712" + ], + "expectedQty": "38025199962699429550404", + "reserves": [ + "18038534325733102137291149", + "41769722527188060939096118", + "23013579342055567627888977" + ], + "mAssetSupply": "82773248084967702535174610" + }, + { + "type": "mintMulti", + "inputQtys": [ + "508310493598404524900352", + "2303084073934431694356480", + "834141528534270431199232" + ], + "expectedQty": "3639877804712039482233836", + "reserves": [ + "18546844819331506662191501", + "44072806601122492633452598", + "23847720870589838059088209" + ], + "mAssetSupply": "86413125889679742017408446" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "10393861401429876736", + "expectedQty": "10409240948077800909", + "reserves": [ + "18546844819331506662191501", + "44072806601122492633452598", + "23847731264451239488964945" + ] + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "4544547823666319132196864", + "expectedQty": "4510174433188553037202600", + "swapFee": "2726728694199791479318", + "reserves": [ + "14036670386142953624988901", + "44072806601122492633452598", + "23847731264451239488964945" + ], + "mAssetSupply": "81871315203948570754491809" + }, + { + "type": "redeemMasset", + "inputQty": "656549946878574762498457", + "expectedQtys": [ + "112530383087958177273524", + "353326656119379273969008", + "191184537439635844133949" + ], + "redemptionFee": "196964984063572428749", + "reserves": [ + "13924140003054995447715377", + "43719479945003113359483590", + "23656546727011603644830996" + ], + "mAssetSupply": "81214962222054059564422101" + }, + { + "type": "redeemMasset", + "inputQty": "236139977930693515673", + "expectedQtys": [ + "40473572963120571272", + "127080276489286978082", + "68762951952587720162" + ], + "redemptionFee": "70841993379208054", + "reserves": [ + "13924099529482032327144105", + "43719352864726624072505508", + "23656477964059651057110834" + ], + "mAssetSupply": "81214726152918122250114482" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "22838369939793639374848", + "expectedQty": "22605673503839788997998", + "swapFee": "13703021963876183624", + "reserves": [ + "13901493855978192538146107", + "43719352864726624072505508", + "23656477964059651057110834" + ], + "mAssetSupply": "81191901486000292486923258" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "553800283649772120702976", + "outputIndex": 1, + "expectedQty": "561483415280452871506908", + "swapFee": "335367508357470769242", + "reserves": [ + "14455294139627964658849083", + "43157869449446171200998600", + "23656477964059651057110834" + ], + "mAssetSupply": "81192236853508649957692500", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "814184604998159577382912", + "expectedQty": "817778443956955659991136", + "swapFee": "488510762998895746429", + "reserves": [ + "14455294139627964658849083", + "42340091005489215541007464", + "23656477964059651057110834" + ], + "mAssetSupply": "80378540759273489276056017" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "1547796019579044159815680", + "expectedQty": "1548234404596044159884429", + "reserves": [ + "14455294139627964658849083", + "42340091005489215541007464", + "25204273983638695216926514" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "291272448247910889422848", + "168643636763034992508928", + "168999816501527475912704" + ], + "expectedQty": "630648060801587822991835", + "reserves": [ + "14746566587875875548271931", + "42508734642252250533516392", + "25373273800140222692839218" + ], + "mAssetSupply": "82557423224671121258932281" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "458129047260786856034304", + "expectedQty": "457793296618035747081388", + "swapFee": "274877428356472113620", + "reserves": [ + "14746566587875875548271931", + "42508734642252250533516392", + "24915480503522186945757830" + ], + "mAssetSupply": "82099569054838690875011597" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "49610932098788024", + "expectedQty": "49815658816702115", + "swapFee": "29766559259272", + "reserves": [ + "14746566587875875548271931", + "42508734592436591716814277", + "24915480503522186945757830" + ], + "mAssetSupply": "82099569005257525335482845" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "1376350200915928547328", + "expectedQty": "1387899389666014797651", + "reserves": [ + "14747942938076791476819259", + "42508734592436591716814277", + "24915480503522186945757830" + ] + }, + { + "type": "redeemMasset", + "inputQty": "38251641634467698284953", + "expectedQtys": [ + "6869150001009743971370", + "19799295094549431824400", + "11604884399440611022476" + ], + "redemptionFee": "11475492490340309485", + "reserves": [ + "14741073788075781732847889", + "42488935297342042284989877", + "24903875619122746334735354" + ], + "mAssetSupply": "82062716738505213992305028" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "169113604686055768064", + "outputIndex": 2, + "expectedQty": "168181933209237586776", + "swapFee": "100990572193723979", + "reserves": [ + "14741073788075781732847889", + "42489104410946728340757941", + "24903707437189537097148578" + ], + "mAssetSupply": "82062716839495786186029007", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemMasset", + "inputQty": "1995357638520111680716", + "expectedQtys": [ + "358322161405927105639", + "1032814023429422270069", + "605352798866862431774" + ], + "redemptionFee": "598607291556033504", + "reserves": [ + "14740715465914375805742250", + "42488071596923298918487872", + "24903102084390670234716804" + ], + "mAssetSupply": "82060722080464557630381795" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "6627083979716038754304", + "expectedQty": "6595887554925933691808", + "reserves": [ + "14740715465914375805742250", + "42494698680903014957242176", + "24903102084390670234716804" + ] + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "35075684350593897332736", + "expectedQty": "35047183254928986936340", + "swapFee": "21045410610356338399", + "reserves": [ + "14740715465914375805742250", + "42494698680903014957242176", + "24868054901135741247780464" + ], + "mAssetSupply": "82032263329079500023079266" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "724902847102464688128", + "outputIndex": 0, + "expectedQty": "718600480761786444193", + "swapFee": "435036649519600774", + "reserves": [ + "14739996865433614019298057", + "42494698680903014957242176", + "24868779803982843712468592" + ], + "mAssetSupply": "82032263764116149542680040", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "9136889535759008447594496", + "expectedQty": "9167267320555529013536632", + "swapFee": "5482133721455405068556", + "reserves": [ + "14739996865433614019298057", + "33327431360347485943705544", + "24868779803982843712468592" + ], + "mAssetSupply": "72900856362078596500154100" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "94935704649583623667712", + "expectedQty": "95482488423921091775848", + "reserves": [ + "14834932570083197642965769", + "33327431360347485943705544", + "24868779803982843712468592" + ] + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "574619321372056467013632", + "expectedQty": "577755870866164421447960", + "reserves": [ + "15409551891455254109979401", + "33327431360347485943705544", + "24868779803982843712468592" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "17836274279491655696384", + "36862055760445839507456", + "23034721801624491130880" + ], + "expectedQty": "77704645228604402741824", + "reserves": [ + "15427388165734745765675785", + "33364293416107931783213000", + "24891814525784468203599472" + ], + "mAssetSupply": "73651799366597286416119732" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "767525689554529408", + "2154391063373534976", + "1335506196826501120" + ], + "expectedQty": "4254336563714996832", + "swapFee": "2554134418880326", + "reserves": [ + "15427387398209056211146377", + "33364291261716868409678024", + "24891813190278271377098352" + ], + "mAssetSupply": "73651795112260722701122900" + }, + { + "type": "mintMulti", + "inputQtys": [ + "361617846466486202269696", + "726329008597757316825088", + "83424153865103366684672" + ], + "expectedQty": "1171041621409549669869229", + "reserves": [ + "15789005244675542413416073", + "34090620270314625726503112", + "24975237344143374743783024" + ], + "mAssetSupply": "74822836733670272370992129" + }, + { + "type": "redeemMasset", + "inputQty": "13405462982118045699276", + "expectedQtys": [ + "2827952492733386840544", + "6105935939490194841489", + "4473289077397454572686" + ], + "redemptionFee": "4021638894635413709", + "reserves": [ + "15786177292182809026575529", + "34084514334375135531661623", + "24970764055065977289210338" + ], + "mAssetSupply": "74809435292327048960706562" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "6591649539930072956272640", + "expectedQty": "6583959517414844844472328", + "swapFee": "3954989723958043773763", + "reserves": [ + "15786177292182809026575529", + "34084514334375135531661623", + "18386804537651132444738010" + ], + "mAssetSupply": "68221740742120934048207685" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "385450639209466563657728", + "expectedQty": "386111008633660126780805", + "reserves": [ + "15786177292182809026575529", + "34084514334375135531661623", + "18772255176860599008395738" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "220891872215647", + "7573913557130", + "32491230002552" + ], + "expectedQty": "261837799785785", + "reserves": [ + "15786177292403700898791176", + "34084514334382709445218753", + "18772255176893090238398290" + ], + "mAssetSupply": "68607851751016431974774275" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "318727036418148895031296", + "expectedQty": "317531839831867872787127", + "reserves": [ + "15786177292403700898791176", + "34403241370800858340250049", + "18772255176893090238398290" + ] + }, + { + "type": "redeemMasset", + "inputQty": "3303228167549139655065", + "expectedQtys": [ + "756320809123027926193", + "1648270310668542147785", + "899384756769691631392" + ], + "redemptionFee": "990968450264741896", + "reserves": [ + "15785420971594577870864983", + "34401593100490189798102264", + "18771355792136320546766898" + ], + "mAssetSupply": "68922081353649200972648233" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "779430587583803424768", + "840360149367710416896", + "723284701785754566656" + ], + "expectedQty": "2344186826921050912734", + "swapFee": "1407356510058665747", + "reserves": [ + "15784641541006994067440215", + "34400752740340822087685368", + "18770632507434534792200242" + ], + "mAssetSupply": "68919737166822279921735499" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "259327178472896512", + "9200874159965591552", + "3894115282121072640" + ], + "expectedQty": "13327084535357570132", + "swapFee": "8001051352025757", + "reserves": [ + "15784641281679815594543703", + "34400743539466662122093816", + "18770628613319252671127602" + ], + "mAssetSupply": "68919723839737744564165367" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "5048956686591450", + "1224273722612933", + "8811185209476109" + ], + "expectedQty": "15114477303574025", + "swapFee": "9074130860660", + "reserves": [ + "15784641276630858907952253", + "34400743538242388399480883", + "18770628604508067461651493" + ], + "mAssetSupply": "68919723824623267260591342" + }, + { + "type": "mintMulti", + "inputQtys": [ + "5673161341450731520", + "30640481007867187200", + "39658382722825297920" + ], + "expectedQty": "75945036895975703168", + "reserves": [ + "15784646949792200358683773", + "34400774178723396266668083", + "18770668262890790286949413" + ], + "mAssetSupply": "68919799769660163236294510" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "23419494678701677740032", + "expectedQty": "23366171191149380319333", + "swapFee": "14051696807221006644", + "reserves": [ + "15784646949792200358683773", + "34400774178723396266668083", + "18747302091699640906630080" + ], + "mAssetSupply": "68896394326678268779561122" + }, + { + "type": "redeemMasset", + "inputQty": "9267579410732212551680", + "expectedQtys": [ + "2122630434670219596998", + "4626022392533587517704", + "2521031614731313030304" + ], + "redemptionFee": "2780273823219663765", + "reserves": [ + "15782524319357530139086775", + "34396148156330862679150379", + "18744781060084909593599776" + ], + "mAssetSupply": "68887129527541359786673207" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "370972888186271465209856", + "expectedQty": "371567455948913023057841", + "reserves": [ + "15782524319357530139086775", + "34396148156330862679150379", + "19115753948271181058809632" + ] + }, + { + "type": "redeemMasset", + "inputQty": "227668689065390060339", + "expectedQtys": [ + "51865091640411105485", + "113033843009334169784", + "62818869164460406587" + ], + "redemptionFee": "68300606719617018", + "reserves": [ + "15782472454265889727981290", + "34396035122487853344980595", + "19115691129402016598403045" + ], + "mAssetSupply": "69258469383101814139287727" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "1244626482514880112885760", + "outputIndex": 1, + "expectedQty": "1252553316580059204643106", + "swapFee": "749459661966579637287", + "reserves": [ + "17027098936780769840867050", + "33143481805907794140337489", + "19115691129402016598403045" + ], + "mAssetSupply": "69259218842763780718925014", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "57296527632796961734656", + "expectedQty": "57110431703707872944063", + "reserves": [ + "17027098936780769840867050", + "33200778333540591102072145", + "19115691129402016598403045" + ] + }, + { + "type": "redeemMasset", + "inputQty": "1996101826165599738265", + "expectedQtys": [ + "490182144534612776080", + "955795745603987241564", + "550309275048067985832" + ], + "redemptionFee": "598830547849679921", + "reserves": [ + "17026608754636235228090970", + "33199822537794987114830581", + "19115140820126968530417213" + ], + "mAssetSupply": "69314333771471870841810733" + }, + { + "type": "mintMulti", + "inputQtys": [ + "355843738167611393835008", + "121920899981791253757952", + "154821167507701785165824" + ], + "expectedQty": "633470291214938310604615", + "reserves": [ + "17382452492803846621925978", + "33321743437776778368588533", + "19269961987634670315583037" + ], + "mAssetSupply": "69947804062686809152415348" + }, + { + "type": "mintMulti", + "inputQtys": [ + "14491562131349831680000", + "13473930750457391611904", + "11512634181493349941248" + ], + "expectedQty": "39494479074442330684456", + "reserves": [ + "17396944054935196453605978", + "33335217368527235760200437", + "19281474621816163665524285" + ], + "mAssetSupply": "69987298541761251483099804" + }, + { + "type": "redeemMasset", + "inputQty": "2513207943896399872", + "expectedQtys": [ + "624527911030939420", + "1196691418974972031", + "692180134001343554" + ], + "redemptionFee": "753962383168919", + "reserves": [ + "17396943430407285422666558", + "33335216171835816785228406", + "19281473929636029664180731" + ], + "mAssetSupply": "69987296029307269969868851" + }, + { + "type": "mintMulti", + "inputQtys": [ + "584482453788873326592", + "1261249428263844446208", + "1416964835782221627392" + ], + "expectedQty": "3262588026331773348021", + "reserves": [ + "17397527912861074295993150", + "33336477421264080629674614", + "19282890894471811885808123" + ], + "mAssetSupply": "69990558617333601743216872" + }, + { + "type": "mintMulti", + "inputQtys": [ + "148266539191830363242496", + "108077231190754686140416", + "151988222021214010343424" + ], + "expectedQty": "408646067274862979992211", + "reserves": [ + "17545794452052904659235646", + "33444554652454835315815030", + "19434879116493025896151547" + ], + "mAssetSupply": "70399204684608464723209083" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "397606155221424340992", + "expectedQty": "398231792285430393092", + "reserves": [ + "17545794452052904659235646", + "33444554652454835315815030", + "19435276722648247320492539" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "351907271034083135717376", + "236300100597868067291136", + "480312786456525842415616" + ], + "expectedQty": "1069488176421495626202670", + "reserves": [ + "17897701723086987794953022", + "33680854753052703383106166", + "19915589509104773162908155" + ], + "mAssetSupply": "71469091092822245779804845" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "3482842205743152627712", + "expectedQty": "3475618719130429266930", + "swapFee": "2089705323445891576", + "reserves": [ + "17897701723086987794953022", + "33680854753052703383106166", + "19912113890385642733641225" + ], + "mAssetSupply": "71465610340321826073068709" + }, + { + "type": "redeemMasset", + "inputQty": "245562612593474", + "expectedQtys": [ + "61479750493959", + "115695890940562", + "68399385168492" + ], + "redemptionFee": "73668783778", + "reserves": [ + "17897701723025508044459063", + "33680854752937007492165604", + "19912113890317243348472733" + ], + "mAssetSupply": "71465610340076337129259013" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "2432309909783549837312", + "expectedQty": "2424846983986802944539", + "reserves": [ + "17897701723025508044459063", + "33683287062846791042002916", + "19912113890317243348472733" + ] + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "384116355605906931580928", + "expectedQty": "384655605155332615600748", + "reserves": [ + "17897701723025508044459063", + "33683287062846791042002916", + "20296230245923150280053661" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "316579866349535821824", + "1118627967724566609920", + "1874938256158664425472" + ], + "expectedQty": "3310153038546633211908", + "swapFee": "1987284193644166427", + "reserves": [ + "17897385143159158508637239", + "33682168434879066475392996", + "20294355307666991615628189" + ], + "mAssetSupply": "71849380639177109914592392" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "14517516318614954704896", + "expectedQty": "14489478182523476262497", + "swapFee": "8710509791168972822", + "reserves": [ + "17897385143159158508637239", + "33682168434879066475392996", + "20279865829484468139365692" + ], + "mAssetSupply": "71834871833368286128860318" + }, + { + "type": "mintMulti", + "inputQtys": [ + "15822780542441610", + "19498674250618624", + "17880462869824168" + ], + "expectedQty": "53211172130994786", + "reserves": [ + "17897385158981939051078849", + "33682168454377740726011620", + "20279865847364931009189860" + ], + "mAssetSupply": "71834871886579458259855104" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "7904222648218214727680", + "expectedQty": "7888923804670868232935", + "swapFee": "4742533588930928836", + "reserves": [ + "17897385158981939051078849", + "33682168454377740726011620", + "20271976923560260140956925" + ], + "mAssetSupply": "71826972406464828976056260" + }, + { + "type": "mintMulti", + "inputQtys": [ + "709258070593808760832", + "379691929418503290880", + "621089554720696696832" + ], + "expectedQty": "1711705532659745943237", + "reserves": [ + "17898094417052532859839681", + "33682548146307159229302500", + "20272598013114980837653757" + ], + "mAssetSupply": "71828684111997488721999497" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "25512205280015420", + "outputIndex": 2, + "expectedQty": "25533878571077056", + "swapFee": "15350059417129", + "reserves": [ + "17898094442564738139855101", + "33682548146307159229302500", + "20272597987581102266576701" + ], + "mAssetSupply": "71828684112012838781416626", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mintMulti", + "inputQtys": [ + "1819161201549286309888", + "2522560427718384025600", + "1522183770706628313088" + ], + "expectedQty": "5863408076794669757520", + "reserves": [ + "17899913603766287426164989", + "33685070706734877613328100", + "20274120171351808894889789" + ], + "mAssetSupply": "71834547520089633451174146" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "224026415363915532730368", + "expectedQty": "223255663954408198667389", + "swapFee": "134415849218349319638", + "reserves": [ + "17676657939811879227497600", + "33685070706734877613328100", + "20274120171351808894889789" + ], + "mAssetSupply": "71610655520574936267763416" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "140885820981020", + "expectedQty": "140618367450532", + "swapFee": "84531492588", + "reserves": [ + "17676657939811879227497600", + "33685070706734877613328100", + "20274120171211190527439257" + ], + "mAssetSupply": "71610655520434134978274984" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "893310924353323409604608", + "expectedQty": "894327581323590496360713", + "reserves": [ + "17676657939811879227497600", + "33685070706734877613328100", + "21167431095564513937043865" + ] + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "3591245026258224414720", + "expectedQty": "3594763337624123992238", + "reserves": [ + "17676657939811879227497600", + "33685070706734877613328100", + "21171022340590772161458585" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "28188220276455136821248", + "141730521558347656724480", + "4967716881643855675392" + ], + "expectedQty": "174559705323425855767623", + "reserves": [ + "17704846160088334364318848", + "33826801228293225270052580", + "21175990057472416017133977" + ], + "mAssetSupply": "72683137570418775454395558" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "15510853273138839420928", + "expectedQty": "15486020901592606725430", + "swapFee": "9306511963883303652", + "reserves": [ + "17704846160088334364318848", + "33826801228293225270052580", + "21160504036570823410408547" + ], + "mAssetSupply": "72667636023657600498278282" + }, + { + "type": "redeemMasset", + "inputQty": "60219433370362355017318", + "expectedQtys": [ + "14667546782199647939102", + "28023750391383459196190", + "17530380105250149615919" + ], + "redemptionFee": "18065830011108706505", + "reserves": [ + "17690178613306134716379746", + "33798777477901841810856390", + "21142973656465573260792628" + ], + "mAssetSupply": "72607434656117249251967469" + }, + { + "type": "mintMulti", + "inputQtys": [ + "1349565498024863381585920", + "1507141942050069179006976", + "832811106283504147628032" + ], + "expectedQty": "3689946874241008348344552", + "reserves": [ + "19039744111330998097965666", + "35305919419951910989863366", + "21975784762749077408420660" + ], + "mAssetSupply": "76297381530358257600312021" + }, + { + "type": "redeemMasset", + "inputQty": "479285640389468042035", + "expectedQtys": [ + "119568170276410127611", + "221718535726419393986", + "138006286172006474573" + ], + "redemptionFee": "143785692116840412", + "reserves": [ + "19039624543160721687838055", + "35305697701416184570469380", + "21975646756462905401946087" + ], + "mAssetSupply": "76296902388503560249110398" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "4621279881333969518592", + "outputIndex": 2, + "expectedQty": "4626062199339896831549", + "swapFee": "2780455520089320350", + "reserves": [ + "19044245823042055657356647", + "35305697701416184570469380", + "21971020694263565505114538" + ], + "mAssetSupply": "76296905168959080338430748", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "33025037090135713251328", + "expectedQty": "33100551786474932268660", + "swapFee": "19815022254081427950", + "reserves": [ + "19044245823042055657356647", + "35272597149629709638200720", + "21971020694263565505114538" + ], + "mAssetSupply": "76263899946891198706607370" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "10211505258612509376512", + "3966035972421827166208", + "4377241911050268311552" + ], + "expectedQty": "18576577322089770993552", + "swapFee": "11152637976039486287", + "reserves": [ + "19034034317783443147980135", + "35268631113657287811034512", + "21966643452352515236802986" + ], + "mAssetSupply": "76245323369569108935613818" + }, + { + "type": "mintMulti", + "inputQtys": [ + "1064971697715159270162432", + "874874436216273149886464", + "745367673136141775667200" + ], + "expectedQty": "2686418123782958701476853", + "reserves": [ + "20099006015498602418142567", + "36143505549873560960920976", + "22712011125488657012470186" + ], + "mAssetSupply": "78931741493352067637090671" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "2731345430756801422295040", + "2473313584224399597240320", + "1642512368650061762002944" + ], + "expectedQty": "6849587788088417957818697", + "swapFee": "4112220004855964353303", + "reserves": [ + "17367660584741800995847527", + "33670191965649161363680656", + "21069498756838595250467242" + ], + "mAssetSupply": "72082153705263649679271974" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "257034364125314624", + "outputIndex": 2, + "expectedQty": "255862473633837932", + "swapFee": "153756842442485", + "reserves": [ + "17367660584741800995847527", + "33670192222683525488995280", + "21069498500976121616629310" + ], + "mAssetSupply": "72082153705417406521714459", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "2143419696585498951680", + "expectedQty": "2136973555406863993261", + "reserves": [ + "17367660584741800995847527", + "33672335642380110987946960", + "21069498500976121616629310" + ] + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "354135397266388746240", + "expectedQty": "354990572937491911815", + "swapFee": "212481238359833247", + "reserves": [ + "17367660584741800995847527", + "33671980651807173496035145", + "21069498500976121616629310" + ], + "mAssetSupply": "72083936756056785356794727" + }, + { + "type": "mintMulti", + "inputQtys": [ + "30983143043505508581376", + "32465012736106837311488", + "133829138452190599315456" + ], + "expectedQty": "197405609451730393006583", + "reserves": [ + "17398643727785306504428903", + "33704445664543280333346633", + "21203327639428312215944766" + ], + "mAssetSupply": "72281342365508515749801310" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "2709280128148028535078912", + "expectedQty": "2700548990128877228919969", + "reserves": [ + "17398643727785306504428903", + "36413725792691308868425545", + "21203327639428312215944766" + ] + }, + { + "type": "redeemMasset", + "inputQty": "66449015370300787", + "expectedQtys": [ + "15414067140355629", + "32260193551907956", + "18784769718065187" + ], + "redemptionFee": "19934704611090", + "reserves": [ + "17398643712371239364073274", + "36413725760431115316517589", + "21203327620643542497879579" + ], + "mAssetSupply": "74981891289208312313031582" + }, + { + "type": "redeemMasset", + "inputQty": "958273868640576967016448", + "expectedQtys": [ + "222289189204088627885674", + "465230377091450633378359", + "270898731139034573959550" + ], + "redemptionFee": "287482160592173090104", + "reserves": [ + "17176354523167150736187600", + "35948495383339664683139230", + "20932428889504507923920029" + ], + "mAssetSupply": "74023904902728327519105238" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "422016855864213841641472", + "expectedQty": "420544139866068133082932", + "reserves": [ + "17176354523167150736187600", + "36370512239203878524780702", + "20932428889504507923920029" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "12697934596310499852288", + "10306140766547164004352", + "15671075715646452924416" + ], + "expectedQty": "38708091439170129416669", + "reserves": [ + "17189052457763461236039888", + "36380818379970425688785054", + "20948099965220154376844445" + ], + "mAssetSupply": "74483157134033565781604839" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "2686336123100851446218752", + "expectedQty": "2676254032889605085490050", + "reserves": [ + "17189052457763461236039888", + "39067154503071277135003806", + "20948099965220154376844445" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "2995351665335909", + "963617544077659", + "6105577581787169" + ], + "expectedQty": "10084163709357248", + "swapFee": "6054130704036", + "reserves": [ + "17189052454768109570703979", + "39067154502107659590926147", + "20948099959114576795057276" + ], + "mAssetSupply": "77159411156839007157737641" + }, + { + "type": "redeemMasset", + "inputQty": "2551155375109", + "expectedQtys": [ + "568158664284", + "1291306916292", + "692408410725" + ], + "redemptionFee": "765346612", + "reserves": [ + "17189052454767541412039695", + "39067154502106368284009855", + "20948099959113884386646551" + ], + "mAssetSupply": "77159411156836456767709144" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "4035283118515848", + "10502083399380750", + "11266378598768840" + ], + "expectedQty": "25798672022496361", + "swapFee": "15488496311284", + "reserves": [ + "17189052450732258293523847", + "39067154491604284884629105", + "20948099947847505787877711" + ], + "mAssetSupply": "77159411131037784745212783" + }, + { + "type": "redeemMasset", + "inputQty": "125882192661475866810777", + "expectedQtys": [ + "28034771674371597846189", + "63717226954698685516464", + "34165652861499199084382" + ], + "redemptionFee": "37764657798442760043", + "reserves": [ + "17161017679057886695677658", + "39003437264649586199112641", + "20913934294986006588793329" + ], + "mAssetSupply": "77033566703034107321162049" + }, + { + "type": "mintMulti", + "inputQtys": [ + "947336474396267294752768", + "872135842220554831527936", + "473384375124472809652224" + ], + "expectedQty": "2294223201518681879276189", + "reserves": [ + "18108354153454153990430426", + "39875573106870141030640577", + "21387318670110479398445553" + ], + "mAssetSupply": "79327789904552789200438238" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "153619006097693638656", + "expectedQty": "153894213522936248917", + "reserves": [ + "18108354153454153990430426", + "39875573106870141030640577", + "21387472289116577092084209" + ] + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "131584634903717494784", + "outputIndex": 1, + "expectedQty": "132252812920408921762", + "swapFee": "79092216147841281", + "reserves": [ + "18108354153454153990430426", + "39875440854057220621718815", + "21387603873751480809578993" + ], + "mAssetSupply": "79327943877858528284528436", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "6565694037498387234816", + "expectedQty": "6540294901662647873231", + "reserves": [ + "18108354153454153990430426", + "39882006548094719008953631", + "21387603873751480809578993" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "823141629781287424", + "4871000189959553024", + "3522362530045545984" + ], + "expectedQty": "9207266755020608916", + "swapFee": "5527676659007770", + "reserves": [ + "18108353330312524209143002", + "39882001677094529049400607", + "21387600351388950764033009" + ], + "mAssetSupply": "79334474965493435911792751" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "1749120918159490", + "1667244013735958", + "1947110125391712" + ], + "expectedQty": "5367516255141977", + "swapFee": "3222443219016", + "reserves": [ + "18108353328563403290983512", + "39882001675427285035664649", + "21387600349441840638641297" + ], + "mAssetSupply": "79334474960125919656650774" + }, + { + "type": "redeemMasset", + "inputQty": "655313140196830923980", + "expectedQtys": [ + "149532493873968784767", + "329331721278356576939", + "176611377092315880872" + ], + "redemptionFee": "196593942059049277", + "reserves": [ + "18108203796069529322198745", + "39881672343706006679087710", + "21387423738064748322760425" + ], + "mAssetSupply": "79333819843579664884776071" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "2506681565312186721501184", + "expectedQty": "2496465823095916483952757", + "reserves": [ + "18108203796069529322198745", + "42388353909018193400588894", + "21387423738064748322760425" + ] + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "21091720808641561886720", + "expectedQty": "21186700481855177931217", + "reserves": [ + "18129295516878170884085465", + "42388353909018193400588894", + "21387423738064748322760425" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "25413830774191728", + "3038118326020166", + "4235063294483604" + ], + "expectedQty": "32797425063537880", + "swapFee": "19690269199642", + "reserves": [ + "18129295491464340109893737", + "42388353905980075074568728", + "21387423733829685028276821" + ], + "mAssetSupply": "81851472334360011483122165" + }, + { + "type": "mintMulti", + "inputQtys": [ + "3376502148459477768077312", + "41640875532389766397952", + "4100249378829517235159040" + ], + "expectedQty": "7537862350548247902390256", + "reserves": [ + "21505797639923817877971049", + "42429994781512464840966680", + "25487673112659202263435861" + ], + "mAssetSupply": "89389334684908259385512421" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "4655981526157526827008", + "outputIndex": 2, + "expectedQty": "4632817427073764429837", + "swapFee": "2784724357715246509", + "reserves": [ + "21505797639923817877971049", + "42434650763038622367793688", + "25483040295232128499006024" + ], + "mAssetSupply": "89389337469632617100758930", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mintMulti", + "inputQtys": [ + "1454021240652928", + "934935819618281", + "1535771218484105" + ], + "expectedQty": "3928331561582581", + "reserves": [ + "21505797641377839118623977", + "42434650763973558187411969", + "25483040296767899717490129" + ], + "mAssetSupply": "89389337473560948662341511" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "173483225760137266331648", + "expectedQty": "174038439034420707027084", + "reserves": [ + "21679280867137976384955625", + "42434650763973558187411969", + "25483040296767899717490129" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "113447069157825120829440", + "96312164543856088449024", + "12897031881257297903616" + ], + "expectedQty": "222725900413783064201209", + "reserves": [ + "21792727936295801505785065", + "42530962928517414275860993", + "25495937328649157015393745" + ], + "mAssetSupply": "89786101813009152433569804" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "43986985870519686922240", + "outputIndex": 0, + "expectedQty": "43877764697379075942964", + "swapFee": "26425214996347040171", + "reserves": [ + "21748850171598422429842101", + "42530962928517414275860993", + "25539924314519676702315985" + ], + "mAssetSupply": "89786128238224148780609975", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mintMulti", + "inputQtys": [ + "241702561909782926589952", + "6816768278085182160896", + "91410153244086503473152" + ], + "expectedQty": "340771980543336823640441", + "reserves": [ + "21990552733508205356432053", + "42537779696795499458021889", + "25631334467763763205789137" + ], + "mAssetSupply": "90126900218767485604250416" + }, + { + "type": "redeemMasset", + "inputQty": "1607264589226610104729", + "expectedQtys": [ + "392047582123750882785", + "758363551891538172599", + "456955440205019669663" + ], + "redemptionFee": "482179376767983031", + "reserves": [ + "21990160685926081605549268", + "42537021333243607919849290", + "25630877512323558186119474" + ], + "mAssetSupply": "90125293436357635762128718" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "2334566609697592836096", + "outputIndex": 1, + "expectedQty": "2343339231094066669364", + "swapFee": "1402484869212238690", + "reserves": [ + "21990160685926081605549268", + "42534677994012513853179926", + "25633212078933255778955570" + ], + "mAssetSupply": "90125294838842504974367408", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "23327237981428068122624", + "expectedQty": "23254863992731017533462", + "reserves": [ + "21990160685926081605549268", + "42558005231993941921302550", + "25633212078933255778955570" + ] + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "4154814627014387026624512", + "outputIndex": 0, + "expectedQty": "4135348642962381768554601", + "swapFee": "2494618759268918961843", + "reserves": [ + "17854812042963699836994667", + "42558005231993941921302550", + "29788026705947642805580082" + ], + "mAssetSupply": "90151044321594504910862713", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "17031954967495480", + "expectedQty": "17137656943684396", + "reserves": [ + "17854812059995654804490147", + "42558005231993941921302550", + "29788026705947642805580082" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "86976755344306415337472", + "274305558191648788185088", + "244977772346403981361152" + ], + "expectedQty": "605739424079928042043404", + "reserves": [ + "17941788815339961219827619", + "42832310790185590709487638", + "30033004478294046786941234" + ], + "mAssetSupply": "90756783762812089896590513" + }, + { + "type": "redeemMasset", + "inputQty": "3706309602235558710476", + "expectedQtys": [ + "732483810731582103415", + "1748653634982612500960", + "1226114619584137762420" + ], + "redemptionFee": "1111892880670667613", + "reserves": [ + "17941056331529229637724204", + "42830562136550608096986678", + "30031778363674462649178814" + ], + "mAssetSupply": "90753078565102735008547650" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "1730837371341089208795136", + "outputIndex": 2, + "expectedQty": "1723837253729903500610408", + "swapFee": "1034784943110228949730", + "reserves": [ + "17941056331529229637724204", + "44561399507891697305781814", + "28307941109944559148568406" + ], + "mAssetSupply": "90754113350045845237497380", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mintMulti", + "inputQtys": [ + "405401384050881344", + "107197756942513168", + "638247984117372800" + ], + "expectedQty": "1153041026651668518", + "reserves": [ + "17941056736930613688605548", + "44561399615089454248294982", + "28307941748192543265941206" + ], + "mAssetSupply": "90754114503086871889165898" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "205428398938202388299776", + "expectedQty": "204001066428540508362084", + "swapFee": "123257039362921432979", + "reserves": [ + "17737055670502073180243464", + "44561399615089454248294982", + "28307941748192543265941206" + ], + "mAssetSupply": "90548809361188032422299101" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "112937090179029188739072", + "expectedQty": "112940191220779303354787", + "reserves": [ + "17737055670502073180243464", + "44561399615089454248294982", + "28420878838371572454680278" + ] + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "536274653881901298745344", + "expectedQty": "532366106317101000621690", + "swapFee": "321764792329140779247", + "reserves": [ + "17204689564184972179621774", + "44561399615089454248294982", + "28420878838371572454680278" + ], + "mAssetSupply": "90125796663319239567687791" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "5758854542334100831731712", + "4819126944642542189150208", + "3326077693827023179350016" + ], + "expectedQty": "13934957813531336629211574", + "swapFee": "8365994284689615746975", + "reserves": [ + "11445835021850871347890062", + "39742272670446912059144774", + "25094801144544549275330262" + ], + "mAssetSupply": "76190838849787902938476217" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "182409779867415377608704", + "expectedQty": "182212881374676884426531", + "reserves": [ + "11445835021850871347890062", + "39742272670446912059144774", + "25277210924411964652938966" + ] + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "332804216504427675648", + "expectedQty": "332435404268303573425", + "reserves": [ + "11445835021850871347890062", + "39742272670446912059144774", + "25277543728628469080614614" + ] + }, + { + "type": "redeemMasset", + "inputQty": "118826726290647689042329", + "expectedQtys": [ + "17802839285115706781481", + "61815087481734541084246", + "39316663892512316244542" + ], + "redemptionFee": "35648017887194306712", + "reserves": [ + "11428032182565755641108581", + "39680457582965177518060528", + "25238227064735956764370072" + ], + "mAssetSupply": "76254593088294087631740556" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "83292880569693683712", + "expectedQty": "83335259884083072917", + "swapFee": "49975728341816210", + "reserves": [ + "11428032182565755641108581", + "39680457582965177518060528", + "25238143729476072681297155" + ], + "mAssetSupply": "76254509845389246279873054" + }, + { + "type": "mintMulti", + "inputQtys": [ + "653834811842219820974080", + "939035872674570722869248", + "1033142865032391975501824" + ], + "expectedQty": "2628288389128365725459436", + "reserves": [ + "12081866994407975462082661", + "40619493455639748240929776", + "26271286594508464656798979" + ], + "mAssetSupply": "78882798234517612005332490" + }, + { + "type": "redeemMasset", + "inputQty": "207106122564061789945856", + "expectedQtys": [ + "31711323811329855560063", + "106614144206369338189623", + "68954349234625867010585" + ], + "redemptionFee": "62131836769218536983", + "reserves": [ + "12050155670596645606522598", + "40512879311433378902740153", + "26202332245273838789788394" + ], + "mAssetSupply": "78675754243790319433923617" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "12360831688149831778304", + "expectedQty": "12367174259096320093991", + "swapFee": "7416499012889899066", + "reserves": [ + "12050155670596645606522598", + "40512879311433378902740153", + "26189965071014742469694403" + ], + "mAssetSupply": "78663400828601182492044379" + }, + { + "type": "redeemMasset", + "inputQty": "17207350849365590881075", + "expectedQtys": [ + "2635139707322908429952", + "8859395666732739111753", + "5727246915193905246575" + ], + "redemptionFee": "5162205254809677264", + "reserves": [ + "12047520530889322698092646", + "40504019915766646163628400", + "26184237824099548564447828" + ], + "mAssetSupply": "78646198639957071710840568" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "1563662065249646083571712", + "867150921525094873300992", + "373381147820218814300160" + ], + "expectedQty": "2821065269119483410774131", + "swapFee": "1693655354684500746912", + "reserves": [ + "10483858465639676614520934", + "39636868994241551290327408", + "25810856676279329750147668" + ], + "mAssetSupply": "75825133370837588300066437" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "83245525076408648335360", + "expectedQty": "82756330225071319148489", + "reserves": [ + "10483858465639676614520934", + "39720114519317959938662768", + "25810856676279329750147668" + ] + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "128533940300546400", + "expectedQty": "129217329370786564", + "swapFee": "77120364180327", + "reserves": [ + "10483858465639676614520934", + "39720114390100630567876204", + "25810856676279329750147668" + ], + "mAssetSupply": "75907889572605839682848853" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "44723712253239418880", + "outputIndex": 1, + "expectedQty": "44888062672585788884", + "swapFee": "26790398699891688", + "reserves": [ + "10483858465639676614520934", + "39720069502037957982087320", + "25810901399991582989566548" + ], + "mAssetSupply": "75907889599396238382740541", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "1883576094486693802934272", + "expectedQty": "1909138287012302421218729", + "reserves": [ + "12367434560126370417455206", + "39720069502037957982087320", + "25810901399991582989566548" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "4500010647029863711506432", + "4060517537147532615876608", + "1658553609645399998464" + ], + "expectedQty": "8614445903883529945347023", + "swapFee": "5171770604692933727444", + "reserves": [ + "7867423913096506705948774", + "35659551964890425366210712", + "25809242846381937589568084" + ], + "mAssetSupply": "69202581982525010858612247" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "672141547917743742779392", + "expectedQty": "669797700726343969553555", + "reserves": [ + "7867423913096506705948774", + "35659551964890425366210712", + "26481384394299681332347476" + ] + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "3355479409664436207616", + "outputIndex": 1, + "expectedQty": "3364121417826642454255", + "swapFee": "2006047501542239496", + "reserves": [ + "7867423913096506705948774", + "35656187843472598723756457", + "26484739873709345768555092" + ], + "mAssetSupply": "69872381689298856370405298", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemMasset", + "inputQty": "12094129729361598873", + "expectedQtys": [ + "1361354776343721191", + "6169836805935554202", + "4582837727515363197" + ], + "redemptionFee": "3628238918808479", + "reserves": [ + "7867422551741730362227583", + "35656181673635792788202255", + "26484735290871618253191895" + ], + "mAssetSupply": "69872369598797365927614904" + }, + { + "type": "redeemMasset", + "inputQty": "17373890287052499", + "expectedQtys": [ + "1955661883511083", + "8863313868306015", + "6583501389762239" + ], + "redemptionFee": "5212167086115", + "reserves": [ + "7867422549786068478716500", + "35656181664772478919896240", + "26484735284288116863429656" + ], + "mAssetSupply": "69872369581428687807648520" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "18607511006334544773120", + "15177606998155176443904", + "10953524642372116283392" + ], + "expectedQty": "45070637978379218740913", + "swapFee": "27058617957802212572", + "reserves": [ + "7848815038779733933943380", + "35641004057774323743452336", + "26473781759645744747146264" + ], + "mAssetSupply": "69827298943450308588907607" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "147914326029399293952", + "expectedQty": "151689804270954391149", + "reserves": [ + "7848962953105763333237332", + "35641004057774323743452336", + "26473781759645744747146264" + ] + }, + { + "type": "redeemMasset", + "inputQty": "6744347049576425062", + "expectedQtys": [ + "757871708275861214", + "3441385669841160186", + "2556226896034210468" + ], + "redemptionFee": "2023304114872927", + "reserves": [ + "7848962195234055057376118", + "35641000616388653902292150", + "26473779203418848712935796" + ], + "mAssetSupply": "69827443890930834081746621" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "250726735355730886656", + "expectedQty": "252283101506194056461", + "swapFee": "150436041213438531", + "reserves": [ + "7848962195234055057376118", + "35640748333287147708235689", + "26473779203418848712935796" + ], + "mAssetSupply": "69827193314631519564298496" + }, + { + "type": "mintMulti", + "inputQtys": [ + "7431675198403008004096", + "448801245279922225152", + "8600313207449375997952" + ], + "expectedQty": "16636268549222480557080", + "reserves": [ + "7856393870432458065380214", + "35641197134532427630460841", + "26482379516626298088933748" + ], + "mAssetSupply": "69843829583180742044855576" + }, + { + "type": "mintMulti", + "inputQtys": [ + "249341951610639941107712", + "129405344790558749491200", + "110135492940248888901632" + ], + "expectedQty": "493813079220374237448114", + "reserves": [ + "8105735822043098006487926", + "35770602479322986379952041", + "26592515009566546977835380" + ], + "mAssetSupply": "70337642662401116282303690" + }, + { + "type": "mintMulti", + "inputQtys": [ + "9448927582179205120", + "8078994763446240256", + "8517880433045844992" + ], + "expectedQty": "26191196826641048636", + "reserves": [ + "8105745270970680185693046", + "35770610558317749826192297", + "26592523527446980023680372" + ], + "mAssetSupply": "70337668853597942923352326" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "178884829741509001609216", + "outputIndex": 0, + "expectedQty": "173848124873061146748615", + "swapFee": "106956632435067482608", + "reserves": [ + "7931897146097619038944431", + "35770610558317749826192297", + "26771408357188489025289588" + ], + "mAssetSupply": "70337775810230377990834934", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "267305375714172288", + "outputIndex": 1, + "expectedQty": "275754927124322912", + "swapFee": "164443138496378", + "reserves": [ + "7931897413402994753116719", + "35770610282562822701869385", + "26771408357188489025289588" + ], + "mAssetSupply": "70337775810394821129331312", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemMasset", + "inputQty": "124166748538556304588", + "expectedQtys": [ + "13997918427847982684", + "63126646595752556977", + "47245188742520197292" + ], + "redemptionFee": "37250024561566891", + "reserves": [ + "7931883415484566905134035", + "35770547155916226949312408", + "26771361111999746505092296" + ], + "mAssetSupply": "70337651680896307134593615" + }, + { + "type": "mintMulti", + "inputQtys": [ + "1434276944062429228171264", + "1784740260696127197675520", + "2062853493173327176400896" + ], + "expectedQty": "5296166594649309667680837", + "reserves": [ + "9366160359546996133305299", + "37555287416612354146987928", + "28834214605173073681493192" + ], + "mAssetSupply": "75633818275545616802274452" + }, + { + "type": "redeemMasset", + "inputQty": "58193367487568546050867", + "expectedQtys": [ + "7204249496461899260063", + "28886720926663404910563", + "22178658924887281740327" + ], + "redemptionFee": "17458010246270563815", + "reserves": [ + "9358956110050534234045236", + "37526400695685690742077365", + "28812035946248186399752865" + ], + "mAssetSupply": "75575642366068294526787400" + }, + { + "type": "mintMulti", + "inputQtys": [ + "10888639354787376136192", + "76207136199117941768192", + "36322467125241160138752" + ], + "expectedQty": "123076995542629154444273", + "reserves": [ + "9369844749405321610181428", + "37602607831884808683845557", + "28848358413373427559891617" + ], + "mAssetSupply": "75698719361610923681231673" + }, + { + "type": "redeemMasset", + "inputQty": "9733841190752582", + "expectedQtys": [ + "1204475058064524", + "4833741055801542", + "3708399563100497" + ], + "redemptionFee": "2920152357225", + "reserves": [ + "9369844748200846552116904", + "37602607827051067628044015", + "28848358409665027996791120" + ], + "mAssetSupply": "75698719351880002642836316" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "118557081106095636480", + "81167160942391001088", + "221689309491832455168" + ], + "expectedQty": "422641881205923049120", + "swapFee": "253737371146241574", + "reserves": [ + "9369726191119740456480424", + "37602526659890125237042927", + "28848136720355536164335952" + ], + "mAssetSupply": "75698296709998796719787196" + }, + { + "type": "redeemMasset", + "inputQty": "37978214384514914844672", + "expectedQtys": [ + "4699428280828914320027", + "18859716240543938645986", + "14468912622158115072364" + ], + "redemptionFee": "11393464315354474453", + "reserves": [ + "9365026762838911542160397", + "37583666943649581298396941", + "28833667807733378049263588" + ], + "mAssetSupply": "75660329889078597159416977" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "393627603843797980545024", + "209293232111060305051648", + "78495774871801600933888" + ], + "expectedQty": "688247216802223307356613", + "swapFee": "413196247830032003616", + "reserves": [ + "8971399158995113561615373", + "37374373711538520993345293", + "28755172032861576448329700" + ], + "mAssetSupply": "74972082672276373852060364" + }, + { + "type": "redeemMasset", + "inputQty": "743734044639738297791283", + "expectedQtys": [ + "88970894823077912754850", + "370648035343927447918797", + "285169942972619024667243" + ], + "redemptionFee": "223120213391921489337", + "reserves": [ + "8882428264172035648860523", + "37003725676194593545426496", + "28470002089888957423662457" + ], + "mAssetSupply": "74228571747850027475758418" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "907165789856224768", + "929822290281854592", + "881139818461165952" + ], + "expectedQty": "2729423164560236826", + "swapFee": "1638637080984732", + "reserves": [ + "8882427357006245792635755", + "37003724746372303263571904", + "28470001208749138962496505" + ], + "mAssetSupply": "74228569018426862915521592" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "42932205995943176175616", + "expectedQty": "43053972409962978301350", + "swapFee": "25759323597565905705", + "reserves": [ + "8882427357006245792635755", + "37003724746372303263571904", + "28426947236339175984195155" + ], + "mAssetSupply": "74185662571754517305251681" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "194333199419329088", + "13290706985581414", + "120532855352512768" + ], + "expectedQty": "331940263929028829", + "swapFee": "199283728594574", + "reserves": [ + "8882427162673046373306667", + "37003724733081596277990490", + "28426947115806320631682387" + ], + "mAssetSupply": "74185662239814253376222852" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "246628688693182176", + "expectedQty": "241173032075025946", + "swapFee": "147977213215909", + "reserves": [ + "8882426921500014298280721", + "37003724733081596277990490", + "28426947115806320631682387" + ], + "mAssetSupply": "74185661993333541896256585" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "6700577060619830714957824", + "outputIndex": 0, + "hardLimitError": true + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "15543094038310451937280", + "outputIndex": 0, + "expectedQty": "15146545491545218674800", + "swapFee": "9293937306440677408", + "reserves": [ + "8867280376008469079605921", + "37003724733081596277990490", + "28442490209844631083619667" + ], + "mAssetSupply": "74185671287270848336933993", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "41220520223097525108736", + "expectedQty": "41078735110643481333857", + "reserves": [ + "8867280376008469079605921", + "37003724733081596277990490", + "28483710730067728608728403" + ] + }, + { + "type": "redeemMasset", + "inputQty": "676108391248787781399347", + "expectedQtys": [ + "80745069603167381291472", + "336954308700237959692986", + "259371431592320239767975" + ], + "redemptionFee": "202832517374636334419", + "reserves": [ + "8786535306405301698314449", + "36666770424381358318297504", + "28224339298475408368960428" + ], + "mAssetSupply": "73550844463650078673202922" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "243873758861038071054336", + "expectedQty": "242377562520407233905156", + "reserves": [ + "8786535306405301698314449", + "36910644183242396389351840", + "28224339298475408368960428" + ] + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "86519556727440949641216", + "expectedQty": "88430125575856925084200", + "reserves": [ + "8873054863132742647955665", + "36910644183242396389351840", + "28224339298475408368960428" + ] + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "118717763948332579815424", + "expectedQty": "121278954814166067176062", + "reserves": [ + "8991772627081075227771089", + "36910644183242396389351840", + "28224339298475408368960428" + ] + }, + { + "type": "redeemMasset", + "inputQty": "178565587676931545261670", + "expectedQtys": [ + "21690214874755904936911", + "89036927055847812057155", + "68083570333859716999289" + ], + "redemptionFee": "53569676303079463578", + "reserves": [ + "8970082412206319322834178", + "36821607256186548577294685", + "28156255728141548651961139" + ], + "mAssetSupply": "73824419088559880433570248" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "29420177760178384896", + "outputIndex": 2, + "expectedQty": "29322704953213520028", + "swapFee": "17545981702419841", + "reserves": [ + "8970082412206319322834178", + "36821636676364308755679581", + "28156226405436595438441111" + ], + "mAssetSupply": "73824419106105862135990089", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemBassets", + "inputQtys": [ + "2036891591046551", + "36472113369844", + "2710490325840926" + ], + "expectedQty": "4818030644464802", + "swapFee": "2892553919030", + "reserves": [ + "8970082410169427731787627", + "36821636676327836642309737", + "28156226402726105112600185" + ], + "mAssetSupply": "73824419101287831491525287" + }, + { + "type": "mintMulti", + "inputQtys": [ + "398516520766960", + "23941500293250", + "463378879975256" + ], + "expectedQty": "892643772942454", + "reserves": [ + "8970082410567944252554587", + "36821636676351778142602987", + "28156226403189483992575441" + ], + "mAssetSupply": "73824419102180475264467741" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "224655565853843844497408", + "expectedQty": "225258330798610090233558", + "swapFee": "134793339512306306698", + "reserves": [ + "8970082410567944252554587", + "36821636676351778142602987", + "27930968072390873902341883" + ], + "mAssetSupply": "73599898329666143726277031" + }, + { + "type": "redeemMasset", + "inputQty": "205823706240776255255347", + "expectedQtys": [ + "25077503804135411198657", + "102941610964222858112666", + "78086122961741918799923" + ], + "redemptionFee": "61747111872232876576", + "reserves": [ + "8945004906763808841355930", + "36718695065387555284490321", + "27852881949429131983541960" + ], + "mAssetSupply": "73394136370537239703898260" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "491505281370809104859136", + "7889256044848387192782848", + "6926469336562283235508224" + ], + "expectedQty": "15253787237893110691654628", + "swapFee": "9157767002937628992388", + "reserves": [ + "8453499625392999736496794", + "28829439020539168091707473", + "20926412612866848748033736" + ], + "mAssetSupply": "58140349132644129012243632" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "668510613057744190570496", + "outputIndex": 0, + "expectedQty": "654426481214403310193040", + "swapFee": "399057261649658140670", + "reserves": [ + "7799073144178596426303754", + "29497949633596912282277969", + "20926412612866848748033736" + ], + "mAssetSupply": "58140748189905778670384302", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "386075888831572775796736", + "expectedQty": "379044054935395742950882", + "swapFee": "231645533298943665478", + "reserves": [ + "7420029089243200683352872", + "29497949633596912282277969", + "20926412612866848748033736" + ], + "mAssetSupply": "57754903946607504838253044" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "118404581456395185946624", + "outputIndex": 0, + "expectedQty": "115399629029578901615647", + "swapFee": "70617259391809515588", + "reserves": [ + "7304629460213621781737225", + "29616354215053307468224593", + "20926412612866848748033736" + ], + "mAssetSupply": "57754974563866896647768632", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "320416979290955351851008", + "outputIndex": 1, + "expectedQty": "321304193060579637329825", + "swapFee": "191736093297813693990", + "reserves": [ + "7304629460213621781737225", + "29295050021992727830894768", + "21246829592157804099884744" + ], + "mAssetSupply": "57755166299960194461462622", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "57725588154645838036992", + "expectedQty": "57565123759035857510620", + "reserves": [ + "7304629460213621781737225", + "29295050021992727830894768", + "21304555180312449937921736" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "1386638391228904499052544", + "208548429928625034231808", + "971870745526758069501952" + ], + "expectedQty": "2586641377645687389871600", + "reserves": [ + "8691267851442526280789769", + "29503598451921352865126576", + "22276425925839208007423688" + ], + "mAssetSupply": "60399372801364917708844842" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "793877769460383995658240", + "1924921276711862253125632", + "1526588054559301759401984" + ], + "expectedQty": "4243856812863658336628536", + "swapFee": "2547842793394231540901", + "reserves": [ + "7897390081982142285131529", + "27578677175209490612000944", + "20749837871279906248021704" + ], + "mAssetSupply": "56155515988501259372216306" + }, + { + "type": "mintMulti", + "inputQtys": [ + "2812537316861914", + "3612140452147350", + "5181450936169668" + ], + "expectedQty": "11617861884040309", + "reserves": [ + "7897390084794679601993443", + "27578677178821631064148294", + "20749837876461357184191372" + ], + "mAssetSupply": "56155516000119121256256615" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "1836448755513402540949504", + "expectedQty": "1799916941453676501493653", + "swapFee": "1101869253308041524569", + "reserves": [ + "6097473143341003100499790", + "27578677178821631064148294", + "20749837876461357184191372" + ], + "mAssetSupply": "54320169113859026756831680" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "312944194830083259629568", + "outputIndex": 1, + "expectedQty": "322392742062580662253734", + "swapFee": "192331029326291514704", + "reserves": [ + "6410417338171086360129358", + "27256284436759050401894560", + "20749837876461357184191372" + ], + "mAssetSupply": "54320361444888353048346384", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemBassets", + "inputQtys": [ + "1550389949877721235456", + "406683903306514432000", + "605512078213292752896" + ], + "expectedQty": "2593267296028896416760", + "swapFee": "1556894514325933410", + "reserves": [ + "6408866948221208638893902", + "27255877752855743887462560", + "20749232364383143891438476" + ], + "mAssetSupply": "54317768177592324151929624" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "162632757761095063568384", + "outputIndex": 1, + "expectedQty": "162980816246307082761207", + "swapFee": "97239272332004862159", + "reserves": [ + "6408866948221208638893902", + "27092896936609436804701353", + "20911865122144238955006860" + ], + "mAssetSupply": "54317865416864656156791783", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mintMulti", + "inputQtys": [ + "103617144616692458979328", + "169684651032183337648128", + "22067815707852538904576" + ], + "expectedQty": "296576928447374942602418", + "reserves": [ + "6512484092837901097873230", + "27262581587641620142349481", + "20933932937852091493911436" + ], + "mAssetSupply": "54614442345312031099394201" + }, + { + "type": "redeemMasset", + "inputQty": "906156947488658633523", + "expectedQtys": [ + "108022018590271335700", + "452202117210194556050", + "347229361445510952386" + ], + "redemptionFee": "271847084246597590", + "reserves": [ + "6512376070819310826537530", + "27262129385524409947793431", + "20933585708490645982959050" + ], + "mAssetSupply": "54613536460211626687358268" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "3614131197676905977348096", + "expectedQty": "3449904694640807176528032", + "swapFee": "2168478718606143586408", + "reserves": [ + "3062471376178503650009498", + "27262129385524409947793431", + "20933585708490645982959050" + ], + "mAssetSupply": "51001573741253326853596580" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "4471918086966915926851584", + "25095123936644176019456", + "3914676639373238399401984" + ], + "insufficientLiquidityError": true + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "13345935094312637300736", + "expectedQty": "13166159647692342353656", + "reserves": [ + "3062471376178503650009498", + "27275475320618722585094167", + "20933585708490645982959050" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "87555643543041056178176", + "83541052726687100305408", + "18658491946328270045184" + ], + "expectedQty": "197323796471797291694380", + "swapFee": "118465357097336777082", + "reserves": [ + "2974915732635462593831322", + "27191934267892035484788759", + "20914927216544317712913866" + ], + "mAssetSupply": "50817416104429221904255856" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "1294405159661156171776000", + "outputIndex": 2, + "expectedQty": "1396288906003720268170843", + "swapFee": "833416512482490239229", + "reserves": [ + "4269320892296618765607322", + "27191934267892035484788759", + "19518638310540597444743023" + ], + "mAssetSupply": "50818249520941704394495085", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "1899534517931127603200", + "outputIndex": 2, + "expectedQty": "2001933705119382974334", + "swapFee": "1195361277920066502", + "reserves": [ + "4271220426814549893210522", + "27191934267892035484788759", + "19516636376835478061768689" + ], + "mAssetSupply": "50818250716302982314561587", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemBassets", + "inputQtys": [ + "481370465290868578320384", + "435302156746685922934784", + "418462111593299236093952" + ], + "expectedQty": "1354208693287145019155675", + "swapFee": "813013023786558946861", + "reserves": [ + "3789849961523681314890138", + "26756632111145349561853975", + "19098174265242178825674737" + ], + "mAssetSupply": "49464042023015837295405912" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "52151596944992409485312", + "expectedQty": "52441820877656389247208", + "swapFee": "31290958166995445691", + "reserves": [ + "3789849961523681314890138", + "26756632111145349561853975", + "19045732444364522436427529" + ], + "mAssetSupply": "49411921717029011881366291" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "181044421833981201219584", + "expectedQty": "170332888182908489043905", + "swapFee": "108626653100388720731", + "reserves": [ + "3619517073340772825846233", + "26756632111145349561853975", + "19045732444364522436427529" + ], + "mAssetSupply": "49230985921848131068867438" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "135504597605581504", + "821529993261845504", + "1136681465429102592" + ], + "expectedQty": "2085862607987558738", + "swapFee": "1252268926148224", + "reserves": [ + "3619516937836175220264729", + "26756631289615356300008471", + "19045731307683057007324937" + ], + "mAssetSupply": "49230983835985523081308700" + }, + { + "type": "mintMulti", + "inputQtys": [ + "78897803081152672563200", + "226962198506822539673600", + "77684709680728290361344" + ], + "expectedQty": "385556869523332180983670", + "reserves": [ + "3698414740917327892827929", + "26983593488122178839682071", + "19123416017363785297686281" + ], + "mAssetSupply": "49616540705508855262292370" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "1064139323633838879408128", + "expectedQty": "1057068286393949651032293", + "reserves": [ + "3698414740917327892827929", + "26983593488122178839682071", + "20187555340997624177094409" + ] + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "746710927432758885089280", + "outputIndex": 1, + "expectedQty": "748995720442741429257830", + "swapFee": "444814674631005107458", + "reserves": [ + "3698414740917327892827929", + "26234597767679437410424241", + "20934266268430383062183689" + ], + "mAssetSupply": "50674053806577435918432121", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemBassets", + "inputQtys": [ + "438544109479932417015808", + "508760517383315106299904", + "1034841649434945482915840" + ], + "expectedQty": "1999751694312883580622209", + "swapFee": "1200571359403372171676", + "reserves": [ + "3259870631437395475812121", + "25725837250296122304124337", + "19899424618995437579267849" + ], + "mAssetSupply": "48674302112264552337809912" + }, + { + "type": "mintMulti", + "inputQtys": [ + "544200913058460401664", + "513319911789372243968", + "145267691197846126592" + ], + "expectedQty": "1238209123645891847138", + "reserves": [ + "3260414832350453936213785", + "25726350570207911676368305", + "19899569886686635425394441" + ], + "mAssetSupply": "48675540321388198229657050" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "9514158560383745392640", + "expectedQty": "9622947175062340472136", + "swapFee": "5708495136230247235", + "reserves": [ + "3260414832350453936213785", + "25716727623032849335896169", + "19899569886686635425394441" + ], + "mAssetSupply": "48666031871322950714511645" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "3707290874690769726210048", + "expectedQty": "3730537202718705090092717", + "swapFee": "2224374524814461835726", + "reserves": [ + "3260414832350453936213785", + "25716727623032849335896169", + "16169032683967930335301724" + ], + "mAssetSupply": "44960965371156995450137323" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "774667591303855656140800", + "32751701557027933257728", + "201636374523701735981056" + ], + "expectedQty": "1076255568431361471470406", + "swapFee": "646141025674221415731", + "reserves": [ + "2485747241046598280072985", + "25683975921475821402638441", + "15967396309444228599320668" + ], + "mAssetSupply": "43884709802725633978666917" + }, + { + "type": "redeemMasset", + "inputQty": "26225385264424195", + "expectedQtys": [ + "1485030263516951", + "15344070749032881", + "9539210728082655" + ], + "redemptionFee": "7867615579327", + "reserves": [ + "2485747239561568016556034", + "25683975906131750653605560", + "15967396299905017871238013" + ], + "mAssetSupply": "43884709776508116329822049" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "1333344745757998726512640", + "expectedQty": "1322308278678797357957370", + "reserves": [ + "2485747239561568016556034", + "25683975906131750653605560", + "17300741045663016597750653" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "72123750412492128256", + "78456142762132471808", + "28244123462971314176" + ], + "expectedQty": "186047858097861210955", + "swapFee": "111695732298095583", + "reserves": [ + "2485675115811155524427778", + "25683897449988988521133752", + "17300712801539553626436477" + ], + "mAssetSupply": "45206832007328815826568464" + }, + { + "type": "mintMulti", + "inputQtys": [ + "276785020795790917632", + "135700274547410220351488", + "38709041780130477768704" + ], + "expectedQty": "172199761472330703074875", + "reserves": [ + "2485951900831951315345410", + "25819597724536398741485240", + "17339421843319684104205181" + ], + "mAssetSupply": "45379031768801146529643339" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "1073396854252916992", + "expectedQty": "1090286794638287287", + "swapFee": "644038112551750", + "reserves": [ + "2485951900831951315345410", + "25819596634249604103197953", + "17339421843319684104205181" + ], + "mAssetSupply": "45379030696048330389278097" + }, + { + "type": "redeemMasset", + "inputQty": "47010415583494301286", + "expectedQtys": [ + "2574549753423177628", + "26739791757815998108", + "17957388562618399737" + ], + "redemptionFee": "14103124675048290", + "reserves": [ + "2485949326282197892167782", + "25819569894457846287199845", + "17339403885931121485805444" + ], + "mAssetSupply": "45378983699735871570025101" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "68959066593963433984", + "outputIndex": 2, + "expectedQty": "78020767753720448694", + "swapFee": "46424373027836301", + "reserves": [ + "2486018285348791855601766", + "25819569894457846287199845", + "17339325865163367765356750" + ], + "mAssetSupply": "45378983746160244597861402", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemBassets", + "inputQtys": [ + "287577165777911", + "341914681720344", + "425711646507025" + ], + "expectedQty": "1081013636717906", + "swapFee": "648997580579", + "reserves": [ + "2486018285061214689823855", + "25819569894115931605479501", + "17339325864737656118849725" + ], + "mAssetSupply": "45378983745079230961143496" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "797542018448257351417856", + "expectedQty": "871702987626916652133734", + "reserves": [ + "3283560303509472041241711", + "25819569894115931605479501", + "17339325864737656118849725" + ] + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "56142500085469", + "outputIndex": 2, + "expectedQty": "60464342107677", + "swapFee": "36071963772", + "reserves": [ + "3283560303565614541327180", + "25819569894115931605479501", + "17339325864677191776742048" + ], + "mAssetSupply": "46250686732706183685241002", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "2310622312099498950656", + "expectedQty": "2323856985238433486764", + "swapFee": "1386373387259699370", + "reserves": [ + "3283560303565614541327180", + "25819569894115931605479501", + "17337002007691953343255284" + ], + "mAssetSupply": "46248377496767471445989716" + }, + { + "type": "mintMulti", + "inputQtys": [ + "29554536029190856114176", + "53794729971231213223936", + "48011755573811435536384" + ], + "expectedQty": "132485494475002302784356", + "reserves": [ + "3313114839594805397441356", + "25873364624087162818703437", + "17385013763265764778791668" + ], + "mAssetSupply": "46380862991242473748774072" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "1656686215545943752704", + "expectedQty": "1772462827734137711601", + "reserves": [ + "3314771525810351341194060", + "25873364624087162818703437", + "17385013763265764778791668" + ] + }, + { + "type": "redeemMasset", + "inputQty": "1199659665519783863910", + "expectedQtys": [ + "85708901223492642320", + "668998643079381325175", + "449518289813515211676" + ], + "redemptionFee": "359897899655935159", + "reserves": [ + "3314685816909127848551740", + "25872695625444083437378262", + "17384564244975951263579992" + ], + "mAssetSupply": "46381436154302587758556922" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "4684694599180154830848", + "outputIndex": 1, + "expectedQty": "5069813350613692683604", + "swapFee": "3006880811015268546", + "reserves": [ + "3319370511508308003382588", + "25867625812093469744694658", + "17384564244975951263579992" + ], + "mAssetSupply": "46381439161183398773825468", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mintMulti", + "inputQtys": [ + "4560074966082989568", + "17311909413786335232", + "11940953320553588736" + ], + "expectedQty": "33846646091220496330", + "reserves": [ + "3319375071583274086372156", + "25867643124002883531029890", + "17384576185929271817168728" + ], + "mAssetSupply": "46381473007829489994321798" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "598092126738960542072832", + "274630344133169586896896", + "171660684376771122954240" + ], + "expectedQty": "1089582966688391308413235", + "swapFee": "654142265372258139931", + "reserves": [ + "2721282944844313544299324", + "25593012779869713944132994", + "17212915501552500694214488" + ], + "mAssetSupply": "45291890041141098685908563" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "135215651769398174154752", + "outputIndex": 2, + "expectedQty": "134208374310652795627845", + "swapFee": "79942732879511804077", + "reserves": [ + "2721282944844313544299324", + "25728228431639112118287746", + "17078707127241847898586643" + ], + "mAssetSupply": "45291969983873978197712640", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "4819705753631000419631104", + "outputIndex": 1, + "expectedQty": "5016432774077062019793176", + "swapFee": "2998240082367818437937", + "reserves": [ + "7540988698475313963930428", + "20711795657562050098494570", + "17078707127241847898586643" + ], + "mAssetSupply": "45294968223956346016150577", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemMasset", + "inputQty": "593637538937733671550976", + "expectedQtys": [ + "98802828733668433341027", + "271368129690287429411624", + "223767020845228579360636" + ], + "redemptionFee": "178091261681320101465", + "reserves": [ + "7442185869741645530589401", + "20440427527871762669082946", + "16854940106396619319226007" + ], + "mAssetSupply": "44701508776280293664701066" + }, + { + "type": "redeemMasset", + "inputQty": "55084981080985042944", + "expectedQtys": [ + "9168139806793447142", + "25180867633001387307", + "20763852184726294519" + ], + "redemptionFee": "16525494324295512", + "reserves": [ + "7442176701601838737142259", + "20440402347004129667695639", + "16854919342544434592931488" + ], + "mAssetSupply": "44701453707824707003953634" + }, + { + "type": "mintMulti", + "inputQtys": [ + "1514284394290426", + "1440116184608502", + "2704902894300474" + ], + "expectedQty": "5663440486383407", + "reserves": [ + "7442176703116123131432685", + "20440402348444245852304141", + "16854919345249337487231962" + ], + "mAssetSupply": "44701453713488147490337041" + }, + { + "type": "redeemMasset", + "inputQty": "365090967405019867276902", + "expectedQtys": [ + "60764385608169288745794", + "166893173843471841301943", + "137618180721305337709299" + ], + "redemptionFee": "109527290221505960183", + "reserves": [ + "7381412317507953842686891", + "20273509174600774011002198", + "16717301164528032149522663" + ], + "mAssetSupply": "44336472273373349129020322" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "1155508632530369667661824", + "219178286945520169517056", + "2176746062960160315277312" + ], + "expectedQty": "3559094198047914466293546", + "swapFee": "2136738561965928236718", + "reserves": [ + "6225903684977584175025067", + "20054330887655253841485142", + "14540555101567871834245351" + ], + "mAssetSupply": "40777378075325434662726776" + }, + { + "type": "redeemMasset", + "inputQty": "7574481690067702", + "expectedQtys": [ + "1156127448431385", + "3724015592320728", + "2700127679281977" + ], + "redemptionFee": "2272344507020", + "reserves": [ + "6225903683821456726593682", + "20054330883931238249164414", + "14540555098867744154963374" + ], + "mAssetSupply": "40777378067753225317166094" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "208503860496896196608", + "expectedQty": "211092983322193935074", + "reserves": [ + "6226112187681953622790290", + "20054330883931238249164414", + "14540555098867744154963374" + ] + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "1567319918745849430016", + "expectedQty": "1564508342819119370182", + "reserves": [ + "6226112187681953622790290", + "20054330883931238249164414", + "14542122418786490004393390" + ] + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "1992930356677038833664", + "outputIndex": 1, + "expectedQty": "1997585209023537987161", + "swapFee": "1193612125393883858", + "reserves": [ + "6226112187681953622790290", + "20052333298722214711177253", + "14544115349143167043227054" + ], + "mAssetSupply": "40779154862691492024355208", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "2729731811738174976", + "expectedQty": "2724830439740277175", + "reserves": [ + "6226112187681953622790290", + "20052333298722214711177253", + "14544118078874978781402030" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "743998057776058137051136", + "671059793763155218268160", + "730498001808028814278656" + ], + "expectedQty": "2149841582756770789170587", + "reserves": [ + "6970110245458011759841426", + "20723393092485369929445413", + "15274616080683007595680686" + ], + "mAssetSupply": "42928999170278702553802970" + }, + { + "type": "mintMulti", + "inputQtys": [ + "9299899932162596536320", + "15756172970696340668416", + "4486905369859835035648" + ], + "expectedQty": "29566988752389873605824", + "reserves": [ + "6979410145390174356377746", + "20739149265456066270113829", + "15279102986052867430716334" + ], + "mAssetSupply": "42958566159031092427408794" + }, + { + "type": "mintMulti", + "inputQtys": [ + "12680895534919755776", + "15589635804184852480", + "31361345002157887488" + ], + "expectedQty": "59649758861106903601", + "reserves": [ + "6979422826285709276133522", + "20739164855091870454966309", + "15279134347397869588603822" + ], + "mAssetSupply": "42958625808789953534312395" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "24417791519591638237184", + "expectedQty": "24441769253459839400712", + "swapFee": "14650674911754982942", + "reserves": [ + "6979422826285709276133522", + "20739164855091870454966309", + "15254692578144409749203110" + ], + "mAssetSupply": "42934222667945273651058153" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "42614313845082340458496", + "20184891114115926327296", + "35880633203652175069184" + ], + "expectedQty": "98989635974686459431128", + "swapFee": "59429439248360892193", + "reserves": [ + "6936808512440626935675026", + "20718979963977754528639013", + "15218811944940757574133926" + ], + "mAssetSupply": "42835233031970587191627025" + }, + { + "type": "mintMulti", + "inputQtys": [ + "72437351836748114558976", + "154782950070554160267264", + "150018903068921894535168" + ], + "expectedQty": "377107327899858079498043", + "reserves": [ + "7009245864277375050234002", + "20873762914048308688906277", + "15368830848009679468669094" + ], + "mAssetSupply": "43212340359870445271125068" + }, + { + "type": "redeemMasset", + "inputQty": "68502984273703428371251", + "expectedQtys": [ + "11108174399623968905421", + "33080505851189233166358", + "24356351123033798893095" + ], + "redemptionFee": "20550895282111028511", + "reserves": [ + "6998137689877751081328581", + "20840682408197119455739919", + "15344474496886645669775999" + ], + "mAssetSupply": "43143857926492023953782328" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "3618538526035758080", + "7752313038013650944", + "8790863852014709760" + ], + "expectedQty": "20152949864752669055", + "swapFee": "12099029336453473", + "reserves": [ + "6998134071339225045570501", + "20840674655884081442088975", + "15344465706022793655066239" + ], + "mAssetSupply": "43143837773542159201113273" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "93130437434448330752", + "outputIndex": 1, + "expectedQty": "94470935401241364764", + "swapFee": "56472978016941756", + "reserves": [ + "6998227201776659493901253", + "20840580184948680200724211", + "15344465706022793655066239" + ], + "mAssetSupply": "43143837830015137218055029", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemMasset", + "inputQty": "140492420040387644620", + "expectedQtys": [ + "22782000064064704624", + "67844339061771266441", + "49952310580728459529" + ], + "redemptionFee": "42147726012116293", + "reserves": [ + "6998204419776595429196629", + "20840512340609618429457770", + "15344415753712212926606710" + ], + "mAssetSupply": "43143697379742822842526702" + }, + { + "type": "redeemMasset", + "inputQty": "36845201663084737331", + "expectedQtys": [ + "5974752135435970717", + "17792691973780895466", + "13100371937182720548" + ], + "redemptionFee": "11053560498925421", + "reserves": [ + "6998198445024459993225912", + "20840494547917644648562304", + "15344402653340275743886162" + ], + "mAssetSupply": "43143660545594720256714792" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "20101386820254573789184", + "expectedQty": "20314668060012977317117", + "reserves": [ + "7018299831844714567015096", + "20840494547917644648562304", + "15344402653340275743886162" + ] + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "3358919944593957453824", + "expectedQty": "3394431749462045245265", + "reserves": [ + "7021658751789308524468920", + "20840494547917644648562304", + "15344402653340275743886162" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "94203429437386915840", + "230020316568450826240", + "28526683076417847296" + ], + "expectedQty": "352716568249452595441", + "swapFee": "211756995146759613", + "reserves": [ + "7021564548359871137553080", + "20840264527601076197736064", + "15344374126657199326038866" + ], + "mAssetSupply": "43167016928835945826681733" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "334539942604834176", + "expectedQty": "333108358617820812", + "reserves": [ + "7021564548359871137553080", + "20840264862141018802570240", + "15344374126657199326038866" + ] + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "3908721590109222731776", + "expectedQty": "3865505075044593188443", + "swapFee": "2345232954065533639", + "reserves": [ + "7017699043284826544364637", + "20840264862141018802570240", + "15344374126657199326038866" + ], + "mAssetSupply": "43163110885587149287304408" + }, + { + "type": "redeemMasset", + "inputQty": "16034789768128856064", + "expectedQtys": [ + "2606243347811848143", + "7739688084168468404", + "5698616134330205931" + ], + "redemptionFee": "4810436930438656", + "reserves": [ + "7017696437041478732516494", + "20840257122452934634101836", + "15344368428041064995832935" + ], + "mAssetSupply": "43163094855607818088887000" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "3529753687627657503571968", + "outputIndex": 0, + "expectedQty": "3433433740148070261795216", + "swapFee": "2112973127179635027786", + "reserves": [ + "3584262696893408470721278", + "20840257122452934634101836", + "18874122115668722499404903" + ], + "mAssetSupply": "43165207828734997723914786", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemBassets", + "inputQtys": [ + "30925695464926224384", + "807792145636135141376", + "830117696841951739904" + ], + "expectedQty": "1657672449702096261539", + "swapFee": "995200590175362974", + "reserves": [ + "3584231771197943544496894", + "20839449330307298498960460", + "18873291997971880547664999" + ], + "mAssetSupply": "43163550156285295627653247" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "28181898060989810606080", + "28711593932980884602880", + "4066786512105226895360" + ], + "expectedQty": "62079608925717323373711", + "swapFee": "37270127431889527740", + "reserves": [ + "3556049873136953733890814", + "20810737736374317614357580", + "18869225211459775320769639" + ], + "mAssetSupply": "43101470547359578304279536" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "234327294728146459295744", + "expectedQty": "236161793101400067540774", + "swapFee": "140596376836887875577", + "reserves": [ + "3556049873136953733890814", + "20574575943272917546816806", + "18869225211459775320769639" + ], + "mAssetSupply": "42867283849008268732859369" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "49094142092914163712", + "expectedQty": "46770738798073838321", + "swapFee": "29456485255748498", + "reserves": [ + "3556003102398155660052493", + "20574575943272917546816806", + "18869225211459775320769639" + ], + "mAssetSupply": "42867234784322661074444155" + }, + { + "type": "mintMulti", + "inputQtys": [ + "23962678940119165042688", + "305585101743350081388544", + "185559161696476496658432" + ], + "expectedQty": "512398979592611869534900", + "reserves": [ + "3579965781338274825095181", + "20880161045016267628205350", + "19054784373156251817428071" + ], + "mAssetSupply": "43379633763915272943979055" + }, + { + "type": "redeemMasset", + "inputQty": "2151939689886075636940", + "expectedQtys": [ + "177538596431542320443", + "1035494390622632718572", + "944969834781833462075" + ], + "redemptionFee": "645581906965822691", + "reserves": [ + "3579788242741843282774738", + "20879125550625644995486778", + "19053839403321469983965996" + ], + "mAssetSupply": "43377482469807293834164806" + }, + { + "type": "redeemMasset", + "inputQty": "5179269430318745622937", + "expectedQtys": [ + "427298325097699911872", + "2492218749356430171906", + "2274345048265738841003" + ], + "redemptionFee": "1553780829095623686", + "reserves": [ + "3579360944416745582862866", + "20876633331876288565314872", + "19051565058273204245124993" + ], + "mAssetSupply": "43372304754157804184165555" + }, + { + "type": "mintMulti", + "inputQtys": [ + "65705395606659864199168", + "31625373085220804231168", + "58640413159688461352960" + ], + "expectedQty": "158496492030721829970463", + "reserves": [ + "3645066340023405447062034", + "20908258704961509369546040", + "19110205471432892706477953" + ], + "mAssetSupply": "43530801246188526014136018" + }, + { + "type": "mintMulti", + "inputQtys": [ + "351404193705722314752", + "855902349112660066304", + "627698618770167693312" + ], + "expectedQty": "1840389729525535642602", + "reserves": [ + "3645417744217111169376786", + "20909114607310622029612344", + "19110833170051662874171265" + ], + "mAssetSupply": "43532641635918051549778620" + }, + { + "type": "mintMulti", + "inputQtys": [ + "33431845127534827012096", + "981537086269699542482944", + "582492854196591690514432" + ], + "expectedQty": "1586676997395941735696924", + "reserves": [ + "3678849589344645996388882", + "21890651693580321572095288", + "19693326024248254564685697" + ], + "mAssetSupply": "45119318633313993285475544" + }, + { + "type": "mintMulti", + "inputQtys": [ + "510567984002140078080", + "9201018030153340551168", + "2462958096551615397888" + ], + "expectedQty": "12103612944381433287453", + "reserves": [ + "3679360157328648136466962", + "21899852711610474912646456", + "19695788982344806180083585" + ], + "mAssetSupply": "45131422246258374718762997" + }, + { + "type": "mintMulti", + "inputQtys": [ + "201597930100936346173440", + "66326969052130770419712", + "197527851731335893745664" + ], + "expectedQty": "473306876769372311526799", + "reserves": [ + "3880958087429584482640402", + "21966179680662605683066168", + "19893316834076142073829249" + ], + "mAssetSupply": "45604729123027747030289796" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "187541978370691891200", + "expectedQty": "186017725585814405411", + "reserves": [ + "3880958087429584482640402", + "21966367222640976374957368", + "19893316834076142073829249" + ] + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "1846538843903740449128448", + "outputIndex": 1, + "expectedQty": "1913017253531711773108072", + "swapFee": "1142885944097424792311", + "reserves": [ + "5727496931333324931768850", + "20053349969109264601849296", + "19893316834076142073829249" + ], + "mAssetSupply": "45606058026697430269487518", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemBassets", + "inputQtys": [ + "80867277566950959480832", + "183764951122568431009792", + "127664818586404031299584" + ], + "expectedQty": "392472366568690414892086", + "swapFee": "235624794818105112002", + "reserves": [ + "5646629653766373972288018", + "19869585017986696170839504", + "19765652015489738042529665" + ], + "mAssetSupply": "45213585660128739854595432" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "23854298396265021440", + "expectedQty": "23746936184188085811", + "reserves": [ + "5646629653766373972288018", + "19869585017986696170839504", + "19765675869788134307551105" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "221065401534412", + "193390032863078", + "107463998043285" + ], + "expectedQty": "524905622048744", + "swapFee": "315132452700", + "reserves": [ + "5646629653545308570753606", + "19869585017793306137976426", + "19765675869680670309507820" + ], + "mAssetSupply": "45213609406540018420632499" + }, + { + "type": "mintMulti", + "inputQtys": [ + "137357525364290885779456", + "246716023130202851770368", + "157062730391242758160384" + ], + "expectedQty": "541986502689742371992845", + "reserves": [ + "5783987178909599456533062", + "20116301040923508989746794", + "19922738600071913067668204" + ], + "mAssetSupply": "45755595909229760792625344" + }, + { + "type": "mintMulti", + "inputQtys": [ + "26054350884738692", + "10419628185022588", + "6881731859207979" + ], + "expectedQty": "43777068929516158", + "reserves": [ + "5783987204963950341271754", + "20116301051343137174769382", + "19922738606953644926876183" + ], + "mAssetSupply": "45755595953006829722141502" + }, + { + "type": "mintMulti", + "inputQtys": [ + "6609811109034392027136", + "21330140137810064048128", + "1100999946851854188544" + ], + "expectedQty": "29066620432421591728683", + "reserves": [ + "5790597016072984733298890", + "20137631191480947238817510", + "19923839606900496781064727" + ], + "mAssetSupply": "45784662573439251313870185" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "295594737442822", + "expectedQty": "289877933559172", + "swapFee": "177356842465", + "reserves": [ + "5790597015783106799739718", + "20137631191480947238817510", + "19923839606900496781064727" + ], + "mAssetSupply": "45784662573143833933269828" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "105195030407942317801472", + "126332438899577141067776", + "119951522223909217763328" + ], + "expectedQty": "352410792424529340485007", + "swapFee": "211573419506421457165", + "reserves": [ + "5685401985375164481938246", + "20011298752581370097749734", + "19803888084676587563301399" + ], + "mAssetSupply": "45432251780719304592784821" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "5631354714116150221864960", + "expectedQty": "5685060381791372643397263", + "reserves": [ + "11316756699491314703803206", + "20011298752581370097749734", + "19803888084676587563301399" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "211245942776718", + "314750451683155", + "212785973698056" + ], + "expectedQty": "738849357378539", + "swapFee": "443575759883", + "reserves": [ + "11316756699280068761026488", + "20011298752266619646066579", + "19803888084463801589603343" + ], + "mAssetSupply": "51117312161771827878803545" + }, + { + "type": "mintMulti", + "inputQtys": [ + "135859665808009641984", + "97844509783316185088", + "87709492306398281728" + ], + "expectedQty": "321704245055622585656", + "reserves": [ + "11316892558945876770668472", + "20011396596776402962251667", + "19803975793956107987885071" + ], + "mAssetSupply": "51117633866016883501389201" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "10264736535441494245376", + "outputIndex": 1, + "expectedQty": "10319688345729924864274", + "swapFee": "6185421299226386166", + "reserves": [ + "11327157295481318264913848", + "20001076908430673037387393", + "19803975793956107987885071" + ], + "mAssetSupply": "51117640051438182727775367", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "32342822886922436608", + "expectedQty": "32373695885613990566", + "swapFee": "19405693732153461", + "reserves": [ + "11327157295481318264913848", + "20001076908430673037387393", + "19803943420260222373894505" + ], + "mAssetSupply": "51117607728020989537492220" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "549285578953957441536", + "expectedQty": "546601273468926800766", + "swapFee": "329571347372374464", + "reserves": [ + "11326610694207849338113082", + "20001076908430673037387393", + "19803943420260222373894505" + ], + "mAssetSupply": "51117058772013382952425148" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "7932347022601", + "1743286286802", + "5301748577595" + ], + "expectedQty": "15000479164942", + "swapFee": "9005690913", + "reserves": [ + "11326610694199916991090481", + "20001076908428929751100591", + "19803943420254920625316910" + ], + "mAssetSupply": "51117058771998382473260206" + }, + { + "type": "mintMulti", + "inputQtys": [ + "20207651876750938112", + "26535360182349586432", + "21932317493519888384" + ], + "expectedQty": "68685059410674517459", + "reserves": [ + "11326630901851793742028593", + "20001103443789112100687023", + "19803965352572414145205294" + ], + "mAssetSupply": "51117127457057793147777665" + }, + { + "type": "redeemMasset", + "inputQty": "12504722164351869386752", + "expectedQtys": [ + "2769989015776025836618", + "4891378320947852177663", + "4843167131584205800286" + ], + "redemptionFee": "3751416649305560816", + "reserves": [ + "11323860912836017716191975", + "19996212065468164248509360", + "19799122185440829939405008" + ], + "mAssetSupply": "51104626486310090583951729" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "34891164297944767660032", + "expectedQty": "34720053145867795400208", + "swapFee": "20934698578766860596", + "reserves": [ + "11289140859690149920791767", + "19996212065468164248509360", + "19799122185440829939405008" + ], + "mAssetSupply": "51069756256710724583152293" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "345306530048596864", + "1131488921543393792", + "2958731678101115392" + ], + "expectedQty": "4430546437969024614", + "swapFee": "2659923817071657", + "reserves": [ + "11289140514383619872194903", + "19996210933979242705115568", + "19799119226709151838289616" + ], + "mAssetSupply": "51069751826164286614127679" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "8670437847120056", + "expectedQty": "8708089498066792", + "reserves": [ + "11289140523054057719314959", + "19996210933979242705115568", + "19799119226709151838289616" + ] + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "13344173156118185377792", + "expectedQty": "13357018295893721426087", + "swapFee": "8006503893670911226", + "reserves": [ + "11289140523054057719314959", + "19996210933979242705115568", + "19785762208413258116863529" + ], + "mAssetSupply": "51056415668220151597727905" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "214338539364977803264", + "expectedQty": "215268483715493475129", + "reserves": [ + "11289354861593422697118223", + "19996210933979242705115568", + "19785762208413258116863529" + ] + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "52006249794519072505856", + "expectedQty": "51749195440377717172707", + "swapFee": "31203749876711443503", + "reserves": [ + "11237605666153044979945516", + "19996210933979242705115568", + "19785762208413258116863529" + ], + "mAssetSupply": "51004655890659224730140681" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "446934028647706176", + "expectedQty": "448896159432763264", + "reserves": [ + "11237606113087073627651692", + "19996210933979242705115568", + "19785762208413258116863529" + ] + }, + { + "type": "redeemMasset", + "inputQty": "3487991178161434289766", + "expectedQtys": [ + "768261464677608474194", + "1367045449497529360544", + "1352658075130085500722" + ], + "redemptionFee": "1046397353448430286", + "reserves": [ + "11236837851622396019177498", + "19994843888529745175755024", + "19784409550338128031362807" + ], + "mAssetSupply": "51001169394774576177044465" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "384897048667679264604160", + "outputIndex": 2, + "expectedQty": "386829739237990994243471", + "swapFee": "231908785847099794933", + "reserves": [ + "11621734900290075283781658", + "19994843888529745175755024", + "19397579811100137037119336" + ], + "mAssetSupply": "51001401303560423276839398", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemBassets", + "inputQtys": [ + "729571010171819786240", + "12624466841720764416", + "248103619503709585408" + ], + "expectedQty": "992799758103171501308", + "swapFee": "596037477348311887", + "reserves": [ + "11621005329279903463995418", + "19994831264062903454990608", + "19397331707480633327533928" + ], + "mAssetSupply": "51000408503802320105338090" + }, + { + "type": "mintMulti", + "inputQtys": [ + "827007882801377837056", + "880941395626012049408", + "848329999253446066176" + ], + "expectedQty": "2556959791470817322368", + "reserves": [ + "11621832337162704841832474", + "19995712205458529467040016", + "19398180037479886773600104" + ], + "mAssetSupply": "51002965463593790922660458" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "1047855258781611714412544", + "expectedQty": "1048748560169533558663623", + "swapFee": "628713155268967028647", + "reserves": [ + "11621832337162704841832474", + "18946963645288995908376393", + "19398180037479886773600104" + ], + "mAssetSupply": "49955738917967448175276561" + }, + { + "type": "redeemMasset", + "inputQty": "1667335021534645531443", + "expectedQtys": [ + "387776764858677984491", + "632188802343267796725", + "647244193587855713478" + ], + "redemptionFee": "500200506460393659", + "reserves": [ + "11621444560397846163847983", + "18946331456486652640579668", + "19397532793286298917886626" + ], + "mAssetSupply": "49954072083146419990138777" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "1290823193931452537372672", + "outputIndex": 2, + "expectedQty": "1289609112229657393300150", + "swapFee": "773344191295596426978", + "reserves": [ + "11621444560397846163847983", + "20237154650418105177952340", + "18107923681056641524586476" + ], + "mAssetSupply": "49954845427337715586565755", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemMasset", + "inputQty": "964745569888005573836", + "expectedQtys": [ + "224370099403060382225", + "390709810381264129138", + "349601688085032867309" + ], + "redemptionFee": "289423670966401672", + "reserves": [ + "11621220190298443103465758", + "20236763940607723913823202", + "18107574079368556491719167" + ], + "mAssetSupply": "49953880971191498547393591" + }, + { + "type": "mintMulti", + "inputQtys": [ + "819509799688397651968", + "9445968242965429092352", + "2568605803436461522944" + ], + "expectedQty": "12817448416787240063623", + "reserves": [ + "11622039700098131501117726", + "20246209908850689342915554", + "18110142685171992953242111" + ], + "mAssetSupply": "49966698419608285787457214" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "270322796586929263476736", + "expectedQty": "270643336729139773159909", + "swapFee": "162193677952157558086", + "reserves": [ + "11622039700098131501117726", + "19975566572121549569755645", + "18110142685171992953242111" + ], + "mAssetSupply": "49696537816699308681538564" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "9368388373272268374016", + "expectedQty": "9371985084151007466473", + "swapFee": "5621033023963361024", + "reserves": [ + "11622039700098131501117726", + "19975566572121549569755645", + "18100770700087841945775638" + ], + "mAssetSupply": "49687175049359060376525572" + }, + { + "type": "mintMulti", + "inputQtys": [ + "2185366662285068861440", + "3432138486669342932992", + "2846514070307718299648" + ], + "expectedQty": "8463026524512177526080", + "reserves": [ + "11624225066760416569979166", + "19978998710608218912688637", + "18103617214158149664075286" + ], + "mAssetSupply": "49695638075883572554051652" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "918157609808512155648", + "outputIndex": 1, + "expectedQty": "922496198606407533796", + "swapFee": "552861712594310709", + "reserves": [ + "11625143224370225082134814", + "19978076214409612505154841", + "18103617214158149664075286" + ], + "mAssetSupply": "49695638628745285148362361", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mintMulti", + "inputQtys": [ + "107879131176669167616", + "9501254771194624000", + "62143701571233341440" + ], + "expectedQty": "179831605703148448650", + "reserves": [ + "11625251103501401751302430", + "19978085715664383699778841", + "18103679357859720897416726" + ], + "mAssetSupply": "49695818460350988296811011" + }, + { + "type": "redeemMasset", + "inputQty": "18912750968693486465843", + "expectedQtys": [ + "4422897664935209073879", + "7600784522845623323716", + "6887655195206670145824" + ], + "redemptionFee": "5673825290608045939", + "reserves": [ + "11620828205836466542228551", + "19970484931141538076455125", + "18096791702664514227270902" + ], + "mAssetSupply": "49676911383207585418391107" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "5255904572077225541632", + "outputIndex": 2, + "expectedQty": "5276661523630337710038", + "swapFee": "3164794142060872511", + "reserves": [ + "11626084110408543767770183", + "19970484931141538076455125", + "18091515041140883889560864" + ], + "mAssetSupply": "49676914548001727479263618", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "178664477412219944960", + "outputIndex": 0, + "expectedQty": "177612171037823257093", + "swapFee": "107011353889045855", + "reserves": [ + "11625906498237505944513090", + "19970663595618950296400085", + "18091515041140883889560864" + ], + "mAssetSupply": "49676914655013081368309473", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "220418880006582790258688", + "expectedQty": "220027196219226099499387", + "reserves": [ + "11625906498237505944513090", + "20191082475625533086658773", + "18091515041140883889560864" + ] + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "3687584005335154688000", + "expectedQty": "3700936880680962536168", + "reserves": [ + "11629594082242841099201090", + "20191082475625533086658773", + "18091515041140883889560864" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "3940215189584537976832", + "10247640372623351742464", + "5957774435412226342912" + ], + "expectedQty": "20135731763083815020184", + "swapFee": "12088692273214217542", + "reserves": [ + "11625653867053256561224258", + "20180834835252909734916309", + "18085557266705471663217952" + ], + "mAssetSupply": "49880507056349904615324844" + }, + { + "type": "redeemMasset", + "inputQty": "4686048674396216334745", + "expectedQtys": [ + "1091850095212558729466", + "1895329646686346912197", + "1698546821489855206612" + ], + "redemptionFee": "1405814602318864900", + "reserves": [ + "11624562016958044002494792", + "20178939505606223388004112", + "18083858719883981808011340" + ], + "mAssetSupply": "49875822413490110717854999" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "34603898184942485504000", + "106745424436534603415552", + "110241209554699355684864" + ], + "expectedQty": "251418785829562295021619", + "swapFee": "150941836599697195330", + "reserves": [ + "11589958118773101516990792", + "20072194081169688784588560", + "17973617510329282452326476" + ], + "mAssetSupply": "49624403627660548422833380" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "35861497717900873728", + "expectedQty": "35990293602207835846", + "reserves": [ + "11589993980270819417864520", + "20072194081169688784588560", + "17973617510329282452326476" + ] + }, + { + "type": "redeemMasset", + "inputQty": "180557545589551697965875", + "expectedQtys": [ + "42157313701100956027138", + "73010372912159166573155", + "65377034105141730440143" + ], + "redemptionFee": "54167263676865509389", + "reserves": [ + "11547836666569718461837382", + "19999183708257529618015405", + "17908240476224140721886333" + ], + "mAssetSupply": "49443936239628275798212740" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "67404604952634005127168", + "expectedQty": "67340600465227465593529", + "reserves": [ + "11547836666569718461837382", + "19999183708257529618015405", + "17975645081176774727013501" + ] + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "680475009354088067366912", + "expectedQty": "677411856324170802816310", + "swapFee": "408285005612452840420", + "reserves": [ + "10870424810245547659021072", + "19999183708257529618015405", + "17975645081176774727013501" + ], + "mAssetSupply": "48831210115745027649279777" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "956949833992513572044800", + "3568162338779864301043712", + "3953676318071407199125504" + ], + "expectedQty": "8472144954488991556744207", + "swapFee": "5086338775958970316236", + "reserves": [ + "9913474976253034086976272", + "16431021369477665316971693", + "14021968763105367527887997" + ], + "mAssetSupply": "40359065161256036092535570" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "1408730653738959110144", + "expectedQty": "1406226617191354251183", + "reserves": [ + "9913474976253034086976272", + "16432430100131404276081837", + "14021968763105367527887997" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "2819786252209868505088", + "207738203286984097792", + "6873857244230895796224" + ], + "expectedQty": "9905654718935336983206", + "reserves": [ + "9916294762505243955481360", + "16432637838334691260179629", + "14028842620349598423684221" + ], + "mAssetSupply": "40370377042592162783769959" + }, + { + "type": "redeemMasset", + "inputQty": "14915988611067", + "expectedQtys": [ + "3662759111304", + "6069685846039", + "5181801505440" + ], + "redemptionFee": "4474796583", + "reserves": [ + "9916294762501581196370056", + "16432637838328621574333590", + "14028842620344416622178781" + ], + "mAssetSupply": "40370377042577251269955475" + }, + { + "type": "mintMulti", + "inputQtys": [ + "1251225502533059072", + "909060761182928256", + "886408679312391552" + ], + "expectedQty": "3048306936157251898", + "reserves": [ + "9916296013727083729429128", + "16432638747389382757261846", + "14028843506753095934570333" + ], + "mAssetSupply": "40370380090884187427207373" + }, + { + "type": "mintMulti", + "inputQtys": [ + "413806392487018", + "243696929854671", + "434047622734394" + ], + "expectedQty": "1092109031173651", + "reserves": [ + "9916296014140890121916146", + "16432638747633079687116517", + "14028843507187143557304727" + ], + "mAssetSupply": "40370380091976296458381024" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "10732556161928782675968", + "expectedQty": "10694392940231781761141", + "swapFee": "6439533697157269605", + "reserves": [ + "9905601621200658340155005", + "16432638747633079687116517", + "14028843507187143557304727" + ], + "mAssetSupply": "40359653975348064832974661" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "8842488685796120506400768", + "expectedQty": "8812539028553594024689007", + "swapFee": "5305493211477672303840", + "reserves": [ + "9905601621200658340155005", + "16432638747633079687116517", + "5216304478633549532615720" + ], + "mAssetSupply": "31522470782763421998877733" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "15575845060087608508416", + "82093234478459138342912", + "58870883022395523727360" + ], + "expectedQty": "156735551346130655016479", + "swapFee": "94097789481367213337", + "reserves": [ + "9890025776140570731646589", + "16350545513154620548773605", + "5157433595611154008888360" + ], + "mAssetSupply": "31365735231417291343861254" + }, + { + "type": "mintMulti", + "inputQtys": [ + "438637320713778371756032", + "565322847461586918965248", + "244094920377024030703616" + ], + "expectedQty": "1247590080582897965269838", + "reserves": [ + "10328663096854349103402621", + "16915868360616207467738853", + "5401528515988178039591976" + ], + "mAssetSupply": "32613325312000189309131092" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "650926318478521960235008", + "1471388862921093026938880", + "1947155013759265618788352" + ], + "expectedQty": "4089405278818836258112123", + "swapFee": "2455116237033521867988", + "reserves": [ + "9677736778375827143167613", + "15444479497695114440799973", + "3454373502228912420803624" + ], + "mAssetSupply": "28523920033181353051018969" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "344474860850425452560384", + "expectedQty": "336025828764294118822505", + "swapFee": "206684916510255271536", + "reserves": [ + "9677736778375827143167613", + "15444479497695114440799973", + "3118347673464618301981119" + ], + "mAssetSupply": "28179651857247437853730121" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "40025746908935360610304", + "expectedQty": "38929624026435605038869", + "swapFee": "24015448145361216366", + "reserves": [ + "9677736778375827143167613", + "15444479497695114440799973", + "3079418049438182696942250" + ], + "mAssetSupply": "28139650125786647854336183" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "7895755119212853268054016", + "outputIndex": 0, + "expectedQty": "7825543124987140311023584", + "swapFee": "4770949689965555342843", + "reserves": [ + "1852193653388686832144029", + "15444479497695114440799973", + "10975173168651035964996266" + ], + "mAssetSupply": "28144421075476613409679026", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mintMulti", + "inputQtys": [ + "338574848113452785860608", + "746210311385620494155776", + "772947256122945856077824" + ], + "expectedQty": "1868208210624814084745696", + "reserves": [ + "2190768501502139618004637", + "16190689809080734934955749", + "11748120424773981821074090" + ], + "mAssetSupply": "30012629286101427494424722" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "11802332551223781097472", + "24619821202112623149056", + "25246362117560848089088" + ], + "expectedQty": "62001655770049334509948", + "swapFee": "37223327458504703528", + "reserves": [ + "2178966168950915836907165", + "16166069987878622311806693", + "11722874062656420972985002" + ], + "mAssetSupply": "29950627630331378159914774" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "1229746175184187202469888", + "1820669722084418359656448", + "690783479667560231731200" + ], + "hardLimitError": true + }, + { + "type": "redeemBassets", + "inputQtys": [ + "103039491297367130112", + "6609751717957545754624", + "923168491383090315264" + ], + "expectedQty": "7561753313188167591694", + "swapFee": "4539775853424955528", + "reserves": [ + "2178863129459618469777053", + "16159460236160664766052069", + "11721950894165037882669738" + ], + "mAssetSupply": "29943065877018189992323080" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "42554298722943401984", + "expectedQty": "45379151984193692297", + "reserves": [ + "2178905683758341413179037", + "16159460236160664766052069", + "11721950894165037882669738" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "246683618347740168192", + "60310774451243606016", + "187250678698545676288" + ], + "expectedQty": "508678116371707910074", + "swapFee": "305390103885355959", + "reserves": [ + "2178659000139993673010845", + "16159399925386213522446053", + "11721763643486339336993450" + ], + "mAssetSupply": "29942602578053802478105303" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "1047190328464729440256", + "expectedQty": "1116685493139290117604", + "reserves": [ + "2179706190468458402451101", + "16159399925386213522446053", + "11721763643486339336993450" + ] + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "331461386825426423250944", + "expectedQty": "335004691940194707392096", + "swapFee": "198876832095255853950", + "reserves": [ + "2179706190468458402451101", + "15824395233446018815053957", + "11721763643486339336993450" + ], + "mAssetSupply": "29612456753553610600825913" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "6569684992191922358452224", + "outputIndex": 0, + "hardLimitError": true + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "161951698531298", + "expectedQty": "163659155743439", + "swapFee": "97171019118", + "reserves": [ + "2179706190468458402451101", + "15824395233282359659310518", + "11721763643486339336993450" + ], + "mAssetSupply": "29612456753391756073313733" + }, + { + "type": "redeemMasset", + "inputQty": "128622889876230600916992", + "expectedQtys": [ + "9464800695209815854305", + "68713273220119847271502", + "50898674861363189834397" + ], + "redemptionFee": "38586866962869180275", + "reserves": [ + "2170241389773248586596796", + "15755681960062239812039016", + "11670864968624976147159053" + ], + "mAssetSupply": "29483872450382488341577016" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "517530037464961099235328", + "expectedQty": "513880333576118450068272", + "reserves": [ + "2170241389773248586596796", + "15755681960062239812039016", + "12188395006089937246394381" + ] + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "394116888548857157255168", + "expectedQty": "389743578143372041150156", + "reserves": [ + "2170241389773248586596796", + "16149798848611096969294184", + "12188395006089937246394381" + ] + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "275912671675091039289344", + "expectedQty": "273881317438779670583634", + "reserves": [ + "2170241389773248586596796", + "16149798848611096969294184", + "12464307677765028285683725" + ] + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "145910785565552573153280", + "expectedQty": "144807247726149517622667", + "reserves": [ + "2170241389773248586596796", + "16149798848611096969294184", + "12610218463330580858837005" + ] + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "21177362764945215488", + "expectedQty": "21327424810953992236", + "swapFee": "12706417658967129", + "reserves": [ + "2170241389773248586596796", + "16149798848611096969294184", + "12610197135905769904844769" + ], + "mAssetSupply": "30806163762610560734753386" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "103191646719099900264448", + "expectedQty": "102032562466247459865136", + "reserves": [ + "2170241389773248586596796", + "16252990495330196869558632", + "12610197135905769904844769" + ] + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "85537922386260203143168", + "expectedQty": "84883191517300268956511", + "reserves": [ + "2170241389773248586596796", + "16252990495330196869558632", + "12695735058292030107987937" + ] + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "120891106805817079234560", + "expectedQty": "119523555171845574570183", + "reserves": [ + "2170241389773248586596796", + "16373881602136013948793192", + "12695735058292030107987937" + ] + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "29611956836600815550464", + "expectedQty": "29933960230491147514930", + "swapFee": "17767174101960489330", + "reserves": [ + "2170241389773248586596796", + "16343947641905522801278262", + "12695735058292030107987937" + ], + "mAssetSupply": "31083008882103455183084082" + }, + { + "type": "redeemMasset", + "inputQty": "55244640479120742521241", + "expectedQtys": [ + "3856069324689525287951", + "29039808863321147095518", + "22557690929385632907076" + ], + "redemptionFee": "16573392143736222756", + "reserves": [ + "2166385320448559061308845", + "16314907833042201654182744", + "12673177367362644475080861" + ], + "mAssetSupply": "31027780815016478176785597" + }, + { + "type": "mintMulti", + "inputQtys": [ + "14176433911622993920", + "13528536294836617216", + "6364209743633809408" + ], + "expectedQty": "34885164901412226877", + "reserves": [ + "2166399496882470684302765", + "16314921361578496490799960", + "12673183731572388108890269" + ], + "mAssetSupply": "31027815700181379589012474" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "147347721485785220775936", + "148883622967735190814720", + "229077766898605705134080" + ], + "expectedQty": "532953413239473597880037", + "swapFee": "319964026359499858643", + "reserves": [ + "2019051775396685463526829", + "16166037738610761299985240", + "12444105964673782403756189" + ], + "mAssetSupply": "30494862286941905991132437" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "16675810009046021308416", + "expectedQty": "16869639030249516983197", + "swapFee": "10005486005427612785", + "reserves": [ + "2019051775396685463526829", + "16149168099580511783002043", + "12444105964673782403756189" + ], + "mAssetSupply": "30478196482418865397436806" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "21220175435665946705920", + "outputIndex": 2, + "expectedQty": "23079344249034567678811", + "swapFee": "13744622632420426278", + "reserves": [ + "2040271950832351410232749", + "16149168099580511783002043", + "12421026620424747836077378" + ], + "mAssetSupply": "30478210227041497817863084", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemBassets", + "inputQtys": [ + "23696852074058", + "8148026764991", + "204046178769892" + ], + "expectedQty": "236019782796951", + "swapFee": "141696887810", + "reserves": [ + "2040271950808654558158691", + "16149168099572363756237052", + "12421026620220701657307486" + ], + "mAssetSupply": "30478210226805478035066133" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "2385328814589742363443200", + "1711080529745683417137152", + "1707878970476156080357376" + ], + "insufficientLiquidityError": true + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "247395655592034875473920", + "expectedQty": "264778546677354005335023", + "reserves": [ + "2287667606400689433632611", + "16149168099572363756237052", + "12421026620220701657307486" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "40667284640437475737600", + "111974951617800993505280", + "125184699084958966218752" + ], + "expectedQty": "278301624568389472312229", + "reserves": [ + "2328334891041126909370211", + "16261143051190164749742332", + "12546211319305660623526238" + ], + "mAssetSupply": "31021290398051221512713385" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "426465892678639", + "expectedQty": "452751358126237", + "reserves": [ + "2328334891467592802048850", + "16261143051190164749742332", + "12546211319305660623526238" + ] + }, + { + "type": "redeemMasset", + "inputQty": "27911479380221103308", + "expectedQtys": [ + "2094296346072894085", + "14626612606234785566", + "11285096752777819750" + ], + "redemptionFee": "8373443814066330", + "reserves": [ + "2328332797171246729154765", + "16261128424577558514956766", + "12546200034208907845706488" + ], + "mAssetSupply": "31021262495398036463802644" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "118362386038467246161920", + "82276342128441479397376", + "88248607942588831367168" + ], + "expectedQty": "295007115889931622660260", + "swapFee": "177110535855472256950", + "reserves": [ + "2209970411132779482992845", + "16178852082449117035559390", + "12457951426266319014339320" + ], + "mAssetSupply": "30726255379508104841142384" + }, + { + "type": "redeemMasset", + "inputQty": "65018650551061113837977", + "expectedQtys": [ + "4675030696947874742694", + "34225177742564929231581", + "26353884669898118551927" + ], + "redemptionFee": "19505595165318334151", + "reserves": [ + "2205295380435831608250151", + "16144626904706552106327809", + "12431597541596420895787393" + ], + "mAssetSupply": "30661256234552209045638558" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "60618103570246704037888", + "expectedQty": "61256000562463523195822", + "swapFee": "36370862142148022422", + "reserves": [ + "2205295380435831608250151", + "16083370904144088583131987", + "12431597541596420895787393" + ], + "mAssetSupply": "30600674501844104489623092" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "71815856674378285056", + "42556191794622431232", + "4651270490501868544" + ], + "expectedQty": "123347800052242045803", + "swapFee": "74053111898484318", + "reserves": [ + "2205223564579157229965095", + "16083328347952293960700755", + "12431592890325930393918849" + ], + "mAssetSupply": "30600551154044052247577289" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "1678966324349774430470144", + "expectedQty": "1695375762201254120483756", + "swapFee": "1007379794609864658282", + "reserves": [ + "2205223564579157229965095", + "14387952585751039840216999", + "12431592890325930393918849" + ], + "mAssetSupply": "28922592209488887681765427" + }, + { + "type": "redeemMasset", + "inputQty": "12046942648489759539", + "expectedQtys": [ + "918252131644244333", + "5991124140006879884", + "5176498589363527938" + ], + "redemptionFee": "3614082794546927", + "reserves": [ + "2205222646327025585720762", + "14387946594626899833337115", + "12431587713827341030390911" + ], + "mAssetSupply": "28922580166160321986552815" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "222163661657638715785216", + "expectedQty": "234085034975040715823423", + "reserves": [ + "2427386307984664301505978", + "14387946594626899833337115", + "12431587713827341030390911" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "4026477721570631", + "5062367065094985", + "2219526739637333" + ], + "expectedQty": "11446144202855222", + "swapFee": "6871809607477", + "reserves": [ + "2427386303958186579935347", + "14387946589564532768242130", + "12431587711607814290753578" + ], + "mAssetSupply": "29156665189689218499521016" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "827469833815649288192", + "502913225565616996352", + "1072012731439307948032" + ], + "expectedQty": "2431171406930005441179", + "swapFee": "1459578591312790939", + "reserves": [ + "2426558834124370930647155", + "14387443676338967151245778", + "12430515698876374982805546" + ], + "mAssetSupply": "29154234018282288494079837" + }, + { + "type": "mintMulti", + "inputQtys": [ + "67950676074868312", + "84883188338600784", + "22382533247733832" + ], + "expectedQty": "177650247547551563", + "reserves": [ + "2426558902075047005515467", + "14387443761222155489846562", + "12430515721258908230539378" + ], + "mAssetSupply": "29154234195932536041631400" + }, + { + "type": "mintMulti", + "inputQtys": [ + "806088436247000", + "1447496446346986", + "3248778517132414" + ], + "expectedQty": "5507140084883402", + "reserves": [ + "2426558902881135441762467", + "14387443762669651936193548", + "12430515724507686747671792" + ], + "mAssetSupply": "29154234201439676126514802" + }, + { + "type": "mintMulti", + "inputQtys": [ + "90435425331231031296", + "38002913421217333248", + "58359803278271594496" + ], + "expectedQty": "190490423934721394774", + "reserves": [ + "2426649338306466672793763", + "14387481765583073153526796", + "12430574084310965019266288" + ], + "mAssetSupply": "29154424691863610847909576" + }, + { + "type": "mintMulti", + "inputQtys": [ + "5490765174257858560", + "5436829148501318656", + "5225320118064844800" + ], + "expectedQty": "16338612313427494626", + "reserves": [ + "2426654829071640930652323", + "14387487202412221654845452", + "12430579309631083084111088" + ], + "mAssetSupply": "29154441030475924275404202" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "2095508835591122321408", + "outputIndex": 0, + "expectedQty": "1983052793160545242342", + "swapFee": "1248753024414667460", + "reserves": [ + "2424671776278480385409981", + "14387487202412221654845452", + "12432674818466674206432496" + ], + "mAssetSupply": "29154442279228948690071662", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemBassets", + "inputQtys": [ + "12118107662674108088320", + "23368549629017324519424", + "21267215055872954728448" + ], + "expectedQty": "57001299020553972556707", + "swapFee": "34221312199652174838", + "reserves": [ + "2412553668615806277321661", + "14364118652783204330326028", + "12411407603410801251704048" + ], + "mAssetSupply": "29097440980208394717514955" + }, + { + "type": "mintMulti", + "inputQtys": [ + "66650378608392808693760", + "99916740120240705241088", + "43075385106864428548096" + ], + "expectedQty": "211707428997592082116453", + "reserves": [ + "2479204047224199086015421", + "14464035392903445035567116", + "12454482988517665680252144" + ], + "mAssetSupply": "29309148409205986799631408" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "162070187586243178528768", + "202820588540614672384000", + "70723166758469063671808" + ], + "expectedQty": "441443161476630712194963", + "swapFee": "265024911833078274281", + "reserves": [ + "2317133859637955907486653", + "14261214804362830363183116", + "12383759821759196616580336" + ], + "mAssetSupply": "28867705247729356087436445" + }, + { + "type": "mintMulti", + "inputQtys": [ + "548216712236746667982848", + "260372956179008279543808", + "70187938873442339651584" + ], + "expectedQty": "899979997988221677865807", + "reserves": [ + "2865350571874702575469501", + "14521587760541838642726924", + "12453947760632638956231920" + ], + "mAssetSupply": "29767685245717577765302252" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "8440510811952856126455808", + "outputIndex": 2, + "hardLimitError": true + }, + { + "type": "redeemMasset", + "inputQty": "296535360585498388699545", + "expectedQtys": [ + "28535065951337876639786", + "144615625233631004307893", + "124024691495833127166581" + ], + "redemptionFee": "88960608175649516609", + "reserves": [ + "2836815505923364698829715", + "14376972135308207638419031", + "12329923069136805829065339" + ], + "mAssetSupply": "29471238845740255026119316" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "74965326907801627262976", + "expectedQty": "74415995727464843091444", + "reserves": [ + "2836815505923364698829715", + "14451937462216009265682007", + "12329923069136805829065339" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "2940305402149946785792", + "55719639303498642751488", + "56356931904367826567168" + ], + "expectedQty": "114399193136030509021035", + "reserves": [ + "2839755811325514645615507", + "14507657101519507908433495", + "12386280001041173655632507" + ], + "mAssetSupply": "29660054034603750378231795" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "15697338664837663686656", + "outputIndex": 1, + "expectedQty": "16369855332959006171972", + "swapFee": "9755820907586953314", + "reserves": [ + "2855453149990352309302163", + "14491287246186548902261523", + "12386280001041173655632507" + ], + "mAssetSupply": "29660063790424657965185109", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "1760677174985469460480", + "expectedQty": "1769404625182120304145", + "swapFee": "1056406304991281676", + "reserves": [ + "2855453149990352309302163", + "14491287246186548902261523", + "12384510596415991535328362" + ], + "mAssetSupply": "29658304169655977487006305" + }, + { + "type": "redeemMasset", + "inputQty": "9670094307639165347430", + "expectedQtys": [ + "930741600840382443597", + "4723468809074684477554", + "4036760056165461834805" + ], + "redemptionFee": "2901028292291749604", + "reserves": [ + "2854522408389511926858566", + "14486563777377474217783969", + "12380473836359826073493557" + ], + "mAssetSupply": "29648636976376630613408479" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "8411405022876780199936", + "expectedQty": "8364873708028724559495", + "reserves": [ + "2854522408389511926858566", + "14486563777377474217783969", + "12388885241382702853693493" + ] + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "146713280856254597562368", + "expectedQty": "141333917865367549011886", + "swapFee": "88027968513752758537", + "reserves": [ + "2713188490524144377846680", + "14486563777377474217783969", + "12388885241382702853693493" + ], + "mAssetSupply": "29510376597196918493164143" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "31102501791885192", + "expectedQty": "29906408800598782", + "swapFee": "18661501075131", + "reserves": [ + "2713188460617735577247898", + "14486563777377474217783969", + "12388885241382702853693493" + ], + "mAssetSupply": "29510376566113078202354082" + }, + { + "type": "redeemMasset", + "inputQty": "218083708488974023104921", + "expectedQtys": [ + "20044633769257321418067", + "107024583698254240735377", + "91527245923909661364811" + ], + "redemptionFee": "65425112546692206931", + "reserves": [ + "2693143826848478255829831", + "14379539193679219977048592", + "12297357995458793192328682" + ], + "mAssetSupply": "29292358282736650871456092" + }, + { + "type": "mintMulti", + "inputQtys": [ + "15637677052378275119104", + "6585648700574162485248", + "6221499603568535011328" + ], + "expectedQty": "28969911953519711840349", + "reserves": [ + "2708781503900856530948935", + "14386124842379794139533840", + "12303579495062361727340010" + ], + "mAssetSupply": "29321328194690170583296441" + }, + { + "type": "redeemMasset", + "inputQty": "9798109644327392326451", + "expectedQtys": [ + "904903615556480832243", + "4805871704664760749005", + "4110170404418121900608" + ], + "redemptionFee": "2939432893298217697", + "reserves": [ + "2707876600285300050116692", + "14381318970675129378784835", + "12299469324657943605439402" + ], + "mAssetSupply": "29311533024478736489187687" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "980904793620699135606784", + "expectedQty": "925865389184699440831121", + "swapFee": "588542876172419481364", + "reserves": [ + "1782011211100600609285571", + "14381318970675129378784835", + "12299469324657943605439402" + ], + "mAssetSupply": "28331216773734209773062267" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "1023720020291563552768", + "outputIndex": 1, + "expectedQty": "1127289992296715117028", + "swapFee": "668686036123234255", + "reserves": [ + "1783034931120892172838339", + "14380191680682832663667807", + "12299469324657943605439402" + ], + "mAssetSupply": "28331217442420245896296522", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemMasset", + "inputQty": "36254242261136873881", + "expectedQtys": [ + "2280988725957831358", + "18396193214302308240", + "15734380956391250738" + ], + "redemptionFee": "10876272678341062", + "reserves": [ + "1783032650132166215006981", + "14380173284489618361359567", + "12299453590276987214188664" + ], + "mAssetSupply": "28331181199054257437763703" + }, + { + "type": "redeemMasset", + "inputQty": "2102145989078956795494", + "expectedQtys": [ + "132259592322154148375", + "1066674721849625675695", + "912333667874623498956" + ], + "redemptionFee": "630643796723687038", + "reserves": [ + "1782900390539844060858606", + "14379106609767768735683872", + "12298541256609112590689708" + ], + "mAssetSupply": "28329079683708975204655247" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "4549563496292961554006016", + "outputIndex": 2, + "expectedQty": "4661607402100695962425515", + "swapFee": "2798293032835874409318", + "reserves": [ + "6332463886832805614864622", + "14379106609767768735683872", + "7636933854508416628264193" + ], + "mAssetSupply": "28331877976741811079064565", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "431284360052747207180288", + "outputIndex": 2, + "expectedQty": "428300868767147398348176", + "swapFee": "257707327580490398131", + "reserves": [ + "6332463886832805614864622", + "14810390969820515942864160", + "7208632985741269229916017" + ], + "mAssetSupply": "28332135684069391569462696", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "13104028370033031774208", + "outputIndex": 2, + "expectedQty": "13120112225656164110379", + "swapFee": "7896676990304455734", + "reserves": [ + "6345567915202838646638830", + "14810390969820515942864160", + "7195512873515613065805638" + ], + "mAssetSupply": "28332143580746381873918430", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemMasset", + "inputQty": "114828808127982945383219", + "expectedQtys": [ + "25710564480294160614898", + "60007790807131380897898", + "29154316867381013339835" + ], + "redemptionFee": "34448642438394883614", + "reserves": [ + "6319857350722544486023932", + "14750383179013384561966262", + "7166358556648232052465803" + ], + "mAssetSupply": "28217349221260837323418825" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "18292888629125108989952", + "expectedQty": "18362527778114744813681", + "swapFee": "10975733177475065393", + "reserves": [ + "6319857350722544486023932", + "14732020651235269817152581", + "7166358556648232052465803" + ], + "mAssetSupply": "28199067308364889689494266" + }, + { + "type": "redeemMasset", + "inputQty": "4821098118179873986969", + "expectedQtys": [ + "1080160256789204570412", + "2517927593388296824845", + "1224840256545927605190" + ], + "redemptionFee": "1446329435453962196", + "reserves": [ + "6318777190465755281453520", + "14729502723641881520327736", + "7165133716391686124860613" + ], + "mAssetSupply": "28194247656576145269469493" + }, + { + "type": "mintMulti", + "inputQtys": [ + "119399445780192", + "82495174837807", + "357997677271808" + ], + "expectedQty": "560951062913738", + "reserves": [ + "6318777190585154727233712", + "14729502723724376695165543", + "7165133716749683802132421" + ], + "mAssetSupply": "28194247657137096332383231" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "6251682925278682677248", + "6367936846984730640384", + "1668295825168378101760" + ], + "expectedQty": "14291268303043023340138", + "swapFee": "8579908927182123278", + "reserves": [ + "6312525507659876044556464", + "14723134786877391964525159", + "7163465420924515424030661" + ], + "mAssetSupply": "28179956388834053309043093" + }, + { + "type": "redeemMasset", + "inputQty": "181079059781092779648614", + "expectedQtys": [ + "40550923789536943008410", + "94579691751150414834771", + "46017262029342563527186" + ], + "redemptionFee": "54323717934327833894", + "reserves": [ + "6271974583870339101548054", + "14628555095126241549690388", + "7117448158895172860503475" + ], + "mAssetSupply": "27998931652770894857228373" + }, + { + "type": "redeemMasset", + "inputQty": "48278697460044339", + "expectedQtys": [ + "10811552609821895", + "25216523265794073", + "12268969554734719" + ], + "redemptionFee": "14483609238013", + "reserves": [ + "6271974573058786491726159", + "14628555069909718283896315", + "7117448146626203305768756" + ], + "mAssetSupply": "27998931604506681006422047" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "2644622493100105216", + "expectedQty": "2631628015915390601", + "swapFee": "1586773495860063", + "reserves": [ + "6271971941430770576335558", + "14628555069909718283896315", + "7117448146626203305768756" + ], + "mAssetSupply": "27998928961470961402176894" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "7206024876699422818304", + "7050284151225938083840", + "15751846951105534623744" + ], + "expectedQty": "30048272726438862260565", + "swapFee": "18039787508368338359", + "reserves": [ + "6264765916554071153517254", + "14621504785758492345812475", + "7101696299675097771145012" + ], + "mAssetSupply": "27968880688744522539916329" + }, + { + "type": "redeemMasset", + "inputQty": "8880521421820174", + "expectedQtys": [ + "1988556432673119", + "4641145061821226", + "2254214131495860" + ], + "redemptionFee": "2664156426546", + "reserves": [ + "6264765914565514720844135", + "14621504781117347283991249", + "7101696297420883639649152" + ], + "mAssetSupply": "27968880679866665274522701" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "163657990153454256128", + "outputIndex": 1, + "expectedQty": "164698535368672297273", + "swapFee": "98443839745416250", + "reserves": [ + "6264765914565514720844135", + "14621340082581978611693976", + "7101859955411037093905280" + ], + "mAssetSupply": "27968880778310505019938951", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mintMulti", + "inputQtys": [ + "1163467488990149031755776", + "877907663627194619396096", + "1148722344937611354701824" + ], + "expectedQty": "3193608507968455959390385", + "reserves": [ + "7428233403555663752599911", + "15499247746209173231090072", + "8250582300348648448607104" + ], + "mAssetSupply": "31162489286278960979329336" + }, + { + "type": "mintMulti", + "inputQtys": [ + "1173050018606114062467072", + "893454912259037755080704", + "924174681939387671904256" + ], + "expectedQty": "2992896245317678295515728", + "reserves": [ + "8601283422161777815066983", + "16392702658468210986170776", + "9174756982288036120511360" + ], + "mAssetSupply": "34155385531596639274845064" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "8716074403676701696", + "expectedQty": "8739359670947173318", + "swapFee": "5229644642206021", + "reserves": [ + "8601283422161777815066983", + "16392693919108540038997458", + "9174756982288036120511360" + ], + "mAssetSupply": "34155376820751880240349389" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "50401226680441856000", + "47762575854681915392", + "100507551621319180288" + ], + "expectedQty": "198838571075879191214", + "swapFee": "119374767506031133", + "reserves": [ + "8601233020935097373210983", + "16392646156532685357082066", + "9174656474736414801331072" + ], + "mAssetSupply": "34155177982180804361158175" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "1115014328383653412864", + "expectedQty": "1117110739452665502537", + "reserves": [ + "8601233020935097373210983", + "16392646156532685357082066", + "9175771489064798454743936" + ] + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "2295426116543028920320", + "outputIndex": 2, + "expectedQty": "2295828137237312310172", + "swapFee": "1380917259710849955", + "reserves": [ + "8603528447051640402131303", + "16392646156532685357082066", + "9173475660927561142433764" + ], + "mAssetSupply": "34156296473837516737510667", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mintMulti", + "inputQtys": [ + "242037735430735481798656", + "141441885342238335041536", + "394850222534925553238016" + ], + "expectedQty": "779215071747596272827997", + "reserves": [ + "8845566182482375883929959", + "16534088041874923692123602", + "9568325883462486695671780" + ], + "mAssetSupply": "34935511545585113010338664" + }, + { + "type": "mintMulti", + "inputQtys": [ + "810135963173319602077696", + "145805956270047052693504", + "230222937486637226000384" + ], + "expectedQty": "1187968703795251714126689", + "reserves": [ + "9655702145655695486007655", + "16679893998144970744817106", + "9798548820949123921672164" + ], + "mAssetSupply": "36123480249380364724465353" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "91266668285591338090496", + "outputIndex": 2, + "expectedQty": "90783181939190403202372", + "swapFee": "54604064377586474614", + "reserves": [ + "9655702145655695486007655", + "16771160666430562082907602", + "9707765639009933518469792" + ], + "mAssetSupply": "36123534853444742310939967", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mintMulti", + "inputQtys": [ + "5346323456153044910080", + "25644516856356587700224", + "44085181545778908233728" + ], + "expectedQty": "75095643807196903409578", + "reserves": [ + "9661048469111848530917735", + "16796805183286918670607826", + "9751850820555712426703520" + ], + "mAssetSupply": "36198630497251939214349545" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "789661252383581143040", + "1249808677906076139520", + "1176215584903259095040" + ], + "expectedQty": "3215845079047394494736", + "swapFee": "1930665446696454569", + "reserves": [ + "9660258807859464949774695", + "16795555374609012594468306", + "9750674604970809167608480" + ], + "mAssetSupply": "36195414652172891819854809" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "405124156871295107072", + "expectedQty": "403955765984048787773", + "reserves": [ + "9660258807859464949774695", + "16795960498765883889575378", + "9750674604970809167608480" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "669056766747792375808", + "9144473831890883706880", + "6159802717121291485184" + ], + "expectedQty": "15959826151215472632221", + "swapFee": "9581644677535805062", + "reserves": [ + "9659589751092717157398887", + "16786816024933993005868498", + "9744514802253687876123296" + ], + "mAssetSupply": "36179858781787660396010361" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "458884180660730401390592", + "outputIndex": 1, + "expectedQty": "460660152192294760401388", + "swapFee": "275822187166358052212", + "reserves": [ + "10118473931753447558789479", + "16326155872741698245467110", + "9744514802253687876123296" + ], + "mAssetSupply": "36180134603974826754062573", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "538016203712855252402176", + "expectedQty": "536555797197331706157386", + "swapFee": "322809722227713151441", + "reserves": [ + "10118473931753447558789479", + "16326155872741698245467110", + "9207959005056356169965910" + ], + "mAssetSupply": "35642441209984199214811838" + }, + { + "type": "mintMulti", + "inputQtys": [ + "193354742950300131262464", + "239635398324819534544896", + "239511372171688458321920" + ], + "expectedQty": "672653103528081996962693", + "reserves": [ + "10311828674703747690051943", + "16565791271066517780012006", + "9447470377228044628287830" + ], + "mAssetSupply": "36315094313512281211774531" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "154014625359874686976", + "expectedQty": "153596324360425168664", + "reserves": [ + "10311828674703747690051943", + "16565945285691877654698982", + "9447470377228044628287830" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "132255746993179569684480", + "102885651080244229046272", + "47480211974494827315200" + ], + "expectedQty": "282621078491321179819888", + "reserves": [ + "10444084421696927259736423", + "16668830936772121883745254", + "9494950589202539455603030" + ], + "mAssetSupply": "36597868988327962816763083" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "148588658007569006592", + "expectedQty": "148313626533098405245", + "swapFee": "89153194804541403", + "reserves": [ + "10443936108070394161331178", + "16668830936772121883745254", + "9494950589202539455603030" + ], + "mAssetSupply": "36597720488823150052297894" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "238629471422045440", + "86984690695718192", + "256126170265491808" + ], + "expectedQty": "582396522820830769", + "swapFee": "349647702313886", + "reserves": [ + "10443935869440922739285738", + "16668830849787431188027062", + "9494950333076369190111222" + ], + "mAssetSupply": "36597719906426627231467125" + }, + { + "type": "mintMulti", + "inputQtys": [ + "615193117475457073152", + "702614988376651071488", + "162876264891141390336" + ], + "expectedQty": "1479933491655929913843", + "reserves": [ + "10444551062558398196358890", + "16669533464775807839098550", + "9495113209341260331501558" + ], + "mAssetSupply": "36599199839918283161380968" + }, + { + "type": "mintMulti", + "inputQtys": [ + "10888096699759921725440", + "17821435674367740608512", + "18045427471070584111104" + ], + "expectedQty": "46762146434823910246558", + "reserves": [ + "10455439159258158118084330", + "16687354900450175579707062", + "9513158636812330915612662" + ], + "mAssetSupply": "36645961986353107071627526" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "42093414806211215360", + "outputIndex": 1, + "expectedQty": "42235008631084345879", + "swapFee": "25287767301768482", + "reserves": [ + "10455481252672964329299690", + "16687312665441544495361183", + "9513158636812330915612662" + ], + "mAssetSupply": "36645962011640874373396008", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "5671734680352732479488", + "expectedQty": "5678846217724507521014", + "reserves": [ + "10461152987353317061779178", + "16687312665441544495361183", + "9513158636812330915612662" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "3014937890038915006464", + "32667544243173324750848", + "25234397576908528156672" + ], + "expectedQty": "60890888436375958881705", + "swapFee": "36556466941990769790", + "reserves": [ + "10458138049463278146772714", + "16654645121198371170610335", + "9487924239235422387455990" + ], + "mAssetSupply": "36590749969422222922035317" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "2131942532411222654976", + "outputIndex": 1, + "expectedQty": "2139062745598037841787", + "swapFee": "1280747469107356810", + "reserves": [ + "10460269991995689369427690", + "16652506058452773132768548", + "9487924239235422387455990" + ], + "mAssetSupply": "36590751250169692029392127", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mintMulti", + "inputQtys": [ + "48509778280413863936", + "13028414856918173696", + "71520375390222385152" + ], + "expectedQty": "133249211342169139823", + "reserves": [ + "10460318501773969783291626", + "16652519086867630050942244", + "9487995759610812609841142" + ], + "mAssetSupply": "36590884499381034198531950" + }, + { + "type": "mintMulti", + "inputQtys": [ + "16034084410323754", + "23379827063963480", + "43226327705035896" + ], + "expectedQty": "82697270448779876", + "reserves": [ + "10460318517808054193615380", + "16652519110247457114905724", + "9487995802837140314877038" + ], + "mAssetSupply": "36590884582078304647311826" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "31118121571799220", + "expectedQty": "31034276089875211", + "reserves": [ + "10460318517808054193615380", + "16652519141365578686704944", + "9487995802837140314877038" + ] + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "577831187764399535292416", + "expectedQty": "576218501356150517960519", + "reserves": [ + "10460318517808054193615380", + "17230350329129978221997360", + "9487995802837140314877038" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "11281625818012743680", + "4363947849890855424", + "11761992944925560832" + ], + "expectedQty": "27439969654227689960", + "reserves": [ + "10460329799433872206359060", + "17230354693077828112852784", + "9488007564830085240437870" + ], + "mAssetSupply": "37167130554438385482837516" + }, + { + "type": "redeemMasset", + "inputQty": "10701009237240522054041", + "expectedQtys": [ + "3010792151917108662350", + "4959405456554008816012", + "2730929068323126204373" + ], + "redemptionFee": "3210302771172156616", + "reserves": [ + "10457319007281955097696710", + "17225395287621274104036772", + "9485276635761762114233497" + ], + "mAssetSupply": "37156432755503916132940091" + }, + { + "type": "redeemMasset", + "inputQty": "39566558578150100172", + "expectedQtys": [ + "11132284946628283641", + "18337205599884384912", + "10097502259744211276" + ], + "redemptionFee": "11869967573445030", + "reserves": [ + "10457307874997008469413069", + "17225376950415674219651860", + "9485266538259502370022221" + ], + "mAssetSupply": "37156393200815305556284949" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "3569850536317312749797376", + "outputIndex": 0, + "expectedQty": "3538764860081476853463897", + "swapFee": "2134473483847012731219", + "reserves": [ + "6918543014915531615949172", + "20795227486732986969449236", + "9485266538259502370022221" + ], + "mAssetSupply": "37158527674299152569016168", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "41009003708988678144", + "expectedQty": "41219762633720142041", + "swapFee": "24605402225393206", + "reserves": [ + "6918543014915531615949172", + "20795186266970353249307195", + "9485266538259502370022221" + ], + "mAssetSupply": "37158486689900845805731230" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "7351464528948965993873408", + "expectedQty": "7297903355087962489980939", + "reserves": [ + "6918543014915531615949172", + "28146650795919319243180603", + "9485266538259502370022221" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "227332191066057932800", + "180145720827496759296", + "473136423199443976192" + ], + "expectedQty": "885139818123918809286", + "swapFee": "531402732513859601", + "reserves": [ + "6918315682724465558016372", + "28146470650198491746421307", + "9484793401836302926046029" + ], + "mAssetSupply": "44455504905170684376902883" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "1901432373742982498615296", + "outputIndex": 0, + "expectedQty": "1869489199389426894057051", + "swapFee": "1145916353168390347030", + "reserves": [ + "5048826483335038663959321", + "28146470650198491746421307", + "11386225775579285424661325" + ], + "mAssetSupply": "44456650821523852767249913", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "20403119848234554490880", + "expectedQty": "20187991509702740125380", + "reserves": [ + "5048826483335038663959321", + "28166873770046726300912187", + "11386225775579285424661325" + ] + }, + { + "type": "redeemMasset", + "inputQty": "51771753784970759372", + "expectedQtys": [ + "5875151935060811902", + "32776856855930522172", + "13249773312519432492" + ], + "redemptionFee": "15531526135491227", + "reserves": [ + "5048820608183103603147419", + "28166840993189870370390015", + "11386212525805972905228833" + ], + "mAssetSupply": "44476787056811296672107148" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "81037155970639133147136", + "expectedQty": "81850241528727585889683", + "swapFee": "48622293582383479888", + "reserves": [ + "5048820608183103603147419", + "28084990751661142784500332", + "11386212525805972905228833" + ], + "mAssetSupply": "44395798523134239922439900" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "3425209497774469", + "17396378825051940", + "28208916840237284" + ], + "expectedQty": "49008142869447483", + "swapFee": "29422539245215", + "reserves": [ + "5048820604757894105372950", + "28084990734264763959448392", + "11386212497597056064991549" + ], + "mAssetSupply": "44395798474126097052992417" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "254429882029047111745536", + "outputIndex": 2, + "expectedQty": "260625647887204990503462", + "swapFee": "156859248674179363068", + "reserves": [ + "5303250486786941217118486", + "28084990734264763959448392", + "11125586849709851074488087" + ], + "mAssetSupply": "44395955333374771232355485", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "1246054410257223385088", + "outputIndex": 2, + "expectedQty": "1229347884783163155404", + "swapFee": "740027021462447827", + "reserves": [ + "5303250486786941217118486", + "28086236788675021182833480", + "11124357501825067911332683" + ], + "mAssetSupply": "44395956073401792694803312", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "509586952913153647706112", + "expectedQty": "514447938975000713854707", + "swapFee": "305752171747892188623", + "reserves": [ + "5303250486786941217118486", + "27571788849700020468978773", + "11124357501825067911332683" + ], + "mAssetSupply": "43886674872660386939285823" + }, + { + "type": "redeemMasset", + "inputQty": "517283941835056547574579", + "expectedQtys": [ + "62489658612923791132158", + "324885968870999104450930", + "131081363082726716244377" + ], + "redemptionFee": "155185182550516964272", + "reserves": [ + "5240760828174017425986328", + "27246902880829021364527843", + "10993276138742341195088306" + ], + "mAssetSupply": "43369546116007880908675516" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "1675930759685434322714624", + "expectedQty": "1690963287015568746471192", + "swapFee": "1005558455811260593628", + "reserves": [ + "5240760828174017425986328", + "25555939593813452618056651", + "10993276138742341195088306" + ], + "mAssetSupply": "41694620914778257846554520" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "548922479843063021699072", + "477934398132674365489152", + "355450262618158791655424" + ], + "expectedQty": "1391861631673988679204062", + "swapFee": "835618350014401848631", + "reserves": [ + "4691838348330954404287256", + "25078005195680778252567499", + "10637825876124182403432882" + ], + "mAssetSupply": "40302759283104269167350458" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "542460655230811308032", + "expectedQty": "547562657610436176908", + "swapFee": "325476393138486784", + "reserves": [ + "4691838348330954404287256", + "25077457633023167816390591", + "10637825876124182403432882" + ], + "mAssetSupply": "40302217147925431494529210" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "550749963037295180251136", + "expectedQty": "534128946625992589655051", + "swapFee": "330449977822377108150", + "reserves": [ + "4157709401704961814632205", + "25077457633023167816390591", + "10637825876124182403432882" + ], + "mAssetSupply": "39751797634865958691386224" + }, + { + "type": "redeemMasset", + "inputQty": "241622297858834211799040", + "expectedQtys": [ + "25264113339079120419362", + "152381917706140493840481", + "64640217160338547368308" + ], + "redemptionFee": "72486689357650263539", + "reserves": [ + "4132445288365882694212843", + "24925075715317027322550110", + "10573185658963843856064574" + ], + "mAssetSupply": "39510247823696482129850723" + }, + { + "type": "mintMulti", + "inputQtys": [ + "111264836738146762752", + "84302072139990368256", + "55947903782653042688" + ], + "expectedQty": "254485608673978885209", + "reserves": [ + "4132556553202620840975595", + "24925160017389167312918366", + "10573241606867626509107262" + ], + "mAssetSupply": "39510502309305156108735932" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "494801057922695863205888", + "expectedQty": "510011103266966550790230", + "reserves": [ + "4627357611125316704181483", + "24925160017389167312918366", + "10573241606867626509107262" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "1041479306252796035072", + "1043047572571603730432", + "1311267386289717510144" + ], + "expectedQty": "3415993439958343871665", + "reserves": [ + "4628399090431569500216555", + "24926203064961738916648798", + "10574552874253916226617406" + ], + "mAssetSupply": "40023929406012081003397827" + }, + { + "type": "mintMulti", + "inputQtys": [ + "36306886219761065132032", + "186771665931554481242112", + "134091410806575074377728" + ], + "expectedQty": "356511005261045990296453", + "reserves": [ + "4664705976651330565348587", + "25112974730893293397890910", + "10708644285060491300995134" + ], + "mAssetSupply": "40380440411273126993694280" + }, + { + "type": "mintMulti", + "inputQtys": [ + "83402409112832078512128", + "934324718427403452416", + "64938501739016116764672" + ], + "expectedQty": "151609946729219959052267", + "reserves": [ + "4748108385764162643860715", + "25113909055611720801343326", + "10773582786799507417759806" + ], + "mAssetSupply": "40532050358002346952746547" + }, + { + "type": "mintMulti", + "inputQtys": [ + "66429548446044", + "94976601687110", + "567328861571078" + ], + "expectedQty": "730407266318143", + "reserves": [ + "4748108385830592192306759", + "25113909055706697403030436", + "10773582787366836279330884" + ], + "mAssetSupply": "40532050358732754219064690" + }, + { + "type": "redeemMasset", + "inputQty": "599149933587907843666739", + "expectedQtys": [ + "70166087089611859584257", + "371125632940886208369465", + "159208696747828603492398" + ], + "redemptionFee": "179744980076372353100", + "reserves": [ + "4677942298740980332722502", + "24742783422765811194660971", + "10614374090619007675838486" + ], + "mAssetSupply": "39933080170124922747751051" + }, + { + "type": "redeemMasset", + "inputQty": "83216790453817062195", + "expectedQtys": [ + "9745468102340706881", + "51546169493066699727", + "22112723398550585092" + ], + "redemptionFee": "24965037136145118", + "reserves": [ + "4677932553272877992015621", + "24742731876596318127961244", + "10614351977895609125253394" + ], + "mAssetSupply": "39932996978299506066833974" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "309304048707607296", + "expectedQty": "309762450800403986", + "reserves": [ + "4677932553272877992015621", + "24742731876596318127961244", + "10614352287199657832860690" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "421269303730034781978624", + "887105664292719079456768", + "27688032384816190062592" + ], + "expectedQty": "1339156300049401190239189", + "swapFee": "803976165729078161040", + "reserves": [ + "4256663249542843210036997", + "23855626212303599048504476", + "10586664254814841642798098" + ], + "mAssetSupply": "38593840988012555676998771" + }, + { + "type": "mintMulti", + "inputQtys": [ + "12798694055103476793344", + "290377815152609558790144", + "295198521127350181036032" + ], + "expectedQty": "596023293810291148143914", + "reserves": [ + "4269461943597946686830341", + "24146004027456208607294620", + "10881862775942191823834130" + ], + "mAssetSupply": "39189864281822846825142685" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "141374824052194772254720", + "expectedQty": "136935021888603431261463", + "swapFee": "84824894431316863352", + "reserves": [ + "4132526921709343255568878", + "24146004027456208607294620", + "10881862775942191823834130" + ], + "mAssetSupply": "39048574282665083369751317" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "88484516504875248", + "outputIndex": 1, + "expectedQty": "89405929137333960", + "swapFee": "53114441077642", + "reserves": [ + "4132526921709343255568878", + "24146003938050279469960660", + "10881862864426708328709378" + ], + "mAssetSupply": "39048574282718197810828959", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemMasset", + "inputQty": "3301714519304187494", + "expectedQtys": [ + "349316999714848954", + "2041029571140417666", + "919829382632954696" + ], + "redemptionFee": "990514355791256", + "reserves": [ + "4132526572392343540719924", + "24146001897020708329542994", + "10881861944597325695754682" + ], + "mAssetSupply": "39048570981994192862432721" + }, + { + "type": "redeemMasset", + "inputQty": "43310924626341375089049", + "expectedQtys": [ + "4582238154417394438979", + "26773628488760414279550", + "12066052600061174109071" + ], + "redemptionFee": "12993277387902412526", + "reserves": [ + "4127944334237926146280945", + "24119228268531947915263444", + "10869795891997264521645611" + ], + "mAssetSupply": "39005273050645239389756198" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "1502724615355221", + "expectedQty": "1487009660752890", + "reserves": [ + "4127944334237926146280945", + "24119228270034672530618665", + "10869795891997264521645611" + ] + }, + { + "type": "redeemMasset", + "inputQty": "103298145454010798807449", + "expectedQtys": [ + "10928806241047115980332", + "63856086977843904915562", + "28777978471770974718047" + ], + "redemptionFee": "30989443636203239642", + "reserves": [ + "4117015527996879030300613", + "24055372183056828625703103", + "10841017913525493546927564" + ], + "mAssetSupply": "38902005896121874454941281" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "11922669451114199132405760", + "hardLimitError": true + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "139148777117729328988160", + "outputIndex": 0, + "expectedQty": "134525462512071378197829", + "swapFee": "83519185939039699958", + "reserves": [ + "3982490065484807652102784", + "24055372183056828625703103", + "10980166690643222875915724" + ], + "mAssetSupply": "38902089415307813494641239", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mintMulti", + "inputQtys": [ + "25620124032071574224896", + "12752370441712274767872", + "12463659627254657318912" + ], + "expectedQty": "51600206967351134388105", + "reserves": [ + "4008110189516879226327680", + "24068124553498540900470975", + "10992630350270477533234636" + ], + "mAssetSupply": "38953689622275164629029344" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "442787271730018048", + "393777163448757440", + "59023988569636472" + ], + "expectedQty": "906837918648680156", + "swapFee": "544429408834508", + "reserves": [ + "4008109746729607496309632", + "24068124159721377451713535", + "10992630291246488963598164" + ], + "mAssetSupply": "38953688715437245980349188" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "10691223149880772608", + "expectedQty": "10692906738727448783", + "reserves": [ + "4008109746729607496309632", + "24068124159721377451713535", + "10992640982469638844370772" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "131060969969555720896512", + "966361391642602555572224", + "224315684506535718813696" + ], + "expectedQty": "1316007284434504268269931", + "reserves": [ + "4139170716699163217206144", + "25034485551363980007285759", + "11216956666976174563184468" + ], + "mAssetSupply": "40269706692778488976067902" + }, + { + "type": "mintMulti", + "inputQtys": [ + "14295822432905592832", + "10283968898381434880", + "8418292553232033792" + ], + "expectedQty": "33393005051877532732", + "reserves": [ + "4139185012521596122798976", + "25034495835332878388720639", + "11216965085268727795218260" + ], + "mAssetSupply": "40269740085783540853600634" + }, + { + "type": "mintMulti", + "inputQtys": [ + "14014266224015218688", + "96715360825201950720", + "22989585731841167360" + ], + "expectedQty": "133174448348446163345", + "reserves": [ + "4139199026787820138017664", + "25034592550693703590671359", + "11216988074854459636385620" + ], + "mAssetSupply": "40269873260231889299763979" + }, + { + "type": "redeemMasset", + "inputQty": "81460708764686444134", + "expectedQtys": [ + "8370548614246199095", + "50626527651183980878", + "22683698797362072768" + ], + "redemptionFee": "24438212629405933", + "reserves": [ + "4139190656239205891818569", + "25034541924166052406690481", + "11216965391155662274312852" + ], + "mAssetSupply": "40269791823961337242725778" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "128640264758892167168", + "423273476376813895680", + "253010420664867422208" + ], + "expectedQty": "804968638532932313597", + "swapFee": "483271145807243734", + "reserves": [ + "4139062015974446999651401", + "25034118650689675592794801", + "11216712380734997406890644" + ], + "mAssetSupply": "40268986855322804310412181" + }, + { + "type": "mintMulti", + "inputQtys": [ + "115253377889345707442176", + "30491121961552880599040", + "623846536704148690173952" + ], + "expectedQty": "773298668458968916386123", + "reserves": [ + "4254315393863792707093577", + "25064609772651228473393841", + "11840558917439146097064596" + ], + "mAssetSupply": "41042285523781773226798304" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "693355410326797549568", + "1636347562115209101312", + "2211878679570689818624" + ], + "expectedQty": "4547706796166962370135", + "swapFee": "2730262235041202143", + "reserves": [ + "4253622038453465909544009", + "25062973425089113264292529", + "11838347038759575407245972" + ], + "mAssetSupply": "41037737816985606264428169" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "4430437150792981980119040", + "expectedQty": "4379069077633750600674125", + "reserves": [ + "4253622038453465909544009", + "29493410575882095244411569", + "11838347038759575407245972" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "702305771459386837827584", + "635737220197198854094848", + "97339219403758234501120" + ], + "expectedQty": "1455517775189884538538821", + "reserves": [ + "4955927809912852747371593", + "30129147796079294098506417", + "11935686258163333641747092" + ], + "mAssetSupply": "46872324669809241403641115" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "26895994319281839931392", + "expectedQty": "26957236959833954034591", + "reserves": [ + "4955927809912852747371593", + "30129147796079294098506417", + "11962582252482615481678484" + ] + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "152144638636339603963904", + "outputIndex": 2, + "expectedQty": "149933495423960409721227", + "swapFee": "90233466376598173589", + "reserves": [ + "4955927809912852747371593", + "30281292434715633702470321", + "11812648757058655071957257" + ], + "mAssetSupply": "46899372140235451955849295", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemBassets", + "inputQtys": [ + "2178364963748446803591168", + "1074504485308159135580160", + "524727396622664703410176" + ], + "expectedQty": "3891999940851721484159013", + "swapFee": "2336601925666432750145", + "reserves": [ + "2777562846164405943780425", + "29206787949407474566890161", + "11287921360435990368547081" + ], + "mAssetSupply": "43007372199383730471690282" + }, + { + "type": "mintMulti", + "inputQtys": [ + "463096395298865179262976", + "958792481610069216067584", + "1483317208044775822852096" + ], + "expectedQty": "2930727339537210640560634", + "reserves": [ + "3240659241463271123043401", + "30165580431017543782957745", + "12771238568480766191399177" + ], + "mAssetSupply": "45938099538920941112250916" + }, + { + "type": "mintMulti", + "inputQtys": [ + "263189218140901968183296", + "38823524424009128083456", + "74557675645276965044224" + ], + "expectedQty": "395871667946387876410480", + "reserves": [ + "3503848459604173091226697", + "30204403955441552911041201", + "12845796244126043156443401" + ], + "mAssetSupply": "46333971206867328988661396" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "6489767017160971156193280", + "expectedQty": "6375439038533647677626610", + "reserves": [ + "3503848459604173091226697", + "36694170972602524067234481", + "12845796244126043156443401" + ] + }, + { + "type": "redeemMasset", + "inputQty": "30562213793342849024", + "expectedQtys": [ + "2031008118166562820", + "21269800904336692164", + "7446074439840612330" + ], + "redemptionFee": "9168664138002854", + "reserves": [ + "3503846428596054924663877", + "36694149702801619730542317", + "12845788798051603315831071" + ], + "mAssetSupply": "52709379692355847461441836" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "4880274595801960808448", + "2538292336785846435840", + "7938626709924472684544" + ], + "expectedQty": "15824506229053740522340", + "swapFee": "9500403979820136395", + "reserves": [ + "3498966154000252963855429", + "36691611410464833884106477", + "12837850171341678843146527" + ], + "mAssetSupply": "52693555186126793720919496" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "11418385701280212320256", + "17929765148989209968640", + "1684477866877468540928" + ], + "expectedQty": "31829834154361700963245", + "swapFee": "19109366112284391212", + "reserves": [ + "3487547768298972751535173", + "36673681645315844674137837", + "12836165693474801374605599" + ], + "mAssetSupply": "52661725351972432019956251" + }, + { + "type": "mintMulti", + "inputQtys": [ + "70236653384333910867968", + "29500027440555681120256", + "42989000435544696553472" + ], + "expectedQty": "149253737011743134777399", + "reserves": [ + "3557784421683306662403141", + "36703181672756400355258093", + "12879154693910346071159071" + ], + "mAssetSupply": "52810979088984175154733650" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "17604741195614420939571200", + "hardLimitError": true + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "3866947712222191681536", + "expectedQty": "3942064377574891571386", + "swapFee": "2320168627333315008", + "reserves": [ + "3557784421683306662403141", + "36699239608378825463686707", + "12879154693910346071159071" + ], + "mAssetSupply": "52807114461440580296367122" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "16230361031556730978304", + "expectedQty": "15911463987888886498240", + "reserves": [ + "3557784421683306662403141", + "36715469969410382194665011", + "12879154693910346071159071" + ] + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "27088534253712521035776", + "outputIndex": 2, + "expectedQty": "26444212690203341935085", + "swapFee": "15933521148565599297", + "reserves": [ + "3557784421683306662403141", + "36742558503664094715700787", + "12852710481220142729223986" + ], + "mAssetSupply": "52823041858949617748464659", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "57572080561922138112", + "expectedQty": "58693318955125356262", + "swapFee": "34543248337153282", + "reserves": [ + "3557784421683306662403141", + "36742499810345139590344525", + "12852710481220142729223986" + ], + "mAssetSupply": "52822984321412304163479829" + }, + { + "type": "redeemMasset", + "inputQty": "191698867523459219456", + "expectedQtys": [ + "12907612970279580603", + "133301490731728671404", + "46629529181015871428" + ], + "redemptionFee": "57509660257037765", + "reserves": [ + "3557771514070336382822538", + "36742366508854407861673121", + "12852663851690961713352558" + ], + "mAssetSupply": "52822792680054440961298138" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "199116541600838927253504", + "expectedQty": "195181162100934094471040", + "reserves": [ + "3557771514070336382822538", + "36941483050455246788926625", + "12852663851690961713352558" + ] + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "609775018704237460717568", + "expectedQty": "621599323926861414849789", + "swapFee": "365865011222542476430", + "reserves": [ + "3557771514070336382822538", + "36319883726528385374076836", + "12852663851690961713352558" + ], + "mAssetSupply": "52408564688462360137528040" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "8625530816725737472", + "expectedQty": "8591491252356330326", + "swapFee": "5175318490035442", + "reserves": [ + "3557771514070336382822538", + "36319883726528385374076836", + "12852655260199709357022232" + ], + "mAssetSupply": "52408556068106861901826010" + }, + { + "type": "mintMulti", + "inputQtys": [ + "9535808878897927290880", + "14996235212512764624896", + "668813259262704091136" + ], + "expectedQty": "25819680337590093280927", + "reserves": [ + "3567307322949234310113418", + "36334879961740898138701732", + "12853324073458972061113368" + ], + "mAssetSupply": "52434375748444451995106937" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "26072646463844979310592", + "expectedQty": "28529417278994764847407", + "reserves": [ + "3593379969413079289424010", + "36334879961740898138701732", + "12853324073458972061113368" + ] + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "2198805081879082061266944", + "expectedQty": "2201875995272328255311989", + "reserves": [ + "3593379969413079289424010", + "36334879961740898138701732", + "15052129155338054122380312" + ] + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "3329768873983126011904", + "outputIndex": 2, + "expectedQty": "3269044199493042141604", + "swapFee": "1961904390645269002", + "reserves": [ + "3593379969413079289424010", + "36338209730614881264713636", + "15048860111138561080238708" + ], + "mAssetSupply": "54664783122900165660535335", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "4377508415313161728", + "expectedQty": "4455074582129913159", + "swapFee": "2626505049187897", + "reserves": [ + "3593379969413079289424010", + "36338205275540299134800477", + "15048860111138561080238708" + ], + "mAssetSupply": "54664778748018255396561504" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "5493884258613414938542080", + "expectedQty": "5702299600534929197070764", + "reserves": [ + "9087264228026494227966090", + "36338205275540299134800477", + "15048860111138561080238708" + ] + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "106705058861051593883648", + "expectedQty": "107472614772582591838631", + "swapFee": "64023035316630956330", + "reserves": [ + "9087264228026494227966090", + "36230732660767716542961846", + "15048860111138561080238708" + ], + "mAssetSupply": "60260437312727449630704950" + }, + { + "type": "redeemMasset", + "inputQty": "29364161662340007198720", + "expectedQtys": [ + "4426782409610386979982", + "17649488999706837833769", + "7330922437493953355829" + ], + "redemptionFee": "8809248498702002159", + "reserves": [ + "9082837445616883840986108", + "36213083171768009705128077", + "15041529188701067126882879" + ], + "mAssetSupply": "60231081960313608325508389" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "486697826614660093181952", + "expectedQty": "490153370466144756053730", + "swapFee": "292018695968796055909", + "reserves": [ + "9082837445616883840986108", + "35722929801301864949074347", + "15041529188701067126882879" + ], + "mAssetSupply": "59744676152394917028382346" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "397673897095804992", + "expectedQty": "394663320557088294", + "reserves": [ + "9082837445616883840986108", + "35722930198975762044879339", + "15041529188701067126882879" + ] + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "174349400459121600", + "outputIndex": 0, + "expectedQty": "170512795282056275", + "swapFee": "103817696588237", + "reserves": [ + "9082837275104088558929833", + "35722930373325162504000939", + "15041529188701067126882879" + ], + "mAssetSupply": "59744676547162055282058877", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mintMulti", + "inputQtys": [ + "316177138361299885883392", + "150615778374972468101120", + "293275682158103544987648" + ], + "expectedQty": "764039429719978905280743", + "reserves": [ + "9399014413465388444813225", + "35873546151700134972102059", + "15334804870859170671870527" + ], + "mAssetSupply": "60508715976882034187339620" + }, + { + "type": "mintMulti", + "inputQtys": [ + "285796057701892685824", + "1178862595059565854720", + "1733984139299177889792" + ], + "expectedQty": "3198170393796324026669", + "reserves": [ + "9399300209523090337499049", + "35874725014295194537956779", + "15336538854998469849760319" + ], + "mAssetSupply": "60511914147275830511366289" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "14377943254215390396416", + "expectedQty": "14475105582399603204353", + "swapFee": "8626765952529234237", + "reserves": [ + "9399300209523090337499049", + "35860249908712794934752426", + "15336538854998469849760319" + ], + "mAssetSupply": "60497544830787567650204110" + }, + { + "type": "redeemMasset", + "inputQty": "461020973935133", + "expectedQtys": [ + "71605791055794", + "273190716854671", + "116836889160902" + ], + "redemptionFee": "138306292180", + "reserves": [ + "9399300209451484546443255", + "35860249908439604217897755", + "15336538854881632960599417" + ], + "mAssetSupply": "60497544830326684982561157" + }, + { + "type": "mintMulti", + "inputQtys": [ + "2433364690378558537728", + "2414605107612371386368", + "1310086485657632899072" + ], + "expectedQty": "6176084591571980507609", + "reserves": [ + "9401733574141863104980983", + "35862664513547216589284123", + "15337848941367290593498489" + ], + "mAssetSupply": "60503720914918256963068766" + }, + { + "type": "redeemMasset", + "inputQty": "4665839496363910784614", + "expectedQtys": [ + "724811946892268803055", + "2764776036442938076150", + "1182447477868107076131" + ], + "redemptionFee": "1399751848909173235", + "reserves": [ + "9401008762194970836177928", + "35859899737510773651207973", + "15336666493889422486422358" + ], + "mAssetSupply": "60499056475173741961457387" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "29593546311627767283712", + "59424985590260706574336", + "32861441587635357220864" + ], + "expectedQty": "121922153629441209214561", + "swapFee": "73197210503967105792", + "reserves": [ + "9371415215883343068894216", + "35800474751920512944633637", + "15303805052301787129201494" + ], + "mAssetSupply": "60377134321544300752242826" + }, + { + "type": "mintMulti", + "inputQtys": [ + "122744408775697027301376", + "420384922165762997616640", + "202018440507356593782784" + ], + "expectedQty": "744215414825454023811870", + "reserves": [ + "9494159624659040096195592", + "36220859674086275942250277", + "15505823492809143722984278" + ], + "mAssetSupply": "61121349736369754776054696" + }, + { + "type": "mintMulti", + "inputQtys": [ + "26647771224333589938176", + "190195213864601930170368", + "243313752986746250854400" + ], + "expectedQty": "459714915772686302500281", + "reserves": [ + "9520807395883373686133768", + "36411054887950877872420645", + "15749137245795889973838678" + ], + "mAssetSupply": "61581064652142441078554977" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "490455984805608554496", + "8535191110518735872", + "949823288852592459776" + ], + "expectedQty": "1457574089417862072318", + "swapFee": "875069495347925998", + "reserves": [ + "9520316939898568077579272", + "36411046352759767353684773", + "15748187422507037381378902" + ], + "mAssetSupply": "61579607078053023216482659" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "170332329874303288868864", + "expectedQty": "171473295043326643693353", + "swapFee": "102199397924581973321", + "reserves": [ + "9520316939898568077579272", + "36239573057716440709991420", + "15748187422507037381378902" + ], + "mAssetSupply": "61409376947576644509587116" + }, + { + "type": "redeemMasset", + "inputQty": "317523606256336907114905", + "expectedQtys": [ + "49211026720389239431707", + "187324288606906651943303", + "81403221861114683307009" + ], + "redemptionFee": "95257081876901072134", + "reserves": [ + "9471105913178178838147565", + "36052248769109534058048117", + "15666784200645922698071893" + ], + "mAssetSupply": "61091948598402184503544345" + }, + { + "type": "mintMulti", + "inputQtys": [ + "23615157817385779200", + "11433174823629148160", + "7713157761441261568" + ], + "expectedQty": "43011340425043276827", + "reserves": [ + "9471129528335996223926765", + "36052260202284357687196277", + "15666791913803684139333461" + ], + "mAssetSupply": "61091991609742609546821172" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "4167367527701993423372288", + "expectedQty": "4134699256424812141715851", + "reserves": [ + "9471129528335996223926765", + "40219627729986351110568565", + "15666791913803684139333461" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "809395151942718208", + "2372146834026563072", + "2512413081442213376" + ], + "expectedQty": "5695893003834855143", + "swapFee": "3419587554833813", + "reserves": [ + "9471128718940844281208557", + "40219625357839517084005493", + "15666789401390602697120085" + ], + "mAssetSupply": "65226685170274417853681880" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "1055094437940893067509760", + "expectedQty": "1050220671036250312777804", + "swapFee": "633056662764535840505", + "reserves": [ + "9471128718940844281208557", + "40219625357839517084005493", + "14616568730354352384342281" + ], + "mAssetSupply": "64172223788996289322012625" + }, + { + "type": "redeemMasset", + "inputQty": "22310290656494757478", + "expectedQtys": [ + "3291770660291460532", + "13978669982183089264", + "5080111729924275686" + ], + "redemptionFee": "6693087196948427", + "reserves": [ + "9471125427170183989748025", + "40219611379169534900916229", + "14616563650242622460066595" + ], + "mAssetSupply": "64172201485398720024203574" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "69704556511904925745152", + "expectedQty": "70281523293778469661672", + "swapFee": "41822733907142955447", + "reserves": [ + "9471125427170183989748025", + "40149329855875756431254557", + "14616563650242622460066595" + ], + "mAssetSupply": "64102538751620722241413869" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "1425180039749081669566464", + "expectedQty": "1436632935758045400656415", + "swapFee": "855108023849449001739", + "reserves": [ + "9471125427170183989748025", + "38712696920117711030598142", + "14616563650242622460066595" + ], + "mAssetSupply": "62678213819895490020849144" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "81603347046120701952", + "expectedQty": "81935811973260668199", + "reserves": [ + "9471125427170183989748025", + "38712696920117711030598142", + "14616645253589668580768547" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "688244807663652700160", + "413015388699057913856", + "469426946378237411328" + ], + "expectedQty": "1579416420686376085465", + "reserves": [ + "9471813671977847642448185", + "38713109935506410088511998", + "14617114680536046818179875" + ], + "mAssetSupply": "62679875172128149657602808" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "51010568666683375616", + "expectedQty": "51771117014502439563", + "reserves": [ + "9471864682546514325823801", + "38713109935506410088511998", + "14617114680536046818179875" + ] + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "644241631025001324871680", + "expectedQty": "653178891997739056512069", + "reserves": [ + "10116106313571515650695481", + "38713109935506410088511998", + "14617114680536046818179875" + ] + }, + { + "type": "redeemMasset", + "inputQty": "49618554732414546739", + "expectedQtys": [ + "7923123052449436039", + "30320829403554263472", + "11448396714680640634" + ], + "redemptionFee": "14885566419724364", + "reserves": [ + "10116098390448463201259442", + "38713079614677006534248526", + "14617103232139332137539241" + ], + "mAssetSupply": "63333056231573737221732065" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "278838321142621088", + "4862157032943529984", + "3383377974617404416" + ], + "expectedQty": "8503909787063085986", + "swapFee": "5105409117708476", + "reserves": [ + "10116098111610142058638354", + "38713074752519973590718542", + "14617099848761357520134825" + ], + "mAssetSupply": "63333047727663950158646079" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "5896364468516249665536", + "expectedQty": "5939704338250261595062", + "swapFee": "3537818681109749799", + "reserves": [ + "10116098111610142058638354", + "38707135048181723329123480", + "14617099848761357520134825" + ], + "mAssetSupply": "63327154901014115018730342" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "24002976092865216512", + "expectedQty": "24312497217911228290", + "reserves": [ + "10116122114586234923854866", + "38707135048181723329123480", + "14617099848761357520134825" + ] + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "522600944933818825965568", + "expectedQty": "518436326325186945360137", + "reserves": [ + "10116122114586234923854866", + "39229735993115542155089048", + "14617099848761357520134825" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "33611390866266890240", + "32337709201889312768", + "62701373769838395392" + ], + "expectedQty": "129111518655084145389", + "swapFee": "77513419244597245", + "reserves": [ + "10116088503195368656964626", + "39229703655406340265776280", + "14617037147387587681739433" + ], + "mAssetSupply": "63845486428317864791173380" + }, + { + "type": "mintMulti", + "inputQtys": [ + "87028941758002256", + "9375034522756780032", + "14246133568949999616" + ], + "expectedQty": "23696687848901465811", + "reserves": [ + "10116088590224310414966882", + "39229713030440863022556312", + "14617051393521156631739049" + ], + "mAssetSupply": "63845510125005713692639191" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "713240992483360408338432", + "420593666071718478741504", + "329964620439668068974592" + ], + "expectedQty": "1471872851910914914320526", + "swapFee": "883653903488642133872", + "reserves": [ + "9402847597740950006628450", + "38809119364369144543814808", + "14287086773081488562764457" + ], + "mAssetSupply": "62373637273094798778318665" + }, + { + "type": "redeemMasset", + "inputQty": "78191763516307328204", + "expectedQtys": [ + "11783899421378850266", + "48636623583252041631", + "17904958238284386730" + ], + "redemptionFee": "23457529054892198", + "reserves": [ + "9402835813841528627778184", + "38809070727745561291773177", + "14287068868123250278377727" + ], + "mAssetSupply": "62373559104788811525882659" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "214575366828697545867264", + "expectedQty": "216286342330869005572261", + "swapFee": "128745220097218527520", + "reserves": [ + "9402835813841528627778184", + "38592784385414692286200916", + "14287068868123250278377727" + ], + "mAssetSupply": "62159112483180211198542915" + }, + { + "type": "mintMulti", + "inputQtys": [ + "16075267595169551089664", + "748268462876843966464", + "16169209120537549209600" + ], + "expectedQty": "33297417768682098885988", + "reserves": [ + "9418911081436698178867848", + "38593532653877569130167380", + "14303238077243787827587327" + ], + "mAssetSupply": "62192409900948893297428903" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "9626598590645", + "10075878675466", + "5512920200109" + ], + "expectedQty": "25297949470510", + "swapFee": "15187882411", + "reserves": [ + "9418911081427071580277203", + "38593532653867493251491914", + "14303238077238274907387218" + ], + "mAssetSupply": "62192409900923595347958393" + }, + { + "type": "mintMulti", + "inputQtys": [ + "1138956509313050624", + "6908211025680342016", + "1242619077913525760" + ], + "expectedQty": "9253806824630295882", + "reserves": [ + "9418912220383580893327827", + "38593539562078518931833930", + "14303239319857352820912978" + ], + "mAssetSupply": "62192419154730419978254275" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "629509737107053797703680", + "expectedQty": "638260740006100265008572", + "reserves": [ + "10048421957490634691031507", + "38593539562078518931833930", + "14303239319857352820912978" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "249953722203397928517632", + "183998188577339268399104", + "25821504205376966361088" + ], + "expectedQty": "461713642518304075609146", + "swapFee": "277194502212309831264", + "reserves": [ + "9798468235287236762513875", + "38409541373501179663434826", + "14277417815651975854551890" + ], + "mAssetSupply": "62368966252218216167653701" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "438496304412456191524864", + "outputIndex": 0, + "expectedQty": "428405020508894124797830", + "swapFee": "260940664089428636861", + "reserves": [ + "9370063214778342637716045", + "38848037677913635854959690", + "14277417815651975854551890" + ], + "mAssetSupply": "62369227192882305596290562", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemBassets", + "inputQtys": [ + "671498216046867532218368", + "585133306868732098772992", + "688247728552891610300416" + ], + "expectedQty": "1953811580349987383895969", + "swapFee": "1172990742655585781806", + "reserves": [ + "8698564998731475105497677", + "38262904371044903756186698", + "13589170087099084244251474" + ], + "mAssetSupply": "60415415612532318212394593" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "814791453388634718208", + "expectedQty": "818807100733382750986", + "reserves": [ + "8698564998731475105497677", + "38262904371044903756186698", + "13589984878552472878969682" + ] + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "1283129607557087458492416", + "outputIndex": 2, + "expectedQty": "1262165580546008271319144", + "swapFee": "762617541279329483553", + "reserves": [ + "8698564998731475105497677", + "39546033978601991214679114", + "12327819298006464607650538" + ], + "mAssetSupply": "60416997037174330924629132", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "8510760062183855357952", + "expectedQty": "8442618117477315184105", + "swapFee": "5106456037310313214", + "reserves": [ + "8698564998731475105497677", + "39546033978601991214679114", + "12319376679888987292466433" + ], + "mAssetSupply": "60408491383568184379584394" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "157350936545491136020480", + "expectedQty": "156067848896723289314672", + "swapFee": "94410561927294681612", + "reserves": [ + "8698564998731475105497677", + "39546033978601991214679114", + "12163308830992264003151761" + ], + "mAssetSupply": "60251234857584620538245526" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "28469070245218906112", + "expectedQty": "28749455452826583583", + "swapFee": "17081442147131343", + "reserves": [ + "8698564998731475105497677", + "39546005229146538388095531", + "12163308830992264003151761" + ], + "mAssetSupply": "60251206405595817466470757" + }, + { + "type": "mintMulti", + "inputQtys": [ + "44338494988497593565184", + "38942020954097536991232", + "29133633531530662903808" + ], + "expectedQty": "113040144194651485348427", + "reserves": [ + "8742903493719972699062861", + "39584947250100635925086763", + "12192442464523794666055569" + ], + "mAssetSupply": "60364246549790468951819184" + }, + { + "type": "mintMulti", + "inputQtys": [ + "1306894721306713391104", + "1896399019345104076800", + "1232112246384813932544" + ], + "expectedQty": "4448939367858132449564", + "reserves": [ + "8744210388441279412453965", + "39586843649119981029163563", + "12193674576770179479988113" + ], + "mAssetSupply": "60368695489158327084268748" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "577952577794011444543488", + "482276294137063529250816", + "219438497482286083080192" + ], + "expectedQty": "1287340641387318423387473", + "swapFee": "772868105695808539155", + "reserves": [ + "8166257810647267967910477", + "39104567354982917499912747", + "11974236079287893396907921" + ], + "mAssetSupply": "59081354847771008660881275" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "26047799146052872830976", + "18314521122552298864640", + "13165909128109738688512" + ], + "expectedQty": "57963775020085647181435", + "swapFee": "34799144498750638692", + "reserves": [ + "8140210011501215095079501", + "39086252833860365201048107", + "11961070170159783658219409" + ], + "mAssetSupply": "59023391072750923013699840" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "39861764796885540864", + "14804502350908798976", + "6723137845187040256" + ], + "expectedQty": "62096524875203856289", + "swapFee": "37280283094979301", + "reserves": [ + "8140170149736418209538637", + "39086238029358014292249131", + "11961063447021938471179153" + ], + "mAssetSupply": "59023328976226047809843551" + }, + { + "type": "redeemMasset", + "inputQty": "152145846057879941939200", + "expectedQtys": [ + "20976816252826105485476", + "100723304067865931746184", + "30823069481501985543870" + ], + "redemptionFee": "45643753817363982581", + "reserves": [ + "8119193333483592104053161", + "38985514725290148360502947", + "11930240377540436485635283" + ], + "mAssetSupply": "58871228773921985231886932" + }, + { + "type": "mintMulti", + "inputQtys": [ + "487837375570974846484480", + "536507791414522068074496", + "602365423895904780288000" + ], + "expectedQty": "1635057239552474533366278", + "reserves": [ + "8607030709054566950537641", + "39522022516704670428577443", + "12532605801436341265923283" + ], + "mAssetSupply": "60506286013474459765253210" + }, + { + "type": "mintMulti", + "inputQtys": [ + "1515211854445228064768", + "12727252026018163064832", + "8193418120988303818752" + ], + "expectedQty": "22391823856678018955232", + "reserves": [ + "8608545920909012178602409", + "39534749768730688591642275", + "12540799219557329569742035" + ], + "mAssetSupply": "60528677837331137784208442" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "2479667004378982645760", + "149111362261828786716672", + "46439601898348525649920" + ], + "expectedQty": "196881658856871118268755", + "swapFee": "118199915263280639344", + "reserves": [ + "8606066253904633195956649", + "39385638406468859804925603", + "12494359617658981044092115" + ], + "mAssetSupply": "60331796178474266665939687" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "171471970971222688", + "expectedQty": "172683873045757880", + "reserves": [ + "8606066253904633195956649", + "39385638406468859804925603", + "12494359789130952015314803" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "6622005248540734914560", + "56939386530629039423488", + "41160345022699755536384" + ], + "expectedQty": "104553767929187283390408", + "reserves": [ + "8612688259153173930871209", + "39442577792999488844349091", + "12535520134153651770851187" + ], + "mAssetSupply": "60436350119087326995087975" + }, + { + "type": "redeemMasset", + "inputQty": "44451116342702", + "expectedQtys": [ + "6332757587023", + "29001430941720", + "9217146592120" + ], + "redemptionFee": "13335334902", + "reserves": [ + "8612688259146841173284186", + "39442577792970487413407371", + "12535520134144434624259067" + ], + "mAssetSupply": "60436350119042889214080175" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "3218486891453325242269696", + "expectedQty": "3183715866655899197988085", + "reserves": [ + "8612688259146841173284186", + "42661064684423812655677067", + "12535520134144434624259067" + ] + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "1243362066913193237676032", + "outputIndex": 0, + "expectedQty": "1220641443258914550710473", + "swapFee": "751712452184858561656", + "reserves": [ + "7392046815887926622573713", + "42661064684423812655677067", + "13778882201057627861935099" + ], + "mAssetSupply": "63620817698150973270629916", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemBassets", + "inputQtys": [ + "5405186458715970076672", + "12740575050618028163072", + "445035387191246127104" + ], + "expectedQty": "18600892410931030077052", + "swapFee": "11167235788031436908", + "reserves": [ + "7386641629429210652497041", + "42648324109373194627513995", + "13778437165670436615807995" + ], + "mAssetSupply": "63602216805740042240552864" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "2966372515103707179778048", + "outputIndex": 2, + "expectedQty": "2998670684740680042876453", + "swapFee": "1817585279154072792585", + "reserves": [ + "10353014144532917832275089", + "42648324109373194627513995", + "10779766480929756572931542" + ], + "mAssetSupply": "63604034391019196313345449", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "360639810283537432576", + "outputIndex": 2, + "expectedQty": "360895072204229215704", + "swapFee": "219503749333697163", + "reserves": [ + "10353374784343201369707665", + "42648324109373194627513995", + "10779405585857552343715838" + ], + "mAssetSupply": "63604034610522945647042612", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "10819533573710781261807616", + "outputIndex": 1, + "expectedQty": "10929302289761905641286123", + "swapFee": "6522963203385851912326", + "reserves": [ + "10353374784343201369707665", + "31719021819611288986227872", + "21598939159568333605523454" + ], + "mAssetSupply": "63610557573726331498954938", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "10784692258664511176704", + "expectedQty": "10899444471870417167166", + "reserves": [ + "10364159476601865880884369", + "31719021819611288986227872", + "21598939159568333605523454" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "5753133100455680802816", + "2411021263084181258240", + "750547269781073559552" + ], + "expectedQty": "8963853600254676413835", + "reserves": [ + "10369912609702321561687185", + "31721432840874373167486112", + "21599689706838114679083006" + ], + "mAssetSupply": "63630420871798456592535939" + }, + { + "type": "redeemMasset", + "inputQty": "1038630002516218504806", + "expectedQtys": [ + "169215778580088913787", + "517628948080271792487", + "352462788105970799303" + ], + "redemptionFee": "311589000754865551", + "reserves": [ + "10369743393923741472773398", + "31720915211926292895693625", + "21599337244050008708283703" + ], + "mAssetSupply": "63629382553384941128896684" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "1312718776724985242189824", + "969785853760306541494272", + "12567007993307724775424" + ], + "expectedQty": "2306107797261785211914509", + "swapFee": "1384495375582420579496", + "reserves": [ + "9057024617198756230583574", + "30751129358165986354199353", + "21586770236056700983508279" + ], + "mAssetSupply": "61323274756123155916982175" + }, + { + "type": "redeemMasset", + "inputQty": "1429734810395142101401", + "expectedQtys": [ + "211098619280929122461", + "716738799242200135826", + "503138457072631814327" + ], + "redemptionFee": "428920443118542630", + "reserves": [ + "9056813518579475301461113", + "30750412619366744154063527", + "21586267097599628351693952" + ], + "mAssetSupply": "61321845450233203893423404" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "52895269041805790806016", + "expectedQty": "52800972215641771069640", + "reserves": [ + "9056813518579475301461113", + "30750412619366744154063527", + "21639162366641434142499968" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "67968181692873698181120", + "2538527160555148930973696", + "2057858645636001694744576" + ], + "expectedQty": "4649556821204538199386169", + "swapFee": "2791408938085574264190", + "reserves": [ + "8988845336886601603279993", + "28211885458811595223089831", + "19581303721005432447755392" + ], + "mAssetSupply": "56725089601244307465106875" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "498984355042602975232", + "outputIndex": 2, + "expectedQty": "497031686084843492577", + "swapFee": "297987273072947113", + "reserves": [ + "8988845336886601603279993", + "28212384443166637826065063", + "19580806689319347604262815" + ], + "mAssetSupply": "56725089899231580538053988", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemBassets", + "inputQtys": [ + "521499081632132844486656", + "365449358205551529426944", + "661614240918828006506496" + ], + "expectedQty": "1552062209723052328093258", + "swapFee": "931796403676037019067", + "reserves": [ + "8467346255254468758793337", + "27846935084961086296638119", + "18919192448400519597756319" + ], + "mAssetSupply": "55173027689508528209960730" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "209444900000219", + "expectedQty": "208402268326527", + "reserves": [ + "8467346255254468758793337", + "27846935085170531196638338", + "18919192448400519597756319" + ] + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "2959748287636615385317376", + "outputIndex": 1, + "expectedQty": "2964844466648851665643107", + "swapFee": "1772396399102875343760", + "reserves": [ + "8467346255254468758793337", + "24882090618521679530995231", + "21878940736037134983073695" + ], + "mAssetSupply": "55174800086116033353631017", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "46105369935417", + "expectedQty": "46203857073186", + "swapFee": "27663221961", + "reserves": [ + "8467346255254468758793337", + "24882090618521679530995231", + "21878940735990931126000509" + ], + "mAssetSupply": "55174800086069955646917561" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "5324465744276320419840", + "expectedQty": "5341873792122680793293", + "swapFee": "3194679446565792251", + "reserves": [ + "8467346255254468758793337", + "24876748744729556850201938", + "21878940735990931126000509" + ], + "mAssetSupply": "55169478815005125892289972" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "19955218107831627776", + "expectedQty": "20020445872433350970", + "swapFee": "11973130864698976", + "reserves": [ + "8467346255254468758793337", + "24876728724283684416850968", + "21878940735990931126000509" + ], + "mAssetSupply": "55169458871760148925361172" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "1629991329434280260534272", + "outputIndex": 0, + "expectedQty": "1596618163459318183284564", + "swapFee": "974007399034823970719", + "reserves": [ + "6870728091795150575508773", + "26506720053717964677385240", + "21878940735990931126000509" + ], + "mAssetSupply": "55170432879159183749331891", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mintMulti", + "inputQtys": [ + "68099441638550032875520", + "293714578248436407074816", + "217755781635201652752384" + ], + "expectedQty": "578545210473524643297480", + "reserves": [ + "6938827533433700608384293", + "26800434631966401084460056", + "22096696517626132778752893" + ], + "mAssetSupply": "55748978089632708392629371" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "463942763638337216446464", + "outputIndex": 0, + "expectedQty": "451242099795280900947069", + "swapFee": "276823122056703120260", + "reserves": [ + "6487585433638419707437224", + "27264377395604738300906520", + "22096696517626132778752893" + ], + "mAssetSupply": "55749254912754765095749631", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "1109784836469516469796864", + "outputIndex": 0, + "expectedQty": "1073276950317564789222137", + "swapFee": "663142122806361641645", + "reserves": [ + "5414308483320854918215087", + "27264377395604738300906520", + "23206481354095649248549757" + ], + "mAssetSupply": "55749918054877571457391276", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "6450591954054944915456", + "expectedQty": "6481962140142554720047", + "swapFee": "3870355172432966949", + "reserves": [ + "5414308483320854918215087", + "27264377395604738300906520", + "23199999391955506693829710" + ], + "mAssetSupply": "55743471333278688945442769" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "59658486225126184452096", + "expectedQty": "59224352108159241025629", + "reserves": [ + "5414308483320854918215087", + "27324035881829864485358616", + "23199999391955506693829710" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "1264532903085241794560", + "41250461016942283063296", + "95951699879318740008960" + ], + "expectedQty": "137690834922665562056343", + "swapFee": "82664099413247285605", + "reserves": [ + "5413043950417769676420527", + "27282785420812922202295320", + "23104047692076187953820750" + ], + "mAssetSupply": "55665004850464182624412055" + }, + { + "type": "mintMulti", + "inputQtys": [ + "45318888881619466190848", + "58148531373298428149760", + "48087037804943935275008" + ], + "expectedQty": "152442533407760639958122", + "reserves": [ + "5458362839299389142611375", + "27340933952186220630445080", + "23152134729881131889095758" + ], + "mAssetSupply": "55817447383871943264370177" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "13125794932000835584", + "expectedQty": "13055508473271380537", + "reserves": [ + "5458362839299389142611375", + "27340933952186220630445080", + "23152147855676063889931342" + ] + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "2679148409317667536633856", + "expectedQty": "2663426470688914440313547", + "reserves": [ + "5458362839299389142611375", + "27340933952186220630445080", + "25831296264993731426565198" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "847045699898477597687808", + "248073870296296386985984", + "2862143992430836175601664" + ], + "expectedQty": "3966983094718753042660687", + "reserves": [ + "6305408539197866740299183", + "27589007822482517017431064", + "28693440257424567602166862" + ], + "mAssetSupply": "62447870004788084018724948" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "30262249740071088422912", + "50241241540808302133248", + "29440877319565363642368" + ], + "expectedQty": "110433102213519884307517", + "swapFee": "66299641112779598343", + "reserves": [ + "6275146289457795651876271", + "27538766580941708715297816", + "28663999380105002238524494" + ], + "mAssetSupply": "62337436902574564134417431" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "93819007519760526082048", + "outputIndex": 1, + "expectedQty": "97284481493961556050814", + "swapFee": "58070600809215576131", + "reserves": [ + "6368965296977556177958319", + "27441482099447747159247002", + "28663999380105002238524494" + ], + "mAssetSupply": "62337494973175373349993562", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemMasset", + "inputQty": "27068607157136722074009", + "expectedQtys": [ + "2764745358946472763816", + "11912250536686858188598", + "12442940973881262515500" + ], + "redemptionFee": "8120582147141016622", + "reserves": [ + "6366200551618609705194503", + "27429569848911060301058404", + "28651556439131120976008994" + ], + "mAssetSupply": "62310434486600383768936175" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "39908238178354563383296", + "expectedQty": "40113575079068972044545", + "swapFee": "23944942907012738029", + "reserves": [ + "6366200551618609705194503", + "27389456273831991329013859", + "28651556439131120976008994" + ], + "mAssetSupply": "62270550193364936218290908" + }, + { + "type": "mintMulti", + "inputQtys": [ + "7837816834989777485824", + "6923143589318791004160", + "11523325672126314184704" + ], + "expectedQty": "26416101298066924394369", + "reserves": [ + "6374038368453599482680327", + "27396379417421310120018019", + "28663079764803247290193698" + ], + "mAssetSupply": "62296966294663003142685277" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "124120367452939812864", + "expectedQty": "123351649094749759745", + "reserves": [ + "6374038368453599482680327", + "27396379417421310120018019", + "28663203885170700230006562" + ] + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "1612856193549550066073600", + "outputIndex": 1, + "expectedQty": "1610069895790939634717439", + "swapFee": "961475659229827647553", + "reserves": [ + "6374038368453599482680327", + "25786309521630370485300580", + "30276060078720250296080162" + ], + "mAssetSupply": "62298051121971327720092575", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemMasset", + "inputQty": "79235332262052087673651", + "expectedQtys": [ + "8104547801544774494503", + "32787122709803287284903", + "38495810970456969300546" + ], + "redemptionFee": "23770599678615626302", + "reserves": [ + "6365933820652054708185824", + "25753522398920567198015677", + "30237564267749793326779616" + ], + "mAssetSupply": "62218839560308954248045226" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "30736080287433765158912", + "expectedQty": "30928233427873584582982", + "swapFee": "18441648172460259095", + "reserves": [ + "6365933820652054708185824", + "25753522398920567198015677", + "30206636034321919742196634" + ], + "mAssetSupply": "62188121921669692943145409" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "73427650296829729308672", + "outputIndex": 0, + "expectedQty": "70657620137050151384467", + "swapFee": "43756310028992664163", + "reserves": [ + "6295276200515004556801357", + "25753522398920567198015677", + "30280063684618749471505306" + ], + "mAssetSupply": "62188165677979721935809572", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemMasset", + "inputQty": "9849424965236527923", + "expectedQtys": [ + "996753135286460104", + "4077645424627142924", + "4794348564380433170" + ], + "redemptionFee": "2954827489570958", + "reserves": [ + "6295275203761869270341253", + "25753518321275142570872753", + "30280058890270185091072136" + ], + "mAssetSupply": "62188155831509584188852607" + }, + { + "type": "mintMulti", + "inputQtys": [ + "29484227685239312351232", + "30440687167843415883776", + "19198785710087682916352" + ], + "expectedQty": "79771303622755592261435", + "reserves": [ + "6324759431447108582692485", + "25783959008442985986756529", + "30299257675980272773988488" + ], + "mAssetSupply": "62267927135132339781114042" + }, + { + "type": "redeemMasset", + "inputQty": "262458952688852847820", + "expectedQtys": [ + "26650826770967467147", + "108646634303135327830", + "127672882480954702815" + ], + "redemptionFee": "78737685806655854", + "reserves": [ + "6324732780620337615225338", + "25783850361808682851428699", + "30299130003097791819285673" + ], + "mAssetSupply": "62267664754917336734922076" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "9147120976405336162304", + "2956264759791786131456", + "2812644524234927767552" + ], + "expectedQty": "15171124112609190686702", + "swapFee": "9108139351176220144", + "reserves": [ + "6315585659643932279063034", + "25780894097048891065297243", + "30296317358573556891518121" + ], + "mAssetSupply": "62252493630804727544235374" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "3064980740900472225792", + "expectedQty": "3162086153710216410658", + "reserves": [ + "6318650640384832751288826", + "25780894097048891065297243", + "30296317358573556891518121" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "111038363368203038490624", + "17517180159731982925824", + "15862058666716068577280" + ], + "expectedQty": "147678686130137575995910", + "reserves": [ + "6429689003753035789779450", + "25798411277208623048223067", + "30312179417240272960095401" + ], + "mAssetSupply": "62403334403088575336641942" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "2759119150601370112", + "4549712502150185472", + "10182968414859022336" + ], + "expectedQty": "17484721393355742860", + "swapFee": "10497131114682255", + "reserves": [ + "6429686244633885188409338", + "25798406727496120898037595", + "30312169234271858101073065" + ], + "mAssetSupply": "62403316918367181980899082" + }, + { + "type": "redeemMasset", + "inputQty": "70885938943795776716", + "expectedQtys": [ + "7301496727440841496", + "29296450110797992789", + "34422240222123221539" + ], + "redemptionFee": "21265781683138733", + "reserves": [ + "6429678943137157747567842", + "25798377431046010100044806", + "30312134812031635977851526" + ], + "mAssetSupply": "62403246053694019868261099" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "1290499058248702511546368", + "outputIndex": 2, + "expectedQty": "1291348402773730669585662", + "swapFee": "770261725211054917503", + "reserves": [ + "6429678943137157747567842", + "27088876489294712611591174", + "29020786409257905308265864" + ], + "mAssetSupply": "62404016315419230923178602", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "2885221695883451798913024", + "outputIndex": 1, + "expectedQty": "2878010608072268961987880", + "swapFee": "1719514794131656403173", + "reserves": [ + "6429678943137157747567842", + "24210865881222443649603294", + "31906008105141357107178888" + ], + "mAssetSupply": "62405735830213362579581775", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "4008998407696849846665216", + "expectedQty": "4033833190769325105626418", + "swapFee": "2405399044618109907999", + "reserves": [ + "6429678943137157747567842", + "24210865881222443649603294", + "27872174914372032001552470" + ], + "mAssetSupply": "58399142821561130842824558" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "18185735826679187456", + "6719050007790546944", + "13090046356317310976" + ], + "expectedQty": "38362836160789226433", + "swapFee": "23031520608838839", + "reserves": [ + "6429660757401331068380386", + "24210859162172435859056350", + "27872161824325675684241494" + ], + "mAssetSupply": "58399104458724970053598125" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "6179037199049605251072", + "4398092669056118161408", + "706109955903843598336" + ], + "expectedQty": "11421474705307690980073", + "swapFee": "6856999022598173492", + "reserves": [ + "6423481720202281463129314", + "24206461069503379740894942", + "27871455714369771840643158" + ], + "mAssetSupply": "58387682984019662362618052" + }, + { + "type": "mintMulti", + "inputQtys": [ + "8645447682779317796864", + "851612525204570701299712", + "221240407461192490024960" + ], + "expectedQty": "1076302862128520042319756", + "reserves": [ + "6432127167885060780926178", + "25058073594707950442194654", + "28092696121830964330668118" + ], + "mAssetSupply": "59463985846148182404937808" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "38907616729738738925568", + "expectedQty": "39123454756428111294496", + "swapFee": "23344570037843243355", + "reserves": [ + "6432127167885060780926178", + "25058073594707950442194654", + "28053572667074536219373622" + ], + "mAssetSupply": "59425101573988481509255595" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "5200241132927378784256", + "expectedQty": "5058679904117277487208", + "swapFee": "3120144679756427270", + "reserves": [ + "6427068487980943503438970", + "25058073594707950442194654", + "28053572667074536219373622" + ], + "mAssetSupply": "59419904453000233886898609" + }, + { + "type": "redeemMasset", + "inputQty": "2177265647594078889574", + "expectedQtys": [ + "235430156473078883583", + "917903115292508307490", + "1027631340009742559434" + ], + "redemptionFee": "653179694278223666", + "reserves": [ + "6426833057824470424555387", + "25057155691592657933887164", + "28052545035734526476814188" + ], + "mAssetSupply": "59417727840532334086232701" + }, + { + "type": "redeemMasset", + "inputQty": "5085856883432850227", + "expectedQtys": [ + "549939362332470527", + "2144122322599196686", + "2400435578449111881" + ], + "redemptionFee": "1525757065029855", + "reserves": [ + "6426832507885108092084860", + "25057153547470335334690478", + "28052542635298948027702307" + ], + "mAssetSupply": "59417722756201207718412329" + }, + { + "type": "mintMulti", + "inputQtys": [ + "2779056873648056984141824", + "1133996778029548193185792", + "703681352991329398816768" + ], + "expectedQty": "4663336407797218028618062", + "reserves": [ + "9205889381533165076226684", + "26191150325499883527876270", + "28756223988290277426519075" + ], + "mAssetSupply": "64081059163998425747030391" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "178006065024951310614528", + "outputIndex": 1, + "expectedQty": "180935168661321174598788", + "swapFee": "108286020024405687261", + "reserves": [ + "9383895446558116386841212", + "26010215156838562353277482", + "28756223988290277426519075" + ], + "mAssetSupply": "64081167450018450152717652", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "615465821394081643757568", + "expectedQty": "613503139696209119075243", + "reserves": [ + "9383895446558116386841212", + "26625680978232643997035050", + "28756223988290277426519075" + ] + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "184219525430694", + "expectedQty": "183617363229059", + "reserves": [ + "9383895446558116386841212", + "26625680978416863522465744", + "28756223988290277426519075" + ] + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "1014257083616567293378560", + "outputIndex": 1, + "expectedQty": "1012610120884928231622247", + "swapFee": "606071099997626165440", + "reserves": [ + "9383895446558116386841212", + "25613070857531935290843497", + "29770481071906844719897635" + ], + "mAssetSupply": "64695276660998274261187394", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mintMulti", + "inputQtys": [ + "1529369407963827535872", + "3516717504977287774208", + "2000580177274794672128" + ], + "expectedQty": "7049030898115197767002", + "reserves": [ + "9385424815966080214377084", + "25616587575036912578617705", + "29772481652084119514569763" + ], + "mAssetSupply": "64702325691896389458954396" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "12284157891770758", + "expectedQty": "12312791533944743", + "swapFee": "7370494735062", + "reserves": [ + "9385424815966080214377084", + "25616587562724121044672962", + "29772481652084119514569763" + ], + "mAssetSupply": "64702325679619602061918700" + }, + { + "type": "mintMulti", + "inputQtys": [ + "2880079559877894044909568", + "2272389063445412472422400", + "1240153064943651502686208" + ], + "expectedQty": "6414273710832861970417153", + "reserves": [ + "12265504375843974259286652", + "27888976626169533517095362", + "31012634717027771017255971" + ], + "mAssetSupply": "71116599390452464032335853" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "515929501408632256", + "expectedQty": "516785201067933848", + "swapFee": "309557700845179", + "reserves": [ + "12265504375843974259286652", + "27888976109384332449161514", + "31012634717027771017255971" + ], + "mAssetSupply": "71116598874832520324548776" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "24236260321505862221824", + "124390088842344067497984", + "110650710655385515065344" + ], + "expectedQty": "258866485075364647005028", + "swapFee": "155413138928575933763", + "reserves": [ + "12241268115522468397064828", + "27764586020541988381663530", + "30901984006372385502190627" + ], + "mAssetSupply": "70857732389757155677543748" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "339185733232717274808320", + "expectedQty": "335897510023784754288332", + "swapFee": "203511439939630364884", + "reserves": [ + "11905370605498683642776496", + "27764586020541988381663530", + "30901984006372385502190627" + ], + "mAssetSupply": "70518750167964378033100312" + }, + { + "type": "redeemMasset", + "inputQty": "35277743634502558469324", + "expectedQtys": [ + "5953999648474155480919", + "13885358203799742126586", + "15454403563557801555635" + ], + "redemptionFee": "10583323090350767540", + "reserves": [ + "11899416605850209487295577", + "27750700662338188639536944", + "30886529602808827700634992" + ], + "mAssetSupply": "70483483007652965825398528" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "244238553230191385116672", + "outputIndex": 2, + "expectedQty": "244295199299358632178733", + "swapFee": "146194310161444698079", + "reserves": [ + "11899416605850209487295577", + "27994939215568380024653616", + "30642234403509469068456259" + ], + "mAssetSupply": "70483629201963127270096607", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mintMulti", + "inputQtys": [ + "332174625257409837268992", + "392604176769652143161344", + "1631558845744251586740224" + ], + "expectedQty": "2353232012063551793711989", + "reserves": [ + "12231591231107619324564569", + "28387543392338032167814960", + "32273793249253720655196483" + ], + "mAssetSupply": "72836861214026679063808596" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "51455570779679420841984", + "outputIndex": 0, + "expectedQty": "50760688835205944633353", + "swapFee": "30769213037892977257", + "reserves": [ + "12180830542272413379931216", + "28387543392338032167814960", + "32325248820033400076038467" + ], + "mAssetSupply": "72836891983239716956785853", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mintMulti", + "inputQtys": [ + "6220457540437084733440", + "6333305662950485262336", + "8340884106494028546048" + ], + "expectedQty": "20912151504370505709314", + "reserves": [ + "12187050999812850464664656", + "28393876698000982653077296", + "32333589704139894104584515" + ], + "mAssetSupply": "72857804134744087462495167" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "972054331493490748293120", + "464870541689227573198848", + "565531804222312557838336" + ], + "expectedQty": "2009442381761534135621196", + "swapFee": "1206389262614489174877", + "reserves": [ + "11214996668319359716371536", + "27929006156311755079878448", + "31768057899917581546746179" + ], + "mAssetSupply": "70848361752982553326873971" + }, + { + "type": "mintMulti", + "inputQtys": [ + "632163313413362578096128", + "517167014824664016879616", + "1058306940963136221478912" + ], + "expectedQty": "2209340799329554209203468", + "reserves": [ + "11847159981732722294467664", + "28446173171136419096758064", + "32826364840880717768225091" + ], + "mAssetSupply": "73057702552312107536077439" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "15573186356675866525696", + "30657495939193744916480", + "22563800136066145452032" + ], + "expectedQty": "68803509000002522078996", + "swapFee": "41306889533721746295", + "reserves": [ + "11831586795376046427941968", + "28415515675197225351841584", + "32803801040744651622773059" + ], + "mAssetSupply": "72988899043312105013998443" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "1267646221480755200", + "2617252259777466880", + "193681670129707872" + ], + "expectedQty": "4084972054005744976", + "swapFee": "2452454705226582", + "reserves": [ + "11831585527729824947186768", + "28415513057944965574374704", + "32803800847062981493065187" + ], + "mAssetSupply": "72988894958340051008253467" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "3477357742491014201868288", + "expectedQty": "3423852007515248633683084", + "swapFee": "2086414645494608521120", + "reserves": [ + "8407733520214576313503684", + "28415513057944965574374704", + "32803800847062981493065187" + ], + "mAssetSupply": "69513623630494531414906299" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "34903454752506388676608", + "3977286824956394471424", + "34461391608590050000896" + ], + "expectedQty": "73883896779861067065842", + "swapFee": "44356952239260196357", + "reserves": [ + "8372830065462069924827076", + "28411535771120009179903280", + "32769339455454391443064291" + ], + "mAssetSupply": "69439739733714670347840457" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "124820391769882066944", + "outputIndex": 0, + "expectedQty": "121634970765143286114", + "swapFee": "74589840060038959", + "reserves": [ + "8372708430491304781540962", + "28411660591511779061970224", + "32769339455454391443064291" + ], + "mAssetSupply": "69439739808304510407879416", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "3352942357214542310670336", + "outputIndex": 0, + "expectedQty": "3206593223254358341853500", + "swapFee": "1999956613367249426154", + "reserves": [ + "5166115207236946439687462", + "28411660591511779061970224", + "36122281812668933753734627" + ], + "mAssetSupply": "69441739764917877657305570", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "5335805408445280026624", + "outputIndex": 2, + "expectedQty": "5350445259043356103211", + "swapFee": "3178539680284932469", + "reserves": [ + "5166115207236946439687462", + "28416996396920224341996848", + "36116931367409890397631416" + ], + "mAssetSupply": "69441742943457557942238039", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "90289811371086751727616", + "outputIndex": 2, + "expectedQty": "96789612382677180494705", + "swapFee": "57511677598631003041", + "reserves": [ + "5256405018608033191415078", + "28416996396920224341996848", + "36020141755027213217136711" + ], + "mAssetSupply": "69441800455135156573241080", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "944442310117774965342208", + "expectedQty": "992898641524176019676240", + "reserves": [ + "6200847328725808156757286", + "28416996396920224341996848", + "36020141755027213217136711" + ] + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "7043814995307677576331264", + "expectedQty": "7187227156337822633380089", + "reserves": [ + "13244662324033485733088550", + "28416996396920224341996848", + "36020141755027213217136711" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "2395551209035303000997888", + "1006038304941258234134528", + "615019861746849742323712" + ], + "expectedQty": "4032022328563376583842197", + "reserves": [ + "15640213533068788734086438", + "29423034701861482576131376", + "36635161616774062959460423" + ], + "mAssetSupply": "81653948581560531810139606" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "13514112157796102458834944", + "outputIndex": 1, + "expectedQty": "13412991242931222244615612", + "swapFee": "8074772008894247037454", + "reserves": [ + "15640213533068788734086438", + "16010043458930260331515764", + "50149273774570165418295367" + ], + "mAssetSupply": "81662023353569426057177060", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mintMulti", + "inputQtys": [ + "738181709508351444910080", + "343279772878573527891968", + "555069739586251026071552" + ], + "expectedQty": "1640641683657523712100550", + "reserves": [ + "16378395242577140178996518", + "16353323231808833859407732", + "50704343514156416444366919" + ], + "mAssetSupply": "83302665037226949769277610" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "557703711299093720465408", + "expectedQty": "553075192022611607512227", + "swapFee": "334622226779456232279", + "reserves": [ + "15825320050554528571484291", + "16353323231808833859407732", + "50704343514156416444366919" + ], + "mAssetSupply": "82745295948154635505044481" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "118409316866206545739776", + "expectedQty": "119274244429181522168194", + "reserves": [ + "15825320050554528571484291", + "16471732548675040405147508", + "50704343514156416444366919" + ] + }, + { + "type": "redeemMasset", + "inputQty": "82257911864988736", + "expectedQtys": [ + "15704748743578671", + "16346236298665175", + "50318032908915897" + ], + "redemptionFee": "24677373559496", + "reserves": [ + "15825320034849779827905620", + "16471732532328804106482333", + "50704343463838383535451022" + ], + "mAssetSupply": "82864570110350582535783435" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "1898014826619215129083904", + "outputIndex": 0, + "expectedQty": "1890135135061933427458578", + "swapFee": "1145901775877580737271", + "reserves": [ + "13935184899787846400447042", + "18369747358948019235566237", + "50704343463838383535451022" + ], + "mAssetSupply": "82865716012126460116520706", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "17662386663701939748864", + "expectedQty": "17563727582025117184267", + "swapFee": "10597431998221163849", + "reserves": [ + "13935184899787846400447042", + "18352183631365994118381970", + "50704343463838383535451022" + ], + "mAssetSupply": "82848064222894756397935691" + }, + { + "type": "redeemMasset", + "inputQty": "7064084733914893831372", + "expectedQtys": [ + "1187834574529540188973", + "1564339360562305683952", + "4322036103452425223873" + ], + "redemptionFee": "2119225420174468149", + "reserves": [ + "13933997065213316860258069", + "18350619292005431812698018", + "50700021427734931110227149" + ], + "mAssetSupply": "82841002257386261678572468" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "305176568810645519073280", + "outputIndex": 0, + "expectedQty": "302933393339449000366328", + "swapFee": "184000939205956521252", + "reserves": [ + "13631063671873867859891741", + "18655795860816077331771298", + "50700021427734931110227149" + ], + "mAssetSupply": "82841186258325467635093720", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemBassets", + "inputQtys": [ + "247946369799647983042560", + "189529107731455265472512", + "33013816412590057717760" + ], + "expectedQty": "474165952836930963636089", + "swapFee": "284670373926514486873", + "reserves": [ + "13383117302074219876849181", + "18466266753084622066298786", + "50667007611322341052509389" + ], + "mAssetSupply": "82367020305488536671457631" + }, + { + "type": "redeemMasset", + "inputQty": "775393056135927220404224", + "expectedQtys": [ + "125949233493420583981507", + "173787025140665258663260", + "476829921460996636002832" + ], + "redemptionFee": "232617916840778166121", + "reserves": [ + "13257168068580799292867674", + "18292479727943956807635526", + "50190177689861344416506557" + ], + "mAssetSupply": "81591859867269450229219528" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "33866884862066344", + "11121281346641884", + "5787400885091878" + ], + "expectedQty": "51205344265902241", + "swapFee": "30741651550471", + "reserves": [ + "13257168034713914430801330", + "18292479716822675460993642", + "50190177684073943531414679" + ], + "mAssetSupply": "81591859816064105963317287" + }, + { + "type": "redeemMasset", + "inputQty": "528395408333972025481625", + "expectedQtys": [ + "85828723904892067456802", + "118428022262364889024793", + "324938093256718516112938" + ], + "redemptionFee": "158518622500191607644", + "reserves": [ + "13171339310809022363344528", + "18174051694560310571968849", + "49865239590817225015301741" + ], + "mAssetSupply": "81063622926352634129443306" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "11475219472897649147904", + "24737171735051138760704", + "33875672256560920264704" + ], + "expectedQty": "70079474846277536539171", + "swapFee": "42072928664965501224", + "reserves": [ + "13159864091336124714196624", + "18149314522825259433208145", + "49831363918560664095037037" + ], + "mAssetSupply": "80993543451506356592904135" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "814443739919501297188864", + "343641313778774937960448", + "731076331249553282957312" + ], + "expectedQty": "1895564355654208496919268", + "swapFee": "1138021426248274062589", + "reserves": [ + "12345420351416623417007760", + "17805673209046484495247697", + "49100287587311110812079725" + ], + "mAssetSupply": "79097979095852148095984867" + }, + { + "type": "mintMulti", + "inputQtys": [ + "3719107467174684", + "13368947607791706", + "70147055352707232" + ], + "expectedQty": "86764595417552460", + "reserves": [ + "12345420355135730884182444", + "17805673222415432103039403", + "49100287657458166164786957" + ], + "mAssetSupply": "79097979182616743513537327" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "19158915263301190418432", + "outputIndex": 0, + "expectedQty": "18974487416487870279164", + "swapFee": "11550276157791545703", + "reserves": [ + "12326445867719243013903280", + "17824832137678733293457835", + "49100287657458166164786957" + ], + "mAssetSupply": "79097990732892901305083030", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "42045553609371254784", + "expectedQty": "42374679201643595956", + "swapFee": "25227332165622752", + "reserves": [ + "12326445867719243013903280", + "17824832137678733293457835", + "49100245282778964521191001" + ], + "mAssetSupply": "79097948712566624099450998" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "72838741930157755334656", + "7797680031838487183360", + "29610887051898234339328" + ], + "expectedQty": "111059063415523119016751", + "swapFee": "66675443315303053241", + "reserves": [ + "12253607125789085258568624", + "17817034457646894806274475", + "49070634395727066286851673" + ], + "mAssetSupply": "78986889649151100980434247" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "84102327484836277649408", + "outputIndex": 2, + "expectedQty": "85160176055601008560712", + "swapFee": "50699181961892390341", + "reserves": [ + "12253607125789085258568624", + "17901136785131731083923883", + "48985474219671465278290961" + ], + "mAssetSupply": "78986940348333062872824588", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemMasset", + "inputQty": "5438458908180429668352", + "expectedQtys": [ + "843440020782468829432", + "1232170660205415783626", + "3371767102514981279337" + ], + "redemptionFee": "1631537672454128900", + "reserves": [ + "12252763685768302789739192", + "17899904614471525668140257", + "48982102452568950297011624" + ], + "mAssetSupply": "78981503520962554897285136" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "5242639429059969361641472", + "expectedQty": "5280198852614108567007955", + "swapFee": "3145583657435981616984", + "reserves": [ + "12252763685768302789739192", + "17899904614471525668140257", + "43701903599954841730003669" + ], + "mAssetSupply": "73742009675560021517260648" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "2699665275355437184581632", + "expectedQty": "2658738907313588201592765", + "swapFee": "1619799165213262310748", + "reserves": [ + "9594024778454714588146427", + "17899904614471525668140257", + "43701903599954841730003669" + ], + "mAssetSupply": "71043964199369797594989764" + }, + { + "type": "mintMulti", + "inputQtys": [ + "25160839248896036175872", + "42132182417993667444736", + "23276272809952325664768" + ], + "expectedQty": "90956281917164061458591", + "reserves": [ + "9619185617703610624322299", + "17942036796889519335584993", + "43725179872764794055668437" + ], + "mAssetSupply": "71134920481286961656448355" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "60698375865917644800", + "96206521086900977664", + "4539756499438866432" + ], + "expectedQty": "162811830846596950950", + "swapFee": "97745745955531489", + "reserves": [ + "9619124919327744706677499", + "17941940590368432434607329", + "43725175333008294616802005" + ], + "mAssetSupply": "71134757669456115059497405" + }, + { + "type": "redeemMasset", + "inputQty": "1636615432443092638105", + "expectedQtys": [ + "221243256639931777717", + "412670944596768205402", + "1005694412845077382611" + ], + "redemptionFee": "490984629732927791", + "reserves": [ + "9618903676071104774899782", + "17941527919423835666401927", + "43724169638595449539419394" + ], + "mAssetSupply": "71133121545008301699787091" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "7815236145704128512", + "expectedQty": "7664036536361643139", + "swapFee": "4689141687422477", + "reserves": [ + "9618896012034568413256643", + "17941527919423835666401927", + "43724169638595449539419394" + ], + "mAssetSupply": "71133113734461297683081056" + }, + { + "type": "mintMulti", + "inputQtys": [ + "323800427914691342237696", + "568787923876374938386432", + "918512031642107982643200" + ], + "expectedQty": "1810699423439364605946441", + "reserves": [ + "9942696439949259755494339", + "18510315843300210604788359", + "44642681670237557522062594" + ], + "mAssetSupply": "72943813157900662289027497" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "637903494656524323651584", + "outputIndex": 2, + "expectedQty": "653928602707090548995285", + "swapFee": "389437956647937033352", + "reserves": [ + "10580599934605784079145923", + "18510315843300210604788359", + "43988753067530466973067309" + ], + "mAssetSupply": "72944202595857310226060849", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "23565822044468888469504", + "expectedQty": "23378385291156988622559", + "reserves": [ + "10580599934605784079145923", + "18510315843300210604788359", + "44012318889574935861536813" + ] + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "490233338213545541632", + "outputIndex": 1, + "expectedQty": "496529855676509989947", + "swapFee": "298833123786956421", + "reserves": [ + "10581090167943997624687555", + "18509819313444534094798412", + "44012318889574935861536813" + ], + "mAssetSupply": "72967581279981591001639829", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "713491450723821158400", + "outputIndex": 1, + "expectedQty": "722653551173357056951", + "swapFee": "434924408552166930", + "reserves": [ + "10581803659394721445845955", + "18509096659893360737741461", + "44012318889574935861536813" + ], + "mAssetSupply": "72967581714905999553806759", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemMasset", + "inputQty": "79380831686034519490560", + "expectedQtys": [ + "11508403564606087977857", + "20129853173871831030093", + "47866275343870487349742" + ], + "redemptionFee": "23814249505810355847", + "reserves": [ + "10570295255830115357868098", + "18488966806719488906711368", + "43964452614231065374187071" + ], + "mAssetSupply": "72888224697469470844672046" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "2019209525010900969324544", + "outputIndex": 2, + "expectedQty": "2036454253375821155903407", + "swapFee": "1213707650148460877310", + "reserves": [ + "10570295255830115357868098", + "20508176331730389876035912", + "41927998360855244218283664" + ], + "mAssetSupply": "72889438405119619305549356", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "57658480212943281586176", + "outputIndex": 2, + "expectedQty": "58909104076814113753065", + "swapFee": "35119489075427237869", + "reserves": [ + "10627953736043058639454274", + "20508176331730389876035912", + "41869089256778430104530599" + ], + "mAssetSupply": "72889473524608694732787225", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemBassets", + "inputQtys": [ + "1613357832864539441364992", + "893678419773414761824256", + "1616668132570897768775680" + ], + "expectedQty": "4139909886522632385502778", + "swapFee": "2485437194230117501802", + "reserves": [ + "9014595903178519198089282", + "19614497911956975114211656", + "40252421124207532335754919" + ], + "mAssetSupply": "68749563638086062347284447" + }, + { + "type": "redeemMasset", + "inputQty": "318297837058442727836876", + "expectedQtys": [ + "41723400531304032016713", + "90784274901601293234575", + "186305399261198043067515" + ], + "redemptionFee": "95489351117532818351", + "reserves": [ + "8972872502647215166072569", + "19523713637055373820977081", + "40066115724946334292687404" + ], + "mAssetSupply": "68431361290378737152265922" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "1926673780404503200137216", + "expectedQty": "1957330205270166320504486", + "reserves": [ + "10899546283051718366209785", + "19523713637055373820977081", + "40066115724946334292687404" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "500969420338851651518464", + "552617860109493214380032", + "356472045933389510868992" + ], + "expectedQty": "1414614728533531053327241", + "reserves": [ + "11400515703390570017728249", + "20076331497164867035357113", + "40422587770879723803556396" + ], + "mAssetSupply": "71803306224182434526097649" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "330804835473212991078400", + "489892579206585628229632", + "359746927901466414809088" + ], + "expectedQty": "1182742084717785608009257", + "swapFee": "710071293606835466085", + "reserves": [ + "11069710867917357026649849", + "19586438917958281407127481", + "40062840842978257388747308" + ], + "mAssetSupply": "70620564139464648918088392" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "351382881649353627271168", + "expectedQty": "350747048154135518969119", + "swapFee": "210829728989612176362", + "reserves": [ + "11069710867917357026649849", + "19235691869804145888158362", + "40062840842978257388747308" + ], + "mAssetSupply": "70269392087544284902993586" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "6331510061994938990592", + "expectedQty": "6249981858132357023649", + "swapFee": "3798906037196963394", + "reserves": [ + "11063460886059224669626200", + "19235691869804145888158362", + "40062840842978257388747308" + ], + "mAssetSupply": "70263064376388327160966388" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "69309782969944200", + "expectedQty": "69400302219053242", + "reserves": [ + "11063460886059224669626200", + "19235691939113928858102562", + "40062840842978257388747308" + ] + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "26730760608225431650304", + "expectedQty": "26556044595930825144011", + "reserves": [ + "11063460886059224669626200", + "19235691939113928858102562", + "40089571603586482820397612" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "6426058537456215523328", + "5403884929415504723968", + "33728021441965119766528" + ], + "expectedQty": "45424584900725942027473", + "swapFee": "27271113608600725651", + "reserves": [ + "11057034827521768454102872", + "19230288054184513353378594", + "40055843582144517700631084" + ], + "mAssetSupply": "70244195905483834263136168" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "7174500596572", + "5007912039490", + "4593974351543" + ], + "expectedQty": "16842258031776", + "swapFee": "10111421672", + "reserves": [ + "11057034827514593953506300", + "19230288054179505441339104", + "40055843582139923726279541" + ], + "mAssetSupply": "70244195905466992005104392" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "1505022769876713596780544", + "expectedQty": "1521318996836585020959381", + "reserves": [ + "12562057597391307550286844", + "19230288054179505441339104", + "40055843582139923726279541" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "13556605815893866315776", + "27736319496633922355200", + "10539140062133474033664" + ], + "expectedQty": "51944976567213183208259", + "reserves": [ + "12575614203207201416602620", + "19258024373676139363694304", + "40066382722202057200313205" + ], + "mAssetSupply": "71817459878870790209272032" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "2842194881256081063936", + "expectedQty": "2847002969103878369263", + "reserves": [ + "12575614203207201416602620", + "19260866568557395444758240", + "40066382722202057200313205" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "4820874599760848224256", + "106394499875961799966720", + "207973734557137762254848" + ], + "expectedQty": "318201378426510040327297", + "reserves": [ + "12580435077806962264826876", + "19367261068433357244724960", + "40274356456759194962568053" + ], + "mAssetSupply": "72138508260266404127968592" + }, + { + "type": "redeemMasset", + "inputQty": "221788733438657770291", + "expectedQtys": [ + "38666750528328196640", + "59526482790026007065", + "123785742239523446060" + ], + "redemptionFee": "66536620031597331", + "reserves": [ + "12580396411056433936630236", + "19367201541950567218717895", + "40274232671016955439121993" + ], + "mAssetSupply": "72138286538069585501795632" + }, + { + "type": "redeemMasset", + "inputQty": "644156733976355081394585", + "expectedQtys": [ + "112302583398336977867225", + "172886981879664029925743", + "359519702365332750769636" + ], + "redemptionFee": "193247020192906524418", + "reserves": [ + "12468093827658096958763011", + "19194314560070903188792152", + "39914712968651622688352357" + ], + "mAssetSupply": "71494323051113423326925465" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "256388487560628895744", + "expectedQty": "254891125705540681409", + "reserves": [ + "12468093827658096958763011", + "19194314560070903188792152", + "39914969357139183317248101" + ] + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "1313461609768908800", + "expectedQty": "1305790684925341346", + "reserves": [ + "12468093827658096958763011", + "19194314560070903188792152", + "39914970670600793086156901" + ] + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "764150187948874530816", + "expectedQty": "762416137444821393155", + "swapFee": "458490112769324718", + "reserves": [ + "12468093827658096958763011", + "19193552143933458367398997", + "39914970670600793086156901" + ], + "mAssetSupply": "71493815556331977687742122" + }, + { + "type": "redeemMasset", + "inputQty": "35333494316389400576", + "expectedQtys": [ + "6160101493702454659", + "9482943492855361525", + "19720758750116152978" + ], + "redemptionFee": "10600048294916820", + "reserves": [ + "12468087667556603256308352", + "19193542660989965512037472", + "39914950949842042970003923" + ], + "mAssetSupply": "71493780233437709593258366" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "6906871698432572416", + "outputIndex": 1, + "expectedQty": "6850949638703781411", + "swapFee": "4119919783620420", + "reserves": [ + "12468087667556603256308352", + "19193535810040326808256061", + "39914957856713741402576339" + ], + "mAssetSupply": "71493780237557629376878786", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "493661510717465231360", + "expectedQty": "488731771518591597345", + "swapFee": "296196906430479138", + "reserves": [ + "12467598935785084664711007", + "19193535810040326808256061", + "39914957856713741402576339" + ], + "mAssetSupply": "71493286872243818342126564" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "1500839836550124066045952", + "expectedQty": "1508501295497951969402436", + "swapFee": "900503901930074439627", + "reserves": [ + "12467598935785084664711007", + "19193535810040326808256061", + "38406456561215789433173903" + ], + "mAssetSupply": "69993347539595624350520239" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "42319864877678810103808", + "outputIndex": 0, + "expectedQty": "41689604955144767434032", + "swapFee": "25251854819191868748", + "reserves": [ + "12425909330829939897276975", + "19193535810040326808256061", + "38448776426093468243277711" + ], + "mAssetSupply": "69993372791450443542388987", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemBassets", + "inputQtys": [ + "16468590930513821696", + "68790756365821894656", + "69590907995803492352" + ], + "expectedQty": "154708610515876080925", + "swapFee": "92880894846433508", + "reserves": [ + "12425892862239009383455279", + "19193467019283960986361405", + "38448706835185472439785359" + ], + "mAssetSupply": "69993218082839927666308062" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "2062197885228020924416", + "expectedQty": "2050777973963977939260", + "reserves": [ + "12425892862239009383455279", + "19193467019283960986361405", + "38450769033070700460709775" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "37700723636175770746880", + "406826622083225717047296", + "969918132549245340745728" + ], + "expectedQty": "1410040307975407194449151", + "swapFee": "846532104047672920421", + "reserves": [ + "12388192138602833612708399", + "18786640397200735269314109", + "37480850900521455119964047" + ], + "mAssetSupply": "68585228552838484449798171" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "8942233879776252133376", + "expectedQty": "8924077193562050516037", + "swapFee": "5365340327865751280", + "reserves": [ + "12388192138602833612708399", + "18777716320007173218798072", + "37480850900521455119964047" + ], + "mAssetSupply": "68576291684299036063416075" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "625834546336549830656", + "expectedQty": "624562283831033964781", + "swapFee": "375500727801929898", + "reserves": [ + "12388192138602833612708399", + "18777091757723342184833291", + "37480850900521455119964047" + ], + "mAssetSupply": "68575666225253427315515317" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "65428911400881627136", + "expectedQty": "65986050467432625711", + "reserves": [ + "12388257567514234494335535", + "18777091757723342184833291", + "37480850900521455119964047" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "8968876551988137951232", + "15362418818554391429120", + "13994784103602057117696" + ], + "expectedQty": "38348767884099356926420", + "swapFee": "23023074575204736998", + "reserves": [ + "12379288690962246356384303", + "18761729338904787793404171", + "37466856116417853062846351" + ], + "mAssetSupply": "68537383443419795391214608" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "26696202969541181964288", + "expectedQty": "26454242926617359494248", + "swapFee": "16017721781724709178", + "reserves": [ + "12352834448035628996890055", + "18761729338904787793404171", + "37466856116417853062846351" + ], + "mAssetSupply": "68510703258172035933959498" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "123106937776145942183936", + "outputIndex": 0, + "expectedQty": "122143846672332201629926", + "swapFee": "73967633029403916933", + "reserves": [ + "12230690601363296795260129", + "18884836276680933735588107", + "37466856116417853062846351" + ], + "mAssetSupply": "68510777225805065337876431", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mintMulti", + "inputQtys": [ + "55453990413011927040", + "16814831298995148800", + "77449102831607578624" + ], + "expectedQty": "149805385836243263520", + "reserves": [ + "12230746055353709807187169", + "18884853091512232730736907", + "37466933565520684670424975" + ], + "mAssetSupply": "68510927031190901581139951" + }, + { + "type": "redeemMasset", + "inputQty": "50264248383896092672", + "expectedQtys": [ + "8970610288042968664", + "13851048551265211075", + "27480029278930386904" + ], + "redemptionFee": "15079274515168827", + "reserves": [ + "12230737084743421764218505", + "18884839240463681465525832", + "37466906085491405740038071" + ], + "mAssetSupply": "68510876782021792200216106" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "92923433670794052370432", + "266548594811933118431232", + "306288887495873376813056" + ], + "expectedQty": "665267081332218528737523", + "swapFee": "399399888732570659638", + "reserves": [ + "12137813651072627711848073", + "18618290645651748347094600", + "37160617197995532363225015" + ], + "mAssetSupply": "67845609700689573671478583" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "747191744474723785900032", + "expectedQty": "743040523540745251646629", + "reserves": [ + "12137813651072627711848073", + "18618290645651748347094600", + "37907808942470256149125047" + ] + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "884577714206795251056640", + "expectedQty": "879501332086986372482948", + "reserves": [ + "12137813651072627711848073", + "18618290645651748347094600", + "38792386656677051400181687" + ] + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "18113665046060076105728", + "outputIndex": 1, + "expectedQty": "18242160720425333195109", + "swapFee": "10970571239035838437", + "reserves": [ + "12155927316118687787953801", + "18600048484931323013899491", + "38792386656677051400181687" + ], + "mAssetSupply": "69468162526888544331446597", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "33583386122469567889408", + "expectedQty": "33898046952879122665807", + "reserves": [ + "12189510702241157355843209", + "18600048484931323013899491", + "38792386656677051400181687" + ] + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "792748520473633384038400", + "expectedQty": "793943055821434715814478", + "reserves": [ + "12189510702241157355843209", + "19392797005404956397937891", + "38792386656677051400181687" + ] + }, + { + "type": "redeemMasset", + "inputQty": "1575251964205578527440896", + "expectedQtys": [ + "273070860647152332368214", + "434439732486374707633354", + "869031634628966200480945" + ], + "redemptionFee": "472575589261673558232", + "reserves": [ + "11916439841594005023474995", + "18958357272918581690304537", + "37923355022048085199700742" + ], + "mAssetSupply": "68721224241046541316044218" + }, + { + "type": "redeemMasset", + "inputQty": "617172733683092160512", + "expectedQtys": [ + "106987258790558432015", + "170210457381899524401", + "340480533773865347810" + ], + "redemptionFee": "185151820104927648", + "reserves": [ + "11916332854335214465042980", + "18958187062461199790780136", + "37923014541514311334352932" + ], + "mAssetSupply": "68720607253464678328811354" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "453646595690920345600", + "1547287434939941257216", + "1027770055350469525504" + ], + "expectedQty": "3029209169059292708933", + "swapFee": "1818616671438438688", + "reserves": [ + "11915879207739523544697380", + "18956639775026259849522920", + "37921986771458960864827428" + ], + "mAssetSupply": "68717578044295619036102421" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "397585853587048091353088", + "expectedQty": "393449241341510044626276", + "swapFee": "238551512152228854811", + "reserves": [ + "11522429966398013500071104", + "18956639775026259849522920", + "37921986771458960864827428" + ], + "mAssetSupply": "68320230742220723173604144" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "244832529531766145024", + "expectedQty": "247350599064928370204", + "reserves": [ + "11522674798927545266216128", + "18956639775026259849522920", + "37921986771458960864827428" + ] + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "2245176319040428640829440", + "outputIndex": 1, + "expectedQty": "2224970808544941030595435", + "swapFee": "1338871291834480073506", + "reserves": [ + "11522674798927545266216128", + "16731668966481318818927485", + "40167163090499389505656868" + ], + "mAssetSupply": "68321816964111622582047854", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "165833112859675279228928", + "expectedQty": "164691074512902446892153", + "reserves": [ + "11522674798927545266216128", + "16731668966481318818927485", + "40332996203359064784885796" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "688098888900139810816", + "5280336526467960668160", + "3119966504908546375680" + ], + "expectedQty": "9090870815792689225611", + "swapFee": "5457797167776279302", + "reserves": [ + "11521986700038645126405312", + "16726388629954850858259325", + "40329876236854156238510116" + ], + "mAssetSupply": "68477417167808732339714396" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "572653331396829184000", + "expectedQty": "576290965244066089096", + "swapFee": "343591998838097510", + "reserves": [ + "11521986700038645126405312", + "16726388629954850858259325", + "40329299945888912172421020" + ], + "mAssetSupply": "68476844858069334348627906" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "60437025334194659328", + "5757996554660899840", + "43187905269983576064" + ], + "expectedQty": "109760279591466765693", + "swapFee": "65895705177986851", + "reserves": [ + "11521926263013310931745984", + "16726382871958296197359485", + "40329256757983642188844956" + ], + "mAssetSupply": "68476735097789742881862213" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "159070048631198930960384", + "124326114553587004604416", + "81133662076020084178944" + ], + "expectedQty": "366109994779984178211469", + "swapFee": "219797875593346514835", + "reserves": [ + "11362856214382112000785600", + "16602056757404709192755069", + "40248123095907622104666012" + ], + "mAssetSupply": "68110625103009758703650744" + }, + { + "type": "mintMulti", + "inputQtys": [ + "784461621891037428449280", + "205420210760534135406592", + "1348824010272828198748160" + ], + "expectedQty": "2338414868379954521053632", + "reserves": [ + "12147317836273149429234880", + "16807476968165243328161661", + "41596947106180450303414172" + ], + "mAssetSupply": "70449039971389713224704376" + }, + { + "type": "redeemMasset", + "inputQty": "113843612791802147582771", + "expectedQtys": [ + "19623825681778092227594", + "27152248967165188066737", + "67199298635975310924752" + ], + "redemptionFee": "34153083837540644274", + "reserves": [ + "12127694010591371337007286", + "16780324719198078140094924", + "41529747807544474992489420" + ], + "mAssetSupply": "70335230511681748617765879" + }, + { + "type": "mintMulti", + "inputQtys": [ + "363764604322788138811392", + "313626097450244787666944", + "234451871468740033904640" + ], + "expectedQty": "914979653829887916211474", + "reserves": [ + "12491458614914159475818678", + "17093950816648322927761868", + "41764199679013215026394060" + ], + "mAssetSupply": "71250210165511636533977353" + }, + { + "type": "mintMulti", + "inputQtys": [ + "12199193250386791104512", + "22521395140169390096384", + "11566138757107027017728" + ], + "expectedQty": "46405317156086891331192", + "reserves": [ + "12503657808164546266923190", + "17116472211788492317858252", + "41775765817770322053411788" + ], + "mAssetSupply": "71296615482667723425308545" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "10921853545894528417792", + "12920702012097248100352", + "17886338856297011609600" + ], + "expectedQty": "41759784140835568392689", + "swapFee": "25070913032320733475", + "reserves": [ + "12492735954618651738505398", + "17103551509776395069757900", + "41757879478914025041802188" + ], + "mAssetSupply": "71254855698526887856915856" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "240895635295312674816", + "759489062804026818560", + "508579784491090116608" + ], + "expectedQty": "1510506929276618920876", + "swapFee": "906848266525886884", + "reserves": [ + "12492495058983356425830582", + "17102792020713591042939340", + "41757370899129533951685580" + ], + "mAssetSupply": "71253345191597611237994980" + }, + { + "type": "mintMulti", + "inputQtys": [ + "1000432645485772983500800", + "1029330000214898688131072", + "181571163566271782453248" + ], + "expectedQty": "2222505993302622806784546", + "reserves": [ + "13492927704469129409331382", + "18132122020928489731070412", + "41938942062695805734138828" + ], + "mAssetSupply": "73475851184900234044779526" + }, + { + "type": "redeemMasset", + "inputQty": "41646870407103948573900", + "expectedQtys": [ + "7645636232825834633000", + "10274390565015217317626", + "23764293563562546583961" + ], + "redemptionFee": "12494061122131184572", + "reserves": [ + "13485282068236303574698382", + "18121847630363474513752786", + "41915177769132243187554867" + ], + "mAssetSupply": "73434216808554252227390198" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "1223544117592819008274432", + "expectedQty": "1218696742861330559150566", + "swapFee": "734126470555691404964", + "reserves": [ + "13485282068236303574698382", + "16903150887502143954602220", + "41915177769132243187554867" + ], + "mAssetSupply": "72211406817431988910520730" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "34475660425919193088", + "expectedQty": "34256056009901392645", + "reserves": [ + "13485282068236303574698382", + "16903150887502143954602220", + "41915212244792669106747955" + ] + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "1905133139682885785092096", + "expectedQty": "1915779429066560849335408", + "swapFee": "1143079883809731471055", + "reserves": [ + "13485282068236303574698382", + "16903150887502143954602220", + "39999432815726108257412547" + ], + "mAssetSupply": "70307451013688922758292334" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "161343641697572978688", + "expectedQty": "162210162973195279456", + "swapFee": "96806185018543787", + "reserves": [ + "13485282068236303574698382", + "16903150887502143954602220", + "39999270605563135062133091" + ], + "mAssetSupply": "70307289766853410203857433" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "181364340271733270380544", + "expectedQty": "180283586652487009636551", + "reserves": [ + "13485282068236303574698382", + "16903150887502143954602220", + "40180634945834868332513635" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "22881126041899094769664", + "9316036642840357371904", + "31769724011433397583872" + ], + "expectedQty": "63980286940518045545652", + "reserves": [ + "13508163194278202669468046", + "16912466924144984311974124", + "40212404669846301730097507" + ], + "mAssetSupply": "70551553640446415259039636" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "1691688437013807003336704", + "expectedQty": "1683790785159575769583431", + "swapFee": "1015013062208284202002", + "reserves": [ + "13508163194278202669468046", + "15228676138985408542390693", + "40212404669846301730097507" + ], + "mAssetSupply": "68860880216494816539904934" + }, + { + "type": "redeemMasset", + "inputQty": "13702773643652182206054", + "expectedQtys": [ + "2687211842488254295162", + "3029477677870663535140", + "7999551714737409692737" + ], + "redemptionFee": "4110832093095654661", + "reserves": [ + "13505475982435714415172884", + "15225646661307537878855553", + "40204405118131564320404770" + ], + "mAssetSupply": "68847181553683257453353541" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "26011593509789505683456", + "expectedQty": "25870662207696478071558", + "swapFee": "15606956105873703410", + "reserves": [ + "13505475982435714415172884", + "15199775999099841400783995", + "40204405118131564320404770" + ], + "mAssetSupply": "68821185567129573821373495" + }, + { + "type": "redeemMasset", + "inputQty": "120794470746679296", + "expectedQtys": [ + "23697606979502791", + "26670538548333755", + "70545324916594615" + ], + "redemptionFee": "36238341224003", + "reserves": [ + "13505475958738107435670093", + "15199775972429302852450240", + "40204405047586239403810155" + ], + "mAssetSupply": "68821185446371341415918202" + }, + { + "type": "mintMulti", + "inputQtys": [ + "39518886153324929024", + "150979698180553539584", + "238549579441401298944" + ], + "expectedQty": "428528730163551789507", + "reserves": [ + "13505515477624260760599117", + "15199926952127483405989824", + "40204643597165680805109099" + ], + "mAssetSupply": "68821613975101504967707709" + }, + { + "type": "mintMulti", + "inputQtys": [ + "8867876322563584950272", + "9136436131874855714816", + "20234679212408452415488" + ], + "expectedQty": "38216452967367443328305", + "reserves": [ + "13514383353946824345549389", + "15209063388259358261704640", + "40224878276378089257524587" + ], + "mAssetSupply": "68859830428068872411036014" + }, + { + "type": "redeemMasset", + "inputQty": "685449437840368100966", + "expectedQtys": [ + "134485481407828252622", + "151349725545182534189", + "400289230954080402720" + ], + "redemptionFee": "205634831352110430", + "reserves": [ + "13514248868465416517296767", + "15208912038533813079170451", + "40224477987147135177121867" + ], + "mAssetSupply": "68859145184265863395045478" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "25703842465181604", + "22406696534868668", + "18386694101160740" + ], + "expectedQty": "66671085211325679", + "swapFee": "40026667127071", + "reserves": [ + "13514248842761574052115163", + "15208912016127116544301783", + "40224477968760441075961127" + ], + "mAssetSupply": "68859145117594778183719799" + }, + { + "type": "mintMulti", + "inputQtys": [ + "24789125544491966464", + "76917144783389294592", + "94560305624019386368" + ], + "expectedQty": "196208641411765036467", + "reserves": [ + "13514273631887118544081627", + "15208988933271899933596375", + "40224572529066065095347495" + ], + "mAssetSupply": "68859341326236189948756266" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "67644697153711554691072", + "180157312948676893605888", + "41915494835084691767296" + ], + "expectedQty": "290818541839474990382890", + "swapFee": "174595882633264953201", + "reserves": [ + "13446628934733406989390555", + "15028831620323223039990487", + "40182657034230980403580199" + ], + "mAssetSupply": "68568522784396714958373376" + }, + { + "type": "redeemMasset", + "inputQty": "1111040817821333743206", + "expectedQtys": [ + "217815275523221162659", + "243444592400191921852", + "650898939477550701833" + ], + "redemptionFee": "333312245346400122", + "reserves": [ + "13446411119457883768227896", + "15028588175730822848068635", + "40182006135291502852878366" + ], + "mAssetSupply": "68567412076891138971030292" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "1228289277625786764886016", + "expectedQty": "1220120311615004725450379", + "reserves": [ + "13446411119457883768227896", + "15028588175730822848068635", + "41410295412917289617764382" + ] + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "57782656945247706152960", + "expectedQty": "58092474062335246992209", + "reserves": [ + "13446411119457883768227896", + "15086370832676070554221595", + "41410295412917289617764382" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "2755547515517364862976", + "3148449630939751383040", + "2955367180850717786112" + ], + "expectedQty": "8877199362268757151463", + "reserves": [ + "13449166666973401133090872", + "15089519282307010305604635", + "41413250780098140335550494" + ], + "mAssetSupply": "69854502061930747700624343" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "1661423635460846256128", + "expectedQty": "1671761135077372727657", + "swapFee": "996854181276507753", + "reserves": [ + "13449166666973401133090872", + "15089519282307010305604635", + "41411579018963062962822837" + ], + "mAssetSupply": "69852841635149468130875968" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "74177141245534493736960", + "expectedQty": "73736829171219017967207", + "swapFee": "44506284747320696242", + "reserves": [ + "13449166666973401133090872", + "15015782453135791287637428", + "41411579018963062962822837" + ], + "mAssetSupply": "69778709000188680957835250" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "4055488683639299072", + "3112949643184208384", + "9210306039487988736" + ], + "expectedQty": "16363891834496385866", + "swapFee": "9824229638480920", + "reserves": [ + "13449162611484717493791800", + "15015779340186148103429044", + "41411569808657023474834101" + ], + "mAssetSupply": "69778692636296846461449384" + }, + { + "type": "mintMulti", + "inputQtys": [ + "183707702015414639788032", + "114262124181396119355392", + "151188783697372750282752" + ], + "expectedQty": "450137922963279525731438", + "reserves": [ + "13632870313500132133579832", + "15130041464367544222784436", + "41562758592354396225116853" + ], + "mAssetSupply": "70228830559260125987180822" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "4166662675035852374016", + "2112058976523084103680", + "5491012115152343400448" + ], + "expectedQty": "11775200172440726700071", + "swapFee": "7069361720496734060", + "reserves": [ + "13628703650825096281205816", + "15127929405391021138680756", + "41557267580239243881716405" + ], + "mAssetSupply": "70217055359087685260480751" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "363854066345882446462976", + "expectedQty": "366480258516649271472889", + "reserves": [ + "13992557717170978727668792", + "15127929405391021138680756", + "41557267580239243881716405" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "2727934180947121152", + "3495050769935344128", + "3199303599650805760" + ], + "expectedQty": "9439233757446788950", + "swapFee": "5666940418719304", + "reserves": [ + "13992554989236797780547640", + "15127925910340251203336628", + "41557264380935644230910645" + ], + "mAssetSupply": "70583526178370577085164690" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "20447549147736262574080", + "outputIndex": 2, + "expectedQty": "20714052839411645492464", + "swapFee": "12353971249985319180", + "reserves": [ + "14013002538384534043121720", + "15127925910340251203336628", + "41536550328096232585418181" + ], + "mAssetSupply": "70583538532341827070483870", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mintMulti", + "inputQtys": [ + "334292472890534075039744", + "2205252220296954422231040", + "2279539789141329762582528" + ], + "expectedQty": "4817291252891941804272060", + "reserves": [ + "14347295011275068118161464", + "17333178130637205625567668", + "43816090117237562348000709" + ], + "mAssetSupply": "75400829785233768874755930" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "402375699471224941838336", + "expectedQty": "398932159146220281847356", + "swapFee": "241425419682734965103", + "reserves": [ + "13948362852128847836314108", + "17333178130637205625567668", + "43816090117237562348000709" + ], + "mAssetSupply": "74998695511182226667882697" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "193802969877706", + "outputIndex": 1, + "expectedQty": "191647600387458", + "swapFee": "115524928005", + "reserves": [ + "13948362852128847836314108", + "17333178130445558025180210", + "43816090117431365317878415" + ], + "mAssetSupply": "74998695511182342192810702", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "256886908679163914223616", + "expectedQty": "255207590492671525065409", + "reserves": [ + "13948362852128847836314108", + "17333178130445558025180210", + "44072977026110529232102031" + ] + }, + { + "type": "redeemMasset", + "inputQty": "218873186629827820519424", + "expectedQtys": [ + "40556125637806397714823", + "50397781977226026363054", + "128146163994456877567784" + ], + "redemptionFee": "65661955988948346155", + "reserves": [ + "13907806726491041438599285", + "17282780348468331998817156", + "43944830862116072354534247" + ], + "mAssetSupply": "75035095577001174845702842" + }, + { + "type": "redeemMasset", + "inputQty": "72775919248404686202470", + "expectedQtys": [ + "13485020115492413819122", + "16757397139177347374548", + "42608941855568917621674" + ], + "redemptionFee": "21832775774521405860", + "reserves": [ + "13894321706375549024780163", + "17266022951329154651442608", + "43902221920260503436912573" + ], + "mAssetSupply": "74962341490528544680906232" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "135723058879646836719616", + "expectedQty": "134498056082423905745161", + "swapFee": "81433835327788102031", + "reserves": [ + "13759823650293125119035002", + "17266022951329154651442608", + "43902221920260503436912573" + ], + "mAssetSupply": "74826699865484225632288647" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "145733949724711981154304", + "expectedQty": "144767137725365814355114", + "reserves": [ + "13759823650293125119035002", + "17266022951329154651442608", + "44047955869985215418066877" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "197787126851222936485888", + "76235730441657772933120", + "65731762698899349831680" + ], + "expectedQty": "341368932822508600689944", + "swapFee": "204944326289278727650", + "reserves": [ + "13562036523441902182549114", + "17189787220887496878509488", + "43982224107286316068235197" + ], + "mAssetSupply": "74630098070387082845953817" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "6621736445370935980064768", + "expectedQty": "6498433930560656529956164", + "swapFee": "3973041867222561588038", + "reserves": [ + "7063602592881245652592950", + "17189787220887496878509488", + "43982224107286316068235197" + ], + "mAssetSupply": "68012334666883369427477087" + }, + { + "type": "redeemMasset", + "inputQty": "2738220971689837697433", + "expectedQtys": [ + "284299933810367258926", + "691864428222197157730", + "1770221815017737988674" + ], + "redemptionFee": "821466291506951309", + "reserves": [ + "7063318292947435285334024", + "17189095356459274681351758", + "43980453885471298330246523" + ], + "mAssetSupply": "68009597267377971096730963" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "56772668933908937572352", + "outputIndex": 0, + "expectedQty": "54877793714966305159821", + "swapFee": "34146474283197993341", + "reserves": [ + "7008440499232468980174203", + "17245868025393183618924110", + "43980453885471298330246523" + ], + "mAssetSupply": "68009631413852254294724304", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "37738791120142994505728", + "expectedQty": "36373766597641325020182", + "swapFee": "22643274672085796703", + "reserves": [ + "6972066732634827655154021", + "17245868025393183618924110", + "43980453885471298330246523" + ], + "mAssetSupply": "67971915266006783386015279" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "18650665063316979712", + "expectedQty": "18595438241053273262", + "swapFee": "11190399037990187", + "reserves": [ + "6972066732634827655154021", + "17245849429954942565650848", + "43980453885471298330246523" + ], + "mAssetSupply": "67971896626532119107025754" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "8521956432594705842176", + "expectedQty": "8211825221126171601108", + "swapFee": "5113173859556823505", + "reserves": [ + "6963854907413701483552913", + "17245849429954942565650848", + "43980453885471298330246523" + ], + "mAssetSupply": "67963379783273383958007083" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "118973160833928837201920", + "195789250800849753473024", + "157675571111299387490304" + ], + "expectedQty": "475490267208772301293001", + "swapFee": "285465439589016790850", + "reserves": [ + "6844881746579772646350993", + "17050060179154092812177824", + "43822778314359998942756219" + ], + "mAssetSupply": "67487889516064611656714082" + }, + { + "type": "redeemMasset", + "inputQty": "148614457945613368138137", + "expectedQtys": [ + "15068528935262751155788", + "37534516251640319947407", + "96472784702744866680935" + ], + "redemptionFee": "44584337383684010441", + "reserves": [ + "6829813217644509895195205", + "17012525662902452492230417", + "43726305529657254076075284" + ], + "mAssetSupply": "67339319642456381972586386" + }, + { + "type": "mintMulti", + "inputQtys": [ + "124418912948711981056", + "37937995965327777792", + "10484944866952329216" + ], + "expectedQty": "177556983272903392107", + "reserves": [ + "6829937636557458607176261", + "17012563600898417820008209", + "43726316014602121028404500" + ], + "mAssetSupply": "67339497199439654875978493" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "736488425487021773946880", + "expectedQty": "738029867901199775628349", + "reserves": [ + "6829937636557458607176261", + "17749052026385439593955089", + "43726316014602121028404500" + ] + }, + { + "type": "redeemMasset", + "inputQty": "178248395235061923840", + "expectedQtys": [ + "17877561775136848579", + "46458663451539131602", + "114454912672412171468" + ], + "redemptionFee": "53474518570518577", + "reserves": [ + "6829919758995683470327682", + "17749005567721988054823487", + "43726201559689448616233032" + ], + "mAssetSupply": "68077348872420138160201579" + }, + { + "type": "mintMulti", + "inputQtys": [ + "679813371801058934784", + "943836754300787490816", + "1658241489999271559168" + ], + "expectedQty": "3289916261805023204527", + "reserves": [ + "6830599572367484529262466", + "17749949404476288842314303", + "43727859801179447887792200" + ], + "mAssetSupply": "68080638788681943183406106" + }, + { + "type": "redeemMasset", + "inputQty": "2173468837023159", + "expectedQtys": [ + "218000913977897", + "566495686394936", + "1395589552858312" + ], + "redemptionFee": "652040651106", + "reserves": [ + "6830599572149483615284569", + "17749949403909793155919367", + "43727859799783858334933888" + ], + "mAssetSupply": "68080638786509126387034053" + }, + { + "type": "redeemMasset", + "inputQty": "77453243634463827558", + "expectedQtys": [ + "7768631238344294302", + "20187512086124465709", + "49732913492927895031" + ], + "redemptionFee": "23235973090339148", + "reserves": [ + "6830591803518245270990267", + "17749929216397707031453658", + "43727810066870365407038857" + ], + "mAssetSupply": "68080561356501465013545643" + }, + { + "type": "redeemMasset", + "inputQty": "3613354722566380339", + "expectedQtys": [ + "362422786390027786", + "941789377828019742", + "2320143733227658317" + ], + "redemptionFee": "1084006416769914", + "reserves": [ + "6830591441095458880962481", + "17749928274608329203433916", + "43727807746726632179380540" + ], + "mAssetSupply": "68080557744230748863935218" + }, + { + "type": "redeemMasset", + "inputQty": "25835463308856590336", + "expectedQtys": [ + "2591320620031132247", + "6733788067800113237", + "16589012951516424302" + ], + "redemptionFee": "7750638992656977", + "reserves": [ + "6830588849774838849830234", + "17749921540820261403320679", + "43727791157713680662956238" + ], + "mAssetSupply": "68080531916518079000001859" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "28605867469881521209344", + "48894372415487885705216", + "38756764796427563958272" + ], + "expectedQty": "116983478187083727207750", + "swapFee": "70232226247999035746", + "reserves": [ + "6801982982304957328620890", + "17701027168404773517615463", + "43689034392917253098997966" + ], + "mAssetSupply": "67963548438330995272794109" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "11384876632363137024", + "expectedQty": "11825726136714440299", + "reserves": [ + "6801994367181589691757914", + "17701027168404773517615463", + "43689034392917253098997966" + ] + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "420885530188110036992", + "expectedQty": "404951404184413600611", + "swapFee": "252531318112866022", + "reserves": [ + "6801589415777405278157303", + "17701027168404773517615463", + "43689034392917253098997966" + ], + "mAssetSupply": "67963139631058261990063438" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "634046457611221987229696", + "outputIndex": 2, + "expectedQty": "663343176353020267021067", + "swapFee": "393893895342242074383", + "reserves": [ + "7435635873388627265386999", + "17701027168404773517615463", + "43025691216564232831976899" + ], + "mAssetSupply": "67963533524953604232137821", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemMasset", + "inputQty": "78018695536054580019", + "expectedQtys": [ + "8533172801066064547", + "20313787032651885050", + "49376497758615288212" + ], + "redemptionFee": "23405608660816374", + "reserves": [ + "7435627340215826199322452", + "17701006854617740865730413", + "43025641840066474216688687" + ], + "mAssetSupply": "67963455529663676838374176" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "635461553081680903798784", + "3297445000847861382905856", + "1813047477506432405864448" + ], + "expectedQty": "5756001580204026906939771", + "swapFee": "3455674352734056578110", + "reserves": [ + "6800165787134145295523668", + "14403561853769879482824557", + "41212594362560041810824239" + ], + "mAssetSupply": "62207453949459649931434405" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "234858411709324853248000", + "1236672132565612407816192", + "582320772017758694014976" + ], + "expectedQty": "2061245697463950226630100", + "swapFee": "1237489912425825631356", + "reserves": [ + "6565307375424820442275668", + "13166889721204267075008365", + "40630273590542283116809263" + ], + "mAssetSupply": "60146208251995699704804305" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "1715199880667994624", + "expectedQty": "1775025872528856979", + "reserves": [ + "6565309090624701110270292", + "13166889721204267075008365", + "40630273590542283116809263" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "10267986855346663587840", + "19608980372375702863872", + "221050561548718132166656" + ], + "expectedQty": "248543490469090686970657", + "swapFee": "149215623655647800862", + "reserves": [ + "6555041103769354446682452", + "13147280740831891372144493", + "40409223028993564984642607" + ], + "mAssetSupply": "59897666536552481546690627" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "4165093490283976704", + "expectedQty": "4023340889474702868", + "swapFee": "2499056094170386", + "reserves": [ + "6555037080428464971979584", + "13147280740831891372144493", + "40409223028993564984642607" + ], + "mAssetSupply": "59897662373958047356884309" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "189158286994245091328", + "outputIndex": 1, + "expectedQty": "185459614140709135240", + "swapFee": "112029299481506905", + "reserves": [ + "6555037080428464971979584", + "13147095281217750663009253", + "40409412187280559229733935" + ], + "mAssetSupply": "59897662485987346838391214", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mintMulti", + "inputQtys": [ + "222470818467772595437568", + "165433714971171178414080", + "41502181679863122886656" + ], + "expectedQty": "437333238265911279198118", + "reserves": [ + "6777507898896237567417152", + "13312528996188921841423333", + "40450914368960422352620591" + ], + "mAssetSupply": "60334995724253258117589332" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "116196855820115247104000", + "170941241361753624805376", + "21076237857979531001856" + ], + "expectedQty": "312816967091087435874058", + "swapFee": "187802861971835562862", + "reserves": [ + "6661311043076122320313152", + "13141587754827168216617957", + "40429838131102442821618735" + ], + "mAssetSupply": "60022178757162170681715274" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "362084780493894647808", + "expectedQty": "366540285242400463224", + "swapFee": "217250868296336788", + "reserves": [ + "6661311043076122320313152", + "13141587754827168216617957", + "40429471590817200421155511" + ], + "mAssetSupply": "60021816889632545083404254" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "554806777306136707072", + "528243603000693948416", + "672554093798503481344" + ], + "expectedQty": "1768908108149586880688", + "swapFee": "1061982054122225463", + "reserves": [ + "6660756236298816183606080", + "13141059511224167522669541", + "40428799036723401917674167" + ], + "mAssetSupply": "60020047981524395496523566" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "33071603206734240", + "expectedQty": "33478581745130307", + "swapFee": "19842961924040", + "reserves": [ + "6660756236298816183606080", + "13141059511224167522669541", + "40428799003244820172543860" + ], + "mAssetSupply": "60020047948472635251713366" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "1552011977816129067286528", + "expectedQty": "1559730461313034295534862", + "reserves": [ + "6660756236298816183606080", + "14693071489040296589956069", + "40428799003244820172543860" + ] + }, + { + "type": "redeemMasset", + "inputQty": "4582808875943699251", + "expectedQtys": [ + "495549287386169267", + "1093140305334739762", + "3007836021194673694" + ], + "redemptionFee": "1374842662783109", + "reserves": [ + "6660755740749528797436813", + "14693070395899991255216307", + "40428795995408798977870166" + ], + "mAssetSupply": "61579773828351636266332086" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "30903628402168025088", + "190652149094331187200", + "79942937606606422016" + ], + "expectedQty": "302321674858657489107", + "swapFee": "181501906058829791", + "reserves": [ + "6660724837121126629411725", + "14692879743750896924029107", + "40428716052471192371448150" + ], + "mAssetSupply": "61579471506676777608842979" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "475385104461312892600320", + "expectedQty": "477073820421473684028502", + "reserves": [ + "6660724837121126629411725", + "15168264848212209816629427", + "40428716052471192371448150" + ] + }, + { + "type": "redeemMasset", + "inputQty": "131348110360784168550", + "expectedQtys": [ + "14093777768205676507", + "32095328830966582984", + "85545245214437108931" + ], + "redemptionFee": "39404433108235250", + "reserves": [ + "6660710743343358423735218", + "15168232752883378850046443", + "40428630507225977934339219" + ], + "mAssetSupply": "62056414018392323616938181" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "3441872081797338867171328", + "outputIndex": 2, + "expectedQty": "3543333906915118905795409", + "swapFee": "2110876222904624724911", + "reserves": [ + "10102582825140697290906546", + "15168232752883378850046443", + "36885296600310859028543810" + ], + "mAssetSupply": "62058524894615228241663092", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "24268945963041127661568", + "expectedQty": "24557589359533558000914", + "reserves": [ + "10126851771103738418568114", + "15168232752883378850046443", + "36885296600310859028543810" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "29455448892701920", + "770275043128750", + "4037195341391015" + ], + "expectedQty": "34585725611103912", + "reserves": [ + "10126851800559187311270034", + "15168232753653653893175193", + "36885296604348054369934825" + ], + "mAssetSupply": "62083082518560487410767918" + }, + { + "type": "mintMulti", + "inputQtys": [ + "2161126916777486057472", + "22727001570210515779584", + "5951241867729734467584" + ], + "expectedQty": "30893343275814340587759", + "reserves": [ + "10129012927475964797327506", + "15190959755223864408954777", + "36891247846215784104402409" + ], + "mAssetSupply": "62113975861836301751355677" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "5924643585766350848", + "46093054817013587968", + "17055355750559563776" + ], + "expectedQty": "69164664723700731078", + "swapFee": "41523713062057673", + "reserves": [ + "10129007002832379030976658", + "15190913662169047395366809", + "36891230790860033544838633" + ], + "mAssetSupply": "62113906697171578050624599" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "212755561367855435874304", + "outputIndex": 1, + "expectedQty": "214392111660535697534718", + "swapFee": "129133320771766127286", + "reserves": [ + "10341762564200234466850962", + "14976521550508511697832091", + "36891230790860033544838633" + ], + "mAssetSupply": "62114035830492349816751885", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemBassets", + "inputQtys": [ + "580362945940673827700736", + "307590206334610733793280", + "1107776817115230575263744" + ], + "expectedQty": "1995539998958489145104117", + "swapFee": "1198042825070135568403", + "reserves": [ + "9761399618259560639150226", + "14668931344173900964038811", + "35783453973744802969574889" + ], + "mAssetSupply": "60118495831533860671647768" + }, + { + "type": "redeemMasset", + "inputQty": "62739360985630228296499", + "expectedQtys": [ + "10183891641239795766898", + "15303830715260525423291", + "37332230219961339531770" + ], + "redemptionFee": "18821808295689068488", + "reserves": [ + "9751215726618320843383328", + "14653627513458640438615520", + "35746121743524841630043119" + ], + "mAssetSupply": "60055775292356526132419757" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "7680003444402929270784", + "6246109292820698234880", + "4334569073796769644544" + ], + "expectedQty": "18341422686096841881808", + "swapFee": "11011460487950875654", + "reserves": [ + "9743535723173917914112544", + "14647381404165819740380640", + "35741787174451044860398575" + ], + "mAssetSupply": "60037433869670429290537949" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "531584851247933398450176", + "173520462243061334802432", + "378506677937030987513856" + ], + "expectedQty": "1088081654519177793422080", + "swapFee": "653240937273870998652", + "reserves": [ + "9211950871925984515662368", + "14473860941922758405578208", + "35363280496514013872884719" + ], + "mAssetSupply": "58949352215151251497115869" + }, + { + "type": "redeemMasset", + "inputQty": "49771391732913922899968", + "expectedQtys": [ + "7775387697450185027775", + "12216726062380935982234", + "29848532622122779799674" + ], + "redemptionFee": "14931417519874176869", + "reserves": [ + "9204175484228534330634593", + "14461644215860377469595974", + "35333431963891891093085045" + ], + "mAssetSupply": "58899595754835857448392770" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "83515311673518615166976", + "86317169463042410283008", + "17669600474474792091648" + ], + "expectedQty": "188754680488305943671492", + "swapFee": "113320800773447634783", + "reserves": [ + "9120660172555015715467617", + "14375327046397335059312966", + "35315762363417416300993397" + ], + "mAssetSupply": "58710841074347551504721278" + }, + { + "type": "redeemMasset", + "inputQty": "7701043891352941625344", + "expectedQtys": [ + "1195989214951799314945", + "1885031980539170816373", + "4630944482675069404471" + ], + "redemptionFee": "2310313167405882487", + "reserves": [ + "9119464183340063916152672", + "14373442014416795888496593", + "35311131418934741231588926" + ], + "mAssetSupply": "58703142340769365968978421" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "845311721235313009360896", + "expectedQty": "847614277206245615040746", + "reserves": [ + "9119464183340063916152672", + "15218753735652108897857489", + "35311131418934741231588926" + ] + }, + { + "type": "redeemMasset", + "inputQty": "175010718739933294703411", + "expectedQtys": [ + "26792693672903452606437", + "44712211016474478762935", + "103742973088211307073408" + ], + "redemptionFee": "52503215621979988411", + "reserves": [ + "9092671489667160463546235", + "15174041524635634419094554", + "35207388445846529924515518" + ], + "mAssetSupply": "59375798402451300269304167" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "4609667224161263978283008", + "3678296370549767872184320", + "64465842105703171358720" + ], + "expectedQty": "8493549818134466854124238", + "swapFee": "5099189404523394148963", + "reserves": [ + "4483004265505896485263227", + "11495745154085866546910234", + "35142922603740826753156798" + ], + "mAssetSupply": "50882248584316833415179929" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "45150905225057126055936", + "expectedQty": "44860936313263615434823", + "swapFee": "27090543135034275633", + "reserves": [ + "4483004265505896485263227", + "11450884217772602931475411", + "35142922603740826753156798" + ], + "mAssetSupply": "50837124769634911323399626" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "1246261881836718848", + "outputIndex": 0, + "expectedQty": "1186161905106577352", + "swapFee": "752176851712201", + "reserves": [ + "4483003079343991378685875", + "11450885464034484768194259", + "35142922603740826753156798" + ], + "mAssetSupply": "50837124770387088175111827", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mintMulti", + "inputQtys": [ + "60586876653301558935552", + "239836422937239758045184", + "255369290157180881731584" + ], + "expectedQty": "556515924452685120098112", + "reserves": [ + "4543589955997292937621427", + "11690721886971724526239443", + "35398291893898007634888382" + ], + "mAssetSupply": "51393640694839773295209939" + }, + { + "type": "redeemMasset", + "inputQty": "53654675897356156928", + "expectedQtys": [ + "4742059674126914357", + "12201387307951552139", + "36944533760459653445" + ], + "redemptionFee": "16096402769206847", + "reserves": [ + "4543585213937618810707070", + "11690709685584416574687304", + "35398254949364247175234937" + ], + "mAssetSupply": "51393587056260278708259858" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "108359747538914951168", + "expectedQty": "107694878306647477744", + "swapFee": "65015848523348970", + "reserves": [ + "4543585213937618810707070", + "11690601990706109927209560", + "35398254949364247175234937" + ], + "mAssetSupply": "51393478761528588316657660" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "164303184667757112197120", + "expectedQty": "155269150921155242405132", + "swapFee": "98581910800654267318", + "reserves": [ + "4388316063016463568301938", + "11690601990706109927209560", + "35398254949364247175234937" + ], + "mAssetSupply": "51229274158771631858727858" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "1754176139458972928", + "2407485864963872256", + "1122822555399913856" + ], + "expectedQty": "5384113424865498522", + "swapFee": "3232407499418950", + "reserves": [ + "4388314308840324109329010", + "11690599583220244963337304", + "35398253826541691775321081" + ], + "mAssetSupply": "51229268774658206993229336" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "26280293129339126415360", + "36982889762611613663232", + "38518095109701261852672" + ], + "expectedQty": "102933914724266623142615", + "swapFee": "61797427290934534606", + "reserves": [ + "4362034015710984982913650", + "11653616693457633349674072", + "35359735731431990513468409" + ], + "mAssetSupply": "51126334859933940370086721" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "317336506139349417984", + "outputIndex": 0, + "expectedQty": "300818165582179341461", + "swapFee": "191465020178322175", + "reserves": [ + "4361733197545402803572189", + "11653934029963772699092056", + "35359735731431990513468409" + ], + "mAssetSupply": "51126335051398960548408896", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemBassets", + "inputQtys": [ + "6440788541577099214848", + "965360452592264019968", + "6645530776542914805760" + ], + "expectedQty": "14336682701922069868805", + "swapFee": "8607173925508547049", + "reserves": [ + "4355292409003825704357341", + "11652968669511180435072088", + "35353090200655447598662649" + ], + "mAssetSupply": "51111998368697038478540091" + }, + { + "type": "mintMulti", + "inputQtys": [ + "70200648313918902501376", + "143675924210085263310848", + "343824101477110727573504" + ], + "expectedQty": "557113197583747680692373", + "reserves": [ + "4425493057317744606858717", + "11796644593721265698382936", + "35696914302132558326236153" + ], + "mAssetSupply": "51669111566280786159232464" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "38009331423304419901440", + "outputIndex": 1, + "expectedQty": "40007551914436896837906", + "swapFee": "24152753128050468670", + "reserves": [ + "4463502388741049026760157", + "11756637041806828801545030", + "35696914302132558326236153" + ], + "mAssetSupply": "51669135719033914209701134", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemMasset", + "inputQty": "9306708788775150734540", + "expectedQtys": [ + "803730392951861598133", + "2116984754671318601326", + "6427843531929702698327" + ], + "redemptionFee": "2792012636632545220", + "reserves": [ + "4462698658348097165162024", + "11754520057052157482943704", + "35690486458600628623537826" + ], + "mAssetSupply": "51659831802257775691511814" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "28506261051730636570624", + "outputIndex": 0, + "expectedQty": "26468105948481240757169", + "swapFee": "16827947088089922339", + "reserves": [ + "4436230552399615924404855", + "11754520057052157482943704", + "35718992719652359260108450" + ], + "mAssetSupply": "51659848630204863781434153", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "11764398460347232256", + "expectedQty": "12462637315950586576", + "reserves": [ + "4436242316798076271637111", + "11754520057052157482943704", + "35718992719652359260108450" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "737557876178877939712", + "136186421721838895104", + "1083900624881510645760" + ], + "expectedQty": "1984601110437728359537", + "reserves": [ + "4436979874674255149576823", + "11754656243473879321838808", + "35720076620277240770754210" + ], + "mAssetSupply": "51661845693952617460380266" + }, + { + "type": "mintMulti", + "inputQtys": [ + "531854893784328508014592", + "11086606289954429468672", + "183759877640758153445376" + ], + "expectedQty": "752240356817163745632107", + "reserves": [ + "4968834768458583657591415", + "11765742849763833751307480", + "35903836497917998924199586" + ], + "mAssetSupply": "52414086050769781206012373" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "341283621755408089088", + "expectedQty": "343276264976701191336", + "reserves": [ + "4968834768458583657591415", + "11766084133385589159396568", + "35903836497917998924199586" + ] + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "248161007148200099840", + "outputIndex": 2, + "expectedQty": "253200641850840544214", + "swapFee": "149765870662845604", + "reserves": [ + "4968834768458583657591415", + "11766332294392737359496408", + "35903583297276148083655372" + ], + "mAssetSupply": "52414429476800628570049313", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mintMulti", + "inputQtys": [ + "2684172444387004118990848", + "940667202323945598484480", + "1621791824153200409182208" + ], + "expectedQty": "5318124253068763263585269", + "reserves": [ + "7653007212845587776582263", + "12706999496716682957980888", + "37525375121429348492837580" + ], + "mAssetSupply": "57732553729869391833634582" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "271357711628879", + "278867881453359", + "447612677111400" + ], + "expectedQty": "1000619032837244", + "swapFee": "600731858817", + "reserves": [ + "7653007212574230064953384", + "12706999496437815076527529", + "37525375120981735815726180" + ], + "mAssetSupply": "57732553728868772800797338" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "162201886627296768", + "264929526340311136", + "231095051956587136" + ], + "expectedQty": "660819114914692759", + "swapFee": "396729506652807", + "reserves": [ + "7653007050372343437656616", + "12706999231508288736216393", + "37525374889886683859139044" + ], + "mAssetSupply": "57732553068049657886104579" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "1181331587333947639463936", + "expectedQty": "1151135521394778373784910", + "swapFee": "708798952400368583678", + "reserves": [ + "6501871528977565063871706", + "12706999231508288736216393", + "37525374889886683859139044" + ], + "mAssetSupply": "56551930279668110615224321" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "238179554465747474317312", + "expectedQty": "235325053216140395012059", + "reserves": [ + "6501871528977565063871706", + "12706999231508288736216393", + "37763554444352431333456356" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "585156483927804936192", + "319137138145337802752", + "191282397608466087936" + ], + "expectedQty": "1112993377506031688375", + "reserves": [ + "6502456685461492868807898", + "12707318368646434074019145", + "37763745726750039799544292" + ], + "mAssetSupply": "56788368326261757041924755" + }, + { + "type": "mintMulti", + "inputQtys": [ + "15202441114989898", + "12147548704094870", + "1082540445839776" + ], + "expectedQty": "28952965138028222", + "reserves": [ + "6502456700663933983797796", + "12707318380793982778114015", + "37763745727832580245384068" + ], + "mAssetSupply": "56788368355214722179952977" + }, + { + "type": "redeemMasset", + "inputQty": "28747110454087018086400", + "expectedQtys": [ + "3290652088746716896377", + "6430702378665544365768", + "19110830641210399291561" + ], + "redemptionFee": "8624133136226105425", + "reserves": [ + "6499166048575187266901419", + "12700887678415317233748247", + "37744634897191369846092507" + ], + "mAssetSupply": "56759629868893771387972002" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "60493997252872044544", + "expectedQty": "59765798368376916358", + "reserves": [ + "6499166048575187266901419", + "12700887678415317233748247", + "37744695391188622718137051" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "83997420793906167808", + "83697672290055962624", + "31641544780836786176" + ], + "expectedQty": "201994319673812588628", + "reserves": [ + "6499250045995981173069227", + "12700971376087607289710871", + "37744727032733403554923227" + ], + "mAssetSupply": "56759891629011813577476988" + }, + { + "type": "mintMulti", + "inputQtys": [ + "22980518885324612435968", + "34542344871970259075072", + "176184419368347303936" + ], + "expectedQty": "58588800786734012484249", + "reserves": [ + "6522230564881305785505195", + "12735513720959577548785943", + "37744903217152771902227163" + ], + "mAssetSupply": "56818480429798547589961237" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "136997879930345985409024", + "expectedQty": "132781034673332911350916", + "swapFee": "82198727958207591245", + "reserves": [ + "6389449530207972874154279", + "12735513720959577548785943", + "37744903217152771902227163" + ], + "mAssetSupply": "56681564748596159812143458" + }, + { + "type": "mintMulti", + "inputQtys": [ + "162404349529733386469376", + "129235344107748395581440", + "57695612695336445804544" + ], + "expectedQty": "354373387167172567622805", + "reserves": [ + "6551853879737706260623655", + "12864749065067325944367383", + "37802598829848108348031707" + ], + "mAssetSupply": "57035938135763332379766263" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "583623065373015808", + "expectedQty": "586694883292227120", + "reserves": [ + "6551853879737706260623655", + "12864749648690391317383191", + "37802598829848108348031707" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "48154441946110", + "11431509406324", + "64103937925253" + ], + "expectedQty": "124447805069422", + "swapFee": "74713511148", + "reserves": [ + "6551853879689551818677545", + "12864749648678959807976867", + "37802598829784004410106454" + ], + "mAssetSupply": "57035938722333767866923961" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "1059877625233205146681344", + "1603972690112001697906688", + "466774911113971420364800" + ], + "expectedQty": "3172782229266560960403513", + "swapFee": "1904812224894873500342", + "reserves": [ + "5491976254456346671996201", + "11260776958566958110070179", + "37335823918670032989741654" + ], + "mAssetSupply": "53863156493067206906520448" + }, + { + "type": "redeemMasset", + "inputQty": "908982072685940545945", + "expectedQtys": [ + "92653506616760766757", + "189977236626587088703", + "629881639725542850325" + ], + "redemptionFee": "272694621805782163", + "reserves": [ + "5491883600949729911229444", + "11260586981330331522981476", + "37335194037030307446891329" + ], + "mAssetSupply": "53862247783689142771756666" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "1875467602233896468480", + "outputIndex": 2, + "expectedQty": "1982387771722995266549", + "swapFee": "1172703885061297849", + "reserves": [ + "5493759068551963807697924", + "11260586981330331522981476", + "37333211649258584451624780" + ], + "mAssetSupply": "53862248956393027833054515", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "1310827346832421384355840", + "expectedQty": "1297327947269743198030596", + "swapFee": "786496408099452830613", + "reserves": [ + "5493759068551963807697924", + "9963259034060588324950880", + "37333211649258584451624780" + ], + "mAssetSupply": "52552208105968705901529288" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "181742971179808928", + "352981234095045568", + "525705379076950528" + ], + "expectedQty": "1064001540090405267", + "swapFee": "638784194570985", + "reserves": [ + "5493758886808992627888996", + "9963258681079354229905312", + "37333211123553205374674252" + ], + "mAssetSupply": "52552207041967165811124021" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "312879536270546698240", + "expectedQty": "326122211371509548925", + "reserves": [ + "5494071766345263174587236", + "9963258681079354229905312", + "37333211123553205374674252" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "373208488372954791936", + "35607773827433630793728", + "35165262066302144479232" + ], + "expectedQty": "71029048636375326273164", + "swapFee": "42643014990819687576", + "reserves": [ + "5493698557856890219795300", + "9927650907251920599111584", + "37298045861486903230195020" + ], + "mAssetSupply": "52481504115542161994399782" + }, + { + "type": "mintMulti", + "inputQtys": [ + "10522520005462214656", + "11991269130654121984", + "8279598730115225600" + ], + "expectedQty": "31249842365286391656", + "reserves": [ + "5493709080376895682009956", + "9927662898521051253233568", + "37298054141085633345420620" + ], + "mAssetSupply": "52481535365384527280791438" + }, + { + "type": "mintMulti", + "inputQtys": [ + "1114626891843269820416", + "718872907962997407744", + "2229858512944173416448" + ], + "expectedQty": "4083839529066734727811", + "reserves": [ + "5494823707268738951830372", + "9928381771429014250641312", + "37300283999598577518837068" + ], + "mAssetSupply": "52485619204913594015519249" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "1435634037491522076672000", + "expectedQty": "1449537541864987584357133", + "reserves": [ + "5494823707268738951830372", + "11364015808920536327313312", + "37300283999598577518837068" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "159239408322368264732672", + "210758803275822464499712", + "260954017874075164082176" + ], + "expectedQty": "635618255746992880150821", + "swapFee": "381599913396233468171", + "reserves": [ + "5335584298946370687097700", + "11153257005644713862813600", + "37039329981724502354754892" + ], + "mAssetSupply": "53299538491031588719725561" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "1948847222629122441216", + "outputIndex": 2, + "expectedQty": "1993178746273303923601", + "swapFee": "1178749039225854774", + "reserves": [ + "5335584298946370687097700", + "11155205852867342985254816", + "37037336802978229050831291" + ], + "mAssetSupply": "53299539669780627945580335", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "271148190823984568205312", + "expectedQty": "259005888095853810211476", + "swapFee": "162688914494390740923", + "reserves": [ + "5076578410850516876886224", + "11155205852867342985254816", + "37037336802978229050831291" + ], + "mAssetSupply": "53028554167871137768115946" + }, + { + "type": "mintMulti", + "inputQtys": [ + "1367297058517967949529088", + "211026254919608517525504", + "1042359277791745289486336" + ], + "expectedQty": "2661149149360878623327177", + "reserves": [ + "6443875469368484826415312", + "11366232107786951502780320", + "38079696080769974340317627" + ], + "mAssetSupply": "55689703317232016391443123" + }, + { + "type": "mintMulti", + "inputQtys": [ + "273503286719581574397952", + "591217254311512298749952", + "97835548238796814286848" + ], + "expectedQty": "974186018114356716632241", + "reserves": [ + "6717378756088066400813264", + "11957449362098463801530272", + "38177531629008771154604475" + ], + "mAssetSupply": "56663889335346373108075364" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "4853877249003226112", + "4147018045510701568", + "9712283200229521408" + ], + "expectedQty": "18765007434408063411", + "swapFee": "11265763918996235", + "reserves": [ + "6717373902210817397587152", + "11957445215080418290828704", + "38177521916725570925083067" + ], + "mAssetSupply": "56663870570338938700011953" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "192973380224124289024", + "expectedQty": "194349813574521400128", + "reserves": [ + "6717373902210817397587152", + "11957638188460642415117728", + "38177521916725570925083067" + ] + }, + { + "type": "redeemMasset", + "inputQty": "198676484404828559743385", + "expectedQtys": [ + "23545502037925478786741", + "41913491556947948071599", + "133818503060750911388909" + ], + "redemptionFee": "59602945321448567923", + "reserves": [ + "6693828400172891918800411", + "11915724696903694467046129", + "38043703413664820013694158" + ], + "mAssetSupply": "56465448038693006110236619" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "66435604151285005156352", + "49036677891885767852032", + "61440850692971287281664" + ], + "expectedQty": "178462470953688177694456", + "swapFee": "107141767632792582165", + "reserves": [ + "6627392796021606913644059", + "11866688019011808699194097", + "37982262562971848726412494" + ], + "mAssetSupply": "56286985567739317932542163" + }, + { + "type": "mintMulti", + "inputQtys": [ + "34374270245497517113344", + "7898461457188213751808", + "30560027615929810550784" + ], + "expectedQty": "73527952183725132421948", + "reserves": [ + "6661767066267104430757403", + "11874586480468996912945905", + "38012822590587778536963278" + ], + "mAssetSupply": "56360513519923043064964111" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "1564577451602349104562176", + "expectedQty": "1549739297009538829106323", + "swapFee": "938746470961409462737", + "reserves": [ + "6661767066267104430757403", + "10324847183459458083839582", + "38012822590587778536963278" + ], + "mAssetSupply": "54796874814791655369864672" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "661923787515958600400896", + "expectedQty": "652891163485282025444229", + "reserves": [ + "6661767066267104430757403", + "10324847183459458083839582", + "38674746378103737137364174" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "482974649833075698040832", + "304314527948998470270976", + "292209443868233835741184" + ], + "expectedQty": "1094805350068586286468060", + "swapFee": "657277576587104034301", + "reserves": [ + "6178792416434028732716571", + "10020532655510459613568606", + "38382536934235503301622990" + ], + "mAssetSupply": "54354960628208351108840841" + }, + { + "type": "redeemMasset", + "inputQty": "75552514068419234181939", + "expectedQtys": [ + "8585844761627717294217", + "13924199424502960429071", + "53335098748143364470827" + ], + "redemptionFee": "22665754220525770254", + "reserves": [ + "6170206571672401015422354", + "10006608456085956653139535", + "38329201835487359937152163" + ], + "mAssetSupply": "54279430779894152400429156" + }, + { + "type": "redeemMasset", + "inputQty": "141961395874628108288", + "expectedQtys": [ + "16132600247024926600", + "26163243025229638217", + "100215395354559632526" + ], + "redemptionFee": "42588418762388432", + "reserves": [ + "6170190439072153990495754", + "10006582292842931423501318", + "38329101620092005377519637" + ], + "mAssetSupply": "54279288861086696534709300" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "416897863037597966663680", + "expectedQty": "401478492402868256098298", + "swapFee": "250138717822558779998", + "reserves": [ + "5768711946669285734397456", + "10006582292842931423501318", + "38329101620092005377519637" + ], + "mAssetSupply": "53862641136766921126825618" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "153122195241394592", + "expectedQty": "150723668201214347", + "reserves": [ + "5768711946669285734397456", + "10006582292842931423501318", + "38329101773214200618914229" + ] + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "4974984183626460037120", + "expectedQty": "4910592570972283935546", + "swapFee": "2984990510175876022", + "reserves": [ + "5768711946669285734397456", + "10001671700271959139565772", + "38329101773214200618914229" + ], + "mAssetSupply": "53857669288297473043878867" + }, + { + "type": "mintMulti", + "inputQtys": [ + "14218121333769148416", + "10237706246910046208", + "17910595477557071872" + ], + "expectedQty": "42789650884594118212", + "reserves": [ + "5768726164790619503545872", + "10001681937978206049611980", + "38329119683809678175986101" + ], + "mAssetSupply": "53857712077948357637997079" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "1105283944489979262009344", + "1112300813972187144781824", + "614516422438275633905664" + ], + "expectedQty": "2892667576046278882963424", + "swapFee": "1736642531146455202899", + "reserves": [ + "4663442220300640241536528", + "8889381124006018904830156", + "37714603261371402542080437" + ], + "mAssetSupply": "50965044501902078755033655" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "109564983969462042624", + "expectedQty": "107410498490639526282", + "reserves": [ + "4663442220300640241536528", + "8889381124006018904830156", + "37714712826355372004123061" + ] + }, + { + "type": "redeemMasset", + "inputQty": "5861276896829264573235", + "expectedQtys": [ + "536160984561961971802", + "1022021740688861027533", + "4336101232995815964303" + ], + "redemptionFee": "1758383069048779371", + "reserves": [ + "4662906059316078279564726", + "8888359102265330043802623", + "37710376725122376188158758" + ], + "mAssetSupply": "50959292393886809178766073" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "16681105268814970880", + "expectedQty": "16353087270662950483", + "reserves": [ + "4662906059316078279564726", + "8888359102265330043802623", + "37710393406227645003129638" + ] + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "11415192142792", + "expectedQty": "10750707378114", + "swapFee": "6849115285", + "reserves": [ + "4662906059305327572186612", + "8888359102265330043802623", + "37710393406227645003129638" + ], + "mAssetSupply": "50959308746962671498689049" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "706467797182220586713088", + "expectedQty": "717492382458594510770647", + "reserves": [ + "4662906059305327572186612", + "9594826899447550630515711", + "37710393406227645003129638" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "913674937864222574379008", + "3061115694941228339560448", + "2732756141277073572364288" + ], + "expectedQty": "6741368291038201099016781", + "reserves": [ + "5576580997169550146565620", + "12655942594388778970076159", + "40443149547504718575493926" + ], + "mAssetSupply": "58418169420459467108476477" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "10656891020619141873664", + "expectedQty": "10814755230537632076766", + "swapFee": "6394134612371485124", + "reserves": [ + "5576580997169550146565620", + "12655942594388778970076159", + "40432334792274180943417160" + ], + "mAssetSupply": "58407518923573460338087937" + }, + { + "type": "mintMulti", + "inputQtys": [ + "2926134257615097036800", + "1871712383539558219776", + "2959632919611046887424" + ], + "expectedQty": "7866168628046288138623", + "reserves": [ + "5579507131427165243602420", + "12657814306772318528295935", + "40435294425193791990304584" + ], + "mAssetSupply": "58415385092201506626226560" + }, + { + "type": "mintMulti", + "inputQtys": [ + "26541890383157640", + "21990366188673328", + "24408574536312224" + ], + "expectedQty": "73998347374204583", + "reserves": [ + "5579507157969055626760060", + "12657814328762684716969263", + "40435294449602366526616808" + ], + "mAssetSupply": "58415385166199854000431143" + }, + { + "type": "mintMulti", + "inputQtys": [ + "28924974189719547904", + "59444117579022295040", + "10637443470287058944" + ], + "expectedQty": "100650070666281401456", + "reserves": [ + "5579536082943245346307964", + "12657873772880263739264303", + "40435305087045836813675752" + ], + "mAssetSupply": "58415485816270520281832599" + }, + { + "type": "redeemMasset", + "inputQty": "211181092782316634243072", + "expectedQtys": [ + "20164841959220071211341", + "45746459987985982640515", + "146136080945104730631798" + ], + "redemptionFee": "63354327834694990272", + "reserves": [ + "5559371240984025275096623", + "12612127312892277756623788", + "40289169006100732083043954" + ], + "mAssetSupply": "58204368077816038342579799" + }, + { + "type": "mintMulti", + "inputQtys": [ + "5255258461969986913042432", + "5589939563928307932069888", + "5187910553389551484665856" + ], + "expectedQty": "16144767405795906736102697", + "reserves": [ + "10814629702954012188139055", + "18202066876820585688693676", + "45477079559490283567709810" + ], + "mAssetSupply": "74349135483611945078682496" + }, + { + "type": "redeemMasset", + "inputQty": "211584937397792976509337", + "expectedQtys": [ + "30767355531113744869298", + "51784432604962543417518", + "129381172888553885715552" + ], + "redemptionFee": "63475481219337892952", + "reserves": [ + "10783862347422898443269757", + "18150282444215623145276158", + "45347698386601729681994258" + ], + "mAssetSupply": "74137614021695371440066111" + }, + { + "type": "redeemMasset", + "inputQty": "4487282047740454895616", + "expectedQtys": [ + "652512432260949812587", + "1098241479939572227641", + "2743909002023637329360" + ], + "redemptionFee": "1346184614322136468", + "reserves": [ + "10783209834990637493457170", + "18149184202735683573048517", + "45344954477599706044664898" + ], + "mAssetSupply": "74133128085832245307306963" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "204405994305916993536", + "expectedQty": "201047041485274532289", + "swapFee": "122643596583550196", + "reserves": [ + "10783008787949152218924881", + "18149184202735683573048517", + "45344954477599706044664898" + ], + "mAssetSupply": "74132923802481535973863623" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "389758029917617061888", + "expectedQty": "396031953867713590747", + "reserves": [ + "10783398545979069835986769", + "18149184202735683573048517", + "45344954477599706044664898" + ] + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "396857020546982862651392", + "outputIndex": 2, + "expectedQty": "401049353581416282174556", + "swapFee": "238822012280278258730", + "reserves": [ + "10783398545979069835986769", + "18546041223282666435699909", + "44943905124018289762490342" + ], + "mAssetSupply": "74133558656447683965713100", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "4284414798102998886121472", + "expectedQty": "4290333926101250250688881", + "reserves": [ + "10783398545979069835986769", + "22830456021385665321821381", + "44943905124018289762490342" + ] + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "801099687921961589014528", + "expectedQty": "806371742008541494805436", + "swapFee": "480659812753176953408", + "reserves": [ + "10783398545979069835986769", + "22830456021385665321821381", + "44137533382009748267684906" + ], + "mAssetSupply": "77623273554439725804340861" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "6176013838190966784", + "expectedQty": "6171573792607859678", + "swapFee": "3705608302914580", + "reserves": [ + "10783398545979069835986769", + "22830449849811872713961703", + "44137533382009748267684906" + ], + "mAssetSupply": "77623267382131495916288657" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "8900314092356169105408", + "outputIndex": 2, + "expectedQty": "8959085580574514002479", + "swapFee": "5340813386632700487", + "reserves": [ + "10783398545979069835986769", + "22839350163904228883067111", + "44128574296429173753682427" + ], + "mAssetSupply": "77623272722944882548989144", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "952682917259698896896", + "expectedQty": "945977025867472748422", + "reserves": [ + "10783398545979069835986769", + "22839350163904228883067111", + "44129526979346433452579323" + ] + }, + { + "type": "redeemMasset", + "inputQty": "2952943657544078642380", + "expectedQtys": [ + "410093860469709223937", + "868583057502542475310", + "1678250878190020586869" + ], + "redemptionFee": "885883097263223592", + "reserves": [ + "10782988452118600126762832", + "22838481580846726340591801", + "44127848728468243431992454" + ], + "mAssetSupply": "77621266642196303206318778" + }, + { + "type": "mintMulti", + "inputQtys": [ + "50673448034624625180672", + "37568095197190804209664", + "16048099725893351505920" + ], + "expectedQty": "105023439053664154717873", + "reserves": [ + "10833661900153224751943504", + "22876049676043917144801465", + "44143896828194136783498374" + ], + "mAssetSupply": "77726290081249967361036651" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "2631361608596143996928", + "244274618180567302144", + "10189982854010414039040" + ], + "expectedQty": "13037809595520460124803", + "swapFee": "7827382186624250625", + "reserves": [ + "10831030538544628607946576", + "22875805401425736577499321", + "44133706845340126369459334" + ], + "mAssetSupply": "77713252271654446900911848" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "2142234996869550682669056", + "expectedQty": "2155525938544864608526646", + "swapFee": "1285340998121730409601", + "reserves": [ + "10831030538544628607946576", + "22875805401425736577499321", + "41978180906795261760932688" + ], + "mAssetSupply": "75572302615783017948652393" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "1784420760442925824", + "1787523024341704960", + "2033447905448246272" + ], + "expectedQty": "5619038217843622832", + "swapFee": "3373446998905517", + "reserves": [ + "10831028754123868165020752", + "22875803613902712235794361", + "41978178873347356312686416" + ], + "mAssetSupply": "75572296996744800105029561" + }, + { + "type": "redeemMasset", + "inputQty": "634262355232569958", + "expectedQtys": [ + "90875269985983817", + "191934199119196500", + "352208310515554895" + ], + "redemptionFee": "190278706569770", + "reserves": [ + "10831028663248598179036935", + "22875803421968513116597861", + "41978178521139045797131521" + ], + "mAssetSupply": "75572296362672723579029373" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "3500095734535098368", + "outputIndex": 2, + "expectedQty": "3520274692212493150", + "swapFee": "2099652936885411", + "reserves": [ + "10831028663248598179036935", + "22875806922064247651696229", + "41978175000864353584638371" + ], + "mAssetSupply": "75572296364772376515914784", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mintMulti", + "inputQtys": [ + "471568798525654630400", + "418409246884429561856", + "745281976739236806656" + ], + "expectedQty": "1637521111497074166596", + "reserves": [ + "10831500232047123833667335", + "22876225331311132081258085", + "41978920282841092821445027" + ], + "mAssetSupply": "75573933885883873590081380" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "2090720581095234732032", + "expectedQty": "2058034071081217313274", + "swapFee": "1254432348657140839", + "reserves": [ + "10829442197976042616354061", + "22876225331311132081258085", + "41978920282841092821445027" + ], + "mAssetSupply": "75571844419735127012490187" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "9936960417868835454976", + "outputIndex": 2, + "expectedQty": "9994208386558006257913", + "swapFee": "5961012003553098352", + "reserves": [ + "10829442197976042616354061", + "22886162291729000916713061", + "41968926074454534815187114" + ], + "mAssetSupply": "75571850380747130565588539", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "4046543272923049230336", + "expectedQty": "4070644310884852077915", + "swapFee": "2427925963753829538", + "reserves": [ + "10829442197976042616354061", + "22886162291729000916713061", + "41964855430143649963109199" + ], + "mAssetSupply": "75567806265400171270187741" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "107328253382473763782656", + "outputIndex": 2, + "expectedQty": "107940660937024829035843", + "swapFee": "64382703459284223909", + "reserves": [ + "10829442197976042616354061", + "22993490545111474680495717", + "41856914769206625134073356" + ], + "mAssetSupply": "75567870648103630554411650", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "238055046749255486144512", + "outputIndex": 1, + "expectedQty": "241488637172220834577605", + "swapFee": "144961470839012448855", + "reserves": [ + "11067497244725298102498573", + "22752001907939253845918112", + "41856914769206625134073356" + ], + "mAssetSupply": "75568015609574469566860505", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "2151253907811118071414784", + "expectedQty": "2137023355135950211430802", + "reserves": [ + "11067497244725298102498573", + "22752001907939253845918112", + "44008168677017743205488140" + ] + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "1454300720405848233345024", + "expectedQty": "1454183746714708276080584", + "reserves": [ + "11067497244725298102498573", + "24206302628345102079263136", + "44008168677017743205488140" + ] + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "558672690248836096", + "expectedQty": "554955594993499093", + "reserves": [ + "11067497244725298102498573", + "24206302628345102079263136", + "44008169235690433454324236" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "471341595745933915586560", + "502477645895700343422976", + "528397224008840623685632" + ], + "expectedQty": "1505989220491350413399561", + "reserves": [ + "11538838840471232018085133", + "24708780274240802422686112", + "44536566459699274078009868" + ], + "mAssetSupply": "80665212486872073461270545" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "1026357766772100807262208", + "expectedQty": "1019639290020900040418979", + "reserves": [ + "11538838840471232018085133", + "24708780274240802422686112", + "45562924226471374885272076" + ] + }, + { + "type": "redeemMasset", + "inputQty": "105809684676183497113", + "expectedQtys": [ + "14942239551385936748", + "31996678260668706204", + "59001788469885374878" + ], + "redemptionFee": "31742905402855049", + "reserves": [ + "11538823898231680632148385", + "24708748277562541753979908", + "45562865224682904999897198" + ], + "mAssetSupply": "81684745998951202721047460" + }, + { + "type": "redeemMasset", + "inputQty": "17753200224240115", + "expectedQtys": [ + "2507072687780383", + "5368539159819481", + "9899571740524333" + ], + "redemptionFee": "5325960067272", + "reserves": [ + "11538823895724607944368002", + "24708748272194002594160427", + "45562865214783333259372865" + ], + "mAssetSupply": "81684745981203328456874617" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "4291425499794455920640", + "expectedQty": "4221951997185457626633", + "swapFee": "2574855299876673552", + "reserves": [ + "11534601943727422486741369", + "24708748272194002594160427", + "45562865214783333259372865" + ], + "mAssetSupply": "81680457130558833877627529" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "1096367781060858871808", + "expectedQty": "1095947039406885575754", + "swapFee": "657820668636515323", + "reserves": [ + "11534601943727422486741369", + "24707652325154595708584673", + "45562865214783333259372865" + ], + "mAssetSupply": "81679361420598441655271044" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "2497661701084576506445824", + "expectedQty": "2512225173434418496100682", + "swapFee": "1498597020650745903867", + "reserves": [ + "11534601943727422486741369", + "24707652325154595708584673", + "43050640041348914763272183" + ], + "mAssetSupply": "79183198316534515894729087" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "884403330050529437941760", + "expectedQty": "878898710238664778733569", + "reserves": [ + "11534601943727422486741369", + "24707652325154595708584673", + "43935043371399444201213943" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "49101767209315434496", + "41708553737572417536", + "71543048074338320384" + ], + "expectedQty": "162618981841256705060", + "reserves": [ + "11534651045494631802175865", + "24707694033708333281002209", + "43935114914447518539534327" + ], + "mAssetSupply": "80062259645755021930167716" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "1272592181000105885696", + "expectedQty": "1272058177930240041229", + "reserves": [ + "11534651045494631802175865", + "24708966625889333386887905", + "43935114914447518539534327" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "111928836364054294429696", + "415854769419224354914304", + "888805042602353308467200" + ], + "expectedQty": "1412458120410944984771488", + "reserves": [ + "11646579881858686096605561", + "25124821395308557741802209", + "44823919957049871848001527" + ], + "mAssetSupply": "81475989824343897154980433" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "238456422404363753881600", + "expectedQty": "236926890897650319352449", + "reserves": [ + "11646579881858686096605561", + "25124821395308557741802209", + "45062376379454235601883127" + ] + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "3000278777370496091553792", + "expectedQty": "2997882263723789793952713", + "swapFee": "1800167266422297654932", + "reserves": [ + "11646579881858686096605561", + "22126939131584767947849496", + "45062376379454235601883127" + ], + "mAssetSupply": "78714438105137473680434022" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "74264031048121184157696", + "outputIndex": 1, + "expectedQty": "73644830744122277114534", + "swapFee": "44252456044721747109", + "reserves": [ + "11646579881858686096605561", + "22053294300840645670734962", + "45136640410502356786040823" + ], + "mAssetSupply": "78714482357593518402181131", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemMasset", + "inputQty": "1633557639431989", + "expectedQtys": [ + "241628368271528", + "457533591060856", + "936437381813406" + ], + "redemptionFee": "490067291829", + "reserves": [ + "11646579881617057728334033", + "22053294300383112079674106", + "45136640409565919404227417" + ], + "mAssetSupply": "78714482355960450830040971" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "6640278838472388447830016", + "expectedQty": "6424359600774401591623662", + "swapFee": "3984167303083433068698", + "reserves": [ + "5222220280842656136710371", + "22053294300383112079674106", + "45136640409565919404227417" + ], + "mAssetSupply": "72078187684791145815279653" + }, + { + "type": "redeemMasset", + "inputQty": "45707589328784611868672", + "expectedQtys": [ + "3310620024115322530394", + "13980658375593408681188", + "28614316808767349786420" + ], + "redemptionFee": "13712276798635383560", + "reserves": [ + "5218909660818540814179977", + "22039313642007518670992918", + "45108026092757152054440997" + ], + "mAssetSupply": "72032493807739159838794541" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "1114161711500776720826368", + "expectedQty": "1129766286341741027837932", + "swapFee": "668497026900466032495", + "reserves": [ + "5218909660818540814179977", + "22039313642007518670992918", + "43978259806415411026603065" + ], + "mAssetSupply": "70919000593265283584000668" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "21480131331342212", + "expectedQty": "21528002061194412", + "swapFee": "12888078798805", + "reserves": [ + "5218909660818540814179977", + "22039313620479516609798506", + "43978259806415411026603065" + ], + "mAssetSupply": "70919000571798040331457261" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "793700693203129666109440", + "expectedQty": "733255122950305464824936", + "swapFee": "476220415921877799665", + "reserves": [ + "4485654537868235349355041", + "22039313620479516609798506", + "43978259806415411026603065" + ], + "mAssetSupply": "70125776099010832543147486" + }, + { + "type": "mintMulti", + "inputQtys": [ + "1353111198633068331008", + "128244565408057917440", + "1520004158293082898432" + ], + "expectedQty": "3104349586515563105879", + "reserves": [ + "4487007649066868417686049", + "22039441865044924667715946", + "43979779810573704109501497" + ], + "mAssetSupply": "70128880448597348106253365" + }, + { + "type": "redeemMasset", + "inputQty": "4718448952980531471974", + "expectedQtys": [ + "301806686395139856221", + "1482424689129029485985", + "2958183415572624583878" + ], + "redemptionFee": "1415534685894159441", + "reserves": [ + "4486705842380473277829828", + "22037959440355795638229961", + "43976821627158131484917619" + ], + "mAssetSupply": "70124163415179053468940832" + }, + { + "type": "redeemMasset", + "inputQty": "118405273199907208744140", + "expectedQtys": [ + "7573569940520812298689", + "37200127004390733313425", + "74232977613344217426826" + ], + "redemptionFee": "35521581959972162623", + "reserves": [ + "4479132272439952465531139", + "22000759313351404904916536", + "43902588649544787267490793" + ], + "mAssetSupply": "70005793663561106232359315" + }, + { + "type": "redeemMasset", + "inputQty": "323761600448504161894", + "expectedQtys": [ + "20708800028794851488", + "101718211785170740079", + "202979031158327999815" + ], + "redemptionFee": "97128480134551248", + "reserves": [ + "4479111563639923670679651", + "22000657595139619734176457", + "43902385670513628939490978" + ], + "mAssetSupply": "70005469999089137862748669" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "3442112735852793", + "outputIndex": 2, + "expectedQty": "3828886288518906", + "swapFee": "2261107148032", + "reserves": [ + "4479111567082036406532444", + "22000657595139619734176457", + "43902385666684742650972072" + ], + "mAssetSupply": "70005469999091398969896701", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "2239704488277874338430976", + "expectedQty": "2201881077434556874979682", + "reserves": [ + "4479111567082036406532444", + "22000657595139619734176457", + "46142090154962616989403048" + ] + }, + { + "type": "redeemMasset", + "inputQty": "18080488048050369331", + "expectedQtys": [ + "1121218637583896936", + "5507241104700186759", + "11550364549754689986" + ], + "redemptionFee": "5424146414415110", + "reserves": [ + "4479110445863398822635508", + "22000652087898515033989698", + "46142078604598067234713062" + ], + "mAssetSupply": "72207333001462054208922162" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "1120951612706660447944704", + "expectedQty": "1139825076727201991938846", + "swapFee": "672570967623996268766", + "reserves": [ + "4479110445863398822635508", + "22000652087898515033989698", + "45002253527870865242774216" + ], + "mAssetSupply": "71087053959723017757246224" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "13754296242884239687680", + "outputIndex": 2, + "expectedQty": "15356973068247264102152", + "swapFee": "9064595045214777305", + "reserves": [ + "4492864742106283062323188", + "22000652087898515033989698", + "44986896554802617978672064" + ], + "mAssetSupply": "71087063024318062972023529", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemMasset", + "inputQty": "509233920404952", + "expectedQtys": [ + "32175091408003", + "157554930450006", + "322168057998257" + ], + "redemptionFee": "152770176121", + "reserves": [ + "4492864742074107970915185", + "22000652087740960103539692", + "44986896554480449920673807" + ], + "mAssetSupply": "71087063023808981821794698" + }, + { + "type": "redeemMasset", + "inputQty": "68763509145070836121", + "expectedQtys": [ + "4344707026818683483", + "21275153650869605874", + "43503398565429700883" + ], + "redemptionFee": "20629052743521250", + "reserves": [ + "4492860397367081152231702", + "22000630812587309233933818", + "44986853051081884490972924" + ], + "mAssetSupply": "71086994280928889494479827" + }, + { + "type": "mintMulti", + "inputQtys": [ + "2338152741593655", + "4626147247633196", + "3359738497153161" + ], + "expectedQty": "10480554273005700", + "reserves": [ + "4492860399705233893825357", + "22000630817213456481567014", + "44986853054441622988126085" + ], + "mAssetSupply": "71086994291409443767485527" + }, + { + "type": "redeemMasset", + "inputQty": "586567878178518964633", + "expectedQtys": [ + "37061307874825799030", + "181481746508443239593", + "371093571364824551294" + ], + "redemptionFee": "175970363453555689", + "reserves": [ + "4492823338397359068026327", + "22000449335466948038327421", + "44986481960870258163574791" + ], + "mAssetSupply": "71086407899501628702076583" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "156997218663971749888", + "outputIndex": 2, + "expectedQty": "175233860465362463736", + "swapFee": "103433847510472218", + "reserves": [ + "4492980335616023039776215", + "22000449335466948038327421", + "44986306727009792801111055" + ], + "mAssetSupply": "71086408002935476212548801", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "3073479162330718666752", + "expectedQty": "3124183454192444327216", + "swapFee": "1844087497398431200", + "reserves": [ + "4492980335616023039776215", + "22000449335466948038327421", + "44983182543555600356783839" + ], + "mAssetSupply": "71083336367860642892313249" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "396078260564571545665536", + "545498514907376505585664", + "22870761626336596328448" + ], + "expectedQty": "1004380905101859735886224", + "swapFee": "602990337263473925887", + "reserves": [ + "4096902075051451494110679", + "21454950820559571532741757", + "44960311781929263760455391" + ], + "mAssetSupply": "70078955462758783156427025" + }, + { + "type": "mintMulti", + "inputQtys": [ + "46471849486841192", + "58682482936594968", + "35287142244199940" + ], + "expectedQty": "144980561795936838", + "reserves": [ + "4096902121523300980951871", + "21454950879242054469336725", + "44960311817216406004655331" + ], + "mAssetSupply": "70078955607739344952363863" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "127199660380933914624", + "144405138572741361664", + "154874631818841620480" + ], + "expectedQty": "437886021828795680401", + "swapFee": "262889346705300588", + "reserves": [ + "4096774921862920047037247", + "21454806474103481727975061", + "44960156942584587163034851" + ], + "mAssetSupply": "70078517721717516156683462" + }, + { + "type": "mintMulti", + "inputQtys": [ + "1368075320015637549416448", + "578335584870777810321408", + "985531744413221170184192" + ], + "expectedQty": "3036804706842682385283414", + "reserves": [ + "5464850241878557596453695", + "22033142058974259538296469", + "45945688686997808333219043" + ], + "mAssetSupply": "73115322428560198541966876" + }, + { + "type": "redeemMasset", + "inputQty": "2190147636575984", + "expectedQtys": [ + "163648846717875", + "659798188043814", + "1375876489288956" + ], + "redemptionFee": "657044290972", + "reserves": [ + "5464850241714908749735820", + "22033142058314461350252655", + "45945688685621931843930087" + ], + "mAssetSupply": "73115322426370707949681864" + }, + { + "type": "mintMulti", + "inputQtys": [ + "15006609892118030712832", + "14249942981586540560384", + "46697813453840362504192" + ], + "expectedQty": "76290173632230074849127", + "reserves": [ + "5479856851607026780448652", + "22047392001296047890813039", + "45992386499075772206434279" + ], + "mAssetSupply": "73191612600002938024530991" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "45893139380401407524864", + "19828335250662683049984", + "12522370229326049181696" + ], + "expectedQty": "81208370272223425939443", + "swapFee": "48754274728170958138", + "reserves": [ + "5433963712226625372923788", + "22027563666045385207763055", + "45979864128846446157252583" + ], + "mAssetSupply": "73110404229730714598591548" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "2284342765350533751373824", + "expectedQty": "2250278205120400776429672", + "reserves": [ + "5433963712226625372923788", + "22027563666045385207763055", + "48264206894196979908626407" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "971877450913366010757120", + "20242835012520287141888", + "911936307909721535283200" + ], + "expectedQty": "1976799328154910756967770", + "swapFee": "1186791671896084104643", + "reserves": [ + "4462086261313259362166668", + "22007320831032864920621167", + "47352270586287258373343207" + ], + "mAssetSupply": "73383883106696204618053450" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "290260619835248551657472", + "expectedQty": "284996726757957288058409", + "reserves": [ + "4462086261313259362166668", + "22007320831032864920621167", + "47642531206122506925000679" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "55778811997058209153024", + "138483615957947277901824", + "72950940331281758552064" + ], + "expectedQty": "271526645960891454097328", + "reserves": [ + "4517865073310317571319692", + "22145804446990812198522991", + "47715482146453788683552743" + ], + "mAssetSupply": "73940406479415053360209187" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "339743175641351078281216", + "119842868717076929839104", + "367116554648397350436864" + ], + "expectedQty": "858475637606321989464399", + "swapFee": "515394619335394430336", + "reserves": [ + "4178121897668966493038476", + "22025961578273735268683887", + "47348365591805391333115879" + ], + "mAssetSupply": "73081930841808731370744788" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "52493593699002687488", + "expectedQty": "53489453312869060131", + "swapFee": "31496156219401612", + "reserves": [ + "4178121897668966493038476", + "22025961578273735268683887", + "47348312102352078464055748" + ], + "mAssetSupply": "73081878379711188587458912" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "30101224286656290357248", + "26536823430528523829248", + "16814184452623377104896" + ], + "expectedQty": "76762419483629992714537", + "swapFee": "46085102751829093084", + "reserves": [ + "4148020673382310202681228", + "21999424754843206744854639", + "47331497917899455086950852" + ], + "mAssetSupply": "73005115960227558594744375" + }, + { + "type": "redeemMasset", + "inputQty": "7670069265503218145689", + "expectedQtys": [ + "435668936066691039809", + "2310611911489476497429", + "4971253753062839842486" + ], + "redemptionFee": "2301020779650965443", + "reserves": [ + "4147585004446243511641419", + "21997114142931717268357210", + "47326526664146392247108366" + ], + "mAssetSupply": "72997448191982835027564129" + }, + { + "type": "redeemMasset", + "inputQty": "51703468117723973681152", + "expectedQtys": [ + "2936817669576680734709", + "15575693668822614549277", + "33510917702219327468696" + ], + "redemptionFee": "15511040435317192104", + "reserves": [ + "4144648186776666830906710", + "21981538449262894653807933", + "47293015746444172919639670" + ], + "mAssetSupply": "72945760234905546371075081" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "917770498801961856", + "expectedQty": "920368511120266209", + "swapFee": "550662299281177", + "reserves": [ + "4144648186776666830906710", + "21981537528894383533541724", + "47293015746444172919639670" + ], + "mAssetSupply": "72945759317685709868394402" + }, + { + "type": "redeemMasset", + "inputQty": "11144727892147907788", + "expectedQtys": [ + "633033631966586820", + "3357354330464346382", + "7223307787652699054" + ], + "redemptionFee": "3343418367644372", + "reserves": [ + "4144647553743034864319890", + "21981534171540053069195342", + "47293008523136385266940616" + ], + "mAssetSupply": "72945748176301236088130986" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "58668518961640120320", + "outputIndex": 0, + "expectedQty": "51960796363780371962", + "swapFee": "35080683847380094", + "reserves": [ + "4144595592946671083947928", + "21981592840059014709315662", + "47293008523136385266940616" + ], + "mAssetSupply": "72945748211381919935511080", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "1309204706948583260160", + "outputIndex": 1, + "expectedQty": "1476386950880765367755", + "swapFee": "883334012279597576", + "reserves": [ + "4145904797653619667208088", + "21980116453108133943947907", + "47293008523136385266940616" + ], + "mAssetSupply": "72945749094715932215108656", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemMasset", + "inputQty": "268575655877168992564019", + "expectedQtys": [ + "15260040061535091552041", + "80903318817515221938422", + "174073752272851273058643" + ], + "redemptionFee": "80572696763150697769", + "reserves": [ + "4130644757592084575656047", + "21899213134290618722009485", + "47118934770863533993881973" + ], + "mAssetSupply": "72677254011535526373242406" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "5335815161665021804544", + "outputIndex": 1, + "expectedQty": "6016058097733808196125", + "swapFee": "3599499086625995819", + "reserves": [ + "4135980572753749597460591", + "21893197076192884913813360", + "47118934770863533993881973" + ], + "mAssetSupply": "72677257611034612999238225", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mintMulti", + "inputQtys": [ + "2907904176159023104", + "2487761442590561280", + "4612054598190208000" + ], + "expectedQty": "10271225534081574677", + "reserves": [ + "4135983480657925756483695", + "21893199563954327504374640", + "47118939382918132184089973" + ], + "mAssetSupply": "72677267882260147080812902" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "113399455492110057472", + "633399409612158271488", + "380427881651011584000" + ], + "expectedQty": "1131804353759120832007", + "swapFee": "679490306439336100", + "reserves": [ + "4135870081202433646426223", + "21892566164544715346103152", + "47118558955036481172505973" + ], + "mAssetSupply": "72676136077906387959980895" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "4016800574503440034562048", + "hardLimitError": true + }, + { + "type": "mintMulti", + "inputQtys": [ + "2408846120370967552", + "2361224136871288320", + "1699509404272240640" + ], + "expectedQty": "6727804147799454975", + "reserves": [ + "4135872490048554017393775", + "21892568525768852217391472", + "47118560654545885444746613" + ], + "mAssetSupply": "72676142805710535759435870" + }, + { + "type": "redeemMasset", + "inputQty": "124719476041811283148", + "expectedQtys": [ + "7095438514922091776", + "37558550047679988899", + "80835869780896619439" + ], + "redemptionFee": "37415842812543384", + "reserves": [ + "4135865394610039095301999", + "21892530967218804537402573", + "47118479818676104548127174" + ], + "mAssetSupply": "72676018123650336760696106" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "995169784551392149504", + "outputIndex": 0, + "expectedQty": "881693973735878790765", + "swapFee": "595069527306456048", + "reserves": [ + "4134983700636303216511234", + "21893526137003355929552077", + "47118479818676104548127174" + ], + "mAssetSupply": "72676018718719864067152154", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemBassets", + "inputQtys": [ + "357857081204180160", + "499014516723587968", + "211477448149350560" + ], + "expectedQty": "1107015097127949654", + "swapFee": "664607822970552", + "reserves": [ + "4134983342779222012331074", + "21893525637988839205964109", + "47118479607198656398776614" + ], + "mAssetSupply": "72676017611704766939202500" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "838097948592775352025088", + "130712512570756167630848", + "71774378265441137065984" + ], + "hardLimitError": true + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "72889160963241562603520", + "expectedQty": "74278579745096779321007", + "swapFee": "43733496577944937562", + "reserves": [ + "4134983342779222012331074", + "21893525637988839205964109", + "47044201027453559619455607" + ], + "mAssetSupply": "72603172184238103321536542" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "4410924534294865408", + "6606393037831902208", + "522984083813206720" + ], + "expectedQty": "12054036057301674696", + "swapFee": "7236763692596562", + "reserves": [ + "4134978931854687717465666", + "21893519031595801374061901", + "47044200504469475806248887" + ], + "mAssetSupply": "72603160130202046019861846" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "498013869395359498240", + "expectedQty": "507497057486106833832", + "swapFee": "298808321637215698", + "reserves": [ + "4134978931854687717465666", + "21893519031595801374061901", + "47043693007411989699415055" + ], + "mAssetSupply": "72602662415140972297579304" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "187776648107207610597376", + "expectedQty": "187117022410823977260919", + "reserves": [ + "4134978931854687717465666", + "22081295679703008984659277", + "47043693007411989699415055" + ] + }, + { + "type": "redeemMasset", + "inputQty": "2315819367333281084211", + "expectedQtys": [ + "131515600247544520365", + "702309468420214671225", + "1496254183078973134878" + ], + "redemptionFee": "694745810199984325", + "reserves": [ + "4134847416254440172945301", + "22080593370234588769988052", + "47042196753228910726280177" + ], + "mAssetSupply": "72787464312930273193740337" + }, + { + "type": "mintMulti", + "inputQtys": [ + "5156562773675787419648", + "36495861355872329400320", + "2116391735920857972736" + ], + "expectedQty": "44236225277789366476679", + "reserves": [ + "4140003979028115960364949", + "22117089231590461099388372", + "47044313144964831584252913" + ], + "mAssetSupply": "72831700538208062560217016" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "836809573452350464", + "expectedQty": "852670572716945595", + "swapFee": "502085744071410", + "reserves": [ + "4140003979028115960364949", + "22117089231590461099388372", + "47044312292294258867307318" + ], + "mAssetSupply": "72831699701900574851937962" + }, + { + "type": "redeemMasset", + "inputQty": "1170121192730945536", + "expectedQtys": [ + "66493753705527040", + "355228712701329715", + "755591765287158085" + ], + "redemptionFee": "351036357819283", + "reserves": [ + "4140003912534362254837909", + "22117088876361748398058657", + "47044311536702493580149233" + ], + "mAssetSupply": "72831698532130418478811709" + }, + { + "type": "redeemMasset", + "inputQty": "14740841943605583872", + "expectedQtys": [ + "837668713035257999", + "4475066634371107696", + "9518722381220028287" + ], + "redemptionFee": "4422252583081675", + "reserves": [ + "4140003074865649219579910", + "22117084401295114026950961", + "47044302017980112360120946" + ], + "mAssetSupply": "72831683795710727456309512" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "3257682101766121429401600", + "outputIndex": 1, + "expectedQty": "3481224070121331804534764", + "swapFee": "2091575432441334396483", + "reserves": [ + "7397685176631770648981510", + "18635860331173782222416197", + "47044302017980112360120946" + ], + "mAssetSupply": "72833775371143168790705995", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "335036735657015989239808", + "expectedQty": "347141743055806233136579", + "reserves": [ + "7732721912288786638221318", + "18635860331173782222416197", + "47044302017980112360120946" + ] + }, + { + "type": "redeemMasset", + "inputQty": "231479878101737801567436", + "expectedQtys": [ + "24452174219149734797569", + "58929741520567004517533", + "148762037741696388340517" + ], + "redemptionFee": "69443963430521340470", + "reserves": [ + "7708269738069636903423749", + "18576930589653215217898664", + "46895539980238415971780429" + ], + "mAssetSupply": "72949506680060667743615608" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "31559711919983484928", + "expectedQty": "31468564208899789279", + "swapFee": "18935827151990090", + "reserves": [ + "7708269738069636903423749", + "18576899121089006318109385", + "46895539980238415971780429" + ], + "mAssetSupply": "72949475139284574912120770" + }, + { + "type": "redeemMasset", + "inputQty": "78546374856721458790", + "expectedQtys": [ + "8297181113286525319", + "19996173170962311180", + "50478356601834342998" + ], + "redemptionFee": "23563912457016437", + "reserves": [ + "7708261440888523616898430", + "18576879124915835355798205", + "46895489501881814137437431" + ], + "mAssetSupply": "72949396616473630647678417" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "1270614052006623744", + "expectedQty": "1227445804177955739", + "swapFee": "762368431203974", + "reserves": [ + "7708260213442719438942691", + "18576879124915835355798205", + "46895489501881814137437431" + ], + "mAssetSupply": "72949395346621947072258647" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "37867052413907036536832", + "29930071990299762098176", + "3175866388014576959488" + ], + "expectedQty": "72319665796605325820128", + "swapFee": "43417850188076041116", + "reserves": [ + "7670393161028812402405859", + "18546949052925535593700029", + "46892313635493799560477943" + ], + "mAssetSupply": "72877075680825341746438519" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "3366583926797903593472", + "20824871832671869730816", + "20113511928520954085376" + ], + "expectedQty": "44237645084361148099749", + "swapFee": "26558522163915037882", + "reserves": [ + "7667026577102014498812387", + "18526124181092863723969213", + "46872200123565278606392567" + ], + "mAssetSupply": "72832838035740980598338770" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "1384530072144322345566208", + "expectedQty": "1386910299438266200444658", + "reserves": [ + "7667026577102014498812387", + "19910654253237186069535421", + "46872200123565278606392567" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "2797945251149055000576", + "6184212469580908462080", + "1136234471761340399616" + ], + "expectedQty": "10211907780637794877817", + "reserves": [ + "7669824522353163553812963", + "19916838465706766977997501", + "46873336358037039946792183" + ], + "mAssetSupply": "74229960242959884593661245" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "666848999906182363611136", + "outputIndex": 2, + "expectedQty": "695279418395721429953826", + "swapFee": "413133683585206492471", + "reserves": [ + "8336673522259345917424099", + "19916838465706766977997501", + "46178056939641318516838357" + ], + "mAssetSupply": "74230373376643469800153716", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mintMulti", + "inputQtys": [ + "1107205637732654263566336", + "1405056659468917332246528", + "135167133118624987873280" + ], + "expectedQty": "2676324157595813927806426", + "reserves": [ + "9443879159992000180990435", + "21321895125175684310244029", + "46313224072759943504711637" + ], + "mAssetSupply": "76906697534239283727960142" + }, + { + "type": "redeemMasset", + "inputQty": "1852385661490936217", + "expectedQtys": [ + "227398377431729453", + "513408131668486932", + "1115172253833311989" + ], + "redemptionFee": "555715698447280", + "reserves": [ + "9443878932593622749260982", + "21321894611767552641757097", + "46313222957587689671399648" + ], + "mAssetSupply": "76906695682409337935471205" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "114426927454488734203904", + "expectedQty": "115372880064221090802548", + "swapFee": "68656156472693240522", + "reserves": [ + "9443878932593622749260982", + "21321894611767552641757097", + "46197850077523468580597100" + ], + "mAssetSupply": "76792337411111321894507823" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "858491662214722152824832", + "expectedQty": "865475392798287176593978", + "swapFee": "515094997328833291694", + "reserves": [ + "9443878932593622749260982", + "21321894611767552641757097", + "45332374684725181404003122" + ], + "mAssetSupply": "75934360843893928574974685" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "149296163010966618112", + "176565234785097121792", + "267417097370324140032" + ], + "expectedQty": "594433492638555018569", + "swapFee": "356874220115202132", + "reserves": [ + "9443729636430611782642870", + "21321718046532767544635305", + "45332107267627811079863090" + ], + "mAssetSupply": "75933766410401290019956116" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "7947264119083775882690560", + "expectedQty": "7912163246512128043574011", + "swapFee": "4768358471450265529614", + "reserves": [ + "9443729636430611782642870", + "13409554800020639501061294", + "45332107267627811079863090" + ], + "mAssetSupply": "67991270649788964402795170" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "27506352231292210249728", + "10340025808441042796544", + "46050116162062575992832" + ], + "expectedQty": "84037107077087819661714", + "swapFee": "50452535767713319788", + "reserves": [ + "9416223284199319572393142", + "13399214774212198458264750", + "45286057151465748503870258" + ], + "mAssetSupply": "67907233542711876583133456" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "8687239154477011463831552", + "outputIndex": 2, + "expectedQty": "8776695494532265946658294", + "swapFee": "5230665322102316085873", + "reserves": [ + "9416223284199319572393142", + "22086453928689209922096302", + "36509361656933482557211964" + ], + "mAssetSupply": "67912464208033978899219329", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemBassets", + "inputQtys": [ + "10539572635368482816", + "10134672342121990144", + "2186763640468856064" + ], + "expectedQty": "23006479825301035512", + "swapFee": "13812175200300801", + "reserves": [ + "9416212744626684203910326", + "22086443794016867800106158", + "36509359470169842088355900" + ], + "mAssetSupply": "67912441201554153598183817" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "1536039239032122900480", + "expectedQty": "1536857635361967629978", + "swapFee": "921623543419273740", + "reserves": [ + "9416212744626684203910326", + "22084906936381505832476180", + "36509359470169842088355900" + ], + "mAssetSupply": "67910906083938664894557077" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "1317291440914615819567104", + "expectedQty": "1317642220613768607160516", + "swapFee": "790374864548769491740", + "reserves": [ + "9416212744626684203910326", + "20767264715767737225315664", + "36509359470169842088355900" + ], + "mAssetSupply": "66594405017888597844481713" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "1618164239760561119690752", + "expectedQty": "1617546981610011638951065", + "swapFee": "970898543856336671814", + "reserves": [ + "9416212744626684203910326", + "19149717734157725586364599", + "36509359470169842088355900" + ], + "mAssetSupply": "64977211676671893061462775" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "3107025460560275968", + "expectedQty": "3153623276842057488", + "reserves": [ + "9416215851652144764186294", + "19149717734157725586364599", + "36509359470169842088355900" + ] + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "182029033395714737045504", + "expectedQty": "181879733161717771540631", + "swapFee": "109217420037428842227", + "reserves": [ + "9416215851652144764186294", + "18967838000996007814823968", + "36509359470169842088355900" + ], + "mAssetSupply": "64795295014319492595316986" + }, + { + "type": "mintMulti", + "inputQtys": [ + "277518090336872920252416", + "419045085936940901990400", + "204019037020531913129984" + ], + "expectedQty": "903393768992718805901779", + "reserves": [ + "9693733941989017684438710", + "19386883086932948716814368", + "36713378507190374001485884" + ], + "mAssetSupply": "65698688783312211401218765" + }, + { + "type": "redeemMasset", + "inputQty": "9235672122754723951411", + "expectedQtys": [ + "1362299484912444190006", + "2724516785940116275334", + "5159478992207490971063" + ], + "redemptionFee": "2770701636826417185", + "reserves": [ + "9692371642504105240248704", + "19384158570147008600539034", + "36708219028198166510514821" + ], + "mAssetSupply": "65689455881891093503684539" + }, + { + "type": "redeemMasset", + "inputQty": "111848445236216512", + "expectedQtys": [ + "16498104015423594", + "32995212744352276", + "62483779830763799" + ], + "redemptionFee": "33554533570864", + "reserves": [ + "9692371626006001224825110", + "19384158537151795856186758", + "36708218965714386679751022" + ], + "mAssetSupply": "65689455770076202801038891" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "2435129829055552028672", + "2183120329163588763648", + "297451093771793661952" + ], + "expectedQty": "4949068946694079948675", + "swapFee": "2971224102477934730", + "reserves": [ + "9689936496176945672796438", + "19381975416822632267423110", + "36707921514620614886089070" + ], + "mAssetSupply": "65684506701129508721090216" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "16353573840073755983872", + "outputIndex": 1, + "expectedQty": "16574158062350668364543", + "swapFee": "9952464878959010623", + "reserves": [ + "9706290070017019428780310", + "19365401258760281599058567", + "36707921514620614886089070" + ], + "mAssetSupply": "65684516653594387680100839", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "14016741562162394991427584", + "hardLimitError": true + }, + { + "type": "redeemMasset", + "inputQty": "18959445792907172249", + "expectedQtys": [ + "2800822507971119905", + "5588031197313367451", + "10592344969843505343" + ], + "redemptionFee": "5687833737872151", + "reserves": [ + "9706287269194511457660405", + "19365395670729084285691116", + "36707910922275645042583727" + ], + "mAssetSupply": "65684497699836428510800741" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "91573349071464336", + "expectedQty": "90230880571375164", + "swapFee": "54944009442878", + "reserves": [ + "9706287178963630886285241", + "19365395670729084285691116", + "36707910922275645042583727" + ], + "mAssetSupply": "65684497608318023448779283" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "1253353017152645164433408", + "outputIndex": 0, + "expectedQty": "1231577879639112390082659", + "swapFee": "751940643295706967457", + "reserves": [ + "8474709299324518496202582", + "20618748687881729450124524", + "36707910922275645042583727" + ], + "mAssetSupply": "65685249548961319155746740", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "2932149675766878136434688", + "expectedQty": "2846275493623424328877079", + "swapFee": "1759289805460126881860", + "reserves": [ + "5628433805701094167325503", + "20618748687881729450124524", + "36707910922275645042583727" + ], + "mAssetSupply": "62754859162999901146193912" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "10518275004740", + "expectedQty": "10986457370651", + "reserves": [ + "5628433805711612442330243", + "20618748687881729450124524", + "36707910922275645042583727" + ] + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "675332102130216351039488", + "expectedQty": "676734795644107336969458", + "swapFee": "405199261278129810623", + "reserves": [ + "5628433805711612442330243", + "19942013892237622113155066", + "36707910922275645042583727" + ], + "mAssetSupply": "62079932260141949382335698" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "1835926196444438777036800", + "expectedQty": "1854169007746898292275723", + "swapFee": "1101555717866663266222", + "reserves": [ + "5628433805711612442330243", + "19942013892237622113155066", + "34853741914528746750308004" + ], + "mAssetSupply": "60245107619415377268565120" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "1621059887294570685267968", + "2782692324035274762878976", + "2377082678350156614598656" + ], + "expectedQty": "6828440861227368563254691", + "swapFee": "4099524231275186249702", + "reserves": [ + "4007373918417041757062275", + "17159321568202347350276090", + "32476659236178590135709348" + ], + "mAssetSupply": "53416666758188008705310429" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "7116113504356776542208", + "expectedQty": "7589222339881248151932", + "reserves": [ + "4014490031921398533604483", + "17159321568202347350276090", + "32476659236178590135709348" + ] + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "19402690898878892343296", + "expectedQty": "19337454226764779458789", + "reserves": [ + "4014490031921398533604483", + "17178724259101226242619386", + "32476659236178590135709348" + ] + }, + { + "type": "redeemMasset", + "inputQty": "113825018339995304538931", + "expectedQtys": [ + "8547559909990282870958", + "36576544869783384791656", + "69148556426907809218344" + ], + "redemptionFee": "34147505501998591361", + "reserves": [ + "4005942472011408250733525", + "17142147714231442857827730", + "32407510679751682326491004" + ], + "mAssetSupply": "53329802563920161426973580" + }, + { + "type": "mintMulti", + "inputQtys": [ + "35910208446971439480832", + "14498873954909938515968", + "19439089595798725328896" + ], + "expectedQty": "71905396488695295911240", + "reserves": [ + "4041852680458379690214357", + "17156646588186352796343698", + "32426949769347481051819900" + ], + "mAssetSupply": "53401707960408856722884820" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "3003687295685668372480", + "expectedQty": "3011886532813641572233", + "swapFee": "1802212377411401023", + "reserves": [ + "4041852680458379690214357", + "17153634701653539154771465", + "32426949769347481051819900" + ], + "mAssetSupply": "53398706075325548465913363" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "7533769864101458083840", + "expectedQty": "7433665575527133126476", + "reserves": [ + "4041852680458379690214357", + "17153634701653539154771465", + "32434483539211582509903740" + ] + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "15900248887672541544448", + "expectedQty": "15688878336565857909047", + "reserves": [ + "4041852680458379690214357", + "17153634701653539154771465", + "32450383788099255051448188" + ] + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "3504994609661466898333696", + "outputIndex": 1, + "expectedQty": "3454408711455262903518983", + "swapFee": "2073079866193405274702", + "reserves": [ + "4041852680458379690214357", + "13699225990198276251252482", + "35955378397760721949781884" + ], + "mAssetSupply": "53423901699103834862223588", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemBassets", + "inputQtys": [ + "45244602540339077120", + "5670801714989889536", + "33651395066699694080" + ], + "expectedQty": "87337150042266607915", + "swapFee": "52433750275525279", + "reserves": [ + "4041807435855839351137237", + "13699220319396561261362946", + "35955344746365655250087804" + ], + "mAssetSupply": "53423814361953792595615673" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "812612581388082556698624", + "179495557844603907342336", + "2136352997549624925356032" + ], + "expectedQty": "3161015369608475036200906", + "swapFee": "1897747870487377448189", + "reserves": [ + "3229194854467756794438613", + "13519724761551957354020610", + "33818991748816030324731772" + ], + "mAssetSupply": "50262798992345317559414767" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "17483257744872855552", + "440457733105652531200", + "249305290245129895936" + ], + "expectedQty": "704446217298519219226", + "swapFee": "422921483269072975", + "reserves": [ + "3229177371210011921583061", + "13519284303818851701489410", + "33818742443525785194835836" + ], + "mAssetSupply": "50262094546128019040195541" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "4528240908679556628480", + "expectedQty": "4442877219725178679406", + "reserves": [ + "3229177371210011921583061", + "13519284303818851701489410", + "33823270684434464751464316" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "643842192661514944512", + "4580715871711500173312", + "5973399770051465183232" + ], + "expectedQty": "11152144696855978578007", + "reserves": [ + "3229821213402673436527573", + "13523865019690563201662722", + "33829244084204516216647548" + ], + "mAssetSupply": "50277689568044600197452954" + }, + { + "type": "redeemMasset", + "inputQty": "1912664556230739558", + "expectedQtys": [ + "122832042234399905", + "514320716074834786", + "1286546487733026795" + ], + "redemptionFee": "573799366869221", + "reserves": [ + "3229821090570631202127668", + "13523864505369847126827936", + "33829242797658028483620753" + ], + "mAssetSupply": "50277687655953843333582617" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "144137474475318542336", + "expectedQty": "144176505888514790041", + "reserves": [ + "3229821090570631202127668", + "13524008642844322445370272", + "33829242797658028483620753" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "16407584422493232824320", + "19469947102538303012864", + "7022289279086304952320" + ], + "expectedQty": "44435660604616596917684", + "reserves": [ + "3246228674993124434951988", + "13543478589946860748383136", + "33836265086937114788573073" + ], + "mAssetSupply": "50322267493064348445290342" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "39246526774856411774976", + "expectedQty": "39972196835175067698258", + "swapFee": "23547916064913847064", + "reserves": [ + "3246228674993124434951988", + "13543478589946860748383136", + "33796292890101939720874815" + ], + "mAssetSupply": "50283044514205556947362430" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "2848768235091055953838080", + "outputIndex": 0, + "hardLimitError": true + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "148444446714205468360704", + "expectedQty": "148461950420084925438057", + "reserves": [ + "3246228674993124434951988", + "13691923036661066216743840", + "33796292890101939720874815" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "10675476726561445511168", + "4680265661373556457472", + "14362248169029044797440" + ], + "expectedQty": "30524112430837499618013", + "reserves": [ + "3256904151719685880463156", + "13696603302322439773201312", + "33810655138270968765672255" + ], + "mAssetSupply": "50462030577056479372418500" + }, + { + "type": "mintMulti", + "inputQtys": [ + "2776744202435102208", + "5410184601111307264", + "5724386147100224512" + ], + "expectedQty": "14083359960361108484", + "reserves": [ + "3256906928463888315565364", + "13696608712507040884508576", + "33810660862657115865896767" + ], + "mAssetSupply": "50462044660416439733526984" + }, + { + "type": "mintMulti", + "inputQtys": [ + "1001474426536274966872064", + "1045191009953813020803072", + "571069596605137287118848" + ], + "expectedQty": "2687141249603857412204608", + "reserves": [ + "4258381355000163282437428", + "14741799722460853905311648", + "34381730459262253153015615" + ], + "mAssetSupply": "53149185910020297145731592" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "142006750929772110413824", + "expectedQty": "139954416174737862658441", + "reserves": [ + "4258381355000163282437428", + "14741799722460853905311648", + "34523737210192025263429439" + ] + }, + { + "type": "redeemMasset", + "inputQty": "125860984741883447502438", + "expectedQtys": [ + "10054642995660989244636", + "34807482225337814183004", + "81515445326874581518034" + ], + "redemptionFee": "37758295422565034250", + "reserves": [ + "4248326712004502293192792", + "14706992240235516091128644", + "34442221764865150681911405" + ], + "mAssetSupply": "53163317099748574125921845" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "10343176699996146", + "4713148132695783", + "10452165146851358" + ], + "expectedQty": "26001656321071200", + "swapFee": "15610360008647", + "reserves": [ + "4248326701661325593196646", + "14706992235522367958432861", + "34442221754412985535060047" + ], + "mAssetSupply": "53163317073746917804850645" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "790003030830094483456", + "outputIndex": 1, + "expectedQty": "778078100717442580518", + "swapFee": "467132477288036203", + "reserves": [ + "4248326701661325593196646", + "14706214157421650515852343", + "34443011757443815629543503" + ], + "mAssetSupply": "53163317540879395092886848", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemBassets", + "inputQtys": [ + "3397349129503", + "3514881268491", + "3259114111098" + ], + "expectedQty": "10335882233638", + "swapFee": "6205252491", + "reserves": [ + "4248326701657928244067143", + "14706214157418135634583852", + "34443011757440556515432405" + ], + "mAssetSupply": "53163317540869059210653210" + }, + { + "type": "mintMulti", + "inputQtys": [ + "303515763225737220325376", + "274289548399313980227584", + "173554966112223946080256" + ], + "expectedQty": "766713188015923306408454", + "reserves": [ + "4551842464883665464392519", + "14980503705817449614811436", + "34616566723552780461512661" + ], + "mAssetSupply": "53930030728884982517061664" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "632780983232328237056", + "expectedQty": "632374355802837377621", + "swapFee": "379668589939396942", + "reserves": [ + "4551842464883665464392519", + "14979871331461646777433815", + "34616566723552780461512661" + ], + "mAssetSupply": "53929398327570340128221550" + }, + { + "type": "redeemMasset", + "inputQty": "3957965315065606307840", + "expectedQtys": [ + "333966822249266749750", + "1099067040405362113376", + "2539803359855535017755" + ], + "redemptionFee": "1187389594519681892", + "reserves": [ + "4551508498061416197642769", + "14978772264421241415320439", + "34614026920192924926494906" + ], + "mAssetSupply": "53925441549644869041595602" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "1933004963222338816", + "expectedQty": "1906747484836550204", + "reserves": [ + "4551508498061416197642769", + "14978772264421241415320439", + "34614028853197888148833722" + ] + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "784632945598953816064", + "expectedQty": "743221880633136166550", + "swapFee": "470779767359372289", + "reserves": [ + "4550765276180783061476219", + "14978772264421241415320439", + "34614028853197888148833722" + ], + "mAssetSupply": "53924659294226522283702031" + }, + { + "type": "redeemMasset", + "inputQty": "104328051266587669299200", + "expectedQtys": [ + "8801725361007549573528", + "28970740461296317305620", + "66947679591052569319995" + ], + "redemptionFee": "31298415379976300789", + "reserves": [ + "4541963550819775511902691", + "14949801523959945098014819", + "34547081173606835579513727" + ], + "mAssetSupply": "53820362541375314590703620" + }, + { + "type": "redeemMasset", + "inputQty": "5522030018354734117683", + "expectedQtys": [ + "465870789943180666377", + "1533406370952478647279", + "3543506198695610822769" + ], + "redemptionFee": "1656609005506420235", + "reserves": [ + "4541497680029832331236314", + "14948268117588992619367540", + "34543537667408139968690958" + ], + "mAssetSupply": "53814842167965965363006172" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "2617763908875586918940672", + "2705353045062702757576704", + "764398958632679388479488" + ], + "hardLimitError": true + }, + { + "type": "mintMulti", + "inputQtys": [ + "1725822595113384411136", + "3281803797501706764288", + "3111069027222276800512" + ], + "expectedQty": "8171629325849360295010", + "reserves": [ + "4543223502624945715647450", + "14951549921386494326131828", + "34546648736435362245491470" + ], + "mAssetSupply": "53823013797291814723301182" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "17180416593076", + "expectedQty": "17406514035271", + "swapFee": "10308249955", + "reserves": [ + "4543223502624945715647450", + "14951549921386494326131828", + "34546648736417955731456199" + ], + "mAssetSupply": "53823013797274644614958061" + }, + { + "type": "mintMulti", + "inputQtys": [ + "597986165304757151858688", + "426918336600361008103424", + "28761988367565467942912" + ], + "expectedQty": "1082568396733146359906684", + "reserves": [ + "5141209667929702867506138", + "15378468257986855334235252", + "34575410724785521199399111" + ], + "mAssetSupply": "54905582194007790974864745" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "13364869282721814528", + "expectedQty": "13945235391158255499", + "reserves": [ + "5141223032798985589320666", + "15378468257986855334235252", + "34575410724785521199399111" + ] + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "112283853122613460992", + "expectedQty": "107546229226157783878", + "swapFee": "67370311873568076", + "reserves": [ + "5141115486569759431536788", + "15378468257986855334235252", + "34575410724785521199399111" + ], + "mAssetSupply": "54905483922760371393227328" + }, + { + "type": "redeemMasset", + "inputQty": "44688584173297238016", + "expectedQtys": [ + "4183193207761780328", + "12513063386855285177", + "28133120852338599976" + ], + "redemptionFee": "13406575251989171", + "reserves": [ + "5141111303376551669756460", + "15378455744923468478950075", + "34575382591664668860799135" + ], + "mAssetSupply": "54905439247582773347978483" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "8951368081163664384", + "22989062429071822848", + "124192691921561583616" + ], + "expectedQty": "155036018388134655805", + "swapFee": "93077457507385224", + "reserves": [ + "5141102352008470506092076", + "15378432755861039407127227", + "34575258398972747299215519" + ], + "mAssetSupply": "54905284211564385213322678" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "76782914750198319153152", + "expectedQty": "73498835663474834754071", + "swapFee": "46069748850118991491", + "reserves": [ + "5067603516344995671338005", + "15378432755861039407127227", + "34575258398972747299215519" + ], + "mAssetSupply": "54828547366563037013161017" + }, + { + "type": "redeemMasset", + "inputQty": "9106702520580034684518", + "expectedQtys": [ + "841446932012281785012", + "2553501871217721394462", + "5741026307506190236027" + ], + "redemptionFee": "2732010756174010405", + "reserves": [ + "5066762069412983389552993", + "15375879253989821685732765", + "34569517372665241108979492" + ], + "mAssetSupply": "54819443396053213152486904" + }, + { + "type": "redeemMasset", + "inputQty": "5684136194645441275494", + "expectedQtys": [ + "525206456597830623593", + "1593820856284986144430", + "3583379972625823783940" + ], + "redemptionFee": "1705240858393632382", + "reserves": [ + "5066236862956385558929400", + "15374285433133536699588335", + "34565933992692615285195552" + ], + "mAssetSupply": "54813760965099426104843792" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "77796968969888071680", + "expectedQty": "78706060464138080544", + "swapFee": "46678181381932843", + "reserves": [ + "5066236862956385558929400", + "15374285433133536699588335", + "34565855286632151147115008" + ], + "mAssetSupply": "54813683214808637598704955" + }, + { + "type": "mintMulti", + "inputQtys": [ + "132217345454282133995520", + "222299148577639692763136", + "327539057283458209415168" + ], + "expectedQty": "683937655258313498889716", + "reserves": [ + "5198454208410667692924920", + "15596584581711176392351471", + "34893394343915609356530176" + ], + "mAssetSupply": "55497620870066951097594671" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "7327681541271115776", + "8829533781317228544", + "3955829599115992064" + ], + "expectedQty": "20383525364945023936", + "swapFee": "12237457693583164", + "reserves": [ + "5198446880729126421809144", + "15596575752177395075122927", + "34893390388086010240538112" + ], + "mAssetSupply": "55497600486541586152570735" + }, + { + "type": "mintMulti", + "inputQtys": [ + "5216542594335630336", + "6835714971365511168", + "585143148208570368" + ], + "expectedQty": "12856601252106492191", + "reserves": [ + "5198452097271720757439480", + "15596582587892366440634095", + "34893390973229158449108480" + ], + "mAssetSupply": "55497613343142838259062926" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "260039527891925634908160", + "expectedQty": "260015329263077028962501", + "reserves": [ + "5198452097271720757439480", + "15856622115784292075542255", + "34893390973229158449108480" + ] + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "2772886615088290594816", + "expectedQty": "2655587691453975422970", + "swapFee": "1663731969052974356", + "reserves": [ + "5195796509580266782016510", + "15856622115784292075542255", + "34893390973229158449108480" + ], + "mAssetSupply": "55754857449522796050404967" + }, + { + "type": "mintMulti", + "inputQtys": [ + "35000760785685843017728", + "197030996090618288013312", + "336710228009595323809792" + ], + "expectedQty": "566226950221290006041685", + "reserves": [ + "5230797270365952625034238", + "16053653111874910363555567", + "35230101201238753772918272" + ], + "mAssetSupply": "56321084399744086056446652" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "4148793964742691520512", + "expectedQty": "4147661376805915982216", + "reserves": [ + "5230797270365952625034238", + "16057801905839653055076079", + "35230101201238753772918272" + ] + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "1448748649070405091328", + "expectedQty": "1431540076389565150901", + "reserves": [ + "5230797270365952625034238", + "16057801905839653055076079", + "35231549949887824178009600" + ] + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "30847231429649025204224", + "expectedQty": "30836747618981483955813", + "swapFee": "18508338857789415122", + "reserves": [ + "5230797270365952625034238", + "16026965158220671571120266", + "35231549949887824178009600" + ], + "mAssetSupply": "56295834878106490301790667" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "28938223528733583605760", + "3709099589429914763264", + "30880457093006781054976" + ], + "expectedQty": "64433516188249936967332", + "swapFee": "38683319704772825875", + "reserves": [ + "5201859046837219041428478", + "16023256058631241656357002", + "35200669492794817396954624" + ], + "mAssetSupply": "56231401361918240364823335" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "1107122500683635968", + "expectedQty": "1093907140473208946", + "reserves": [ + "5201859046837219041428478", + "16023256058631241656357002", + "35200670599917318080590592" + ] + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "43618733176091114995712", + "expectedQty": "44118750634635828817245", + "swapFee": "26171239905654668997", + "reserves": [ + "5201859046837219041428478", + "16023256058631241656357002", + "35156551849282682251773347" + ], + "mAssetSupply": "56187809893889195377705566" + }, + { + "type": "redeemMasset", + "inputQty": "760724265268906086", + "expectedQtys": [ + "70406610522604926", + "216873071428173655", + "475840200798057023" + ], + "redemptionFee": "228217279580671", + "reserves": [ + "5201858976430608518823552", + "16023255841758170228183347", + "35156551373442481453716324" + ], + "mAssetSupply": "56187809133393147388380151" + }, + { + "type": "mintMulti", + "inputQtys": [ + "4532833612254332928", + "14988056074686384", + "428489039175356160" + ], + "expectedQty": "5171368191272684644", + "reserves": [ + "5201863509264220773156480", + "16023255856746226302869731", + "35156551801931520629072484" + ], + "mAssetSupply": "56187814304761338661064795" + }, + { + "type": "mintMulti", + "inputQtys": [ + "4244398609615922135040", + "11258660409420114034688", + "9885294867446098821120" + ], + "expectedQty": "25454666384574231927579", + "reserves": [ + "5206107907873836695291520", + "16034514517155646416904419", + "35166437096798966727893604" + ], + "mAssetSupply": "56213268971145912892992374" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "2762539216833954852110336", + "expectedQty": "2792383239229745842325966", + "swapFee": "1657523530100372911266", + "reserves": [ + "5206107907873836695291520", + "16034514517155646416904419", + "32374053857569220885567638" + ], + "mAssetSupply": "53452387277842058413793304" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "2713469948579285745795072", + "expectedQty": "2707878654315716873347715", + "reserves": [ + "5206107907873836695291520", + "18747984465734932162699491", + "32374053857569220885567638" + ] + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "128480853214424482185216", + "outputIndex": 0, + "expectedQty": "122833780340590181616868", + "swapFee": "76857738055406799593", + "reserves": [ + "5083274127533246513674652", + "18876465318949356644884707", + "32374053857569220885567638" + ], + "mAssetSupply": "56160342789895830693940612", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "90804904030407760019456", + "expectedQty": "90514686841725127307607", + "reserves": [ + "5083274127533246513674652", + "18967270222979764404904163", + "32374053857569220885567638" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "1945218198250914578432", + "4226215796806213697536", + "1837983045885484859392" + ], + "expectedQty": "8061208284342902473293", + "swapFee": "4839628747854454156", + "reserves": [ + "5081328909334995599096220", + "18963044007182958191206627", + "32372215874523335400708246" + ], + "mAssetSupply": "56242796268453212918774926" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "10690158932779748818944", + "expectedQty": "10580176178481172737735", + "reserves": [ + "5081328909334995599096220", + "18963044007182958191206627", + "32382906033456115149527190" + ] + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "57866206534285872", + "outputIndex": 2, + "expectedQty": "58244543835148682", + "swapFee": "34607874212158", + "reserves": [ + "5081328909334995599096220", + "18963044065049164725492499", + "32382905975211571314378508" + ], + "mAssetSupply": "56253376444666301965724819", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "27786335533675294228480", + "expectedQty": "28058232625955492681823", + "swapFee": "16671801320205176537", + "reserves": [ + "5081328909334995599096220", + "18963044065049164725492499", + "32354847742585615821696685" + ], + "mAssetSupply": "56225606780933946876672876" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "1490448491914944686587904", + "outputIndex": 0, + "expectedQty": "1385832914188419381748618", + "swapFee": "884801027814210080352", + "reserves": [ + "3695495995146576217347602", + "18963044065049164725492499", + "33845296234500560508284589" + ], + "mAssetSupply": "56226491581961761086753228", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemBassets", + "inputQtys": [ + "1345019879831605650391040", + "2465515263199583762644992", + "209968497895101582802944" + ], + "hardLimitError": true + }, + { + "type": "mintMulti", + "inputQtys": [ + "135471095814760087552", + "66483375593102893056", + "1331549859363551744" + ], + "expectedQty": "214690066402274811714", + "reserves": [ + "3695631466242390977435154", + "18963110548424757828385555", + "33845297566050419871836333" + ], + "mAssetSupply": "56226706272028163361564942" + }, + { + "type": "mintMulti", + "inputQtys": [ + "148991069516569119817728", + "347809962131217092444160", + "141170776165871029059584" + ], + "expectedQty": "646699464632930679785806", + "reserves": [ + "3844622535758960097252882", + "19310920510555974920829715", + "33986468342216290900895917" + ], + "mAssetSupply": "56873405736661094041350748" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "222101792766831919104", + "205794663716654350336", + "243681268023665786880" + ], + "expectedQty": "685173230607822615049", + "swapFee": "411350748813981958", + "reserves": [ + "3844400433966193265333778", + "19310714715892258266479379", + "33986224660948267235109037" + ], + "mAssetSupply": "56872720563430486218735699" + }, + { + "type": "mintMulti", + "inputQtys": [ + "198596840520011791466496", + "451090811163140476108800", + "216971925784296352120832" + ], + "expectedQty": "876963324397546759205664", + "reserves": [ + "4042997274486205056800274", + "19761805527055398742588179", + "34203196586732563587229869" + ], + "mAssetSupply": "57749683887828032977941363" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "355335052014884141137920", + "311906203911105342865408", + "517819636151929649758208" + ], + "expectedQty": "1204979686023606264094648", + "swapFee": "723421864733003560593", + "reserves": [ + "3687662222471320915662354", + "19449899323144293399722771", + "33685376950580633937471661" + ], + "mAssetSupply": "56544704201804426713846715" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "1162485901452968837775360", + "1496202953507286324084736", + "1574220545750447014543360" + ], + "hardLimitError": true + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "1229169198987526652559360", + "outputIndex": 1, + "expectedQty": "1313542377205975621387930", + "swapFee": "786180648171905000892", + "reserves": [ + "4916831421458847568221714", + "18136356945938317778334841", + "33685376950580633937471661" + ], + "mAssetSupply": "56545490382452598618847607", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "108838674002570", + "outputIndex": 2, + "expectedQty": "109732753712493", + "swapFee": "65131633793", + "reserves": [ + "4916831421458847568221714", + "18136356946047156452337411", + "33685376950470901183759168" + ], + "mAssetSupply": "56545490382452663750481400", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "163776939638201889325056", + "expectedQty": "171412676363930107832057", + "reserves": [ + "5080608361097049457546770", + "18136356946047156452337411", + "33685376950470901183759168" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "300356308785750519840768", + "431226661192940832948224", + "373396572922893222019072" + ], + "expectedQty": "1113887731416835264286519", + "swapFee": "668733879177607723205", + "reserves": [ + "4780252052311298937706002", + "17705130284854215619389187", + "33311980377548007961740096" + ], + "mAssetSupply": "55603015327399758594026938" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "4265238279402822144", + "expectedQty": "4476567411198041491", + "reserves": [ + "4780256317549578340528146", + "17705130284854215619389187", + "33311980377548007961740096" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "126798881096021282127872", + "54838964540002571124736", + "37682775559569533829120" + ], + "expectedQty": "224883142985706016775780", + "reserves": [ + "4907055198645599622656018", + "17759969249394218190513923", + "33349663153107577495569216" + ], + "mAssetSupply": "55827902946952875808844209" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "47169520748793522290688", + "54555287718107004534784", + "21757442210400363872256" + ], + "expectedQty": "125345820405848484519704", + "swapFee": "75252643829806974896", + "reserves": [ + "4859885677896806100365330", + "17705413961676111185979139", + "33327905710897177131696960" + ], + "mAssetSupply": "55702557126547027324324505" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "31228088350873780224", + "3712932047284932608", + "34779099707758858240" + ], + "expectedQty": "70812695194431090759", + "swapFee": "42513124991653646", + "reserves": [ + "4859854449808455226585106", + "17705410248744063901046531", + "33327870931797469372838720" + ], + "mAssetSupply": "55702486313851832893233746" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "395925790202056773992448", + "139899898542584101863424", + "415108983396012128206848" + ], + "expectedQty": "966085927798936574883747", + "swapFee": "579999556413209870852", + "reserves": [ + "4463928659606398452592658", + "17565510350201479799183107", + "32912761948401457244631872" + ], + "mAssetSupply": "54736400386052896318349999" + }, + { + "type": "redeemMasset", + "inputQty": "29835832977643725547110", + "expectedQtys": [ + "2432477719837161864444", + "9571773167226562912207", + "17934775898692349872274" + ], + "redemptionFee": "8950749893293117664", + "reserves": [ + "4461496181886561290728214", + "17555938577034253236270900", + "32894827172502764894759598" + ], + "mAssetSupply": "54706573503825145885920553" + }, + { + "type": "mintMulti", + "inputQtys": [ + "5827743380878717060382720", + "3476383136556869679579136", + "2052556016814800056090624" + ], + "expectedQty": "11485103516326618380706108", + "reserves": [ + "10289239562765278351110934", + "21032321713591122915850036", + "34947383189317564950850222" + ], + "mAssetSupply": "66191677020151764266626661" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "276868181460532640", + "expectedQty": "280250885341644263", + "reserves": [ + "10289239839633459811643574", + "21032321713591122915850036", + "34947383189317564950850222" + ] + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "34072125272670628478976", + "outputIndex": 0, + "expectedQty": "33619135465160367232609", + "swapFee": "20431296395978551775", + "reserves": [ + "10255620704168299444410965", + "21066393838863793544329012", + "34947383189317564950850222" + ], + "mAssetSupply": "66191697731699045586822699", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemBassets", + "inputQtys": [ + "61503784065886724096", + "60535750497123115008", + "33568441630234157056" + ], + "expectedQty": "156145102081073314405", + "swapFee": "93743307232983778", + "reserves": [ + "10255559200384233557686869", + "21066333303113296421214004", + "34947349620875934716693166" + ], + "mAssetSupply": "66191541586596964513508294" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "223388911329699115827200", + "expectedQty": "223380163226341097796835", + "swapFee": "134033346797819469496", + "reserves": [ + "10255559200384233557686869", + "20842953139886955323417169", + "34947349620875934716693166" + ], + "mAssetSupply": "65968286708614063217150590" + }, + { + "type": "redeemMasset", + "inputQty": "16329643280095384698880", + "expectedQtys": [ + "2537876771495708906647", + "5157870535339587142904", + "8648194125273781020628" + ], + "redemptionFee": "4898892984028615409", + "reserves": [ + "10253021323612737848780222", + "20837795269351615736274265", + "34938701426750660935672538" + ], + "mAssetSupply": "65951961964226951861067119" + }, + { + "type": "redeemMasset", + "inputQty": "123351704047880650096640", + "expectedQtys": [ + "19170744826319372990296", + "38961789236878916594802", + "65327176104924705941036" + ], + "redemptionFee": "37005511214364195028", + "reserves": [ + "10233850578786418475789926", + "20798833480114736819679463", + "34873374250645736229731502" + ], + "mAssetSupply": "65828647265690285575165507" + }, + { + "type": "mintMulti", + "inputQtys": [ + "78622068300235805818880", + "981001026495565428424704", + "556291276720667659075584" + ], + "expectedQty": "1613198792462906699736497", + "reserves": [ + "10312472647086654281608806", + "21779834506610302248104167", + "35429665527366403888807086" + ], + "mAssetSupply": "67441846058153192274902004" + }, + { + "type": "redeemMasset", + "inputQty": "6273417618579173828198", + "expectedQtys": [ + "958974924934634346148", + "2025345024014769506640", + "3294666759592705699098" + ], + "redemptionFee": "1882025285573752148", + "reserves": [ + "10311513672161719647262658", + "21777809161586287478597527", + "35426370860606811183107988" + ], + "mAssetSupply": "67435574522559898674825954" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "111112524156672344064", + "expectedQty": "111134191621239564726", + "swapFee": "66667514494003406", + "reserves": [ + "10311513672161719647262658", + "21777698027394666239032801", + "35426370860606811183107988" + ], + "mAssetSupply": "67435463476703256496485296" + }, + { + "type": "mintMulti", + "inputQtys": [ + "249098228713991090208768", + "230298116899977578938368", + "337168069554575845097472" + ], + "expectedQty": "817670560324097032610519", + "reserves": [ + "10560611900875710737471426", + "22007996144294643817971169", + "35763538930161387028205460" + ], + "mAssetSupply": "68253134037027353529095815" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "40709147301607041400832", + "19779408660127547392000", + "11490447178401713225728" + ], + "expectedQty": "72405088377876543956029", + "swapFee": "43469134507430384604", + "reserves": [ + "10519902753574103696070594", + "21988216735634516270579169", + "35752048482982985314979732" + ], + "mAssetSupply": "68180728948649476985139786" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "68256590410207084544", + "expectedQty": "68267374874860497412", + "swapFee": "40953954246124250", + "reserves": [ + "10519902753574103696070594", + "21988148468259641410081757", + "35752048482982985314979732" + ], + "mAssetSupply": "68180660733013021024179492" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "241494324495221728", + "expectedQty": "238393481809140433", + "swapFee": "144896594697133", + "reserves": [ + "10519902515180621886930161", + "21988148468259641410081757", + "35752048482982985314979732" + ], + "mAssetSupply": "68180660491663593123654897" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "19016613273967492333568", + "outputIndex": 1, + "expectedQty": "18916679083033021186749", + "swapFee": "11348280159592432980", + "reserves": [ + "10519902515180621886930161", + "21969231789176608388895008", + "35771065096256952807313300" + ], + "mAssetSupply": "68180671839943752716087877", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "1731997933108890242646016", + "expectedQty": "1722285521671976984052150", + "reserves": [ + "10519902515180621886930161", + "21969231789176608388895008", + "37503063029365843049959316" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "2611644142872565383168", + "5768071926053970378752", + "5098838542671268544512" + ], + "expectedQty": "13480682206860545181572", + "swapFee": "8093265283286298888", + "reserves": [ + "10517290871037749321546993", + "21963463717250554418516256", + "37497964190823171781414804" + ], + "mAssetSupply": "69889476679408869154958455" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "157947849243162771980288", + "228987858803707560853504", + "132847225579042108342272" + ], + "expectedQty": "521012235395452311664782", + "swapFee": "312795018248220319190", + "reserves": [ + "10359343021794586549566705", + "21734475858446846857662752", + "37365116965244129673072532" + ], + "mAssetSupply": "69368464444013416843293673" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "1315670893115395801088", + "expectedQty": "1333560913718455046072", + "reserves": [ + "10360658692687701945367793", + "21734475858446846857662752", + "37365116965244129673072532" + ] + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "51796324693086077714432", + "expectedQty": "52071707571459461945534", + "swapFee": "31077794815851646628", + "reserves": [ + "10360658692687701945367793", + "21734475858446846857662752", + "37313045257672670211126998" + ], + "mAssetSupply": "69318032758028865072271941" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "38542437606999949312", + "expectedQty": "38539404849952387164", + "swapFee": "23125462564199969", + "reserves": [ + "10360658692687701945367793", + "21734437319041996905275588", + "37313045257672670211126998" + ], + "mAssetSupply": "69317994238716720636522598" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "79949652373944722784256", + "expectedQty": "79478861616065086684507", + "reserves": [ + "10360658692687701945367793", + "21734437319041996905275588", + "37392994910046614933911254" + ] + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "118431670730416002695168", + "expectedQty": "118418307443571121338829", + "swapFee": "71059002438249601617", + "reserves": [ + "10360658692687701945367793", + "21616019011598425783936759", + "37392994910046614933911254" + ], + "mAssetSupply": "69279112488604807970113554" + }, + { + "type": "mintMulti", + "inputQtys": [ + "2581861810777700171776", + "314959553279132434432", + "2849498999732207878144" + ], + "expectedQty": "5764351419796948901841", + "reserves": [ + "10363240554498479645539569", + "21616333971151704916371191", + "37395844409046347141789398" + ], + "mAssetSupply": "69284876840024604919015395" + }, + { + "type": "mintMulti", + "inputQtys": [ + "58288230508839452672", + "71554296335479087104", + "187902020632094736384" + ], + "expectedQty": "317391052361317702966", + "reserves": [ + "10363298842728988484992241", + "21616405525448040395458295", + "37396032311066979236525782" + ], + "mAssetSupply": "69285194231076966236718361" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "4790977813041446387712", + "expectedQty": "4855928728278148333729", + "reserves": [ + "10368089820542029931379953", + "21616405525448040395458295", + "37396032311066979236525782" + ] + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "434496956222040113152", + "expectedQty": "434296781833734364078", + "reserves": [ + "10368089820542029931379953", + "21616840022404262435571447", + "37396032311066979236525782" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "64202781672650948608", + "108146618712660541440", + "143132039319247552512" + ], + "expectedQty": "315455679433230156155", + "swapFee": "189387039883868414", + "reserves": [ + "10368025617760357280431345", + "21616731875785549775030007", + "37395889179027659988973270" + ], + "mAssetSupply": "69290169000907644889260013" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "8595570287973621219459072", + "expectedQty": "8654846758748686346559467", + "reserves": [ + "18963595905733978499890417", + "21616731875785549775030007", + "37395889179027659988973270" + ] + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "2415338839639019730501632", + "expectedQty": "2404753441763072101394579", + "swapFee": "1449203303783411838300", + "reserves": [ + "16558842463970906398495838", + "21616731875785549775030007", + "37395889179027659988973270" + ], + "mAssetSupply": "75531126123321094917156148" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "22017066246904380", + "98536223873049072", + "808320697400399" + ], + "expectedQty": "121567116219136764", + "swapFee": "72984060167582", + "reserves": [ + "16558842441953840151591458", + "21616731777249325901980935", + "37395889178219339291572871" + ], + "mAssetSupply": "75531126001753978698019384" + }, + { + "type": "redeemMasset", + "inputQty": "181147070203039501516", + "expectedQtys": [ + "39701326821286272728", + "51828075308106873097", + "89660036517740255033" + ], + "redemptionFee": "54344121060911850", + "reserves": [ + "16558802740627018865318730", + "21616679949174017795107838", + "37395799518182821551317838" + ], + "mAssetSupply": "75530944909027896719429718" + }, + { + "type": "redeemMasset", + "inputQty": "37644051247966137", + "expectedQtys": [ + "8250306117551969", + "10770357592838875", + "18632192095545671" + ], + "redemptionFee": "11293215374389", + "reserves": [ + "16558802732376712747766761", + "21616679938403660202268963", + "37395799499550629455772167" + ], + "mAssetSupply": "75530944871395138686837970" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "4522259502616169414656", + "outputIndex": 2, + "expectedQty": "4557322083244954717412", + "swapFee": "2725802527779003522", + "reserves": [ + "16563324991879328917181417", + "21616679938403660202268963", + "37391242177467384501054755" + ], + "mAssetSupply": "75530947597197666465841492", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "2534123314202645504", + "expectedQty": "2529842346840383222", + "swapFee": "1520473988521587", + "reserves": [ + "16563324991879328917181417", + "21616677408561313361885741", + "37391242177467384501054755" + ], + "mAssetSupply": "75530945064594826251717575" + }, + { + "type": "redeemMasset", + "inputQty": "502784996654506731110", + "expectedQtys": [ + "110223603797350777430", + "143852039808708737057", + "248826697856897472212" + ], + "redemptionFee": "150835498996352019", + "reserves": [ + "16563214768275531566403987", + "21616533556521504653148684", + "37390993350769527603582543" + ], + "mAssetSupply": "75530442430433670741338484" + }, + { + "type": "redeemMasset", + "inputQty": "75134138275504822681", + "expectedQtys": [ + "16471365581788347799", + "21496661837799226415", + "37183646385264144504" + ], + "redemptionFee": "22540241482651446", + "reserves": [ + "16563198296909949778056188", + "21616512059859666853922269", + "37390956167123142339438039" + ], + "mAssetSupply": "75530367318835636719167249" + }, + { + "type": "mintMulti", + "inputQtys": [ + "20466093831101494591488", + "8490513812515977166848", + "17029089127548063842304" + ], + "expectedQty": "46025044843027167126386", + "reserves": [ + "16583664390741051272647676", + "21625002573672182831089117", + "37407985256250690403280343" + ], + "mAssetSupply": "75576392363678663886293635" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "3206452822502449610752", + "expectedQty": "3189931990171740265120", + "swapFee": "1923871693501469766", + "reserves": [ + "16580474458750879532382556", + "21625002573672182831089117", + "37407985256250690403280343" + ], + "mAssetSupply": "75573187834727854938152649" + }, + { + "type": "mintMulti", + "inputQtys": [ + "100465422700803342336", + "262998531066390872064", + "93036749077819703296" + ], + "expectedQty": "456900399320530436322", + "reserves": [ + "16580574924173580335724892", + "21625265572203249221961181", + "37408078292999768222983639" + ], + "mAssetSupply": "75573644735127175468588971" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "3124788513576946008850432", + "expectedQty": "3112269843939310762591392", + "reserves": [ + "16580574924173580335724892", + "21625265572203249221961181", + "40532866806576714231834071" + ] + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "960078682188489315844096", + "expectedQty": "961351970308387620559614", + "reserves": [ + "16580574924173580335724892", + "22585344254391738537805277", + "40532866806576714231834071" + ] + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "618741914898163456", + "outputIndex": 0, + "expectedQty": "615709845057201644", + "swapFee": "371669755363516", + "reserves": [ + "16580574308463735278523248", + "22585344873133653435968733", + "40532866806576714231834071" + ], + "mAssetSupply": "79647266549746543607103493", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemMasset", + "inputQty": "34295694299117863410073", + "expectedQtys": [ + "7137366286631876679660", + "9722213240054778967947", + "17448003408309301719369" + ], + "redemptionFee": "10288708289735359023", + "reserves": [ + "16573436942177103401843588", + "22575622659893598657000786", + "40515418803168404930114702" + ], + "mAssetSupply": "79612981144155715479052443" + }, + { + "type": "mintMulti", + "inputQtys": [ + "27919491994855906738176", + "5731110620713820618752", + "44253112855899754463232" + ], + "expectedQty": "77879380625362021407819", + "reserves": [ + "16601356434171959308581764", + "22581353770514312477619538", + "40559671916024304684577934" + ], + "mAssetSupply": "79690860524781077500460262" + }, + { + "type": "mintMulti", + "inputQtys": [ + "15135337153101706559488", + "18581903371490297905152", + "14109601549144815566848" + ], + "expectedQty": "47872335512297561434051", + "reserves": [ + "16616491771325061015141252", + "22599935673885802775524690", + "40573781517573449500144782" + ], + "mAssetSupply": "79738732860293375061894313" + }, + { + "type": "mintMulti", + "inputQtys": [ + "2057631965338370486304768", + "146620244140263739490304", + "1591614603896018798903296" + ], + "expectedQty": "3799646700615427776858893", + "reserves": [ + "18674123736663431501446020", + "22746555918026066515014994", + "42165396121469468299048078" + ], + "mAssetSupply": "83538379560908802838753206" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "42639836927023583854592", + "expectedQty": "42430480157051173320119", + "swapFee": "25583902156214150312", + "reserves": [ + "18631693256506380328125901", + "22746555918026066515014994", + "42165396121469468299048078" + ], + "mAssetSupply": "83495765307883935469048926" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "64494017807948248514560", + "expectedQty": "64347932867251114827627", + "swapFee": "38696410684768949108", + "reserves": [ + "18631693256506380328125901", + "22682207985158815400187367", + "42165396121469468299048078" + ], + "mAssetSupply": "83431309986486671989483474" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "3317588850672097296384", + "35950177884014500642816", + "13431072259262405148672" + ], + "expectedQty": "52720674352718085691390", + "swapFee": "31651395448900191529", + "reserves": [ + "18628375667655708230829517", + "22646257807274800899544551", + "42151965049210205893899406" + ], + "mAssetSupply": "83378589312133953903792084" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "408564018356407035232256", + "246191981875448787238912", + "149284676719152323362816" + ], + "expectedQty": "805668622649884751594862", + "swapFee": "483691388422984641741", + "reserves": [ + "18219811649299301195597261", + "22400065825399352112305639", + "42002680372491053570536590" + ], + "mAssetSupply": "82572920689484069152197222" + }, + { + "type": "redeemMasset", + "inputQty": "6302854157535942593740", + "expectedQtys": [ + "1390314931336168215438", + "1709301203515100758100", + "3205134871976613090851" + ], + "redemptionFee": "1890856247260782778", + "reserves": [ + "18218421334367965027381823", + "22398356524195837011547539", + "41999475237619076957445739" + ], + "mAssetSupply": "82566619726182780470386260" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "1906459491174790736117760", + "expectedQty": "1912771750448260603958094", + "swapFee": "1143875694704874441670", + "reserves": [ + "18218421334367965027381823", + "22398356524195837011547539", + "40086703487170816353487645" + ], + "mAssetSupply": "80661304110702694608710170" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "1112585444440812713672704", + "expectedQty": "1106916531064682702435450", + "swapFee": "667551266664487628203", + "reserves": [ + "17111504803303282324946373", + "22398356524195837011547539", + "40086703487170816353487645" + ], + "mAssetSupply": "79549386217528546382665669" + }, + { + "type": "mintMulti", + "inputQtys": [ + "236936517607023", + "53227520967911", + "354669268554345" + ], + "expectedQty": "644654530308929", + "reserves": [ + "17111504803540218842553396", + "22398356524249064532515450", + "40086703487525485622041990" + ], + "mAssetSupply": "79549386218173200912974598" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "19206469506080534691840", + "70705466734191046557696", + "77813570832735326437376" + ], + "expectedQty": "167599497537418215594778", + "swapFee": "100620070564789803238", + "reserves": [ + "17092298334034138307861556", + "22327651057514873485957754", + "40008889916692750295604614" + ], + "mAssetSupply": "79381786720635782697379820" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "5003369969697748418560", + "expectedQty": "5009696629592986892350", + "reserves": [ + "17092298334034138307861556", + "22332654427484571234376314", + "40008889916692750295604614" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "29725840090854171082752", + "3844329864230973472768", + "86139467169075663208448" + ], + "expectedQty": "119518126576023646687081", + "swapFee": "71753928302595745459", + "reserves": [ + "17062572493943284136778804", + "22328810097620340260903546", + "39922750449523674632396166" + ], + "mAssetSupply": "79267278290689352037585089" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "100579173802811615870976", + "expectedQty": "101068274868614469425398", + "reserves": [ + "17163151667746095752649780", + "22328810097620340260903546", + "39922750449523674632396166" + ] + }, + { + "type": "redeemMasset", + "inputQty": "3519800041769941965209", + "expectedQtys": [ + "760917183131253247899", + "989933294948570947398", + "1769949214630043813342" + ], + "redemptionFee": "1055940012530982589", + "reserves": [ + "17162390750562964499401881", + "22327820164325391689956148", + "39920980500309044588582824" + ], + "mAssetSupply": "79364827821456209096027867" + }, + { + "type": "redeemMasset", + "inputQty": "91995497250388", + "expectedQtys": [ + "19887764588274", + "25873460035448", + "46260400072597" + ], + "redemptionFee": "27598649175", + "reserves": [ + "17162390750543076734813607", + "22327820164299518229920700", + "39920980500262784188510227" + ], + "mAssetSupply": "79364827821364241197426654" + }, + { + "type": "mintMulti", + "inputQtys": [ + "1227012616867939090432", + "6151578140474326646784", + "3527816841084186132480" + ], + "expectedQty": "10906201866047008204793", + "reserves": [ + "17163617763159944673904039", + "22333971742439992556567484", + "39924508317103868374642707" + ], + "mAssetSupply": "79375734023230288205631447" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "1181482652408477898506240", + "outputIndex": 1, + "expectedQty": "1174058090837251218082873", + "swapFee": "706024256076906827396", + "reserves": [ + "17163617763159944673904039", + "21159913651602741338484611", + "41105990969512346273148947" + ], + "mAssetSupply": "79376440047486365112458843", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mintMulti", + "inputQtys": [ + "6133142253158341279744", + "3294115010066636079104", + "6701411411374623424512" + ], + "expectedQty": "16135980132514995913257", + "reserves": [ + "17169750905413103015183783", + "21163207766612807974563715", + "41112692380923720896573459" + ], + "mAssetSupply": "79392576027618880108372100" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "10107782140404815872", + "8236243230255326208", + "289494400040893376" + ], + "expectedQty": "18697195350815379481", + "swapFee": "11225052241834328", + "reserves": [ + "17169740797630962610367911", + "21163199530369577719237507", + "41112692091429320855680083" + ], + "mAssetSupply": "79392557330423529292992619" + }, + { + "type": "mintMulti", + "inputQtys": [ + "1931958201585526", + "1545508759561715", + "214483026050763" + ], + "expectedQty": "3703380950971400", + "reserves": [ + "17169740799562920811953437", + "21163199531915086478799222", + "41112692091643803881730846" + ], + "mAssetSupply": "79392557334126910243964019" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "8249184838039170449408", + "outputIndex": 2, + "expectedQty": "8295582256267560784039", + "swapFee": "4958907409621486742", + "reserves": [ + "17169740799562920811953437", + "21171448716753125649248630", + "41104396509387536320946807" + ], + "mAssetSupply": "79392562293034319865450761", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "150798864897463289905152", + "expectedQty": "149968798504634246568125", + "swapFee": "90479318938477973943", + "reserves": [ + "17019772001058286565385312", + "21171448716753125649248630", + "41104396509387536320946807" + ], + "mAssetSupply": "79241853907455795053519552" + }, + { + "type": "redeemMasset", + "inputQty": "1405933558200517053644", + "expectedQtys": [ + "301879484502771038031", + "375517722822190662320", + "729068170142340782920" + ], + "redemptionFee": "421780067460155116", + "reserves": [ + "17019470121573783794347281", + "21171073199030303458586310", + "41103667441217393980163887" + ], + "mAssetSupply": "79240448395677661996621024" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "4013872502635579834368", + "expectedQty": "4021368569560317768545", + "reserves": [ + "17019470121573783794347281", + "21175087071532939038420678", + "41103667441217393980163887" + ] + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "249408637383338331471872", + "expectedQty": "248781045380666720266799", + "swapFee": "149645182430002998883", + "reserves": [ + "17019470121573783794347281", + "20926306026152272318153879", + "41103667441217393980163887" + ], + "mAssetSupply": "78995210772046313985916580" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "31606276065673543680", + "247010129068427870208", + "23258316154893991936" + ], + "expectedQty": "302417450042502376792", + "swapFee": "181559405668902767", + "reserves": [ + "17019438515297718120803601", + "20926059016023203890283671", + "41103644182901239086171951" + ], + "mAssetSupply": "78994908354596271483539788" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "11378118834960388096", + "expectedQty": "11348863740804626939", + "swapFee": "6826871300976232", + "reserves": [ + "17019438515297718120803601", + "20926047667159463085656732", + "41103644182901239086171951" + ], + "mAssetSupply": "78994896983304307824127924" + }, + { + "type": "redeemMasset", + "inputQty": "417767317630801045094", + "expectedQtys": [ + "89980902539409966280", + "110634945681742715511", + "217312868336510090435" + ], + "redemptionFee": "125330195289240313", + "reserves": [ + "17019348534395178710837321", + "20925937032213781342941221", + "41103426870032902576081516" + ], + "mAssetSupply": "78994479341316872312323143" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "808062130687477", + "expectedQty": "812058144177681", + "reserves": [ + "17019348535203240841524798", + "20925937032213781342941221", + "41103426870032902576081516" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "85408548629971736723456", + "61359489514067286032384", + "284354145426044878848" + ], + "expectedQty": "147597497727232303599861", + "swapFee": "88611665635720814648", + "reserves": [ + "16933939986573269104801342", + "20864577542699714056908837", + "41103142515887476531202668" + ], + "mAssetSupply": "78846881844401698152900963" + }, + { + "type": "redeemMasset", + "inputQty": "699989652124111304916992", + "expectedQtys": [ + "150291633711641711963179", + "185176718949157072099427", + "364797468533206415071827" + ], + "redemptionFee": "209996895637233391475", + "reserves": [ + "16783648352861627392838163", + "20679400823750556984809410", + "40738345047354270116130841" + ], + "mAssetSupply": "78147102189173224081375446" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "462873708834555", + "expectedQty": "463793993509307", + "reserves": [ + "16783648352861627392838163", + "20679400824213430693643965", + "40738345047354270116130841" + ] + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "503654505267436181258240", + "outputIndex": 2, + "expectedQty": "507927352528415094404004", + "swapFee": "303645106175102930769", + "reserves": [ + "17287302858129063574096403", + "20679400824213430693643965", + "40230417694825855021726837" + ], + "mAssetSupply": "78147405834743193177815522", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "148968006234918700974080", + "expectedQty": "149261248381748879074613", + "reserves": [ + "17287302858129063574096403", + "20828368830448349394618045", + "40230417694825855021726837" + ] + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "296294245355395612672", + "expectedQty": "297358895469260854164", + "swapFee": "177776547213237367", + "reserves": [ + "17287302858129063574096403", + "20828368830448349394618045", + "40230120335930385760872673" + ], + "mAssetSupply": "78296370966656133874514830" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "260414935257946030080", + "expectedQty": "259084401972836284592", + "swapFee": "156248961154767618", + "reserves": [ + "17287043773727090737811811", + "20828368830448349394618045", + "40230120335930385760872673" + ], + "mAssetSupply": "78296110707969837083252368" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "1380865595820899905306624", + "371924349702267998306304", + "1099590443534419209748480" + ], + "expectedQty": "2855128572092038581960740", + "swapFee": "1714105606619194665976", + "reserves": [ + "15906178177906190832505187", + "20456444480746081396311741", + "39130529892395966551124193" + ], + "mAssetSupply": "75440982135877798501291628" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "20708024804755808190464", + "94103550501717737996288", + "164741785062718239145984" + ], + "expectedQty": "279103115268372712464015", + "swapFee": "167562406604986619450", + "reserves": [ + "15885470153101435024314723", + "20362340930244363658315453", + "38965788107333248311978209" + ], + "mAssetSupply": "75161879020609425788827613" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "10498340642988676", + "4867228609651292", + "11114314659386648" + ], + "expectedQty": "26494899558379810", + "swapFee": "15906483625203", + "reserves": [ + "15885470142603094381326047", + "20362340925377135048664161", + "38965788096218933652591561" + ], + "mAssetSupply": "75161878994114526230447803" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "526132263123359576883200", + "expectedQty": "528781434629115745086447", + "reserves": [ + "16411602405726453958209247", + "20362340925377135048664161", + "38965788096218933652591561" + ] + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "189204092919505435492352", + "expectedQty": "190102473531044593066100", + "reserves": [ + "16600806498645959393701599", + "20362340925377135048664161", + "38965788096218933652591561" + ] + }, + { + "type": "redeemMasset", + "inputQty": "202419383767908264129331", + "expectedQtys": [ + "44270995645182785025535", + "54302247695413219539716", + "103913881247849448160261" + ], + "redemptionFee": "60725815130372479238", + "reserves": [ + "16556535503000776608676064", + "20308038677681721829124445", + "38861874214971084204431300" + ], + "mAssetSupply": "75678404244321908676950257" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "94539426687625260433408", + "56236850469895791443968", + "42570789203419596849152" + ], + "expectedQty": "193715677061413798057640", + "swapFee": "116299185748297257188", + "reserves": [ + "16461996076313151348242656", + "20251801827211826037680477", + "38819303425767664607582148" + ], + "mAssetSupply": "75484688567260494878892617" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "2443624266638025530802176", + "expectedQty": "2436245222998025926836431", + "swapFee": "1466174559982815318481", + "reserves": [ + "16461996076313151348242656", + "17815556604213800110844046", + "38819303425767664607582148" + ], + "mAssetSupply": "73042530475182452163408922" + }, + { + "type": "mintMulti", + "inputQtys": [ + "146552563881914702757888", + "47426274779129159090176", + "103992268317239292198912" + ], + "expectedQty": "298258039735916902799694", + "reserves": [ + "16608548640195066051000544", + "17862982878992929269934222", + "38923295694084903899781060" + ], + "mAssetSupply": "73340788514918369066208616" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "3703621636870912411172864", + "expectedQty": "3685260086372482969663437", + "reserves": [ + "16608548640195066051000544", + "17862982878992929269934222", + "42626917330955816310953924" + ] + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "679968088325052239446016", + "expectedQty": "676761477458936583441708", + "swapFee": "407980852995031343667", + "reserves": [ + "16608548640195066051000544", + "17186221401533992686492514", + "42626917330955816310953924" + ], + "mAssetSupply": "76346488493818794827769704" + }, + { + "type": "redeemMasset", + "inputQty": "234427727906258900588953", + "expectedQtys": [ + "50982518607390648427018", + "52755774834769145136725", + "130849940779390910050681" + ], + "redemptionFee": "70328318371877670176", + "reserves": [ + "16557566121587675402573526", + "17133465626699223541355789", + "42496067390176425400903243" + ], + "mAssetSupply": "76112131094230907804850927" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "282313226288430663598080", + "64785568117707344183296", + "22812453898565225283584" + ], + "expectedQty": "371502502067444512710286", + "swapFee": "223035322433927063864", + "reserves": [ + "16275252895299244738975446", + "17068680058581516197172493", + "42473254936277860175619659" + ], + "mAssetSupply": "75740628592163463292140641" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "196562603535179976802304", + "expectedQty": "197565800674222442499225", + "reserves": [ + "16471815498834424715777750", + "17068680058581516197172493", + "42473254936277860175619659" + ] + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "40261535942624649216", + "expectedQty": "40036472109887269970", + "swapFee": "24156921565574789", + "reserves": [ + "16471775462362314828507780", + "17068680058581516197172493", + "42473254936277860175619659" + ], + "mAssetSupply": "75938154155458664675565439" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "581552677158394", + "outputIndex": 0, + "expectedQty": "580856271672105", + "swapFee": "350472928734", + "reserves": [ + "16471775461781458556835675", + "17068680059163068874330887", + "42473254936277860175619659" + ], + "mAssetSupply": "75938154155459015148494173", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemBassets", + "inputQtys": [ + "4073977299034398257053696", + "1741032596535657839460352", + "1101162397734351574925312" + ], + "expectedQty": "6945465378790750573039509", + "swapFee": "4169781095932009549553", + "reserves": [ + "12397798162747060299781979", + "15327647462627411034870535", + "41372092538543508600694347" + ], + "mAssetSupply": "68992688776668264575454664" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "402207030736774185877504", + "expectedQty": "404082521518006808275656", + "reserves": [ + "12397798162747060299781979", + "15729854493364185220748039", + "41372092538543508600694347" + ] + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "368050792039581652877312", + "expectedQty": "371410764548879041422428", + "reserves": [ + "12765848954786641952659291", + "15729854493364185220748039", + "41372092538543508600694347" + ] + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "22704537862287884", + "expectedQty": "22904701930893561", + "reserves": [ + "12765848977491179814947175", + "15729854493364185220748039", + "41372092538543508600694347" + ] + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "10204829527508556", + "outputIndex": 1, + "expectedQty": "10242068174898316", + "swapFee": "6176877415287", + "reserves": [ + "12765848987696009342455731", + "15729854483122117045849723", + "41372092538543508600694347" + ], + "mAssetSupply": "69768182085646029233461596", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "256380877671063969857536", + "expectedQty": "257987682268450038561604", + "swapFee": "153828526602638381914", + "reserves": [ + "12765848987696009342455731", + "15729854483122117045849723", + "41114104856275058562132743" + ], + "mAssetSupply": "69511955036501567901985974" + }, + { + "type": "mintMulti", + "inputQtys": [ + "141102608309207942823936", + "129458369220715590189056", + "167011470743477459877888" + ], + "expectedQty": "438237631867990302397371", + "reserves": [ + "12906951596005217285279667", + "15859312852342832636038779", + "41281116327018536022010631" + ], + "mAssetSupply": "69950192668369558204383345" + }, + { + "type": "mintMulti", + "inputQtys": [ + "3184034139577299501056", + "7501847352764400664576", + "5727716906122818355200" + ], + "expectedQty": "16435518923533102287257", + "reserves": [ + "12910135630144794584780723", + "15866814699695597036703355", + "41286844043924658840365831" + ], + "mAssetSupply": "69966628187293091306670602" + }, + { + "type": "redeemMasset", + "inputQty": "13716608948757949369548", + "expectedQtys": [ + "2530208493907382956105", + "3109676805461574922378", + "8091651898888376594847" + ], + "redemptionFee": "4114982684627384810", + "reserves": [ + "12907605421650887201824618", + "15863705022890135461780977", + "41278752392025770463770984" + ], + "mAssetSupply": "69952915693327017984685864" + }, + { + "type": "mintMulti", + "inputQtys": [ + "30130180656570411515904", + "41658044384823184719872", + "44383778956661454012416" + ], + "expectedQty": "116315284348103536582372", + "reserves": [ + "12937735602307457613340522", + "15905363067274958646500849", + "41323136170982431917783400" + ], + "mAssetSupply": "70069230977675121521268236" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "10335915445474541174784", + "expectedQty": "10242037395581582446466", + "swapFee": "6201549267284724704", + "reserves": [ + "12927493564911876030894056", + "15905363067274958646500849", + "41323136170982431917783400" + ], + "mAssetSupply": "70058901263778914264818156" + }, + { + "type": "mintMulti", + "inputQtys": [ + "258978219030114346205184", + "268307161206227396984832", + "221523454208559460384768" + ], + "expectedQty": "750683295371247100453395", + "reserves": [ + "13186471783941990377099240", + "16173670228481186043485681", + "41544659625190991378168168" + ], + "mAssetSupply": "70809584559150161365271551" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "479772179020318976", + "6936780354194352128", + "37278906964414496768" + ], + "expectedQty": "44483257265522385399", + "swapFee": "26705977946081079", + "reserves": [ + "13186471304169811356780264", + "16173663291700831849133553", + "41544622346284026963671400" + ], + "mAssetSupply": "70809540075892895842886152" + }, + { + "type": "redeemMasset", + "inputQty": "1292476215646538537369", + "expectedQtys": [ + "240618531775875859068", + "295126954354787078313", + "758080444840846313533" + ], + "redemptionFee": "387742864693961561", + "reserves": [ + "13186230685638035480921196", + "16173368164746477062055240", + "41543864265839186117357867" + ], + "mAssetSupply": "70808247987420113998310344" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "278143056965491568410624", + "outputIndex": 1, + "expectedQty": "274902532205365809109097", + "swapFee": "165779704350539596507", + "reserves": [ + "13186230685638035480921196", + "15898465632541111252946143", + "41822007322804677685768491" + ], + "mAssetSupply": "70808413767124464537906851", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "3499128456524435816448", + "expectedQty": "3467998377700101521797", + "swapFee": "2099477073914661489", + "reserves": [ + "13182762687260335379399399", + "15898465632541111252946143", + "41822007322804677685768491" + ], + "mAssetSupply": "70804916738145014016751892" + }, + { + "type": "redeemMasset", + "inputQty": "348926950931374082831155", + "expectedQtys": [ + "64945224919437047811816", + "78324206456143414261616", + "206037212122974649980161" + ], + "redemptionFee": "104678085279412224849", + "reserves": [ + "13117817462340898331587583", + "15820141426084967838684527", + "41615970110681703035788330" + ], + "mAssetSupply": "70456094465298919346145586" + }, + { + "type": "mintMulti", + "inputQtys": [ + "6241829888449959690240", + "4442774484204699779072", + "6740648211634318213120" + ], + "expectedQty": "17452524430535194012766", + "reserves": [ + "13124059292229348291277823", + "15824584200569172538463599", + "41622710758893337354001450" + ], + "mAssetSupply": "70473546989729454540158352" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "98431965859130950811648", + "expectedQty": "97549229462419835801578", + "swapFee": "59059179515478570486", + "reserves": [ + "13026510062766928455476245", + "15824584200569172538463599", + "41622710758893337354001450" + ], + "mAssetSupply": "70375174083049839067917190" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "82617073539694553202688", + "outputIndex": 2, + "expectedQty": "83505950452867234559077", + "swapFee": "49795518010225391977", + "reserves": [ + "13026510062766928455476245", + "15907201274108867091666287", + "41539204808440470119442373" + ], + "mAssetSupply": "70375223878567849293309167", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mintMulti", + "inputQtys": [ + "368579150218539904", + "770379897614145280", + "428955672836299648" + ], + "expectedQty": "1571612767317443127", + "reserves": [ + "13026510431346078674016149", + "15907202044488764705811567", + "41539205237396142955742021" + ], + "mAssetSupply": "70375225450180616610752294" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "366002275058273029718016", + "60509671626837883617280", + "104771123043527404027904" + ], + "expectedQty": "534049187828965238369120", + "swapFee": "320621885828876468902", + "reserves": [ + "12660508156287805644298133", + "15846692372861926822194287", + "41434434114352615551714117" + ], + "mAssetSupply": "69841176262351651372383174" + }, + { + "type": "redeemMasset", + "inputQty": "728302958193934126284", + "expectedQtys": [ + "131984021892384440769", + "165199545487670449977", + "431948164460623977530" + ], + "redemptionFee": "218490887458180237", + "reserves": [ + "12660376172265913259857364", + "15846527173316439151744310", + "41434002166188154927736587" + ], + "mAssetSupply": "69840448177884344896437127" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "332505289522835900858368", + "outputIndex": 0, + "expectedQty": "330620111184655950623692", + "swapFee": "200357357976634196110", + "reserves": [ + "12329756061081257309233672", + "16179032462839275052602678", + "41434002166188154927736587" + ], + "mAssetSupply": "69840648535242321530633237", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemBassets", + "inputQtys": [ + "11303227770296973312", + "43901913282594471936", + "74997662372376510464" + ], + "expectedQty": "129970499673325342869", + "swapFee": "78029117274359821", + "reserves": [ + "12329744757853487012260360", + "16178988560925992458130742", + "41433927168525782551226123" + ], + "mAssetSupply": "69840518564742648205290368" + }, + { + "type": "mintMulti", + "inputQtys": [ + "1246044025004752896000", + "385450542790500810752", + "361905715579635433472" + ], + "expectedQty": "2004538339682329327539", + "reserves": [ + "12330990801878491765156360", + "16179374011468782958941494", + "41434289074241362186659595" + ], + "mAssetSupply": "69842523103082330534617907" + }, + { + "type": "mintMulti", + "inputQtys": [ + "2087780853386511384576", + "529932190344816230400", + "2079026614623210307584" + ], + "expectedQty": "4704711096080140174476", + "reserves": [ + "12333078582731878276540936", + "16179903943659127775171894", + "41436368100855985396967179" + ], + "mAssetSupply": "69847227814178410674792383" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "997523869478051", + "948678431568048", + "400199657530056" + ], + "expectedQty": "2357150202682118", + "swapFee": "1415139205132", + "reserves": [ + "12333078581734354407062885", + "16179903942710449343603846", + "41436368100455785739437123" + ], + "mAssetSupply": "69847227811821260472110265" + }, + { + "type": "mintMulti", + "inputQtys": [ + "137087310597929073377280", + "17549222591898702577664", + "224545723210789872992256" + ], + "expectedQty": "379017137353320104327764", + "reserves": [ + "12470165892332283480440165", + "16197453165302348046181510", + "41660913823666575612429379" + ], + "mAssetSupply": "70226244949174580576438029" + }, + { + "type": "redeemMasset", + "inputQty": "245654170059902183853260", + "expectedQtys": [ + "43608044977070135997826", + "56642331164239697269465", + "145687797539677297959050" + ], + "redemptionFee": "73696251017970655155", + "reserves": [ + "12426557847355213344442339", + "16140810834138108348912045", + "41515226026126898314470329" + ], + "mAssetSupply": "69980664475365696363239924" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "2058456784079675719680", + "outputIndex": 1, + "expectedQty": "2068300188467592814984", + "swapFee": "1246867993149612173", + "reserves": [ + "12428616304139293020162019", + "16138742533949640756097061", + "41515226026126898314470329" + ], + "mAssetSupply": "69980665722233689512852097", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "285516058673229103104", + "expectedQty": "282646289138331838261", + "swapFee": "171309635203937461", + "reserves": [ + "12428333657850154688323758", + "16138742533949640756097061", + "41515226026126898314470329" + ], + "mAssetSupply": "69980380377484651487686454" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "139026616629446085443584", + "expectedQty": "139909471994020260273727", + "swapFee": "83415969977667651266", + "reserves": [ + "12428333657850154688323758", + "16138742533949640756097061", + "41375316554132878054196602" + ], + "mAssetSupply": "69841437176825183069894136" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "1614274589046392225792", + "expectedQty": "1629581469491509080750", + "reserves": [ + "12429947932439201080549550", + "16138742533949640756097061", + "41375316554132878054196602" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "40860821095917328", + "27828784286086596", + "16414952559220514" + ], + "expectedQty": "85493073760876472", + "swapFee": "51326640240670", + "reserves": [ + "12429947891578379984632222", + "16138742506120856470010465", + "41375316537717925494976088" + ], + "mAssetSupply": "69843066672801600818098414" + }, + { + "type": "redeemMasset", + "inputQty": "7989994338248967585792", + "expectedQtys": [ + "1421550104315813254349", + "1845706135956208527675", + "4731885125612058982151" + ], + "redemptionFee": "2396998301474690275", + "reserves": [ + "12428526341474064171377873", + "16136896799984900261482790", + "41370584652592313435993937" + ], + "mAssetSupply": "69835079075461653325202897" + }, + { + "type": "redeemMasset", + "inputQty": "119486633442612923596", + "expectedQtys": [ + "21258617846770123125", + "27601673189434625530", + "70763131932389959525" + ], + "redemptionFee": "35845990032783877", + "reserves": [ + "12428505082856217401254748", + "16136869198311710826857260", + "41370513889460381046034412" + ], + "mAssetSupply": "69834959624674200745063178" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "667503710289354031104", + "54956108806309011456", + "271953641841307811840" + ], + "expectedQty": "999094392026367051170", + "swapFee": "599816525130898769", + "reserves": [ + "12427837579145928047223644", + "16136814242202904517845804", + "41370241935818539738222572" + ], + "mAssetSupply": "69833960530282174378012008" + }, + { + "type": "mintMulti", + "inputQtys": [ + "249903679559585553711104", + "261410185454807261642752", + "279317347587909446795264" + ], + "expectedQty": "792120351837859711020155", + "reserves": [ + "12677741258705513600934748", + "16398224427657711779488556", + "41649559283406449185017836" + ], + "mAssetSupply": "70626080882120034089032163" + }, + { + "type": "mintMulti", + "inputQtys": [ + "88112310100064599015424", + "105289520614836082311168", + "49604410664826871742464" + ], + "expectedQty": "243898565877692323046032", + "reserves": [ + "12765853568805578199950172", + "16503513948272547861799724", + "41699163694071276056760300" + ], + "mAssetSupply": "70869979447997726412078195" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "1100560497180225155629056", + "155737539426256081125376", + "23562059853049192513536" + ], + "expectedQty": "1291423102677428929571409", + "swapFee": "775319053038280325938", + "reserves": [ + "11665293071625353044321116", + "16347776408846291780674348", + "41675601634218226864246764" + ], + "mAssetSupply": "69578556345320297482506786" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "18651367468765376", + "397768099680222592", + "113028983476662768" + ], + "expectedQty": "530361226657654790", + "swapFee": "318407780662990", + "reserves": [ + "11665293052973985575555740", + "16347776011078192100451756", + "41675601521189243387583996" + ], + "mAssetSupply": "69578555814959070824851996" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "22009831685036561137664", + "outputIndex": 0, + "expectedQty": "21836090155828942852383", + "swapFee": "13256461665931464641", + "reserves": [ + "11643456962818156632703357", + "16369785842763228661589420", + "41675601521189243387583996" + ], + "mAssetSupply": "69578569071420736756316637", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemMasset", + "inputQty": "15763156833920936941977", + "expectedQtys": [ + "2637055911772383430614", + "3707493459112536864709", + "9438854089389107068389" + ], + "redemptionFee": "4728947050176281082", + "reserves": [ + "11640819906906384249272743", + "16366078349304116124724711", + "41666162667099854280515607" + ], + "mAssetSupply": "69562810643533865995655742" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "130975234671496182890496", + "expectedQty": "131854653078971850851547", + "swapFee": "78585140802897709734", + "reserves": [ + "11640819906906384249272743", + "16366078349304116124724711", + "41534308014020882429664060" + ], + "mAssetSupply": "69431913994003172710474980" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "8249634532959552404455424", + "expectedQty": "8297080731598083467757350", + "reserves": [ + "19890454439865936653728167", + "16366078349304116124724711", + "41534308014020882429664060" + ] + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "8118201774947880140800", + "outputIndex": 2, + "expectedQty": "8196164149253057147109", + "swapFee": "4897175707032714897", + "reserves": [ + "19890454439865936653728167", + "16374196551079064004865511", + "41526111849871629372516951" + ], + "mAssetSupply": "77728999622776963210947227", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemMasset", + "inputQty": "1544062595183523817062", + "expectedQtys": [ + "394999205171702990069", + "325170781922319124499", + "824655928508845404645" + ], + "redemptionFee": "463218778555057145", + "reserves": [ + "19890059440660764950738098", + "16373871380297141685741012", + "41525287193943120527112306" + ], + "mAssetSupply": "77727456023400558242187310" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "345887450398995584", + "expectedQty": "344237566373639243", + "reserves": [ + "19890059440660764950738098", + "16373871380297141685741012", + "41525287539830570926107890" + ] + }, + { + "type": "redeemMasset", + "inputQty": "16927485760766889164", + "expectedQtys": [ + "4330357727920475913", + "3564832004609138624", + "9040664274467920141" + ], + "redemptionFee": "5078245728230066", + "reserves": [ + "19890055110303037030262185", + "16373867815465137076602388", + "41525278499166296458187749" + ], + "mAssetSupply": "77727439445230609577167455" + }, + { + "type": "redeemMasset", + "inputQty": "7500217260978409", + "expectedQtys": [ + "1918691543219999", + "1579502999519664", + "4005730514287738" + ], + "redemptionFee": "2250065178293", + "reserves": [ + "19890055108384345487042186", + "16373867813885634077082724", + "41525278495160565943900011" + ], + "mAssetSupply": "77727439437732642381367339" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "691106297809455546368", + "1783362381985468121088", + "3042782354328528093184" + ], + "expectedQty": "5514012845869755351382", + "swapFee": "3310393943888186122", + "reserves": [ + "19889364002086536031495818", + "16372084451503648608961636", + "41522235712806237415806827" + ], + "mAssetSupply": "77721925424886772626015957" + }, + { + "type": "redeemMasset", + "inputQty": "15988216329376435", + "expectedQtys": [ + "4090223626665115", + "3366899345513091", + "8538997502718598" + ], + "redemptionFee": "4796464898812", + "reserves": [ + "19889363997996312404830703", + "16372084448136749263448545", + "41522235704267239913088229" + ], + "mAssetSupply": "77721925408903352761538334" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "144217282153541063933952", + "5529614918271944884224", + "106223208012564681195520" + ], + "expectedQty": "255845684127246065185244", + "swapFee": "153599570218478726346", + "reserves": [ + "19745146715842771340896751", + "16366554833218477318564321", + "41416012496254675231892709" + ], + "mAssetSupply": "77466079724776106696353090" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "16478462958919639040", + "expectedQty": "16566397301380083288", + "reserves": [ + "19745146715842771340896751", + "16366571311681436238203361", + "41416012496254675231892709" + ] + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "56881366932471408", + "expectedQty": "57184903672778926", + "reserves": [ + "19745146715842771340896751", + "16366571368562803170674769", + "41416012496254675231892709" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "59003506776575949406208", + "211430534756068126359552", + "215561850426708295942144" + ], + "expectedQty": "486232164789365428376447", + "reserves": [ + "19804150222619347290302959", + "16578001903318871297034321", + "41631574346681383527834853" + ], + "mAssetSupply": "77952328513147677177591751" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "689831699206399548456960", + "expectedQty": "687558020763771680067437", + "swapFee": "413899019523839729074", + "reserves": [ + "19116592201855575610235522", + "16578001903318871297034321", + "41631574346681383527834853" + ], + "mAssetSupply": "77262910712960801468863865" + }, + { + "type": "mintMulti", + "inputQtys": [ + "10841171935488529924096", + "25133053904581996576768", + "24477577028183332487168" + ], + "expectedQty": "60491738678666397670845", + "reserves": [ + "19127433373791064140159618", + "16603134957223453293611089", + "41656051923709566860322021" + ], + "mAssetSupply": "77323402451639467866534710" + }, + { + "type": "mintMulti", + "inputQtys": [ + "577597610202707", + "27853140563053736", + "4017234823181678" + ], + "expectedQty": "32571605714939528", + "reserves": [ + "19127433374368661750362325", + "16603134985076593856664825", + "41656051927726801683503699" + ], + "mAssetSupply": "77323402484211073581474238" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "283558251759883809456128", + "expectedQty": "284966301859392328442204", + "reserves": [ + "19127433374368661750362325", + "16886693236836477666120953", + "41656051927726801683503699" + ] + }, + { + "type": "redeemMasset", + "inputQty": "59173707212063304685977", + "expectedQtys": [ + "14579633711790664449156", + "12871659107508191517228", + "31751775949167789660391" + ], + "redemptionFee": "17752112163618991405", + "reserves": [ + "19112853740656871085913169", + "16873821577728969474603725", + "41624300151777633893843308" + ], + "mAssetSupply": "77549212830970566224221870" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "511017116716073", + "expectedQty": "508244750181324", + "swapFee": "306610270029", + "reserves": [ + "19112853740656871085913169", + "16873821577220724724422401", + "41624300151777633893843308" + ], + "mAssetSupply": "77549212830459855717775826" + }, + { + "type": "redeemMasset", + "inputQty": "91696270954304556236", + "expectedQtys": [ + "22592771456224237742", + "19946073969912095280", + "49202924540460170723" + ], + "redemptionFee": "27508881286291366", + "reserves": [ + "19112831147885414861675427", + "16873801631146754812327121", + "41624250948853093433672585" + ], + "mAssetSupply": "77549121161697782699510956" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "1873676524377770374987776", + "958789794995776597786624", + "1526139085680390617169920" + ], + "expectedQty": "4361850068301543314110427", + "swapFee": "2618681249730764447134", + "reserves": [ + "17239154623507644486687651", + "15915011836150978214540497", + "40098111863172702816502665" + ], + "mAssetSupply": "73187271093396239385400529" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "608581613284422913622016", + "970681687075452039987200", + "467777395537466055720960" + ], + "expectedQty": "2051898858700847427023900", + "swapFee": "1231878442285879984204", + "reserves": [ + "16630573010223221573065635", + "14944330149075526174553297", + "39630334467635236760781705" + ], + "mAssetSupply": "71135372234695391958376629" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "26037874287947645190144", + "outputIndex": 0, + "expectedQty": "26067999863678857187439", + "swapFee": "15709495448162746876", + "reserves": [ + "16604505010359542715878196", + "14970368023363473819743441", + "39630334467635236760781705" + ], + "mAssetSupply": "71135387944190840121123505", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mintMulti", + "inputQtys": [ + "1224871664578000060416", + "868168184811908890624", + "768512445003574149120" + ], + "expectedQty": "2866827219721890420210", + "reserves": [ + "16605729882024120715938612", + "14971236191548285728634065", + "39631102980080240334930825" + ], + "mAssetSupply": "71138254771410562011543715" + }, + { + "type": "redeemMasset", + "inputQty": "14886938159714", + "expectedQtys": [ + "3474000200068", + "3132056097155", + "8291021271566" + ], + "redemptionFee": "4466081447", + "reserves": [ + "16605729882020646715738544", + "14971236191545153672536910", + "39631102980071949313659259" + ], + "mAssetSupply": "71138254771395679539465448" + }, + { + "type": "mintMulti", + "inputQtys": [ + "7651248503306643832832", + "167420374464504027676672", + "25811361549785575194624" + ], + "expectedQty": "201685933423186945603168", + "reserves": [ + "16613381130523953359571376", + "15138656566009657700213582", + "39656914341621734888853883" + ], + "mAssetSupply": "71339940704818866485068616" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "10747108725626333298688", + "8334021775243990794240", + "10019174721127620542464" + ], + "expectedQty": "29132253580849832177659", + "swapFee": "17489846056143585457", + "reserves": [ + "16602634021798327026272688", + "15130322544234413709419342", + "39646895166900607268311419" + ], + "mAssetSupply": "71310808451238016652890957" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "3510870554373400276500480", + "expectedQty": "3524819804802779127371865", + "reserves": [ + "16602634021798327026272688", + "18641193098607813985919822", + "39646895166900607268311419" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "118508933500879914401792", + "158899239344476908421120", + "9482042266266525237248" + ], + "expectedQty": "287817281173932480081006", + "reserves": [ + "16721142955299206940674480", + "18800092337952290894340942", + "39656377209166873793548667" + ], + "mAssetSupply": "75123445537214728260343828" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "2634204033400022591602688", + "398443248991493282594816", + "1487287212711767602888704" + ], + "expectedQty": "4527928808064397223902340", + "swapFee": "2718388317829335935902", + "reserves": [ + "14086938921899184349071792", + "18401649088960797611746126", + "38169089996455106190659963" + ], + "mAssetSupply": "70595516729150331036441488" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "545391313305575865974784", + "expectedQty": "543809672867255194817921", + "swapFee": "327234787983345519584", + "reserves": [ + "14086938921899184349071792", + "17857839416093542416928205", + "38169089996455106190659963" + ], + "mAssetSupply": "70050452650632738515986288" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "5058719083613469984948224", + "expectedQty": "5064977988670470670433526", + "reserves": [ + "14086938921899184349071792", + "22916558499707012401876429", + "38169089996455106190659963" + ] + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "1189261357810092343296", + "expectedQty": "1188286660608390593434", + "swapFee": "713556814686055405", + "reserves": [ + "14086938921899184349071792", + "22915370213046404011282995", + "38169089996455106190659963" + ], + "mAssetSupply": "75114242091502213780131923" + }, + { + "type": "mintMulti", + "inputQtys": [ + "1421886882452407861641216", + "531297497593838112342016", + "179326871183864587354112" + ], + "expectedQty": "2141453577127659763135577", + "reserves": [ + "15508825804351592210713008", + "23446667710640242123625011", + "38348416867638970778014075" + ], + "mAssetSupply": "77255695668629873543267500" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "25797728297974111404032", + "outputIndex": 0, + "expectedQty": "25525839693996366089913", + "swapFee": "15417712823403117788", + "reserves": [ + "15483299964657595844623095", + "23446667710640242123625011", + "38374214595936944889418107" + ], + "mAssetSupply": "77255711086342696946385288", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemBassets", + "inputQtys": [ + "10177931390848736428032", + "1037164261669871943680", + "34406622961056660586496" + ], + "expectedQty": "45548331755953293508398", + "swapFee": "27345406297350386336", + "reserves": [ + "15473122033266747108195063", + "23445630546378572251681331", + "38339807972975888228831611" + ], + "mAssetSupply": "77210162754586743652876890" + }, + { + "type": "mintMulti", + "inputQtys": [ + "636022222250481156096", + "723239269486657011712", + "168330550263552049152" + ], + "expectedQty": "1531062480403566685299", + "reserves": [ + "15473758055488997589351159", + "23446353785648058908693043", + "38339976303526151780880763" + ], + "mAssetSupply": "77211693817067147219562189" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "18946048849266528485376", + "expectedQty": "18820052293107285724855", + "swapFee": "11367629309559917091", + "reserves": [ + "15454938003195890303626304", + "23446353785648058908693043", + "38339976303526151780880763" + ], + "mAssetSupply": "77192759135847190250993904" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "30323692951118", + "expectedQty": "30334710249965", + "reserves": [ + "15454938003195890303626304", + "23446353785678382601644161", + "38339976303526151780880763" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "419831408007213285376", + "134960055738047905792", + "235265400895403130880" + ], + "expectedQty": "791738299557358950272", + "reserves": [ + "15455357834603897516911680", + "23446488745734120649549953", + "38340211568927047184011643" + ], + "mAssetSupply": "77193550874177082320194141" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "3293898736017470390272", + "expectedQty": "3280899551424230398116", + "reserves": [ + "15455357834603897516911680", + "23446488745734120649549953", + "38343505467663064654401915" + ] + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "6647944602537901948928", + "expectedQty": "6650355813214947873095", + "reserves": [ + "15455357834603897516911680", + "23453136690336658551498881", + "38343505467663064654401915" + ] + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "164269667994224870555648", + "expectedQty": "165259244373917416789365", + "reserves": [ + "15619627502598122387467328", + "23453136690336658551498881", + "38343505467663064654401915" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "447965353265073720655872", + "330024557301449535520768", + "269328857609410615181312" + ], + "expectedQty": "1049017134140800845048566", + "reserves": [ + "16067592855863196108123200", + "23783161247638108087019649", + "38612834325272475269583227" + ], + "mAssetSupply": "78417758508056439760303283" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "571482194906727", + "outputIndex": 0, + "expectedQty": "565755551848918", + "swapFee": "341585559788", + "reserves": [ + "16067592855297440556274282", + "23783161247638108087019649", + "38612834325843957464489954" + ], + "mAssetSupply": "78417758508056781345863071", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "28775905381198807957504", + "outputIndex": 1, + "expectedQty": "28909401280693729993815", + "swapFee": "17363354143719277882", + "reserves": [ + "16096368760678639364231786", + "23754251846357414357025834", + "38612834325843957464489954" + ], + "mAssetSupply": "78417775871410925065140953", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "2943856350666139509981184", + "expectedQty": "2943850874821471550459746", + "reserves": [ + "16096368760678639364231786", + "26698108197023553867007018", + "38612834325843957464489954" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "169083120970854068912128", + "79562025098057336487936", + "209114473883358306762752" + ], + "expectedQty": "458053468793723799865839", + "swapFee": "274997079523948649108", + "reserves": [ + "15927285639707785295319658", + "26618546171925496530519082", + "38403719851960599157727202" + ], + "mAssetSupply": "80903573277438672815734860" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "57763524291000844288", + "28086530327230758912", + "505171184696791616" + ], + "expectedQty": "86706554821669713575", + "swapFee": "52055165992597386", + "reserves": [ + "15927227876183494294475370", + "26618518085395169299760170", + "38403719346789414460935586" + ], + "mAssetSupply": "80903486570883851146021285" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "49831279014472243478528", + "expectedQty": "49809439053198515975430", + "reserves": [ + "15927227876183494294475370", + "26668349364409641543238698", + "38403719346789414460935586" + ] + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "1183954388743364133519360", + "expectedQty": "1187302750057570172630470", + "swapFee": "710372633246018480111", + "reserves": [ + "15927227876183494294475370", + "26668349364409641543238698", + "37216416596731844288305116" + ], + "mAssetSupply": "79770051993826931546957466" + }, + { + "type": "redeemMasset", + "inputQty": "8714314479054049037516", + "expectedQtys": [ + "1739415113351171411579", + "2912454715484276523878", + "4064410831336745151225" + ], + "redemptionFee": "2614294343716214711", + "reserves": [ + "15925488461070143123063791", + "26665436909694157266714820", + "37212352185900507543153891" + ], + "mAssetSupply": "79761340293642221214134661" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "533131433223822908588032", + "309262907504257165950976", + "592629355518538146643968" + ], + "expectedQty": "1436153990926504903911813", + "swapFee": "862209720388135823841", + "reserves": [ + "15392357027846320214475759", + "26356174002189900100763844", + "36619722830381969396509923" + ], + "mAssetSupply": "78325186302715716310222848" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "78560200227852926976", + "expectedQty": "78018931946568390587", + "swapFee": "47136120136711756", + "reserves": [ + "15392279008914373646085172", + "26356174002189900100763844", + "36619722830381969396509923" + ], + "mAssetSupply": "78325107789651608594007628" + }, + { + "type": "redeemMasset", + "inputQty": "1341479836418905", + "expectedQtys": [ + "263545598339306", + "451268694084823", + "627000508421351" + ], + "redemptionFee": "402443950925", + "reserves": [ + "15392279008650828047745866", + "26356174001738631406679021", + "36619722829754968888088572" + ], + "mAssetSupply": "78325107788310531201539648" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "411725376714578730156032", + "1678390833575294075404288", + "1654490259055355015200768" + ], + "expectedQty": "3740654916878348831483213", + "swapFee": "2245740394363627475375", + "reserves": [ + "14980553631936249317589834", + "24677783168163337331274733", + "34965232570699613872887804" + ], + "mAssetSupply": "74584452871432182370056435" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "24465884401239463034880", + "expectedQty": "24462036534709131904490", + "swapFee": "14679530640743677820", + "reserves": [ + "14980553631936249317589834", + "24653321131628628199370243", + "34965232570699613872887804" + ], + "mAssetSupply": "74560001666561583650699375" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "856022251751531494768640", + "expectedQty": "855549923264621555101355", + "reserves": [ + "14980553631936249317589834", + "25509343383380159694138883", + "34965232570699613872887804" + ] + }, + { + "type": "redeemMasset", + "inputQty": "44878267141783571660", + "expectedQtys": [ + "8911949634671527279", + "15175539504866865714", + "20800859520328405944" + ], + "redemptionFee": "13463480142535071", + "reserves": [ + "14980544719986614646062555", + "25509328207840654827273169", + "34965211769840093544481860" + ], + "mAssetSupply": "75415506725022543564764141" + }, + { + "type": "redeemMasset", + "inputQty": "36751300973552028876", + "expectedQtys": [ + "7298092465339642739", + "12427414320998351546", + "17034050051999910726" + ], + "redemptionFee": "11025390292065608", + "reserves": [ + "14980537421894149306419816", + "25509315780426333828921623", + "34965194735790041544571134" + ], + "mAssetSupply": "75415469984746960304800873" + }, + { + "type": "redeemMasset", + "inputQty": "1116351544305443563110", + "expectedQtys": [ + "221685670393790092855", + "377493117290025246909", + "517423535428341007415" + ], + "redemptionFee": "334905463291633068", + "reserves": [ + "14980315736223755516326961", + "25508938287309043803674714", + "34964677312254613203563719" + ], + "mAssetSupply": "75414353968108118152870831" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "36480377723118652751872", + "expectedQty": "36235747759874184397621", + "swapFee": "21888226633871191651", + "reserves": [ + "14944079988463881331929340", + "25508938287309043803674714", + "34964677312254613203563719" + ], + "mAssetSupply": "75377895478611633371310610" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "195038710466312416", + "347626240608116608", + "433642664540953856" + ], + "expectedQty": "975852845833897836", + "swapFee": "585863225435600", + "reserves": [ + "14944079793425170865616924", + "25508937939682803195558106", + "34964676878611948662609863" + ], + "mAssetSupply": "75377894502758787537412774" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "67591102279957776", + "expectedQty": "67773138113746858", + "swapFee": "40554661367974", + "reserves": [ + "14944079793425170865616924", + "25508937939682803195558106", + "34964676810838810548863005" + ], + "mAssetSupply": "75377894435208239918822972" + }, + { + "type": "mintMulti", + "inputQtys": [ + "1151362570743137542602752", + "792111988971661969850368", + "1151511490991579805515776" + ], + "expectedQty": "3097567282104336998552620", + "reserves": [ + "16095442364168308408219676", + "26301049928654465165408474", + "36116188301830390354378781" + ], + "mAssetSupply": "78475461717312576917375592" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "874091284597681553408", + "expectedQty": "868729071117781476927", + "swapFee": "524454770758608932", + "reserves": [ + "16094573635097190626742749", + "26301049928654465165408474", + "36116188301830390354378781" + ], + "mAssetSupply": "78474588150482749994431116" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "18228918879197809606656", + "24814850127867253096448", + "16062386272562875203584" + ], + "expectedQty": "59144452214348303128032", + "swapFee": "35507976114277548405", + "reserves": [ + "16076344716217992817136093", + "26276235078526597912312026", + "36100125915557827479175197" + ], + "mAssetSupply": "78415443698268401691303084" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "55819909445775080", + "outputIndex": 0, + "expectedQty": "55303110939105182", + "swapFee": "33386914591660", + "reserves": [ + "16076344660914881878030911", + "26276235078526597912312026", + "36100125971377736924950277" + ], + "mAssetSupply": "78415443698301788605894744", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemBassets", + "inputQtys": [ + "514181808472001177714688", + "1158492349364421691179008", + "1066814909064586459086848" + ], + "expectedQty": "2738422973319964290297314", + "swapFee": "1644040208116848683388", + "reserves": [ + "15562162852442880700316223", + "25117742729162176221133018", + "35033311062313150465863429" + ], + "mAssetSupply": "75677020724981824315597430" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "909509271360840769994752", + "outputIndex": 2, + "expectedQty": "911218664748129625044948", + "swapFee": "545407164567966979388", + "reserves": [ + "15562162852442880700316223", + "26027252000523016991127770", + "34122092397565020840818481" + ], + "mAssetSupply": "75677566132146392282576818", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "336838875872432113057792", + "expectedQty": "338645833431701179849192", + "reserves": [ + "15899001728315312813374015", + "26027252000523016991127770", + "34122092397565020840818481" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "1660637991320797577216", + "662870195213542752256", + "12363545998649506922496" + ], + "expectedQty": "14659868518911374055947", + "swapFee": "8801201832446292208", + "reserves": [ + "15897341090323992015796799", + "26026589130327803448375514", + "34109728851566371333895985" + ], + "mAssetSupply": "76001552097059182088370063" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "4174782918673192502427648", + "expectedQty": "4161362130884374929785510", + "reserves": [ + "15897341090323992015796799", + "26026589130327803448375514", + "38284511770239563836323633" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "4616976169611338186752", + "21596835362701391691776", + "363652755940647305216" + ], + "expectedQty": "26598429578325355258225", + "swapFee": "15968638930353425210", + "reserves": [ + "15892724114154380677610047", + "26004992294965102056683738", + "38284148117483623189018417" + ], + "mAssetSupply": "80136315798365231662897348" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "2535618732119893737472", + "1079937200254812684288", + "4691666187420388294656" + ], + "expectedQty": "8305902526807065548556", + "swapFee": "4986533436145926885", + "reserves": [ + "15890188495422260783872575", + "26003912357764847243999450", + "38279456451296202800723761" + ], + "mAssetSupply": "80128009895838424597348792" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "10359980449907111936", + "17587831841950728192", + "12266512501553817600" + ], + "expectedQty": "40229683551101471028", + "swapFee": "24152301511567823", + "reserves": [ + "15890178135441810876760639", + "26003894769933005293271258", + "38279444184783701246906161" + ], + "mAssetSupply": "80127969666154873495877764" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "144846288938061627392", + "expectedQty": "145744441878516950146", + "reserves": [ + "15890322981730748938388031", + "26003894769933005293271258", + "38279444184783701246906161" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "752041219675226112000", + "1072365728327828635648", + "114447014151095566336" + ], + "expectedQty": "1942794749365197367783", + "reserves": [ + "15891075022950424164500031", + "26004967135661333121906906", + "38279558631797852342472497" + ], + "mAssetSupply": "80130058205346117210195693" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "24066182851162724630528", + "expectedQty": "24215130562724633874349", + "reserves": [ + "15915141205801586889130559", + "26004967135661333121906906", + "38279558631797852342472497" + ] + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "14604983991727948958793728", + "outputIndex": 0, + "hardLimitError": true + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "1907667856970408481783808", + "outputIndex": 0, + "expectedQty": "1891154367425949636004274", + "swapFee": "1143996506384816859394", + "reserves": [ + "14023986838375637253126285", + "27912634992631741603690714", + "38279558631797852342472497" + ], + "mAssetSupply": "80155417332415226660929436", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemBassets", + "inputQtys": [ + "4152120616105507553280", + "3281687706366104829952", + "5023410616502730096640" + ], + "expectedQty": "12469920887986420057302", + "swapFee": "7486444399431510940", + "reserves": [ + "14019834717759531745573005", + "27909353304925375498860762", + "38274535221181349612375857" + ], + "mAssetSupply": "80142947411527240240872134" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "27398715225463607787520", + "19444200689206915235840", + "132670979344493527040" + ], + "expectedQty": "47191853232775294311140", + "swapFee": "28332111206389009992", + "reserves": [ + "13992436002534068137785485", + "27889909104236168583624922", + "38274402550202005118848817" + ], + "mAssetSupply": "80095755558294464946560994" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "2980226970924472598528", + "outputIndex": 1, + "expectedQty": "3008194918823848127754", + "swapFee": "1803832941632885790", + "reserves": [ + "13995416229504992610384013", + "27886900909317344735497168", + "38274402550202005118848817" + ], + "mAssetSupply": "80095757362127406579446784", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemBassets", + "inputQtys": [ + "140767343480510370283520", + "1069249912251238179667968", + "563947549133241923403776" + ], + "expectedQty": "1771770184730915231345166", + "swapFee": "1063700331037171441672", + "reserves": [ + "13854648886024482240100493", + "26817650997066106555829200", + "37710455001068763195445041" + ], + "mAssetSupply": "78323987177396491348101618" + }, + { + "type": "mintMulti", + "inputQtys": [ + "121510822596950392832", + "5727899060579041542144", + "2411311450488439308288" + ], + "expectedQty": "8246363420281387163332", + "reserves": [ + "13854770396847079190493325", + "26823378896126685597371344", + "37712866312519251634753329" + ], + "mAssetSupply": "78332233540816772735264950" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "212633759436031885312", + "expectedQty": "214444563189225140534", + "reserves": [ + "13854983030606515222378637", + "26823378896126685597371344", + "37712866312519251634753329" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "136744294891115056", + "87554431404076576", + "69399747955277176" + ], + "expectedQty": "294498728963169346", + "reserves": [ + "13854983167350810113493693", + "26823378983681117001447920", + "37712866381918999590030505" + ], + "mAssetSupply": "78332448279878690923574830" + }, + { + "type": "redeemMasset", + "inputQty": "7676490676376709785190", + "expectedQtys": [ + "1357365231722306030900", + "2627871978621918808644", + "3694709188534787238424" + ], + "redemptionFee": "2302947202913012935", + "reserves": [ + "13853625802119087807462793", + "26820751111702495082639276", + "37709171672730464802792081" + ], + "mAssetSupply": "78324774092149517126802575" + }, + { + "type": "redeemMasset", + "inputQty": "13679851450214789205196", + "expectedQtys": [ + "2418885857673163619642", + "4682985991028087963137", + "6584137854350362930378" + ], + "redemptionFee": "4103955435064436761", + "reserves": [ + "13851206916261414643843151", + "26816068125711466994676139", + "37702587534876114439861703" + ], + "mAssetSupply": "78311098344654737402034140" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "721900795364012851200", + "expectedQty": "722204244723462208253", + "swapFee": "433140477218407710", + "reserves": [ + "13851206916261414643843151", + "26815345921466743532467886", + "37702587534876114439861703" + ], + "mAssetSupply": "78310376876999850607590650" + }, + { + "type": "mintMulti", + "inputQtys": [ + "10176324951762999967744", + "13389471160571506196480", + "9726307030377449914368" + ], + "expectedQty": "33326549585710011849178", + "reserves": [ + "13861383241213177643810895", + "26828735392627315038664366", + "37712313841906491889776071" + ], + "mAssetSupply": "78343703426585560619439828" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "1632702875742463166775296", + "expectedQty": "1626002875451181586124056", + "reserves": [ + "13861383241213177643810895", + "26828735392627315038664366", + "39345016717648955056551367" + ] + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "757096285866355968", + "outputIndex": 1, + "expectedQty": "764148639239657990", + "swapFee": "458362004904290", + "reserves": [ + "13861383998309463510166863", + "26828734628478675799006376", + "39345016717648955056551367" + ], + "mAssetSupply": "79969706302495104210468174", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemBassets", + "inputQtys": [ + "34601570592585525755904", + "56299244994594460401664", + "27678122598875399192576" + ], + "expectedQty": "118724992658726176911915", + "swapFee": "71277762252587258502", + "reserves": [ + "13826782427716877984410959", + "26772435383484081338604712", + "39317338595050079657358791" + ], + "mAssetSupply": "79850981309836378033556259" + }, + { + "type": "mintMulti", + "inputQtys": [ + "168575967352904482816", + "356329215755433148416", + "558543013667714629632" + ], + "expectedQty": "1082285276553026891036", + "reserves": [ + "13826951003684230888893775", + "26772791712699836771753128", + "39317897138063747371988423" + ], + "mAssetSupply": "79852063595112931060447295" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "14603434384820755496960", + "6216258339041138704384", + "822945456800949862400" + ], + "expectedQty": "21766155480874403215713", + "swapFee": "13067533808809927886", + "reserves": [ + "13812347569299410133396815", + "26766575454360795633048744", + "39317074192606946422126023" + ], + "mAssetSupply": "79830297439632056657231582" + }, + { + "type": "mintMulti", + "inputQtys": [ + "5363624418442041360384", + "15385680132992841809920", + "102537681319996076064768" + ], + "expectedQty": "122884287525915132987154", + "reserves": [ + "13817711193717852174757199", + "26781961134493788474858664", + "39419611873926942498190791" + ], + "mAssetSupply": "79953181727157971790218736" + }, + { + "type": "mintMulti", + "inputQtys": [ + "5276609037310782078976", + "6189982013424091004928", + "5892202128267954618368" + ], + "expectedQty": "17376260625436036056183", + "reserves": [ + "13822987802755162956836175", + "26788151116507212565863592", + "39425504076055210452809159" + ], + "mAssetSupply": "79970557987783407826274919" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "346356729675512479744", + "433615342777216335872", + "221415855429773983744" + ], + "expectedQty": "1003217810069362596219", + "swapFee": "602292061278384588", + "reserves": [ + "13822641446025487444356431", + "26787717501164435349527720", + "39425282660199780678825415" + ], + "mAssetSupply": "79969554769973338463678700" + }, + { + "type": "redeemMasset", + "inputQty": "8846747329650217779", + "expectedQtys": [ + "1528690900281834363", + "2962540853226368457", + "4360170310358165879" + ], + "redemptionFee": "2654024198895065", + "reserves": [ + "13822639917334587162522068", + "26787714538623582123159263", + "39425278300029470320659536" + ], + "mAssetSupply": "79969545925880033012355986" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "177082456950924", + "outputIndex": 0, + "expectedQty": "175226636943533", + "swapFee": "106157117887", + "reserves": [ + "13822639917159360525578535", + "26787714538800664580110187", + "39425278300029470320659536" + ], + "mAssetSupply": "79969545925880139169473873", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemMasset", + "inputQty": "218880046483005531750", + "expectedQtys": [ + "37821803069492974710", + "73297117630227847729", + "107876289967778241609" + ], + "redemptionFee": "65664013944901659", + "reserves": [ + "13822602095356291032603825", + "26787641241683034352262458", + "39425170423739502542417927" + ], + "mAssetSupply": "79969327111497670108843782" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "424032855123484194373632", + "274388415971125079572480", + "448851324926187809013760" + ], + "expectedQty": "1149030500186735680434710", + "swapFee": "689832199431700428517", + "reserves": [ + "13398569240232806838230193", + "26513252825711909272689978", + "38976319098813314733404167" + ], + "mAssetSupply": "78820296611310934428409072" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "120168048274789527191552", + "expectedQty": "120052154460194486223059", + "reserves": [ + "13398569240232806838230193", + "26633420873986698799881530", + "38976319098813314733404167" + ] + }, + { + "type": "redeemMasset", + "inputQty": "14196424473683870246502", + "expectedQtys": [ + "2408840544975632206333", + "4788247379430250376668", + "7007295783284563646303" + ], + "redemptionFee": "4258927342105161073", + "reserves": [ + "13396160399687831206023860", + "26628632626607268549504862", + "38969311803030030169757864" + ], + "mAssetSupply": "78926156600224787149546702" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "392534979531862733488128", + "expectedQty": "394001727687782771359396", + "swapFee": "235520987719117640092", + "reserves": [ + "13396160399687831206023860", + "26628632626607268549504862", + "38575310075342247398398468" + ], + "mAssetSupply": "78533857141680643533698666" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "1416623595377686896181248", + "expectedQty": "1416939098195801602988335", + "swapFee": "849974157226612137708", + "reserves": [ + "13396160399687831206023860", + "25211693528411466946516527", + "38575310075342247398398468" + ], + "mAssetSupply": "77118083520460183249655126" + }, + { + "type": "mintMulti", + "inputQtys": [ + "637587621297044193280", + "582725431997319675904", + "70152812144132661248" + ], + "expectedQty": "1295552569831860026776", + "reserves": [ + "13396797987309128250217140", + "25212276253843464266192431", + "38575380228154391531059716" + ], + "mAssetSupply": "77119379073030015109681902" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "25710274415484987244544", + "expectedQty": "25710784780403230296706", + "swapFee": "15426164649290992346", + "reserves": [ + "13396797987309128250217140", + "25186565469063061035895725", + "38575380228154391531059716" + ], + "mAssetSupply": "77093684224779179413429704" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "10643922825129914007552", + "outputIndex": 1, + "expectedQty": "10740045790941013466364", + "swapFee": "6443951629514494239", + "reserves": [ + "13407441910134258164224692", + "25175825423272120022429361", + "38575380228154391531059716" + ], + "mAssetSupply": "77093690668730808927923943", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "1786593523014487320297472", + "expectedQty": "1786127505521867922517589", + "swapFee": "1071956113808692392178", + "reserves": [ + "13407441910134258164224692", + "23389697917750252099911772", + "38575380228154391531059716" + ], + "mAssetSupply": "75308169101830130300018649" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "125135814894691398189056", + "outputIndex": 0, + "expectedQty": "123411637451185736942292", + "swapFee": "74734763923774214173", + "reserves": [ + "13284030272683072427282400", + "23389697917750252099911772", + "38700516043049082929248772" + ], + "mAssetSupply": "75308243836594054074232822", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "4615469855981606273024", + "outputIndex": 2, + "expectedQty": "4674988218121933292326", + "swapFee": "2793567513490608947", + "reserves": [ + "13288645742539054033555424", + "23389697917750252099911772", + "38695841054830960995956446" + ], + "mAssetSupply": "75308246630161567564841769", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "575667873461855284363264", + "outputIndex": 2, + "expectedQty": "582707588099366112219807", + "swapFee": "348287394939389708676", + "reserves": [ + "13864313616000909317918688", + "23389697917750252099911772", + "38113133466731594883736639" + ], + "mAssetSupply": "75308594917556506954550445", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mintMulti", + "inputQtys": [ + "1544378333301278769152", + "1164766072328781037568", + "629548875931059617792" + ], + "expectedQty": "3347960680349995755689", + "reserves": [ + "13865857994334210596687840", + "23390862683822580880949340", + "38113763015607525943354431" + ], + "mAssetSupply": "75311942878236856950306134" + }, + { + "type": "mintMulti", + "inputQtys": [ + "1880944401701562998587392", + "4492579272323187538395136", + "6331994741834221099155456" + ], + "expectedQty": "12692302877169245365946857", + "reserves": [ + "15746802396035773595275232", + "27883441956145768419344476", + "44445757757441747042509887" + ], + "mAssetSupply": "88004245755406102316252991" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "824330654933127659520", + "1469489213981120528384", + "616059725890960883712" + ], + "expectedQty": "2913697219370811430565", + "swapFee": "1749267892357901599", + "reserves": [ + "15745978065380840467615712", + "27881972466931787298816092", + "44445141697715856081626175" + ], + "mAssetSupply": "88001332058186731504822426" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "2409702785798152650752", + "expectedQty": "2399029319446978058990", + "reserves": [ + "15745978065380840467615712", + "27881972466931787298816092", + "44447551400501654234276927" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "7805491819866075136", + "5214641166459973632", + "691999395062406784" + ], + "expectedQty": "13773247421116532948", + "reserves": [ + "15745985870872660333690848", + "27881977681572953758789724", + "44447552092501049296683711" + ], + "mAssetSupply": "88003744860753599599414364" + }, + { + "type": "mintMulti", + "inputQtys": [ + "617591722448039322845184", + "208431596007500363595776", + "1399072497181519446540288" + ], + "expectedQty": "2223943140972218942468429", + "reserves": [ + "16363577593320699656536032", + "28090409277580454122385500", + "45846624589682568743223999" + ], + "mAssetSupply": "90227688001725818541882793" + }, + { + "type": "redeemMasset", + "inputQty": "10531561168022293761228", + "expectedQtys": [ + "1909417407912914199946", + "3277786667623580620347", + "5349706846583504010036" + ], + "redemptionFee": "3159468350406688128", + "reserves": [ + "16361668175912786742336086", + "28087131490912830541765153", + "45841274882835985239213963" + ], + "mAssetSupply": "90217159600026146654809693" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "12310496168617323874222080", + "outputIndex": 1, + "expectedQty": "12298100069625595305040305", + "swapFee": "7415885499308741317220", + "reserves": [ + "28672164344530110616558166", + "15789031421287235236724848", + "45841274882835985239213963" + ], + "mAssetSupply": "90224575485525455396126913", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemBassets", + "inputQtys": [ + "10762679470047244288", + "11554433565969446912", + "2154321840222273280" + ], + "expectedQty": "24561105701898457032", + "swapFee": "14745510727575619", + "reserves": [ + "28672153581850640569313878", + "15789019866853669267277936", + "45841272728514145016940683" + ], + "mAssetSupply": "90224550924419753497669881" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "72552828350228315766784", + "109887622630084773412864", + "23223106920617827368960" + ], + "expectedQty": "206519264906776703366962", + "swapFee": "123985950514374646808", + "reserves": [ + "28599600753500412253547094", + "15679132244223584493865072", + "45818049621593527189571723" + ], + "mAssetSupply": "90018031659512976794302919" + }, + { + "type": "redeemMasset", + "inputQty": "2350415102185004911820", + "expectedQtys": [ + "746525623906253090108", + "409267041236408107759", + "1195972921955610618773" + ], + "redemptionFee": "705124530655501473", + "reserves": [ + "28598854227876506000456986", + "15678722977182348085757313", + "45816853648671571578952950" + ], + "mAssetSupply": "90015681949535322444892572" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "2221469614207200133120", + "expectedQty": "2211246047551066876715", + "reserves": [ + "28598854227876506000456986", + "15678722977182348085757313", + "45819075118285778779086070" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "213476264464984702976", + "25199157875694731264", + "210609403274754228224" + ], + "expectedQty": "448472277918991519708", + "reserves": [ + "28599067704140970985159962", + "15678748176340223780488577", + "45819285727689053533314294" + ], + "mAssetSupply": "90018341667860792503288995" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "141670331532821101805568", + "expectedQty": "141629656185329149788317", + "swapFee": "85002198919692661083", + "reserves": [ + "28457438047955641835371645", + "15678748176340223780488577", + "45819285727689053533314294" + ], + "mAssetSupply": "89876756338526891094144510" + }, + { + "type": "mintMulti", + "inputQtys": [ + "6142447090460030", + "412338023155154", + "4060045998092059" + ], + "expectedQty": "10597998234926246", + "reserves": [ + "28457438054098088925831675", + "15678748176752561803643731", + "45819285731749099531406353" + ], + "mAssetSupply": "89876756349124889329070756" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "56145182507522596864", + "expectedQty": "56128674250280004156", + "reserves": [ + "28457494199280596448428539", + "15678748176752561803643731", + "45819285731749099531406353" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "2896835102993973510144", + "12905927373585804951552", + "7471607463939589275648" + ], + "expectedQty": "23355269883763158693544", + "swapFee": "14021574875183005019", + "reserves": [ + "28454597364177602474918395", + "15665842249378975998692179", + "45811814124285159942130705" + ], + "mAssetSupply": "89853457207915376450381368" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "2576517952738879445401600", + "outputIndex": 2, + "expectedQty": "2604327007860889284571428", + "swapFee": "1557647395117194296586", + "reserves": [ + "28454597364177602474918395", + "18242360202117855444093779", + "43207487116424270657559277" + ], + "mAssetSupply": "89855014855310493644677954", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemBassets", + "inputQtys": [ + "448727569213526", + "1201029973238019", + "210087950792117" + ], + "expectedQty": "1866045791767322", + "swapFee": "1120299654853", + "reserves": [ + "28454597363728874905704869", + "18242360200916825470855760", + "43207487116214182706767160" + ], + "mAssetSupply": "89855014853444447852910632" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "27937322499467429019648", + "130072049649746152783872", + "86529670361854737645568" + ], + "expectedQty": "244986995530927258279906", + "swapFee": "147080445585907899707", + "reserves": [ + "28426660041229407476685221", + "18112288151267079318071888", + "43120957445852327969121592" + ], + "mAssetSupply": "89610027857913520594630726" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "14385356259665591140352", + "9270863071387089633280", + "3111350968196879876096" + ], + "expectedQty": "26810191330442616316669", + "swapFee": "16095772261622543315", + "reserves": [ + "28412274684969741885544869", + "18103017288195692228438608", + "43117846094884131089245496" + ], + "mAssetSupply": "89583217666583077978314057" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "1594064077812706836480", + "657291741179521007616", + "318117611287169400832" + ], + "expectedQty": "2572119879594855622168", + "swapFee": "1544198446825008378", + "reserves": [ + "28410680620891929178708389", + "18102359996454512707430992", + "43117527977272843919844664" + ], + "mAssetSupply": "89580645546703483122691889" + }, + { + "type": "mintMulti", + "inputQtys": [ + "37108863006238981488640", + "97309592817634109292544", + "59947506005121838350336" + ], + "expectedQty": "194718734486084030753658", + "reserves": [ + "28447789483898168160197029", + "18199669589272146816723536", + "43177475483277965758195000" + ], + "mAssetSupply": "89775364281189567153445547" + }, + { + "type": "mintMulti", + "inputQtys": [ + "471640627926693184", + "960141125902759424", + "147233289871394176" + ], + "expectedQty": "1584062775826820547", + "reserves": [ + "28447789955538796086890213", + "18199670549413272719482960", + "43177475630511255629589176" + ], + "mAssetSupply": "89775365865252342980266094" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "1506943275373500760588288", + "495911725182811686043648", + "442900327937965402619904" + ], + "expectedQty": "2447165895419544915270121", + "swapFee": "1469181045879254501863", + "reserves": [ + "26940846680165295326301925", + "17703758824230461033439312", + "42734575302573290226969272" + ], + "mAssetSupply": "87328199969832798064995973" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "14082230897771123048448", + "outputIndex": 0, + "expectedQty": "14017655906573357981105", + "swapFee": "8417568398730014035", + "reserves": [ + "26926829024258721968320820", + "17703758824230461033439312", + "42748657533471061350017720" + ], + "mAssetSupply": "87328208387401196795010008", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "473062288357330689982464", + "expectedQty": "469937617918397839333769", + "swapFee": "283837373014398413989", + "reserves": [ + "26926829024258721968320820", + "17233821206312063194105543", + "42748657533471061350017720" + ], + "mAssetSupply": "86855429936416880503441533" + }, + { + "type": "redeemMasset", + "inputQty": "5164855735492068966", + "expectedQtys": [ + "1600722781179467442", + "1024501258089633918", + "2541285121876700036" + ], + "redemptionFee": "1549456720647620", + "reserves": [ + "26926827423535940788853378", + "17233820181810805104471625", + "42748654992185939473317684" + ], + "mAssetSupply": "86855424773110601732020187" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "184225810757660316794880", + "outputIndex": 0, + "expectedQty": "185212500719752761695241", + "swapFee": "111216900727210099287", + "reserves": [ + "26741614922816188027158137", + "17418045992568465421266505", + "42748654992185939473317684" + ], + "mAssetSupply": "86855535990011328942119474", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "13433065536951903372443648", + "expectedQty": "13416697466210551391787665", + "reserves": [ + "40174680459768091399601785", + "17418045992568465421266505", + "42748654992185939473317684" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "701902785879492526080", + "1562625847408457154560", + "824929114325407760384" + ], + "expectedQty": "3099059962829262158313", + "swapFee": "1860552309083007099", + "reserves": [ + "40173978556982211907075705", + "17416483366721056964111945", + "42747830063071614065557300" + ], + "mAssetSupply": "100269134396259051071748826" + }, + { + "type": "redeemMasset", + "inputQty": "123708609166816092723609", + "expectedQtys": [ + "49550403339908894279162", + "21481411764079686739696", + "52724980139238526084504" + ], + "redemptionFee": "37112582750044827817", + "reserves": [ + "40124428153642303012796543", + "17395001954956977277372249", + "42695105082932375539472796" + ], + "mAssetSupply": "100145462899674985023853034" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "1211204626350615296", + "expectedQty": "1207660152295600434", + "reserves": [ + "40124428153642303012796543", + "17395001954956977277372249", + "42695106294137001890088092" + ] + }, + { + "type": "redeemMasset", + "inputQty": "13402689429895190151168", + "expectedQtys": [ + "5368330171643835970333", + "2327313263456996382800", + "5712266513125384126198" + ], + "redemptionFee": "4020806828968557045", + "reserves": [ + "40119059823470659176826210", + "17392674641693520280989449", + "42689394027623876505961894" + ], + "mAssetSupply": "100132065438712071097859345" + }, + { + "type": "redeemMasset", + "inputQty": "9905443337050243937075", + "expectedQtys": [ + "3967538799428187939038", + "1720033115690799096434", + "4221729718341727243264" + ], + "redemptionFee": "2971633001115073181", + "reserves": [ + "40115092284671230988887172", + "17390954608577829481893015", + "42685172297905534778718630" + ], + "mAssetSupply": "100122162967008021968995451" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "23471341436483500244992", + "21627620838915207856128", + "29274046802586348027904" + ], + "expectedQty": "74420559450665421506714", + "swapFee": "44679143156293028721", + "reserves": [ + "40091620943234747488642180", + "17369326987738914274036887", + "42655898251102948430690726" + ], + "mAssetSupply": "100047742407557356547488737" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "366522159259962929315840", + "56609166465762022391808", + "96413913085589063729152" + ], + "expectedQty": "518880424713553400293217", + "swapFee": "311515163926487932935", + "reserves": [ + "39725098783974784559326340", + "17312717821273152251645079", + "42559484338017359366961574" + ], + "mAssetSupply": "99528861982843803147195520" + }, + { + "type": "mintMulti", + "inputQtys": [ + "1991085709110046", + "12026126882267744", + "3206144974081260" + ], + "expectedQty": "17314306094872137", + "reserves": [ + "39725098785965870268436386", + "17312717833299279133912823", + "42559484341223504341042834" + ], + "mAssetSupply": "99528862000158109242067657" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "5043060225098135308861440", + "expectedQty": "5049963913578953454909352", + "swapFee": "3025836135058881185316", + "reserves": [ + "34675134872386916813527034", + "17312717833299279133912823", + "42559484341223504341042834" + ], + "mAssetSupply": "94488827611195032814391533" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "36546978589648990765056", + "35047639492882658754560", + "27404214488551013744640" + ], + "expectedQty": "99122300895619130272006", + "swapFee": "59509085988964857077", + "reserves": [ + "34638587893797267822761978", + "17277670193806396475158263", + "42532080126734953327298194" + ], + "mAssetSupply": "94389705310299413684119527" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "91923531517637760", + "22727547017438252", + "859833987510978944" + ], + "expectedQty": "971732120967009644", + "swapFee": "583389306163904", + "reserves": [ + "34638587801873736305124218", + "17277670171078849457720011", + "42532079266900965816319250" + ], + "mAssetSupply": "94389704338567292717109883" + }, + { + "type": "redeemMasset", + "inputQty": "758158808147436765184", + "expectedQtys": [ + "278141267234785097948", + "138736402988939462288", + "341524501318908773038" + ], + "redemptionFee": "227447642444231029", + "reserves": [ + "34638309660606501520026270", + "17277531434675860518257723", + "42531737742399646907546212" + ], + "mAssetSupply": "94388946407206787724575728" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "97990049832192740163584", + "expectedQty": "98736687463365196737040", + "reserves": [ + "34638309660606501520026270", + "17375521484508053258421307", + "42531737742399646907546212" + ] + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "312384200347415339859968", + "expectedQty": "313197246861682375536660", + "swapFee": "187430520208449203915", + "reserves": [ + "34638309660606501520026270", + "17375521484508053258421307", + "42218540495537964532009552" + ], + "mAssetSupply": "94175486324842946030656715" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "16103645466263666688", + "53817194453693120512", + "112628687563299127296" + ], + "expectedQty": "182571127088618479847", + "swapFee": "109608441317961865", + "reserves": [ + "34638293556961035256359582", + "17375467667313599565300795", + "42218427866850401232882256" + ], + "mAssetSupply": "94175303753715857412176868" + }, + { + "type": "mintMulti", + "inputQtys": [ + "5159014483675691008", + "1446374556692955904", + "8492577216861091840" + ], + "expectedQty": "15073940836564988345", + "reserves": [ + "34638298715975518932050590", + "17375469113688156258256699", + "42218436359427618093974096" + ], + "mAssetSupply": "94175318827656693977165213" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "1457888622191042933817344", + "expectedQty": "1459064767582836886706056", + "swapFee": "874733173314625760290", + "reserves": [ + "33179233948392682045344534", + "17375469113688156258256699", + "42218436359427618093974096" + ], + "mAssetSupply": "92718304938638965669108159" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "144145688338676775387136", + "expectedQty": "143673570233938027885797", + "reserves": [ + "33179233948392682045344534", + "17375469113688156258256699", + "42362582047766294869361232" + ] + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "512369160151941662113792", + "outputIndex": 2, + "expectedQty": "513040885455842419547112", + "swapFee": "307019076340306925509", + "reserves": [ + "33691603108544623707458326", + "17375469113688156258256699", + "41849541162310452449814120" + ], + "mAssetSupply": "92862285527949244003919465", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemBassets", + "inputQtys": [ + "675363256679610974208", + "9237548851985283072", + "572098940044072321024" + ], + "expectedQty": "1254009886849951961451", + "swapFee": "752857646697989970", + "reserves": [ + "33690927745287944096484118", + "17375459876139304272973627", + "41848969063370408377493096" + ], + "mAssetSupply": "92861031518062394051958014" + }, + { + "type": "mintMulti", + "inputQtys": [ + "491351818655364160", + "628803998612370944", + "517974872606854272" + ], + "expectedQty": "1640342836813145655", + "reserves": [ + "33690928236639762751848278", + "17375460504943302885344571", + "41848969581345280984347368" + ], + "mAssetSupply": "92861033158405230865103669" + }, + { + "type": "mintMulti", + "inputQtys": [ + "1735838844957314955345920", + "610439992450293650423808", + "59804900419752660303872" + ], + "expectedQty": "2407673995218041168836192", + "reserves": [ + "35426767081597077707194198", + "17985900497393596535768379", + "41908774481765033644651240" + ], + "mAssetSupply": "95268707153623272033939861" + }, + { + "type": "mintMulti", + "inputQtys": [ + "5601785691037216276480", + "5624941025916612509696", + "2043319056060880781312" + ], + "expectedQty": "13294724322982923773427", + "reserves": [ + "35432368867288114923470678", + "17991525438419513148278075", + "41910817800821094525432552" + ], + "mAssetSupply": "95282001877946254957713288" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "1205687989217189691392", + "expectedQty": "1203792346064009091349", + "reserves": [ + "35433574555277332113162070", + "17991525438419513148278075", + "41910817800821094525432552" + ] + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "305717667303476267319296", + "expectedQty": "305229003170017325090613", + "reserves": [ + "35739292222580808380481366", + "17991525438419513148278075", + "41910817800821094525432552" + ] + }, + { + "type": "redeemMasset", + "inputQty": "847375081293225970892", + "expectedQtys": [ + "316727649952628019354", + "159443940178903846845", + "371420753018154456829" + ], + "redemptionFee": "254212524387967791", + "reserves": [ + "35738975494930855752462012", + "17991365994479334244431230", + "41910446380068076370975723" + ], + "mAssetSupply": "95587587552593567453892149" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "1954727271125160508260352", + "expectedQty": "1951235078351449696834305", + "reserves": [ + "37693702766056016260722364", + "17991365994479334244431230", + "41910446380068076370975723" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "183264374907248633184256", + "70150577256820451049472", + "1028406285299871863799808" + ], + "expectedQty": "1279150529401755542109799", + "swapFee": "767951088294029743111", + "reserves": [ + "37510438391148767627538108", + "17921215417222513793381758", + "40882040094768204507175915" + ], + "mAssetSupply": "96259672101543261608616655" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "609382305359317565440", + "expectedQty": "607744347112786937821", + "reserves": [ + "37510438391148767627538108", + "17921215417222513793381758", + "40882649477073563824741355" + ] + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "263130226109937952", + "expectedQty": "265045696901507118", + "reserves": [ + "37510438391148767627538108", + "17921215680352739903319710", + "40882649477073563824741355" + ] + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "249904270661867634688", + "expectedQty": "250251963426142316382", + "swapFee": "149942562397120580", + "reserves": [ + "37510188139185341485221726", + "17921215680352739903319710", + "40882649477073563824741355" + ], + "mAssetSupply": "96260030356607971826547486" + }, + { + "type": "mintMulti", + "inputQtys": [ + "1586252794339853860864", + "110217527842370926673920", + "108457989397845641265152" + ], + "expectedQty": "220765628479803572376985", + "reserves": [ + "37511774391979681339082590", + "18031433208195110829993630", + "40991107466471409466006507" + ], + "mAssetSupply": "96480795985087775398924471" + }, + { + "type": "mintMulti", + "inputQtys": [ + "4738813612215705331040256", + "4940817396438901354135552", + "1003991058502613616033792" + ], + "expectedQty": "10701754696438596205464323", + "reserves": [ + "42250588004195386670122846", + "22972250604634012184129182", + "41995098524974023082040299" + ], + "mAssetSupply": "107182550681526371604388794" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "5845035813451616210649088", + "expectedQty": "5802235392224984431481515", + "swapFee": "3507021488070969726389", + "reserves": [ + "42250588004195386670122846", + "17170015212409027752647667", + "41995098524974023082040299" + ], + "mAssetSupply": "101341021889562826363466095" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "1813390033640081408", + "1372180338167816448", + "418392635448828928" + ], + "expectedQty": "3610533649698243522", + "swapFee": "2167620762276311", + "reserves": [ + "42250586190805353030041438", + "17170013840228689584831219", + "41995098106581387633211371" + ], + "mAssetSupply": "101341018279029176665222573" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "5603817088247621746688", + "expectedQty": "5588017857836434814869", + "reserves": [ + "42256190007893600651788126", + "17170013840228689584831219", + "41995098106581387633211371" + ] + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "132199229208320530186240", + "expectedQty": "131832011149220804482681", + "reserves": [ + "42256190007893600651788126", + "17170013840228689584831219", + "42127297335789708163397611" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "49711810123663795027968", + "17163928465337871237120", + "68458457957279385780224" + ], + "expectedQty": "135164748965267539112038", + "swapFee": "81147537901901664465", + "reserves": [ + "42206478197769936856760158", + "17152849911763351713594099", + "42058838877832428777617387" + ], + "mAssetSupply": "101343273559070966365408085" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "79587359330090616881152", + "expectedQty": "79365316207884567569172", + "reserves": [ + "42206478197769936856760158", + "17152849911763351713594099", + "42138426237162519394498539" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "13651198669746855936", + "52753983789847470080", + "55901140122087358464" + ], + "expectedQty": "122607666690271939842", + "swapFee": "73608765273327160", + "reserves": [ + "42206464546571267109904222", + "17152797157779561866124019", + "42138370336022397307140075" + ], + "mAssetSupply": "101422516267612160661037415" + }, + { + "type": "mintMulti", + "inputQtys": [ + "18936241569989488803840", + "27697410520231150878720", + "35868286134662828392448" + ], + "expectedQty": "82608689916022802090816", + "reserves": [ + "42225400788141256598708062", + "17180494568299793017002739", + "42174238622157060135532523" + ], + "mAssetSupply": "101505124957528183463128231" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "1742317692589928720891904", + "11259513088983712137216", + "2880995942843240255848448" + ], + "expectedQty": "4622322955766483412054536", + "swapFee": "2775058808745137129510", + "reserves": [ + "40483083095551327877816158", + "17169235055210809304865523", + "39293242679313819879684075" + ], + "mAssetSupply": "96882802001761700051073695" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "11357348475109345280", + "outputIndex": 1, + "expectedQty": "11226577514883038695", + "swapFee": "6796030229032618", + "reserves": [ + "40483094452899802987161438", + "17169223828633294421826828", + "39293242679313819879684075" + ], + "mAssetSupply": "96882802008557730280106313", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "354094363227568549658624", + "expectedQty": "353129947792508761899804", + "reserves": [ + "40837188816127371536820062", + "17169223828633294421826828", + "39293242679313819879684075" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "49840453943646808", + "84879930231249632", + "259465450746680224" + ], + "expectedQty": "394130333746287945", + "reserves": [ + "40837188865967825480466870", + "17169223913513224653076460", + "39293242938779270626364299" + ], + "mAssetSupply": "97235932350480572788294062" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "25267249823725905772544", + "outputIndex": 0, + "expectedQty": "25260002805735263337933", + "swapFee": "15123444318146278139", + "reserves": [ + "40811928863162090217128937", + "17169223913513224653076460", + "39318510188602996532136843" + ], + "mAssetSupply": "97235947473924890934572201", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemBassets", + "inputQtys": [ + "379788850777236307968", + "1062890725201983963136", + "1171641727286971990016" + ], + "expectedQty": "2619347371323538745810", + "swapFee": "1572551953966503149", + "reserves": [ + "40811549074311312980820969", + "17168161022788022669113324", + "39317338546875709560146827" + ], + "mAssetSupply": "97233328126553567395826391" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "101005556623793597710336", + "149866082984686046412800", + "65231801854202021412864" + ], + "expectedQty": "316932669466487796584888", + "swapFee": "190273765939456351761", + "reserves": [ + "40710543517687519383110633", + "17018294939803336622700524", + "39252106745021507538733963" + ], + "mAssetSupply": "96916395457087079599241503" + }, + { + "type": "mintMulti", + "inputQtys": [ + "12452801600306907447296", + "6637061552466576801792", + "1754358029805828702208" + ], + "expectedQty": "20861955861564435533175", + "reserves": [ + "40722996319287826290557929", + "17024932001355803199502316", + "39253861103051313367436171" + ], + "mAssetSupply": "96937257412948644034774678" + }, + { + "type": "redeemMasset", + "inputQty": "7596283670778105036", + "expectedQtys": [ + "3190214342648241980", + "1333722642300063558", + "3075123198534480097" + ], + "redemptionFee": "2278885101233431", + "reserves": [ + "40722993129073483642315949", + "17024930667633160899438758", + "39253858027928114832956074" + ], + "mAssetSupply": "96937249818943858357903073" + }, + { + "type": "redeemMasset", + "inputQty": "41469798428686407014809", + "expectedQtys": [ + "17416088111987971389525", + "7281087902065301296317", + "16787780013689199769213" + ], + "redemptionFee": "12440939528605922104", + "reserves": [ + "40705577040961495670926424", + "17017649579731095598142441", + "39237070247914425633186861" + ], + "mAssetSupply": "96895792461454700556810368" + }, + { + "type": "redeemMasset", + "inputQty": "431593697674498985164", + "expectedQtys": [ + "181256580742822523566", + "75777355324004750053", + "174717513139445481972" + ], + "redemptionFee": "129478109302349695", + "reserves": [ + "40705395784380752848402858", + "17017573802375771593392388", + "39236895530401286187704889" + ], + "mAssetSupply": "96895360997235135360174899" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "362629241832729149440", + "207324643544176361472", + "52870444761403891712" + ], + "expectedQty": "623455690774441135261", + "swapFee": "374297993260621053", + "reserves": [ + "40705033155138920119253418", + "17017366477732227417030916", + "39236842659956524783813177" + ], + "mAssetSupply": "96894737541544360919039638" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "1660863605578970840432640", + "outputIndex": 2, + "expectedQty": "1675953889284959157795376", + "swapFee": "1004176853768114827246", + "reserves": [ + "40705033155138920119253418", + "18678230083311198257463556", + "37560888770671565626017801" + ], + "mAssetSupply": "96895741718398129033866884", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemMasset", + "inputQty": "35787342473519980", + "expectedQtys": [ + "15029431826454071", + "6896522712708035", + "13868526159118563" + ], + "redemptionFee": "10736202742055", + "reserves": [ + "40705033140109488292799347", + "18678230076414675544755521", + "37560888756803039466899238" + ], + "mAssetSupply": "96895741682621522763088959" + }, + { + "type": "redeemMasset", + "inputQty": "10532452170939222930227", + "expectedQtys": [ + "4423261436236772548819", + "2029692360396408513345", + "4081599201181718216381" + ], + "redemptionFee": "3159735651281766879", + "reserves": [ + "40700609878673251520250528", + "18676200384054279136242176", + "37556807157601857748682857" + ], + "mAssetSupply": "96885212390186234821925611" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "679950268431325726769152", + "1479232505388556353536000", + "453314331684695592402944" + ], + "expectedQty": "2620358693000912765151712", + "swapFee": "1573159111267308043917", + "reserves": [ + "40020659610241925793481376", + "17196967878665722782706176", + "37103492825917162156279913" + ], + "mAssetSupply": "94264853697185322056773899" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "167377602783679338250240", + "expectedQty": "167019745746164557703261", + "reserves": [ + "40020659610241925793481376", + "17196967878665722782706176", + "37270870428700841494530153" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "2708013721542141", + "10697938901794112", + "1673969267886858" + ], + "expectedQty": "15151626226507822", + "reserves": [ + "40020659612949939515023517", + "17196967889363661684500288", + "37270870430374810762417011" + ], + "mAssetSupply": "94431873458083112840984982" + }, + { + "type": "redeemMasset", + "inputQty": "911078949530550067", + "expectedQtys": [ + "386003587461497353", + "165866613967716441", + "359481573594105733" + ], + "redemptionFee": "273323684859165", + "reserves": [ + "40020659226946352053526164", + "17196967723497047716783847", + "37270870070893237168311278" + ], + "mAssetSupply": "94431872547277486995294080" + }, + { + "type": "redeemMasset", + "inputQty": "309565591936805108501708", + "expectedQtys": [ + "131155954271383292152234", + "56358009985772309497687", + "122144328081967163307924" + ], + "redemptionFee": "92869677581041532550", + "reserves": [ + "39889503272674968761373930", + "17140609713511275407286160", + "37148725742811270005003354" + ], + "mAssetSupply": "94122399825018262928324922" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "696978351754343037796352", + "expectedQty": "690969504981587059831012", + "swapFee": "418187011052605822677", + "reserves": [ + "39889503272674968761373930", + "16449640208529688347455148", + "37148725742811270005003354" + ], + "mAssetSupply": "93425839660274972496351247" + }, + { + "type": "mintMulti", + "inputQtys": [ + "28996408571913698279424", + "70285650068501036007424", + "67528925514676427554816" + ], + "expectedQty": "167164625269256027268833", + "reserves": [ + "39918499681246882459653354", + "16519925858598189383462572", + "37216254668325946432558170" + ], + "mAssetSupply": "93593004285544228523620080" + }, + { + "type": "mintMulti", + "inputQtys": [ + "17814279786431145574400", + "27190289269165291208704", + "12485246847053868302336" + ], + "expectedQty": "57638196681207283064420", + "reserves": [ + "39936313961033313605227754", + "16547116147867354674671276", + "37228739915173000300860506" + ], + "mAssetSupply": "93650642482225435806684500" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "3221223948879229616128", + "21013806322985954443264", + "18214475331144597372928" + ], + "expectedQty": "42574819664561058878847", + "swapFee": "25560227935497934087", + "reserves": [ + "39933092737084434375611626", + "16526102341544368720228012", + "37210525439841855703487578" + ], + "mAssetSupply": "93608067662560874747805653" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "53853960917606096896", + "expectedQty": "53945610029714388184", + "swapFee": "32312376550563658", + "reserves": [ + "39933092737084434375611626", + "16526102341544368720228012", + "37210471494231825989099394" + ], + "mAssetSupply": "93608013840912333692272415" + }, + { + "type": "mintMulti", + "inputQtys": [ + "13712804941310455808", + "23074851019682299904", + "25239213968403808256" + ], + "expectedQty": "62123303486697497975", + "reserves": [ + "39933106449889375686067434", + "16526125416395388402527916", + "37210496733445794392907650" + ], + "mAssetSupply": "93608075964215820389770390" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "4352842009995924992", + "expectedQty": "4342839651222056770", + "reserves": [ + "39933106449889375686067434", + "16526125416395388402527916", + "37210501086287804388832642" + ] + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "2135515730402961260544", + "expectedQty": "2139149579644969419442", + "swapFee": "1281309438241776756", + "reserves": [ + "39933106449889375686067434", + "16526125416395388402527916", + "37208361936708159419413200" + ], + "mAssetSupply": "93605946072634506892343372" + }, + { + "type": "redeemMasset", + "inputQty": "10556780599824972", + "expectedQtys": [ + "4502262854337048", + "1863239983138312", + "4195061208889090" + ], + "redemptionFee": "3167034179947", + "reserves": [ + "39933106445387112831730386", + "16526125414532148419389604", + "37208361932513098210524110" + ], + "mAssetSupply": "93605946062080893326698347" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "563883815910713589760", + "expectedQty": "562259236978647938456", + "reserves": [ + "39933670329203023545320146", + "16526125414532148419389604", + "37208361932513098210524110" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "1017314870068141856129024", + "2178977811061693132832768", + "839227211235255564369920" + ], + "expectedQty": "4047403741062273599072928", + "reserves": [ + "40950985199271165401449170", + "18705103225593841552222372", + "38047589143748353774894030" + ], + "mAssetSupply": "97653912062380145573709731" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "225077801165838773911552", + "expectedQty": "224510033572978126440663", + "reserves": [ + "41176063000437004175360722", + "18705103225593841552222372", + "38047589143748353774894030" + ] + }, + { + "type": "redeemMasset", + "inputQty": "29826678674992310675046", + "expectedQtys": [ + "12543896094397432113016", + "5698331851064469271017", + "11590836279234317990392" + ], + "redemptionFee": "8948003602497693202", + "reserves": [ + "41163519104342606743247706", + "18699404893742777082951355", + "38035998307469119456903638" + ], + "mAssetSupply": "97848604365281733887168550" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "79753545366530812805120", + "expectedQty": "79908090532304737930053", + "swapFee": "47852127219918487683", + "reserves": [ + "41083611013810302005317653", + "18699404893742777082951355", + "38035998307469119456903638" + ], + "mAssetSupply": "97768898672042422992851113" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "80644776461584258039808", + "expectedQty": "81186440641492950036676", + "reserves": [ + "41083611013810302005317653", + "18780049670204361340991163", + "38035998307469119456903638" + ] + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "2451057585441778696192", + "expectedQty": "2454227213314386134012", + "swapFee": "1470634551265067217", + "reserves": [ + "41083611013810302005317653", + "18780049670204361340991163", + "38033544080255805070769626" + ], + "mAssetSupply": "97847635525733025429258814" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "44026863875589668864", + "expectedQty": "44111228698560641589", + "swapFee": "26416118325353801", + "reserves": [ + "41083566902581603444676064", + "18780049670204361340991163", + "38033544080255805070769626" + ], + "mAssetSupply": "97847591525285268164943751" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "3186633048808972353536", + "10054882475192430362624", + "2445671469649705828352" + ], + "expectedQty": "15741790697305977649614", + "swapFee": "9450744865302768250", + "reserves": [ + "41080380269532794472322528", + "18769994787729168910628539", + "38031098408786155364941274" + ], + "mAssetSupply": "97831849734587962187294137" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "737504856800242040832", + "outputIndex": 0, + "expectedQty": "743862559825180050391", + "swapFee": "445463279377955254", + "reserves": [ + "41079636406972969292272137", + "18770732292585969152669371", + "38031098408786155364941274" + ], + "mAssetSupply": "97831850180051241565249391", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemMasset", + "inputQty": "1016139734184010920755", + "expectedQtys": [ + "426549512729350144417", + "194905491218431345788", + "394895084613653174919" + ], + "redemptionFee": "304841920255203276", + "reserves": [ + "41079209857460239942127720", + "18770537387094750721323583", + "38030703513701541711766355" + ], + "mAssetSupply": "97830834345158977809531912" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "136123417150184061140992", + "outputIndex": 0, + "expectedQty": "136122590718043604536097", + "swapFee": "81518653392101532612", + "reserves": [ + "40943087266742196337591623", + "18770537387094750721323583", + "38166826930851725772907347" + ], + "mAssetSupply": "97830915863812369911064524", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "23169970574405218074624", + "expectedQty": "23002000621839171527118", + "swapFee": "13901982344643130844", + "reserves": [ + "40943087266742196337591623", + "18747535386472911549796465", + "38166826930851725772907347" + ], + "mAssetSupply": "97807759795220309336120744" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "115505234835541032960", + "outputIndex": 1, + "expectedQty": "114446051976654660883", + "swapFee": "69169719971497591", + "reserves": [ + "40943087266742196337591623", + "18747420940420934895135582", + "38166942436086561313940307" + ], + "mAssetSupply": "97807759864390029307618335", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemMasset", + "inputQty": "229572011133241131008", + "expectedQtys": [ + "96071795149918033803", + "43990292486820461821", + "89557649898983373047" + ], + "redemptionFee": "68871603339972339", + "reserves": [ + "40942991194947046419557820", + "18747376950128448074673761", + "38166852878436662330567260" + ], + "mAssetSupply": "97807530361250499406459666" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "222363176435747987128320", + "outputIndex": 0, + "expectedQty": "224245546519751125165446", + "swapFee": "134300818659104755620", + "reserves": [ + "40718745648427295294392374", + "18969740126564196061802081", + "38166852878436662330567260" + ], + "mAssetSupply": "97807664662069158511215286", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "26125692497526278586368", + "outputIndex": 0, + "expectedQty": "26123462999003402323004", + "swapFee": "15645663314846784103", + "reserves": [ + "40692622185428291892069370", + "18969740126564196061802081", + "38192978570934188609153628" + ], + "mAssetSupply": "97807680307732473357999389", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "5834252008015644034334720", + "outputIndex": 2, + "expectedQty": "5861540275188209689291573", + "swapFee": "3516975203945864400691", + "reserves": [ + "40692622185428291892069370", + "24803992134579840096136801", + "32331438295745978919862055" + ], + "mAssetSupply": "97811197282936419222400080", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemMasset", + "inputQty": "2447076347581830057164", + "expectedQtys": [ + "1017757502723366475364", + "620369190695699158141", + "808637097638703338402" + ], + "redemptionFee": "734122904274549017", + "reserves": [ + "40691604427925568525594006", + "24803371765389144396978660", + "32330629658648340216523653" + ], + "mAssetSupply": "97808750940711741666891933" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "5853110306207189434368", + "expectedQty": "5841903371981862123485", + "reserves": [ + "40697457538231775715028374", + "24803371765389144396978660", + "32330629658648340216523653" + ] + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "12918580466719309824", + "expectedQty": "12917333986872869574", + "reserves": [ + "40697457538231775715028374", + "24803371765389144396978660", + "32330642577228806935833477" + ] + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "3917310651214736896", + "outputIndex": 0, + "expectedQty": "3932623588355145198", + "swapFee": "2356469277326554", + "reserves": [ + "40697453605608187359883176", + "24803375682699795611715556", + "32330642577228806935833477" + ], + "mAssetSupply": "97814605763774179679211546", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemMasset", + "inputQty": "77885220677404070405734", + "expectedQtys": [ + "32395767598219432049176", + "19743849383179654681038", + "25735663793193000928510" + ], + "redemptionFee": "23365566203221221121", + "reserves": [ + "40665057838009967927834000", + "24783631833316615957034518", + "32304906913435613934904967" + ], + "mAssetSupply": "97736743908662978830026933" + }, + { + "type": "redeemMasset", + "inputQty": "4980278229950502", + "expectedQtys": [ + "2071509006570173", + "1262497074582963", + "1645636553479639" + ], + "redemptionFee": "1494083468985", + "reserves": [ + "40665057835938458921263827", + "24783631832054118882451555", + "32304906911789977381425328" + ], + "mAssetSupply": "97736743903684194683545416" + }, + { + "type": "redeemMasset", + "inputQty": "77626331036620344524", + "expectedQtys": [ + "32288084413098159141", + "19678221038930996705", + "25650118721909875621" + ], + "redemptionFee": "23287899310986103", + "reserves": [ + "40665025547854045823104686", + "24783612153833079951454850", + "32304881261671255471549707" + ], + "mAssetSupply": "97736666300641057374186995" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "48011996053713153163264", + "expectedQty": "47987608705887344580639", + "swapFee": "28807197632227891897", + "reserves": [ + "40665025547854045823104686", + "24783612153833079951454850", + "32256893652965368126969068" + ], + "mAssetSupply": "97688683111784976448915628" + }, + { + "type": "redeemMasset", + "inputQty": "36079726083843745382", + "expectedQtys": [ + "15014460031013040923", + "9150677986663474239", + "11909984906001000801" + ], + "redemptionFee": "10823917825153123", + "reserves": [ + "40665010533394014810063763", + "24783603003155093287980611", + "32256881742980462125968267" + ], + "mAssetSupply": "97688647042882810430323369" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "550904385265810637062144", + "expectedQty": "549827893668852008051612", + "reserves": [ + "41215914918659825447125907", + "24783603003155093287980611", + "32256881742980462125968267" + ] + }, + { + "type": "redeemMasset", + "inputQty": "3693818378524267905024", + "expectedQtys": [ + "1549275178399632962175", + "931596958113754009410", + "1212511873522590638882" + ], + "redemptionFee": "1108145513557280371", + "reserves": [ + "41214365643481425814163732", + "24782671406196979533971201", + "32255669231106939535329385" + ], + "mAssetSupply": "98234782226318651727750328" + }, + { + "type": "redeemMasset", + "inputQty": "3956131944167392883507", + "expectedQtys": [ + "1659295719358324365452", + "997753572972207662787", + "1298617437016864354282" + ], + "redemptionFee": "1186839583250217865", + "reserves": [ + "41212706347762067489798280", + "24781673652624007326308414", + "32254370613669922670975103" + ], + "mAssetSupply": "98230827281214067585084686" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "1082236434309898248912896", + "expectedQty": "1084903408174932890554308", + "reserves": [ + "41212706347762067489798280", + "25863910086933905575221310", + "32254370613669922670975103" + ] + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "2098575762401900026134528", + "expectedQty": "2102726341923303885178562", + "reserves": [ + "41212706347762067489798280", + "27962485849335805601355838", + "32254370613669922670975103" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "2525842538378802176", + "5820867294210888704", + "230325608404127264" + ], + "expectedQty": "8582746982821847082", + "reserves": [ + "41212708873604605868600456", + "27962491670203099812244542", + "32254370843995531075102367" + ], + "mAssetSupply": "101418465614059287182664638" + }, + { + "type": "redeemMasset", + "inputQty": "11456800155187", + "expectedQtys": [ + "4654222649001", + "3157852653002", + "3642542007413" + ], + "redemptionFee": "3437040046", + "reserves": [ + "41212708873599951645951455", + "27962491670199941959591540", + "32254370843991888533094954" + ], + "mAssetSupply": "101418465614047833819549497" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "176573741486937431080960", + "expectedQty": "176867357958659065216452", + "reserves": [ + "41212708873599951645951455", + "28139065411686879390672500", + "32254370843991888533094954" + ] + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "598087458493324844859392", + "outputIndex": 1, + "expectedQty": "595671177908467316651543", + "swapFee": "358252533173138778540", + "reserves": [ + "41810796332093276490810847", + "27543394233778412074020957", + "32254370843991888533094954" + ], + "mAssetSupply": "101595691224539666023544489", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "2322055718250112278855680", + "expectedQty": "2315574228819686728659111", + "swapFee": "1393233430950067367313", + "reserves": [ + "41810796332093276490810847", + "25227820004958725345361846", + "32254370843991888533094954" + ], + "mAssetSupply": "99275028739720503812056122" + }, + { + "type": "redeemMasset", + "inputQty": "97375812865244694734438", + "expectedQtys": [ + "40998616902625727629520", + "24737766759007751220570", + "31627826056328990102125" + ], + "redemptionFee": "29212743859573408420", + "reserves": [ + "41769797715190650763181327", + "25203082238199717594141276", + "32222743017935559542992829" + ], + "mAssetSupply": "99177682139599118690730104" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "3818180577648117209366528", + "expectedQty": "3817089680625102380447235", + "reserves": [ + "41769797715190650763181327", + "25203082238199717594141276", + "36040923595583676752359357" + ] + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "736971679831900825845760", + "expectedQty": "737787277433442770967852", + "swapFee": "442183007899140495507", + "reserves": [ + "41032010437757207992213475", + "25203082238199717594141276", + "36040923595583676752359357" + ], + "mAssetSupply": "102258242323400219385827086" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "505706859179737041862656", + "expectedQty": "503885763588581404454597", + "swapFee": "303424115507842225117", + "reserves": [ + "41032010437757207992213475", + "24699196474611136189686679", + "36040923595583676752359357" + ], + "mAssetSupply": "101752838888335990186189547" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "2485276491075623424", + "1652863259613665536", + "3749042000442657792" + ], + "expectedQty": "7885392071935300575", + "swapFee": "4734075688574324", + "reserves": [ + "41032007952480716916590051", + "24699194821747876576021143", + "36040919846541676309701565" + ], + "mAssetSupply": "101752831002943918250888972" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "24593273880034398208", + "expectedQty": "24551035275991132265", + "reserves": [ + "41032032545754596950988259", + "24699194821747876576021143", + "36040919846541676309701565" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "183129125943014181568512", + "479490104852979038289920", + "1163936800242632990130176" + ], + "expectedQty": "1826848654623226270075019", + "reserves": [ + "41215161671697611132556771", + "25178684926600855614311063", + "37204856646784309299831741" + ], + "mAssetSupply": "103579704208602420512096256" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "29587533884688883712", + "expectedQty": "29617480142238325022", + "swapFee": "17752520330813330", + "reserves": [ + "41215132054217468894231749", + "25178684926600855614311063", + "37204856646784309299831741" + ], + "mAssetSupply": "103579674638821056154025874" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "1419908391865529011273728", + "expectedQty": "1421214557079250031112425", + "swapFee": "851945035119317406764", + "reserves": [ + "39793917497138218863119324", + "25178684926600855614311063", + "37204856646784309299831741" + ], + "mAssetSupply": "102160618191990646460158910" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "980174293570344382889984", + "outputIndex": 0, + "expectedQty": "983510929125314297153101", + "swapFee": "589722975075869746832", + "reserves": [ + "38810406568012904565966223", + "26158859220171199997201047", + "37204856646784309299831741" + ], + "mAssetSupply": "102161207914965722329905742", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "2108706554768983326720", + "expectedQty": "2106899569589722614790", + "reserves": [ + "38810406568012904565966223", + "26158859220171199997201047", + "37206965353339078283158461" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "3151256400947", + "19027284151376", + "17146467623552" + ], + "expectedQty": "39353796542633", + "swapFee": "23626453797", + "reserves": [ + "38810406568009753309565276", + "26158859220152172713049671", + "37206965353321931815534909" + ], + "mAssetSupply": "102163314814495958255977899" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "513029312482082180562944", + "expectedQty": "512404369477176434843051", + "reserves": [ + "39323435880491835490128220", + "26158859220152172713049671", + "37206965353321931815534909" + ] + }, + { + "type": "redeemMasset", + "inputQty": "4381600840067740965273", + "expectedQtys": [ + "1677591461519492448868", + "1115972648071383607325", + "1587299939290141395968" + ], + "redemptionFee": "1314480252020322289", + "reserves": [ + "39321758289030315997679352", + "26157743247504101329442346", + "37205378053382641674138941" + ], + "mAssetSupply": "102671338897613318970177966" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "707416242526264993251328", + "1479064660439630585266176", + "1241770940674780008808448" + ], + "expectedQty": "3430224697729373259964165", + "swapFee": "2059370440902165255131", + "reserves": [ + "38614342046504051004428024", + "24678678587064470744176170", + "35963607112707861665330493" + ], + "mAssetSupply": "99241114199883945710213801" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "2124520001518250229760", + "expectedQty": "2126232815947013733320", + "swapFee": "1274712000910950137", + "reserves": [ + "38612215813688103990694704", + "24678678587064470744176170", + "35963607112707861665330493" + ], + "mAssetSupply": "99238990954594428370934178" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "579395829988306502811648", + "expectedQty": "578875575918433310724090", + "reserves": [ + "38612215813688103990694704", + "24678678587064470744176170", + "36543002942696168168142141" + ] + }, + { + "type": "redeemMasset", + "inputQty": "11043764296141923103539", + "expectedQtys": [ + "4270741280617365808860", + "2729608989585645843526", + "4041874000138806041590" + ], + "redemptionFee": "3313129288842576931", + "reserves": [ + "38607945072407486624885844", + "24675948978074885098332644", + "36538961068696029362100551" + ], + "mAssetSupply": "99806826079346008601131660" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "266186118685864288", + "expectedQty": "265935622640646661", + "reserves": [ + "38607945072407486624885844", + "24675948978074885098332644", + "36538961334882148047964839" + ] + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "172822822784938291494912", + "expectedQty": "172879604078936039668669", + "swapFee": "103693693670962974896", + "reserves": [ + "38607945072407486624885844", + "24675948978074885098332644", + "36366081730803212008296170" + ], + "mAssetSupply": "99634107216190363913258305" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "13150855959022929969152", + "expectedQty": "13154994811738259763299", + "swapFee": "7890513575413757981", + "reserves": [ + "38607945072407486624885844", + "24675948978074885098332644", + "36352926735991473748532871" + ], + "mAssetSupply": "99620964250744916397047134" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "3151385269067661705216", + "expectedQty": "3140506818098704361976", + "swapFee": "1890831161440597023", + "reserves": [ + "38607945072407486624885844", + "24672808471256786393970668", + "36352926735991473748532871" + ], + "mAssetSupply": "99617814756307010175938941" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "14324983795555122544640", + "outputIndex": 0, + "expectedQty": "14377129494125566584943", + "swapFee": "8619570505123707776", + "reserves": [ + "38593567942913361058300901", + "24687133455052341516515308", + "36352926735991473748532871" + ], + "mAssetSupply": "99617823375877515299646717", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemMasset", + "inputQty": "1597190118768873622732", + "expectedQtys": [ + "618591843292255873269", + "395694417581489477580", + "582678025311068066516" + ], + "redemptionFee": "479157035630662086", + "reserves": [ + "38592949351070068802427632", + "24686737760634760027037728", + "36352344057966162680466355" + ], + "mAssetSupply": "99616226664915782056686071" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "3878936829357710509080576", + "1947246547290223940730880", + "2636396075441184202293248" + ], + "expectedQty": "8460464943697682649209900", + "swapFee": "5079326562155903131404", + "reserves": [ + "34714012521712358293347056", + "22739491213344536086306848", + "33715947982524978478173107" + ], + "mAssetSupply": "91155761721218099407476171" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "320432487935313914626048", + "expectedQty": "319333198740197894384406", + "swapFee": "192259492761188348775", + "reserves": [ + "34714012521712358293347056", + "22420158014604338191922442", + "33715947982524978478173107" + ], + "mAssetSupply": "90835521492775546681198898" + }, + { + "type": "redeemMasset", + "inputQty": "78688927894616320", + "expectedQtys": [ + "30063007299876011", + "19416291148591664", + "29198664075117114" + ], + "redemptionFee": "23606678368384", + "reserves": [ + "34714012491649350993471045", + "22420157995188047043330778", + "33715947953326314403055993" + ], + "mAssetSupply": "90835521414110225464950962" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "547417311489851171799040", + "expectedQty": "548948161367389410401760", + "reserves": [ + "34714012491649350993471045", + "22967575306677898215129818", + "33715947953326314403055993" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "23571432722909691904", + "121755838005811625984", + "132382559226368999424" + ], + "expectedQty": "277879439221489768106", + "reserves": [ + "34714036063082073903162949", + "22967697062515904026755802", + "33716080335885540772055417" + ], + "mAssetSupply": "91384747454916836365120828" + }, + { + "type": "redeemMasset", + "inputQty": "52051858331813806080", + "expectedQtys": [ + "19766843576888923614", + "13078250951030871292", + "19198588283257621757" + ], + "redemptionFee": "15615557499544141", + "reserves": [ + "34714016296238497014239335", + "22967683984264952995884510", + "33716061137297257514433660" + ], + "mAssetSupply": "91384695418674062050858889" + }, + { + "type": "redeemMasset", + "inputQty": "153167965667740273868", + "expectedQtys": [ + "58165977457408737265", + "38484103293527606497", + "56493827603495962359" + ], + "redemptionFee": "45950389700322082", + "reserves": [ + "34713958130261039605502070", + "22967645500161659468278013", + "33716004643469654018471301" + ], + "mAssetSupply": "91384542296658784010907103" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "118091721044737396834304", + "expectedQty": "117948289643635872011892", + "reserves": [ + "34832049851305777002336374", + "22967645500161659468278013", + "33716004643469654018471301" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "67722199731927989092352", + "7963209357002865115136", + "66076974798392549965824" + ], + "expectedQty": "141636619069634567622043", + "reserves": [ + "34899772051037704991428726", + "22975608709518662333393149", + "33782081618268046568437125" + ], + "mAssetSupply": "91644127205372054450541038" + }, + { + "type": "mintMulti", + "inputQtys": [ + "119733091003024139091968", + "44440419784600905056256", + "920011688708863033344" + ], + "expectedQty": "165065716209383008252909", + "reserves": [ + "35019505142040729130520694", + "23020049129303263238449405", + "33783001629956755431470469" + ], + "mAssetSupply": "91809192921581437458793947" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "3926245437808580231168", + "outputIndex": 1, + "expectedQty": "3909476690573520657240", + "swapFee": "2353479181131662333", + "reserves": [ + "35019505142040729130520694", + "23016139652612689717792165", + "33786927875394564011701637" + ], + "mAssetSupply": "91809195275060618590456280", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "87883905609509948620800", + "expectedQty": "87798609626058908622785", + "reserves": [ + "35019505142040729130520694", + "23016139652612689717792165", + "33874811781004073960322437" + ] + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "6139627965689868366905344", + "outputIndex": 0, + "expectedQty": "6147327852045868057536938", + "swapFee": "3690329065614143483555", + "reserves": [ + "28872177289994861072983756", + "29155767618302558084697509", + "33874811781004073960322437" + ], + "mAssetSupply": "91900684213752291642562620", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemBassets", + "inputQtys": [ + "39202275088418864103424", + "28113775341436930097152", + "46580884611091105054720" + ], + "expectedQty": "113889066426077762269165", + "swapFee": "68374464534367277728", + "reserves": [ + "28832975014906442208880332", + "29127653842961121154600357", + "33828230896392982855267717" + ], + "mAssetSupply": "91786795147326213880293455" + }, + { + "type": "redeemMasset", + "inputQty": "2557080455455708492595", + "expectedQtys": [ + "803014401950628944692", + "811221371323560579999", + "942135058497117200828" + ], + "redemptionFee": "767124136636712547", + "reserves": [ + "28832172000504491579935640", + "29126842621589797594020358", + "33827288761334485738066889" + ], + "mAssetSupply": "91784238833994894808513407" + }, + { + "type": "mintMulti", + "inputQtys": [ + "175005065476874829824", + "82386562351795470336", + "137190624262449053696" + ], + "expectedQty": "394587949594131395356", + "reserves": [ + "28832347005569968454765464", + "29126925008152149389490694", + "33827425951958748187120585" + ], + "mAssetSupply": "91784633421944488939908763" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "740063646459702935552", + "564766918234312736768", + "409370709608279441408" + ], + "expectedQty": "1714451159388524415299", + "swapFee": "1029288268594271211", + "reserves": [ + "28831606941923508751829912", + "29126360241233915076753926", + "33827016581249139907679177" + ], + "mAssetSupply": "91782918970785100415493464" + }, + { + "type": "redeemMasset", + "inputQty": "97167717934775", + "expectedQtys": [ + "30513967434346", + "30825919959033", + "35800865502936" + ], + "redemptionFee": "29150315380", + "reserves": [ + "28831606941892994784395566", + "29126360241203089156794893", + "33827016581213339042176241" + ], + "mAssetSupply": "91782918970687961847874069" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "680346072628735246336", + "4153920975817820078080", + "3765448254245425381376" + ], + "expectedQty": "8598617225377734793541", + "swapFee": "5162267695844147364", + "reserves": [ + "28830926595820366049149230", + "29122206320227271336716813", + "33823251132959093616794865" + ], + "mAssetSupply": "91774320353462584113080528" + }, + { + "type": "mintMulti", + "inputQtys": [ + "120078513278526448", + "466120073394133504", + "201786923493538464" + ], + "expectedQty": "788064305286513888", + "reserves": [ + "28830926715898879327675678", + "29122206786347344730850317", + "33823251334746017110333329" + ], + "mAssetSupply": "91774321141526889399594416" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "1079904729502194", + "expectedQty": "1078732094514371", + "swapFee": "647942837701", + "reserves": [ + "28830926714820147233161307", + "29122206786347344730850317", + "33823251334746017110333329" + ], + "mAssetSupply": "91774321140447632612929923" + }, + { + "type": "redeemMasset", + "inputQty": "17813258528727388022374", + "expectedQtys": [ + "5594360960543759994456", + "5650881025849136114049", + "6563073004812468700929" + ], + "redemptionFee": "5343977558618216406", + "reserves": [ + "28825332353859603473166851", + "29116555905321495594736268", + "33816688261741204641632400" + ], + "mAssetSupply": "91756513225896463843123955" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "236005874159747715825664", + "expectedQty": "235808537683113503061276", + "reserves": [ + "28825332353859603473166851", + "29116555905321495594736268", + "34052694135900952357458064" + ] + }, + { + "type": "redeemMasset", + "inputQty": "1348013325803060409139", + "expectedQtys": [ + "422266492565511663531", + "426532668792680791880", + "498842876767307295946" + ], + "redemptionFee": "404403997740918122", + "reserves": [ + "28824910087367037961503320", + "29116129372652702913944388", + "34052195293024185050162118" + ], + "mAssetSupply": "91990974154657772026694214" + }, + { + "type": "redeemMasset", + "inputQty": "1358297346034302661427", + "expectedQtys": [ + "425487971959962297396", + "429786694929652769188", + "502648558906116926247" + ], + "redemptionFee": "407489203810290798", + "reserves": [ + "28824484599395077999205924", + "29115699585957773261175200", + "34051692644465278933235871" + ], + "mAssetSupply": "91989616264800941534323585" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "5883095014444391007780864", + "outputIndex": 2, + "expectedQty": "5878559597802561117834764", + "swapFee": "3529731284563736472869", + "reserves": [ + "34707579613839469006986788", + "29115699585957773261175200", + "28173133046662717815401107" + ], + "mAssetSupply": "91993145996085505270796454", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "497866050920385123188736", + "outputIndex": 0, + "expectedQty": "498209994168753404695722", + "swapFee": "298827162490884007870", + "reserves": [ + "34209369619670715602291066", + "29613565636878158384363936", + "28173133046662717815401107" + ], + "mAssetSupply": "91993444823247996154804324", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "607551940046126229487616", + "expectedQty": "606988360310655342684781", + "swapFee": "364531164027675737692", + "reserves": [ + "34209369619670715602291066", + "29006577276567503041679155", + "28173133046662717815401107" + ], + "mAssetSupply": "91386257414365897601054400" + }, + { + "type": "mintMulti", + "inputQtys": [ + "1587807351308721405820928", + "2438772463877040034021376", + "1648215305920296677015552" + ], + "expectedQty": "5675220374355121936967837", + "reserves": [ + "35797176970979437008111994", + "31445349740444543075700531", + "29821348352583014492416659" + ], + "mAssetSupply": "97061477788721019538022237" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "3944562029730359934976", + "expectedQty": "3945414109400704939429", + "reserves": [ + "35797176970979437008111994", + "31449294302474273435635507", + "29821348352583014492416659" + ] + }, + { + "type": "redeemMasset", + "inputQty": "36263139353482002379571", + "expectedQtys": [ + "13369627811162260045462", + "11745768670212616926256", + "11137758953011176073124" + ], + "redemptionFee": "10878941806044600713", + "reserves": [ + "35783807343168274748066532", + "31437548533804060818709251", + "29810210593630003316343535" + ], + "mAssetSupply": "97029170942418744285182808" + }, + { + "type": "mintMulti", + "inputQtys": [ + "2150621026998535323648", + "3199284184902432980992", + "2368199454698417160192" + ], + "expectedQty": "7718637380730614040258", + "reserves": [ + "35785957964195273283390180", + "31440747817988963251690243", + "29812578793084701733503727" + ], + "mAssetSupply": "97036889579799474899223066" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "436073159245549600768", + "expectedQty": "435513651617964750766", + "swapFee": "261643895547329760", + "reserves": [ + "35785957964195273283390180", + "31440747817988963251690243", + "29812143279433083768752961" + ], + "mAssetSupply": "97036453768284124896952058" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "626034796355934547345408", + "488649142094941265068032", + "206287177262053082529792" + ], + "expectedQty": "1320709138468302153984512", + "swapFee": "792901223815270454663", + "reserves": [ + "35159923167839338736044772", + "30952098675894021986622211", + "29605856102171030686223169" + ], + "mAssetSupply": "95715744629815822742967546" + }, + { + "type": "mintMulti", + "inputQtys": [ + "16461250338009840091136", + "7380285064127830818816", + "50883808082179020292096" + ], + "expectedQty": "74745642428296739423084", + "reserves": [ + "35176384418177348576135908", + "30959478960958149817441027", + "29656739910253209706515265" + ], + "mAssetSupply": "95790490272244119482390630" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "13924499269899520049152", + "expectedQty": "13907548964472805161900", + "swapFee": "8354699561939712029", + "reserves": [ + "35176384418177348576135908", + "30959478960958149817441027", + "29642832361288736901353365" + ], + "mAssetSupply": "95776574127673781902053507" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "119760095681498144", + "expectedQty": "119783078851425143", + "swapFee": "71856057408898", + "reserves": [ + "35176384298394269724710765", + "30959478960958149817441027", + "29642832361288736901353365" + ], + "mAssetSupply": "95776574007985542277964261" + }, + { + "type": "redeemMasset", + "inputQty": "268925376744419714138112", + "expectedQtys": [ + "98740057797887932063374", + "86903210860618390793674", + "83207385836422116496856" + ], + "redemptionFee": "80677613023325914241", + "reserves": [ + "35077644240596381792647391", + "30872575750097531426647353", + "29559624975452314784856509" + ], + "mAssetSupply": "95507729308854145889740390" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "545828464520922595328", + "expectedQty": "546166558391321244699", + "reserves": [ + "35077644240596381792647391", + "30872575750097531426647353", + "29560170803916835707451837" + ] + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "165982610423260811100160", + "expectedQty": "165849184746667303917187", + "reserves": [ + "35243626851019642603747551", + "30872575750097531426647353", + "29560170803916835707451837" + ] + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "167164519437911965302784", + "expectedQty": "167198609013015267766889", + "swapFee": "100298711662747179181", + "reserves": [ + "35076428242006627335980662", + "30872575750097531426647353", + "29560170803916835707451837" + ], + "mAssetSupply": "95507060439432955296778673" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "119612132788616799715328", + "196426134788924476751872", + "210191635533506354872320" + ], + "expectedQty": "526313160223700358772999", + "swapFee": "315977482623794491958", + "reserves": [ + "34956816109218010536265334", + "30676149615308606949895481", + "29349979168383329352579517" + ], + "mAssetSupply": "94980747279209254938005674" + }, + { + "type": "redeemMasset", + "inputQty": "29906327464294449152", + "expectedQtys": [ + "11003454811765476828", + "9656017442675390038", + "9238575060627525833" + ], + "redemptionFee": "8971898239288334", + "reserves": [ + "34956805105763198770788506", + "30676139959291164274505443", + "29349969929808268725053684" + ], + "mAssetSupply": "94980717381853688882844856" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "153442301204715729321984", + "expectedQty": "153472620283562064875757", + "swapFee": "92065380722829437593", + "reserves": [ + "34803332485479636705912749", + "30676139959291164274505443", + "29349969929808268725053684" + ], + "mAssetSupply": "94827367146029695982960465" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "7049053552718463348244480", + "outputIndex": 1, + "expectedQty": "7023943281601159386778172", + "swapFee": "4224056475512908690289", + "reserves": [ + "41852386038198100054157229", + "23652196677690004887727271", + "29349969929808268725053684" + ], + "mAssetSupply": "94831591202505208891650754", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mintMulti", + "inputQtys": [ + "175965148802289991680", + "511845834073242468352", + "236939752872499118080" + ], + "expectedQty": "925852054190667931751", + "reserves": [ + "41852562003346902344148909", + "23652708523524078130195623", + "29350206869561141224171764" + ], + "mAssetSupply": "94832517054559399559582505" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "2493020537673659449344", + "expectedQty": "2490399655616887800515", + "swapFee": "1495812322604195669", + "reserves": [ + "41852562003346902344148909", + "23652708523524078130195623", + "29347716469905524336371249" + ], + "mAssetSupply": "94830025529834048504328830" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "1853047329791681757184", + "expectedQty": "1858197972898818626050", + "reserves": [ + "41852562003346902344148909", + "23654561570853869811952807", + "29347716469905524336371249" + ] + }, + { + "type": "redeemMasset", + "inputQty": "5810655277289443636019", + "expectedQtys": [ + "2563672084460150647480", + "1448956438186326567138", + "1797689743593988286245" + ], + "redemptionFee": "1743196583186833090", + "reserves": [ + "41849998331262442193501429", + "23653112614415683485385669", + "29345918780161930348085004" + ], + "mAssetSupply": "94826074815726241066151951" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "16004959918795", + "18982175884515", + "52472124097043" + ], + "expectedQty": "87496752173792", + "swapFee": "52529569045", + "reserves": [ + "41849998331246437233582634", + "23653112614396701309501154", + "29345918780109458223987961" + ], + "mAssetSupply": "94826074815638744313978159" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "472514631921985912832", + "expectedQty": "472728312994453048634", + "reserves": [ + "41849998331246437233582634", + "23653112614396701309501154", + "29346391294741380209900793" + ] + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "6138431229219616768", + "outputIndex": 0, + "expectedQty": "6166822924756092563", + "swapFee": "3693294912691881", + "reserves": [ + "41849992164423512477490071", + "23653118752827930529117922", + "29346391294741380209900793" + ], + "mAssetSupply": "94826547547645033679718674", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mintMulti", + "inputQtys": [ + "17511329079653", + "27900538288837", + "104655997331568" + ], + "expectedQty": "150150065491786", + "reserves": [ + "41849992164441023806569724", + "23653118752855831067406759", + "29346391294846036207232361" + ], + "mAssetSupply": "94826547547795183745210460" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "9567885840958854529024", + "expectedQty": "9535625859463183552187", + "swapFee": "5740731504575312717", + "reserves": [ + "41849992164441023806569724", + "23643583126996367883854572", + "29346391294846036207232361" + ], + "mAssetSupply": "94816985402685729465994153" + }, + { + "type": "redeemMasset", + "inputQty": "10459961396500235878", + "expectedQtys": [ + "4615396448585567318", + "2607515651792577055", + "3236445771096690956" + ], + "redemptionFee": "3137988418950070", + "reserves": [ + "41849987549044575221002406", + "23643580519480716091277517", + "29346388058400265110541405" + ], + "mAssetSupply": "94816974945862321384708345" + }, + { + "type": "mintMulti", + "inputQtys": [ + "26877306416635322368", + "167914526929179639808", + "79870609440599130112" + ], + "expectedQty": "275100228928786863941", + "reserves": [ + "41850014426350991856324774", + "23643748434007645270917325", + "29346467929009705709671517" + ], + "mAssetSupply": "94817250046091250171572286" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "14866204613514975232", + "expectedQty": "14829967417988808400", + "reserves": [ + "41850029292555605371300006", + "23643748434007645270917325", + "29346467929009705709671517" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "104774745903583", + "177070374765402", + "41033914200980" + ], + "expectedQty": "323134903400248", + "swapFee": "193997340444", + "reserves": [ + "41850029292450830625396423", + "23643748433830574896151923", + "29346467928968671795470537" + ], + "mAssetSupply": "94817264875735533256980438" + }, + { + "type": "mintMulti", + "inputQtys": [ + "99886259285527", + "67620701633837", + "132733839351925" + ], + "expectedQty": "300245358053537", + "reserves": [ + "41850029292550716884681950", + "23643748433898195597785760", + "29346467929101405634822462" + ], + "mAssetSupply": "94817264876035778615033975" + }, + { + "type": "redeemMasset", + "inputQty": "49905350093551895052288", + "expectedQtys": [ + "22020396853789294324409", + "12440725429032659415397", + "15441348094130008027788" + ], + "redemptionFee": "14971605028065568515", + "reserves": [ + "41828008895696927590357541", + "23631307708469162938370363", + "29331026581007275626794674" + ], + "mAssetSupply": "94767374497547254785550202" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "43458464092757812051968", + "222086818685126227001344", + "603089234137350200623104" + ], + "expectedQty": "869448545171438961263556", + "swapFee": "521982316492759032177", + "reserves": [ + "41784550431604169778305573", + "23409220889784036711369019", + "28727937346869925426171570" + ], + "mAssetSupply": "93897925952375815824286646" + }, + { + "type": "mintMulti", + "inputQtys": [ + "158530967150886092800", + "2145185237800044462080", + "2722704528636014755840" + ], + "expectedQty": "5033509443454901876268", + "reserves": [ + "41784708962571320664398373", + "23411366075021836755831099", + "28730660051398561440927410" + ], + "mAssetSupply": "93902959461819270726162914" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "51022989878005000568832", + "expectedQty": "51051012513094529438549", + "reserves": [ + "41784708962571320664398373", + "23411366075021836755831099", + "28781683041276566441496242" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "24530543793097926508544", + "8844016651915130568704", + "15216684338446216462336" + ], + "expectedQty": "48562715024188319445989", + "swapFee": "29155122087765651058", + "reserves": [ + "41760178418778222737889829", + "23402522058369921625262395", + "28766466356938120225033906" + ], + "mAssetSupply": "93905447759308176936155474" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "4735868681302170402816", + "expectedQty": "4730453183886391401796", + "swapFee": "2841521208781302241", + "reserves": [ + "41760178418778222737889829", + "23402522058369921625262395", + "28761735903754233833632110" + ], + "mAssetSupply": "93900714732148083547054899" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "163082959531296354729984", + "expectedQty": "163392873158024071572821", + "swapFee": "97849775718777812837", + "reserves": [ + "41596785545620198666317008", + "23402522058369921625262395", + "28761735903754233833632110" + ], + "mAssetSupply": "93737729622392505970137752" + }, + { + "type": "mintMulti", + "inputQtys": [ + "163323444079502406189056", + "196153932577197837516800", + "65869103465965675347968" + ], + "expectedQty": "425515682022619440426873", + "reserves": [ + "41760108989699701072506064", + "23598675990947119462779195", + "28827605007220199508980078" + ], + "mAssetSupply": "94163245304415125410564625" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "155718371859455251841024", + "expectedQty": "156009580978508150405197", + "swapFee": "93431023115673151104", + "reserves": [ + "41604099408721192922100867", + "23598675990947119462779195", + "28827605007220199508980078" + ], + "mAssetSupply": "94007620363578785831874705" + }, + { + "type": "redeemMasset", + "inputQty": "36716737033640753286348", + "expectedQtys": [ + "16244518280242060362395", + "9214215160828381076445", + "11255875338506219968546" + ], + "redemptionFee": "11015021110092225985", + "reserves": [ + "41587854890440950861738472", + "23589461775786291081702750", + "28816349131881693289011532" + ], + "mAssetSupply": "93970914641566255170814342" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "2170433259572514816", + "expectedQty": "2176300156134609567", + "reserves": [ + "41587854890440950861738472", + "23589463946219550654217566", + "28816349131881693289011532" + ] + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "442028652775088064", + "expectedQty": "441524512313535368", + "swapFee": "265217191665052", + "reserves": [ + "41587854890440950861738472", + "23589463946219550654217566", + "28816348690357180975476164" + ], + "mAssetSupply": "93970916376102975722000897" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "4249020651489677707051008", + "expectedQty": "4231047172081741639823404", + "swapFee": "2549412390893806624230", + "reserves": [ + "41587854890440950861738472", + "19358416774137809014394162", + "28816348690357180975476164" + ], + "mAssetSupply": "89724445137004191821574119" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "172846955467057955602432", + "outputIndex": 2, + "expectedQty": "173559095603688761354537", + "swapFee": "104196609926487506152", + "reserves": [ + "41587854890440950861738472", + "19531263729604866969996594", + "28642789594753492214121627" + ], + "mAssetSupply": "89724549333614118309080271", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemBassets", + "inputQtys": [ + "10413819473825486", + "1448678961592290", + "21391542419196876" + ], + "expectedQty": "33228852555954837", + "swapFee": "19949281102234", + "reserves": [ + "41587854880027131387912986", + "19531263728156188008404304", + "28642789573361949794924751" + ], + "mAssetSupply": "89724549300385265753125434" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "81177500946073", + "38719572983141", + "14080560632619" + ], + "expectedQty": "133907179551271", + "swapFee": "80392543256", + "reserves": [ + "41587854879945953886966913", + "19531263728117468435421163", + "28642789573347869234292132" + ], + "mAssetSupply": "89724549300251358573574163" + }, + { + "type": "redeemMasset", + "inputQty": "38500330344619448729", + "expectedQtys": [ + "17839775399709569171", + "8378247908865518103", + "12286782626436180276" + ], + "redemptionFee": "11550099103385834", + "reserves": [ + "41587837040170554177397742", + "19531255349869559569903060", + "28642777286565242798111856" + ], + "mAssetSupply": "89724510811471113057511268" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "1335985315236809659121664", + "expectedQty": "1339176323757908781382635", + "swapFee": "801591189142085795472", + "reserves": [ + "40248660716412645396015107", + "19531255349869559569903060", + "28642777286565242798111856" + ], + "mAssetSupply": "88389327087423445484185076" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "853146433147617390100480", + "outputIndex": 0, + "expectedQty": "854819669059408718683226", + "swapFee": "511785689793501934557", + "reserves": [ + "39393841047353236677331881", + "19531255349869559569903060", + "29495923719712860188212336" + ], + "mAssetSupply": "88389838873113238986119633", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemMasset", + "inputQty": "282547052985793845080883", + "expectedQtys": [ + "125888616287511713840954", + "62414901542542950532661", + "94258415134822888323146" + ], + "redemptionFee": "84764115895738153524", + "reserves": [ + "39267952431065724963490927", + "19468840448327016619370399", + "29401665304578037299889190" + ], + "mAssetSupply": "88107376584243340879192274" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "328112682037121443168256", + "outputIndex": 0, + "expectedQty": "330184379601909402434291", + "swapFee": "197711260152754933563", + "reserves": [ + "38937768051463815561056636", + "19796953130364138062538655", + "29401665304578037299889190" + ], + "mAssetSupply": "88107574295503493634125837", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mintMulti", + "inputQtys": [ + "2110273350457077530624", + "620752469389478068224", + "3116913369904834412544" + ], + "expectedQty": "5843997811248455766895", + "reserves": [ + "38939878324814272638587260", + "19797573882833527540606879", + "29404782217947942134301734" + ], + "mAssetSupply": "88113418293314742089892732" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "15467013886015998787584", + "expectedQty": "15530938703103396722860", + "reserves": [ + "38939878324814272638587260", + "19813040896719543539394463", + "29404782217947942134301734" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "373551677419382345039872", + "80673262273696387563520", + "142943708569889746714624" + ], + "expectedQty": "596484405505009295094982", + "reserves": [ + "39313430002233654983627132", + "19893714158993239926957983", + "29547725926517831881016358" + ], + "mAssetSupply": "88725433637522854781710574" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "2868945733331939550560256", + "outputIndex": 2, + "expectedQty": "2858437519399919800278093", + "swapFee": "1716512756223108897723", + "reserves": [ + "42182375735565594534187388", + "19893714158993239926957983", + "26689288407117912080738265" + ], + "mAssetSupply": "88727150150279077890608297", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemMasset", + "inputQty": "43130317819519256074649", + "expectedQtys": [ + "20498725215396129922888", + "9667444589068256943254", + "12969786070884798530064" + ], + "redemptionFee": "12939095345855776822", + "reserves": [ + "42161877010350198404264500", + "19884046714404171670014729", + "26676318621047027282208201" + ], + "mAssetSupply": "88684032771554904490310470" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "210474055869919435685888", + "136238575626229135704064", + "52899757615195141177344" + ], + "expectedQty": "399530609943887525320434", + "swapFee": "239862283336334315781", + "reserves": [ + "41951402954480278968578612", + "19747808138777942534310665", + "26623418863431832141030857" + ], + "mAssetSupply": "88284502161611016964990036" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "543279925241217030291456", + "expectedQty": "541480354863755741825059", + "reserves": [ + "42494682879721495998870068", + "19747808138777942534310665", + "26623418863431832141030857" + ] + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "518233795453340002287616", + "expectedQty": "519645019920483327736184", + "swapFee": "310940277272004001372", + "reserves": [ + "41975037859801012671133884", + "19747808138777942534310665", + "26623418863431832141030857" + ], + "mAssetSupply": "88308059661298704708528851" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "272364445231018082828288", + "outputIndex": 0, + "expectedQty": "273231536998393308903774", + "swapFee": "163507349295405296531", + "reserves": [ + "41701806322802619362230110", + "19747808138777942534310665", + "26895783308662850223859145" + ], + "mAssetSupply": "88308223168648000113825382", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mintMulti", + "inputQtys": [ + "18892527359103632146432", + "25280843819766316531712", + "28519897130673020862464" + ], + "expectedQty": "72753536277250680084068", + "reserves": [ + "41720698850161722994376542", + "19773088982597708850842377", + "26924303205793523244721609" + ], + "mAssetSupply": "88380976704925250793909450" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "59959049518653598859264", + "62530844008299668439040", + "116198052469415058866176" + ], + "expectedQty": "238816989881577025126359", + "swapFee": "143376219660742660672", + "reserves": [ + "41660739800643069395517278", + "19710558138589409182403337", + "26808105153324108185855433" + ], + "mAssetSupply": "88142159715043673768783091" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "237349973854013077061632", + "453819477074920874180608", + "214309962301021249077248" + ], + "expectedQty": "906779278238255384753578", + "swapFee": "544394203465032250202", + "reserves": [ + "41423389826789056318455646", + "19256738661514488308222729", + "26593795191023086936778185" + ], + "mAssetSupply": "87235380436805418384029513" + }, + { + "type": "redeemMasset", + "inputQty": "154556307393864164966", + "expectedQtys": [ + "73368459740370532931", + "34107234128493797548", + "47102513820691829154" + ], + "redemptionFee": "46366892218159249", + "reserves": [ + "41423316458329315947922715", + "19256704554280359814425181", + "26593748088509266244949031" + ], + "mAssetSupply": "87235225926864916738023796" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "7777808352132705913143296", + "expectedQty": "7794237371832748181183755", + "swapFee": "4666685011279623547885", + "reserves": [ + "33629079086496567766738960", + "19256704554280359814425181", + "26593748088509266244949031" + ], + "mAssetSupply": "79462084259743490448428385" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "12143371707274185670656", + "expectedQty": "12139143033549522808282", + "swapFee": "7286023024364511402", + "reserves": [ + "33629079086496567766738960", + "19256704554280359814425181", + "26581608945475716722140749" + ], + "mAssetSupply": "79449948174059240627269131" + }, + { + "type": "redeemMasset", + "inputQty": "3301129430991930549862", + "expectedQtys": [ + "1396862314921079317112", + "799872183007365613954", + "1104129188622759919163" + ], + "redemptionFee": "990338829297579164", + "reserves": [ + "33627682224181646687421848", + "19255904682097352448811227", + "26580504816287093962221586" + ], + "mAssetSupply": "79446648034967077994298433" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "5355162740859949", + "expectedQty": "5353290684012711", + "swapFee": "3213097644515", + "reserves": [ + "33627682224181646687421848", + "19255904682097352448811227", + "26580504810933803278208875" + ], + "mAssetSupply": "79446648029615128351082999" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "15570869699437473792", + "expectedQty": "15594444151452448482", + "swapFee": "9342521819662484", + "reserves": [ + "33627666629737495234973366", + "19255904682097352448811227", + "26580504810933803278208875" + ], + "mAssetSupply": "79446632468087950733271691" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "81336107382431943753728", + "expectedQty": "81458722179935920583524", + "swapFee": "48801664429459166252", + "reserves": [ + "33546207907557559314389842", + "19255904682097352448811227", + "26580504810933803278208875" + ], + "mAssetSupply": "79365345162369948248684215" + }, + { + "type": "mintMulti", + "inputQtys": [ + "1149709095358783684608", + "1286965835417796476928", + "1092132373272675483648" + ], + "expectedQty": "3530120748151230444464", + "reserves": [ + "33547357616652918098074450", + "19257191647932770245288155", + "26581596943307075953692523" + ], + "mAssetSupply": "79368875283118099479128679" + }, + { + "type": "mintMulti", + "inputQtys": [ + "2763207115682461696", + "2135553846302567936", + "2839715379794826240" + ], + "expectedQty": "7738596595851813509", + "reserves": [ + "33547360379860033780536146", + "19257193783486616547856091", + "26581599783022455748518763" + ], + "mAssetSupply": "79368883021714695330942188" + }, + { + "type": "mintMulti", + "inputQtys": [ + "193240054706279645184", + "5438124410296962048", + "187693864458012819456" + ], + "expectedQty": "385935253659371417835", + "reserves": [ + "33547553619914740060181330", + "19257199221611026844818139", + "26581787476886913761338219" + ], + "mAssetSupply": "79369268956968354702360023" + }, + { + "type": "redeemMasset", + "inputQty": "14222191261755410009292", + "expectedQtys": [ + "6009587769894176699460", + "3449665219579829514017", + "4761765544304740572372" + ], + "redemptionFee": "4266657378526623002", + "reserves": [ + "33541544032144845883481870", + "19253749556391447015304122", + "26577025711342609020765847" + ], + "mAssetSupply": "79355051032363977818973733" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "995304875783177201778688", + "expectedQty": "998173068360391590395779", + "reserves": [ + "33541544032144845883481870", + "20249054432174624217082810", + "26577025711342609020765847" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "48734057571691634688", + "85855226730708074496", + "82101325597548838912" + ], + "expectedQty": "216815052624652047076", + "swapFee": "130167131853903570", + "reserves": [ + "33541495298087274191847182", + "20248968576947893509008314", + "26576943610017011471926935" + ], + "mAssetSupply": "80353007285671744757322436" + }, + { + "type": "mintMulti", + "inputQtys": [ + "2489279503645561323520", + "6188830369438853234688", + "9179599126772719812608" + ], + "expectedQty": "17868313214850566318922", + "reserves": [ + "33543984577590919753170702", + "20255157407317332362243002", + "26586123209143784191739543" + ], + "mAssetSupply": "80370875598886595323641358" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "386022260851211776", + "outputIndex": 1, + "expectedQty": "384725306504997820", + "swapFee": "231587896555115", + "reserves": [ + "33543984577590919753170702", + "20255157022592025857245182", + "26586123595166045042951319" + ], + "mAssetSupply": "80370875599118183220196473", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemMasset", + "inputQty": "26321697982031389209395", + "expectedQtys": [ + "10982457814427517441932", + "6631633371124043689409", + "8704421508353697957596" + ], + "redemptionFee": "7896509394609416762", + "reserves": [ + "33533002119776492235728770", + "20248525389220901813555773", + "26577419173657691344993723" + ], + "mAssetSupply": "80344561797645546440403840" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "92285499552072368128", + "expectedQty": "92105783937194941561", + "reserves": [ + "33533094405276044308096898", + "20248525389220901813555773", + "26577419173657691344993723" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "36233634076173625458688", + "23425648728417786396672", + "8436196508309963931648" + ], + "expectedQty": "68086226114361605920165", + "reserves": [ + "33569328039352217933555586", + "20271951037949319599952445", + "26585855370166001308925371" + ], + "mAssetSupply": "80412740129543845241265566" + }, + { + "type": "redeemMasset", + "inputQty": "46725735233132937661644", + "expectedQtys": [ + "19500404611689934749118", + "11775965460046418331727", + "15443709092370347816004" + ], + "redemptionFee": "14017720569939881298", + "reserves": [ + "33549827634740527998806468", + "20260175072489273181620718", + "26570411661073630961109367" + ], + "mAssetSupply": "80366028412031282243485220" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "2673582758381318106513408", + "expectedQty": "2663203185737313256990262", + "swapFee": "1604149655028790863908", + "reserves": [ + "33549827634740527998806468", + "17596971886751959924630456", + "26570411661073630961109367" + ], + "mAssetSupply": "77694049803304992927835720" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "53317723205632888", + "expectedQty": "53072560921466030", + "swapFee": "31990633923379", + "reserves": [ + "33549827634740527998806468", + "17596971833679399003164426", + "26570411661073630961109367" + ], + "mAssetSupply": "77694049750019260356126211" + }, + { + "type": "mintMulti", + "inputQtys": [ + "31609179310800173531136", + "77587815658543537717248", + "77560074537084934684672" + ], + "expectedQty": "186951747718255613601663", + "reserves": [ + "33581436814051328172337604", + "17674559649337942540881674", + "26647971735610715895794039" + ], + "mAssetSupply": "77881001497737515969727874" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "299410842928346445119488", + "expectedQty": "299242900738462319911382", + "reserves": [ + "33581436814051328172337604", + "17674559649337942540881674", + "26947382578539062340913527" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "12708583332294387712", + "17063192731585110016", + "7628452228502886400" + ], + "expectedQty": "37434916903655885406", + "swapFee": "22474434803075376", + "reserves": [ + "33581424105467995877949892", + "17674542586145210955771658", + "26947374950086833838027127" + ], + "mAssetSupply": "78180206963559074633753850" + }, + { + "type": "mintMulti", + "inputQtys": [ + "33369087900388119543808", + "294930918168991044206592", + "202201850317817197363200" + ], + "expectedQty": "531477211961243413520318", + "reserves": [ + "33614793193368383997493700", + "17969473504314201999978250", + "27149576800404651035390327" + ], + "mAssetSupply": "78711684175520318047274168" + }, + { + "type": "redeemMasset", + "inputQty": "128018404497470285414", + "expectedQtys": [ + "54655433224839496654", + "29217176900386956837", + "44143418445600021120" + ], + "redemptionFee": "38405521349241085", + "reserves": [ + "33614738537935159157997046", + "17969444287137301613021413", + "27149532656986205435369207" + ], + "mAssetSupply": "78711556195521341926229839" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "136121530925162320", + "50406874974279568", + "338241305816538944" + ], + "expectedQty": "524459257333286042", + "swapFee": "314864473083821", + "reserves": [ + "33614738401813628232834726", + "17969444236730426638741845", + "27149532318744899618830263" + ], + "mAssetSupply": "78711555671062084592943797" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "3247718831259598716928", + "3266312604535910039552", + "4503134879687978778624" + ], + "expectedQty": "11019901493927222850725", + "swapFee": "6615910442621906854", + "reserves": [ + "33611490682982368634117798", + "17966177924125890728702293", + "27145029183865211640051639" + ], + "mAssetSupply": "78700535769568157370093072" + }, + { + "type": "mintMulti", + "inputQtys": [ + "18593918715775277858816", + "127742843291220075085824", + "80428834276208208248832" + ], + "expectedQty": "227171909210772863524699", + "reserves": [ + "33630084601698143911976614", + "18093920767417110803788117", + "27225458018141419848300471" + ], + "mAssetSupply": "78927707678778930233617771" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "2534613718140293480448", + "expectedQty": "2523383256679660144808", + "swapFee": "1520768230884176088", + "reserves": [ + "33630084601698143911976614", + "18091397384160431143643309", + "27225458018141419848300471" + ], + "mAssetSupply": "78925174585829020824313411" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "608050734882975505186816", + "268746635604467132661760", + "254457546965565730455552" + ], + "expectedQty": "1130779245527424459667961", + "swapFee": "678874872239798554933", + "reserves": [ + "33022033866815168406789798", + "17822650748555964010981549", + "26971000471175854117844919" + ], + "mAssetSupply": "77794395340301596364645450" + }, + { + "type": "mintMulti", + "inputQtys": [ + "1221640261150024121974784", + "446963868668865709867008", + "2013675671420626530205696" + ], + "expectedQty": "3679888305899340708870353", + "reserves": [ + "34243674127965192528764582", + "18269614617224829720848557", + "28984676142596480648050615" + ], + "mAssetSupply": "81474283646200937073515803" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "159047372268053989425152", + "outputIndex": 2, + "expectedQty": "159734820237939307248715", + "swapFee": "95819797469159965971", + "reserves": [ + "34243674127965192528764582", + "18428661989492883710273709", + "28824941322358541340801900" + ], + "mAssetSupply": "81474379465998406233481774", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "2342363023974528005963776", + "expectedQty": "2339951565388743936268289", + "reserves": [ + "34243674127965192528764582", + "18428661989492883710273709", + "31167304346333069346765676" + ] + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "18789870623159085957120", + "expectedQty": "18802017230463677014976", + "swapFee": "11273922373895451574", + "reserves": [ + "34243674127965192528764582", + "18428661989492883710273709", + "31148502329102605669750700" + ], + "mAssetSupply": "83795552434686364979244517" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "481010024111359721472", + "outputIndex": 0, + "expectedQty": "481078640257957585858", + "swapFee": "288246991750856560", + "reserves": [ + "34243193049324934571178724", + "18428661989492883710273709", + "31148983339126717029472172" + ], + "mAssetSupply": "83795552722933356730101077", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mintMulti", + "inputQtys": [ + "71147694156363", + "16692564737022758", + "28159210958683552" + ], + "expectedQty": "44961534369063930", + "reserves": [ + "34243193049396082265335087", + "18428662006185448447296467", + "31148983367285927988155724" + ], + "mAssetSupply": "83795552767894891099165007" + }, + { + "type": "redeemMasset", + "inputQty": "5567088787128729364070", + "expectedQtys": [ + "2274317661222903874002", + "1223969721892341281546", + "2068810665499730790280" + ], + "redemptionFee": "1670126636138618809", + "reserves": [ + "34240918731734859361461085", + "18427438036463556106014921", + "31146914556620428257365444" + ], + "mAssetSupply": "83789987349234398508419746" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "162296178124050283888640", + "342538160968841442623488", + "325738079755530974265344" + ], + "expectedQty": "831374395807582611300465", + "swapFee": "499124111951720599139", + "reserves": [ + "34078622553610809077572445", + "18084899875494714663391433", + "30821176476864897283100100" + ], + "mAssetSupply": "82958612953426815897119281" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "9354752686988849152", + "101840851856000848", + "74589439065099337728" + ], + "expectedQty": "83933690280420251500", + "swapFee": "50390448437314539", + "reserves": [ + "34078613198858122088723293", + "18084899773653862807390585", + "30821101887425832183762372" + ], + "mAssetSupply": "82958529019736535476867781" + }, + { + "type": "mintMulti", + "inputQtys": [ + "943274755170452256063488", + "218547691008042683334656", + "771079635830739619020800" + ], + "expectedQty": "1930978182639113015857279", + "reserves": [ + "35021887954028574344786781", + "18303447464661905490725241", + "31592181523256571802783172" + ], + "mAssetSupply": "84889507202375648492725060" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "1605937141410845425664", + "1224220907216229892096", + "1757009773116253798400" + ], + "expectedQty": "4587300410001172897797", + "swapFee": "2754032665600063776", + "reserves": [ + "35020282016887163499361117", + "18302223243754689260833145", + "31590424513483455548984772" + ], + "mAssetSupply": "84884919901965647319827263" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "107887864662130893520896", + "expectedQty": "108049129208855715387571", + "swapFee": "64732718797278536112", + "reserves": [ + "34912232887678307783973546", + "18302223243754689260833145", + "31590424513483455548984772" + ], + "mAssetSupply": "84777096770022313704842479" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "865464680633392562176", + "outputIndex": 1, + "expectedQty": "859785514001985767372", + "swapFee": "518604903250829883", + "reserves": [ + "34912232887678307783973546", + "18301363458240687275065773", + "31591289978164088941546948" + ], + "mAssetSupply": "84777097288627216955672362", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mintMulti", + "inputQtys": [ + "18763213749940912128000", + "14885059900508966223872", + "25355288514781201301504" + ], + "expectedQty": "59001458339722530076365", + "reserves": [ + "34930996101428248696101546", + "18316248518141196241289645", + "31616645266678870142848452" + ], + "mAssetSupply": "84836098746966939485748727" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "154391942274423750656", + "392325683213448183808", + "1444409367629783891968" + ], + "expectedQty": "1990771670586491519652", + "swapFee": "1195180110418145799", + "reserves": [ + "34930841709485974272350890", + "18315856192457982793105837", + "31615200857311240358956484" + ], + "mAssetSupply": "84834107975296352994229075" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "1086147292939984175104", + "expectedQty": "1086906777665363282718", + "swapFee": "651688375763990505", + "reserves": [ + "34930841709485974272350890", + "18315856192457982793105837", + "31614113950533574995673766" + ], + "mAssetSupply": "84833022479691788774044476" + }, + { + "type": "mintMulti", + "inputQtys": [ + "330088940220810526720", + "386537102103084597248", + "279903550604994412544" + ], + "expectedQty": "997293415691835703858", + "reserves": [ + "34931171798426195082877610", + "18316242729560085877703085", + "31614393854084179990086310" + ], + "mAssetSupply": "84834019773107480609748334" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "1071974853349217629372416", + "outputIndex": 1, + "expectedQty": "1064247693622014860668532", + "swapFee": "642289103873800800387", + "reserves": [ + "34931171798426195082877610", + "17251995035938071017034553", + "32686368707433397619458726" + ], + "mAssetSupply": "84834662062211354410548721", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "24892711265791077515264", + "expectedQty": "24932853033476864903607", + "swapFee": "14935626759474646509", + "reserves": [ + "34906238945392718217974003", + "17251995035938071017034553", + "32686368707433397619458726" + ], + "mAssetSupply": "84809784286572322807679966" + }, + { + "type": "redeemMasset", + "inputQty": "22326476459052493701120", + "expectedQtys": [ + "9186434426706799582650", + "4540286376181891243037", + "8602221031252948951596" + ], + "redemptionFee": "6697942937715748110", + "reserves": [ + "34897052510966011418391353", + "17247454749561889125791516", + "32677766486402144670507130" + ], + "mAssetSupply": "84787464508056208029726956" + }, + { + "type": "redeemMasset", + "inputQty": "27884438041095582410342", + "expectedQtys": [ + "11473308923595559720259", + "5670547001792651657423", + "10743661222213381329087" + ], + "redemptionFee": "8365331412328674723", + "reserves": [ + "34885579202042415858671094", + "17241784202560096474134093", + "32667022825179931289178043" + ], + "mAssetSupply": "84759588435346524775991337" + }, + { + "type": "mintMulti", + "inputQtys": [ + "95595114483896762368", + "19053941318630981632", + "56412063007052963840" + ], + "expectedQty": "170862521671296872871", + "reserves": [ + "34885674797156899755433462", + "17241803256501415105115725", + "32667079237242938342141883" + ], + "mAssetSupply": "84759759297868196072864208" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "162453468844263095664640", + "240763317695207148879872", + "197827271832600058003456" + ], + "expectedQty": "601719203023749242368342", + "swapFee": "361248270776715574765", + "reserves": [ + "34723221328312636659768822", + "17001039938806207956235853", + "32469251965410338284138427" + ], + "mAssetSupply": "84158040094844446830495866" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "443712918643488159956992", + "expectedQty": "440827688879300019773989", + "swapFee": "266227751186092895974", + "reserves": [ + "34723221328312636659768822", + "16560212249926907936461864", + "32469251965410338284138427" + ], + "mAssetSupply": "83714593403952144763434848" + }, + { + "type": "mintMulti", + "inputQtys": [ + "26433940349751865344", + "18494348618068992000", + "29091569631669731328" + ], + "expectedQty": "74019057935175637322", + "reserves": [ + "34723247762252986411634166", + "16560230744275526005453864", + "32469281056979969953869755" + ], + "mAssetSupply": "83714667423010079939072170" + }, + { + "type": "redeemMasset", + "inputQty": "465065991379703176783462", + "expectedQtys": [ + "192842635119214222411732", + "91970617402325331354988", + "180324771528460659800512" + ], + "redemptionFee": "139519797413910953035", + "reserves": [ + "34530405127133772189222434", + "16468260126873200674098876", + "32288956285451509294069243" + ], + "mAssetSupply": "83249740951427790673241743" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "8731587993902254129152", + "outputIndex": 1, + "expectedQty": "8652897809055458341223", + "swapFee": "5226712291826008569", + "reserves": [ + "34539136715127674443351586", + "16459607229064145215757653", + "32288956285451509294069243" + ], + "mAssetSupply": "83249746178140082499250312", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "474457259620241375232", + "expectedQty": "473347463771439672087", + "reserves": [ + "34539611172387294684726818", + "16459607229064145215757653", + "32288956285451509294069243" + ] + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "104035385693826678784", + "expectedQty": "104673764478098820375", + "reserves": [ + "34539611172387294684726818", + "16459711264449839042436437", + "32288956285451509294069243" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "750584968232517526093824", + "698369268557002779394048", + "513436408596954328596480" + ], + "expectedQty": "1964065299171800356803356", + "swapFee": "1179146667503582363500", + "reserves": [ + "33789026204154777158632994", + "15761341995892836263042389", + "31775519876854554965472763" + ], + "mAssetSupply": "81286258900196531680939418" + }, + { + "type": "mintMulti", + "inputQtys": [ + "134941939341262700544", + "39916646457823535104", + "124171096617705324544" + ], + "expectedQty": "298727174175753629792", + "reserves": [ + "33789161146094118421333538", + "15761381912539294086577493", + "31775644047951172670797307" + ], + "mAssetSupply": "81286557627370707434569210" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "937778400038688466665472", + "expectedQty": "939397194502971863663510", + "swapFee": "562667040023213079999", + "reserves": [ + "32849763951591146557670028", + "15761381912539294086577493", + "31775644047951172670797307" + ], + "mAssetSupply": "80349341894372042180983737" + }, + { + "type": "mintMulti", + "inputQtys": [ + "18526163733496204", + "54953792548554440", + "49192691384710000" + ], + "expectedQty": "122878828616685753", + "reserves": [ + "32849763970117310291166232", + "15761381967493086635131933", + "31775644097143864055507307" + ], + "mAssetSupply": "80349342017250870797669490" + }, + { + "type": "redeemMasset", + "inputQty": "53451365183328126972723", + "expectedQtys": [ + "21846326636464068673717", + "10481910890353926409353", + "21131996584867920108230" + ], + "redemptionFee": "16035409554998438091", + "reserves": [ + "32827917643480846222492515", + "15750900056602732708722580", + "31754512100558996135399077" + ], + "mAssetSupply": "80295906687477097669134858" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "41419438930563520528384", + "39296612489980085796864", + "28758876022687752257536" + ], + "expectedQty": "109572158430612386025147", + "swapFee": "65782764717197750265", + "reserves": [ + "32786498204550282701964131", + "15711603444112752622925716", + "31725753224536308383141541" + ], + "mAssetSupply": "80186334529046485283109711" + }, + { + "type": "redeemMasset", + "inputQty": "4356400939923308701286", + "expectedQtys": [ + "1780705940659938094515", + "853331313874252772365", + "1723094576504740105739" + ], + "redemptionFee": "1306920281976992610", + "reserves": [ + "32784717498609622763869616", + "15710750112798878370153351", + "31724030129959803643035802" + ], + "mAssetSupply": "80181979435026843951401035" + }, + { + "type": "mintMulti", + "inputQtys": [ + "191005788787201984", + "240874887875413664", + "186852223217350720" + ], + "expectedQty": "619450505944929179", + "reserves": [ + "32784717689615411551071600", + "15710750353673766245567015", + "31724030316812026860386522" + ], + "mAssetSupply": "80181980054477349896330214" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "68348136850384886956032", + "outputIndex": 1, + "expectedQty": "67741707870128831499962", + "swapFee": "40927374438306021314", + "reserves": [ + "32784717689615411551071600", + "15643008645803637414067053", + "31792378453662411747342554" + ], + "mAssetSupply": "80182020981851788202351528", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mintMulti", + "inputQtys": [ + "1889110519759629189120", + "1596709493741705232384", + "1316017569829479776256" + ], + "expectedQty": "4805111553257370107669", + "reserves": [ + "32786606800135171180260720", + "15644605355297379119299437", + "31793694471232241227118810" + ], + "mAssetSupply": "80186826093405045572459197" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "2911977971288161990475776", + "expectedQty": "2916037002770827289119141", + "swapFee": "1747186782772897194285", + "reserves": [ + "29870569797364343891141579", + "15644605355297379119299437", + "31793694471232241227118810" + ], + "mAssetSupply": "77276595308899656479177706" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "3731240101513872873095168", + "3715159567636762881687552", + "1779709389099620500504576" + ], + "expectedQty": "9240380518569573017686860", + "swapFee": "5547556845248893146500", + "reserves": [ + "26139329695850471018046411", + "11929445787660616237611885", + "30013985082132620726614234" + ], + "mAssetSupply": "68036214790330083461490846" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "82067358444683264000000", + "expectedQty": "82279645824337253797122", + "swapFee": "49240415066809958400", + "reserves": [ + "26139329695850471018046411", + "11929445787660616237611885", + "29931705436308283472817112" + ], + "mAssetSupply": "67954196672300467007449246" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "18348817031239500300288", + "expectedQty": "18311287927972479246009", + "reserves": [ + "26157678512881710518346699", + "11929445787660616237611885", + "29931705436308283472817112" + ] + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "19681379662465050083328", + "expectedQty": "19502399033771653198417", + "swapFee": "11808827797479030049", + "reserves": [ + "26157678512881710518346699", + "11909943388626844584413468", + "29931705436308283472817112" + ], + "mAssetSupply": "67952838389393771915641976" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "1620338882322603274403840", + "expectedQty": "1622379043250829253331573", + "swapFee": "972203329393561964642", + "reserves": [ + "24535299469630881265015126", + "11909943388626844584413468", + "29931705436308283472817112" + ], + "mAssetSupply": "66333471710400562203202778" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "39164301566267046756352", + "expectedQty": "39479522995183893929569", + "reserves": [ + "24535299469630881265015126", + "11949107690193111631169820", + "29931705436308283472817112" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "17329272533641883648", + "2317305877362801664", + "8331854010061093888" + ], + "expectedQty": "27941077459363608035", + "reserves": [ + "24535316798903414906898774", + "11949110007498988993971484", + "29931713768162293533911000" + ], + "mAssetSupply": "66372979174473205460740382" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "1677134347379614886658048", + "expectedQty": "1660450288794226663175016", + "swapFee": "1006280608427768931994", + "reserves": [ + "24535316798903414906898774", + "10288659718704762330796468", + "29931713768162293533911000" + ], + "mAssetSupply": "64696851107702018343014328" + }, + { + "type": "mintMulti", + "inputQtys": [ + "9003138115810847883264", + "6294942186328382504960", + "14264963806993601003520" + ], + "expectedQty": "29556395324333992781392", + "reserves": [ + "24544319937019225754782038", + "10294954660891090713301428", + "29945978731969287134914520" + ], + "mAssetSupply": "64726407503026352335795720" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "6919016949534765296386048", + "expectedQty": "6936641889684113491485541", + "swapFee": "4151410169720859177831", + "reserves": [ + "24544319937019225754782038", + "10294954660891090713301428", + "23009336842285173643428979" + ], + "mAssetSupply": "57811541963661307898587503" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "1042403018324985380864", + "933416757985842561024", + "42596145904286982144" + ], + "expectedQty": "2023050369929342127079", + "swapFee": "1214558957332004478", + "reserves": [ + "24543277534000900769401174", + "10294021244133104870740404", + "23009294246139269356446835" + ], + "mAssetSupply": "57809518913291378556460424" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "15615146092464451593699328", + "outputIndex": 0, + "expectedQty": "15484282053017336638488885", + "swapFee": "9330390213441006437913", + "reserves": [ + "9058995480983564130912289", + "10294021244133104870740404", + "38624440338603720950146163" + ], + "mAssetSupply": "57818849303504819562898337", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "197488505484411437056", + "expectedQty": "199756027450186234767", + "reserves": [ + "9058995480983564130912289", + "10294218732638589282177460", + "38624440338603720950146163" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "24704802215671101390848", + "40397778469676696731648", + "61680950810788719755264" + ], + "expectedQty": "126966349743379815875671", + "swapFee": "76225545173131768586", + "reserves": [ + "9034290678767893029521441", + "10253820954168912585445812", + "38562759387792932230390899" + ], + "mAssetSupply": "57692082709788889933257433" + }, + { + "type": "mintMulti", + "inputQtys": [ + "21044661893497240944640", + "33905434379692781076480", + "5253920997096685568000" + ], + "expectedQty": "60866036194952019773448", + "reserves": [ + "9055335340661390270466081", + "10287726388548605366522292", + "38568013308790028915958899" + ], + "mAssetSupply": "57752948745983841953030881" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "2675221927992487", + "expectedQty": "2716934888367427", + "reserves": [ + "9055335343336612198458568", + "10287726388548605366522292", + "38568013308790028915958899" + ] + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "1421896745194804385677312", + "expectedQty": "1435682187612518284565106", + "reserves": [ + "9055335343336612198458568", + "11709623133743409752199604", + "38568013308790028915958899" + ] + }, + { + "type": "redeemMasset", + "inputQty": "46480108383464236620185", + "expectedQtys": [ + "7108910844198797350120", + "9192665287454420303818", + "30277903319374515219862" + ], + "redemptionFee": "13944032515039270986", + "reserves": [ + "9048226432492413401108448", + "11700430468455955331895786", + "38537735405470654400739037" + ], + "mAssetSupply": "59142164771962345928614215" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "17520070848170342481920", + "expectedQty": "17368019419128007634102", + "swapFee": "10512042508902205489", + "reserves": [ + "9048226432492413401108448", + "11683062449036827324261684", + "38537735405470654400739037" + ], + "mAssetSupply": "59124655213156684488337784" + }, + { + "type": "redeemMasset", + "inputQty": "92435327725913018833305", + "expectedQtys": [ + "14141729197043318094085", + "18259788985067825135134", + "60231717457290912242506" + ], + "redemptionFee": "27730598317773905649", + "reserves": [ + "9034084703295370083014363", + "11664802660051759499126550", + "38477503688013363488496531" + ], + "mAssetSupply": "59032247616029089243410128" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "19019143182567860", + "5809432501110884", + "10847919525562440" + ], + "expectedQty": "35915411751077731", + "swapFee": "21562184361263", + "reserves": [ + "9034084684276226900446503", + "11664802654242326998015666", + "38477503677165443962934091" + ], + "mAssetSupply": "59032247580113677492332397" + }, + { + "type": "redeemMasset", + "inputQty": "40431407237612570463436", + "expectedQtys": [ + "6185622157896513426668", + "7986870201820792642574", + "26345480216747303346632" + ], + "redemptionFee": "12129422171283771139", + "reserves": [ + "9027899062118330387019835", + "11656815784040506205373092", + "38451158196948696659587459" + ], + "mAssetSupply": "58991828302298236205640100" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "24877216676942989754368", + "expectedQty": "24630488854784352168468", + "reserves": [ + "9027899062118330387019835", + "11656815784040506205373092", + "38476035413625639649341827" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "1759766407947235622912", + "175005151138336243712", + "2316713005010621562880" + ], + "expectedQty": "4257636331632762911418", + "swapFee": "2556115468260614115", + "reserves": [ + "9026139295710383151396923", + "11656640778889367869129380", + "38473718700620629027778947" + ], + "mAssetSupply": "59012201154821387794897150" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "51980691626166562324480", + "expectedQty": "52794061297274249541300", + "reserves": [ + "9078119987336549713721403", + "11656640778889367869129380", + "38473718700620629027778947" + ] + }, + { + "type": "redeemMasset", + "inputQty": "44941733544733330636", + "expectedQtys": [ + "6905343039997823364", + "8866715067055922211", + "29265335336255180614" + ], + "redemptionFee": "13482520063419999", + "reserves": [ + "9078113081993509715898039", + "11656631912174300813207169", + "38473689435285292772598333" + ], + "mAssetSupply": "59064950287867637374527813" + }, + { + "type": "mintMulti", + "inputQtys": [ + "6823991327873392705536", + "40243488339433231482880", + "44897245373408359743488" + ], + "expectedQty": "91956026077158488897111", + "reserves": [ + "9084937073321383108603575", + "11696875400513734044690049", + "38518586680658701132341821" + ], + "mAssetSupply": "59156906313944795863424924" + }, + { + "type": "redeemMasset", + "inputQty": "236648133611875366181273", + "expectedQtys": [ + "36331994965319569380737", + "46777519176153109544795", + "154041473931892255118765" + ], + "redemptionFee": "70994440083562609854", + "reserves": [ + "9048605078356063539222838", + "11650097881337580935145254", + "38364545206726808877223056" + ], + "mAssetSupply": "58920329174773004059853505" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "126910640903531456888832", + "expectedQty": "128855561943491323558643", + "reserves": [ + "9175515719259594996111670", + "11650097881337580935145254", + "38364545206726808877223056" + ] + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "404699344477222862848", + "expectedQty": "408442232587772929418", + "swapFee": "242819606686333717", + "reserves": [ + "9175515719259594996111670", + "11650097881337580935145254", + "38364136764494221104293638" + ], + "mAssetSupply": "59048780280191624846883017" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "2561752735062987112448", + "expectedQty": "2539509676588021457220", + "swapFee": "1537051641037792267", + "reserves": [ + "9175515719259594996111670", + "11647558371660992913688034", + "38364136764494221104293638" + ], + "mAssetSupply": "59046220064508202897562836" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "60376920958263118266368", + "51276648761428325433344", + "79584673807993032146944" + ], + "expectedQty": "191794390890492930553445", + "swapFee": "115145721967476244078", + "reserves": [ + "9115138798301331877845302", + "11596281722899564588254690", + "38284552090686228072146694" + ], + "mAssetSupply": "58854425673617709967009391" + }, + { + "type": "redeemMasset", + "inputQty": "821861668407054172160", + "expectedQtys": [ + "127248472478710287160", + "161885536613742640690", + "534457113695219006482" + ], + "redemptionFee": "246558500522116251", + "reserves": [ + "9115011549828853167558142", + "11596119837362950845614000", + "38284017633572532853140212" + ], + "mAssetSupply": "58853604058507803434953482" + }, + { + "type": "redeemMasset", + "inputQty": "23311757903694148403", + "expectedQtys": [ + "3609348991525641141", + "4591814635866514391", + "15159649516832418049" + ], + "redemptionFee": "6993527371108244", + "reserves": [ + "9115007940479861641917001", + "11596115245548314979099609", + "38284002473923016020722163" + ], + "mAssetSupply": "58853580753743427111913323" + }, + { + "type": "mintMulti", + "inputQtys": [ + "16684442951488433553408", + "57326073479984068952064", + "41348569624359701839872" + ], + "expectedQty": "115675947401505629566142", + "reserves": [ + "9131692383431350075470409", + "11653441319028299048051673", + "38325351043547375722562035" + ], + "mAssetSupply": "58969256701144932741479465" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "2166684673988384784384", + "expectedQty": "2145495933202686990016", + "reserves": [ + "9131692383431350075470409", + "11653441319028299048051673", + "38327517728221364107346419" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "41071262208783208677376", + "40563251625853280321536", + "22437548395971425075200" + ], + "expectedQty": "104803706151443932110499", + "reserves": [ + "9172763645640133284147785", + "11694004570654152328373209", + "38349955276617335532421619" + ], + "mAssetSupply": "59076205903229579360579980" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "3972761318603732549632", + "9305047677083215462400", + "10172910169708554092544" + ], + "expectedQty": "23486701348279112443170", + "swapFee": "14100481097626043091", + "reserves": [ + "9168790884321529551598153", + "11684699522977069112910809", + "38339782366447626978329075" + ], + "mAssetSupply": "59052719201881300248136810" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "263266375679489540096", + "outputIndex": 1, + "expectedQty": "258461161173693609466", + "swapFee": "156421983602403618", + "reserves": [ + "9168790884321529551598153", + "11684441061815895419301343", + "38340045632823306467869171" + ], + "mAssetSupply": "59052719358303283850540428", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemMasset", + "inputQty": "192803303253375944805580", + "expectedQtys": [ + "29926527628017581229035", + "38137498462563272063606", + "125140211982819741832691" + ], + "redemptionFee": "57840990976012783441", + "reserves": [ + "9138864356693511970369118", + "11646303563353332147237737", + "38214905420840486726036480" + ], + "mAssetSupply": "58859973896040883918518289" + }, + { + "type": "mintMulti", + "inputQtys": [ + "53962708828618873634816", + "72218110146443462311936", + "79078248612861564682240" + ], + "expectedQty": "205882397402730202714116", + "reserves": [ + "9192827065522130844003934", + "11718521673499775609549673", + "38293983669453348290718720" + ], + "mAssetSupply": "59065856293443614121232405" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "893122306904448172032", + "expectedQty": "879415726072715496507", + "swapFee": "535873384142668903", + "reserves": [ + "9191947649796058128507427", + "11718521673499775609549673", + "38293983669453348290718720" + ], + "mAssetSupply": "59064963707010093815729276" + }, + { + "type": "redeemMasset", + "inputQty": "130270734318197068", + "expectedQtys": [ + "20267218711254995", + "25838032458188696", + "84433960235974338" + ], + "redemptionFee": "39081220295459", + "reserves": [ + "9191947629528839417252432", + "11718521647661743151360977", + "38293983585019388054744382" + ], + "mAssetSupply": "59064963576778440717827667" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "147759457696828555264", + "outputIndex": 2, + "expectedQty": "150304581216103944493", + "swapFee": "89363348547126608", + "reserves": [ + "9191947629528839417252432", + "11718669407119439979916241", + "38293833280438171950799889" + ], + "mAssetSupply": "59064963666141789264954275", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mintMulti", + "inputQtys": [ + "49010881454253170229248", + "15472081986875230781440", + "34970708774549723283456" + ], + "expectedQty": "99969735711927371657176", + "reserves": [ + "9240958510983092587481680", + "11734141489106315210697681", + "38328803989212721674083345" + ], + "mAssetSupply": "59164933401853716636611451" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "40501598384624305700864", + "expectedQty": "41099349199818395798181", + "reserves": [ + "9281460109367716893182544", + "11734141489106315210697681", + "38328803989212721674083345" + ] + }, + { + "type": "redeemMasset", + "inputQty": "30312377626944165065523", + "expectedQtys": [ + "4750507807372695930847", + "6005857925366101169890", + "19617741223090461975471" + ], + "redemptionFee": "9093713288083249519", + "reserves": [ + "9276709601560344197251697", + "11728135631180949109527791", + "38309186247989631212107874" + ], + "mAssetSupply": "59175729467139878950593628" + }, + { + "type": "mintMulti", + "inputQtys": [ + "10360715260851908509696", + "3675285150455393419264", + "5717836376248135188480" + ], + "expectedQty": "19880245122560504430602", + "reserves": [ + "9287070316821196105761393", + "11731810916331404502947055", + "38314904084365879347296354" + ], + "mAssetSupply": "59195609712262439455024230" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "139428223670802102353920", + "outputIndex": 0, + "expectedQty": "135961432699726295410571", + "swapFee": "82851477528474817733", + "reserves": [ + "9151108884121469810350822", + "11731810916331404502947055", + "38454332308036681449650274" + ], + "mAssetSupply": "59195692563739967929841963", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemBassets", + "inputQtys": [ + "888684303461075994542080", + "148172696015770828668928", + "458618522989582811136" + ], + "expectedQty": "1053699011674498212600590", + "swapFee": "632598966384529645347", + "reserves": [ + "8262424580660393815808742", + "11583638220315633674278127", + "38453873689513691866839138" + ], + "mAssetSupply": "58141993552065469717241373" + }, + { + "type": "redeemMasset", + "inputQty": "8653577852824410128384", + "expectedQtys": [ + "1229371064435870531362", + "1723536415967049074323", + "5721574722753048210858" + ], + "redemptionFee": "2596073355847323038", + "reserves": [ + "8261195209595957945277380", + "11581914683899666625203804", + "38448152114790938818628280" + ], + "mAssetSupply": "58133342570286001154436027" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "298590010173830529024", + "expectedQty": "295399005089349121438", + "reserves": [ + "8261195209595957945277380", + "11581914683899666625203804", + "38448450704801112649157304" + ] + }, + { + "type": "redeemMasset", + "inputQty": "2051943096128", + "expectedQtys": [ + "291507939590", + "408684215825", + "1356707880767" + ], + "redemptionFee": "615582928", + "reserves": [ + "8261195209595666437337790", + "11581914683899257940987979", + "38448450704799755941276537" + ], + "mAssetSupply": "58133637969289039176044265" + }, + { + "type": "redeemMasset", + "inputQty": "21430279584181711064268", + "expectedQtys": [ + "3044478503439338866775", + "4268255305581323403368", + "14169315539880467789788" + ], + "redemptionFee": "6429083875254513319", + "reserves": [ + "8258150731092227098471015", + "11577646428593676617584611", + "38434281389259875473486749" + ], + "mAssetSupply": "58112214118788732719493316" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "687961943861214410964992", + "expectedQty": "693157183665284825044668", + "reserves": [ + "8258150731092227098471015", + "12265608372454891028549603", + "38434281389259875473486749" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "62077467547672697110528", + "76358482109133456670720", + "27808442849219800203264" + ], + "expectedQty": "167666151630257460115604", + "reserves": [ + "8320228198639899795581543", + "12341966854564024485220323", + "38462089832109095273690013" + ], + "mAssetSupply": "58973037454084275004653588" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "243567214566482894651392", + "191199740730005090467840", + "972617547162801345134592" + ], + "expectedQty": "1403380483866332965005463", + "swapFee": "842533810606163477089", + "reserves": [ + "8076660984073416900930151", + "12150767113834019394752483", + "37489472284946293928555421" + ], + "mAssetSupply": "57569656970217942039648125" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "198616979951419117273088", + "outputIndex": 1, + "expectedQty": "195128799352784612624657", + "swapFee": "117952180233647087998", + "reserves": [ + "8076660984073416900930151", + "11955638314481234782127826", + "37688089264897713045828509" + ], + "mAssetSupply": "57569774922398175686736123", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "33302107362987126784", + "expectedQty": "33536652843754333823", + "reserves": [ + "8076660984073416900930151", + "11955671616588597769254610", + "37688089264897713045828509" + ] + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "1025925864874228498563072", + "expectedQty": "1043300214862194629837668", + "reserves": [ + "9102586848947645399493223", + "11955671616588597769254610", + "37688089264897713045828509" + ] + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "19218382830208219611136", + "outputIndex": 2, + "expectedQty": "19528463470156854314893", + "swapFee": "11613983353254189499", + "reserves": [ + "9102586848947645399493223", + "11974889999418805988865746", + "37668560801427556191513616" + ], + "mAssetSupply": "58613120287896567325097113", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "11355919777557171404800", + "expectedQty": "11268234886952272218179", + "swapFee": "6813551866534302842", + "reserves": [ + "9102586848947645399493223", + "11963621764531853716647567", + "37668560801427556191513616" + ], + "mAssetSupply": "58601771181670876687995155" + }, + { + "type": "redeemMasset", + "inputQty": "10677128686023656393932", + "expectedQtys": [ + "1657976070609982854195", + "2179094682926949791191", + "6861079543591981751580" + ], + "redemptionFee": "3203138605807096918", + "reserves": [ + "9100928872877035416639028", + "11961442669848926766856376", + "37661699721883964209762036" + ], + "mAssetSupply": "58591097256123458838698141" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "37702055631794446336", + "expectedQty": "38036814683331436343", + "swapFee": "22621233379076667", + "reserves": [ + "9100928872877035416639028", + "11961442669848926766856376", + "37661661685069280878325693" + ], + "mAssetSupply": "58591059576689060423328472" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "42190781203223750377472", + "13163872808060443426816", + "15029924114291528564736" + ], + "expectedQty": "70966152913591400379035", + "swapFee": "42605254901095497525", + "reserves": [ + "9058738091673811666261556", + "11948278797040866323429560", + "37646631760954989349760957" + ], + "mAssetSupply": "58520093423775469022949437" + }, + { + "type": "mintMulti", + "inputQtys": [ + "288301139380004540383232", + "463978142184145288167424", + "988097619129414035963904" + ], + "expectedQty": "1738687335497536591905555", + "reserves": [ + "9347039231053816206644788", + "12412256939225011611596984", + "38634729380084403385724861" + ], + "mAssetSupply": "60258780759273005614854992" + }, + { + "type": "mintMulti", + "inputQtys": [ + "158587257679837885628416", + "395977572018741676343296", + "240352628817035714887680" + ], + "expectedQty": "797685568290822053979159", + "reserves": [ + "9505626488733654092273204", + "12808234511243753287940280", + "38875082008901439100612541" + ], + "mAssetSupply": "61056466327563827668834151" + }, + { + "type": "mintMulti", + "inputQtys": [ + "7740262339994405444780032", + "246005771035735461199872", + "643495362489393690443776" + ], + "expectedQty": "8682435187749419577908321", + "reserves": [ + "17245888828728059537053236", + "13054240282279488749140152", + "39518577371390832791056317" + ], + "mAssetSupply": "69738901515313247246742472" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "592623566350066724634624", + "expectedQty": "589079850067126035073958", + "reserves": [ + "17245888828728059537053236", + "13054240282279488749140152", + "40111200937740899515690941" + ] + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "4338049927848546887794688", + "outputIndex": 1, + "expectedQty": "4241567193914891313515920", + "swapFee": "2585802939945751297414", + "reserves": [ + "17245888828728059537053236", + "8812673088364597435624232", + "44449250865589446403485629" + ], + "mAssetSupply": "70330567168320319033113844", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "17890355755211420598272", + "expectedQty": "17946272737959422257018", + "reserves": [ + "17263779184483270957651508", + "8812673088364597435624232", + "44449250865589446403485629" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "7082596312934", + "12005663885207", + "1738809862224" + ], + "expectedQty": "21113448877763", + "reserves": [ + "17263779184490353553964442", + "8812673088376603099509439", + "44449250865591185213347853" + ], + "mAssetSupply": "70348513441079391904248625" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "5243628023959593984", + "expectedQty": "5292584345295214713", + "swapFee": "3146176814375756", + "reserves": [ + "17263779184490353553964442", + "8812673088376603099509439", + "44449245573006839918133140" + ], + "mAssetSupply": "70348508200597544759030397" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "1474999733335113596928", + "3384660929901049151488", + "3765620701584579100672" + ], + "expectedQty": "8672166094649835584593", + "swapFee": "5206423510896439214", + "reserves": [ + "17262304184757018440367514", + "8809288427446702050357951", + "44445479952305255339032468" + ], + "mAssetSupply": "70339836034502894923445804" + }, + { + "type": "redeemMasset", + "inputQty": "27575851125296518188236", + "expectedQtys": [ + "6765439760563727103597", + "3452535046969497619979", + "17419066077643476055573" + ], + "redemptionFee": "8272755337588955456", + "reserves": [ + "17255538744996454713263917", + "8805835892399732552737972", + "44428060886227611862976895" + ], + "mAssetSupply": "70312268456132935994213024" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "28462885473618657017856", + "expectedQty": "27791808912964970398300", + "swapFee": "17077731284171194210", + "reserves": [ + "17255538744996454713263917", + "8778044083486767582339672", + "44428060886227611862976895" + ], + "mAssetSupply": "70283822648390601508389378" + }, + { + "type": "mintMulti", + "inputQtys": [ + "292200560352582828032", + "5436254339152045146112", + "2102492356243563741184" + ], + "expectedQty": "7939369801142293346890", + "reserves": [ + "17255830945556807296091949", + "8783480337825919627485784", + "44430163378583855426718079" + ], + "mAssetSupply": "70291762018191743801736268" + }, + { + "type": "redeemMasset", + "inputQty": "341735025166987978342", + "expectedQtys": [ + "83866908107734204400", + "42689531479688864376", + "215939785284160526319" + ], + "redemptionFee": "102520507550096393", + "reserves": [ + "17255747078648699561887549", + "8783437648294439938621408", + "44429947438798571266191760" + ], + "mAssetSupply": "70291420385687084363854319" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "156136773695384096", + "expectedQty": "155559234894389204", + "swapFee": "93682064217230", + "reserves": [ + "17255746923089464667498345", + "8783437648294439938621408", + "44429947438798571266191760" + ], + "mAssetSupply": "70291420229643992732687453" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "556210618762494912", + "440073367666363840", + "181145711586487136" + ], + "expectedQty": "1187749370753744626", + "swapFee": "713077468933606", + "reserves": [ + "17255746366878845905003433", + "8783437208221072272257568", + "44429947257652859679704624" + ], + "mAssetSupply": "70291419041894621978942827" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "3211436163740938534912", + "expectedQty": "3287137024071703779579", + "reserves": [ + "17255746366878845905003433", + "8786648644384813210792480", + "44429947257652859679704624" + ] + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "464792090100679785316352", + "expectedQty": "469107150249718894610914", + "swapFee": "278875254060407871189", + "reserves": [ + "17255746366878845905003433", + "8786648644384813210792480", + "43960840107403140785093710" + ], + "mAssetSupply": "69830192964072074305277243" + }, + { + "type": "mintMulti", + "inputQtys": [ + "3131625851747899401043968", + "2740192073809197338198016", + "1078703130050887206043648" + ], + "expectedQty": "6998320404093472265237805", + "reserves": [ + "20387372218626745306047401", + "11526840718194010548990496", + "45039543237454027991137358" + ], + "mAssetSupply": "76828513368165546570515048" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "1075423097458323756154880", + "expectedQty": "1076963343253618863758760", + "reserves": [ + "21462795316085069062202281", + "11526840718194010548990496", + "45039543237454027991137358" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "4451921409992343158784", + "18677102657180075556864", + "54862436143748503044096" + ], + "expectedQty": "77883844650642782918522", + "swapFee": "46758361807470151842", + "reserves": [ + "21458343394675076719043497", + "11508163615536830473433632", + "44984680801310279488093262" + ], + "mAssetSupply": "77827592866768522651355286" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "4420758752241043456", + "expectedQty": "4449381229176024347", + "swapFee": "2652455251344626", + "reserves": [ + "21458343394675076719043497", + "11508163615536830473433632", + "44984676351929050312068915" + ], + "mAssetSupply": "77827588448662225661656456" + }, + { + "type": "redeemMasset", + "inputQty": "69082893165395640844288", + "expectedQtys": [ + "19041573206202981951689", + "10212043675682089003893", + "39918226312156352240194" + ], + "redemptionFee": "20724867949618692253", + "reserves": [ + "21439301821468873737091808", + "11497951571861148384429739", + "44944758125616893959828721" + ], + "mAssetSupply": "77758526280364779639504421" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "619110108528244376469504", + "821496828556342500261888", + "969973218531135457329152" + ], + "expectedQty": "2416935810256532598377945", + "swapFee": "1451032105417169860943", + "reserves": [ + "20820191712940629360622304", + "10676454743304805884167851", + "43974784907085758502499569" + ], + "mAssetSupply": "75341590470108247041126476" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "338298119930735104", + "outputIndex": 1, + "expectedQty": "333024039817651760", + "swapFee": "203191082100090", + "reserves": [ + "20820192051238749291357408", + "10676454410280766066516091", + "43974784907085758502499569" + ], + "mAssetSupply": "75341590470311438123226566", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemMasset", + "inputQty": "96126118585956490752819", + "expectedQtys": [ + "26555901306770811022592", + "13617687527948863631108", + "56089302399569529820588" + ], + "redemptionFee": "28837835575786947225", + "reserves": [ + "20793636149931978480334816", + "10662836722752817202884983", + "43918695604686188972678981" + ], + "mAssetSupply": "75245493189561057419420972" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "248476079672952015028224", + "outputIndex": 1, + "expectedQty": "242397019693201745401553", + "swapFee": "147977604716299721112", + "reserves": [ + "20793636149931978480334816", + "10420439703059615457483430", + "44167171684359140987707205" + ], + "mAssetSupply": "75245641167165773719142084", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "33838210693530258505728", + "expectedQty": "33580190986842825034013", + "reserves": [ + "20793636149931978480334816", + "10420439703059615457483430", + "44201009895052671246212933" + ] + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "10890995337501492641792", + "expectedQty": "10807890593569824292756", + "reserves": [ + "20793636149931978480334816", + "10420439703059615457483430", + "44211900890390172738854725" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "482761101899757387776", + "35333374596483371008", + "488444276750757658624" + ], + "expectedQty": "1003916282421572245776", + "swapFee": "602711396290717778", + "reserves": [ + "20793153388830078722947040", + "10420404369685018974112422", + "44211412446113421981196101" + ], + "mAssetSupply": "75289025332463764796223077" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "756808233139085568", + "expectedQty": "743498297366984085", + "swapFee": "454084939883451", + "reserves": [ + "20793153388830078722947040", + "10420403626186721607128337", + "44211412446113421981196101" + ], + "mAssetSupply": "75289024576109616597020960" + }, + { + "type": "mintMulti", + "inputQtys": [ + "3174639131193380962304", + "2059848542938604240896", + "3309134932208561160192" + ], + "expectedQty": "8557232592229214469628", + "reserves": [ + "20796328027961272103909344", + "10422463474729660211369233", + "44214721581045630542356293" + ], + "mAssetSupply": "75297581808701845811490588" + }, + { + "type": "redeemMasset", + "inputQty": "73358580237290460466380", + "expectedQtys": [ + "20254719805284264238609", + "10151026521490865341554", + "43063217491502931083354" + ], + "redemptionFee": "22007574071187138139", + "reserves": [ + "20776073308155987839670735", + "10412312448208169346027679", + "44171658363554127611272939" + ], + "mAssetSupply": "75224245236038626538162347" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "394042510546743093886976", + "expectedQty": "396814747910648338556812", + "swapFee": "236425506328045856332", + "reserves": [ + "20776073308155987839670735", + "10412312448208169346027679", + "43774843615643479272716127" + ], + "mAssetSupply": "74830439150998211490131703" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "134372578301454405599232", + "44807066199667133906944", + "48929424133334589505536" + ], + "expectedQty": "228634970671571274674017", + "swapFee": "137263340407187077050", + "reserves": [ + "20641700729854533434071503", + "10367505382008502212120735", + "43725914191510144683210591" + ], + "mAssetSupply": "74601804180326640215457686" + }, + { + "type": "redeemMasset", + "inputQty": "48131298760631641702", + "expectedQtys": [ + "13313536074757182496", + "6686859707687572548", + "28202450157047203069" + ], + "redemptionFee": "14439389628189492", + "reserves": [ + "20641687416318458676889007", + "10367498695148794524548187", + "43725885989059987636007522" + ], + "mAssetSupply": "74601756063467269212005476" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "123127179979979193581568", + "expectedQty": "125206844069340628170474", + "reserves": [ + "20641687416318458676889007", + "10490625875128773718129755", + "43725885989059987636007522" + ] + }, + { + "type": "redeemMasset", + "inputQty": "19209769023764104531148", + "expectedQtys": [ + "5304686226903754226725", + "2695975259629287309442", + "11237070908357941711349" + ], + "redemptionFee": "5762930707129231359", + "reserves": [ + "20636382730091554922662282", + "10487929899869144430820313", + "43714648918151629694296173" + ], + "mAssetSupply": "74707758901443552864876161" + }, + { + "type": "redeemMasset", + "inputQty": "20760550243714088960", + "expectedQtys": [ + "5732927074996874117", + "2913618053611390688", + "12144225935072218266" + ], + "redemptionFee": "6228165073114226", + "reserves": [ + "20636376997164479925788165", + "10487926986251090819429625", + "43714636773925694622077907" + ], + "mAssetSupply": "74707738147121474223901427" + }, + { + "type": "redeemMasset", + "inputQty": "19781909966006250582835", + "expectedQtys": [ + "5462680223208710453342", + "2776271791222022214600", + "11571754179645393036412" + ], + "redemptionFee": "5934572989801875174", + "reserves": [ + "20630914316941271215334823", + "10485150714459868797215025", + "43703065019746049229041495" + ], + "mAssetSupply": "74687962171728457775193766" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "315283566117859115401216", + "expectedQty": "314739436976728131745354", + "swapFee": "189170139670715469240", + "reserves": [ + "20316174879964543083589469", + "10485150714459868797215025", + "43703065019746049229041495" + ], + "mAssetSupply": "74372867775750269375261790" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "3496537255112219518042112", + "expectedQty": "3539104702221103096443706", + "reserves": [ + "20316174879964543083589469", + "13981687969572088315257137", + "43703065019746049229041495" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "3961933267467400192", + "2134201757347685888", + "455172995229570304" + ], + "expectedQty": "6575824880969262161", + "reserves": [ + "20316178841897810550989661", + "13981690103773845662943025", + "43703065474919044458611799" + ], + "mAssetSupply": "77911979053796253440967657" + }, + { + "type": "redeemMasset", + "inputQty": "92544224737714962432", + "expectedQtys": [ + "24124415781458081434", + "16602536727788992688", + "51895138876555866972" + ], + "redemptionFee": "27763267421314488", + "reserves": [ + "20316154717482029092908227", + "13981673501237117873950337", + "43703013579780167902744827" + ], + "mAssetSupply": "77911886537334783147319713" + }, + { + "type": "mintMulti", + "inputQtys": [ + "40520275295288055300096", + "56555923462345453469696", + "31067126875663405940736" + ], + "expectedQty": "128544944732314941507619", + "reserves": [ + "20356674992777317148208323", + "14038229424699463327420033", + "43734080706655831308685563" + ], + "mAssetSupply": "78040431482067098088827332" + }, + { + "type": "mintMulti", + "inputQtys": [ + "8223485724660119552", + "10068700202320967680", + "12935137760255918080" + ], + "expectedQty": "31257617422121285731", + "reserves": [ + "20356683216263041808327875", + "14038239493399665648387713", + "43734093641793591564603643" + ], + "mAssetSupply": "78040462739684520210113063" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "174908651328645562368", + "expectedQty": "175826265926736759906", + "swapFee": "104945190797187337", + "reserves": [ + "20356683216263041808327875", + "14038239493399665648387713", + "43733917815527664827843737" + ], + "mAssetSupply": "78040287935978382361738032" + }, + { + "type": "mintMulti", + "inputQtys": [ + "25176044697693722771456", + "10691574149219543416832", + "36565291848179858276352" + ], + "expectedQty": "72366815241898741577266", + "reserves": [ + "20381859260960735531099331", + "14048931067548885191804545", + "43770483107375844686120089" + ], + "mAssetSupply": "78112654751220281103315298" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "42888337562193763500032", + "expectedQty": "43113106692775747151797", + "swapFee": "25733002537316258100", + "reserves": [ + "20381859260960735531099331", + "14048931067548885191804545", + "43727370000683068938968292" + ], + "mAssetSupply": "78069792146660624656073366" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "1284540070056131297280", + "733304479433586507776", + "1517456578713654132736" + ], + "expectedQty": "3535590806804684728475", + "swapFee": "2122628060919362454", + "reserves": [ + "20380574720890679399802051", + "14048197763069451605296769", + "43725852544104355284835556" + ], + "mAssetSupply": "78066256555853819971344891" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "31198018044923895808", + "72558582527632072704", + "40909885494420881408" + ], + "expectedQty": "145129185768285433291", + "swapFee": "87129789334572003", + "reserves": [ + "20380543522872634475906243", + "14048125204486923973224065", + "43725811634218860863954148" + ], + "mAssetSupply": "78066111426668051685911600" + }, + { + "type": "mintMulti", + "inputQtys": [ + "6622800810157440761856", + "16800560667998229102592", + "77308313192025418629120" + ], + "expectedQty": "100443459079317129429845", + "reserves": [ + "20387166323682791916668099", + "14064925765154922202326657", + "43803119947410886282583268" + ], + "mAssetSupply": "78166554885747368815341445" + }, + { + "type": "redeemMasset", + "inputQty": "42039159460281294048460", + "expectedQtys": [ + "10961238082913089506287", + "7562061224333611069811", + "23550915261834048393257" + ], + "redemptionFee": "12611747838084388214", + "reserves": [ + "20376205085599878827161812", + "14057363703930588591256846", + "43779569032149052234190011" + ], + "mAssetSupply": "78124528338034925605681199" + }, + { + "type": "mintMulti", + "inputQtys": [ + "990353189674658562048", + "391403278410234527744", + "818349516459699601408" + ], + "expectedQty": "2200857133073342262974", + "reserves": [ + "20377195438789553485723860", + "14057755107208998825784590", + "43780387381665511933791419" + ], + "mAssetSupply": "78126729195167998947944173" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "351816330454938236747776", + "expectedQty": "352523325932469409092674", + "reserves": [ + "20729011769244491722471636", + "14057755107208998825784590", + "43780387381665511933791419" + ] + }, + { + "type": "redeemMasset", + "inputQty": "234716865312879216374579", + "expectedQtys": [ + "61978024416122323246277", + "42031520796527714980324", + "130899723937348827770305" + ], + "redemptionFee": "70415059593863764912", + "reserves": [ + "20667033744828369399225359", + "14015723586412471110804266", + "43649487657728163106021114" + ], + "mAssetSupply": "78244606070847183004427180" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "8832921171978433536", + "9278882240048013312", + "86543787432048050176" + ], + "expectedQty": "104256641699477459745", + "swapFee": "62591539943652667", + "reserves": [ + "20667024911907197420791823", + "14015714307530231062790954", + "43649401113940731057970938" + ], + "mAssetSupply": "78244501814205483526967435" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "170885342526777720832", + "548633800014296252416", + "698890616172358008832" + ], + "expectedQty": "1419563548045925961477", + "swapFee": "852249478514664375", + "reserves": [ + "20666854026564670643070991", + "14015165673730216766538538", + "43648702223324558699962106" + ], + "mAssetSupply": "78243082250657437601005958" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "659127334083885793280", + "1728658259696697475072", + "861874487978250469376" + ], + "expectedQty": "3261238863554830798617", + "swapFee": "1957918068974283048", + "reserves": [ + "20666194899230586757277711", + "14013437015470520069063466", + "43647840348836580449492730" + ], + "mAssetSupply": "78239821011793882770207341" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "959644558848592497868800", + "expectedQty": "956990234608166718891698", + "swapFee": "575786735309155498721", + "reserves": [ + "19709204664622420038386013", + "14013437015470520069063466", + "43647840348836580449492730" + ], + "mAssetSupply": "77280752239680599427837262" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "350354897745377102921728", + "expectedQty": "349258787668683539108476", + "swapFee": "210212938647226261753", + "reserves": [ + "19359945876953736499277537", + "14013437015470520069063466", + "43647840348836580449492730" + ], + "mAssetSupply": "76930607554873869551177287" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "56322432005627141160960", + "227251179900431543304192", + "269119199137677862502400" + ], + "expectedQty": "553190732180907969946118", + "swapFee": "332113707533064620740", + "reserves": [ + "19303623444948109358116577", + "13786185835570088525759274", + "43378721149698902586990330" + ], + "mAssetSupply": "76377416822692961581231169" + }, + { + "type": "redeemMasset", + "inputQty": "86756780339558204047360", + "expectedQtys": [ + "21920325045711425222980", + "15654971488545395743207", + "49258921278716066562641" + ], + "redemptionFee": "26027034101867461214", + "reserves": [ + "19281703119902397932893597", + "13770530864081543130016067", + "43329462228420186520427689" + ], + "mAssetSupply": "76290686069387505244645023" + }, + { + "type": "redeemMasset", + "inputQty": "535012762639847962076774", + "expectedQtys": [ + "135178525698723993214521", + "96541267579932608222379", + "303770511709135650046490" + ], + "redemptionFee": "160503828791954388623", + "reserves": [ + "19146524594203673939679076", + "13673989596501610521793688", + "43025691716711050870381199" + ], + "mAssetSupply": "75755833810576449236956872" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "363780468733399749623808", + "expectedQty": "360299934222800437967050", + "swapFee": "218268281240039849774", + "reserves": [ + "19146524594203673939679076", + "13313689662278810083826638", + "43025691716711050870381199" + ], + "mAssetSupply": "75392271610124289527182838" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "469895103606868718649344", + "569109366073484961120256", + "183765258188941546225664" + ], + "expectedQty": "1228343477892398577212563", + "swapFee": "737448555868960522641", + "reserves": [ + "18676629490596805221029732", + "12744580296205325122706382", + "42841926458522109324155535" + ], + "mAssetSupply": "74163928132231890949970275" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "1269232096180141031424", + "expectedQty": "1261018434416606258574", + "reserves": [ + "18676629490596805221029732", + "12744580296205325122706382", + "42843195690618289465186959" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "234025052825562", + "419387027253753", + "275209586449418" + ], + "expectedQty": "931701463720035", + "swapFee": "559356492127", + "reserves": [ + "18676629490362780168204170", + "12744580295785938095452629", + "42843195690343079878737541" + ], + "mAssetSupply": "74165189149734606092508814" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "67919017546241598816256", + "146859955725163850366976", + "23235151548887425089536" + ], + "expectedQty": "239546211681402361814154", + "swapFee": "143814015418092272451", + "reserves": [ + "18608710472816538569387914", + "12597720340060774245085653", + "42819960538794192453648005" + ], + "mAssetSupply": "73925642938053203730694660" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "4869365039345229103104", + "outputIndex": 2, + "expectedQty": "4911367692339652265894", + "swapFee": "2929293137720521403", + "reserves": [ + "18613579837855883798491018", + "12597720340060774245085653", + "42815049171101852801382111" + ], + "mAssetSupply": "73925645867346341451216063", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemBassets", + "inputQtys": [ + "261362606699425787019264", + "114917956709524541800448", + "127993458350044341075968" + ], + "expectedQty": "505329764048689712794168", + "swapFee": "303379886361030445944", + "reserves": [ + "18352217231156458011471754", + "12482802383351249703285205", + "42687055712751808460306143" + ], + "mAssetSupply": "73420316103297651738421895" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "103794573410533949440", + "66456919487317164032", + "185908775609000001536" + ], + "expectedQty": "355909121979738215503", + "swapFee": "213673677394279497", + "reserves": [ + "18352113436583047477522314", + "12482735926431762386121173", + "42686869803976199460304607" + ], + "mAssetSupply": "73419960194175672000206392" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "93458504243494448", + "101883927800577168", + "112876329346100576" + ], + "expectedQty": "308793858300120258", + "swapFee": "185387547508577", + "reserves": [ + "18352113343124543234027866", + "12482735824547834585544005", + "42686869691099870114204031" + ], + "mAssetSupply": "73419959885381813700086134" + }, + { + "type": "mintMulti", + "inputQtys": [ + "627333173025015615979520", + "806719982831631580790784", + "271290909913675749916672" + ], + "expectedQty": "1713237111256638715924382", + "reserves": [ + "18979446516149558850007386", + "13289455807379466166334789", + "42958160601013545864120703" + ], + "mAssetSupply": "75133196996638452416010516" + }, + { + "type": "mintMulti", + "inputQtys": [ + "57395793933637272", + "22573223277732020", + "52994414368418192" + ], + "expectedQty": "132992750025245890", + "reserves": [ + "18979446573545352783644658", + "13289455829952689444066809", + "42958160654007960232538895" + ], + "mAssetSupply": "75133197129631202441256406" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "8851485271962185728", + "outputIndex": 1, + "expectedQty": "8710171110753827842", + "swapFee": "5277939295396150", + "reserves": [ + "18979446573545352783644658", + "13289447119781578690238967", + "42958169505493232194724623" + ], + "mAssetSupply": "75133197134909141736652556", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "193482749110188832", + "expectedQty": "192869644158786576", + "swapFee": "116089649466113", + "reserves": [ + "18979446380675708624858082", + "13289447119781578690238967", + "42958169505493232194724623" + ], + "mAssetSupply": "75133196941542482275929837" + }, + { + "type": "redeemMasset", + "inputQty": "103728485593836277674803", + "expectedQtys": [ + "26195060210722344838345", + "18341834660906234689391", + "59290024280399952020155" + ], + "redemptionFee": "31118545678150883302", + "reserves": [ + "18953251320464986280019737", + "13271105285120672455549576", + "42898879481212832242704468" + ], + "mAssetSupply": "75029499574494324149138336" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "124333157848201224519680", + "expectedQty": "125032651746598853166706", + "swapFee": "74599894708920734711", + "reserves": [ + "18953251320464986280019737", + "13271105285120672455549576", + "42773846829466233389537762" + ], + "mAssetSupply": "74905241016540831845353367" + }, + { + "type": "redeemMasset", + "inputQty": "2038362848511389597696", + "expectedQtys": [ + "515611628038171319269", + "361032315048686571471", + "1163636382396441634901" + ], + "redemptionFee": "611508854553416879", + "reserves": [ + "18952735708836948108700468", + "13270744252805623768978105", + "42772683193083836947902861" + ], + "mAssetSupply": "74903203265201175009172550" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "3046825043293901946880", + "2881709540938072195072", + "2485237908834309636096" + ], + "expectedQty": "8432888836317671245114", + "swapFee": "5062770964369224281", + "reserves": [ + "18949688883793654206753588", + "13267862543264685696783033", + "42770197955175002638266765" + ], + "mAssetSupply": "74894770376364857337927436" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "131141501802682840514560", + "outputIndex": 1, + "expectedQty": "130168448713641060097244", + "swapFee": "78882560144762778879", + "reserves": [ + "19080830385596337047268148", + "13137694094551044636685789", + "42770197955175002638266765" + ], + "mAssetSupply": "74894849258925002100706315", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "3876632938513461936128", + "expectedQty": "3852576337038655314274", + "reserves": [ + "19080830385596337047268148", + "13137694094551044636685789", + "42774074588113516100202893" + ] + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "1378455699379900494381056", + "expectedQty": "1386023578378792708251569", + "swapFee": "827073419627940296628", + "reserves": [ + "19080830385596337047268148", + "13137694094551044636685789", + "41388051009734723391951324" + ], + "mAssetSupply": "73521073209301768201936161" + }, + { + "type": "redeemMasset", + "inputQty": "95670377581172267417", + "expectedQtys": [ + "24821762344012606481", + "17090488934352121160", + "53840652911049872857" + ], + "redemptionFee": "28701113274351680", + "reserves": [ + "19080805563833993034661667", + "13137677004062110284564629", + "41387997169081812342078467" + ], + "mAssetSupply": "73520977567625300304020424" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "1644957955701673155362816", + "expectedQty": "1653448434852337956403190", + "swapFee": "986974773421003893217", + "reserves": [ + "19080805563833993034661667", + "13137677004062110284564629", + "39734548734229474385675277" + ], + "mAssetSupply": "71877006586697048152550825" + }, + { + "type": "mintMulti", + "inputQtys": [ + "294076829797527", + "1290227922368176", + "254510556858136" + ], + "expectedQty": "1848677285837764", + "reserves": [ + "19080805564128069864459194", + "13137677005352338206932805", + "39734548734483984942533413" + ], + "mAssetSupply": "71877006588545725438388589" + }, + { + "type": "redeemMasset", + "inputQty": "827677253573752934", + "expectedQtys": [ + "219653150151980370", + "151237437549809519", + "457413538965309667" + ], + "redemptionFee": "248303176072125", + "reserves": [ + "19080805344474919712478824", + "13137676854114900657123286", + "39734548277070445977223746" + ], + "mAssetSupply": "71877005761116775040707780" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "2083863314686940735864832", + "expectedQty": "2093783784532765936306174", + "swapFee": "1250317988812164441518", + "reserves": [ + "19080805344474919712478824", + "13137676854114900657123286", + "37640764492537680040917572" + ], + "mAssetSupply": "69794392764418646469284466" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "2296041863693521469308928", + "expectedQty": "2289807136260977405537730", + "swapFee": "1377625118216112881585", + "reserves": [ + "16790998208213942306941094", + "13137676854114900657123286", + "37640764492537680040917572" + ], + "mAssetSupply": "67499728525843341112857123" + }, + { + "type": "mintMulti", + "inputQtys": [ + "24052604522130644", + "29865044898834504", + "35648485297197264" + ], + "expectedQty": "89645501923252433", + "reserves": [ + "16790998232266546829071738", + "13137676883979945555957790", + "37640764528186165338114836" + ], + "mAssetSupply": "67499728615488843036109556" + }, + { + "type": "redeemMasset", + "inputQty": "234983484687928524", + "expectedQtys": [ + "58436140036849432", + "45721827584726100", + "130997630792213434" + ], + "redemptionFee": "70495045406378", + "reserves": [ + "16790998173830406792222306", + "13137676838258117971231690", + "37640764397188534545901402" + ], + "mAssetSupply": "67499728380575853393587410" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "62619484189371746222080", + "expectedQty": "62142741489665386279769", + "swapFee": "37571690513623047733", + "reserves": [ + "16790998173830406792222306", + "13075534096768452584951921", + "37640764397188534545901402" + ], + "mAssetSupply": "67437146468076995270413063" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "690487473420152940265472", + "outputIndex": 2, + "expectedQty": "695580767263016404881221", + "swapFee": "415360846383425516580", + "reserves": [ + "17481485647250559732487778", + "13075534096768452584951921", + "36945183629925518141020181" + ], + "mAssetSupply": "67437561828923378695929643", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "43510206719136980992", + "expectedQty": "43387825166336287428", + "swapFee": "26106124031482188", + "reserves": [ + "17481442259425393396200350", + "13075534096768452584951921", + "36945183629925518141020181" + ], + "mAssetSupply": "67437518344822783590430839" + }, + { + "type": "redeemMasset", + "inputQty": "52152469487283576242176", + "expectedQtys": [ + "13515130691091848690436", + "10108865707483214781812", + "28562802642648942286276" + ], + "redemptionFee": "15645740846185072872", + "reserves": [ + "17467927128734301547509914", + "13065425231060969370170109", + "36916620827282869198733905" + ], + "mAssetSupply": "67385381521076346199261535" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "50187351174765692846080", + "outputIndex": 1, + "expectedQty": "49915305538954639312431", + "swapFee": "30178779436289430688", + "reserves": [ + "17518114479909067240355994", + "13015509925522014730857678", + "36916620827282869198733905" + ], + "mAssetSupply": "67385411699855782488692223", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemMasset", + "inputQty": "148761274619472883639910", + "expectedQtys": [ + "38661709829028239061168", + "28724659186037074760937", + "81473361983651068355180" + ], + "redemptionFee": "44628382385841865091", + "reserves": [ + "17479452770080039001294826", + "12986785266335977656096741", + "36835147465299218130378725" + ], + "mAssetSupply": "67236695053618695446917404" + }, + { + "type": "mintMulti", + "inputQtys": [ + "169373167471295153045504", + "67916137219321524912128", + "7139667372949485125632" + ], + "expectedQty": "245233434691639473460809", + "reserves": [ + "17648825937551334154340330", + "13054701403555299181008869", + "36842287132672167615504357" + ], + "mAssetSupply": "67481928488310334920378213" + }, + { + "type": "mintMulti", + "inputQtys": [ + "24693407924326387154944", + "110405215447515414921216", + "70837645574953685221376" + ], + "expectedQty": "206390282415694166035821", + "reserves": [ + "17673519345475660541495274", + "13165106619002814595930085", + "36913124778247121300725733" + ], + "mAssetSupply": "67688318770726029086414034" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "8587504247349661696", + "562123670610325056", + "5197466414813556736" + ], + "expectedQty": "14342138753050182059", + "swapFee": "8610449521543035", + "reserves": [ + "17673510757971413191833578", + "13165106056879143985605029", + "36913119580780706487168997" + ], + "mAssetSupply": "67688304428587276036231975" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "7659551092318258855936", + "expectedQty": "7675775159831259411083", + "reserves": [ + "17681170309063731450689514", + "13165106056879143985605029", + "36913119580780706487168997" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "540402476215619158016", + "505277854546956517376", + "3272113815624328151040" + ], + "expectedQty": "4305410363365420376283", + "swapFee": "2584797096277018436", + "reserves": [ + "17680629906587515831531498", + "13164600779024597029087653", + "36909847466965082159017957" + ], + "mAssetSupply": "67691674793383741875266775" + }, + { + "type": "redeemMasset", + "inputQty": "667614185928111", + "expectedQtys": [ + "174324216766659", + "129797904937434", + "363916912725958" + ], + "redemptionFee": "200284255778", + "reserves": [ + "17680629906413191614764839", + "13164600778894799124150219", + "36909847466601165246291999" + ], + "mAssetSupply": "67691674792716327973594442" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "228506546153001406431232", + "outputIndex": 0, + "expectedQty": "229407828526583827017261", + "swapFee": "138035087949311045957", + "reserves": [ + "17451222077886607787747578", + "13393107325047800530581451", + "36909847466601165246291999" + ], + "mAssetSupply": "67691812827804277284640399", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "187620367493491490816", + "outputIndex": 0, + "expectedQty": "186109458870583631464", + "swapFee": "111989957280450200", + "reserves": [ + "17451035968427737204116114", + "13393107325047800530581451", + "36910035086968658737782815" + ], + "mAssetSupply": "67691812939794234565090599", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemMasset", + "inputQty": "22487207224840545894", + "expectedQtys": [ + "5795491619355348030", + "4447852918294938608", + "12257828097062322037" + ], + "redemptionFee": "6746162167452163", + "reserves": [ + "17451030172936117848768084", + "13393102877194882235642843", + "36910022829140561675460778" + ], + "mAssetSupply": "67691790459333171891996868" + }, + { + "type": "mintMulti", + "inputQtys": [ + "2444823531371301370331136", + "2404681684221042607783936", + "2026954761907255822516224" + ], + "expectedQty": "6885940232967742367777053", + "reserves": [ + "19895853704307419219099220", + "15797784561415924843426779", + "38936977591047817497977002" + ], + "mAssetSupply": "74577730692300914259773921" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "68255521921426989776896", + "expectedQty": "68610665346112920062083", + "reserves": [ + "19895853704307419219099220", + "15866040083337351833203675", + "38936977591047817497977002" + ] + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "225243213074027675648", + "expectedQty": "224246623735089365806", + "reserves": [ + "19895853704307419219099220", + "15866040083337351833203675", + "38937202834260891525652650" + ] + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "359023671779019479580672", + "expectedQty": "359673544448494183642673", + "reserves": [ + "20254877376086438698679892", + "15866040083337351833203675", + "38937202834260891525652650" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "3787167902663266724216832", + "1626874688196924432973824", + "2678961918608898118385664" + ], + "expectedQty": "8095389219633838362492533", + "reserves": [ + "24042045278749705422896724", + "17492914771534276266177499", + "41616164752869789644038314" + ], + "mAssetSupply": "83101628368353094815337016" + }, + { + "type": "mintMulti", + "inputQtys": [ + "385357333761606811648", + "693655005743454617600", + "2709054122584914788352" + ], + "expectedQty": "3781403790448780619875", + "reserves": [ + "24042430636083467029708372", + "17493608426540019720795099", + "41618873806992374558826666" + ], + "mAssetSupply": "83105409772143543595956891" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "1942685405061635328", + "outputIndex": 0, + "expectedQty": "1949897305639553261", + "swapFee": "1171734943686221", + "reserves": [ + "24042428686186161390155111", + "17493610369225424782430427", + "41618873806992374558826666" + ], + "mAssetSupply": "83105409773315278539643112", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemBassets", + "inputQtys": [ + "6142566754444399616", + "613386483803705180160", + "522485140764099739648" + ], + "expectedQty": "1143185178572488007785", + "swapFee": "686322900884023218", + "reserves": [ + "24042422543619406945755495", + "17492996982741621077250267", + "41618351321851610459087018" + ], + "mAssetSupply": "83104266588136706051635327" + }, + { + "type": "mintMulti", + "inputQtys": [ + "534413829888328400896", + "810165482055260438528", + "677140746828524814336" + ], + "expectedQty": "2023809610429966553080", + "reserves": [ + "24042956957449295274156391", + "17493807148223676337688795", + "41619028462598438983901354" + ], + "mAssetSupply": "83106290397747136018188407" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "329322489090726756352", + "outputIndex": 1, + "expectedQty": "327710738171997949291", + "swapFee": "197778145587003591", + "reserves": [ + "24043286279938386000912743", + "17493479437485504339739504", + "41619028462598438983901354" + ], + "mAssetSupply": "83106290595525281605191998", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "8245492667886171534131200", + "expectedQty": "8243990149932195238998109", + "reserves": [ + "32288778947824557535043943", + "17493479437485504339739504", + "41619028462598438983901354" + ] + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "27897664165017492", + "expectedQty": "27808104205997560", + "reserves": [ + "32288778947824557535043943", + "17493479437485504339739504", + "41619028490496103148918846" + ] + }, + { + "type": "redeemMasset", + "inputQty": "2680585362209537995571", + "expectedQtys": [ + "947198647122466806413", + "513175183348559064612", + "1220903631705940257388" + ], + "redemptionFee": "804175608662861398", + "reserves": [ + "32287831749177435068237530", + "17492966262302155780674892", + "41617807586864397208661458" + ], + "mAssetSupply": "91347600992078980175053494" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "1147866537773115931361280", + "outputIndex": 1, + "expectedQty": "1134779001527805730416344", + "swapFee": "686451164683079092907", + "reserves": [ + "32287831749177435068237530", + "16358187260774350050258548", + "42765674124637513140022738" + ], + "mAssetSupply": "91348287443243663254146401", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemBassets", + "inputQtys": [ + "72820533632951107190784", + "1061791181614028867764224", + "136170869234963295764480" + ], + "expectedQty": "1279495526934180943444037", + "swapFee": "768158211087160862583", + "reserves": [ + "32215011215544483961046746", + "15296396079160321182494324", + "42629503255402549844258258" + ], + "mAssetSupply": "90068791916309482310702364" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "1831139752290725", + "3653323179456695", + "6759983038480538" + ], + "expectedQty": "12249543133517330", + "swapFee": "7354138363128", + "reserves": [ + "32215011213713344208756021", + "15296396075506998003037629", + "42629503248642566805777720" + ], + "mAssetSupply": "90068791904059939177185034" + }, + { + "type": "redeemMasset", + "inputQty": "14684455500320630584115", + "expectedQtys": [ + "5250630886048372072146", + "2493115061996228801597", + "6948058621781294205737" + ], + "redemptionFee": "4405336650096189175", + "reserves": [ + "32209760582827295836683875", + "15293902960445001774236032", + "42622555190020785511571983" + ], + "mAssetSupply": "90054111853896268642790094" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "162390593452083402244096", + "expectedQty": "162931410728036637156788", + "swapFee": "97434356071250041346", + "reserves": [ + "32209760582827295836683875", + "15293902960445001774236032", + "42459623779292748874415195" + ], + "mAssetSupply": "89891818694800256490587344" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "13066496108277120286851072", + "expectedQty": "13002190803957563314717922", + "reserves": [ + "32209760582827295836683875", + "15293902960445001774236032", + "55526119887569869161266267" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "65896775731605516845056", + "38986982740265088843776", + "112647090453255003570176" + ], + "expectedQty": "217364759741317844851225", + "swapFee": "130497154137273070753", + "reserves": [ + "32143863807095690319838819", + "15254915977704736685392256", + "55413472797116614157696091" + ], + "mAssetSupply": "102676644739016501960454041" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "610567162588657793105920", + "outputIndex": 1, + "expectedQty": "601100037659996258996031", + "swapFee": "366120923331543582516", + "reserves": [ + "32754430969684348112944739", + "14653815940044740426396225", + "55413472797116614157696091" + ], + "mAssetSupply": "102677010859939833504036557", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "20502365410945514078208", + "expectedQty": "20812648548394059635850", + "reserves": [ + "32754430969684348112944739", + "14674318305455685940474433", + "55413472797116614157696091" + ] + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "6689913226470471162134528", + "expectedQty": "6723432526584847780617103", + "swapFee": "4013947935882282697280", + "reserves": [ + "32754430969684348112944739", + "14674318305455685940474433", + "48690040270531766377078988" + ], + "mAssetSupply": "96011924229953638684235159" + }, + { + "type": "mintMulti", + "inputQtys": [ + "41653147464504492032", + "47657390503564025856", + "34929053383516336128" + ], + "expectedQty": "124602740790335033911", + "reserves": [ + "32754472622831812617436771", + "14674365962846189504500289", + "48690075199585149893415116" + ], + "mAssetSupply": "96012048832694429019269070" + }, + { + "type": "redeemMasset", + "inputQty": "243821955409197216353484", + "expectedQtys": [ + "83154810073255945483507", + "37254274511974400882096", + "123611025654303740412810" + ], + "redemptionFee": "73146586622759164906", + "reserves": [ + "32671317812758556671953264", + "14637111688334215103618193", + "48566464173930846153002306" + ], + "mAssetSupply": "95768300023871854562080492" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "1450080573302555648", + "976808736013234816", + "52040466520882608" + ], + "expectedQty": "2488911898365734346", + "swapFee": "1494243685230578", + "reserves": [ + "32671316362677983369397616", + "14637110711525479090383377", + "48566464121890379632119698" + ], + "mAssetSupply": "95768297534959956196346146" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "1382153816182277", + "expectedQty": "1383209899373269", + "swapFee": "829292289709", + "reserves": [ + "32671316361294773470024347", + "14637110711525479090383377", + "48566464121890379632119698" + ], + "mAssetSupply": "95768297533578631672453578" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "168844378981625482969088", + "expectedQty": "168970093517510356940540", + "swapFee": "101306627388975289781", + "reserves": [ + "32502346267777263113083807", + "14637110711525479090383377", + "48566464121890379632119698" + ], + "mAssetSupply": "95599554461224395164774271" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "301195232347715566305280", + "outputIndex": 0, + "expectedQty": "299863544176394395708757", + "swapFee": "179798169707145910885", + "reserves": [ + "32202482723600868717375050", + "14637110711525479090383377", + "48867659354238095198424978" + ], + "mAssetSupply": "95599734259394102310685156", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "395980417697695240552448", + "expectedQty": "396211848966919870539972", + "swapFee": "237588250618617144331", + "reserves": [ + "31806270874633948846835078", + "14637110711525479090383377", + "48867659354238095198424978" + ], + "mAssetSupply": "95203991429947025687277039" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "199250545019515045937152", + "97150698458454264119296", + "104988228068928173113344" + ], + "expectedQty": "401828571507792920817757", + "swapFee": "241241888037498251441", + "reserves": [ + "31607020329614433800897926", + "14539960013067024826264081", + "48762671126169167025311634" + ], + "mAssetSupply": "94802162858439232766459282" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "2645881245223591497170944", + "expectedQty": "2642094691627686966651809", + "reserves": [ + "34252901574838025298068870", + "14539960013067024826264081", + "48762671126169167025311634" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "756286301697661340745728", + "291000325167023797567488", + "2163190334886364865101824" + ], + "expectedQty": "3202083495601880492335535", + "reserves": [ + "35009187876535686638814598", + "14830960338234048623831569", + "50925861461055531890413458" + ], + "mAssetSupply": "100646341045668800225446626" + }, + { + "type": "redeemMasset", + "inputQty": "909457992160328192", + "expectedQtys": [ + "316254257898962162", + "133974954581588001", + "460036964611393505" + ], + "redemptionFee": "272837397648098", + "reserves": [ + "35009187560281428739852436", + "14830960204259094042243568", + "50925861001018567279019953" + ], + "mAssetSupply": "100646340136483645462766532" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "2638940738507849882140672", + "outputIndex": 2, + "expectedQty": "2644986350500408612344639", + "swapFee": "1580296543045166958275", + "reserves": [ + "37648128298789278621993108", + "14830960204259094042243568", + "48280874650518158666675314" + ], + "mAssetSupply": "100647920433026690629724807", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemBassets", + "inputQtys": [ + "169964215630597849088", + "6061674541801909248", + "386445339486155505664" + ], + "expectedQty": "560368876434232004835", + "swapFee": "336423179768400243", + "reserves": [ + "37647958334573648024144020", + "14830954142584552240334320", + "48280488205178672511169650" + ], + "mAssetSupply": "100647360064150256397719972" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "391982089156085806006272", + "expectedQty": "386406334120125413558213", + "swapFee": "235189253493651483603", + "reserves": [ + "37647958334573648024144020", + "14444547808464426826776107", + "48280488205178672511169650" + ], + "mAssetSupply": "100255613164247664243197303" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "688479934301399296", + "203480451253638048", + "104006835798565632" + ], + "expectedQty": "996662828785277237", + "swapFee": "598356711297945", + "reserves": [ + "37647957646093713722744724", + "14444547604983975573138059", + "48280488101171836712604018" + ], + "mAssetSupply": "100255612167584835457920066" + }, + { + "type": "redeemMasset", + "inputQty": "1565502525299529", + "expectedQtys": [ + "587700679309697", + "225485550094671", + "753679015504484" + ], + "redemptionFee": "469650757589", + "reserves": [ + "37647957645506013043435027", + "14444547604758490023043388", + "48280488100418157697099534" + ], + "mAssetSupply": "100255612166019802583378126" + }, + { + "type": "redeemMasset", + "inputQty": "29654231829157846292889", + "expectedQtys": [ + "11132407587186007564144", + "4271216857573087489830", + "14276420439670168930115" + ], + "redemptionFee": "8896269548747353887", + "reserves": [ + "37636825237918827035870883", + "14440276387900916935553558", + "48266211679978487528169419" + ], + "mAssetSupply": "100225966830460193484439124" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "11555317402880943587328", + "outputIndex": 0, + "expectedQty": "11741228507677717930439", + "swapFee": "7031592202290151591", + "reserves": [ + "37625084009411149317940444", + "14451831705303797879140886", + "48266211679978487528169419" + ], + "mAssetSupply": "100225973862052395774590715", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "6621810782697806408712192", + "expectedQty": "6451325548280406672911231", + "swapFee": "3973086469618683845227", + "reserves": [ + "37625084009411149317940444", + "8000506157023391206229655", + "48266211679978487528169419" + ], + "mAssetSupply": "93608136165824208049723750" + }, + { + "type": "mintMulti", + "inputQtys": [ + "346492400026072085692416", + "293052231202341470076928", + "144532295532768974077952" + ], + "expectedQty": "794025855582014646450801", + "reserves": [ + "37971576409437221403632860", + "8293558388225732676306583", + "48410743975511256502247371" + ], + "mAssetSupply": "94402162021406222696174551" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "17355495184280976", + "outputIndex": 0, + "expectedQty": "18208945105594510", + "swapFee": "10869579357506", + "reserves": [ + "37971576391228276298038350", + "8293558405581227860587559", + "48410743975511256502247371" + ], + "mAssetSupply": "94402162021417092275532057", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mintMulti", + "inputQtys": [ + "125405465317395873792", + "575785089547629953024", + "1059968764697210126336" + ], + "expectedQty": "1776464050020794205805", + "reserves": [ + "37971701796693593693912142", + "8294134190670775490540583", + "48411803944275953712373707" + ], + "mAssetSupply": "94403938485467113069737862" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "6213081079223307", + "expectedQty": "6177649994161789", + "reserves": [ + "37971701802906674773135449", + "8294134190670775490540583", + "48411803944275953712373707" + ] + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "977884790923604787200", + "expectedQty": "982903094867118539323", + "swapFee": "586730874554162872", + "reserves": [ + "37970718899811807654596126", + "8294134190670775490540583", + "48411803944275953712373707" + ], + "mAssetSupply": "94402961193584714013275323" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "146034692454160745365504", + "expectedQty": "146781247782988165314009", + "swapFee": "87620815472496447219", + "reserves": [ + "37823937652028819489282117", + "8294134190670775490540583", + "48411803944275953712373707" + ], + "mAssetSupply": "94257014121946025764357038" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "87314801727915147264", + "26833217800650792960", + "258310106541383974912" + ], + "expectedQty": "370889711801094513733", + "swapFee": "222667427537179015", + "reserves": [ + "37823850337227091574134853", + "8294107357452974839747623", + "48411545634169412328398795" + ], + "mAssetSupply": "94256643232234224669843305" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "27422622055278678376448", + "expectedQty": "27562176243803220330472", + "swapFee": "16453573233167207025", + "reserves": [ + "37796288160983288353804381", + "8294107357452974839747623", + "48411545634169412328398795" + ], + "mAssetSupply": "94229237063752179158673882" + }, + { + "type": "redeemMasset", + "inputQty": "801152725182411230412", + "expectedQtys": [ + "321253954987370240920", + "70496731856917234928", + "411479572697380917122" + ], + "redemptionFee": "240345817554723369", + "reserves": [ + "37795966907028300983563461", + "8294036860721117922512695", + "48411134154596714947481673" + ], + "mAssetSupply": "94228436151372814302166839" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "315422475595123318063104", + "expectedQty": "313625189799090443204167", + "reserves": [ + "38111389382623424301626565", + "8294036860721117922512695", + "48411134154596714947481673" + ] + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "2466262080063806111744", + "expectedQty": "2452106492881443905838", + "reserves": [ + "38113855644703488107738309", + "8294036860721117922512695", + "48411134154596714947481673" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "23310780157319022903296", + "8186382258985911713792", + "37464679895287499587584" + ], + "expectedQty": "68862542477726419825285", + "reserves": [ + "38137166424860807130641605", + "8302223242980103834226487", + "48448598834492002447069257" + ], + "mAssetSupply": "94613375990142512609102129" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "1966179140708433152", + "outputIndex": 0, + "expectedQty": "2063126136582443127", + "swapFee": "1231513094077144", + "reserves": [ + "38137164361734670548198478", + "8302225209159244542659639", + "48448598834492002447069257" + ], + "mAssetSupply": "94613375991374025703179273", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mintMulti", + "inputQtys": [ + "64509806766339701866496", + "59567498598221348864000", + "54639800188899763945472" + ], + "expectedQty": "180476531288787380313021", + "reserves": [ + "38201674168501010250064974", + "8361792707757465891523639", + "48503238634680902211014729" + ], + "mAssetSupply": "94793852522662813083492294" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "42480769390665400320", + "expectedQty": "44324971558758507573", + "reserves": [ + "38201674168501010250064974", + "8361835188526856556923959", + "48503238634680902211014729" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "243993695778064334848", + "341970060110680948736", + "242251162475165712384" + ], + "expectedQty": "839581271307558725178", + "reserves": [ + "38201918162196788314399822", + "8362177158586967237872695", + "48503480885843377376727113" + ], + "mAssetSupply": "94794736428905679400725045" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "8810124462955148634750976", + "hardLimitError": true + }, + { + "type": "redeemMasset", + "inputQty": "92647030424038303334", + "expectedQtys": [ + "37325199892306342364", + "8170268640803466787", + "47390345999125018971" + ], + "redemptionFee": "27794109127211491", + "reserves": [ + "38201880836996896008057458", + "8362168988318326434405908", + "48503433495497378251708142" + ], + "mAssetSupply": "94794643809669364489633202" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "683425009311673212731392", + "expectedQty": "677479407357715973471939", + "reserves": [ + "38201880836996896008057458", + "8362168988318326434405908", + "49186858504809051464439534" + ] + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "16328575680903666204672", + "outputIndex": 1, + "expectedQty": "15489989269905479465751", + "swapFee": "9711124220698793707", + "reserves": [ + "38201880836996896008057458", + "8346678999048420954940157", + "49203187080489955130644206" + ], + "mAssetSupply": "95472132928151301161898848", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemMasset", + "inputQty": "146528445846505206579", + "expectedQtys": [ + "58613783490116756748", + "12806448923266880983", + "75493271309472583070" + ], + "redemptionFee": "43958533753951561", + "reserves": [ + "38201822223213405891300710", + "8346666192599497688059174", + "49203111587218645658061136" + ], + "mAssetSupply": "95471986443663988410643830" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "1389460711466708762624", + "expectedQty": "1377234376405070951026", + "reserves": [ + "38201822223213405891300710", + "8346666192599497688059174", + "49204501047930112366823760" + ] + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "4386674043613141270528", + "expectedQty": "4361785636191663236224", + "reserves": [ + "38206208897257019032571238", + "8346666192599497688059174", + "49204501047930112366823760" + ] + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "12356604067915325505536", + "expectedQty": "11824155883122325677183", + "swapFee": "7413962440749195303", + "reserves": [ + "38206208897257019032571238", + "8334842036716375362381991", + "49204501047930112366823760" + ], + "mAssetSupply": "95465376273571110568520847" + }, + { + "type": "mintMulti", + "inputQtys": [ + "107696205964965071290368", + "112274837122041562267648", + "120737780097812600455168" + ], + "expectedQty": "343982232726573869769106", + "reserves": [ + "38313905103221984103861606", + "8447116873838416924649639", + "49325238828027924967278928" + ], + "mAssetSupply": "95809358506297684438289953" + }, + { + "type": "mintMulti", + "inputQtys": [ + "14802217223792447455232", + "6850269692286846631936", + "2252913567141020565504" + ], + "expectedQty": "24100760930247527143385", + "reserves": [ + "38328707320445776551316838", + "8453967143530703771281575", + "49327491741595065987844432" + ], + "mAssetSupply": "95833459267227931965433338" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "825889975910321280", + "outputIndex": 0, + "expectedQty": "866132571902322360", + "swapFee": "517076079852317", + "reserves": [ + "38328706454313204648994478", + "8453967969420679681602855", + "49327491741595065987844432" + ], + "mAssetSupply": "95833459267745008045285655", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemBassets", + "inputQtys": [ + "123024910082060083789824", + "277658040594638940667904", + "198053387967106484535296" + ], + "expectedQty": "608712120422604810883267", + "swapFee": "365446540177669488222", + "reserves": [ + "38205681544231144565204654", + "8176309928826040740934951", + "49129438353627959503309136" + ], + "mAssetSupply": "95224747147322403234402388" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "11830044864730470809600", + "9425069073494652747776", + "6539383977984751828992" + ], + "expectedQty": "28101675465632376019013", + "swapFee": "16871127956153117481", + "reserves": [ + "38193851499366414094395054", + "8166884859752546088187175", + "49122898969649974751480144" + ], + "mAssetSupply": "95196645471856770858383375" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "3754524991511357030400", + "1326552179904881623040", + "1618974318497965801472" + ], + "expectedQty": "6724869710452285009539", + "swapFee": "4037344232811057640", + "reserves": [ + "38190096974374902737364654", + "8165558307572641206564135", + "49121279995331476785678672" + ], + "mAssetSupply": "95189920602146318573373836" + }, + { + "type": "redeemMasset", + "inputQty": "329574140143083873894", + "expectedQtys": [ + "132185134226440283832", + "28262966225106875006", + "170020594446624251492" + ], + "redemptionFee": "98872242042925162", + "reserves": [ + "38189964789240676297080822", + "8165530044606416099689129", + "49121109974737030161427180" + ], + "mAssetSupply": "95189591126878417532425104" + }, + { + "type": "mintMulti", + "inputQtys": [ + "9284262042374160515072", + "11370026389577731670016", + "81679997224863316049920" + ], + "expectedQty": "102071148061243514577476", + "reserves": [ + "38199249051283050457595894", + "8176900070995993831359145", + "49202789971961893477477100" + ], + "mAssetSupply": "95291662274939661047002580" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "8793451462950258678431744", + "outputIndex": 1, + "hardLimitError": true + }, + { + "type": "mintMulti", + "inputQtys": [ + "9281551621975537876992", + "25643718075969888583680", + "48507608878057208676352" + ], + "expectedQty": "84124430852134263305139", + "reserves": [ + "38208530602905025995472886", + "8202543789071963719942825", + "49251297580839950686153452" + ], + "mAssetSupply": "95375786705791795310307719" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "502028453589753570263040", + "expectedQty": "497494855173653670332617", + "reserves": [ + "38208530602905025995472886", + "8202543789071963719942825", + "49753326034429704256416492" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "721811228986015318278144", + "592582589434121469034496", + "511354101901152992886784" + ], + "expectedQty": "1845915578013847531995881", + "swapFee": "1108214275373532638780", + "reserves": [ + "37486719373919010677194742", + "7609961199637842250908329", + "49241971932528551263529708" + ], + "mAssetSupply": "94027365982951601448644455" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "25496344653627838693376", + "48121394592183509581824", + "32360660594968785584128" + ], + "expectedQty": "108045796989366852444032", + "swapFee": "64866398032439575211", + "reserves": [ + "37461223029265382838501366", + "7561839805045658741326505", + "49209611271933582477945580" + ], + "mAssetSupply": "93919320185962234596200423" + }, + { + "type": "mintMulti", + "inputQtys": [ + "806905050995858580963328", + "831475346339524341923840", + "949334174947944739897344" + ], + "expectedQty": "2614674865398173951371387", + "reserves": [ + "38268128080261241419464694", + "8393315151385183083250345", + "50158945446881527217842924" + ], + "mAssetSupply": "96533995051360408547571810" + }, + { + "type": "redeemMasset", + "inputQty": "3305165667052587004723", + "expectedQtys": [ + "1309844871281400286965", + "287287133068864250564", + "1716844819393444499937" + ], + "redemptionFee": "991549700115776101", + "reserves": [ + "38266818235389960019177729", + "8393027864252114218999781", + "50157228602062133773342987" + ], + "mAssetSupply": "96530690877243056076343188" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "1595873125146961903616", + "outputIndex": 0, + "expectedQty": "1675987930460064421248", + "swapFee": "1000567069451970045", + "reserves": [ + "38265142247459499954756481", + "8394623737377261180903397", + "50157228602062133773342987" + ], + "mAssetSupply": "96530691877810125528313233", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "3477450882177156", + "expectedQty": "3494916786054835", + "swapFee": "2086470529306", + "reserves": [ + "38265142243964583168701646", + "8394623737377261180903397", + "50157228602062133773342987" + ], + "mAssetSupply": "96530691874334761116665383" + }, + { + "type": "mintMulti", + "inputQtys": [ + "1302866011305607936", + "1843681208073362432", + "1778711237511720192" + ], + "expectedQty": "4984888914063428657", + "reserves": [ + "38265143546830594474309582", + "8394625581058469254265829", + "50157230380773371285063179" + ], + "mAssetSupply": "96530696859223675180094040" + }, + { + "type": "mintMulti", + "inputQtys": [ + "65447566751653136", + "2368874644590119", + "3090576393113227" + ], + "expectedQty": "70619636432502349", + "reserves": [ + "38265143612278161225962718", + "8394625583427343898855948", + "50157230383863947678176406" + ], + "mAssetSupply": "96530696929843311612596389" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "971726938025276725002240", + "expectedQty": "1010911427112995720284376", + "reserves": [ + "38265143612278161225962718", + "9366352521452620623858188", + "50157230383863947678176406" + ] + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "5355605653013704704", + "expectedQty": "5312810282590336597", + "reserves": [ + "38265143612278161225962718", + "9366352521452620623858188", + "50157235739469600691881110" + ] + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "758671366695577728", + "expectedQty": "786117248445180647", + "reserves": [ + "38265143612278161225962718", + "9366353280123987319435916", + "50157235739469600691881110" + ] + }, + { + "type": "redeemMasset", + "inputQty": "740054812909076582", + "expectedQtys": [ + "290233131404835995", + "71041835616215450", + "380432169255097462" + ], + "redemptionFee": "222016443872722", + "reserves": [ + "38265143322045029821126723", + "9366353209082151703220466", + "50157235359037431436783648" + ], + "mAssetSupply": "97541613716051041903194149" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "4451552871086452375552", + "expectedQty": "4470512073599712749207", + "swapFee": "2670931722651871425", + "reserves": [ + "38260672809971430108377516", + "9366353209082151703220466", + "50157235359037431436783648" + ], + "mAssetSupply": "97537164834111678102690022" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "8859227024298391633920", + "expectedQty": "8816357756878166190362", + "reserves": [ + "38269532036995728500011436", + "9366353209082151703220466", + "50157235359037431436783648" + ] + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "3484524602529048082513920", + "outputIndex": 1, + "expectedQty": "3270817809297387250629768", + "swapFee": "2079726803222977206634", + "reserves": [ + "41754056639524776582525356", + "6095535399784764452590698", + "50157235359037431436783648" + ], + "mAssetSupply": "97548060918671779246087018", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "619113324427809128448", + "outputIndex": 0, + "expectedQty": "616961145749360409274", + "swapFee": "366912485358500499", + "reserves": [ + "41753439678379027222116082", + "6095535399784764452590698", + "50157854472361859245912096" + ], + "mAssetSupply": "97548061285584264604587517", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "157816206149603098624", + "expectedQty": "159679769731014368320", + "swapFee": "94689723689761859", + "reserves": [ + "41753439678379027222116082", + "6095535399784764452590698", + "50157694792592128231543776" + ], + "mAssetSupply": "97547903564067838691250752" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "30962245619208488484864", + "expectedQty": "33738915740343790411067", + "reserves": [ + "41753439678379027222116082", + "6126497645403972941075562", + "50157694792592128231543776" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "147766519181321850322944", + "181531854905432294293504", + "146990292938326699671552" + ], + "expectedQty": "489696574155521361209864", + "swapFee": "293994341097971599685", + "reserves": [ + "41605673159197705371793138", + "5944965790498540646782058", + "50010704499653801531872224" + ], + "mAssetSupply": "97091945905652661120451955" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "7836799455781737", + "expectedQty": "7908337648663679", + "swapFee": "4702079673469", + "reserves": [ + "41605673151289367723129459", + "5944965790498540646782058", + "50010704499653801531872224" + ], + "mAssetSupply": "97091945897820563744343687" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "1413801818439380", + "3326290319676478", + "3698311421651675" + ], + "expectedQty": "8691210814685894", + "swapFee": "5217857203133", + "reserves": [ + "41605673149875565904690079", + "5944965787172250327105580", + "50010704495955490110220549" + ], + "mAssetSupply": "97091945889129352929657793" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "2809757378234828118294528", + "710013945868971866587136", + "1407412497670245019811840" + ], + "expectedQty": "4953021175411143141779808", + "swapFee": "2973596863364704707892", + "reserves": [ + "38795915771640737786395551", + "5234951841303278460518444", + "48603291998285245090408709" + ], + "mAssetSupply": "92138924713718209787877985" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "443916353976950848", + "expectedQty": "448207036623021188", + "swapFee": "266349812386170", + "reserves": [ + "38795915323433701163374363", + "5234951841303278460518444", + "48603291998285245090408709" + ], + "mAssetSupply": "92138924270068205623313307" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "162525309671300722065408", + "expectedQty": "160868077330321552650681", + "reserves": [ + "38958440633105001885439771", + "5234951841303278460518444", + "48603291998285245090408709" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "8138001658483110943129600", + "3291258374067376231546880", + "1272055349125327613853696" + ], + "expectedQty": "12862067704110109093375426", + "reserves": [ + "47096442291588112828569371", + "8526210215370654692065324", + "49875347347410572704262405" + ], + "mAssetSupply": "105161860051508636269339414" + }, + { + "type": "redeemMasset", + "inputQty": "191009043318815052739379", + "expectedQtys": [ + "85517198226765883070353", + "15481798064418968817772", + "90563103245255502543845" + ], + "redemptionFee": "57302712995644515821", + "reserves": [ + "47010925093361346945499018", + "8510728417306235723247552", + "49784784244165317201718560" + ], + "mAssetSupply": "104970908310902816861115856" + }, + { + "type": "redeemMasset", + "inputQty": "42865996472237737115648", + "expectedQtys": [ + "19191656341556628201204", + "3474404612904050067348", + "20324051661503852105014" + ], + "redemptionFee": "12859798941671321134", + "reserves": [ + "46991733437019790317297814", + "8507254012693331673180204", + "49764460192503813349613546" + ], + "mAssetSupply": "104928055174229520795321342" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "12980404073149978", + "outputIndex": 2, + "expectedQty": "12982137815800221", + "swapFee": "7728909418278", + "reserves": [ + "46991733450000194390447792", + "8507254012693331673180204", + "49764460179521675533813325" + ], + "mAssetSupply": "104928055174237249704739620", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemMasset", + "inputQty": "2514821564689022566", + "expectedQtys": [ + "1125917865327909522", + "203833069660338925", + "1192352157728766871" + ], + "redemptionFee": "754446469406706", + "reserves": [ + "46991732324082329062538270", + "8507253808860262012841279", + "49764458987169517805046454" + ], + "mAssetSupply": "104928052660170131485123760" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "8833318868784465838080", + "6733625066555417034752", + "2621410888753611800576" + ], + "expectedQty": "18446022000460268068349", + "swapFee": "11074257754929118311", + "reserves": [ + "46982899005213544596700190", + "8500520183793706595806527", + "49761837576280764193245878" + ], + "mAssetSupply": "104909606638169671217055411" + }, + { + "type": "mintMulti", + "inputQtys": [ + "55602416179990704", + "71989958823038160", + "202819736180495168" + ], + "expectedQty": "332004964030587048", + "reserves": [ + "46982899060815960776690894", + "8500520255783665418844687", + "49761837779100500373741046" + ], + "mAssetSupply": "104909606970174635247642459" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "116661683788107451727872", + "expectedQty": "115685683396945546973766", + "reserves": [ + "46982899060815960776690894", + "8500520255783665418844687", + "49878499462888607825468918" + ] + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "238257168609114738130944", + "outputIndex": 0, + "expectedQty": "237916721650520463293070", + "swapFee": "141752726920108158449", + "reserves": [ + "46744982339165440313397824", + "8500520255783665418844687", + "50116756631497722563599862" + ], + "mAssetSupply": "105025434406298500902774674", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemBassets", + "inputQtys": [ + "44775372941196624", + "325347093439235968", + "131372865548700192" + ], + "expectedQty": "516864824209480723", + "swapFee": "310305077572231", + "reserves": [ + "46744982294390067372201200", + "8500519930436571979608719", + "50116756500124857014899670" + ], + "mAssetSupply": "105025433889433676693293951" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "500695767688018063785984", + "expectedQty": "504626795061968066806937", + "swapFee": "300417460612810838271", + "reserves": [ + "46744982294390067372201200", + "8500519930436571979608719", + "49612129705062888948092733" + ], + "mAssetSupply": "104525038539206271440346238" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "22739942982497704345600", + "62174015769589531541504", + "63031767518516692910080" + ], + "expectedQty": "150446130189195718609997", + "swapFee": "90321871236259186678", + "reserves": [ + "46722242351407569667855600", + "8438345914666982448067215", + "49549097937544372255182653" + ], + "mAssetSupply": "104374592409017075721736241" + }, + { + "type": "redeemMasset", + "inputQty": "8106461540966403879731", + "expectedQtys": [ + "3627687796158207847020", + "655184403697111178505", + "3847175324907375261085" + ], + "redemptionFee": "2431938462289921163", + "reserves": [ + "46718614663611411460008580", + "8437690730263285336888710", + "49545250762219464879921568" + ], + "mAssetSupply": "104366488379414571607777673" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "142780025348452108992512", + "expectedQty": "143790002321966991293886", + "swapFee": "85668015209071265395", + "reserves": [ + "46574824661289444468714694", + "8437690730263285336888710", + "49545250762219464879921568" + ], + "mAssetSupply": "104223794022081328570050556" + }, + { + "type": "redeemMasset", + "inputQty": "23863519240841453581107", + "expectedQtys": [ + "10660769002908881841489", + "1931349660411841717284", + "11340686248599475403973" + ], + "redemptionFee": "7159055772252436074", + "reserves": [ + "46564163892286535586873205", + "8435759380602873495171426", + "49533910075970865404517595" + ], + "mAssetSupply": "104199937661896259368905523" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "17202116444797708271616", + "expectedQty": "17057769983552062062997", + "reserves": [ + "46564163892286535586873205", + "8435759380602873495171426", + "49551112192415663112789211" + ] + }, + { + "type": "redeemMasset", + "inputQty": "15974646907201936", + "expectedQtys": [ + "7135332579909260", + "1292666800244248", + "7593042280650745" + ], + "redemptionFee": "4792394072160", + "reserves": [ + "46564163885151203006963945", + "8435759379310206694927178", + "49551112184822620832138466" + ], + "mAssetSupply": "104216995415909956917838744" + }, + { + "type": "redeemMasset", + "inputQty": "3086346376346877086924", + "expectedQtys": [ + "1378566173009083326095", + "249746834339048270107", + "1466996964907552396019" + ], + "redemptionFee": "925903912904063126", + "reserves": [ + "46562785318978193923637850", + "8435509632475867646657071", + "49549645187857713279742447" + ], + "mAssetSupply": "104213909995437522944814946" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "31401738121711370371072", + "expectedQty": "31162889214835594133787", + "reserves": [ + "46594187057099905294008922", + "8435509632475867646657071", + "49549645187857713279742447" + ] + }, + { + "type": "redeemMasset", + "inputQty": "287571238150588334080", + "expectedQtys": [ + "128496512569311722016", + "23263278919098951304", + "136647015600550409570" + ], + "redemptionFee": "86271371445176500", + "reserves": [ + "46594058560587335982286906", + "8435486369196948547705767", + "49549508540842112729332877" + ], + "mAssetSupply": "104244785399685579395791153" + }, + { + "type": "mintMulti", + "inputQtys": [ + "415018420218478", + "767234094604324", + "140012577685317" + ], + "expectedQty": "1357598150001469", + "reserves": [ + "46594058561002354402505384", + "8435486369964182642310091", + "49549508540982125307018194" + ], + "mAssetSupply": "104244785401043177545792622" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "24308673006505504768", + "expectedQty": "24123688262759532790", + "reserves": [ + "46594082869675360908010152", + "8435486369964182642310091", + "49549508540982125307018194" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "318565118955633680318464", + "110774308748418806185984", + "402228867052325576900608" + ], + "expectedQty": "831482062950189816747405", + "reserves": [ + "46912647988630994588328616", + "8546260678712601448496075", + "49951737408034450883918802" + ], + "mAssetSupply": "105076291587681630122072817" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "449129436322046612078592", + "expectedQty": "425953635721768934751022", + "swapFee": "269477661793227967247", + "reserves": [ + "46912647988630994588328616", + "8120307042990832513745053", + "49951737408034450883918802" + ], + "mAssetSupply": "104627431629021376737961472" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "1269055575368060721168384", + "expectedQty": "1189698571964280236185560", + "swapFee": "761433345220836432701", + "reserves": [ + "46912647988630994588328616", + "6930608471026552277559493", + "49951737408034450883918802" + ], + "mAssetSupply": "103359137486998536853225789" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "662254122694838105145344", + "expectedQty": "655871836193385127342222", + "reserves": [ + "47574902111325832693473960", + "6930608471026552277559493", + "49951737408034450883918802" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "919018096041843621888", + "836321822930734678016", + "693078191715112452096" + ], + "expectedQty": "2497622210606287379737", + "reserves": [ + "47575821129421874537095848", + "6931444792849483012237509", + "49952430486226165996370898" + ], + "mAssetSupply": "104017506945402528267947748" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "229769818939305341485056", + "expectedQty": "227364897290609605693877", + "reserves": [ + "47575821129421874537095848", + "6931444792849483012237509", + "50182200305165471337855954" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "187764614492531424493568", + "82678273443813889409024", + "112943782058725881151488" + ], + "expectedQty": "386912803150005529181488", + "swapFee": "232287054122476803591", + "reserves": [ + "47388056514929343112602280", + "6848766519405669122828485", + "50069256523106745456704466" + ], + "mAssetSupply": "103857959039543132344460137" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "94759832814243417161728", + "outputIndex": 0, + "expectedQty": "94622604217170837263129", + "swapFee": "56252016456658102206", + "reserves": [ + "47293433910712172275339151", + "6848766519405669122828485", + "50164016355920988873866194" + ], + "mAssetSupply": "103858015291559589002562343", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "959965297221370942324736", + "expectedQty": "949633235878369989221143", + "reserves": [ + "47293433910712172275339151", + "6848766519405669122828485", + "51123981653142359816190930" + ] + }, + { + "type": "redeemMasset", + "inputQty": "1744779113478574047232", + "expectedQtys": [ + "787078442006896683930", + "113980230150761683975", + "850828127742067835552" + ], + "redemptionFee": "523433734043572214", + "reserves": [ + "47292646832270165378655221", + "6848652539175518361144510", + "51123130825014617748355378" + ], + "mAssetSupply": "104805904271758214461308468" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "15732111329087379734528", + "expectedQty": "15877132088179894389713", + "swapFee": "9439266797452427840", + "reserves": [ + "47276769700181985484265508", + "6848652539175518361144510", + "51123130825014617748355378" + ], + "mAssetSupply": "104790181599695924534001780" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "5410495994316753731584", + "182417261500329162178560", + "160581391972917346304" + ], + "expectedQty": "203196255126043387660222", + "swapFee": "121990947644212560132", + "reserves": [ + "47271359204187668730533924", + "6666235277675189198965950", + "51122970243622644831009074" + ], + "mAssetSupply": "104586985344569881146341558" + }, + { + "type": "redeemMasset", + "inputQty": "2293517920391166689280", + "expectedQtys": [ + "1036316170564933896230", + "146141924652617707577", + "1120753911939192534820" + ], + "redemptionFee": "688055376117350006", + "reserves": [ + "47270322888017103796637694", + "6666089135750536581258373", + "51121849489710705638474254" + ], + "mAssetSupply": "104584692514704866097002284" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "1524887169768136114176", + "49655649779989511929856", + "54993583323501865992192" + ], + "expectedQty": "109835103108885135820029", + "swapFee": "65940626241075726928", + "reserves": [ + "47268798000847335660523518", + "6616433485970547069328517", + "51066855906387203772482062" + ], + "mAssetSupply": "104474857411595980961182255" + }, + { + "type": "mintMulti", + "inputQtys": [ + "57685050053402113867776", + "149353807604010113302528", + "359906994128913023631360" + ], + "expectedQty": "575119456801022353827742", + "reserves": [ + "47326483050900737774391294", + "6765787293574557182631045", + "51426762900516116796113422" + ], + "mAssetSupply": "105049976868397003315009997" + }, + { + "type": "mintMulti", + "inputQtys": [ + "126116610915116810240", + "128443456292053172224", + "60416451925249368064" + ], + "expectedQty": "323859124032119818497", + "reserves": [ + "47326609167511652891201534", + "6765915737030849235803269", + "51426823316968042045481486" + ], + "mAssetSupply": "105050300727521035434828494" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "267105636936693383168", + "351740256948326236160", + "81320131612740780032" + ], + "expectedQty": "726197757874521460897", + "swapFee": "435980242870435137", + "reserves": [ + "47326342061874716197818366", + "6765563996773900909567109", + "51426741996836429304701454" + ], + "mAssetSupply": "105049574529763160913367597" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "692553673018461782016", + "95060963985287938048", + "249106299643648638976" + ], + "expectedQty": "1035117576248182686013", + "swapFee": "621443411795987203", + "reserves": [ + "47325649508201697736036350", + "6765468935809915621629061", + "51426492890536785656062478" + ], + "mAssetSupply": "105048539412186912730681584" + }, + { + "type": "redeemMasset", + "inputQty": "33723230355792386536243", + "expectedQtys": [ + "15188169172997096009474", + "2171234579969786143885", + "16504248375081302851277" + ], + "redemptionFee": "10116969106737715960", + "reserves": [ + "47310461339028700640026876", + "6763297701229945835485176", + "51409988642161704353211201" + ], + "mAssetSupply": "105014826298800227081861301" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "14213506486219560960", + "expectedQty": "14055620671627447348", + "reserves": [ + "47310461339028700640026876", + "6763297701229945835485176", + "51410002855668190572772161" + ] + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "1945122759419839834488832", + "outputIndex": 0, + "expectedQty": "1940324588252030075393844", + "swapFee": "1153811034071501899054", + "reserves": [ + "45370136750776670564633032", + "6763297701229945835485176", + "53355125615088030407260993" + ], + "mAssetSupply": "105015994165454970211207703", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mintMulti", + "inputQtys": [ + "6575036793560109154304", + "4798671600825711722496", + "7576257520646654787584" + ], + "expectedQty": "19205590504579950179644", + "reserves": [ + "45376711787570230673787336", + "6768096372830771547207672", + "53362701872608677062048577" + ], + "mAssetSupply": "105035199755959550161387347" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "21374799856418283180785664", + "expectedQty": "21482351509726233208150205", + "swapFee": "12824879913850969908471", + "reserves": [ + "23894360277843997465637131", + "6768096372830771547207672", + "53362701872608677062048577" + ], + "mAssetSupply": "83673224779455117950510154" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "15526424732309527724032", + "expectedQty": "15527651805957864412386", + "swapFee": "9315854839385716634", + "reserves": [ + "23878832626038039601224745", + "6768096372830771547207672", + "53362701872608677062048577" + ], + "mAssetSupply": "83657707670577647808502756" + }, + { + "type": "mintMulti", + "inputQtys": [ + "1525708980220559865413632", + "1010408991563105125269504", + "781578175476885895512064" + ], + "expectedQty": "3360014322032517881593514", + "reserves": [ + "25404541606258599466638377", + "7778505364393876672477176", + "54144280048085562957560641" + ], + "mAssetSupply": "87017721992610165690096270" + }, + { + "type": "redeemMasset", + "inputQty": "285554637197883893350", + "expectedQtys": [ + "83341739821356578751", + "25518042416425010796", + "177624873950511750843" + ], + "redemptionFee": "85666391159365168", + "reserves": [ + "25404458264518778110059626", + "7778479846351460247466380", + "54144102423211612445809798" + ], + "mAssetSupply": "87017436523639358965568088" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "1906133810529404006170624", + "expectedQty": "1795033204641389894212650", + "swapFee": "1143680286317642403702", + "reserves": [ + "25404458264518778110059626", + "5983446641710070353253730", + "54144102423211612445809798" + ], + "mAssetSupply": "85112446393396272601801166" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "129666456375661187563520", + "571460121485110442721280", + "890922740796298543235072" + ], + "expectedQty": "1626692931815886731799334", + "swapFee": "976601720121605002080", + "reserves": [ + "25274791808143116922496106", + "5411986520224959910532450", + "53253179682415313902574726" + ], + "mAssetSupply": "83485753461580385870001832" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "801590094382582063955968", + "expectedQty": "788067899033059789487017", + "reserves": [ + "25274791808143116922496106", + "5411986520224959910532450", + "54054769776797895966530694" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "134721723299314626723840", + "96240493290238437752832", + "88924278861376117538816" + ], + "expectedQty": "327398516283678098196852", + "swapFee": "196557043996604821811", + "reserves": [ + "25140070084843802295772266", + "5315746026934721472779618", + "53965845497936519848991878" + ], + "mAssetSupply": "83946422844329767561291997" + }, + { + "type": "redeemMasset", + "inputQty": "1534052569478327802265", + "expectedQtys": [ + "459276499789424033715", + "97111790889237088979", + "985886059379421381412" + ], + "redemptionFee": "460215770843498340", + "reserves": [ + "25139610808344012871738551", + "5315648915143832235690639", + "53964859611877140427610466" + ], + "mAssetSupply": "83944889251976060076988072" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "20980567067467505664", + "expectedQty": "20923603869285828488", + "reserves": [ + "25139631788911080339244215", + "5315648915143832235690639", + "53964859611877140427610466" + ] + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "1765668108491444623245312", + "outputIndex": 2, + "expectedQty": "1788382609465869772733742", + "swapFee": "1055863000443794867309", + "reserves": [ + "26905299897402524962489527", + "5315648915143832235690639", + "52176477002411270654876724" + ], + "mAssetSupply": "83945966038580373157683869", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "9199593008464190", + "outputIndex": 2, + "expectedQty": "9305920014425255", + "swapFee": "5496178854204", + "reserves": [ + "26905299906602117970953717", + "5315648915143832235690639", + "52176476993105350640451469" + ], + "mAssetSupply": "83945966038585869336538073", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "2262999862166414592", + "expectedQty": "2298974934293862792", + "swapFee": "1357799917299848", + "reserves": [ + "26905299906602117970953717", + "5315648915143832235690639", + "52176474694130416346588677" + ], + "mAssetSupply": "83945963776943807087423329" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "965865046241567118983168", + "293586508366860706119680", + "653789267506976994099200" + ], + "expectedQty": "1927597025244419920866834", + "swapFee": "1157252566686663950890", + "reserves": [ + "25939434860360550851970549", + "5022062406776971529570959", + "51522685426623439352489477" + ], + "mAssetSupply": "82018366751699387166556495" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "45210045210697018638336", + "expectedQty": "45371893481374029709295", + "swapFee": "27126027126418211183", + "reserves": [ + "25894062966879176822261254", + "5022062406776971529570959", + "51522685426623439352489477" + ], + "mAssetSupply": "81973183832515816566129342" + }, + { + "type": "redeemMasset", + "inputQty": "49473283744966108774", + "expectedQtys": [ + "15623158029212616724", + "3030056531259789079", + "31086162783304696615" + ], + "redemptionFee": "14841985123489832", + "reserves": [ + "25894047343721147609644530", + "5022059376720440269781880", + "51522654340460656047792862" + ], + "mAssetSupply": "81973134374074056723510400" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "1020389075109152322224128", + "expectedQty": "1023663163200672324023182", + "swapFee": "612233445065491393334", + "reserves": [ + "24870384180520475285621348", + "5022059376720440269781880", + "51522654340460656047792862" + ], + "mAssetSupply": "80953357532409969892679606" + }, + { + "type": "mintMulti", + "inputQtys": [ + "3676784519398923236802560", + "3899027750624839560331264", + "2696991028813052763963392" + ], + "expectedQty": "10468031787704506348153567", + "reserves": [ + "28547168699919398522423908", + "8921087127345279830113144", + "54219645369273708811756254" + ], + "mAssetSupply": "91421389320114476240833173" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "640393222244119017947136", + "outputIndex": 0, + "expectedQty": "634389960235095998271601", + "swapFee": "380289312113900759452", + "reserves": [ + "27912778739684302524152307", + "8921087127345279830113144", + "54860038591517827829703390" + ], + "mAssetSupply": "91421769609426590141592625", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "186683011184549299224576", + "expectedQty": "179612522752638098118251", + "swapFee": "112009806710729579534", + "reserves": [ + "27912778739684302524152307", + "8741474604592641731994893", + "54860038591517827829703390" + ], + "mAssetSupply": "91235198608048751571947583" + }, + { + "type": "mintMulti", + "inputQtys": [ + "18421256180176567402496", + "57192606496913581146112", + "16896422792863338725376" + ], + "expectedQty": "94551666589814372789790", + "reserves": [ + "27931199995864479091554803", + "8798667211089555313141005", + "54876935014310691168428766" + ], + "mAssetSupply": "91329750274638565944737373" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "480057474396353152", + "expectedQty": "461736623474540169", + "swapFee": "288034484637811", + "reserves": [ + "27931199995864479091554803", + "8798666749352931838600836", + "54876935014310691168428766" + ], + "mAssetSupply": "91329749794869126033022032" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "9402996452073155854336", + "expectedQty": "9769832776942624071081", + "reserves": [ + "27931199995864479091554803", + "8808069745805004994455172", + "54876935014310691168428766" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "373590706215640258052096", + "753389472552243983024128", + "489899220365327864954880" + ], + "expectedQty": "1642678097302838149835195", + "swapFee": "986198577528219821794", + "reserves": [ + "27557609289648838833502707", + "8054680273252761011431044", + "54387035793945363303473886" + ], + "mAssetSupply": "89696841530343230507257918" + }, + { + "type": "redeemMasset", + "inputQty": "55457013849452800534118", + "expectedQtys": [ + "17032977027413157018819", + "4978486436013349097943", + "33615874350005092697280" + ], + "redemptionFee": "16637104154835840160", + "reserves": [ + "27540576312621425676483888", + "8049701786816747662333101", + "54353419919595358210776606" + ], + "mAssetSupply": "89641401153597932542563960" + }, + { + "type": "redeemMasset", + "inputQty": "508674459853279618662", + "expectedQtys": [ + "156233446190110699891", + "45664718003040424904", + "308338576864309117969" + ], + "redemptionFee": "152602337955983885", + "reserves": [ + "27540420079175235565783997", + "8049656122098744621908197", + "54353111581018493901658637" + ], + "mAssetSupply": "89640892631740417218929183" + }, + { + "type": "redeemMasset", + "inputQty": "30984523405716739640524", + "expectedQtys": [ + "9516536119445709094338", + "2781542293648416250843", + "18781607109767650636393" + ], + "redemptionFee": "9295357021715021892", + "reserves": [ + "27530903543055789856689659", + "8046874579805096205657354", + "54334329973908726251022244" + ], + "mAssetSupply": "89609917403691722194310551" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "3451952004945575606747136", + "expectedQty": "3562210647338917821205215", + "reserves": [ + "27530903543055789856689659", + "11498826584750671812404490", + "54334329973908726251022244" + ] + }, + { + "type": "redeemMasset", + "inputQty": "11291098267812762327449", + "expectedQtys": [ + "3335341668861753964684", + "1393071440287254550042", + "6582550206833751509129" + ], + "redemptionFee": "3387329480343828698", + "reserves": [ + "27527568201386928102724975", + "11497433513310384557854448", + "54327747423701892499513115" + ], + "mAssetSupply": "93160840340092307597017015" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "11098579084023735255040", + "expectedQty": "11345356224905081352356", + "reserves": [ + "27527568201386928102724975", + "11508532092394408293109488", + "54327747423701892499513115" + ] + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "302891392412917760000", + "expectedQty": "296131494805796351129", + "swapFee": "181734835447750656", + "reserves": [ + "27527568201386928102724975", + "11508235960899602496758359", + "54327747423701892499513115" + ], + "mAssetSupply": "93171882986659635208360027" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "5090552944387081967239168", + "outputIndex": 1, + "expectedQty": "4828319775144686984358162", + "swapFee": "3027848894886453435292", + "reserves": [ + "27527568201386928102724975", + "6679916185754915512400197", + "59418300368088974466752283" + ], + "mAssetSupply": "93174910835554521661795319", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "6905703409618897600512", + "expectedQty": "6892866265160573038165", + "reserves": [ + "27534473904796547000325487", + "6679916185754915512400197", + "59418300368088974466752283" + ] + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "166133730898441949675520", + "outputIndex": 2, + "expectedQty": "181129220873644892342310", + "swapFee": "107118112720479877357", + "reserves": [ + "27534473904796547000325487", + "6846049916653357462075717", + "59237171147215329574409973" + ], + "mAssetSupply": "93181910819932402714710841", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemMasset", + "inputQty": "36322277194720083", + "expectedQtys": [ + "10729708699307587", + "2667787356337079", + "23083702008554691" + ], + "redemptionFee": "10896683158416", + "reserves": [ + "27534473894066838301017900", + "6846049913985570105738638", + "59237171124131627565855282" + ], + "mAssetSupply": "93181910783621022203149174" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "22127630307115802624", + "5315746973404467200", + "14274541424843827200" + ], + "expectedQty": "41851216459731201489", + "swapFee": "25125805359054153", + "reserves": [ + "27534451766436531185215276", + "6846044598238596701271438", + "59237156849590202722028082" + ], + "mAssetSupply": "93181868932404562471947685" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "47458528931418499710976", + "expectedQty": "47374076648344214158117", + "reserves": [ + "27581910295367949684926252", + "6846044598238596701271438", + "59237156849590202722028082" + ] + }, + { + "type": "redeemMasset", + "inputQty": "16611094814741049534054", + "expectedQtys": [ + "4912924985623198246491", + "1219426181841566468433", + "10551397812808733984004" + ], + "redemptionFee": "4983328444422314860", + "reserves": [ + "27576997370382326486679761", + "6844825172056755134803005", + "59226605451777393988044078" + ], + "mAssetSupply": "93212636897566610058886608" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "3322290931536578763292672", + "expectedQty": "3322579297728882209245391", + "swapFee": "1993374558921947257975", + "reserves": [ + "24254418072653444277434370", + "6844825172056755134803005", + "59226605451777393988044078" + ], + "mAssetSupply": "89892339340588953242851911" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "9931522857924896657244160", + "expectedQty": "9758237646414510896449578", + "reserves": [ + "24254418072653444277434370", + "6844825172056755134803005", + "69158128309702290645288238" + ] + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "3267301610882526567464960", + "expectedQty": "3273809536983543890164410", + "reserves": [ + "27521719683535970844899330", + "6844825172056755134803005", + "69158128309702290645288238" + ] + }, + { + "type": "redeemMasset", + "inputQty": "16760997318550136422", + "expectedQtys": [ + "4480503580841997543", + "1114329483996019566", + "11258861913389724223" + ], + "redemptionFee": "5028299195565040", + "reserves": [ + "27521715203032390002901787", + "6844824057727271138783439", + "69158117050840377255564015" + ], + "mAssetSupply": "102924369768017988674894517" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "230695028263476854784", + "expectedQty": "230815090909579564013", + "reserves": [ + "27521945898060653479756571", + "6844824057727271138783439", + "69158117050840377255564015" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "2665229602702515765248", + "90491854112545403043840", + "30318058077370720452608" + ], + "expectedQty": "131607424386868031046309", + "swapFee": "79011861749170320820", + "reserves": [ + "27519280668457950963991323", + "6754332203614725735739599", + "69127798992763006535111407" + ], + "mAssetSupply": "102792993158722030223412221" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "318474211798494871552", + "expectedQty": "290077236619628340900", + "swapFee": "191084527079096922", + "reserves": [ + "27519280668457950963991323", + "6754042126378106107398699", + "69127798992763006535111407" + ], + "mAssetSupply": "102792674875594758807637591" + }, + { + "type": "redeemMasset", + "inputQty": "45752566089318093815808", + "expectedQtys": [ + "12245035803623250488313", + "3005292494853352155166", + "30759247812108111902609" + ], + "redemptionFee": "13725769826795428144", + "reserves": [ + "27507035632654327713503010", + "6751036833883252755243533", + "69097039744950898423208798" + ], + "mAssetSupply": "102746936035275267509249927" + }, + { + "type": "mintMulti", + "inputQtys": [ + "47076951652966572032", + "221359911499995611136", + "73868218178295988224" + ], + "expectedQty": "362485623008993557616", + "reserves": [ + "27507082709605980680075042", + "6751258193794752750854669", + "69097113613169076719197022" + ], + "mAssetSupply": "102747298520898276502807543" + }, + { + "type": "redeemMasset", + "inputQty": "3193787207755542351052", + "expectedQtys": [ + "854771021858894109155", + "209792507844821718885", + "2147163733579170911251" + ], + "redemptionFee": "958136162326662705", + "reserves": [ + "27506227938584121785965887", + "6751048401286907929135784", + "69094966449435497548285771" + ], + "mAssetSupply": "102744105691826683287119196" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "11850637904465492967424", + "expectedQty": "13000942741375010783591", + "reserves": [ + "27506227938584121785965887", + "6762899039191373422103208", + "69094966449435497548285771" + ] + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "147782464601266931630080", + "expectedQty": "145051198260276530551821", + "reserves": [ + "27506227938584121785965887", + "6762899039191373422103208", + "69242748914036764479915851" + ] + }, + { + "type": "redeemMasset", + "inputQty": "146556017828801972849868", + "expectedQtys": [ + "39163356299559606011447", + "9629012937767234643782", + "98587798113802517400810" + ], + "redemptionFee": "43966805348640591854", + "reserves": [ + "27467064582284562179954440", + "6753270026253606187459426", + "69144161115922961962515041" + ], + "mAssetSupply": "102755645781804881496196594" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "3635175104679555104768", + "expectedQty": "3701497963606681645027", + "swapFee": "2181105062807733062", + "reserves": [ + "27467064582284562179954440", + "6753270026253606187459426", + "69140459617959355280870014" + ], + "mAssetSupply": "102752012787805264748824888" + }, + { + "type": "redeemMasset", + "inputQty": "1868655722788563609190", + "expectedQtys": [ + "499368217531917885718", + "122778624756904992250", + "1257016306759860525609" + ], + "redemptionFee": "560596716836569082", + "reserves": [ + "27466565214067030262068722", + "6753147247628849282467176", + "69139202601652595420344405" + ], + "mAssetSupply": "102750144692679193021784780" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "152195532992761848397824", + "2327893044720597360181248", + "198187749817698815574016" + ], + "hardLimitError": true + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "2818083929872609730101248", + "expectedQty": "2764518861065876562484785", + "reserves": [ + "27466565214067030262068722", + "6753147247628849282467176", + "71957286531525205150445653" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "133541812751433954492416", + "73024982131634826379264", + "1155957190635150366474240" + ], + "expectedQty": "1347832895372548470391220", + "swapFee": "809185248372552613803", + "reserves": [ + "27333023401315596307576306", + "6680122265497214456087912", + "70801329340890054783971413" + ], + "mAssetSupply": "104166830658372521113878345" + }, + { + "type": "redeemMasset", + "inputQty": "33003661876718552167219", + "expectedQtys": [ + "8657451030687082434298", + "2115859286527408847052", + "22425585076212284613193" + ], + "redemptionFee": "9901098563015565650", + "reserves": [ + "27324365950284909225142008", + "6678006406210687047240860", + "70778903755813842499358220" + ], + "mAssetSupply": "104133836897594365577276776" + }, + { + "type": "mintMulti", + "inputQtys": [ + "145996661874554944094208", + "123590796901515689721856", + "103345077744043678498816" + ], + "expectedQty": "383702684866003394387828", + "reserves": [ + "27470362612159464169236216", + "6801597203112202736962716", + "70882248833557886177857036" + ], + "mAssetSupply": "104517539582460368971664604" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "113214460183309984", + "2073989852708584", + "207361752125317536" + ], + "expectedQty": "319033020557758484", + "swapFee": "191534733174559", + "reserves": [ + "27470362498945003985926232", + "6801597201038212884254132", + "70882248626196134052539500" + ], + "mAssetSupply": "104517539263427348413906120" + }, + { + "type": "mintMulti", + "inputQtys": [ + "155057495505707040768", + "56941280216450228224", + "236548858911661096960" + ], + "expectedQty": "449922071946860527275", + "reserves": [ + "27470517556440509692967000", + "6801654142318429334482356", + "70882485175055045713636460" + ], + "mAssetSupply": "104517989185499295274433395" + }, + { + "type": "mintMulti", + "inputQtys": [ + "3697023886528295110443008", + "830990823817272119787520", + "3480583922573013218754560" + ], + "expectedQty": "8024907947432594101110255", + "reserves": [ + "31167541442968804803410008", + "7632644966135701454269876", + "74363069097628058932391020" + ], + "mAssetSupply": "112542897132931889375543650" + }, + { + "type": "redeemMasset", + "inputQty": "40546597519666252978585", + "expectedQtys": [ + "11225574153700411980284", + "2749040126023591900618", + "26783252954990122776331" + ], + "redemptionFee": "12163979255899875893", + "reserves": [ + "31156315868815104391429724", + "7629895926009677862369258", + "74336285844673068809614689" + ], + "mAssetSupply": "112502362699391479022440958" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "794741632963720832", + "outputIndex": 1, + "expectedQty": "728938594669580687", + "swapFee": "476637723985678", + "reserves": [ + "31156316663556737355150556", + "7629895197071083192788571", + "74336285844673068809614689" + ], + "mAssetSupply": "112502362699868116746426636", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "910583389858382179467264", + "expectedQty": "909920913356710100730534", + "reserves": [ + "32066900053415119534617820", + "7629895197071083192788571", + "74336285844673068809614689" + ] + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "3147557295294243840", + "expectedQty": "3144365049168388740", + "reserves": [ + "32066903200972414828861660", + "7629895197071083192788571", + "74336285844673068809614689" + ] + }, + { + "type": "redeemMasset", + "inputQty": "1809718143775170602886758", + "expectedQtys": [ + "511537581854094161091799", + "121713597176778611171931", + "1185827133561362269704969" + ], + "redemptionFee": "542915443132551180866", + "reserves": [ + "31555365619118320667769861", + "7508181599894304581616640", + "73150458711111706539909720" + ], + "mAssetSupply": "111603111529257837963840018" + }, + { + "type": "mintMulti", + "inputQtys": [ + "293733883104888553472", + "123446372771512696832", + "544739761836834422784" + ], + "expectedQty": "963369830158974395798", + "reserves": [ + "31555659353001425556323333", + "7508305046267076094313472", + "73151003450873543374332504" + ], + "mAssetSupply": "111604074899087996938235816" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "98362133374781856", + "75554238136927984", + "119729595897108816" + ], + "expectedQty": "298274301923313258", + "swapFee": "179072024368609", + "reserves": [ + "31555659254639292181541477", + "7508304970712837957385488", + "73151003331143947477223688" + ], + "mAssetSupply": "111604074600813695014922558" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "3394660530714568908865536", + "expectedQty": "3605394488145490542115629", + "reserves": [ + "31555659254639292181541477", + "10902965501427406866251024", + "73151003331143947477223688" + ] + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "206325345578276003774464", + "expectedQty": "208724783812611614672265", + "swapFee": "123795207346965602264", + "reserves": [ + "31555659254639292181541477", + "10902965501427406866251024", + "72942278547331335862551423" + ], + "mAssetSupply": "115003267538588256518865987" + }, + { + "type": "mintMulti", + "inputQtys": [ + "58022168931895910400", + "29044633421544624128", + "125091108411624521728" + ], + "expectedQty": "211919537362623458175", + "reserves": [ + "31555717276808224077451877", + "10902994546060828410875152", + "72942403638439747487073151" + ], + "mAssetSupply": "115003479458125619142324162" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "26193365586402590326784", + "expectedQty": "26497271357714224485455", + "swapFee": "15716019351841554196", + "reserves": [ + "31555717276808224077451877", + "10902994546060828410875152", + "72915906367082033262587696" + ], + "mAssetSupply": "114977301808558568393551574" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "72244703617360865525760", + "outputIndex": 1, + "expectedQty": "68390819293399294949725", + "swapFee": "42823731557274964565", + "reserves": [ + "31555717276808224077451877", + "10834603726767429115925427", + "72988151070699394128113456" + ], + "mAssetSupply": "114977344632290125668516139", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "183434228663420400435200", + "outputIndex": 1, + "expectedQty": "173437338572503642081136", + "swapFee": "108721463607357384750", + "reserves": [ + "31555717276808224077451877", + "10661166388194925473844291", + "73171585299362814528548656" + ], + "mAssetSupply": "114977453353753733025900889", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "9345223881902956512018432", + "hardLimitError": true + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "7849980975975320191500288", + "expectedQty": "7745730678955963715254591", + "reserves": [ + "31555717276808224077451877", + "10661166388194925473844291", + "81021566275338134720048944" + ] + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "1982049532539116544", + "expectedQty": "2009401293715324018", + "swapFee": "1189229719523469", + "reserves": [ + "31555717276808224077451877", + "10661166388194925473844291", + "81021564265936841004724926" + ], + "mAssetSupply": "122723182051849393921562405" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "111893653567835201339392", + "expectedQty": "106060553301018666332033", + "swapFee": "67136192140701120803", + "reserves": [ + "31555717276808224077451877", + "10555105834893906807512258", + "81021564265936841004724926" + ], + "mAssetSupply": "122611355534473699421343816" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "104808549284114094620672", + "outputIndex": 2, + "expectedQty": "112030736744333852225250", + "swapFee": "66304268715490334180", + "reserves": [ + "31555717276808224077451877", + "10659914384178020902132930", + "80909533529192507152499676" + ], + "mAssetSupply": "122611421838742414911677996", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "6465366909044844920832", + "expectedQty": "6373692650623829663051", + "reserves": [ + "31555717276808224077451877", + "10659914384178020902132930", + "80915998896101551997420508" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "118573803701425886199808", + "220323956346047059460096", + "225300190853878637395968" + ], + "expectedQty": "573250946805771481754153", + "swapFee": "344157062320855402293", + "reserves": [ + "31437143473106798191252069", + "10439590427831973842672834", + "80690698705247673360024540" + ], + "mAssetSupply": "122044544584587267259586894" + }, + { + "type": "mintMulti", + "inputQtys": [ + "811144439335211892736", + "1663691777051921743872", + "2710686331871496241152" + ], + "expectedQty": "5240579368637576198554", + "reserves": [ + "31437954617546133403144805", + "10441254119609025764416706", + "80693409391579544856265692" + ], + "mAssetSupply": "122049785163955904835785448" + }, + { + "type": "redeemMasset", + "inputQty": "261296053459990767206", + "expectedQtys": [ + "67285239997318798490", + "22346946481015161027", + "172704474039924741887" + ], + "redemptionFee": "78388816037997230", + "reserves": [ + "31437887332306136084346315", + "10441231772662544749255679", + "80693236687105504931523805" + ], + "mAssetSupply": "122049523946291260883015472" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "92232072210031099904", + "outputIndex": 2, + "expectedQty": "98730774494324298903", + "swapFee": "58419277740838007", + "reserves": [ + "31437887332306136084346315", + "10441324004734754780355583", + "80693137956331010607224902" + ], + "mAssetSupply": "122049524004710538623853479", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "13365691178760552874770432", + "outputIndex": 1, + "hardLimitError": true + }, + { + "type": "mintMulti", + "inputQtys": [ + "131380664297468936192", + "63694125534210457600", + "37946486999559200768" + ], + "expectedQty": "236268409166505084695", + "reserves": [ + "31438018712970433553282507", + "10441387698860288990813183", + "80693175902818010166425670" + ], + "mAssetSupply": "122049760273119705128938174" + }, + { + "type": "redeemMasset", + "inputQty": "5759331558419495020134", + "expectedQtys": [ + "1483064401853365414889", + "492564450180842584354", + "3806638635423530634596" + ], + "redemptionFee": "1727799467525848506", + "reserves": [ + "31436535648568580187867618", + "10440895134410108148228829", + "80689369264182586635791074" + ], + "mAssetSupply": "122044002669360753159766546" + }, + { + "type": "redeemMasset", + "inputQty": "163051444871743024817766", + "expectedQtys": [ + "41986781123328637027226", + "13944907404581177443267", + "107769091484765375402156" + ], + "redemptionFee": "48915433461522907445", + "reserves": [ + "31394548867445251550840392", + "10426950227005526970785562", + "80581600172697821260388918" + ], + "mAssetSupply": "121881000139922471657856225" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "7332012158024560934912", + "5879682511600335454208", + "10318798213353821962240" + ], + "expectedQty": "23722957606937172373119", + "swapFee": "14242319956135985014", + "reserves": [ + "31387216855287226989905480", + "10421070544493926635331354", + "80571281374484467438426678" + ], + "mAssetSupply": "121857277182315534485483106" + }, + { + "type": "mintMulti", + "inputQtys": [ + "469518834578349228032", + "280777154746829012992", + "384739123395870326784" + ], + "expectedQty": "1146016006705113753627", + "reserves": [ + "31387686374121805339133512", + "10421351321648673464344346", + "80571666113607863308753462" + ], + "mAssetSupply": "121858423198322239599236733" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "1940287220766006837248", + "outputIndex": 2, + "expectedQty": "2077073136851168200881", + "swapFee": "1229005986659408502", + "reserves": [ + "31387686374121805339133512", + "10423291608869439471181594", + "80569589040471012140552581" + ], + "mAssetSupply": "121858424427328226258645235", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "298901566423880152645632", + "outputIndex": 1, + "expectedQty": "278372924099177170646562", + "swapFee": "176747719856815123790", + "reserves": [ + "31387686374121805339133512", + "10144918684770262300535032", + "80868490606894892293198213" + ], + "mAssetSupply": "121858601175048083073769025", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemBassets", + "inputQtys": [ + "1825748441887769344", + "434189710459359744", + "2641240029521551360" + ], + "expectedQty": "4891047319001265961", + "swapFee": "2936390225536081", + "reserves": [ + "31387684548373363451364168", + "10144918250580551841175288", + "80868487965654862771646853" + ], + "mAssetSupply": "121858596284000764072503064" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "6091478358691303387037696", + "outputIndex": 1, + "hardLimitError": true + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "3609484834960608537346048", + "expectedQty": "3660042332809624954166501", + "swapFee": "2165690900976365122407", + "reserves": [ + "31387684548373363451364168", + "10144918250580551841175288", + "77208445632845237817480352" + ], + "mAssetSupply": "118251277139941131900279423" + }, + { + "type": "redeemMasset", + "inputQty": "14743373879572041", + "expectedQtys": [ + "3912190646809717", + "1264472192314907", + "9623333584674612" + ], + "redemptionFee": "4423012163871", + "reserves": [ + "31387684544461172804554451", + "10144918249316079648860381", + "77208445623221904232805740" + ], + "mAssetSupply": "118251277125202181032871253" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "6874132234551173316608", + "expectedQty": "7247838633770143776456", + "reserves": [ + "31387684544461172804554451", + "10151792381550630822176989", + "77208445623221904232805740" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "10921238348294395002880", + "27083086494636229787648", + "21781314880576157646848" + ], + "expectedQty": "60962607228789724009638", + "reserves": [ + "31398605782809467199557331", + "10178875468045267051964637", + "77230226938102480390452588" + ], + "mAssetSupply": "118319487571064740900657347" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "920056283400405909504", + "outputIndex": 2, + "expectedQty": "982895055543740214082", + "swapFee": "581880383743086654", + "reserves": [ + "31398605782809467199557331", + "10179795524328667457874141", + "77229244043046936650238506" + ], + "mAssetSupply": "118319488152945124643744001", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "166417381396583538491392", + "expectedQty": "168660846187108284714341", + "swapFee": "99850428837950123094", + "reserves": [ + "31398605782809467199557331", + "10179795524328667457874141", + "77060583196859828365524165" + ], + "mAssetSupply": "118153170621977379055375703" + }, + { + "type": "redeemMasset", + "inputQty": "172783681206175334", + "expectedQtys": [ + "45902611951396389", + "14882164097669995", + "112657296687052032" + ], + "redemptionFee": "51835104361852", + "reserves": [ + "31398605736906855248160942", + "10179795509446503360204146", + "77060583084202531678472133" + ], + "mAssetSupply": "118153170449245532953562221" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "10133294006329342427136", + "10957080096376560287744", + "2961021832539556806656" + ], + "expectedQty": "24612249849792307205668", + "swapFee": "14776215639258939687", + "reserves": [ + "31388472442900525905733806", + "10168838429350126799916402", + "77057622062369992121665477" + ], + "mAssetSupply": "118128558199395740646356553" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "20132389022629554552832", + "expectedQty": "20097704693154744310995", + "swapFee": "12079433413577732731", + "reserves": [ + "31368374738207371161422811", + "10168838429350126799916402", + "77057622062369992121665477" + ], + "mAssetSupply": "118108437889806524669536452" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "86169483511081004433408", + "970211308867910071484416", + "1094252584268444532211712" + ], + "expectedQty": "2191992363539057651613216", + "swapFee": "1315985009128911938130", + "reserves": [ + "31282205254696290156989403", + "9198627120482216728431986", + "75963369478101547589453765" + ], + "mAssetSupply": "115916445526267467017923236" + }, + { + "type": "redeemMasset", + "inputQty": "7636405505340299699814", + "expectedQtys": [ + "2060207576764452489548", + "605810272490408273251", + "5002854117257206692787" + ], + "redemptionFee": "2290921651602089909", + "reserves": [ + "31280145047119525704499855", + "9198021310209726320158735", + "75958366623984290382760978" + ], + "mAssetSupply": "115908811411683778320313331" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "594542116122802595561472", + "expectedQty": "630376700299902034440949", + "reserves": [ + "31280145047119525704499855", + "9792563426332528915720207", + "75958366623984290382760978" + ] + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "2010644990490880245760", + "expectedQty": "1901698819101343120585", + "swapFee": "1206386994294528147", + "reserves": [ + "31280145047119525704499855", + "9790661727513427572599622", + "75958366623984290382760978" + ], + "mAssetSupply": "116537178673380183769036667" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "139189078071396580458496", + "264336092967047159349248", + "201658583219534456422400" + ], + "expectedQty": "617761401049604358486265", + "swapFee": "370879368250713042917", + "reserves": [ + "31140955969048129124041359", + "9526325634546380413250374", + "75756708040764755926338578" + ], + "mAssetSupply": "115919417272330579410550402" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "854371865999489852506112", + "expectedQty": "866290936869690781771111", + "swapFee": "512623119599693911503", + "reserves": [ + "31140955969048129124041359", + "9526325634546380413250374", + "74890417103895065144567467" + ], + "mAssetSupply": "115065558029450689251955793" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "79509037328035678781440", + "outputIndex": 2, + "expectedQty": "80654456245357623099056", + "swapFee": "47733442241239137125", + "reserves": [ + "31220465006376164802822799", + "9526325634546380413250374", + "74809762647649707521468411" + ], + "mAssetSupply": "115065605762892930491092918", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "1567501682185893576704", + "expectedQty": "1565701001600117401882", + "swapFee": "940501009311536146", + "reserves": [ + "31218899305374564685420917", + "9526325634546380413250374", + "74809762647649707521468411" + ], + "mAssetSupply": "115064039201711753909052360" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "6257746659926574080", + "expectedQty": "6344106268710904121", + "swapFee": "3754647995955944", + "reserves": [ + "31218899305374564685420917", + "9526325634546380413250374", + "74809756303543438810564290" + ], + "mAssetSupply": "115064032947719741978434224" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "257253855918718780964864", + "expectedQty": "242611675672189708463531", + "swapFee": "154352313551231268578", + "reserves": [ + "31218899305374564685420917", + "9283713958874190704786843", + "74809756303543438810564290" + ], + "mAssetSupply": "114806933444114574428737938" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "845102776332848663101440", + "387346967575549595090944", + "9408995382391741612032" + ], + "expectedQty": "1266924020500229669536695", + "swapFee": "760610778767398240666", + "reserves": [ + "30373796529041716022319477", + "8896366991298641109695899", + "74800347308161047068952258" + ], + "mAssetSupply": "113540009423614344759201243" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "537247875544467636224", + "outputIndex": 1, + "expectedQty": "503958682106301198781", + "swapFee": "322608085534269304", + "reserves": [ + "30374333776917260489955701", + "8895863032616534808497118", + "74800347308161047068952258" + ], + "mAssetSupply": "113540009746222430293470547", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "2759362974947603968", + "expectedQty": "2800559853635845313", + "swapFee": "1655617784968562", + "reserves": [ + "30374333776917260489955701", + "8895863032616534808497118", + "74800344507601193433106945" + ], + "mAssetSupply": "113540006988515073130835141" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "13098295161218408", + "5944395687809316", + "15312841043335254" + ], + "expectedQty": "34525732705615033", + "swapFee": "20727876349178", + "reserves": [ + "30374333763818965328737293", + "8895863026672139120687802", + "74800344492288352389771691" + ], + "mAssetSupply": "113540006953989340425220108" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "1088563140000602545717248", + "expectedQty": "1104645909237030954716331", + "swapFee": "653137884000361527430", + "reserves": [ + "30374333763818965328737293", + "8895863026672139120687802", + "73695698583051321435055360" + ], + "mAssetSupply": "112452096951872738241030290" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "896750231287429578358784", + "expectedQty": "909745858525157867405586", + "swapFee": "538050138772457747015", + "reserves": [ + "30374333763818965328737293", + "8895863026672139120687802", + "72785952724526163567649774" + ], + "mAssetSupply": "111555884770724081120418521" + }, + { + "type": "redeemMasset", + "inputQty": "1737944182396113282662", + "expectedQtys": [ + "473063882720767893568", + "138548273561228329499", + "1133601996709784447056" + ], + "redemptionFee": "521383254718833984", + "reserves": [ + "30373860699936244560843725", + "8895724478398577892358303", + "72784819122529453783202718" + ], + "mAssetSupply": "111554147347924939725969843" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "9561675194357522628608", + "expectedQty": "9565382280803726122776", + "reserves": [ + "30383422375130602083472333", + "8895724478398577892358303", + "72784819122529453783202718" + ] + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "4065695337027333097783296", + "expectedQty": "4056100898209061808822629", + "swapFee": "2439417202216399858669", + "reserves": [ + "26327321476921540274649704", + "8895724478398577892358303", + "72784819122529453783202718" + ], + "mAssetSupply": "107500456810380626754167992" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "16145827498144598016", + "expectedQty": "16393717408614076672", + "swapFee": "9687496498886758", + "reserves": [ + "26327321476921540274649704", + "8895724478398577892358303", + "72784802728812045169126046" + ], + "mAssetSupply": "107500440674240625108456734" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "67057896546716933423104", + "expectedQty": "66003620321442855931892", + "reserves": [ + "26327321476921540274649704", + "8895724478398577892358303", + "72851860625358762102549150" + ] + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "3413788897316559382380544", + "expectedQty": "3464479473815505910776026", + "swapFee": "2048273338389935629428", + "reserves": [ + "26327321476921540274649704", + "8895724478398577892358303", + "69387381151543256191773124" + ], + "mAssetSupply": "104154703670583898517637510" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "957712219336033139949568", + "expectedQty": "943484081927814340747964", + "reserves": [ + "26327321476921540274649704", + "8895724478398577892358303", + "70345093370879289331722692" + ] + }, + { + "type": "redeemMasset", + "inputQty": "166010280488688716", + "expectedQtys": [ + "41573455589754760", + "14047232524796952", + "111081889503077671" + ], + "redemptionFee": "49803084146606", + "reserves": [ + "26327321435348084684894944", + "8895724464351345367561351", + "70345093259797399828645021" + ], + "mAssetSupply": "105098187586551235453843364" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "298842667838104041160704", + "285893150990353083400192", + "162454661579501530513408" + ], + "expectedQty": "762576890940966166135081", + "swapFee": "457820827060816189394", + "reserves": [ + "26028478767509980643734240", + "8609831313360992284161159", + "70182638598217898298131613" + ], + "mAssetSupply": "104335610695610269287708283" + }, + { + "type": "redeemMasset", + "inputQty": "458729800143357271972249", + "expectedQtys": [ + "114404437486066870357316", + "37843276092051811862161", + "308477700976496937296165" + ], + "redemptionFee": "137618940043007181591", + "reserves": [ + "25914074330023913773376924", + "8571988037268940472298998", + "69874160897241401360835448" + ], + "mAssetSupply": "103877018514406955022917625" + }, + { + "type": "mintMulti", + "inputQtys": [ + "43117736117170020352", + "38257893882384777216", + "63280366597653225472" + ], + "expectedQty": "146146241691718244751", + "reserves": [ + "25914117447760030943397276", + "8572026295162822857076214", + "69874224177607999014060920" + ], + "mAssetSupply": "103877164660648646741162376" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "187728185574434415837184", + "114889346157480113078272", + "155964163576378607796224" + ], + "expectedQty": "463814894074578714897330", + "swapFee": "278456010050777695555", + "reserves": [ + "25726389262185596527560092", + "8457136949005342743997942", + "69718260014031620406264696" + ], + "mAssetSupply": "103413349766574068026265046" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "1654718360910802049826816", + "expectedQty": "1679618969089870744869405", + "swapFee": "992831016546481229896", + "reserves": [ + "25726389262185596527560092", + "8457136949005342743997942", + "68038641044941749661395291" + ], + "mAssetSupply": "101759624236679812457668126" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "3755346316712735670272", + "expectedQty": "3540538246400100443633", + "swapFee": "2253207790027641402", + "reserves": [ + "25726389262185596527560092", + "8453596410758942643554309", + "68038641044941749661395291" + ], + "mAssetSupply": "101755871143570889749639256" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "774842690711497610362880", + "71956687195008418185216", + "490290841492869481496576" + ], + "expectedQty": "1335969978839202058693185", + "swapFee": "802063225238664433876", + "reserves": [ + "24951546571474098917197212", + "8381639723563934225369093", + "67548350203448880179898715" + ], + "mAssetSupply": "100419901164731687690946071" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "12272564773183154176", + "62260424419195953152", + "13962974007395260416" + ], + "expectedQty": "92054658623955435920", + "swapFee": "55265954747221594", + "reserves": [ + "24951534298909325734043036", + "8381577463139515029415941", + "67548336240474872784638299" + ], + "mAssetSupply": "100419809110073063735510151" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "551643453634229764096", + "2406397177195264475136", + "2010566580778046324736" + ], + "expectedQty": "5083834687285378304166", + "swapFee": "3052132091626202704", + "reserves": [ + "24950982655455691504278940", + "8379171065962319764940805", + "67546325673894094738313563" + ], + "mAssetSupply": "100414725275385778357205985" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "1544628980938753179648000", + "expectedQty": "1439511744463730612632038", + "swapFee": "926777388563251907788", + "reserves": [ + "24950982655455691504278940", + "6939659321498589152308767", + "67546325673894094738313563" + ], + "mAssetSupply": "98871023071835588429465773" + }, + { + "type": "mintMulti", + "inputQtys": [ + "17810042120810302275584", + "25804828053418564124672", + "26728130624120716001280" + ], + "expectedQty": "72141657958819715077497", + "reserves": [ + "24968792697576501806554524", + "6965464149552007716433439", + "67573053804518215454314843" + ], + "mAssetSupply": "98943164729794408144543270" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "5673812833990856425865216", + "expectedQty": "5945396441712246030073660", + "reserves": [ + "24968792697576501806554524", + "12639276983542864142298655", + "67573053804518215454314843" + ] + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "202935588427358332256256", + "outputIndex": 1, + "expectedQty": "198286958772252339557022", + "swapFee": "122217894405430353960", + "reserves": [ + "25171728286003860138810780", + "12440990024770611802741633", + "67573053804518215454314843" + ], + "mAssetSupply": "104888683389401059604970890", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemBassets", + "inputQtys": [ + "204022085408937508864", + "191195351816005287936", + "249661184687876243456" + ], + "expectedQty": "648121597751739452775", + "swapFee": "389106422504546399", + "reserves": [ + "25171524263918451201301916", + "12440798829418795797453697", + "67572804143333527578071387" + ], + "mAssetSupply": "104888035267803307865518115" + }, + { + "type": "redeemMasset", + "inputQty": "16940935803941356", + "expectedQtys": [ + "4064345821722721", + "2008766263460675", + "10910711695585351" + ], + "redemptionFee": "5082280741182", + "reserves": [ + "25171524259854105379579195", + "12440798827410029533993022", + "67572804132422815882486036" + ], + "mAssetSupply": "104888035250867454342317941" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "6584736060345617408", + "6686867069771841536", + "9637915231941527552" + ], + "expectedQty": "23011197288614034487", + "swapFee": "13815007377594977", + "reserves": [ + "25171517675118045033961787", + "12440792140542959762151486", + "67572794494507583940958484" + ], + "mAssetSupply": "104888012239670165728283454" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "343538798447212743360512", + "expectedQty": "352592102033241757714117", + "reserves": [ + "25171517675118045033961787", + "12784330938990172505511998", + "67572794494507583940958484" + ] + }, + { + "type": "redeemMasset", + "inputQty": "114808154763211046912", + "expectedQtys": [ + "27451652775011350074", + "13942385931099690771", + "73693804062282136814" + ], + "redemptionFee": "34442446428963314", + "reserves": [ + "25171490223465270022611713", + "12784316996604241405821227", + "67572720800703521658821670" + ], + "mAssetSupply": "105240489567991090703913973" + }, + { + "type": "mintMulti", + "inputQtys": [ + "4262427700148704903168", + "5269600485736919859200", + "143898708998151503872" + ], + "expectedQty": "9825165301287665116538", + "reserves": [ + "25175752651165418727514881", + "12789586597089978325680427", + "67572864699412519810325542" + ], + "mAssetSupply": "105250314733292378369030511" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "20278654878502957056", + "2085290369955585792", + "15657592871378061312" + ], + "expectedQty": "37985824857364070602", + "swapFee": "22805178021231181", + "reserves": [ + "25175732372510540224557825", + "12789584511799608370094635", + "67572849041819648432264230" + ], + "mAssetSupply": "105250276747467521004959909" + }, + { + "type": "redeemMasset", + "inputQty": "5316713732383425", + "expectedQtys": [ + "1271369639247509", + "645871556239088", + "3412415870889625" + ], + "redemptionFee": "1595014119715", + "reserves": [ + "25175732371239170585310316", + "12789584511153736813855547", + "67572849038407232561374605" + ], + "mAssetSupply": "105250276742152402286696199" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "6352979602943789498368", + "5229007535396237606912", + "22908230780894259970048" + ], + "expectedQty": "34407410023925637145528", + "swapFee": "20656840118426438150", + "reserves": [ + "25169379391636226795811948", + "12784355503618340576248635", + "67549940807626338301404557" + ], + "mAssetSupply": "105215869332128476649550671" + }, + { + "type": "redeemMasset", + "inputQty": "7897252031008963192422", + "expectedQtys": [ + "1888586798753949631647", + "959275342431929838136", + "5068616292870795628575" + ], + "redemptionFee": "2369175609302688957", + "reserves": [ + "25167490804837472846180301", + "12783396228275908646410499", + "67544872191333467505775982" + ], + "mAssetSupply": "105207974449273076989047206" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "741817384643919", + "outputIndex": 1, + "expectedQty": "715283672293313", + "swapFee": "440423448983", + "reserves": [ + "25167490804837472846180301", + "12783396227560624974117186", + "67544872192075284890419901" + ], + "mAssetSupply": "105207974449273517412496189", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "1376901803365957090934784", + "expectedQty": "1408603568405759788063561", + "reserves": [ + "25167490804837472846180301", + "14160298030926582065051970", + "67544872192075284890419901" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "144655481406425242009600", + "145186424306710962241536", + "136560503866393926565888" + ], + "expectedQty": "428642686285962951381489", + "reserves": [ + "25312146286243898088189901", + "14305484455233293027293506", + "67681432695941678816985789" + ], + "mAssetSupply": "107045220703965240151941239" + }, + { + "type": "redeemMasset", + "inputQty": "309656940817694928666624", + "expectedQtys": [ + "73200188746984837792692", + "41370026484448097521056", + "195727916233706934330226" + ], + "redemptionFee": "92897082245308478599", + "reserves": [ + "25238946097496913250397209", + "14264114428748844929772450", + "67485704779707971882655563" + ], + "mAssetSupply": "106735656660229790531753214" + }, + { + "type": "mintMulti", + "inputQtys": [ + "285096903590647194189824", + "51168730754489908199424", + "38839653265167123218432" + ], + "expectedQty": "376860914226791512903191", + "reserves": [ + "25524043001087560444587033", + "14315283159503334837971874", + "67524544432973139005873995" + ], + "mAssetSupply": "107112517574456582044656405" + }, + { + "type": "redeemMasset", + "inputQty": "12367633945113711031091", + "expectedQtys": [ + "2946222590755892259777", + "1652403211975431229484", + "7794311356960521448722" + ], + "redemptionFee": "3710290183534113309", + "reserves": [ + "25521096778496804552327256", + "14313630756291359406742390", + "67516750121616178484425273" + ], + "mAssetSupply": "107100153650801651867738623" + }, + { + "type": "mintMulti", + "inputQtys": [ + "1816473262289125376000", + "2742952325256498905088", + "1106873487228870197248" + ], + "expectedQty": "5718196628859635739690", + "reserves": [ + "25522913251759093677703256", + "14316373708616615905647478", + "67517856995103407354622521" + ], + "mAssetSupply": "107105871847430511503478313" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "1587869796399436529664", + "expectedQty": "1602011627644428084750", + "swapFee": "952721877839661917", + "reserves": [ + "25522913251759093677703256", + "14316373708616615905647478", + "67516254983475762926537771" + ], + "mAssetSupply": "107104284930355989906610566" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "5325787558621933691994112", + "1239586395501745301094400", + "813117633430782910398464" + ], + "expectedQty": "7426833172043842048704223", + "swapFee": "4458775168327301610188", + "reserves": [ + "20197125693137159985709144", + "13076787313114870604553078", + "66703137350044980016139307" + ], + "mAssetSupply": "99677451758312147857906343" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "2296185939876863906152448", + "expectedQty": "2231644250754880456811239", + "swapFee": "1377711563926118343691", + "reserves": [ + "20197125693137159985709144", + "10845143062359990147741839", + "66703137350044980016139307" + ], + "mAssetSupply": "97382643529999210070097586" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "985581892365210880049152", + "2635462952570872263606272", + "2218815208263845765185536" + ], + "expectedQty": "5930625710436754625757825", + "swapFee": "3560511733302033995852", + "reserves": [ + "19211543800771949105659992", + "8209680109789117884135567", + "64484322141781134250953771" + ], + "mAssetSupply": "91452017819562455444339761" + }, + { + "type": "mintMulti", + "inputQtys": [ + "28580199972992913408", + "123737913577706881024", + "148947048347462139904" + ], + "expectedQty": "305996583578620405939", + "reserves": [ + "19211572380971922098573400", + "8209803847702695591016591", + "64484471088829481713093675" + ], + "mAssetSupply": "91452323816146034064745700" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "108461150261307104034816", + "expectedQty": "107481657726352475899352", + "swapFee": "65076690156784262420", + "reserves": [ + "19104090723245569622674048", + "8209803847702695591016591", + "64484471088829481713093675" + ], + "mAssetSupply": "91343927742574883744973304" + }, + { + "type": "mintMulti", + "inputQtys": [ + "21739348216411328610304", + "22598482150076935307264", + "19861194199463526137856" + ], + "expectedQty": "65324904289386275479312", + "reserves": [ + "19125830071461980951284352", + "8232402329852772526323855", + "64504332283028945239231531" + ], + "mAssetSupply": "91409252646864270020452616" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "98296082500061725982720", + "expectedQty": "97395204267333832995106", + "swapFee": "58977649500037035589", + "reserves": [ + "19028434867194647118289246", + "8232402329852772526323855", + "64504332283028945239231531" + ], + "mAssetSupply": "91311015542013708331505485" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "18244772740616882749440", + "38157792969142019555328", + "34927025411753070559232" + ], + "expectedQty": "93053541586532935974613", + "swapFee": "55865644338522875309", + "reserves": [ + "19010190094454030235539806", + "8194244536883630506768527", + "64469405257617192168672299" + ], + "mAssetSupply": "91217962000427175395530872" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "57208254955777186332672", + "7172387645558351724544", + "19160398773621731885056" + ], + "expectedQty": "84126655184724552125890", + "swapFee": "50506296888968112142", + "reserves": [ + "18952981839498253049207134", + "8187072149238072155043983", + "64450244858843570436787243" + ], + "mAssetSupply": "91133835345242450843404982" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "63139573791241172680704", + "expectedQty": "62073091871218748533607", + "reserves": [ + "18952981839498253049207134", + "8187072149238072155043983", + "64513384432634811609467947" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "314458551849212939599872", + "46084257695147799609344", + "294439903586013753114624" + ], + "expectedQty": "655451921653132420261184", + "swapFee": "393507257346287224491", + "reserves": [ + "18638523287649040109607262", + "8140987891542924355434639", + "64218944529048797856353323" + ], + "mAssetSupply": "90540456515460537171677405" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "68502155728304872620032", + "expectedQty": "72371192470769347510674", + "reserves": [ + "18638523287649040109607262", + "8209490047271229228054671", + "64218944529048797856353323" + ] + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "5002262370653518574911488", + "expectedQty": "5031312639644029680138120", + "reserves": [ + "23640785658302558684518750", + "8209490047271229228054671", + "64218944529048797856353323" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "1441584988085718351872", + "1267118810591310905344", + "1457834187661001097216" + ], + "expectedQty": "4220741939022454272836", + "reserves": [ + "23642227243290644402870622", + "8210757166081820538960015", + "64220402363236458857450539" + ], + "mAssetSupply": "95648361089514358653599035" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "27706403106966414032896", + "expectedQty": "29267658259038570117641", + "reserves": [ + "23642227243290644402870622", + "8238463569188786952992911", + "64220402363236458857450539" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "3461434571172", + "9805728355668", + "21869657464013" + ], + "expectedQty": "35371816761997", + "reserves": [ + "23642227243294105837441794", + "8238463569198592681348579", + "64220402363258328514914552" + ], + "mAssetSupply": "95677628747808769040478673" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "111351439574920176", + "expectedQty": "117605079463975687", + "reserves": [ + "23642227243294105837441794", + "8238463680550032256268755", + "64220402363258328514914552" + ] + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "15270304468860191899648", + "expectedQty": "15042489231917660093351", + "reserves": [ + "23642227243294105837441794", + "8238463680550032256268755", + "64235672667727188706814200" + ] + }, + { + "type": "redeemMasset", + "inputQty": "5777377222433310140006", + "expectedQtys": [ + "1426954501430808256738", + "497242189276796937760", + "3877019763087174103916" + ], + "redemptionFee": "1733213166729993042", + "reserves": [ + "23640800288792675029185056", + "8237966438360755459330995", + "64231795647964101532710284" + ], + "mAssetSupply": "95686895710636499584400747" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "66711964280634321403904", + "expectedQty": "67681095336690715078511", + "swapFee": "40027178568380592842", + "reserves": [ + "23640800288792675029185056", + "8237966438360755459330995", + "64164114552627410817631773" + ], + "mAssetSupply": "95620223773534433643589685" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "2120430632892085896740864", + "expectedQty": "2214968651106262236338004", + "reserves": [ + "23640800288792675029185056", + "10358397071252841356071859", + "64164114552627410817631773" + ] + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "15424574776890832", + "expectedQty": "14888354056431957", + "swapFee": "9254744866134", + "reserves": [ + "23640800288792675029185056", + "10358397056364487299639902", + "64164114552627410817631773" + ], + "mAssetSupply": "97835192409225375847902991" + }, + { + "type": "redeemMasset", + "inputQty": "11380154458658419664486", + "expectedQtys": [ + "2749064435833339620947", + "1204523561471472355249", + "7461307706109498753061" + ], + "redemptionFee": "3414046337597525899", + "reserves": [ + "23638051224356841689564109", + "10357192532803015827284653", + "64156653244921301318878712" + ], + "mAssetSupply": "97823815668813055025764404" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "1084274245494199418880", + "220382149221905024", + "1432610166708321910784" + ], + "expectedQty": "2503575985689794380395", + "swapFee": "1503047419865796105", + "reserves": [ + "23636966950111347490145229", + "10357192312420866605379629", + "64155220634754592996967928" + ], + "mAssetSupply": "97821312092827365231384009" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "80744595945100037586944", + "expectedQty": "79763874531616511553778", + "reserves": [ + "23636966950111347490145229", + "10357192312420866605379629", + "64235965230699693034554872" + ] + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "482750106754172795748352", + "expectedQty": "480649316197571457239272", + "swapFee": "289650064052503677449", + "reserves": [ + "23156317633913776032905957", + "10357192312420866605379629", + "64235965230699693034554872" + ], + "mAssetSupply": "97418615510668861450866884" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "8750150867363661086720", + "7161285660838535888896", + "1711609966343560101888" + ], + "expectedQty": "17890283499235692065630", + "swapFee": "10740614468222348648", + "reserves": [ + "23147567483046412371819237", + "10350031026760028069490733", + "64234253620733349474452984" + ], + "mAssetSupply": "97400725227169625758801254" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "355363882739287443111936", + "467211495016878800109568", + "147434634388775087636480" + ], + "expectedQty": "986889028022528837586071", + "swapFee": "592488910159613070393", + "reserves": [ + "22792203600307124928707301", + "9882819531743149269381165", + "64086818986344574386816504" + ], + "mAssetSupply": "96413836199147096921215183" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "942135012413956423680", + "expectedQty": "953844734796952928395", + "swapFee": "565281007448373854", + "reserves": [ + "22792203600307124928707301", + "9882819531743149269381165", + "64085865141609777433888109" + ], + "mAssetSupply": "96412894629415690413165357" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "18615132795366072", + "expectedQty": "18692437584250711", + "reserves": [ + "22792203618922257724073373", + "9882819531743149269381165", + "64085865141609777433888109" + ] + }, + { + "type": "redeemMasset", + "inputQty": "21854292052413232", + "expectedQtys": [ + "5164848996403886", + "2239505727203481", + "14522238472173203" + ], + "redemptionFee": "6556287615723", + "reserves": [ + "22792203613757408727669487", + "9882819529503643542177684", + "64085865127087538961714906" + ], + "mAssetSupply": "96412894626260392232618559" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "524652259974761500639232", + "expectedQty": "531132940008893887120511", + "swapFee": "314791355984856900383", + "reserves": [ + "22792203613757408727669487", + "9882819529503643542177684", + "63554732187078645074594395" + ], + "mAssetSupply": "95888557157641615588879710" + }, + { + "type": "mintMulti", + "inputQtys": [ + "372740761046860890112", + "283195160233551134720", + "89014665539208708096" + ], + "expectedQty": "756084621271363329338", + "reserves": [ + "22792576354518455588559599", + "9883102724663877093312404", + "63554821201744184283302491" + ], + "mAssetSupply": "95889313242262886952209048" + }, + { + "type": "redeemMasset", + "inputQty": "1118248741120286235033", + "expectedQtys": [ + "265724329675910016155", + "115220886212314833650", + "740945735963624701081" + ], + "redemptionFee": "335474622336085870", + "reserves": [ + "22792310630188779678543444", + "9882987503777664778478754", + "63554080256008220658601410" + ], + "mAssetSupply": "95888195328996389002059885" + }, + { + "type": "redeemMasset", + "inputQty": "119918223946317736339046", + "expectedQtys": [ + "28495618642179459885595", + "12356002316854213018688", + "79457184640637617148075" + ], + "redemptionFee": "35975467183895320901", + "reserves": [ + "22763815011546600218657849", + "9870631501460810565460066", + "63474623071367583041453335" + ], + "mAssetSupply": "95768313080517255161041740" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "538564176199307470307328", + "expectedQty": "535967567046691589502270", + "swapFee": "323138505719584482184", + "reserves": [ + "22227847444499908629155579", + "9870631501460810565460066", + "63474623071367583041453335" + ], + "mAssetSupply": "95230072042823667275216596" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "3871335050819491332096", + "expectedQty": "3888707527351852653416", + "reserves": [ + "22231718779550728120487675", + "9870631501460810565460066", + "63474623071367583041453335" + ] + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "7453160490604072745828352", + "outputIndex": 1, + "hardLimitError": true + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "986816595833183182782464", + "expectedQty": "981350798370896605150316", + "swapFee": "592089957499909909669", + "reserves": [ + "21250367981179831515337359", + "9870631501460810565460066", + "63474623071367583041453335" + ], + "mAssetSupply": "94247736244475335854997217" + }, + { + "type": "mintMulti", + "inputQtys": [ + "154663730497521859952640", + "185270240107290511278080", + "146378191007780417044480" + ], + "expectedQty": "492125175698968032117928", + "reserves": [ + "21405031711677353375289999", + "10055901741568101076738146", + "63621001262375363458497815" + ], + "mAssetSupply": "94739861420174303887115145" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "578586702690659532800", + "13017104253454081064960", + "10806554025665964802048" + ], + "expectedQty": "24741851651717971336312", + "swapFee": "14854023405073827098", + "reserves": [ + "21404453124974662715757199", + "10042884637314646995673186", + "63610194708349697493695767" + ], + "mAssetSupply": "94715119568522585915778833" + }, + { + "type": "mintMulti", + "inputQtys": [ + "1058409969068", + "97640118712725", + "82404876522112" + ], + "expectedQty": "183619296875333", + "reserves": [ + "21404453124975721125726267", + "10042884637412287114385911", + "63610194708432102370217879" + ], + "mAssetSupply": "94715119568706205212654166" + }, + { + "type": "mintMulti", + "inputQtys": [ + "702077249562404716544", + "417263372350051188736", + "658191736546547728384" + ], + "expectedQty": "1788059002395080803337", + "reserves": [ + "21405155202225283530442811", + "10043301900784637165574647", + "63610852900168648917946263" + ], + "mAssetSupply": "94716907627708600293457503" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "1006347084402976272416768", + "expectedQty": "1018816944599222988818825", + "swapFee": "603808250641785763450", + "reserves": [ + "21405155202225283530442811", + "10043301900784637165574647", + "62592035955569425929127438" + ], + "mAssetSupply": "93711164351556265806804185" + }, + { + "type": "mintMulti", + "inputQtys": [ + "65086422858803718389760", + "56309836601538021163008", + "75958516347049208709120" + ], + "expectedQty": "198712245667756481524567", + "reserves": [ + "21470241625084087248832571", + "10099611737386175186737655", + "62667994471916475137836558" + ], + "mAssetSupply": "93909876597224022288328752" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "631866439261200640", + "expectedQty": "654117053127784114", + "reserves": [ + "21470241625084087248832571", + "10099612369252614447938295", + "62667994471916475137836558" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "111406507613788758343680", + "212865043118730365632512", + "291872816391988357103616" + ], + "expectedQty": "620612980033016524499452", + "swapFee": "372591342825505217830", + "reserves": [ + "21358835117470298490488891", + "9886747326133884082305783", + "62376121655524486780732942" + ], + "mAssetSupply": "93289264271308058891613414" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "52279412004033772126208", + "260678656052695960387584", + "783015089803718786285568" + ], + "expectedQty": "1095796151591746303594416", + "swapFee": "657872414403689996154", + "reserves": [ + "21306555705466264718362683", + "9626068670081188121918199", + "61593106565720767994447374" + ], + "mAssetSupply": "92193468119716312588018998" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "669390619969088932282368", + "60736262883670837166080", + "1098823339198344415150080" + ], + "expectedQty": "1820331744153601643574772", + "swapFee": "1092854759347769647933", + "reserves": [ + "20637165085497175786080315", + "9565332407197517284752119", + "60494283226522423579297294" + ], + "mAssetSupply": "90373136375562710944444226" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "672255465722120952086528", + "expectedQty": "663537767509788101650983", + "reserves": [ + "20637165085497175786080315", + "9565332407197517284752119", + "61166538692244544531383822" + ] + }, + { + "type": "redeemMasset", + "inputQty": "2256693992143493215027", + "expectedQtys": [ + "511418012264003499774", + "237042407039288277712", + "1515792964075295592255" + ], + "redemptionFee": "677008197643047964", + "reserves": [ + "20636653667484911782580541", + "9565095364790477996474407", + "61165022899280469235791567" + ], + "mAssetSupply": "91034418126088553195928146" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "60675761042815492096", + "outputIndex": 2, + "expectedQty": "61768004096042447042", + "swapFee": "36598414852690242", + "reserves": [ + "20636714343245954598072637", + "9565095364790477996474407", + "61164961131276373193344525" + ], + "mAssetSupply": "91034418162686968048618388", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemMasset", + "inputQty": "473675814660261963366", + "expectedQtys": [ + "107345992229453392297", + "49754754348229139567", + "318161764179368569318" + ], + "redemptionFee": "142102744398078589", + "reserves": [ + "20636606997253725144680340", + "9565045610036129767334840", + "61164642969512193824775207" + ], + "mAssetSupply": "91033944628975052184733611" + }, + { + "type": "mintMulti", + "inputQtys": [ + "1678664722112873496576", + "1009819508001989853184", + "199544037012902576128" + ], + "expectedQty": "2932069066450088301726", + "reserves": [ + "20638285661975838018176916", + "9566055429544131757188024", + "61164842513549206727351335" + ], + "mAssetSupply": "91036876698041502273035337" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "24685776407297448214528", + "23659809972736095158272", + "29042956749853058662400" + ], + "expectedQty": "78025808245887959058205", + "swapFee": "46843591102194091890", + "reserves": [ + "20613599885568540569962388", + "9542395619571395662029752", + "61135799556799353668688935" + ], + "mAssetSupply": "90958850889795614313977132" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "125571340599028436959232", + "expectedQty": "123924574869005852501901", + "reserves": [ + "20613599885568540569962388", + "9542395619571395662029752", + "61261370897398382105648167" + ] + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "373040461882718116904960", + "expectedQty": "370755700611772067431157", + "swapFee": "223824277129630870142", + "reserves": [ + "20242844184956768502531231", + "9542395619571395662029752", + "61261370897398382105648167" + ], + "mAssetSupply": "90709958827059031680444215" + }, + { + "type": "redeemMasset", + "inputQty": "126046817616187", + "expectedQtys": [ + "28120182813118", + "13255741478109", + "85100736501115" + ], + "redemptionFee": "37814045284", + "reserves": [ + "20242844184928648319718113", + "9542395619558139920551643", + "61261370897313281369147052" + ], + "mAssetSupply": "90709958826933022676873312" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "1509577239302972851093504", + "340491191377992464990208", + "153340285787670637969408" + ], + "expectedQty": "2024569303397664649753087", + "swapFee": "1215470864557333189765", + "reserves": [ + "18733266945625675468624609", + "9201904428180147455561435", + "61108030611525610731177644" + ], + "mAssetSupply": "88685389523535358027120225" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "18671341295650616639488", + "expectedQty": "18405465544445867824863", + "reserves": [ + "18733266945625675468624609", + "9201904428180147455561435", + "61126701952821261347817132" + ] + }, + { + "type": "redeemMasset", + "inputQty": "416023761954816760217", + "expectedQtys": [ + "87833289929992770956", + "43144292017744313824", + "286600268424621351311" + ], + "redemptionFee": "124807128586445028", + "reserves": [ + "18733179112335745475853653", + "9201861283888129711247611", + "61126415352552836726465821" + ], + "mAssetSupply": "88703379090124977664629899" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "844586944196936223162368", + "430821615746187597447168", + "227045200402491660828672" + ], + "expectedQty": "1524148747721700139455039", + "swapFee": "915038271595977670275", + "reserves": [ + "17888592168138809252691285", + "8771039668141942113800443", + "60899370152150345065637149" + ], + "mAssetSupply": "87179230342403277525174860" + }, + { + "type": "mintMulti", + "inputQtys": [ + "14219310646815112", + "7284808991408597", + "2103871281023788" + ], + "expectedQty": "24021638740920979", + "reserves": [ + "17888592182358119899506397", + "8771039675426751105209040", + "60899370154254216346660937" + ], + "mAssetSupply": "87179230366424916266095839" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "1118374222559735185408", + "expectedQty": "1107971149097214967407", + "swapFee": "671024533535841111", + "reserves": [ + "17887484211209022684538990", + "8771039675426751105209040", + "60899370154254216346660937" + ], + "mAssetSupply": "87178112663226890066751542" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "3856323109017280705462272", + "expectedQty": "3805918550529175549132887", + "swapFee": "2313793865410368423277", + "reserves": [ + "14081565660679847135406103", + "8771039675426751105209040", + "60899370154254216346660937" + ], + "mAssetSupply": "83324103348075019729712547" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "2430282890132477952", + "expectedQty": "2387180586719107433", + "swapFee": "1458169734079486", + "reserves": [ + "14081563273499260416298670", + "8771039675426751105209040", + "60899370154254216346660937" + ], + "mAssetSupply": "83324100919250299331314081" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "1867869839799173861343232", + "outputIndex": 1, + "expectedQty": "1794210686108153831648798", + "swapFee": "1137327165415340125258", + "reserves": [ + "15949433113298434277641902", + "6976828989318597273560242", + "60899370154254216346660937" + ], + "mAssetSupply": "83325238246415714671439339", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "88934435908030592", + "expectedQty": "87182446552815439", + "reserves": [ + "15949433113298434277641902", + "6976828989318597273560242", + "60899370243188652254691529" + ] + }, + { + "type": "redeemMasset", + "inputQty": "356298185311194060", + "expectedQtys": [ + "68179213914078909", + "29823926200116045", + "260327195427473019" + ], + "redemptionFee": "106889455593358", + "reserves": [ + "15949433045119220363562993", + "6976828959494671073444197", + "60899369982861456827218510" + ], + "mAssetSupply": "83325237977406865368654076" + }, + { + "type": "mintMulti", + "inputQtys": [ + "164539357730662547456", + "74612392360735358976", + "271934043929103073280" + ], + "expectedQty": "513128344111451779334", + "reserves": [ + "15949597584476951026110449", + "6976903571887031808803173", + "60899641916905385930291790" + ], + "mAssetSupply": "83325751105750976820433410" + }, + { + "type": "redeemMasset", + "inputQty": "48822662897617294747238", + "expectedQtys": [ + "9342468628740330328869", + "4086717699356833287080", + "35671934109732359831144" + ], + "redemptionFee": "14646798869285188424", + "reserves": [ + "15940255115848210695781580", + "6972816854187674975516093", + "60863969982795653570460646" + ], + "mAssetSupply": "83276943089652228810874596" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "14998216655207110017024", + "expectedQty": "15290377988015364772026", + "swapFee": "8998929993124266010", + "reserves": [ + "15940255115848210695781580", + "6972816854187674975516093", + "60848679604807638205688620" + ], + "mAssetSupply": "83261953871927014825123582" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "22820660422617188", + "outputIndex": 0, + "expectedQty": "24093210144053912", + "swapFee": "14654033953805", + "reserves": [ + "15940255091755000551727668", + "6972816877008335398133281", + "60848679604807638205688620" + ], + "mAssetSupply": "83261953871941668859077387", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mintMulti", + "inputQtys": [ + "114224540613168951459840", + "3956843548973155745792", + "107221760446538060922880" + ], + "expectedQty": "225055859227119754292061", + "reserves": [ + "16054479632368169503187508", + "6976773720557308553879073", + "60955901365254176266611500" + ], + "mAssetSupply": "83487009731168788613369448" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "251095049419669626683392", + "expectedQty": "233917498453212756697793", + "swapFee": "150657029651801776010", + "reserves": [ + "16054479632368169503187508", + "6742856222104095797181280", + "60955901365254176266611500" + ], + "mAssetSupply": "83236065338778770788462066" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "234217304586494968594432", + "outputIndex": 0, + "expectedQty": "247844001584037623291589", + "swapFee": "150759174968886718394", + "reserves": [ + "15806635630784131879895919", + "6977073526690590765775712", + "60955901365254176266611500" + ], + "mAssetSupply": "83236216097953739675180460", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "763687179066900507262976", + "expectedQty": "812193733133752113270667", + "reserves": [ + "15806635630784131879895919", + "7740760705757491273038688", + "60955901365254176266611500" + ] + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "37684514753810224", + "expectedQty": "37172291689612327", + "swapFee": "22610708852286", + "reserves": [ + "15806635593611840190283592", + "7740760705757491273038688", + "60955901365254176266611500" + ], + "mAssetSupply": "84048409793425587743493189" + }, + { + "type": "redeemMasset", + "inputQty": "554322521795819691048960", + "expectedQtys": [ + "104217861261815833250946", + "51037143262768913757352", + "401900431875610156138807" + ], + "redemptionFee": "166296756538745907314", + "reserves": [ + "15702417732350024357032646", + "7689723562494722359281336", + "60554000933378566110472693" + ], + "mAssetSupply": "83494253568386306798351543" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "4747645258423602176", + "expectedQty": "4832484319681501348", + "swapFee": "2848587155054161", + "reserves": [ + "15702417732350024357032646", + "7689723562494722359281336", + "60553996100894246428971345" + ], + "mAssetSupply": "83494248823589635529803528" + }, + { + "type": "redeemMasset", + "inputQty": "329524309696946", + "expectedQtys": [ + "61953681100188", + "30339702424162", + "238914989253408" + ], + "redemptionFee": "98857292909", + "reserves": [ + "15702417732288070675932458", + "7689723562464382656857174", + "60553996100655331439717937" + ], + "mAssetSupply": "83494248823260210077399491" + }, + { + "type": "mintMulti", + "inputQtys": [ + "1238139902429851593736192", + "1583405321252783563735040", + "1543276989509202178211840" + ], + "expectedQty": "4430636218198879843698633", + "reserves": [ + "16940557634717922269668650", + "9273128883717166220592214", + "62097273090164533617929777" + ], + "mAssetSupply": "87924885041459089921098124" + }, + { + "type": "mintMulti", + "inputQtys": [ + "690168431598612693123072", + "273441202270944479936512", + "542335459837611593433088" + ], + "expectedQty": "1515996774644914371498181", + "reserves": [ + "17630726066316534962791722", + "9546570085988110700528726", + "62639608550002145211362865" + ], + "mAssetSupply": "89440881816104004292596305" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "1589273652536153735168", + "495253939600886464512", + "1769296098221324500992" + ], + "expectedQty": "3862996601324347819159", + "swapFee": "2319189474479296269", + "reserves": [ + "17629136792663998809056554", + "9546074832048509814064214", + "62637839253903923886861873" + ], + "mAssetSupply": "89437018819502679944777146" + }, + { + "type": "redeemMasset", + "inputQty": "288643885725867565698252", + "expectedQtys": [ + "56878192612054834280389", + "30799209817935452391540", + "202093110274635327254163" + ], + "redemptionFee": "86593165717760269709", + "reserves": [ + "17572258600051943974776165", + "9515275622230574361672674", + "62435746143629288559607710" + ], + "mAssetSupply": "89148461526942530139348603" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "40452077711750111232", + "expectedQty": "38899916627330502718", + "swapFee": "24271246627050066", + "reserves": [ + "17572258600051943974776165", + "9515236722313947031169956", + "62435746143629288559607710" + ], + "mAssetSupply": "89148421099136065016287437" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "404561755761624200773632", + "expectedQty": "410367482809561433789525", + "swapFee": "242737053456974520464", + "reserves": [ + "17572258600051943974776165", + "9515236722313947031169956", + "62025378660819727125818185" + ], + "mAssetSupply": "88744102080427897790034269" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "19266394147101483008", + "expectedQty": "19455482030623864101", + "reserves": [ + "17572277866446091076259173", + "9515236722313947031169956", + "62025378660819727125818185" + ] + }, + { + "type": "redeemMasset", + "inputQty": "974159494484835", + "expectedQtys": [ + "192836050058846", + "104419055904503", + "680658996816546" + ], + "redemptionFee": "292247848345", + "reserves": [ + "17572277866253255026200327", + "9515236722209527975265453", + "62025378660139068129001639" + ], + "mAssetSupply": "88744121534936061167261880" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "2535903806073071", + "10489097609843290", + "5865711922519679" + ], + "expectedQty": "19235914688562177", + "swapFee": "11548477899877", + "reserves": [ + "17572277863717351220127256", + "9515236711720430365422163", + "62025378654273356206481960" + ], + "mAssetSupply": "88744121515700146478699703" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "1970886394718892551307264", + "expectedQty": "1998341859705732195347201", + "swapFee": "1182531836831335530784", + "reserves": [ + "17572277863717351220127256", + "9515236711720430365422163", + "60027036794567624011134759" + ], + "mAssetSupply": "86774417652818085262923223" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "303066261485030027034624", + "expectedQty": "313688378357766139012400", + "reserves": [ + "17572277863717351220127256", + "9818302973205460392456787", + "60027036794567624011134759" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "4912295651440031956992", + "2021481532222062460928", + "3316045252837866733568" + ], + "expectedQty": "10316647954293750469365", + "reserves": [ + "17577190159368791252084248", + "9820324454737682454917715", + "60030352839820461877868327" + ], + "mAssetSupply": "87098422679130145152404988" + }, + { + "type": "mintMulti", + "inputQtys": [ + "14228140617016629264384", + "24110957719374885027840", + "10527234900495224012800" + ], + "expectedQty": "49664706737471518566083", + "reserves": [ + "17591418299985807881348632", + "9844435412457057339945555", + "60040880074720957101881127" + ], + "mAssetSupply": "87148087385867616670971071" + }, + { + "type": "mintMulti", + "inputQtys": [ + "3246958676057263702016", + "1343815744244454260736", + "266924269113916850176" + ], + "expectedQty": "4928066104690366722480", + "reserves": [ + "17594665258661865145050648", + "9845779228201301794206291", + "60041146998990071018731303" + ], + "mAssetSupply": "87153015451972307037693551" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "6577169959031547904", + "expectedQty": "6663790752775651350", + "swapFee": "3946301975418928", + "reserves": [ + "17594665258661865145050648", + "9845779228201301794206291", + "60041140335199318243079953" + ], + "mAssetSupply": "87153008878748649981564575" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "3597670166420945633280", + "expectedQty": "3629369940600275099046", + "reserves": [ + "17598262928828286090683928", + "9845779228201301794206291", + "60041140335199318243079953" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "106202236727377858134016", + "85024131622414931984384", + "80505250272297116237824" + ], + "expectedQty": "274419760363316683511993", + "reserves": [ + "17704465165555663948817944", + "9930803359823716726190675", + "60121645585471615359317777" + ], + "mAssetSupply": "87431058009052566940175614" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "363709137559402840064", + "1009399089613536624640", + "1050600310295207346176" + ], + "expectedQty": "2446284170603203778023", + "swapFee": "1468651693377949036", + "reserves": [ + "17704101456418104545977880", + "9929793960734103189566035", + "60120594985161320151971601" + ], + "mAssetSupply": "87428611724881963736397591" + }, + { + "type": "mintMulti", + "inputQtys": [ + "547582693184753", + "1070584591261363", + "2585600030710602" + ], + "expectedQty": "4209300243480302", + "reserves": [ + "17704101456965687239162633", + "9929793961804687780827398", + "60120594987746920182682203" + ], + "mAssetSupply": "87428611729091263979877893" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "33297063899329334345728", + "outputIndex": 2, + "expectedQty": "34022660311668324152515", + "swapFee": "20151138673010958254", + "reserves": [ + "17737398520865016573508361", + "9929793961804687780827398", + "60086572327435251858529688" + ], + "mAssetSupply": "87428631880229936990836147", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "1094963724842595973595136", + "outputIndex": 0, + "expectedQty": "1116324907784482586909347", + "swapFee": "676560527737384132432", + "reserves": [ + "16621073613080533986599014", + "11024757686647283754422534", + "60086572327435251858529688" + ], + "mAssetSupply": "87429308440757674374968579", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "736337672910444", + "expectedQty": "756017838619041", + "reserves": [ + "16621073613080533986599014", + "11024757687383621427332978", + "60086572327435251858529688" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "2344292369526976495484928", + "1854366199612531558842368", + "1661028516130908134178816" + ], + "expectedQty": "5923743735452655632838340", + "swapFee": "3556380069313181288476", + "reserves": [ + "14276781243553557491114086", + "9170391487771089868490610", + "58425543811304343724350872" + ], + "mAssetSupply": "81505564706061036580749280" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "9529600984384465272832", + "expectedQty": "9676530263343212032667", + "swapFee": "5717760590630679163", + "reserves": [ + "14276781243553557491114086", + "9170391487771089868490610", + "58415867281041000512318205" + ], + "mAssetSupply": "81496040822837242746155611" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "29607792333708840665088", + "expectedQty": "29140613675293759775767", + "reserves": [ + "14276781243553557491114086", + "9170391487771089868490610", + "58445475073374709352983293" + ] + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "10291117369714307340697600", + "expectedQty": "10107141538786431738415749", + "reserves": [ + "14276781243553557491114086", + "9170391487771089868490610", + "68736592443089016693680893" + ] + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "53607485180457735159808", + "expectedQty": "52350470873771869560564", + "swapFee": "32164491108274641095", + "reserves": [ + "14224430772679785621553522", + "9170391487771089868490610", + "68736592443089016693680893" + ], + "mAssetSupply": "91578747654609618783828414" + }, + { + "type": "mintMulti", + "inputQtys": [ + "6174431791470673395712", + "232550651755297177600", + "635137016205407420416" + ], + "expectedQty": "7186906354530448467261", + "reserves": [ + "14230605204471256294949234", + "9170624038422845165668210", + "68737227580105222101101309" + ], + "mAssetSupply": "91585934560964149232295675" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "1281704057769410611380224", + "expectedQty": "1341964607268806518783744", + "reserves": [ + "14230605204471256294949234", + "10452328096192255777048434", + "68737227580105222101101309" + ] + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "173753376463920308420608", + "expectedQty": "180765602873960063678681", + "reserves": [ + "14230605204471256294949234", + "10626081472656176085469042", + "68737227580105222101101309" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "1569915767016790784", + "1495029865216975616", + "968444997801415680" + ], + "expectedQty": "4110648406575402003", + "swapFee": "2467869765804724", + "reserves": [ + "14230603634555489278158450", + "10626079977626310868493426", + "68737226611660224299685629" + ], + "mAssetSupply": "93108660660458509239356097" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "153101720885286560", + "expectedQty": "155788707015634925", + "swapFee": "91861032531171", + "reserves": [ + "14230603634555489278158450", + "10626079977626310868493426", + "68737226455871517284050704" + ], + "mAssetSupply": "93108660507448649386600708" + }, + { + "type": "mintMulti", + "inputQtys": [ + "7292702914836150030958592", + "3348998683821121210417152", + "5598872359451119058944" + ], + "expectedQty": "10840365981629138366554915", + "reserves": [ + "21523306549391639309117042", + "13975078661447432078910578", + "68742825328230968403109648" + ], + "mAssetSupply": "103949026489077787753155623" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "11156594747021651840335872", + "expectedQty": "11020220475341845240458591", + "reserves": [ + "21523306549391639309117042", + "13975078661447432078910578", + "79899420075252620243445520" + ] + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "31186993169091075768320", + "expectedQty": "30763740499434111767896", + "reserves": [ + "21523306549391639309117042", + "13975078661447432078910578", + "79930607068421711319213840" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "179814642133857206272", + "420684347348575584256", + "226548389358701182976" + ], + "expectedQty": "838453373714446606210", + "swapFee": "503374048657862681", + "reserves": [ + "21523126734749505451910770", + "13974657977100083503326322", + "79930380520032352618030864" + ], + "mAssetSupply": "114999172251545352658775900" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "57380645321141001388032", + "54620970114347924717568", + "44397955028582351765504" + ], + "expectedQty": "158066790363652548976072", + "swapFee": "94897012425646917536", + "reserves": [ + "21465746089428364450522738", + "13920037006985735578608754", + "79885982565003770266265360" + ], + "mAssetSupply": "114841105461181700109799828" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "484048600081135632384", + "expectedQty": "477450353521293417789", + "reserves": [ + "21465746089428364450522738", + "13920037006985735578608754", + "79886466613603851401897744" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "32470012058111774720", + "9141455574906506240", + "77546816718259027968" + ], + "expectedQty": "118741619941386744425", + "reserves": [ + "21465778559440422562297458", + "13920046148441310485114994", + "79886544160420569660925712" + ], + "mAssetSupply": "114841701653155162789962042" + }, + { + "type": "redeemMasset", + "inputQty": "25375937123408301103513", + "expectedQtys": [ + "4741751688771640329805", + "3074913036551486885400", + "17646793226431159345749" + ], + "redemptionFee": "7612781137022490331", + "reserves": [ + "21461036807751650921967653", + "13916971235404758998229594", + "79868897367194138501579963" + ], + "mAssetSupply": "114816333328812891511348860" + }, + { + "type": "mintMulti", + "inputQtys": [ + "164018883675280637952", + "136128234942775164928", + "76041891152423682048" + ], + "expectedQty": "381070235502154814351", + "reserves": [ + "21461200826635326202605605", + "13917107363639701773394522", + "79868973409085290925262011" + ], + "mAssetSupply": "114816714399048393666163211" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "15066546962478278656", + "expectedQty": "15265596542061580676", + "swapFee": "9039928177486967", + "reserves": [ + "21461200826635326202605605", + "13917107363639701773394522", + "79868958143488748863681335" + ], + "mAssetSupply": "114816699341541359365371522" + }, + { + "type": "redeemMasset", + "inputQty": "3216845382759687", + "expectedQtys": [ + "601102922954633", + "389801762861972", + "2237035316952453" + ], + "redemptionFee": "965053614827", + "reserves": [ + "21461200826034223279650972", + "13917107363249900010532550", + "79868958141251713546728882" + ], + "mAssetSupply": "114816699338325479036226662" + }, + { + "type": "mintMulti", + "inputQtys": [ + "60761278403176124383232", + "68515070328813226295296", + "60939517117477905498112" + ], + "expectedQty": "192107742270476207246811", + "reserves": [ + "21521962104437399404034204", + "13985622433578713236827846", + "79929897658369191452226994" + ], + "mAssetSupply": "115008807080595955243473473" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "7615343890254559232", + "9137349477840723968", + "5535097302535359488" + ], + "expectedQty": "22568561865946784171", + "swapFee": "13549266679575815", + "reserves": [ + "21521954489093509149474972", + "13985613296229235396103878", + "79929892123271888916867506" + ], + "mAssetSupply": "115008784512034089296689302" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "4233819099792119185801216", + "outputIndex": 0, + "expectedQty": "4101592107140447888220453", + "swapFee": "2504488206917838495341", + "reserves": [ + "17420362381953061261254519", + "13985613296229235396103878", + "84163711223064008102668722" + ], + "mAssetSupply": "115011289000241007135184643", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "11990019487169611776", + "outputIndex": 1, + "expectedQty": "11843281863269773299", + "swapFee": "7352482736365596", + "reserves": [ + "17420374371972548430866295", + "13985601452947372126330579", + "84163711223064008102668722" + ], + "mAssetSupply": "115011289007593489871550239", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "291362183586357968896", + "expectedQty": "281593202503018550135", + "swapFee": "174817310151814781", + "reserves": [ + "17420374371972548430866295", + "13985319859744869107780444", + "84163711223064008102668722" + ], + "mAssetSupply": "115010997820227213665396124" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "195260358564851834945536", + "outputIndex": 0, + "expectedQty": "187637302062733792612853", + "swapFee": "115178056517588918060", + "reserves": [ + "17232737069909814638253442", + "13985319859744869107780444", + "84358971581628859937614258" + ], + "mAssetSupply": "115011112998283731254314184", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "456103359063072833536", + "expectedQty": "445700281225013122025", + "swapFee": "273662015437843700", + "reserves": [ + "17232291369628589625131417", + "13985319859744869107780444", + "84358971581628859937614258" + ], + "mAssetSupply": "115010657168586683619324348" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "49591550332812574720", + "outputIndex": 2, + "expectedQty": "51567059216168589886", + "swapFee": "30431187579186285", + "reserves": [ + "17232340961178922437706137", + "13985319859744869107780444", + "84358920014569643769024372" + ], + "mAssetSupply": "115010657199017871198510633", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemMasset", + "inputQty": "1384785682541453508608", + "expectedQtys": [ + "207423735251945016891", + "168339710230700372827", + "1015418760031602780937" + ], + "redemptionFee": "415435704762436052", + "reserves": [ + "17232133537443670492689246", + "13985151520034638407407617", + "84357904595809612166243435" + ], + "mAssetSupply": "115009272828771034507438077" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "15815566156733", + "outputIndex": 1, + "expectedQty": "15021005151415", + "swapFee": "9327615334", + "reserves": [ + "17232133537443670492689246", + "13985151520019617402256202", + "84357904595825427732400168" + ], + "mAssetSupply": "115009272828771043835053411", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemMasset", + "inputQty": "2830423193827033088", + "expectedQtys": [ + "423962320385825040", + "344076795626691664", + "2075458207053666886" + ], + "redemptionFee": "849126958148109", + "reserves": [ + "17232133113481350106864206", + "13985151175942821775564538", + "84357902520367220678733282" + ], + "mAssetSupply": "115009269999196976966168432" + }, + { + "type": "mintMulti", + "inputQtys": [ + "717542269024589578240", + "999649984633406488576", + "1336781671758894465024" + ], + "expectedQty": "3081816821016980746098", + "reserves": [ + "17232850655750374696442446", + "13986150825927455182053114", + "84359239302038979573198306" + ], + "mAssetSupply": "115012351816017993946914530" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "42160332694862421819392", + "expectedQty": "41441583482440904485481", + "reserves": [ + "17232850655750374696442446", + "13986150825927455182053114", + "84401399634733841995017698" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "300116321596415541248", + "134809732230492454912", + "134270894775466196992" + ], + "expectedQty": "578369403949369885614", + "swapFee": "347229980357836633", + "reserves": [ + "17232550539428778280901198", + "13986016016195224689598202", + "84401265363839066528820706" + ], + "mAssetSupply": "115053215030096485481514397" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "103784130574799634432", + "expectedQty": "107350944227577966523", + "reserves": [ + "17232550539428778280901198", + "13986119800325799489232634", + "84401265363839066528820706" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "871359843930633760931840", + "2234809360188638144495616", + "2390806802474315175428096" + ], + "expectedQty": "5563899571645076321646863", + "swapFee": "3340343949356659788861", + "reserves": [ + "16361190695498144519969358", + "11751310440137161344737018", + "82010458561364751353392610" + ], + "mAssetSupply": "109489422809395636737834057" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "418893092072978907136", + "outputIndex": 2, + "expectedQty": "446935390514914168670", + "swapFee": "263108050548090763", + "reserves": [ + "16361190695498144519969358", + "11751729333229234323644154", + "82010011625974236439223940" + ], + "mAssetSupply": "109489423072503687285924820", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemMasset", + "inputQty": "5058827793611216021094", + "expectedQtys": [ + "755722455842136303620", + "542811701017807204796", + "3788037713335655828373" + ], + "redemptionFee": "1517648338083364806", + "reserves": [ + "16360434973042302383665738", + "11751186521528216516439358", + "82006223588260900783395567" + ], + "mAssetSupply": "109484365762358414153268532" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "137878428843027548078080", + "expectedQty": "141297554234541735137662", + "reserves": [ + "16498313401885329931743818", + "11751186521528216516439358", + "82006223588260900783395567" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "200480434495891374080", + "207144508278774595584", + "329758119881787965440" + ], + "expectedQty": "745617259058896111787", + "swapFee": "447638938798616837", + "reserves": [ + "16498112921450834040369738", + "11750979377019937741843774", + "82005893830141018995430127" + ], + "mAssetSupply": "109624917699333896992294407" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "496120230870858203136", + "346408676573345480704", + "227739875640330321920" + ], + "expectedQty": "1094244548474326352323", + "swapFee": "656940893620768272", + "reserves": [ + "16497616801219963182166602", + "11750632968343364396363070", + "82005666090265378665108207" + ], + "mAssetSupply": "109623823454785422665942084" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "6769736414401068389105664", + "expectedQty": "6890660902459937051616265", + "swapFee": "4061841848640641033463", + "reserves": [ + "16497616801219963182166602", + "11750632968343364396363070", + "75115005187805441613491942" + ], + "mAssetSupply": "102858148882232994917869883" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "1688902207167408", + "19480986935848220", + "1093144373023164" + ], + "expectedQty": "23022499475124983", + "swapFee": "13821792760731", + "reserves": [ + "16497616799531060974999194", + "11750632948862377460514850", + "75115005186712297240468778" + ], + "mAssetSupply": "102858148859210495442744900" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "22122971949464327028736", + "101824423887494107365376", + "96893987321295008694272" + ], + "expectedQty": "223547310737267106469609", + "swapFee": "134208911789433924236", + "reserves": [ + "16475493827581596647970458", + "11648808524974883353149474", + "75018111199391002231774506" + ], + "mAssetSupply": "102634601548473228336275291" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "902683432083342120452096", + "expectedQty": "935117980207896652439834", + "reserves": [ + "16475493827581596647970458", + "12551491957058225473601570", + "75018111199391002231774506" + ] + }, + { + "type": "redeemMasset", + "inputQty": "206093648621391917875", + "expectedQtys": [ + "32774791732778280104", + "24968752932889145426", + "149233946883603051567" + ], + "redemptionFee": "61828094586417575", + "reserves": [ + "16475461052789863869690354", + "12551466988305292584456144", + "75017961965444118628722939" + ], + "mAssetSupply": "103569513496860598183214825" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "633767191271183457714176", + "outputIndex": 0, + "expectedQty": "640653845545153591290429", + "swapFee": "392247859208975845871", + "reserves": [ + "15834807207244710278399925", + "13185234179576476042170320", + "75017961965444118628722939" + ], + "mAssetSupply": "103569905744719807159060696", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "25081452382548769374208", + "expectedQty": "25471726492286314272754", + "swapFee": "15048871429529261624", + "reserves": [ + "15834807207244710278399925", + "13185234179576476042170320", + "74992490238951832314450185" + ], + "mAssetSupply": "103544839341208687918948112" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "56457545919719563853824", + "expectedQty": "57335284848321336619446", + "swapFee": "33874527551831738312", + "reserves": [ + "15834807207244710278399925", + "13185234179576476042170320", + "74935154954103510977830739" + ], + "mAssetSupply": "103488415669816520186832600" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "1140062754815340800", + "outputIndex": 1, + "expectedQty": "1129063005322899703", + "swapFee": "698204669621214", + "reserves": [ + "15834808347307465093740725", + "13185233050513470719270617", + "74935154954103510977830739" + ], + "mAssetSupply": "103488415670514724856453814", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemMasset", + "inputQty": "45420822148331320115", + "expectedQtys": [ + "6947775169165265810", + "5785231673081260943", + "32878996541577958113" + ], + "redemptionFee": "13626246644499396", + "reserves": [ + "15834801399532295928474915", + "13185227265281797638009674", + "74935122075106969399872626" + ], + "mAssetSupply": "103488370263318823169633095" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "122183795227999292358656", + "expectedQty": "120239869261508366730095", + "reserves": [ + "15834801399532295928474915", + "13185227265281797638009674", + "75057305870334968692231282" + ] + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "367122001788184383455232", + "expectedQty": "372818591853685158507936", + "swapFee": "220273201072910630073", + "reserves": [ + "15834801399532295928474915", + "13185227265281797638009674", + "74684487278481283533723346" + ], + "mAssetSupply": "103241708403993220063538031" + }, + { + "type": "redeemMasset", + "inputQty": "6766786664541426483", + "expectedQtys": [ + "1037551386790012480", + "863942053270000729", + "4893587951774251606" + ], + "redemptionFee": "2030035999362427", + "reserves": [ + "15834800361980909138462435", + "13185226401339744368008945", + "74684482384893331759471740" + ], + "mAssetSupply": "103241701639236591521473975" + }, + { + "type": "mintMulti", + "inputQtys": [ + "543586653728470269952", + "113766718173741023232", + "804213532443081834496" + ], + "expectedQty": "1463403138587989609316", + "reserves": [ + "15835343948634637608732387", + "13185340168057918109032177", + "74685286598425774841306236" + ], + "mAssetSupply": "103243165042375179511083291" + }, + { + "type": "mintMulti", + "inputQtys": [ + "1580126082925885724295168", + "1929420080363217302323200", + "25234060520112250683392" + ], + "expectedQty": "3612376485134663582419193", + "reserves": [ + "17415470031560523333027555", + "15114760248421135411355377", + "74710520658945887091989628" + ], + "mAssetSupply": "106855541527509843093502484" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "17974840438513137664", + "outputIndex": 2, + "expectedQty": "18604812329177869183", + "swapFee": "11020798289747933", + "reserves": [ + "17415470031560523333027555", + "15114778223261573924493041", + "74710502054133557914120445" + ], + "mAssetSupply": "106855541538530641383250417", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "27868381532340646576128", + "outputIndex": 0, + "expectedQty": "28009448592312364978615", + "swapFee": "17086017851285182445", + "reserves": [ + "17387460582968210968048940", + "15142646604793914571069169", + "74710502054133557914120445" + ], + "mAssetSupply": "106855558624548492668432862", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mintMulti", + "inputQtys": [ + "2375537147861127680", + "4096260065572992000", + "5732808276162135040" + ], + "expectedQty": "12255757568343035686", + "reserves": [ + "17387462958505358829176620", + "15142650701053980144061169", + "74710507786941834076255485" + ], + "mAssetSupply": "106855570880306061011468548" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "484693517842358965633024", + "expectedQty": "473714118921559900029456", + "swapFee": "290816110705415379379", + "reserves": [ + "17387462958505358829176620", + "14668936582132420244031713", + "74710507786941834076255485" + ], + "mAssetSupply": "106371168178574407461214903" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "316640864551129373999104", + "expectedQty": "311308609769603563630751", + "swapFee": "189984518730677624399", + "reserves": [ + "17076154348735755265545869", + "14668936582132420244031713", + "74710507786941834076255485" + ], + "mAssetSupply": "106054717298542008764840198" + }, + { + "type": "redeemMasset", + "inputQty": "22404994963596097513062", + "expectedQtys": [ + "3606406056966765394841", + "3098012623842344700737", + "15778519114980805464577" + ], + "redemptionFee": "6721498489078829253", + "reserves": [ + "17072547942678788500151028", + "14665838569508577899330976", + "74694729267826853270790908" + ], + "mAssetSupply": "106032319025076901746156389" + }, + { + "type": "mintMulti", + "inputQtys": [ + "4910003302037712076275712", + "1648765758849849749405696", + "3434348072012685957398528" + ], + "expectedQty": "10049671038293969143423449", + "reserves": [ + "21982551244716500576426740", + "16314604328358427648736672", + "78129077339839539228189436" + ], + "mAssetSupply": "116081990063370870889579838" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "19408427698684491202560", + "92730996709034442752", + "31755149339705110167552" + ], + "expectedQty": "51088080423943477361418", + "swapFee": "30671251004969067857", + "reserves": [ + "21963142817017816085224180", + "16314511597361718614293920", + "78097322190499834118021884" + ], + "mAssetSupply": "116030901982946927412218420" + }, + { + "type": "redeemMasset", + "inputQty": "5938733532127775948", + "expectedQtys": [ + "1123787891967637568", + "834764439189223573", + "3996004843385889944" + ], + "redemptionFee": "1781620059638332", + "reserves": [ + "21963141693229924117586612", + "16314510762597279425070347", + "78097318194494990732131940" + ], + "mAssetSupply": "116030896045995015344080804" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "5002872619681870168195072", + "expectedQty": "4856787978248426197892665", + "swapFee": "3001723571809122100917", + "reserves": [ + "21963141693229924117586612", + "11457722784348853227177682", + "78097318194494990732131940" + ], + "mAssetSupply": "111031025149884954297986649" + }, + { + "type": "mintMulti", + "inputQtys": [ + "67126130809112893587456", + "129908317749026272313344", + "11424578318527077810176" + ], + "expectedQty": "214410844015731329524838", + "reserves": [ + "22030267824039037011174068", + "11587631102097879499491026", + "78108742772813517809942116" + ], + "mAssetSupply": "111245435993900685627511487" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "2571709010756300288", + "expectedQty": "2609652623356634791", + "swapFee": "1543025406453780", + "reserves": [ + "22030267824039037011174068", + "11587631102097879499491026", + "78108740163160894453307325" + ], + "mAssetSupply": "111245433423734700277664979" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "304893347894589495705600", + "expectedQty": "301636278802841474319457", + "swapFee": "182936008736753697423", + "reserves": [ + "21728631545236195536854611", + "11587631102097879499491026", + "78108740163160894453307325" + ], + "mAssetSupply": "110940723011848847535656802" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "109866166304050950176768", + "114986766699291520008192", + "354859058557228070993920" + ], + "expectedQty": "580231002563318470690326", + "swapFee": "348347610104053514522", + "reserves": [ + "21618765378932144586677843", + "11472644335398587979482834", + "77753881104603666382313405" + ], + "mAssetSupply": "110360492009285529064966476" + }, + { + "type": "redeemMasset", + "inputQty": "10757379839100034272460", + "expectedQtys": [ + "2106655182660358106448", + "1117959570047392515366", + "7576779419633144122434" + ], + "redemptionFee": "3227213951730010281", + "reserves": [ + "21616658723749484228571395", + "11471526375828540586967468", + "77746304325184033238190971" + ], + "mAssetSupply": "110349737856660380760704297" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "83095036861469605888", + "105922838292257177600", + "109999403925529903104" + ], + "expectedQty": "302644901668055744056", + "swapFee": "181695958575979033", + "reserves": [ + "21616575628712622758965507", + "11471420452990248329789868", + "77746194325780107708287867" + ], + "mAssetSupply": "110349435211758712704960241" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "163371561312576734232576", + "expectedQty": "165811543397860801065997", + "swapFee": "98022936787546040539", + "reserves": [ + "21616575628712622758965507", + "11471420452990248329789868", + "77580382782382246907221870" + ], + "mAssetSupply": "110186161673382923516768204" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "10455713504298069393408", + "8676705210561637384192", + "31326125752297711468544" + ], + "expectedQty": "50450850492030811731311", + "swapFee": "30288683505321680046", + "reserves": [ + "21606119915208324689572099", + "11462743747779686692405676", + "77549056656629949195753326" + ], + "mAssetSupply": "110135710822890892705036893" + }, + { + "type": "mintMulti", + "inputQtys": [ + "889309203535411150848", + "720223114257763532800", + "164040232265174941696" + ], + "expectedQty": "1810404674695084571736", + "reserves": [ + "21607009224411860100722947", + "11463463970893944455938476", + "77549220696862214370695022" + ], + "mAssetSupply": "110137521227565587789608629" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "4168209268217602899968", + "2056865039681381203968", + "3975452652519540391936" + ], + "expectedQty": "10268985514245711089466", + "swapFee": "6165090362765085705", + "reserves": [ + "21602841015143642497822979", + "11461407105854263074734508", + "77545245244209694830303086" + ], + "mAssetSupply": "110127252242051342078519163" + }, + { + "type": "mintMulti", + "inputQtys": [ + "683257085793173116026880", + "511467968509457488412672", + "250706374576354881437696" + ], + "expectedQty": "1468987570896858799445685", + "reserves": [ + "22286098100936815613849859", + "11972875074363720563147180", + "77795951618786049711740782" + ], + "mAssetSupply": "111596239812948200877964848" + }, + { + "type": "mintMulti", + "inputQtys": [ + "8879780801045757952", + "13686455188428566528", + "4437008775403665920" + ], + "expectedQty": "27549529928042897777", + "reserves": [ + "22286106980717616659607811", + "11972888760818908991713708", + "77795956055794825115406702" + ], + "mAssetSupply": "111596267362478128920862625" + }, + { + "type": "redeemMasset", + "inputQty": "7364266396645032827289", + "expectedQtys": [ + "1470224734027937365793", + "789856981712929322868", + "5132235024248145857240" + ], + "redemptionFee": "2209279918993509848", + "reserves": [ + "22284636755983588722242018", + "11972098903837196062390840", + "77790823820770576969549462" + ], + "mAssetSupply": "111588905305361402881545184" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "409267908266270474108928", + "expectedQty": "415031079259637595690524", + "swapFee": "245560744959762284465", + "reserves": [ + "22284636755983588722242018", + "11972098903837196062390840", + "77375792741510939373858938" + ], + "mAssetSupply": "111179882957840092169720721" + }, + { + "type": "mintMulti", + "inputQtys": [ + "163516295217172971520000", + "71919824163949282066432", + "105122403329950397497344" + ], + "expectedQty": "343281497176946875593768", + "reserves": [ + "22448153051200761693762018", + "12044018728001145344457272", + "77480915144840889771356282" + ], + "mAssetSupply": "111523164455017039045314489" + }, + { + "type": "redeemMasset", + "inputQty": "157213839994330910661017", + "expectedQtys": [ + "31635594372684811681181", + "16973320265013187995516", + "109191825160666591772065" + ], + "redemptionFee": "47164151998299273198", + "reserves": [ + "22416517456828076882080837", + "12027045407736132156461756", + "77371723319680223179584217" + ], + "mAssetSupply": "111365997779174706433926670" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "381589979978054779273216", + "expectedQty": "376108041832208004565371", + "reserves": [ + "22416517456828076882080837", + "12027045407736132156461756", + "77753313299658277958857433" + ] + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "2436744669429403316387840", + "outputIndex": 2, + "expectedQty": "2542604696470244886252675", + "swapFee": "1508057539998789339604", + "reserves": [ + "22416517456828076882080837", + "14463790077165535472849596", + "75210708603188033072604758" + ], + "mAssetSupply": "111743613878546913227831645", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemMasset", + "inputQty": "7947916619849256455372", + "expectedQtys": [ + "1593926991338904907476", + "1028448127388835160920", + "5347859171756895682463" + ], + "redemptionFee": "2384374985954776936", + "reserves": [ + "22414923529836737977173361", + "14462761629038146637688676", + "75205360744016276176922295" + ], + "mAssetSupply": "111735668346302049926153209" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "10110805401670466404352", + "expectedQty": "9865742532827459998979", + "swapFee": "6066483241002279842", + "reserves": [ + "22414923529836737977173361", + "14452895886505319177689697", + "75205360744016276176922295" + ], + "mAssetSupply": "111725563607383620462028699" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "329752930687973792415744", + "49167953346167991959552", + "203899008171730656034816" + ], + "expectedQty": "584420199449313065562414", + "swapFee": "350862637251939002739", + "reserves": [ + "22085170599148764184757617", + "14403727933159151185730145", + "75001461735844545520887479" + ], + "mAssetSupply": "111141143407934307396466285" + }, + { + "type": "mintMulti", + "inputQtys": [ + "6636002415715903488", + "16066262263032727552", + "8152528321549885440" + ], + "expectedQty": "31205636140104677640", + "reserves": [ + "22085177235151179900661105", + "14403743999421414218457697", + "75001469888372867070772919" + ], + "mAssetSupply": "111141174613570447501143925" + }, + { + "type": "mintMulti", + "inputQtys": [ + "1131605767653730942976", + "5263937192336629432320", + "5952820014693086134272" + ], + "expectedQty": "12415213537517615591450", + "reserves": [ + "22086308840918833631604081", + "14409007936613750847890017", + "75007422708387560156907191" + ], + "mAssetSupply": "111153589827107965116735375" + }, + { + "type": "mintMulti", + "inputQtys": [ + "31280887132882399657984", + "33420320814043777466368", + "54985077625714605293568" + ], + "expectedQty": "120115101752676348863345", + "reserves": [ + "22117589728051716031262065", + "14442428257427794625356385", + "75062407786013274762200759" + ], + "mAssetSupply": "111273704928860641465598720" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "401860270559100993536", + "expectedQty": "397095029025901422387", + "reserves": [ + "22117589728051716031262065", + "14442428257427794625356385", + "75062809646283833863194295" + ] + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "3851633278475902124032", + "expectedQty": "3805958906371222469865", + "reserves": [ + "22117589728051716031262065", + "14442428257427794625356385", + "75066661279562309765318327" + ] + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "704943347561045765914624", + "expectedQty": "687032082314534354287664", + "swapFee": "422966008536627459548", + "reserves": [ + "22117589728051716031262065", + "13755396175113260271068721", + "75066661279562309765318327" + ], + "mAssetSupply": "110573387601243529451035896" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "85452574676364222791680", + "71719679692355200352256", + "135526981539964336996352" + ], + "expectedQty": "293694942528923060483925", + "swapFee": "176322759172857550820", + "reserves": [ + "22032137153375351808470385", + "13683676495420905070716465", + "74931134298022345428321975" + ], + "mAssetSupply": "110279692658714606390551971" + }, + { + "type": "redeemMasset", + "inputQty": "61598941176729922279833", + "expectedQtys": [ + "12302801548522882435166", + "7640999836076248158626", + "41841736398824786637750" + ], + "redemptionFee": "18479682353018976683", + "reserves": [ + "22019834351826828926035219", + "13676035495584828822557839", + "74889292561623520641684225" + ], + "mAssetSupply": "110218112197220229487248821" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "3581150217175967947816960", + "expectedQty": "3605764391390931471507317", + "reserves": [ + "25600984569002796873852179", + "13676035495584828822557839", + "74889292561623520641684225" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "221650297056400800481280", + "120826162262052542873600", + "93167124140806132203520" + ], + "expectedQty": "439076396895793740287648", + "swapFee": "263604000537798923526", + "reserves": [ + "25379334271946396073370899", + "13555209333322776279684239", + "74796125437482714509480705" + ], + "mAssetSupply": "113384800191715367218468490" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "6509560851739864727552", + "2767557384182969663488", + "17827377978366572363776" + ], + "expectedQty": "27011734645175327608528", + "swapFee": "16216770849614965544", + "reserves": [ + "25372824711094656208643347", + "13552441775938593310020751", + "74778298059504347937116929" + ], + "mAssetSupply": "113357788457070191890859962" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "53776256356865163264", + "expectedQty": "53455716233832003439", + "swapFee": "32265753814119097", + "reserves": [ + "25372771255378422376639908", + "13552441775938593310020751", + "74778298059504347937116929" + ], + "mAssetSupply": "113357734713079588839815795" + }, + { + "type": "redeemMasset", + "inputQty": "36508115392878300364", + "expectedQtys": [ + "8169130845408148826", + "4363404731319986222", + "24075955089672383863" + ], + "redemptionFee": "10952434617863490", + "reserves": [ + "25372763086247576968491082", + "13552437412533861990034529", + "74778273983549258264733066" + ], + "mAssetSupply": "113357698215916630579378921" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "4253701228775429942280192", + "expectedQty": "4342004905378352948718471", + "reserves": [ + "25372763086247576968491082", + "17806138641309291932314721", + "74778273983549258264733066" + ] + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "21635242386355170312192", + "expectedQty": "21969562843994929669962", + "reserves": [ + "25372763086247576968491082", + "17827773883695647102626913", + "74778273983549258264733066" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "11532986523431192231936", + "20307028116697216188416", + "33622310759819292704768" + ], + "expectedQty": "65537259968990671364296", + "swapFee": "39345963559530120891", + "reserves": [ + "25361230099724145776259146", + "17807466855578949886438497", + "74744651672789438972028298" + ], + "mAssetSupply": "117656135424169987786403058" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "26682956286730780540928", + "99569549109627080146944", + "173517384094174089838592" + ], + "expectedQty": "299888226779330401651926", + "swapFee": "180040960643984631770", + "reserves": [ + "25334547143437414995718218", + "17707897306469322806291553", + "74571134288695264882189706" + ], + "mAssetSupply": "117356247197390657384751132" + }, + { + "type": "mintMulti", + "inputQtys": [ + "93666575544548449058816", + "168688008507078469484544", + "167048710794394338328576" + ], + "expectedQty": "431034714712381396529067", + "reserves": [ + "25428213718981963444777034", + "17876585314976401275776097", + "74738182999489659220518282" + ], + "mAssetSupply": "117787281912103038781280199" + }, + { + "type": "redeemMasset", + "inputQty": "71462217336690587992064", + "expectedQtys": [ + "15422814405928340610101", + "10842572764708664694048", + "45330479685915814288841" + ], + "redemptionFee": "21438665201007176397", + "reserves": [ + "25412790904576035104166933", + "17865742742211692611082049", + "74692852519803743406229441" + ], + "mAssetSupply": "117715841133431549200464532" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "69603152684284035072", + "expectedQty": "70670062944291789617", + "reserves": [ + "25412790904576035104166933", + "17865812345364376895117121", + "74692852519803743406229441" + ] + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "641151961706320232448", + "expectedQty": "637067514454885087938", + "swapFee": "384691177023792139", + "reserves": [ + "25412153837061580219078995", + "17865812345364376895117121", + "74692852519803743406229441" + ], + "mAssetSupply": "117715271036223964195813840" + }, + { + "type": "redeemMasset", + "inputQty": "9172299992176141113753", + "expectedQtys": [ + "1979505038047451374044", + "1391675250087674718613", + "5818274154056644700069" + ], + "redemptionFee": "2751689997652842334", + "reserves": [ + "25410174332023532767704951", + "17864420670114289220398508", + "74687034245649686761529372" + ], + "mAssetSupply": "117706101487921785707542421" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "27169135044249318850560", + "expectedQty": "26995781701154388955671", + "swapFee": "16301481026549591310", + "reserves": [ + "25383178550322378378749280", + "17864420670114289220398508", + "74687034245649686761529372" + ], + "mAssetSupply": "117678948654358562938283171" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "1902265649230675806519296", + "expectedQty": "1868816355554716248567004", + "swapFee": "1141359389538405483911", + "reserves": [ + "25383178550322378378749280", + "15995604314559572971831504", + "74687034245649686761529372" + ], + "mAssetSupply": "115777824364517425537247786" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "134635649719951536", + "outputIndex": 1, + "expectedQty": "130673113252432896", + "swapFee": "79978469626753", + "reserves": [ + "25383178550322378378749280", + "15995604183886459719398608", + "74687034380285336481480908" + ], + "mAssetSupply": "115777824364597404006874539", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemBassets", + "inputQtys": [ + "520515137703413678080", + "1534130942656678461440", + "2022136959397438160896" + ], + "expectedQty": "4089487444194530055512", + "swapFee": "2455165565856231772", + "reserves": [ + "25382658035184674965071200", + "15994070052943803040937168", + "74685012243325939043320012" + ], + "mAssetSupply": "115773734877153209476819027" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "59283477228973531136", + "expectedQty": "58694201831576401514", + "reserves": [ + "25382658035184674965071200", + "15994070052943803040937168", + "74685071526803168016851148" + ] + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "4056846858155476125745152", + "outputIndex": 1, + "expectedQty": "3899376401769789599396411", + "swapFee": "2408959336284882584906", + "reserves": [ + "25382658035184674965071200", + "12094693651174013441540757", + "78741918384958644142596300" + ], + "mAssetSupply": "115776202530691325935805447", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemBassets", + "inputQtys": [ + "392334765953175068344320", + "553070822573218308554752", + "269873590453908893859840" + ], + "expectedQty": "1236403798305375845698436", + "swapFee": "742287651574170009424", + "reserves": [ + "24990323269231499896726880", + "11541622828600795132986005", + "78472044794504735248736460" + ], + "mAssetSupply": "114539798732385950090107011" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "383387452842295028613120", + "outputIndex": 0, + "expectedQty": "375094954539053330251889", + "swapFee": "226748933109579826297", + "reserves": [ + "24615228314692446566474991", + "11541622828600795132986005", + "78855432247347030277349580" + ], + "mAssetSupply": "114540025481319059669933308", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemBassets", + "inputQtys": [ + "9918238297221844959232", + "35365289876025818218496", + "23705590897075936034816" + ], + "expectedQty": "70227668800463234866417", + "swapFee": "42161898419329538643", + "reserves": [ + "24605310076395224721515759", + "11506257538724769314767509", + "78831726656449954341314764" + ], + "mAssetSupply": "114469797812518596435066891" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "5817087553598483", + "expectedQty": "6066297308172108", + "reserves": [ + "24605310076395224721515759", + "11506257544541856868365992", + "78831726656449954341314764" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "188376576388846592196608", + "92290295803572618526720", + "113924734498516422885376" + ], + "expectedQty": "398202122343541282827633", + "reserves": [ + "24793686652784071313712367", + "11598547840345429486892712", + "78945651390948470764200140" + ], + "mAssetSupply": "114867999940928435026066632" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "1550002182512488704", + "expectedQty": "1571621620862059764", + "swapFee": "930001309507493", + "reserves": [ + "24793686652784071313712367", + "11598547840345429486892712", + "78945649819326849902140376" + ], + "mAssetSupply": "114867998391856253823085421" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "57016609249107787776", + "expectedQty": "59427399038245726101", + "reserves": [ + "24793686652784071313712367", + "11598604856954678594680488", + "78945649819326849902140376" + ] + }, + { + "type": "redeemMasset", + "inputQty": "167567880636078924", + "expectedQtys": [ + "36157825045146417", + "16914802992335983", + "115130235943434590" + ], + "redemptionFee": "50270364190823", + "reserves": [ + "24793686616626246268565950", + "11598604840039875602344505", + "78945649704196613958705786" + ], + "mAssetSupply": "114868057651737681796923421" + }, + { + "type": "mintMulti", + "inputQtys": [ + "52963712524679550861312", + "36508032943730903220224", + "49800093237011869073408" + ], + "expectedQty": "140465418435100052135523", + "reserves": [ + "24846650329150925819427262", + "11635112872983606505564729", + "78995449797433625827779194" + ], + "mAssetSupply": "115008523070172781849058944" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "96397365759573101641728", + "expectedQty": "97736393842405309112973", + "swapFee": "57838419455743860985", + "reserves": [ + "24846650329150925819427262", + "11635112872983606505564729", + "78897713403591220518666221" + ], + "mAssetSupply": "114912183542832664491278201" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "10415748176802490613760", + "7863325380293744918528", + "719401779440232169472" + ], + "expectedQty": "19390169121778457346000", + "swapFee": "11641086124741919559", + "reserves": [ + "24836234580974123328813502", + "11627249547603312760646201", + "78896994001811780286496749" + ], + "mAssetSupply": "114892793373710886033932201" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "2199259385077896595898368", + "outputIndex": 1, + "expectedQty": "2054927370818466041862488", + "swapFee": "1300323118164453700740", + "reserves": [ + "24836234580974123328813502", + "9572322176784846718783713", + "81096253386889676882395117" + ], + "mAssetSupply": "114894093696829050487632941", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemMasset", + "inputQty": "237529553518995020185", + "expectedQtys": [ + "51330488099417774773", + "19783674049996659552", + "167606335646868404202" + ], + "redemptionFee": "71258866055698506", + "reserves": [ + "24836183250486023911038729", + "9572302393110796722124161", + "81096085780554030013990915" + ], + "mAssetSupply": "114893856238534397548311262" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "4918386160055901304651776", + "outputIndex": 1, + "hardLimitError": true + }, + { + "type": "redeemBassets", + "inputQtys": [ + "515847980931613196288", + "9642736084775906312192", + "7928268603719084408832" + ], + "expectedQty": "18584308132979731953962", + "swapFee": "11157279247336240916", + "reserves": [ + "24835667402505092297842441", + "9562659657026020815811969", + "81088157511950310929582083" + ], + "mAssetSupply": "114875271930401417816357300" + }, + { + "type": "mintMulti", + "inputQtys": [ + "11351753912139416338432", + "19959113585633062289408", + "17116698299609634570240" + ], + "expectedQty": "49521971497481621782854", + "reserves": [ + "24847019156417231714180873", + "9582618770611653878101377", + "81105274210249920564152323" + ], + "mAssetSupply": "114924793901898899438140154" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "254769244149718007676928", + "expectedQty": "259164859486328544941166", + "swapFee": "152861546489830804606", + "reserves": [ + "24847019156417231714180873", + "9582618770611653878101377", + "80846109350763592019211157" + ], + "mAssetSupply": "114670177519295671261267832" + }, + { + "type": "redeemMasset", + "inputQty": "333355014448386387476480", + "expectedQtys": [ + "72210523655677458605788", + "27849051633216850536572", + "234955342328660702631307" + ], + "redemptionFee": "100006504334515916242", + "reserves": [ + "24774808632761554255575085", + "9554769718978437027564805", + "80611154008434931316579850" + ], + "mAssetSupply": "114336922511351619389707594" + }, + { + "type": "redeemMasset", + "inputQty": "3352488524718573564723", + "expectedQtys": [ + "726207620785797357686", + "280072661211190818152", + "2362901575911698265811" + ], + "redemptionFee": "1005746557415572069", + "reserves": [ + "24774082425140768458217399", + "9554489646317225836746653", + "80608791106859019618314039" + ], + "mAssetSupply": "114333571028573458231714940" + }, + { + "type": "redeemMasset", + "inputQty": "487706295870249519965798", + "expectedQtys": [ + "105645709494537210011282", + "40743823332042448793752", + "343745240765770724984901" + ], + "redemptionFee": "146311888761074855989", + "reserves": [ + "24668436715646231248206117", + "9513745822985183387952901", + "80265045866093248893329138" + ], + "mAssetSupply": "113846011044591969786605131" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "772217978571689820160", + "expectedQty": "778019276535327329759", + "reserves": [ + "24669208933624802938026277", + "9513745822985183387952901", + "80265045866093248893329138" + ] + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "3565289732526789623808", + "expectedQty": "3502856836859836594659", + "reserves": [ + "24669208933624802938026277", + "9513745822985183387952901", + "80268611155825775682952946" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "313801320009874538496", + "550406655930684932096", + "379083990585376309248" + ], + "expectedQty": "1274826196171481164005", + "swapFee": "765354930661285469", + "reserves": [ + "24668895132304793063487781", + "9513195416329252703020805", + "80268232071835190306643698" + ], + "mAssetSupply": "113849017094509193469365544" + }, + { + "type": "mintMulti", + "inputQtys": [ + "652781205821979230208", + "621857203493367840768", + "793221339243877498880" + ], + "expectedQty": "2099337578766469860184", + "reserves": [ + "24669547913510615042717989", + "9513817273532746070861573", + "80269025293174434184142578" + ], + "mAssetSupply": "113851116432087959939225728" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "62154160218912319340544", + "outputIndex": 2, + "expectedQty": "63694538845591540149616", + "swapFee": "37571281334847250198", + "reserves": [ + "24731702073729527362058533", + "9513817273532746070861573", + "80205330754328842643992962" + ], + "mAssetSupply": "113851154003369294786475926", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemBassets", + "inputQtys": [ + "1401596531743433216", + "5701929064288568320", + "4934956170626737152" + ], + "expectedQty": "12333078130067598838", + "swapFee": "7404289451711586", + "reserves": [ + "24731700672132995618625317", + "9513811571603681782293253", + "80205325819372672017255810" + ], + "mAssetSupply": "113851141670291164718877088" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "2207327296222008967168", + "outputIndex": 0, + "expectedQty": "2331984087316160618970", + "swapFee": "1410413081510938009", + "reserves": [ + "24729368688045679458006347", + "9516018898899903791260421", + "80205325819372672017255810" + ], + "mAssetSupply": "113851143080704246229815097", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemMasset", + "inputQty": "13176853462339016038809", + "expectedQtys": [ + "2861258148347193317464", + "1101030396601483256511", + "9279983849828624568684" + ], + "redemptionFee": "3953056038701704811", + "reserves": [ + "24726507429897332264688883", + "9514917868503302308003910", + "80196045835522843392687126" + ], + "mAssetSupply": "113837970180297945915481099" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "195813129954635527749632", + "expectedQty": "208272433613167113516306", + "reserves": [ + "24726507429897332264688883", + "9710730998457937835753542", + "80196045835522843392687126" + ] + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "57071847699025666048", + "expectedQty": "60630245472317093363", + "reserves": [ + "24726507429897332264688883", + "9710788070305636861419590", + "80196045835522843392687126" + ] + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "5326517572821247328256", + "expectedQty": "5366001833364829026420", + "reserves": [ + "24731833947470153512017139", + "9710788070305636861419590", + "80196045835522843392687126" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "61276114101320168767488", + "31812686321814501064704", + "57224487545770776461312" + ], + "expectedQty": "151774277424190510480483", + "swapFee": "91119237997312693904", + "reserves": [ + "24670557833368833343249651", + "9678975383983822360354886", + "80138821347977072616225814" + ], + "mAssetSupply": "113899894968565759664636705" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "465161876942892327501824", + "expectedQty": "461311536504774521342365", + "swapFee": "279097126165735396501", + "reserves": [ + "24209246296864058821907286", + "9678975383983822360354886", + "80138821347977072616225814" + ], + "mAssetSupply": "113435012188749033072531382" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "136745786107685744148480", + "expectedQty": "137831644671822698236400", + "reserves": [ + "24345992082971744566055766", + "9678975383983822360354886", + "80138821347977072616225814" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "125683476792718262272", + "1717335243012118413312", + "478998257313637531648" + ], + "expectedQty": "2422356349084506892918", + "swapFee": "1454286381279471818", + "reserves": [ + "24345866399494951847793494", + "9677258048740810241941574", + "80138342349719758978694166" + ], + "mAssetSupply": "113570421477071771263874864" + }, + { + "type": "mintMulti", + "inputQtys": [ + "105763481100475568", + "257955488443715584", + "201992085776171936" + ], + "expectedQty": "579213894966786072", + "reserves": [ + "24345866505258432948269062", + "9677258306696298685657158", + "80138342551711844754866102" + ], + "mAssetSupply": "113570422056285666230660936" + }, + { + "type": "mintMulti", + "inputQtys": [ + "465556823472788340736", + "84126238528444563456", + "295017477750399434752" + ], + "expectedQty": "848518705697049142069", + "reserves": [ + "24346332062081905736609798", + "9677342432934827130220614", + "80138637569189595154300854" + ], + "mAssetSupply": "113571270574991363279803005" + }, + { + "type": "mintMulti", + "inputQtys": [ + "32195421783872847740928", + "100781728861172600406016", + "69883019907280555474944" + ], + "expectedQty": "208165837642056706328908", + "reserves": [ + "24378527483865778584350726", + "9778124161795999730626630", + "80208520589096875709775798" + ], + "mAssetSupply": "113779436412633419986131913" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "44833111842561200226304", + "expectedQty": "42198888949448802370566", + "swapFee": "26899867105536720135", + "reserves": [ + "24378527483865778584350726", + "9735925272846550928256064", + "80208520589096875709775798" + ], + "mAssetSupply": "113734630200657964322625744" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "770185878566623510528", + "3163122607662691254272", + "444376747426016526336" + ], + "expectedQty": "4572403495501436444323", + "swapFee": "2745089150791336668", + "reserves": [ + "24377757297987211960840198", + "9732762150238888237001792", + "80208076212349449693249462" + ], + "mAssetSupply": "113730057797162462886181421" + }, + { + "type": "redeemMasset", + "inputQty": "12965599524409268869529", + "expectedQtys": [ + "2778310526500958603113", + "1109233930069992957132", + "9141240505727776387530" + ], + "redemptionFee": "3889679857322780660", + "reserves": [ + "24374978987460711002237085", + "9731652916308818244044660", + "80198934971843721916861932" + ], + "mAssetSupply": "113717096087317910940092552" + }, + { + "type": "mintMulti", + "inputQtys": [ + "1044526458550875979776", + "1837299802136800395264", + "1338015954789026758656" + ], + "expectedQty": "4319010386782255559023", + "reserves": [ + "24376023513919261878216861", + "9733490216110955044439924", + "80200272987798510943620588" + ], + "mAssetSupply": "113721415097704693195651575" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "330388835659690111139840", + "593369585801651596296192", + "364998737158089176252416" + ], + "expectedQty": "1323956722525234613439863", + "swapFee": "794850944081589721897", + "reserves": [ + "24045634678259571767077021", + "9140120630309303448143732", + "79835274250640421767368172" + ], + "mAssetSupply": "112397458375179458582211712" + }, + { + "type": "mintMulti", + "inputQtys": [ + "8405028171213381632", + "48204219619283230720", + "60594125853518405632" + ], + "expectedQty": "119527397717940074432", + "reserves": [ + "24045643083287742980458653", + "9140168834528922731374452", + "79835334844766275285773804" + ], + "mAssetSupply": "112397577902577176522286144" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "293655066558496866304", + "expectedQty": "291108164886225408423", + "swapFee": "176193039935098119", + "reserves": [ + "24045351975122856755050230", + "9140168834528922731374452", + "79835334844766275285773804" + ], + "mAssetSupply": "112397284423703657960517959" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "137455251862939125153792", + "expectedQty": "136250958314796288295867", + "swapFee": "82473151117763475092", + "reserves": [ + "23909101016808060466754363", + "9140168834528922731374452", + "79835334844766275285773804" + ], + "mAssetSupply": "112259911644991836598839259" + }, + { + "type": "mintMulti", + "inputQtys": [ + "17338613293372330213376", + "24582177365896592359424", + "184670279261779614760960" + ], + "expectedQty": "225068891469553406192645", + "reserves": [ + "23926439630101432796967739", + "9164751011894819323733876", + "80020005124028054900534764" + ], + "mAssetSupply": "112484980536461390005031904" + }, + { + "type": "mintMulti", + "inputQtys": [ + "53859887961080722358272", + "156386397467314720079872", + "177587099106153913647104" + ], + "expectedQty": "395793237778092410314754", + "reserves": [ + "23980299518062513519326011", + "9321137409362134043813748", + "80197592223134208814181868" + ], + "mAssetSupply": "112880773774239482415346658" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "776375248912916492058624", + "expectedQty": "824891517567324626628135", + "reserves": [ + "23980299518062513519326011", + "10097512658275050535872372", + "80197592223134208814181868" + ] + }, + { + "type": "redeemMasset", + "inputQty": "1697457843603521929216", + "expectedQtys": [ + "357883098790298415848", + "150695745793158035162", + "1196872574452937126665" + ], + "redemptionFee": "509237353081056578", + "reserves": [ + "23979941634963723220910163", + "10097361962529257377837210", + "80196395350559755877055203" + ], + "mAssetSupply": "113703968343200556601102155" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "9008384304378940137406464", + "outputIndex": 0, + "hardLimitError": true + }, + { + "type": "redeemBassets", + "inputQtys": [ + "341189183245196631998464", + "663969844102721653702656", + "629669570531017384525824" + ], + "expectedQty": "1667468347774467692003901", + "swapFee": "1001081657659276180910", + "reserves": [ + "23638752451718526588911699", + "9433392118426535724134554", + "79566725780028738492529379" + ], + "mAssetSupply": "112036499995426088909098254" + }, + { + "type": "mintMulti", + "inputQtys": [ + "68971768053669904384", + "103623183278753464320", + "104367604720459563008" + ], + "expectedQty": "282434183895897543157", + "reserves": [ + "23638821423486580258816083", + "9433495741609814477598874", + "79566830147633458952092387" + ], + "mAssetSupply": "112036782429609984806641411" + }, + { + "type": "mintMulti", + "inputQtys": [ + "438078235703678009344", + "2903114955723471585280", + "5484643283963159248896" + ], + "expectedQty": "8920667464853995777949", + "reserves": [ + "23639259501722283936825427", + "9436398856565537949184154", + "79572314790917422111341283" + ], + "mAssetSupply": "112045703097074838802419360" + }, + { + "type": "mintMulti", + "inputQtys": [ + "142964729662824890368", + "246327979799701618688", + "315608124744953626624" + ], + "expectedQty": "716517954102676997582", + "reserves": [ + "23639402466451946761715795", + "9436645184545337650802842", + "79572630399042167064967907" + ], + "mAssetSupply": "112046419615028941479416942" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "52519135453812545814528", + "30179701318260491288576", + "25973311347571698958336" + ], + "expectedQty": "110627583641894436274387", + "swapFee": "66416400025151752816", + "reserves": [ + "23586883330998134215901267", + "9406465483227077159514266", + "79546657087694595366009571" + ], + "mAssetSupply": "111935792031387047043142555" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "372615879687403798528", + "outputIndex": 2, + "expectedQty": "382440765992500618234", + "swapFee": "225495823588451690", + "reserves": [ + "23587255946877821619699795", + "9406465483227077159514266", + "79546274646928602865391337" + ], + "mAssetSupply": "111935792256882870631594245", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mintMulti", + "inputQtys": [ + "23116580516873297920", + "16424454513056483328", + "22241457544697769984" + ], + "expectedQty": "62658136836630314275", + "reserves": [ + "23587279063458338492997715", + "9406481907681590215997594", + "79546296888386147563161321" + ], + "mAssetSupply": "111935854915019707261908520" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "2499669469756884841922560", + "expectedQty": "2453966011854205464425559", + "reserves": [ + "23587279063458338492997715", + "9406481907681590215997594", + "82045966358143032405083881" + ] + }, + { + "type": "redeemMasset", + "inputQty": "417275848425435975961804", + "expectedQtys": [ + "86016824599954564911448", + "34303053869794754626301", + "299200831023170354744985" + ], + "redemptionFee": "125182754527630792788", + "reserves": [ + "23501262238858383928086267", + "9372178853811795461371293", + "81746765527119862050338896" + ], + "mAssetSupply": "113972670261203004381165063" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "9383728673462855680", + "expectedQty": "9474421781131940590", + "reserves": [ + "23501271622587057390941947", + "9372178853811795461371293", + "81746765527119862050338896" + ] + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "2152410350480233739583488", + "expectedQty": "2126995002485812856219971", + "swapFee": "1291446210288140243750", + "reserves": [ + "21374276620101244534721976", + "9372178853811795461371293", + "81746765527119862050338896" + ], + "mAssetSupply": "111821560831354839913765915" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "2573130484975123038208", + "5801052833263090925568", + "3251078935981465272320" + ], + "expectedQty": "12002414461100468092128", + "swapFee": "7205772139944247403", + "reserves": [ + "21371703489616269411683768", + "9366377800978532370445725", + "81743514448183880585066576" + ], + "mAssetSupply": "111809558416893739445673787" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "6929128176826029441024", + "expectedQty": "7064243894334558279140", + "swapFee": "4157476906095617664", + "reserves": [ + "21371703489616269411683768", + "9366377800978532370445725", + "81736450204289546026787436" + ], + "mAssetSupply": "111802633446193819511850427" + }, + { + "type": "mintMulti", + "inputQtys": [ + "5082084672546200879104", + "69999287683190366404608", + "26825211365768686469120" + ], + "expectedQty": "106328656403836224835249", + "reserves": [ + "21376785574288815612562872", + "9436377088661722736850333", + "81763275415655314713256556" + ], + "mAssetSupply": "111908962102597655736685676" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "622075434458370124283904", + "expectedQty": "578992277077948605846968", + "swapFee": "373245260675022074570", + "reserves": [ + "21376785574288815612562872", + "8857384811583774131003365", + "81763275415655314713256556" + ], + "mAssetSupply": "111287259913399960634476342" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "917932105660681027584", + "expectedQty": "850554211044245799879", + "swapFee": "550759263396408616", + "reserves": [ + "21376785574288815612562872", + "8856534257372729885203486", + "81763275415655314713256556" + ], + "mAssetSupply": "111286342532053563349857374" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "980077759981158869762048", + "outputIndex": 1, + "expectedQty": "880372780235898390880843", + "swapFee": "575773037847490675402", + "reserves": [ + "21376785574288815612562872", + "7976161477136831494322643", + "82743353175636473583018604" + ], + "mAssetSupply": "111286918305091410840532776", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "207753633510346304", + "expectedQty": "204689402305630622", + "swapFee": "124652180106207", + "reserves": [ + "21376785369599413306932250", + "7976161477136831494322643", + "82743353175636473583018604" + ], + "mAssetSupply": "111286918097462429510292679" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "9951299983724428285444096", + "hardLimitError": true + }, + { + "type": "redeemBassets", + "inputQtys": [ + "137235624290447729360896", + "41812322432833273462784", + "152100668184302247215104" + ], + "expectedQty": "333778693720450667455739", + "swapFee": "200387448701491295250", + "reserves": [ + "21239549745308965577571354", + "7934349154703998220859859", + "82591252507452171335803500" + ], + "mAssetSupply": "110953139403741978842836940" + }, + { + "type": "mintMulti", + "inputQtys": [ + "860123772822466068480", + "996884154637531348992", + "251868553493335408640" + ], + "expectedQty": "2215085937204247162667", + "reserves": [ + "21240409869081788043639834", + "7935346038858635752208851", + "82591504376005664671212140" + ], + "mAssetSupply": "110955354489679183089999607" + }, + { + "type": "mintMulti", + "inputQtys": [ + "97327610411965267968", + "341659712822645489664", + "185605186185722429440" + ], + "expectedQty": "655807646176927526636", + "reserves": [ + "21240507196692200008907802", + "7935687698571458397698515", + "82591689981191850393641580" + ], + "mAssetSupply": "110956010297325360017526243" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "184011566993320214528", + "expectedQty": "202373917800074703140", + "reserves": [ + "21240507196692200008907802", + "7935871710138451717913043", + "82591689981191850393641580" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "1831359192346728473821184", + "5072937810599709318840320", + "3515842169163590123126784" + ], + "expectedQty": "10697995286851295283031670", + "reserves": [ + "23071866389038928482728986", + "13008809520738161036753363", + "86107532150355440516768364" + ], + "mAssetSupply": "121654207958094455375261053" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "13595292887916505726976", + "39967721387627917606912", + "1807028545349561352192" + ], + "expectedQty": "57107734169950400000602", + "swapFee": "34285211628947608565", + "reserves": [ + "23058271096151011977002010", + "12968841799350533119146451", + "86105725121810090955416172" + ], + "mAssetSupply": "121597100223924504975260451" + }, + { + "type": "mintMulti", + "inputQtys": [ + "2161040203001995991187456", + "176893057662169636667392", + "304007104663257935249408" + ], + "expectedQty": "2666548172485870314344216", + "reserves": [ + "25219311299153007968189466", + "13145734857012702755813843", + "86409732226473348890665580" + ], + "mAssetSupply": "124263648396410375289604667" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "3149097628864028344320", + "outputIndex": 0, + "expectedQty": "3074010246603724717412", + "swapFee": "1862029053823018640", + "reserves": [ + "25216237288906404243472054", + "13145734857012702755813843", + "86412881324102212919009900" + ], + "mAssetSupply": "124263650258439429112623307", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "254709140637733399560192", + "expectedQty": "252261861818636488082203", + "swapFee": "152825484382640039736", + "reserves": [ + "24963975427087767755389851", + "13145734857012702755813843", + "86412881324102212919009900" + ], + "mAssetSupply": "124009093943286078353102851" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "88136018508364273156096", + "expectedQty": "91583944097052485055227", + "reserves": [ + "24963975427087767755389851", + "13233870875521067028969939", + "86412881324102212919009900" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "44163452923938", + "128689776998691", + "159497899605893" + ], + "expectedQty": "335443066353391", + "reserves": [ + "24963975427131931208313789", + "13233870875649756805968630", + "86412881324261710818615793" + ], + "mAssetSupply": "124100677887718573904511469" + }, + { + "type": "mintMulti", + "inputQtys": [ + "1233543839752223981568", + "798313954688253558784", + "1764048590321773969408" + ], + "expectedQty": "3812701764765027853092", + "reserves": [ + "24965208970971683432295357", + "13234669189604445059527414", + "86414645372852032592585201" + ], + "mAssetSupply": "124104490589483338932364561" + }, + { + "type": "mintMulti", + "inputQtys": [ + "11004226646908835201024", + "17246656413388209389568", + "17940245863687079854080" + ], + "expectedQty": "46701664350801557472484", + "reserves": [ + "24976213197618592267496381", + "13251915846017833268916982", + "86432585618715719672439281" + ], + "mAssetSupply": "124151192253834140489837045" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "47863779466293651963904", + "expectedQty": "49712330136265827345058", + "reserves": [ + "24976213197618592267496381", + "13299779625484126920880886", + "86432585618715719672439281" + ] + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "23638924649208511201280", + "expectedQty": "23297009157922144684665", + "reserves": [ + "24976213197618592267496381", + "13299779625484126920880886", + "86456224543364928183640561" + ] + }, + { + "type": "redeemMasset", + "inputQty": "3349600111227494", + "expectedQtys": [ + "673260341658414", + "358509678940793", + "2330519315078252" + ], + "redemptionFee": "1004880033368", + "reserves": [ + "24976213196945331925837967", + "13299779625125617241940093", + "86456224541034408868562309" + ], + "mAssetSupply": "124224201589779733230672642" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "17452140163065511411712", + "outputIndex": 2, + "expectedQty": "18377818550656096466183", + "swapFee": "10873894603900092429", + "reserves": [ + "24976213196945331925837967", + "13317231765288682753351805", + "86437846722483752772096126" + ], + "mAssetSupply": "124224212463674337130765071", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemMasset", + "inputQty": "9505281414212661071052", + "expectedQtys": [ + "1910535060845802541610", + "1018690783921768817655", + "6611992596520520296163" + ], + "redemptionFee": "2851584424263798321", + "reserves": [ + "24974302661884486123296357", + "13316213074504760984534150", + "86431234729887232251799963" + ], + "mAssetSupply": "124214710033844548733492340" + }, + { + "type": "mintMulti", + "inputQtys": [ + "77072219122082246557696", + "8836970688676783718400", + "121963774659451343077376" + ], + "expectedQty": "207160236855120775365713", + "reserves": [ + "25051374881006568369854053", + "13325050045193437768252550", + "86553198504546683594877339" + ], + "mAssetSupply": "124421870270699669508858053" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "2375862061313991114752", + "5326550734928148955136", + "1645471159833239486464" + ], + "expectedQty": "9550754312296850692896", + "swapFee": "5733892923131989609", + "reserves": [ + "25048999018945254378739301", + "13319723494458509619297414", + "86551553033386850355390875" + ], + "mAssetSupply": "124412319516387372658165157" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "11021393877731704307712", + "38885566098192895836160", + "23984249289728786956288" + ], + "expectedQty": "75145464492275570419806", + "swapFee": "45114347303747590806", + "reserves": [ + "25037977625067522674431589", + "13280837928360316723461254", + "86527568784097121568434587" + ], + "mAssetSupply": "124337174051895097087745351" + }, + { + "type": "mintMulti", + "inputQtys": [ + "374850515688232620916736", + "314638302179157017100288", + "384152797849727312855040" + ], + "expectedQty": "1083461044491230651322984", + "reserves": [ + "25412828140755755295348325", + "13595476230539473740561542", + "86911721581946848881289627" + ], + "mAssetSupply": "125420635096386327739068335" + }, + { + "type": "redeemMasset", + "inputQty": "50448974051831466006937", + "expectedQtys": [ + "10218944363815699583180", + "5466979685612038655903", + "34948729141444638986753" + ], + "redemptionFee": "15134692215549439802", + "reserves": [ + "25402609196391939595765145", + "13590009250853861701905639", + "86876772852805404242302874" + ], + "mAssetSupply": "125370201257026711822501200" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "91277257895752333524992", + "expectedQty": "94649099274197848010162", + "reserves": [ + "25402609196391939595765145", + "13681286508749614035430631", + "86876772852805404242302874" + ] + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "7292602552606869422080", + "expectedQty": "7357352005051201626036", + "reserves": [ + "25409901798944546465187225", + "13681286508749614035430631", + "86876772852805404242302874" + ] + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "679139749026126178025472", + "expectedQty": "684917876119828306985987", + "reserves": [ + "26089041547970672643212697", + "13681286508749614035430631", + "86876772852805404242302874" + ] + }, + { + "type": "redeemMasset", + "inputQty": "179139333816209569008844", + "expectedQtys": [ + "37034542671340166219354", + "19421188320600840781666", + "123325402562203987982393" + ], + "redemptionFee": "53741800144862870702", + "reserves": [ + "26052007005299332476993343", + "13661865320429013194648965", + "86753447450243200254320481" + ], + "mAssetSupply": "125978039992409724472985243" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "5301278413128644608", + "8832788746701908992", + "159736992050723840" + ], + "expectedQty": "14658812611389432553", + "swapFee": "8800567907578206", + "reserves": [ + "26052001704020919348348735", + "13661856487640266492739973", + "86753447290506208203596641" + ], + "mAssetSupply": "125978025333597113083552690" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "445038711612963749888", + "expectedQty": "448665654703138828570", + "reserves": [ + "26052446742732532312098623", + "13661856487640266492739973", + "86753447290506208203596641" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "4555000447439459840", + "7942140384234983424", + "8057745492491565056" + ], + "expectedQty": "20771639963165306758", + "reserves": [ + "26052451297732979751558463", + "13661864429780650727723397", + "86753455348251700695161697" + ], + "mAssetSupply": "125978494770891779387688018" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "15262132033090884730880", + "4296937996533601140736", + "20586821993873346134016" + ], + "expectedQty": "40142525902485931714202", + "swapFee": "24099975526807643614", + "reserves": [ + "26037189165699888866827583", + "13657567491784117126582661", + "86732868526257827349027681" + ], + "mAssetSupply": "125938352244989293455973816" + }, + { + "type": "mintMulti", + "inputQtys": [ + "55429345694901122105344", + "37385059115416818810880", + "189056933669324290260992" + ], + "expectedQty": "281073248140851805902089", + "reserves": [ + "26092618511394789988932927", + "13694952550899533945393541", + "86921925459927151639288673" + ], + "mAssetSupply": "126219425493130145261875905" + }, + { + "type": "mintMulti", + "inputQtys": [ + "13563938011968157253632", + "107778891520256726007808", + "87981229939849789702144" + ], + "expectedQty": "212140928820354708166874", + "reserves": [ + "26106182449406758146186559", + "13802731442419790671401349", + "87009906689867001428990817" + ], + "mAssetSupply": "126431566421950499970042779" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "431427541049282624749568", + "expectedQty": "415669388156857151713618", + "swapFee": "258856524629569574849", + "reserves": [ + "26106182449406758146186559", + "13387062054262933519687731", + "87009906689867001428990817" + ], + "mAssetSupply": "126000397737425846914868060" + }, + { + "type": "mintMulti", + "inputQtys": [ + "499012112134180324769792", + "1495339835270567550779392", + "1469481376393283938287616" + ], + "expectedQty": "3500384069550848833878591", + "reserves": [ + "26605194561540938470956351", + "14882401889533501070467123", + "88479388066260285367278433" + ], + "mAssetSupply": "129500781806976695748746651" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "190703658261700672", + "331666778444787008", + "195658176231669536" + ], + "expectedQty": "727639988574243656", + "swapFee": "436846100805029", + "reserves": [ + "26605194370837280209255679", + "14882401557866722625680115", + "88479387870602109135608897" + ], + "mAssetSupply": "129500781079336707174502995" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "2127168840595235888168960", + "expectedQty": "2098818134565158786036287", + "reserves": [ + "26605194370837280209255679", + "14882401557866722625680115", + "90606556711197345023777857" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "20513474405611021008896", + "14366047299094133604352", + "30103342431336331739136" + ], + "expectedQty": "65237481886695448622963", + "reserves": [ + "26625707845242891230264575", + "14896767605165816759284467", + "90636660053628681355516993" + ], + "mAssetSupply": "131664836695788561409162245" + }, + { + "type": "redeemMasset", + "inputQty": "1164588387542277734", + "expectedQtys": [ + "235436343883034030", + "131723840771507795", + "801449636149611660" + ], + "redemptionFee": "349376516262683", + "reserves": [ + "26625707609806547347230545", + "14896767473441975987776672", + "90636659252179045205905333" + ], + "mAssetSupply": "131664835531549550383147194" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "97413119750621020160", + "expectedQty": "98691458344534134392", + "swapFee": "58447871850372612", + "reserves": [ + "26625707609806547347230545", + "14896767473441975987776672", + "90636560560720700671770941" + ], + "mAssetSupply": "131664738176877671612499646" + }, + { + "type": "mintMulti", + "inputQtys": [ + "72409138256227610918912", + "141865296850361455214592", + "26043410131767139500032" + ], + "expectedQty": "245319002174116093246319", + "reserves": [ + "26698116748062774958149457", + "15038632770292337442991264", + "90662603970852467811270973" + ], + "mAssetSupply": "131910057179051787705745965" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "2232270455044012507136", + "expectedQty": "2211731388344347552670", + "swapFee": "1339362273026407504", + "reserves": [ + "26695905016674430610596787", + "15038632770292337442991264", + "90662603970852467811270973" + ], + "mAssetSupply": "131907826247959016719646333" + }, + { + "type": "redeemMasset", + "inputQty": "95877043902179618848768", + "expectedQtys": [ + "19398065093916404421778", + "10927532788996093621524", + "65878234594859324116228" + ], + "redemptionFee": "28763113170653885654", + "reserves": [ + "26676506951580514206175009", + "15027705237503341349369740", + "90596725736257608487154745" + ], + "mAssetSupply": "131811977967170007754683219" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "5903956021452136775680", + "expectedQty": "5980681677340688939491", + "swapFee": "3542373612871282065", + "reserves": [ + "26676506951580514206175009", + "15027705237503341349369740", + "90590745054580267798215254" + ], + "mAssetSupply": "131806077553522168489189604" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "1967849052965987632021504", + "expectedQty": "1983082784862799883357030", + "reserves": [ + "28644356004546501838196513", + "15027705237503341349369740", + "90590745054580267798215254" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "63115450839484176", + "87422737099812576", + "67696811236425880" + ], + "expectedQty": "220682453880216083", + "reserves": [ + "28644356067661952677680689", + "15027705324926078449182316", + "90590745122277079034641134" + ], + "mAssetSupply": "133789160559067422252762717" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "7317780153515467776", + "expectedQty": "7559350254511654181", + "reserves": [ + "28644356067661952677680689", + "15027712642706231964650092", + "90590745122277079034641134" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "7678248684492326699008", + "147680256815167897600", + "6098157926904636637184" + ], + "expectedQty": "13903118938430893932991", + "reserves": [ + "28652034316346445004379697", + "15027860322963047132547692", + "90596843280203983671278318" + ], + "mAssetSupply": "133803071237356107658349889" + }, + { + "type": "mintMulti", + "inputQtys": [ + "68607483862823234174976", + "7830933874741252980736", + "63001015192619419959296" + ], + "expectedQty": "139356322218523658706322", + "reserves": [ + "28720641800209268238554673", + "15035691256837788385528428", + "90659844295396603091237614" + ], + "mAssetSupply": "133942427559574631317056211" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "85544008951848037777408", + "expectedQty": "84910979667271463104258", + "swapFee": "51326405371108822666", + "reserves": [ + "28635730820541996775450415", + "15035691256837788385528428", + "90659844295396603091237614" + ], + "mAssetSupply": "133856934877028154388101469" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "282172046775768953389056", + "expectedQty": "278528372669274942570296", + "reserves": [ + "28635730820541996775450415", + "15035691256837788385528428", + "90942016342172372044626670" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "43154463617997692993536", + "22778345076312128880640", + "82747865126109806854144" + ], + "expectedQty": "148666789425156516835202", + "reserves": [ + "28678885284159994468443951", + "15058469601914100514409068", + "91024764207298481851480814" + ], + "mAssetSupply": "134284130039122585847506967" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "24637078959800287494144", + "10701422119596943474688", + "26606612533571198386176" + ], + "expectedQty": "62127588413520998048422", + "swapFee": "37298932407557133108", + "reserves": [ + "28654248205200194180949807", + "15047768179794503570934380", + "90998157594764910653094638" + ], + "mAssetSupply": "134222002450709064849458545" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "21230397810017711423488", + "expectedQty": "21495753392992250220654", + "swapFee": "12738238686010626854", + "reserves": [ + "28654248205200194180949807", + "15047768179794503570934380", + "90976661841371918402873984" + ], + "mAssetSupply": "134200784791137733148661911" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "24743423257453694976", + "expectedQty": "24423367769000998469", + "reserves": [ + "28654248205200194180949807", + "15047768179794503570934380", + "90976686584795175856568960" + ] + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "119504355244389385109504", + "outputIndex": 1, + "expectedQty": "116361734510840988927480", + "swapFee": "72197556762660451908", + "reserves": [ + "28773752560444583566059311", + "14931406445283662582006900", + "90976686584795175856568960" + ], + "mAssetSupply": "134200881412062264810112288", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemBassets", + "inputQtys": [ + "342741146265447104", + "303916586696023232", + "576304886201576192" + ], + "expectedQty": "1228078226037837379", + "swapFee": "737289309208227", + "reserves": [ + "28773752217703437300612207", + "14931406141367075885983668", + "90976686008490289654992768" + ], + "mAssetSupply": "134200880183984038772274909" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "1290237031015206354944", + "864017102163919634432", + "576888653520416997376" + ], + "expectedQty": "2761639869369273123627", + "swapFee": "1657978708846871997", + "reserves": [ + "28772461980672422094257263", + "14930542124264911966349236", + "90976109119836769237995392" + ], + "mAssetSupply": "134198118544114669499151282" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "548556063158184771584", + "expectedQty": "552312253797307237311", + "reserves": [ + "28773010536735580279028847", + "14930542124264911966349236", + "90976109119836769237995392" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "2204039082904755776782336", + "776129750247487358107648", + "1388187956404756798242816" + ], + "expectedQty": "4389788440366973181192476", + "reserves": [ + "30977049619640336055811183", + "15706671874512399324456884", + "92364297076241526036238208" + ], + "mAssetSupply": "138588459296735439987581069" + }, + { + "type": "redeemMasset", + "inputQty": "119240322271215846686720", + "expectedQtys": [ + "26644392212609314619330", + "13509831663049352664380", + "79445608537909451299738" + ], + "redemptionFee": "35772096681364754006", + "reserves": [ + "30950405227427726741191853", + "15693162042849349971792504", + "92284851467703616584938470" + ], + "mAssetSupply": "138469254746560905505648355" + }, + { + "type": "mintMulti", + "inputQtys": [ + "299253980733312606404608", + "382572600505080781733888", + "78835435944494275493888" + ], + "expectedQty": "773117269208003848396985", + "reserves": [ + "31249659208161039347596461", + "16075734643354430753526392", + "92363686903648110860432358" + ], + "mAssetSupply": "139242372015768909354045340" + }, + { + "type": "redeemMasset", + "inputQty": "38772793891919091256524", + "expectedQtys": [ + "8699026647972243303699", + "4475032611291640669378", + "25711453949871159766580" + ], + "redemptionFee": "11631838167575727376", + "reserves": [ + "31240960181513067104292762", + "16071259610743139112857014", + "92337975449698239700665778" + ], + "mAssetSupply": "139203610853715157838516192" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "448662289484330968285184", + "expectedQty": "453769675526547497735612", + "swapFee": "269197373690598580971", + "reserves": [ + "31240960181513067104292762", + "16071259610743139112857014", + "91884205774171692202930166" + ], + "mAssetSupply": "138755217761604517468811979" + }, + { + "type": "mintMulti", + "inputQtys": [ + "19312754710586939408384", + "114251844000064328433664", + "57724715574452180484096" + ], + "expectedQty": "194089281023424479467966", + "reserves": [ + "31260272936223654043701146", + "16185511454743203441290678", + "91941930489746144383414262" + ], + "mAssetSupply": "138949307042627941948279945" + }, + { + "type": "redeemMasset", + "inputQty": "529696423245769185689", + "expectedQtys": [ + "119133283784542952322", + "61683182781859284921", + "350391825403455685844" + ], + "redemptionFee": "158908926973730755", + "reserves": [ + "31260153802939869500748824", + "16185449771560421582005757", + "91941580097920740927728418" + ], + "mAssetSupply": "138948777505113623152825011" + }, + { + "type": "mintMulti", + "inputQtys": [ + "1840355493270171697545216", + "1202903198322746147733504", + "2141285827095003742076928" + ], + "expectedQty": "5203001669750982575586340", + "reserves": [ + "33100509296210041198294040", + "17388352969883167729739261", + "94082865925015744669805346" + ], + "mAssetSupply": "144151779174864605728411351" + }, + { + "type": "mintMulti", + "inputQtys": [ + "2449740383572540260352", + "545506571441148002304", + "1104225105017647661056" + ], + "expectedQty": "4113340251674935400990", + "reserves": [ + "33102959036593613738554392", + "17388898476454608877741565", + "94083970150120762317466402" + ], + "mAssetSupply": "144155892515116280663812341" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "38007187085011487555584", + "expectedQty": "36995920310482656147299", + "swapFee": "22804312251006892533", + "reserves": [ + "33102959036593613738554392", + "17351902556144126221594266", + "94083970150120762317466402" + ], + "mAssetSupply": "144117908132343520183149290" + }, + { + "type": "redeemMasset", + "inputQty": "1731668270222232099225", + "expectedQtys": [ + "397633767750548923205", + "208431590161251282165", + "1130139559257128832810" + ], + "redemptionFee": "519500481066669629", + "reserves": [ + "33102561402825863189631187", + "17351694124553964970312101", + "94082840010561505188633592" + ], + "mAssetSupply": "144116176983573779017719694" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "18348289892322103001088", + "expectedQty": "18839066916260932448905", + "reserves": [ + "33102561402825863189631187", + "17370042414446287073313189", + "94082840010561505188633592" + ] + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "117889991633638155878400", + "expectedQty": "114732669324493485475213", + "swapFee": "70733994980182893527", + "reserves": [ + "33102561402825863189631187", + "17255309745121793587837976", + "94082840010561505188633592" + ], + "mAssetSupply": "144017196792851381977183726" + }, + { + "type": "mintMulti", + "inputQtys": [ + "9149860597769145679872", + "15804897616288748142592", + "10475300117469842112512" + ], + "expectedQty": "35784283634310709104960", + "reserves": [ + "33111711263423632335311059", + "17271114642738082335980568", + "94093315310678975030746104" + ], + "mAssetSupply": "144052981076485692686288686" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "582365514964519868170240", + "expectedQty": "588525855918655776390109", + "swapFee": "349419308978711920902", + "reserves": [ + "33111711263423632335311059", + "17271114642738082335980568", + "93504789454760319254355995" + ], + "mAssetSupply": "143470964980830151530039348" + }, + { + "type": "mintMulti", + "inputQtys": [ + "674022281595963965440", + "1903525745325429489664", + "1572396215628940705792" + ], + "expectedQty": "4186566314696502156925", + "reserves": [ + "33112385285705228299276499", + "17273018168483407765470232", + "93506361850975948195061787" + ], + "mAssetSupply": "143475151547144848032196273" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "1548080194493210737770496", + "1938476007599141115920384", + "917063593364979936395264" + ], + "expectedQty": "4458234179244174299148981", + "swapFee": "2676546435407749229026", + "reserves": [ + "31564305091212017561506003", + "15334542160884266649549848", + "92589298257610968258666523" + ], + "mAssetSupply": "139016917367900673733047292" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "9605076408825276268544", + "expectedQty": "9924635010443201439012", + "reserves": [ + "31564305091212017561506003", + "15344147237293091925818392", + "92589298257610968258666523" + ] + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "24953549217828440113152", + "expectedQty": "25250480241893471006614", + "swapFee": "14972129530697064067", + "reserves": [ + "31564305091212017561506003", + "15344147237293091925818392", + "92564047777369074787659909" + ], + "mAssetSupply": "139001903425822819191437219" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "988800701795490332672", + "2386464833599862472704", + "3866061269035236458496" + ], + "expectedQty": "7277987820084609574552", + "swapFee": "4369414340655158840", + "reserves": [ + "31563316290510222071173331", + "15341760772459492063345688", + "92560181716100039551201413" + ], + "mAssetSupply": "138994625438002734581862667" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "931332676857200246784", + "expectedQty": "942413671651530053239", + "swapFee": "558799606114320148", + "reserves": [ + "31563316290510222071173331", + "15341760772459492063345688", + "92559239302428388021148174" + ], + "mAssetSupply": "138993694664125483495936031" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "78507962617893126144", + "outputIndex": 1, + "expectedQty": "76328164794055834237", + "swapFee": "47347507359850383", + "reserves": [ + "31563394798472839964299475", + "15341684444294698007511451", + "92559239302428388021148174" + ], + "mAssetSupply": "138993694711472990855786414", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemMasset", + "inputQty": "61680535653197532364", + "expectedQtys": [ + "14002527583095046183", + "6806060025354771003", + "41062227611373957075" + ], + "redemptionFee": "18504160695959259", + "reserves": [ + "31563380795945256869253292", + "15341677638234672652740448", + "92559198240200776647191099" + ], + "mAssetSupply": "138993633049441498354213309" + }, + { + "type": "redeemMasset", + "inputQty": "25070346027051810344140", + "expectedQtys": [ + "5691393695659837605454", + "2766355351968860796535", + "16689937011034041160816" + ], + "redemptionFee": "7521103808115543103", + "reserves": [ + "31557689402249597031647838", + "15338911282882703791943913", + "92542508303189742606030283" + ], + "mAssetSupply": "138968570224518254659412272" + }, + { + "type": "redeemMasset", + "inputQty": "152642866949828431052", + "expectedQtys": [ + "34652519343302383477", + "16843182438363237647", + "101618056321493686793" + ], + "redemptionFee": "45792860084948529", + "reserves": [ + "31557654749730253729264361", + "15338894439700265428706266", + "92542406685133421112343490" + ], + "mAssetSupply": "138968417627444164915929749" + }, + { + "type": "redeemMasset", + "inputQty": "3075430695285638666649", + "expectedQtys": [ + "698174921546776394406", + "339354476971821142060", + "2047388756849720497639" + ], + "redemptionFee": "922629208585691599", + "reserves": [ + "31556956574808706952869955", + "15338555085223293607564206", + "92540359296376571391845851" + ], + "mAssetSupply": "138965343119378087862954699" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "2740708292795659142037504", + "expectedQty": "2633092237646273157882784", + "swapFee": "1644424975677395485222", + "reserves": [ + "31556956574808706952869955", + "12705462847577020449681422", + "92540359296376571391845851" + ], + "mAssetSupply": "136226279251558106116402417" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "1182124778636421971836928", + "expectedQty": "1198728180083267159153111", + "swapFee": "709274867181853183102", + "reserves": [ + "31556956574808706952869955", + "12705462847577020449681422", + "91341631116293304232692740" + ], + "mAssetSupply": "135044863747788865997748591" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "16368000366201179996160", + "37626336085029918081024", + "59580606243755226300416" + ], + "expectedQty": "114586444743729993792528", + "swapFee": "68793142731877122549", + "reserves": [ + "31540588574442505772873795", + "12667836511491990531600398", + "91282050510049549006392324" + ], + "mAssetSupply": "134930277303045136003956063" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "896444474765615887810560", + "expectedQty": "852330186974967148998336", + "swapFee": "537866684859369532686", + "reserves": [ + "31540588574442505772873795", + "11815506324517023382602062", + "91282050510049549006392324" + ], + "mAssetSupply": "134034370694964379485678189" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "221815658468915488", + "expectedQty": "218431494732112829", + "reserves": [ + "31540588574442505772873795", + "11815506324517023382602062", + "91282050731865207475307812" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "119629335333150130176000", + "121741243224222064443392", + "82104917809478343065600" + ], + "expectedQty": "329491199306432408158916", + "swapFee": "197813407628436506799", + "reserves": [ + "31420959239109355642697795", + "11693765081292801318158670", + "91199945814055729132242212" + ], + "mAssetSupply": "133704879714089441809632102" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "377191069146071254958080", + "244613214463855547121664", + "163909083774526446108672" + ], + "expectedQty": "798830763151668250704626", + "swapFee": "479586209616771013030", + "reserves": [ + "31043768169963284387739715", + "11449151866828945771037006", + "91036036730281202686133540" + ], + "mAssetSupply": "132906048950937773558927476" + }, + { + "type": "mintMulti", + "inputQtys": [ + "8287794618682697580544", + "9099438348927207735296", + "4606429311719651672064" + ], + "expectedQty": "22487834066957649666921", + "reserves": [ + "31052055964581967085320259", + "11458251305177872978772302", + "91040643159592922337805604" + ], + "mAssetSupply": "132928536785004731208594397" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "1454571434115895845191680", + "expectedQty": "1529326318586373714505028", + "reserves": [ + "31052055964581967085320259", + "12912822739293768823963982", + "91040643159592922337805604" + ] + }, + { + "type": "redeemMasset", + "inputQty": "95400328111268832686899", + "expectedQtys": [ + "22025395512724323339734", + "9159136784470702645237", + "64575633111378396752091" + ], + "redemptionFee": "28620098433380649806", + "reserves": [ + "31030030569069242761980525", + "12903663602509298121318745", + "90976067526481543941053513" + ], + "mAssetSupply": "134362491395578269471062332" + }, + { + "type": "mintMulti", + "inputQtys": [ + "8259902161515701", + "10489257128786750", + "14574898570567224" + ], + "expectedQty": "33636498329288307", + "reserves": [ + "31030030577329144923496226", + "12903663612998555250105495", + "90976067541056442511620737" + ], + "mAssetSupply": "134362491429214767800350639" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "85755717406467866624", + "expectedQty": "84541503726066020087", + "reserves": [ + "31030030577329144923496226", + "12903663612998555250105495", + "90976153296773848979487361" + ] + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "68830421779169386496", + "expectedQty": "69168929261641640294", + "reserves": [ + "31030099407750924092882722", + "12903663612998555250105495", + "90976153296773848979487361" + ] + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "821650640711246", + "expectedQty": "810016909508633", + "reserves": [ + "31030099407750924092882722", + "12903663612998555250105495", + "90976153297595499620198607" + ] + }, + { + "type": "redeemMasset", + "inputQty": "11030112370174484650393", + "expectedQtys": [ + "2546561980247526695150", + "1058971121264199077196", + "7466183399946102993104" + ], + "redemptionFee": "3309033711052345395", + "reserves": [ + "31027552845770676566187572", + "12902604641877291051028299", + "90968687114195553517205503" + ], + "mAssetSupply": "134351618337121308985214655" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "12266326550367512297472", + "expectedQty": "11724003158313780463234", + "swapFee": "7359795930220507378", + "reserves": [ + "31027552845770676566187572", + "12890880638718977270565065", + "90968687114195553517205503" + ], + "mAssetSupply": "134339359370366871693424561" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "177947006174235176468480", + "expectedQty": "175421980982094386457326", + "reserves": [ + "31027552845770676566187572", + "12890880638718977270565065", + "91146634120369788693673983" + ] + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "1087549215703965045358592", + "expectedQty": "1102428943917885509415392", + "swapFee": "652529529422379027215", + "reserves": [ + "31027552845770676566187572", + "12890880638718977270565065", + "90044205176451903184258591" + ], + "mAssetSupply": "133427884665174423413550510" + }, + { + "type": "mintMulti", + "inputQtys": [ + "2249046398787215687680", + "265924146686393974784", + "4032956611885906001920" + ], + "expectedQty": "6514069442293795897613", + "reserves": [ + "31029801892169463781875252", + "12891146562865663664539849", + "90048238133063789090260511" + ], + "mAssetSupply": "133434398734616717209448123" + }, + { + "type": "redeemMasset", + "inputQty": "230660435278335616378470", + "expectedQtys": [ + "53623357054995681253930", + "22277504619301827378584", + "155614555399436909718927" + ], + "redemptionFee": "69198130583500684913", + "reserves": [ + "30976178535114468100621322", + "12868869058246361837161265", + "89892623577664352180541584" + ], + "mAssetSupply": "133203807497468965093754566" + }, + { + "type": "mintMulti", + "inputQtys": [ + "100152377433448129757184", + "341612447332426563190784", + "68012822371856237461504" + ], + "expectedQty": "524221109729231517562348", + "reserves": [ + "31076330912547916230378506", + "13210481505578788400352049", + "89960636400036208418003088" + ], + "mAssetSupply": "133728028607198196611316914" + }, + { + "type": "mintMulti", + "inputQtys": [ + "1468453723881390211072", + "46408795869597757603840", + "13803974669081870598144" + ], + "expectedQty": "63468199204122016326139", + "reserves": [ + "31077799366271797620589578", + "13256890301448386157955889", + "89974440374705290288601232" + ], + "mAssetSupply": "133791496806402318627643053" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "3294850167112237322338304", + "expectedQty": "3306792966535173191466296", + "reserves": [ + "34372649533384034942927882", + "13256890301448386157955889", + "89974440374705290288601232" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "22054514538725215567872", + "14913862668422668615680", + "14622842362515534381056" + ], + "expectedQty": "52098057095342904551337", + "reserves": [ + "34394704047922760158495754", + "13271804164116808826571569", + "89989063217067805822982288" + ], + "mAssetSupply": "137150387830032834723660686" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "131956941858250080256", + "outputIndex": 1, + "expectedQty": "126808462987157505215", + "swapFee": "79382903337088666", + "reserves": [ + "34394836004864618408576010", + "13271677355653821669066354", + "89989063217067805822982288" + ], + "mAssetSupply": "137150387909415738060749352", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemBassets", + "inputQtys": [ + "961282690827563520", + "5313562618913136640", + "1797833822199101952" + ], + "expectedQty": "8278968967713150477", + "swapFee": "4970363598787162", + "reserves": [ + "34394835043581927581012490", + "13271672042091202755929714", + "89989061419233983623880336" + ], + "mAssetSupply": "137150379630446770347598875" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "1649678281244069748277248", + "outputIndex": 1, + "expectedQty": "1575328300141655084726520", + "swapFee": "991986685306129422101", + "reserves": [ + "36044513324825997329289738", + "11696343741949547671203194", + "89989061419233983623880336" + ], + "mAssetSupply": "137151371617132076477020976", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "82230719057160912", + "expectedQty": "86788957969160314", + "reserves": [ + "36044513324825997329289738", + "11696343824180266728364106", + "89989061419233983623880336" + ] + }, + { + "type": "redeemMasset", + "inputQty": "148551226412163892930150", + "expectedQtys": [ + "39028777155726413675601", + "12664729095850324162607", + "97439601776096812189955" + ], + "redemptionFee": "44565367923649167879", + "reserves": [ + "36005484547670270915614137", + "11683679095084416404201499", + "89891621817457886811690381" + ], + "mAssetSupply": "137002865042876794202419019" + }, + { + "type": "mintMulti", + "inputQtys": [ + "896451494107791126167552", + "344975712469745389273088", + "584897010703560905588736" + ], + "expectedQty": "1837992933689836380233974", + "reserves": [ + "36901936041778062041781689", + "12028654807554161793474587", + "90476518828161447717279117" + ], + "mAssetSupply": "138840857976566630582652993" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "1394063463655481939066880", + "expectedQty": "1391176506378588959281600", + "swapFee": "836438078193289163440", + "reserves": [ + "35510759535399473082500089", + "12028654807554161793474587", + "90476518828161447717279117" + ], + "mAssetSupply": "137447630950989341932749553" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "19960639562412673990656", + "expectedQty": "18946684447264233954027", + "swapFee": "11976383737447604394", + "reserves": [ + "35510759535399473082500089", + "12009708123106897559520560", + "90476518828161447717279117" + ], + "mAssetSupply": "137427682287810666706363291" + }, + { + "type": "mintMulti", + "inputQtys": [ + "1537486603637788160", + "1657042499819758336", + "1318878630338130944" + ], + "expectedQty": "4585474201709782524", + "reserves": [ + "35510761072886076720288249", + "12009709780149397379278896", + "90476520147040078055410061" + ], + "mAssetSupply": "137427686873284868416145815" + }, + { + "type": "mintMulti", + "inputQtys": [ + "276755237998462", + "170285510090291", + "58866234964346" + ], + "expectedQty": "514607115973257", + "reserves": [ + "35510761073162831958286711", + "12009709780319682889369187", + "90476520147098944290374407" + ], + "mAssetSupply": "137427686873799475532119072" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "94484328794800623976448", + "expectedQty": "94252500508480701655460", + "swapFee": "56690597276880374385", + "reserves": [ + "35416508572654351256631251", + "12009709780319682889369187", + "90476520147098944290374407" + ], + "mAssetSupply": "137333259235601951788517009" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "41609281977217779236864", + "expectedQty": "43804633098118307422653", + "reserves": [ + "35416508572654351256631251", + "12051319062296900668606051", + "90476520147098944290374407" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "14918944314992780902400", + "3273470260914175868928", + "11662249764378852196352" + ], + "expectedQty": "29891633659906548282245", + "swapFee": "17945747644530647357", + "reserves": [ + "35401589628339358475728851", + "12048045592035986492737123", + "90464857897334565438178055" + ], + "mAssetSupply": "137347172235040163547657417" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "26059912508176114647040", + "expectedQty": "24740459904474035362126", + "swapFee": "15635947504905668788", + "reserves": [ + "35401589628339358475728851", + "12023305132131512457374997", + "90464857897334565438178055" + ], + "mAssetSupply": "137321127958479492338679165" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "87175691917237585707008", + "expectedQty": "82724733134404894800368", + "swapFee": "52305415150342551424", + "reserves": [ + "35401589628339358475728851", + "11940580398997107562574629", + "90464857897334565438178055" + ], + "mAssetSupply": "137234004571977405095523581" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "394379037742643871744", + "outputIndex": 2, + "expectedQty": "421196495536109923593", + "swapFee": "249295801729917645", + "reserves": [ + "35401589628339358475728851", + "11940974778034850206446373", + "90464436700839029328254462" + ], + "mAssetSupply": "137234004821273206825441226", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mintMulti", + "inputQtys": [ + "1644492775307638016", + "952895474308788992", + "398755130676287616" + ], + "expectedQty": "3044599792076398209", + "reserves": [ + "35401591272832133783366867", + "11940975730930324515235365", + "90464437099594160004542078" + ], + "mAssetSupply": "137234007865872998901839435" + }, + { + "type": "redeemMasset", + "inputQty": "813119814458021825740", + "expectedQtys": [ + "209693647035444626621", + "70729779655472466514", + "535846470748344158664" + ], + "redemptionFee": "243935944337406547", + "reserves": [ + "35401381579185098338740246", + "11940905001150669042768851", + "90463901253123411660383414" + ], + "mAssetSupply": "137233194989994485217420242" + }, + { + "type": "redeemMasset", + "inputQty": "46049186632786680112742", + "expectedQtys": [ + "11875521560720000958511", + "4005619794201778841897", + "30346443044753101270831" + ], + "redemptionFee": "13814755989836004033", + "reserves": [ + "35389506057624378337781735", + "11936899381356467263926954", + "90433554810078658559112583" + ], + "mAssetSupply": "137187159618117688373311533" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "23825041369332617216", + "3021609624034813952", + "32228674856144588800" + ], + "expectedQty": "58826204086780913176", + "swapFee": "35316912599628324", + "reserves": [ + "35389482232583009005164519", + "11936896359746843229113002", + "90433522581403802414523783" + ], + "mAssetSupply": "137187100791913601592398357" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "38131169124514709635072", + "expectedQty": "37592106748504233253446", + "reserves": [ + "35389482232583009005164519", + "11936896359746843229113002", + "90471653750528317124158855" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "4092722541805228169101312", + "2596715032209453549092864", + "7439213157065204057505792" + ], + "expectedQty": "14184966863168104452077726", + "swapFee": "8516089771763921023860", + "reserves": [ + "31296759690777780836063207", + "9340181327537389680020138", + "83032440593463113066653063" + ], + "mAssetSupply": "123039726035494001373574077" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "7691115520844342419783680", + "outputIndex": 0, + "expectedQty": "7489101394818734013697828", + "swapFee": "4533080374302412882953", + "reserves": [ + "23807658295959046822365379", + "9340181327537389680020138", + "90723556114307455486436743" + ], + "mAssetSupply": "123044259115868303786457030", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemMasset", + "inputQty": "60948990907846157873971", + "expectedQtys": [ + "11789395487576495417849", + "4625196238418196042884", + "44925707088649368134227" + ], + "redemptionFee": "18284697272353847362", + "reserves": [ + "23795868900471470326947530", + "9335556131298971483977254", + "90678630407218806118302516" + ], + "mAssetSupply": "122983328409657729982430421" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "440481948292350410752", + "289802496241326751744", + "76388195448385896448" + ], + "expectedQty": "836104201336727153720", + "swapFee": "501963699021449161", + "reserves": [ + "23795428418523177976536778", + "9335266328802730157225510", + "90678554019023357732406068" + ], + "mAssetSupply": "122982492305456393255276701" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "524492073351690305142784", + "expectedQty": "517004240727904701971042", + "swapFee": "314695244011014183085", + "reserves": [ + "23278424177795273274565736", + "9335266328802730157225510", + "90678554019023357732406068" + ], + "mAssetSupply": "122458314927348713964317002" + }, + { + "type": "redeemMasset", + "inputQty": "119450967728938467878502", + "expectedQtys": [ + "22699937589399063060854", + "9103277843281861167932", + "88425122817902660628293" + ], + "redemptionFee": "35835290318681540363", + "reserves": [ + "23255724240205874211504882", + "9326163050959448296057578", + "90590128896205455071777775" + ], + "mAssetSupply": "122338899794910094177978863" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "3573474661315160047616", + "expectedQty": "3884599832165649740251", + "reserves": [ + "23255724240205874211504882", + "9329736525620763456105194", + "90590128896205455071777775" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "131386103703327981568", + "265844545717730213888", + "38092555435533811712" + ], + "expectedQty": "459514538602918983983", + "swapFee": "275874247710377616", + "reserves": [ + "23255592854102170883523314", + "9329470681075045725891306", + "90590090803650019537966063" + ], + "mAssetSupply": "122342324880203656908735131" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "120022199600976102424576", + "expectedQty": "117398273825388032548543", + "reserves": [ + "23255592854102170883523314", + "9329470681075045725891306", + "90710113003250995640390639" + ] + }, + { + "type": "redeemMasset", + "inputQty": "2591704352711621214208", + "expectedQtys": [ + "492027404493736276008", + "197387152127581600683", + "1919188289128060909283" + ], + "redemptionFee": "777511305813486364", + "reserves": [ + "23255100826697677147247306", + "9329273293922918144290623", + "90708193814961867579481356" + ], + "mAssetSupply": "122457132227187639133555830" + }, + { + "type": "redeemMasset", + "inputQty": "1670072618229355354521", + "expectedQtys": [ + "317058346104834870314", + "127194630673688769803", + "1236708889092898142880" + ], + "redemptionFee": "501021785468806606", + "reserves": [ + "23254783768351572312376992", + "9329146099292244455520820", + "90706957106072774681338476" + ], + "mAssetSupply": "122455462655591195247007915" + }, + { + "type": "redeemMasset", + "inputQty": "16140658068252840375091", + "expectedQtys": [ + "3064256186410392910557", + "1229290881972756474326", + "11952351706706419210179" + ], + "redemptionFee": "4842197420475852112", + "reserves": [ + "23251719512165161919466435", + "9327916808410271699046494", + "90695004754366068262128297" + ], + "mAssetSupply": "122439326839720362882484936" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "3715493912874485", + "35943505530385364", + "16064961886388424" + ], + "expectedQty": "58563122248054623", + "swapFee": "35158968730070", + "reserves": [ + "23251719508449668006591950", + "9327916772466766168661130", + "90695004738301106375739873" + ], + "mAssetSupply": "122439326781157240634430313" + }, + { + "type": "redeemMasset", + "inputQty": "283521820923048581136384", + "expectedQtys": [ + "53825778995425347826802", + "21593344376103490960071", + "209951323353046259947958" + ], + "redemptionFee": "85056546276914574340", + "reserves": [ + "23197893729454242658765148", + "9306323428090662677701059", + "90485053414948060115791915" + ], + "mAssetSupply": "122155890016780468967868269" + }, + { + "type": "redeemMasset", + "inputQty": "628778098763075283425689", + "expectedQtys": [ + "119371662015287497868647", + "47888455211451896158094", + "465617755631408780889725" + ], + "redemptionFee": "188633429628922585027", + "reserves": [ + "23078522067438955160896501", + "9258434972879210781542965", + "90019435659316651334902190" + ], + "mAssetSupply": "121527300551447022607027607" + }, + { + "type": "redeemMasset", + "inputQty": "8243685598351351139532", + "expectedQtys": [ + "1565039324592453831462", + "627848472029386834009", + "6104548479004262695703" + ], + "redemptionFee": "2473105679505405341", + "reserves": [ + "23076957028114362707065039", + "9257807124407181394708956", + "90013331110837647072206487" + ], + "mAssetSupply": "121519059338954350761293416" + }, + { + "type": "mintMulti", + "inputQtys": [ + "37466822013209837568", + "1327779154197746810880", + "1788402661341820092416" + ], + "expectedQty": "3230929832623329902710", + "reserves": [ + "23076994494936375916902607", + "9259134903561379141519836", + "90015119513498988892298903" + ], + "mAssetSupply": "121522290268786974091196126" + }, + { + "type": "mintMulti", + "inputQtys": [ + "24969269819789716", + "16985238731454706", + "5656792931883562" + ], + "expectedQty": "49329604460706278", + "reserves": [ + "23076994519905645736692323", + "9259134920546617872974542", + "90015119519155781824182465" + ], + "mAssetSupply": "121522290318116578551902404" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "117281708737798995968", + "expectedQty": "119833365013554864731", + "swapFee": "70369025242679397", + "reserves": [ + "23076994519905645736692323", + "9259134920546617872974542", + "90014999685790768269317734" + ], + "mAssetSupply": "121522173106776865995585833" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "58596471271625353854976", + "16899685325731562258432", + "3297786263727861399552" + ], + "expectedQty": "81047387998677623157841", + "swapFee": "48657627375631953066", + "reserves": [ + "23018398048634020382837347", + "9242235235220886310716110", + "90011701899527040407918182" + ], + "mAssetSupply": "121441125718778188372427992" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "59702287702556512", + "expectedQty": "58811630816225894", + "swapFee": "35821372621533", + "reserves": [ + "23018397989822389566611453", + "9242235235220886310716110", + "90011701899527040407918182" + ], + "mAssetSupply": "121441125659111722042493013" + }, + { + "type": "mintMulti", + "inputQtys": [ + "1039150094760302478360576", + "1090805943308237691420672", + "1985927312839500823003136" + ], + "expectedQty": "4175891109984487811197427", + "reserves": [ + "24057548084582692044972029", + "10333041178529124002136782", + "91997629212366541230921318" + ], + "mAssetSupply": "125617016769096209853690440" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "29760035427402607755264", + "95788242513992932655104", + "97793413527302670647296" + ], + "expectedQty": "228828480543923660194263", + "swapFee": "137379516035975781585", + "reserves": [ + "24027788049155289437216765", + "10237252936015131069481678", + "91899835798839238560274022" + ], + "mAssetSupply": "125388188288552286193496177" + }, + { + "type": "mintMulti", + "inputQtys": [ + "27520427298218242473984", + "43264151894537340452864", + "48012399427573640069120" + ], + "expectedQty": "121397020807959275798569", + "reserves": [ + "24055308476453507679690749", + "10280517087909668409934542", + "91947848198266812200343142" + ], + "mAssetSupply": "125509585309360245469294746" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "23257286008951369891840", + "12160033638553382551552", + "56253971455287173840896" + ], + "expectedQty": "91744096273647003716250", + "swapFee": "55079505467468683439", + "reserves": [ + "24032051190444556309798909", + "10268357054271115027382990", + "91891594226811525026502246" + ], + "mAssetSupply": "125417841213086598465578496" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "2087837740287795134464", + "expectedQty": "1943048910001358585533", + "swapFee": "1252702644172677080", + "reserves": [ + "24032051190444556309798909", + "10266414005361113668797457", + "91891594226811525026502246" + ], + "mAssetSupply": "125415754628048954843121112" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "155054316988688368664576", + "expectedQty": "166340848423021657573980", + "reserves": [ + "24032051190444556309798909", + "10421468322349802037462033", + "91891594226811525026502246" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "143581319455509808414720", + "421794614041632437174272", + "120465001625097636675584" + ], + "expectedQty": "716803362876854860691107", + "swapFee": "430340221859228453486", + "reserves": [ + "23888469870989046501384189", + "9999673708308169600287761", + "91771129225186427389826662" + ], + "mAssetSupply": "124865292113595121640003985" + }, + { + "type": "redeemMasset", + "inputQty": "30028414982904931680256", + "expectedQtys": [ + "5743130653747328720737", + "2404064928051339478938", + "22063095218260376768590" + ], + "redemptionFee": "9008524494871479504", + "reserves": [ + "23882726740335299172663452", + "9997269643380118260808823", + "91749066129968167013058072" + ], + "mAssetSupply": "124835272707136711579803233" + }, + { + "type": "mintMulti", + "inputQtys": [ + "51839812931569376559104", + "299200314223584312557568", + "149415613057454405844992" + ], + "expectedQty": "520717569676060019140892", + "reserves": [ + "23934566553266868549222556", + "10296469957603702573366391", + "91898481743025621418903064" + ], + "mAssetSupply": "125355990276812771598944125" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "19974455099318733897728", + "expectedQty": "18593370270681584718840", + "swapFee": "11984673059591240338", + "reserves": [ + "23934566553266868549222556", + "10277876587333020988647551", + "91898481743025621418903064" + ], + "mAssetSupply": "125336027806386512456286735" + }, + { + "type": "mintMulti", + "inputQtys": [ + "1126199931747498590208", + "944977059514601308160", + "1567938410799589490688" + ], + "expectedQty": "3692291166821787695259", + "reserves": [ + "23935692753198616047812764", + "10278821564392535589955711", + "91900049681436421008393752" + ], + "mAssetSupply": "125339720097553334243981994" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "18172734593665308033024", + "expectedQty": "18416206951202741905347", + "reserves": [ + "23953865487792281355845788", + "10278821564392535589955711", + "91900049681436421008393752" + ] + }, + { + "type": "redeemMasset", + "inputQty": "740239789643028391526", + "expectedQtys": [ + "141405140432666476313", + "60678231976212348722", + "542506988594192276056" + ], + "redemptionFee": "222071936892908517", + "reserves": [ + "23953724082651848689369475", + "10278760886160559377606989", + "91899507174447826816117696" + ], + "mAssetSupply": "125357396286786830850404332" + }, + { + "type": "redeemMasset", + "inputQty": "111150686689233053365043", + "expectedQtys": [ + "21232685246570949878475", + "9111138371117552407522", + "81460123002887140740060" + ], + "redemptionFee": "33345206006769916009", + "reserves": [ + "23932491397405277739491000", + "10269649747789441825199467", + "91818047051444939675377636" + ], + "mAssetSupply": "125246278945303604566955298" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "3095311706511461318656", + "expectedQty": "3032891819580889736761", + "reserves": [ + "23932491397405277739491000", + "10269649747789441825199467", + "91821142363151451136696292" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "755673568304679092224", + "213467412459462426624", + "222087109792034619392" + ], + "expectedQty": "1212606446523460958100", + "reserves": [ + "23933247070973582418583224", + "10269863215201901287626091", + "91821364450261243171315684" + ], + "mAssetSupply": "125250524443569708917650159" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "128462565309006999453696", + "51040688222614430154752", + "62892771371263163629568" + ], + "expectedQty": "246637615757340965648749", + "swapFee": "148071412301785650779", + "reserves": [ + "23804784505664575419129528", + "10218822526979286857471339", + "91758471678889980007686116" + ], + "mAssetSupply": "125003886827812367952001410" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "5705115847783447789568", + "expectedQty": "5625213771237108771285", + "swapFee": "3423069508670068673", + "reserves": [ + "23799159291893338310358243", + "10218822526979286857471339", + "91758471678889980007686116" + ], + "mAssetSupply": "124998185135034093174280515" + }, + { + "type": "redeemMasset", + "inputQty": "243511403637886761618636", + "expectedQtys": [ + "46349697544059871196529", + "19901515325511955827093", + "178702842283610313826099" + ], + "redemptionFee": "73053421091366028485", + "reserves": [ + "23752809594349278439161714", + "10198921011653774901644246", + "91579768836606369693860017" + ], + "mAssetSupply": "124754746784817297778690364" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "1729100017542643970998272", + "1692909254336439476289536", + "1580608103293869768048640" + ], + "expectedQty": "5142656942640510767490174", + "swapFee": "3087446633564445127570", + "reserves": [ + "22023709576806634468163442", + "8506011757317335425354710", + "89999160733312499925811377" + ], + "mAssetSupply": "119612089842176787011200190" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "201345437752983428268032", + "outputIndex": 0, + "expectedQty": "192993540415901391291614", + "swapFee": "117882513383714100873", + "reserves": [ + "21830716036390733076871828", + "8506011757317335425354710", + "90200506171065483354079409" + ], + "mAssetSupply": "119612207724690170725301063", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mintMulti", + "inputQtys": [ + "147844697636958208000", + "546336085648321413120", + "98476123578228015104" + ], + "expectedQty": "849920799174608391914", + "reserves": [ + "21830863881088370035079828", + "8506558093402983746767830", + "90200604647189061582094513" + ], + "mAssetSupply": "119613057645489345333692977" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "532414961134294272", + "outputIndex": 0, + "expectedQty": "577479861185869065", + "swapFee": "352808793880700", + "reserves": [ + "21830863303608508849210763", + "8506558625817944881062102", + "90200604647189061582094513" + ], + "mAssetSupply": "119613057645842154127573677", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemMasset", + "inputQty": "297078297908750937436979", + "expectedQtys": [ + "54204199750480716649998", + "21121070501448976872293", + "223960524323479757605813" + ], + "redemptionFee": "89123489372625281231", + "reserves": [ + "21776659103858028132560765", + "8485437555316495904189809", + "89976644122865581824488700" + ], + "mAssetSupply": "119316068471422775815417929" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "5869930453981455187968", + "expectedQty": "5311400943034586490491", + "swapFee": "3521958272388873112", + "reserves": [ + "21776659103858028132560765", + "8480126154373461317699318", + "89976644122865581824488700" + ], + "mAssetSupply": "119310202062927066749103073" + }, + { + "type": "mintMulti", + "inputQtys": [ + "45328058079863361241088", + "163339780355643288846336", + "93586762216622214086656" + ], + "expectedQty": "317562803404897011667296", + "reserves": [ + "21821987161937891493801853", + "8643465934729104606545654", + "90070230885082204038575356" + ], + "mAssetSupply": "119627764866331963760770369" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "69254047844749824491520", + "44714800342762294083584", + "29244638639156101120000" + ], + "expectedQty": "148259496208892150850173", + "swapFee": "89009103187247639093", + "reserves": [ + "21752733114093141669310333", + "8598751134386342312462070", + "90040986246443047937455356" + ], + "mAssetSupply": "119479505370123071609920196" + }, + { + "type": "redeemMasset", + "inputQty": "1576214064572928420426547", + "expectedQtys": [ + "286883325152623854302994", + "113403603338213955737537", + "1187494803476705227658938" + ], + "redemptionFee": "472864219371878526127", + "reserves": [ + "21465849788940517815007339", + "8485347531048128356724533", + "88853491442966342709796418" + ], + "mAssetSupply": "117903764169769515068019776" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "8075291874707077", + "expectedQty": "7930527961432831", + "swapFee": "4845175124824", + "reserves": [ + "21465849781009989853574508", + "8485347531048128356724533", + "88853491442966342709796418" + ], + "mAssetSupply": "117903764161699068368437523" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "1927893385944776704", + "expectedQty": "2124363379135846710", + "reserves": [ + "21465849781009989853574508", + "8485349458941514301501237", + "88853491442966342709796418" + ] + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "105185000469250848063488", + "expectedQty": "107027646529439990684967", + "reserves": [ + "21571034781479240701637996", + "8485349458941514301501237", + "88853491442966342709796418" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "91069670568866960", + "88541352745000976", + "68256428661268184" + ], + "expectedQty": "256824964011198539", + "reserves": [ + "21571034872548911270504956", + "8485349547482867046502213", + "88853491511222771371064602" + ], + "mAssetSupply": "118010794189416851506167739" + }, + { + "type": "redeemMasset", + "inputQty": "308000745598148100174643", + "expectedQtys": [ + "56282153689777812059226", + "22139584408658716204969", + "231832450072762218800555" + ], + "redemptionFee": "92400223679444430052", + "reserves": [ + "21514752718859133458445730", + "8463209963074208330297244", + "88621659061150009152264047" + ], + "mAssetSupply": "117702885844042382850423148" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "6556033332861255811072", + "outputIndex": 1, + "expectedQty": "5802999910828710402371", + "swapFee": "3838948711043441745", + "reserves": [ + "21514752718859133458445730", + "8457406963163379619894873", + "88628215094482870408075119" + ], + "mAssetSupply": "117702889682991093893864893", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mintMulti", + "inputQtys": [ + "26752310643794972672", + "30609419768304640000", + "34420784661332922368" + ], + "expectedQty": "94540761910472150989", + "reserves": [ + "21514779471169777253418402", + "8457437572583147924534873", + "88628249515267531740997487" + ], + "mAssetSupply": "117702984223753004366015882" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "125815810115", + "7647987773236", + "11446377496073" + ], + "expectedQty": "19726673294146", + "swapFee": "11843109842", + "reserves": [ + "21514779471169651437608287", + "8457437572575499936761637", + "88628249515256085363501414" + ], + "mAssetSupply": "117702984223733277692721736" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "615121657848792071798784", + "expectedQty": "600233981651966696027371", + "reserves": [ + "21514779471169651437608287", + "8457437572575499936761637", + "89243371173104877435300198" + ] + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "95766237347429310529536", + "expectedQty": "94024353819004088264707", + "swapFee": "57459742408457586317", + "reserves": [ + "21420755117350647349343580", + "8457437572575499936761637", + "89243371173104877435300198" + ], + "mAssetSupply": "118207509427780223535805888" + }, + { + "type": "redeemMasset", + "inputQty": "37019164059706156646", + "expectedQtys": [ + "6706346815655845366", + "2647829603705625152", + "27940051357030200209" + ], + "redemptionFee": "11105749217911846", + "reserves": [ + "21420748411003831693498214", + "8457434924745896231136485", + "89243343233053520405099989" + ], + "mAssetSupply": "118207472419721913047561088" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "64212783503589302272", + "28277048499680575488", + "25122335034170978304" + ], + "expectedQty": "121085917175827788101", + "swapFee": "72695167405940237", + "reserves": [ + "21420684198220328104195942", + "8457406647697396550560997", + "89243318110718486234121685" + ], + "mAssetSupply": "118207351333804737219772987" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "90253447524166219595776", + "52980720822022916014080", + "16818422947594702422016" + ], + "hardLimitError": true + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "351364620310599077724160", + "outputIndex": 2, + "expectedQty": "366156340768256063120775", + "swapFee": "214530917056190350008", + "reserves": [ + "21772048818530927181920102", + "8457406647697396550560997", + "88877161769950230171000910" + ], + "mAssetSupply": "118207565864721793410122995", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mintMulti", + "inputQtys": [ + "931603490705515", + "1217624295456099", + "1300407677403854" + ], + "expectedQty": "3558895904573088", + "reserves": [ + "21772048819462530672625617", + "8457406648915020846017096", + "88877161771250637848404764" + ], + "mAssetSupply": "118207565868280689314696083" + }, + { + "type": "redeemMasset", + "inputQty": "202456667896305760075776", + "expectedQtys": [ + "37278274499258117310722", + "14480838676435040131664", + "152176180601887934203763" + ], + "redemptionFee": "60737000368891728022", + "reserves": [ + "21734770544963272555314895", + "8442925810238585805885432", + "88724985590648749914201001" + ], + "mAssetSupply": "118005169937384752446348329" + }, + { + "type": "redeemMasset", + "inputQty": "271583240902127966696243", + "expectedQtys": [ + "50006525885001030266893", + "19425159663011872576994", + "204135041564231866400414" + ], + "redemptionFee": "81474972270638390008", + "reserves": [ + "21684764019078271525048002", + "8423500650575573933308438", + "88520850549084518047800587" + ], + "mAssetSupply": "117733668171454895118042094" + }, + { + "type": "mintMulti", + "inputQtys": [ + "246179522983745323794432", + "30382099387671851827200", + "12496369751499256889344" + ], + "expectedQty": "295962069608156555604805", + "reserves": [ + "21930943542062016848842434", + "8453882749963245785135638", + "88533346918836017304689931" + ], + "mAssetSupply": "118029630241063051673646899" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "12315666400134406602752", + "expectedQty": "11172384278064889155661", + "swapFee": "7389399840080643961", + "reserves": [ + "21930943542062016848842434", + "8442710365685180895979977", + "88533346918836017304689931" + ], + "mAssetSupply": "118017321964062757347688108" + }, + { + "type": "mintMulti", + "inputQtys": [ + "1419197013384332214009856", + "386298090892004083892224", + "962568513407235697672192" + ], + "expectedQty": "2805079826195502948176883", + "reserves": [ + "23350140555446349062852290", + "8829008456577184979872201", + "89495915432243253002362123" + ], + "mAssetSupply": "120822401790258260295864991" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "4465530563646428779905024", + "expectedQty": "4361624290179223358340305", + "reserves": [ + "23350140555446349062852290", + "8829008456577184979872201", + "93961445995889681782267147" + ] + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "1298865279429825527808", + "outputIndex": 0, + "expectedQty": "1246475821413407172279", + "swapFee": "760552516161880078", + "reserves": [ + "23348894079624935655680011", + "8829008456577184979872201", + "93962744861169111607794955" + ], + "mAssetSupply": "125184026840989999816085374", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "14757945018174537728", + "expectedQty": "13350494583111953579", + "swapFee": "8854767010904722", + "reserves": [ + "23348894079624935655680011", + "8828995106082601867918622", + "93962744861169111607794955" + ], + "mAssetSupply": "125184012091899748652452368" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "4046307900531716653056", + "expectedQty": "3660273431772537055572", + "swapFee": "2427784740319029991", + "reserves": [ + "23348894079624935655680011", + "8825334832650829330863050", + "93962744861169111607794955" + ], + "mAssetSupply": "125179968211783957254829303" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "5034701740143211911839744", + "expectedQty": "5094603377772050866680301", + "reserves": [ + "28383595819768147567519755", + "8825334832650829330863050", + "93962744861169111607794955" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "32190787551515536", + "28313811587444364", + "16190948926671992" + ], + "expectedQty": "79526171810113889", + "reserves": [ + "28383595851958935119035291", + "8825334860964640918307414", + "93962744877360060534466947" + ], + "mAssetSupply": "130274571669082179931623493" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "124788157921772894683136", + "expectedQty": "123691493033641769967180", + "swapFee": "74872894753063736809", + "reserves": [ + "28259904358925293349068111", + "8825334860964640918307414", + "93962744877360060534466947" + ], + "mAssetSupply": "130149858384055160100677166" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "2261607481710906573848576", + "outputIndex": 2, + "expectedQty": "2489759041581131855372038", + "swapFee": "1468664526057488992540", + "reserves": [ + "28259904358925293349068111", + "11086942342675547492155990", + "91472985835778928679094909" + ], + "mAssetSupply": "130151327048581217589669706", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemBassets", + "inputQtys": [ + "800279489976644539514880", + "2281752199454002811764736", + "1312311568065318552076288" + ], + "expectedQty": "4551415480176918844712151", + "swapFee": "2732488781374976292602", + "reserves": [ + "27459624868948648809553231", + "8805190143221544680391254", + "90160674267713610127018621" + ], + "mAssetSupply": "125599911568404298744957555" + }, + { + "type": "mintMulti", + "inputQtys": [ + "200507870404097408", + "1775871372229124352", + "2667063100098171904" + ], + "expectedQty": "4758853779943855020", + "reserves": [ + "27459625069456519213650639", + "8805191919092916909515606", + "90160676934776710225190525" + ], + "mAssetSupply": "125599916327258078688812575" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "1091074991456922726563840", + "expectedQty": "1081161498208648999137000", + "swapFee": "654644994874153635938", + "reserves": [ + "26378463571247870214513639", + "8805191919092916909515606", + "90160676934776710225190525" + ], + "mAssetSupply": "124509495980796030115884673" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "2977497902280349184", + "2049465626405644032", + "556552345712753408" + ], + "expectedQty": "5795171655834719067", + "swapFee": "3479190507805514", + "reserves": [ + "26378460593749967934164455", + "8805189869627290503871574", + "90160676378224364512437117" + ], + "mAssetSupply": "124509490185624374281165606" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "1032934510566008", + "616746591095523", + "174035402510038" + ], + "expectedQty": "1888541181463702", + "swapFee": "1133804991873", + "reserves": [ + "26378460592717033423598447", + "8805189869010543912776051", + "90160676378050329109927079" + ], + "mAssetSupply": "124509490183735833099701904" + }, + { + "type": "redeemMasset", + "inputQty": "41993748472963172558438", + "expectedQtys": [ + "8894086052947429761335", + "2968866061469213896702", + "30399682023890510400239" + ], + "redemptionFee": "12598124541888951767", + "reserves": [ + "26369566506664085993837112", + "8802221002949074698879349", + "90130276696026438599526840" + ], + "mAssetSupply": "124467509033387411816095233" + }, + { + "type": "mintMulti", + "inputQtys": [ + "898748060597956823220224", + "1271520382546142677696512", + "115150013137896995815424" + ], + "expectedQty": "2397336002936283104096717", + "reserves": [ + "27268314567262042817057336", + "10073741385495217376575861", + "90245426709164335595342264" + ], + "mAssetSupply": "126864845036323694920191950" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "7035369176545525760", + "4926470124838564864", + "2664759188651881472" + ], + "expectedQty": "14994839969713706480", + "swapFee": "9002305365047252", + "reserves": [ + "27268307531892866271531576", + "10073736459025092538010997", + "90245424044405146943460792" + ], + "mAssetSupply": "126864830041483725206485470" + }, + { + "type": "mintMulti", + "inputQtys": [ + "1449978035941362176", + "1159492933427754752", + "971764889695199232" + ], + "expectedQty": "3659828442822288008", + "reserves": [ + "27268308981870902212893752", + "10073737618518025965765749", + "90245425016170036638660024" + ], + "mAssetSupply": "126864833701312168028773478" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "1006243143436314192379904", + "expectedQty": "987354070909454970977897", + "reserves": [ + "27268308981870902212893752", + "10073737618518025965765749", + "91251668159606350831039928" + ] + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "206620520244868129226752", + "expectedQty": "210471844412769385773469", + "swapFee": "123972312146920877536", + "reserves": [ + "27268308981870902212893752", + "10073737618518025965765749", + "91041196315193581445266459" + ], + "mAssetSupply": "127645691224288901791402159" + }, + { + "type": "redeemMasset", + "inputQty": "547617466146371552254361", + "expectedQtys": [ + "116949678025846941643135", + "43204746278392560110497", + "390462004931385228747459" + ], + "redemptionFee": "164285239843911465676", + "reserves": [ + "27151359303845055271250617", + "10030532872239633405655252", + "90650734310262196216519000" + ], + "mAssetSupply": "127098238043382374150613474" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "323636297335471552", + "1111208480682083840", + "354773817622588288" + ], + "expectedQty": "1868547750280434075", + "swapFee": "1121801731206984", + "reserves": [ + "27151358980208757935779065", + "10030531761031152723571412", + "90650733955488378593930712" + ], + "mAssetSupply": "127098236174834623870179399" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "3557980153368443055243264", + "expectedQty": "3206505223635076876108764", + "swapFee": "2134788092021065833145", + "reserves": [ + "27151358980208757935779065", + "6824026537396075847462648", + "90650733955488378593930712" + ], + "mAssetSupply": "123542390809558201880769280" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "4331297278527004307619840", + "outputIndex": 2, + "expectedQty": "4461194390421994945262322", + "swapFee": "2614032636848915774459", + "reserves": [ + "31482656258735762243398905", + "6824026537396075847462648", + "86189539565066383648668390" + ], + "mAssetSupply": "123545004842195050796543739", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "63039513398469410816", + "expectedQty": "64498354888845983320", + "swapFee": "37823708039081646", + "reserves": [ + "31482656258735762243398905", + "6824026537396075847462648", + "86189475066711494802685070" + ], + "mAssetSupply": "123544941840505360366214569" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "54799727289327304704", + "11318744355804899328", + "62101171438440849408" + ], + "expectedQty": "128523109732296854529", + "swapFee": "77160161936540036", + "reserves": [ + "31482601459008472916094201", + "6824015218651720042563320", + "86189412965540056361835662" + ], + "mAssetSupply": "123544813317395628069360040" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "7066975667255426", + "outputIndex": 1, + "expectedQty": "6025812656376651", + "swapFee": "4141793078934", + "reserves": [ + "31482601459008472916094201", + "6824015212625907386186669", + "86189412972607032029091088" + ], + "mAssetSupply": "123544813317399769862438974", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "2345755511274963468288", + "expectedQty": "2685500674876425185585", + "reserves": [ + "31482601459008472916094201", + "6826360968137182349654957", + "86189412972607032029091088" + ] + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "682395122574091747328", + "expectedQty": "666565204536299676499", + "reserves": [ + "31482601459008472916094201", + "6826360968137182349654957", + "86190095367729606120838416" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "12446036477089402585088", + "11226277830549970092032", + "4391807397611100962816" + ], + "expectedQty": "29613889179018404291600", + "swapFee": "17779000907955816064", + "reserves": [ + "31470155422531383513509113", + "6815134690306632379562925", + "86185703560331995019875600" + ], + "mAssetSupply": "123518551494100164183009458" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "44656784638779368407040", + "48951583793220832722944", + "21308921150937082363904" + ], + "expectedQty": "121663451571971311179117", + "swapFee": "73041896080831285478", + "reserves": [ + "31425498637892604145102073", + "6766183106513411546839981", + "86164394639181057937511696" + ], + "mAssetSupply": "123396888042528192871830341" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "16408620929782747496448", + "expectedQty": "16791540555652537986209", + "swapFee": "9845172557869648497", + "reserves": [ + "31425498637892604145102073", + "6766183106513411546839981", + "86147603098625405399525487" + ], + "mAssetSupply": "123380489266770967993982390" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "330767953366996603633664", + "expectedQty": "323012455151280654112930", + "reserves": [ + "31425498637892604145102073", + "6766183106513411546839981", + "86478371051992402003159151" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "436533935642185713057792", + "63812015029138220908544", + "1051678707806694482640896" + ], + "expectedQty": "1537652175992151921972153", + "swapFee": "923145192710917703805", + "reserves": [ + "30988964702250418432044281", + "6702371091484273325931437", + "85426692344185707520518255" + ], + "mAssetSupply": "122165849545930096726123167" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "11050077178949908", + "outputIndex": 1, + "expectedQty": "9645117990281876", + "swapFee": "6643868267852", + "reserves": [ + "30988964713300495610994189", + "6702371081839155335649561", + "85426692344185707520518255" + ], + "mAssetSupply": "122165849545936740594391019", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemMasset", + "inputQty": "1243082054304838", + "expectedQtys": [ + "315229415683259", + "68178609365213", + "868986962312210" + ], + "redemptionFee": "372924616291", + "reserves": [ + "30988964712985266195310930", + "6702371081770976726284348", + "85426692343316720558206045" + ], + "mAssetSupply": "122165849544694031464702472" + }, + { + "type": "mintMulti", + "inputQtys": [ + "177452424177274781696", + "3777645708400342859776", + "191577036459787091968" + ], + "expectedQty": "4698940371033515533769", + "reserves": [ + "30989142165409443470092626", + "6706148727479377069144124", + "85426883920353180345298013" + ], + "mAssetSupply": "122170548485065064980236241" + }, + { + "type": "mintMulti", + "inputQtys": [ + "1685593810548323584", + "643368187183695232", + "1504492764324773632" + ], + "expectedQty": "3896394361668137742", + "reserves": [ + "30989143851003254018416210", + "6706149370847564252839356", + "85426885424845944670071645" + ], + "mAssetSupply": "122170552381459426648373983" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "508593184486233931776", + "expectedQty": "520494770224935513763", + "swapFee": "305155910691740359", + "reserves": [ + "30989143851003254018416210", + "6706149370847564252839356", + "85426364930075719734557882" + ], + "mAssetSupply": "122170044093430851106182566" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "784987150844111616", + "expectedQty": "900539394371802628", + "reserves": [ + "30989143851003254018416210", + "6706150155834715096950972", + "85426364930075719734557882" + ] + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "375609296317904440000512", + "expectedQty": "325155706931965201790784", + "swapFee": "225365577790742664000", + "reserves": [ + "30989143851003254018416210", + "6380994448902749895160188", + "85426364930075719734557882" + ], + "mAssetSupply": "121794661063230131780648682" + }, + { + "type": "redeemMasset", + "inputQty": "15462968631719417", + "expectedQtys": [ + "3933180648989373", + "809883745365890", + "10842420399607156" + ], + "redemptionFee": "4638890589515", + "reserves": [ + "30989143847070073369426837", + "6380994448092866149794298", + "85426364919233299334950726" + ], + "mAssetSupply": "121794661047771802039518780" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "55328843014262879158272", + "expectedQty": "47534177825247388115444", + "swapFee": "33197305808557727494", + "reserves": [ + "30989143847070073369426837", + "6333460270267618761678854", + "85426364919233299334950726" + ], + "mAssetSupply": "121739365402063347718088002" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "537973409709878935552", + "outputIndex": 2, + "expectedQty": "641926786131892898045", + "swapFee": "375867613356193598", + "reserves": [ + "30989143847070073369426837", + "6333998243677328640614406", + "85425722992447167442052681" + ], + "mAssetSupply": "121739365777930961074281600", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemMasset", + "inputQty": "12595735625606836623769", + "expectedQtys": [ + "3205322792254806844748", + "655149075326274178927", + "8835901317694033395176" + ], + "redemptionFee": "3778720687682050987", + "reserves": [ + "30985938524277818562582089", + "6333343094602002366435479", + "85416887091129473408657505" + ], + "mAssetSupply": "121726773821026041919708818" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "4721124988037007671296", + "2441438034304363921408", + "2973541525532376563712" + ], + "expectedQty": "10473250549566740715691", + "swapFee": "6287722963518155322", + "reserves": [ + "30981217399289781554910793", + "6330901656567698002514071", + "85413913549603941032093793" + ], + "mAssetSupply": "121716300570476475178993127" + }, + { + "type": "mintMulti", + "inputQtys": [ + "33733956799518765744128", + "29213504228017429282816", + "48652158884769106493440" + ], + "expectedQty": "115252511475712634107179", + "reserves": [ + "31014951356089300320654921", + "6360115160795715431796887", + "85462565708488710138587233" + ], + "mAssetSupply": "121831553081952187813100306" + }, + { + "type": "mintMulti", + "inputQtys": [ + "1030817036615051008", + "2324465061193323008", + "1440348793597537280" + ], + "expectedQty": "5141671975053152471", + "reserves": [ + "31014952386906336935705929", + "6360117485260776625119895", + "85462567148837503736124513" + ], + "mAssetSupply": "121831558223624162866252777" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "68510035180327419904", + "239970218683505770496", + "195409060145522343936" + ], + "expectedQty": "538392652185395783624", + "swapFee": "323229529028654662", + "reserves": [ + "31014883876871156608286025", + "6359877515042093119349399", + "85462371739777358213780577" + ], + "mAssetSupply": "121831019830971977470469153" + }, + { + "type": "mintMulti", + "inputQtys": [ + "6931234566323077268897792", + "3439321864145915445510144", + "693593620445839239413760" + ], + "expectedQty": "11427743524286333114233522", + "reserves": [ + "37946118443194233877183817", + "9799199379188008564859543", + "86155965360223197453194337" + ], + "mAssetSupply": "133258763355258310584702675" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "554834068979313767612416", + "expectedQty": "563158671263894571035205", + "swapFee": "332900441387588260567", + "reserves": [ + "37946118443194233877183817", + "9799199379188008564859543", + "85592806688959302882159132" + ], + "mAssetSupply": "132704262186720384405350826" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "2071485226168427544051712", + "expectedQty": "2071248963786259135499930", + "swapFee": "1242891135701056526431", + "reserves": [ + "35874869479407974741683887", + "9799199379188008564859543", + "85592806688959302882159132" + ], + "mAssetSupply": "130634019851687657917825545" + }, + { + "type": "mintMulti", + "inputQtys": [ + "1888643125517229471301632", + "1092537002137515913641984", + "1647022809525916308340736" + ], + "expectedQty": "4675822845288656056984570", + "reserves": [ + "37763512604925204212985519", + "10891736381325524478501527", + "87239829498485219190499868" + ], + "mAssetSupply": "135309842696976313974810115" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "7582905397641208832", + "10539097185724229632", + "14180153791679074304" + ], + "expectedQty": "32742035219530701049", + "swapFee": "19657015340922974", + "reserves": [ + "37763505022019806571776687", + "10891725842228338754271895", + "87239815318331427511425564" + ], + "mAssetSupply": "135309809954941094444109066" + }, + { + "type": "redeemMasset", + "inputQty": "833346535401514504028160", + "expectedQtys": [ + "232508234690241976655401", + "67059875581727770078567", + "537131694808001391356948" + ], + "redemptionFee": "250003960620454351208", + "reserves": [ + "37530996787329564595121286", + "10824665966646610984193328", + "86702683623523426120068616" + ], + "mAssetSupply": "134476713423500200394432114" + }, + { + "type": "redeemMasset", + "inputQty": "44289687411613598377574", + "expectedQtys": [ + "12357064675495854241681", + "3564016649982732781589", + "28546821581798085369531" + ], + "redemptionFee": "13286906223484079513", + "reserves": [ + "37518639722654068740879605", + "10821101949996628251411739", + "86674136801941628034699085" + ], + "mAssetSupply": "134432437022994810280134053" + }, + { + "type": "mintMulti", + "inputQtys": [ + "77473242999114956800", + "40310634173818175488", + "134425479079733395456" + ], + "expectedQty": "252740322115197155822", + "reserves": [ + "37518717195897067855836405", + "10821142260630802069587227", + "86674271227420707768094541" + ], + "mAssetSupply": "134432689763316925477289875" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "1755965570350644985856", + "expectedQty": "1730939429666905380435", + "reserves": [ + "37518717195897067855836405", + "10821142260630802069587227", + "86676027192991058413080397" + ] + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "76082928918951284965376", + "expectedQty": "74997942912841427151525", + "reserves": [ + "37518717195897067855836405", + "10821142260630802069587227", + "86752110121910009698045773" + ] + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "19917393704913968", + "expectedQty": "19914064808202947", + "reserves": [ + "37518717215814461560750373", + "10821142260630802069587227", + "86752110121910009698045773" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "18415381271005427138560", + "65859843539352575541248", + "479472578699418337280" + ], + "expectedQty": "88795226683935193728968", + "swapFee": "53309121483251066877", + "reserves": [ + "37500301834543456133611813", + "10755282417091449494045979", + "86751630649331310279708493" + ], + "mAssetSupply": "134420623438889563424295814" + }, + { + "type": "redeemMasset", + "inputQty": "269760517112931536601088", + "expectedQtys": [ + "75234482074327208447222", + "21577642382270825466766", + "174044305824591509450939" + ], + "redemptionFee": "80928155133879460980", + "reserves": [ + "37425067352469128925164591", + "10733704774709178668579213", + "86577586343506718770257554" + ], + "mAssetSupply": "134150943849931765767155706" + }, + { + "type": "redeemMasset", + "inputQty": "2236305799010179455385", + "expectedQtys": [ + "623691377629999521712", + "178877944425940988612", + "1442821561011818084968" + ], + "redemptionFee": "670891739703053836", + "reserves": [ + "37424443661091498925642879", + "10733525896764752727590601", + "86576143521945706952172586" + ], + "mAssetSupply": "134148708215024495290754157" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "234414183350488032", + "expectedQty": "234370897384661524", + "reserves": [ + "37424443895505682276130911", + "10733525896764752727590601", + "86576143521945706952172586" + ] + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "10850106589875988856832", + "expectedQty": "10845571680790788004438", + "swapFee": "6510063953925593314", + "reserves": [ + "37413598323824891488126473", + "10733525896764752727590601", + "86576143521945706952172586" + ], + "mAssetSupply": "134137864852869470612152163" + }, + { + "type": "mintMulti", + "inputQtys": [ + "2594706952198894", + "59194529546945", + "8437233134426016" + ], + "expectedQty": "10973219605113014", + "reserves": [ + "37413598326419598440325367", + "10733525896823947257137546", + "86576143530382940086598602" + ], + "mAssetSupply": "134137864863842690217265177" + }, + { + "type": "mintMulti", + "inputQtys": [ + "661098840844271339175936", + "988387948592958944575488", + "287478387087783491534848" + ], + "expectedQty": "1989245201895666772440939", + "reserves": [ + "38074697167263869779501303", + "11721913845416906201713034", + "86863621917470723578133450" + ], + "mAssetSupply": "136127110065738356989706116" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "8154999982069743616", + "expectedQty": "7743708586679737369", + "swapFee": "4892999989241846", + "reserves": [ + "38074697167263869779501303", + "11721906101708319521975665", + "86863621917470723578133450" + ], + "mAssetSupply": "136127101915631374909204346" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "69186186155805651238912", + "expectedQty": "69180734302221604864433", + "reserves": [ + "38143883353419675430740215", + "11721906101708319521975665", + "86863621917470723578133450" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "966146807845198619475968", + "769171470703774903828480", + "233854959505123573760000" + ], + "expectedQty": "2008902468488588576334544", + "swapFee": "1206065120165252297179", + "reserves": [ + "37177736545574476811264247", + "10952734631004544618147185", + "86629766957965600004373450" + ], + "mAssetSupply": "134187380181445007937734235" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "4163425240173920649216", + "outputIndex": 2, + "expectedQty": "4220679241546820645348", + "swapFee": "2498113367627286667", + "reserves": [ + "37181899970814650731913463", + "10952734631004544618147185", + "86625546278724053183728102" + ], + "mAssetSupply": "134187382679558375565020902", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mintMulti", + "inputQtys": [ + "498304287032956092416", + "145609128157757767680", + "301846964126058151936" + ], + "expectedQty": "950155833060132933267", + "reserves": [ + "37182398275101683688005879", + "10952880240132702375914865", + "86625848125688179241880038" + ], + "mAssetSupply": "134188332835391435697954169" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "183510171061988219682816", + "expectedQty": "186025468624259780629271", + "swapFee": "110106102637192931809", + "reserves": [ + "37182398275101683688005879", + "10952880240132702375914865", + "86439822657063919461250767" + ], + "mAssetSupply": "134004932770432084671203162" + }, + { + "type": "redeemMasset", + "inputQty": "174663890222484747924275", + "expectedQtys": [ + "48449515026095058524200", + "14271853360483047053877", + "112633065131809535152969" + ], + "redemptionFee": "52399167066745424377", + "reserves": [ + "37133948760075588629481679", + "10938608386772219328860988", + "86327189591932109926097798" + ], + "mAssetSupply": "133830321279376666668703264" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "518331627197567795200", + "outputIndex": 2, + "expectedQty": "556522684009488990617", + "swapFee": "329405658584459103", + "reserves": [ + "37133948760075588629481679", + "10939126718399416896656188", + "86326633069248100437107181" + ], + "mAssetSupply": "133830321608782325253162367", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "872474406441539097067520", + "expectedQty": "871775637837905285386271", + "swapFee": "523484643864923458240", + "reserves": [ + "36262173122237683344095408", + "10939126718399416896656188", + "86326633069248100437107181" + ], + "mAssetSupply": "132958370686984651079553087" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "23217148732331255660544", + "35088918606317331939328", + "18396868613000969322496" + ], + "expectedQty": "78521729902073194087384", + "swapFee": "47141322734884847360", + "reserves": [ + "36238955973505352088434864", + "10904037799793099564716860", + "86308236200635099467784685" + ], + "mAssetSupply": "132879848957082577885465703" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "41231014000426481614848", + "expectedQty": "41802688369766572386807", + "swapFee": "24738608400255888968", + "reserves": [ + "36238955973505352088434864", + "10904037799793099564716860", + "86266433512265332895397878" + ], + "mAssetSupply": "132838642681690551659739823" + }, + { + "type": "mintMulti", + "inputQtys": [ + "32958668447008184860672", + "90937150701830798311424", + "68976063752557121503232" + ], + "expectedQty": "197244900058521417942959", + "reserves": [ + "36271914641952360273295536", + "10994974950494930363028284", + "86335409576017890016901110" + ], + "mAssetSupply": "133035887581749073077682782" + }, + { + "type": "redeemMasset", + "inputQty": "384825490970686888345", + "expectedQtys": [ + "104890267633636228824", + "31795009349979661796", + "249662702012817845486" + ], + "redemptionFee": "115447647291206066", + "reserves": [ + "36271809751684726637066712", + "10994943155485580383366488", + "86335159913315877199055624" + ], + "mAssetSupply": "133035502871705749682000503" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "901783240405424678109184", + "outputIndex": 1, + "expectedQty": "847645140153031648529756", + "swapFee": "541184172063870020790", + "reserves": [ + "37173592992090151315175896", + "10147298015332548734836732", + "86335159913315877199055624" + ], + "mAssetSupply": "133036044055877813552021293", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "4595076868376382930944", + "expectedQty": "4525661754239846661192", + "reserves": [ + "37173592992090151315175896", + "10147298015332548734836732", + "86339754990184253581986568" + ] + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "3588057304002735701491712", + "expectedQty": "3583749190292729042230803", + "swapFee": "2152834382401641420895", + "reserves": [ + "33589843801797422272945093", + "10147298015332548734836732", + "86339754990184253581986568" + ], + "mAssetSupply": "129454665248011719338611668" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "84159502586367996592128", + "1410656402069008897015808", + "369144457630959297101824" + ], + "expectedQty": "1967505156682353913298533", + "swapFee": "1181211821102073592134", + "reserves": [ + "33505684299211054276352965", + "8736641613263539837820924", + "85970610532553294284884744" + ], + "mAssetSupply": "127487160091329365425313135" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "2829868780425490989056", + "436700926345304080384", + "488601902653939646464" + ], + "expectedQty": "3788653730220188852793", + "swapFee": "2274556972315502613", + "reserves": [ + "33502854430430628785363909", + "8736204912337194533740540", + "85970121930650640345238280" + ], + "mAssetSupply": "127483371437599145236460342" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "477499921951362646016", + "expectedQty": "476692241215085956942", + "swapFee": "286499953170817587", + "reserves": [ + "33502377738189413699406967", + "8736204912337194533740540", + "85970121930650640345238280" + ], + "mAssetSupply": "127482894224177147044631913" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "532771316511899123712", + "expectedQty": "531869963940927581289", + "swapFee": "319662789907139474", + "reserves": [ + "33501845868225472771825678", + "8736204912337194533740540", + "85970121930650640345238280" + ], + "mAssetSupply": "127482361772523425052647675" + }, + { + "type": "redeemMasset", + "inputQty": "1201375163958173473177", + "expectedQtys": [ + "315621788988860632917", + "82304020926211384383", + "809926825825363798043" + ], + "redemptionFee": "360412549187452041", + "reserves": [ + "33501530246436483911192761", + "8736122608316268322356157", + "85969312003824814981440237" + ], + "mAssetSupply": "127481160757772016066626539" + }, + { + "type": "mintMulti", + "inputQtys": [ + "15119469266694240731136", + "78231019786985938092032", + "37753645881410560458752" + ], + "expectedQty": "137405017758796077705647", + "reserves": [ + "33516649715703178151923897", + "8814353628103254260448189", + "86007065649706225541898989" + ], + "mAssetSupply": "127618565775530812144332186" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "2767570057653804597248", + "expectedQty": "2770678297389635615298", + "reserves": [ + "33519417285760831956521145", + "8814353628103254260448189", + "86007065649706225541898989" + ] + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "1317059973665329497767936", + "expectedQty": "1194688376300575973656819", + "swapFee": "790235984199197698660", + "reserves": [ + "33519417285760831956521145", + "7619665251802678286791370", + "86007065649706225541898989" + ], + "mAssetSupply": "126305066716147071479878208" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "2778280261099541101543424", + "expectedQty": "2777178815929350698158620", + "reserves": [ + "36297697546860373058064569", + "7619665251802678286791370", + "86007065649706225541898989" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "403453088461043632439296", + "88697444762760178040832", + "1817142623106695168000" + ], + "expectedQty": "504111510261559194846226", + "swapFee": "302648495254087969689", + "reserves": [ + "35894244458399329425625273", + "7530967807039918108750538", + "86005248507083118846730989" + ], + "mAssetSupply": "128578134021814862983190602" + }, + { + "type": "redeemMasset", + "inputQty": "46196703055242486559539", + "expectedQtys": [ + "12892536561698095480489", + "2704981794776667567065", + "30891465403613811353351" + ], + "redemptionFee": "13859010916572745967", + "reserves": [ + "35881351921837631330144784", + "7528262825245141441183473", + "85974357041679505035377638" + ], + "mAssetSupply": "128531951177770537069377030" + }, + { + "type": "redeemMasset", + "inputQty": "3725945575107489792", + "expectedQtys": [ + "1039833719227269295", + "218167407681503384", + "2491518035205744769" + ], + "redemptionFee": "1117783672532246", + "reserves": [ + "35881350882003912102875489", + "7528262607077733759680089", + "85974354550161469829632869" + ], + "mAssetSupply": "128531947452942745634419484" + }, + { + "type": "redeemMasset", + "inputQty": "96137895123281800226406", + "expectedQtys": [ + "26830081929427890155634", + "5629216781674958662089", + "64286848730866081634820" + ], + "redemptionFee": "28841368536984540067", + "reserves": [ + "35854520800074484212719855", + "7522633390296058801018000", + "85910067701430603747998049" + ], + "mAssetSupply": "128435838399188000818733145" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "254049801905123590144", + "expectedQty": "253766750468146362044", + "reserves": [ + "35854774849876389336309999", + "7522633390296058801018000", + "85910067701430603747998049" + ] + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "66078546773605397561344", + "expectedQty": "58834501087016495217427", + "swapFee": "39647128064163238536", + "reserves": [ + "35854774849876389336309999", + "7463798889209042305800573", + "85910067701430603747998049" + ], + "mAssetSupply": "128370053266292927730772381" + }, + { + "type": "mintMulti", + "inputQtys": [ + "3309341794372972242272256", + "2524140207463571512098816", + "3793583702062290754863104" + ], + "expectedQty": "9800836224490521023964679", + "reserves": [ + "39164116644249361578582255", + "9987939096672613817899389", + "89703651403492894502861153" + ], + "mAssetSupply": "138170889490783448754737060" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "21770807193133977174016", + "expectedQty": "20205423845961390142617", + "swapFee": "13062484315880386304", + "reserves": [ + "39164116644249361578582255", + "9967733672826652427756772", + "89703651403492894502861153" + ], + "mAssetSupply": "138149131746074630657949348" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "148644778608982032384", + "33091386721642586112", + "115423988754226020352" + ], + "expectedQty": "297752693582466986661", + "swapFee": "178758871472363610", + "reserves": [ + "39163967999470752596549871", + "9967700581439930785170660", + "89703535979504140276840801" + ], + "mAssetSupply": "138148833993381048190962687" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "576945036365855111249920", + "expectedQty": "533267938987133885153080", + "swapFee": "346167021819513066749", + "reserves": [ + "39163967999470752596549871", + "9434432642452796900017580", + "89703535979504140276840801" + ], + "mAssetSupply": "137572235124037012592779516" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "2066653948037542912", + "1670021617527465728", + "1577770384335493120" + ], + "expectedQty": "5429057160857970331", + "swapFee": "3259389930473066", + "reserves": [ + "39163965932816804559006959", + "9434430972431179372551852", + "89703534401733755941347681" + ], + "mAssetSupply": "137572229694979851734809185" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "38228837718780849160192", + "13640543954756947673088", + "84140689379364303798272" + ], + "expectedQty": "135735057898902421067509", + "swapFee": "81489928696559388273", + "reserves": [ + "39125737095098023709846767", + "9420790428476422424878764", + "89619393712354391637549409" + ], + "mAssetSupply": "137436494637080949313741676" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "40539418146009520", + "851680256417114", + "60460250741936320" + ], + "expectedQty": "100870774516230385", + "swapFee": "60558799989732", + "reserves": [ + "39125737054558605563837247", + "9420790427624742168461650", + "89619393651894140895613089" + ], + "mAssetSupply": "137436494536210174797511291" + }, + { + "type": "redeemMasset", + "inputQty": "15433168990154764635340", + "expectedQtys": [ + "4392231944149094944917", + "1057572323753230094044", + "10060619767091637780721" + ], + "redemptionFee": "4629950697046429390", + "reserves": [ + "39121344822614456468892330", + "9419732855300988938367606", + "89609333032127049257832368" + ], + "mAssetSupply": "137421065997170717079305341" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "4773248618881810956288", + "72757024418743174823936", + "57243988703477153923072" + ], + "expectedQty": "140101759179154858679140", + "swapFee": "84111522420945482496", + "reserves": [ + "39116571573995574657936042", + "9346975830882245763543670", + "89552089043423572103909296" + ], + "mAssetSupply": "137280964237991562220626201" + }, + { + "type": "redeemMasset", + "inputQty": "3070214802886727680", + "expectedQtys": [ + "874558602264742491", + "208977366602676479", + "2002183388581270966" + ], + "redemptionFee": "921064440866018", + "reserves": [ + "39116570699436972393193551", + "9346975621904879160867191", + "89552087041240183522638330" + ], + "mAssetSupply": "137280961168697823774764539" + }, + { + "type": "mintMulti", + "inputQtys": [ + "36227548379080019673088", + "15318155660804736679936", + "86414494687920675356672" + ], + "expectedQty": "137801099026196143499341", + "reserves": [ + "39152798247816052412866639", + "9362293777565683897547127", + "89638501535928104197995002" + ], + "mAssetSupply": "137418762267724019918263880" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "73863614658062325907456", + "expectedQty": "80236931065903435281169", + "reserves": [ + "39152798247816052412866639", + "9436157392223746223454583", + "89638501535928104197995002" + ] + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "427489223628518605193216", + "expectedQty": "426961411287140704743743", + "reserves": [ + "39580287471444571018059855", + "9436157392223746223454583", + "89638501535928104197995002" + ] + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "737586491410091157225472", + "expectedQty": "674837580352296107725170", + "swapFee": "442551894846054694335", + "reserves": [ + "39580287471444571018059855", + "8761319811871450115729413", + "89638501535928104197995002" + ], + "mAssetSupply": "137188816670561818955757655" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "20223962872970678272", + "12794536947726690304", + "26678570438047420416" + ], + "expectedQty": "60458405999798234412", + "swapFee": "36296821692894677", + "reserves": [ + "39580267247481698047381583", + "8761307017334502389039109", + "89638474857357666150574586" + ], + "mAssetSupply": "137188756212155819157523243" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "2050364484423708416", + "expectedQty": "2253943845950964807", + "reserves": [ + "39580267247481698047381583", + "8761309067698986812747525", + "89638474857357666150574586" + ] + }, + { + "type": "redeemMasset", + "inputQty": "99884091293590358904012", + "expectedQtys": [ + "28808869178888625764620", + "6377001074524326153930", + "65244205639491200848469" + ], + "redemptionFee": "29965227388077107671", + "reserves": [ + "39551458378302809421616963", + "8754932066624462486593595", + "89573230651718174949726117" + ], + "mAssetSupply": "137088904340033462826691709" + }, + { + "type": "mintMulti", + "inputQtys": [ + "36242018322251929092096", + "30010208574383711059968", + "118032947043283161317376" + ], + "expectedQty": "185100912454263612392049", + "reserves": [ + "39587700396625061350709059", + "8784942275198846197653563", + "89691263598761458111043493" + ], + "mAssetSupply": "137274005252487726439083758" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "4432085829732029956096", + "11225214231824989945856", + "2128465282193089888256" + ], + "expectedQty": "18851600904514597846084", + "swapFee": "11317751193424813595", + "reserves": [ + "39583268310795329320752963", + "8773717060967021207707707", + "89689135133479265021155237" + ], + "mAssetSupply": "137255153651583211841237674" + }, + { + "type": "redeemMasset", + "inputQty": "1805004445819039", + "expectedQtys": [ + "520392415061969", + "115346104686908", + "1179123089848586" + ], + "redemptionFee": "541501333745", + "reserves": [ + "39583268310274936905690994", + "8773717060851675103020799", + "89689135132300141931306651" + ], + "mAssetSupply": "137255153649778748896752380" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "125967150980015014805504", + "expectedQty": "125747001592175241757755", + "reserves": [ + "39709235461254951920496498", + "8773717060851675103020799", + "89689135132300141931306651" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "65609616798317639892992", + "148903543147287174709248", + "108287233552490210263040" + ], + "expectedQty": "335746519383568839678805", + "swapFee": "201568852941906447675", + "reserves": [ + "39643625844456634280603506", + "8624813517704387928311551", + "89580847898747651721043611" + ], + "mAssetSupply": "137045154131987355298831330" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "26172456147069", + "expectedQty": "26636342822737", + "swapFee": "15703473688", + "reserves": [ + "39643625844456634280603506", + "8624813517704387928311551", + "89580847898721015378220874" + ], + "mAssetSupply": "137045154131961198546157949" + }, + { + "type": "redeemMasset", + "inputQty": "258341840955089259121868", + "expectedQtys": [ + "74709207089133030726854", + "16253633855981689615414", + "168816902448429541702059" + ], + "redemptionFee": "77502552286526777736", + "reserves": [ + "39568916637367501249876652", + "8608559883848406238696137", + "89412030996272585836518815" + ], + "mAssetSupply": "136786889793558395813813817" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "33670022006001500", + "expectedQty": "37114962638151666", + "reserves": [ + "39568916637367501249876652", + "8608559917518428244697637", + "89412030996272585836518815" + ] + }, + { + "type": "redeemMasset", + "inputQty": "26296069508115435251302", + "expectedQtys": [ + "7604492151623646792673", + "1654423014142599540315", + "17183515389192639224917" + ], + "redemptionFee": "7888820852434630575", + "reserves": [ + "39561312145215877603083979", + "8606905494504285645157322", + "89394847480883393197293898" + ], + "mAssetSupply": "136760601649986095451344756" + }, + { + "type": "mintMulti", + "inputQtys": [ + "978773549239317561344", + "1032161294647926456320", + "116710548717155844096" + ], + "expectedQty": "2229318863778723198516", + "reserves": [ + "39562290918765116920645323", + "8607937655798933571613642", + "89394964191432110353137994" + ], + "mAssetSupply": "136762830968849874174543272" + }, + { + "type": "mintMulti", + "inputQtys": [ + "61415120265783468359680", + "123762411891812877729792", + "167508561871891819659264" + ], + "expectedQty": "362082537201222585382810", + "reserves": [ + "39623706039030900389005003", + "8731700067690746449343434", + "89562472753304002172797258" + ], + "mAssetSupply": "137124913506051096759926082" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "65374186358053992923136", + "expectedQty": "59368420894642079932220", + "swapFee": "39224511814832395753", + "reserves": [ + "39623706039030900389005003", + "8672331646796104369411214", + "89562472753304002172797258" + ], + "mAssetSupply": "137059578544204857599398699" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "14142854311103225135104", + "14437963788208553590784", + "6121508030055409778688" + ], + "expectedQty": "36029787730024802654947", + "swapFee": "21630851148704104055", + "reserves": [ + "39609563184719797163869899", + "8657893683007895815820430", + "89556351245273946763018570" + ], + "mAssetSupply": "137023548756474832796743752" + }, + { + "type": "mintMulti", + "inputQtys": [ + "74078512499688488960", + "22488558209525411840", + "70335859105051189248" + ], + "expectedQty": "167788192256431572255", + "reserves": [ + "39609637263232296852358859", + "8657916171566105341232270", + "89556421581133051814207818" + ], + "mAssetSupply": "137023716544667089228316007" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "5537216155453458835570688", + "expectedQty": "5882319324225154008130280", + "reserves": [ + "39609637263232296852358859", + "14195132327019564176802958", + "89556421581133051814207818" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "129241526268041902424064", + "140474139517457266638848", + "123838901518291959808000" + ], + "expectedQty": "397606071896721039593957", + "swapFee": "238706867258387656350", + "reserves": [ + "39480395736964254949934795", + "14054658187502106910164110", + "89432582679614759854399818" + ], + "mAssetSupply": "142508429796995522196852330" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "778188920255242880", + "743968084688967168", + "449011311446741120" + ], + "expectedQty": "1995233121598841020", + "swapFee": "1197858588112171", + "reserves": [ + "39480394958775334694691915", + "14054657443534022221196942", + "89432582230603448407658698" + ], + "mAssetSupply": "142508427801762400598011310" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "252470100133157824", + "outputIndex": 0, + "expectedQty": "249331038729766652", + "swapFee": "149752247621900", + "reserves": [ + "39480394709444295964925263", + "14054657443534022221196942", + "89432582483073548540816522" + ], + "mAssetSupply": "142508427801912152845633210", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mintMulti", + "inputQtys": [ + "1806817642465639203340288", + "2052285344974785784840192", + "89978086181501436690432" + ], + "expectedQty": "4018699630220659735186046", + "reserves": [ + "41287212351909935168265551", + "16106942788508808006037134", + "89522560569255049977506954" + ], + "mAssetSupply": "146527127432132812580819256" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "412456093622004080443392", + "225504256523261469261824", + "422496063477865336799232" + ], + "expectedQty": "1063202876843372904131023", + "swapFee": "638304708931382572021", + "reserves": [ + "40874756258287931087822159", + "15881438531985546536775310", + "89100064505777184640707722" + ], + "mAssetSupply": "145463924555289439676688233" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "6243134135840337920", + "expectedQty": "6433191936262460543", + "reserves": [ + "40874756258287931087822159", + "15881444775119682377113230", + "89100064505777184640707722" + ] + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "870724937738811464482816", + "expectedQty": "878925861405917323539664", + "swapFee": "522434962643286878689", + "reserves": [ + "40874756258287931087822159", + "15881444775119682377113230", + "88221138644371267317168058" + ], + "mAssetSupply": "144593728485705207761544649" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "1356269371294458112", + "322048922152461120", + "183053813771353088" + ], + "expectedQty": "1869561368943927616", + "swapFee": "1122410267526872", + "reserves": [ + "40874754902018559793364047", + "15881444453070760224652110", + "88221138461317453545814970" + ], + "mAssetSupply": "144593726616143838817617033" + }, + { + "type": "mintMulti", + "inputQtys": [ + "539486636562849660928", + "238122672057868943360", + "680045766354554060800" + ], + "expectedQty": "1458219836338419840255", + "reserves": [ + "40875294388655122643024975", + "15881682575742818093595470", + "88221818507083808099875770" + ], + "mAssetSupply": "144595184835980177237457288" + }, + { + "type": "mintMulti", + "inputQtys": [ + "138525897441298396217344", + "88193522790317131038720", + "48630164681073545445376" + ], + "expectedQty": "277534236340795446842963", + "reserves": [ + "41013820286096421039242319", + "15969876098533135224634190", + "88270448671764881645321146" + ], + "mAssetSupply": "144872719072320972684300251" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "30675202279620422402048", + "29158601253219840557056", + "13489999803979931844608" + ], + "expectedQty": "74065143826634360953014", + "swapFee": "44465765755433876897", + "reserves": [ + "40983145083816800616840271", + "15940717497279915384077134", + "88256958671960901713476538" + ], + "mAssetSupply": "144798653928494338323347237" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "1947053469465892244946944", + "1205526171761777022337024", + "1202998769981662232051712" + ], + "expectedQty": "4382088602587873180876270", + "swapFee": "2630831660549053340530", + "reserves": [ + "39036091614350908371893327", + "14735191325518138361740110", + "87053959901979239481424826" + ], + "mAssetSupply": "140416565325906465142470967" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "1124917273870137556992", + "300674007347121291264", + "2297965235965955670016" + ], + "expectedQty": "3709850667420380292922", + "swapFee": "2227246748501328973", + "reserves": [ + "39034966697077038234336335", + "14734890651510791240448846", + "87051661936743273525754810" + ], + "mAssetSupply": "140412855475239044762178045" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "3172901940746145759232", + "expectedQty": "3279358832010021265094", + "reserves": [ + "39034966697077038234336335", + "14738063553451537386208078", + "87051661936743273525754810" + ] + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "98460972838494000", + "outputIndex": 1, + "expectedQty": "95253617016364961", + "swapFee": "59104780777023", + "reserves": [ + "39034966795538011072830335", + "14738063458197920369843117", + "87051661936743273525754810" + ], + "mAssetSupply": "140416134834130159564220162", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemMasset", + "inputQty": "210146438175661607197081", + "expectedQtys": [ + "58402108335368755561830", + "22050332033012072897517", + "130242216365474574691126" + ], + "redemptionFee": "63043931452698482159", + "reserves": [ + "38976564687202642317268505", + "14716013126164908296945600", + "86921419720377798951063684" + ], + "mAssetSupply": "140206051439885950655505240" + }, + { + "type": "redeemMasset", + "inputQty": "354321178819067019421286", + "expectedQtys": [ + "98469924356316390022398", + "37178358610855264966552", + "219597229604472912867323" + ], + "redemptionFee": "106296353645720105826", + "reserves": [ + "38878094762846325927246107", + "14678834767554053031979048", + "86701822490773326038196361" + ], + "mAssetSupply": "139851836557420529356189780" + }, + { + "type": "mintMulti", + "inputQtys": [ + "595848253761308567011328", + "797545690236035111321600", + "1426327992504767756632064" + ], + "expectedQty": "2830977359096423331868973", + "reserves": [ + "39473943016607634494257435", + "15476380457790088143300648", + "88128150483278093794828425" + ], + "mAssetSupply": "142682813916516952688058753" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "24351715302175607357440", + "expectedQty": "24321765571453161375113", + "swapFee": "14611029181305364414", + "reserves": [ + "39449621251036181332882322", + "15476380457790088143300648", + "88128150483278093794828425" + ], + "mAssetSupply": "142658476812243958386065727" + }, + { + "type": "redeemMasset", + "inputQty": "77861907611901455079833", + "expectedQtys": [ + "21524842736015967097944", + "8444356242531290765180", + "48085241875894701713495" + ], + "redemptionFee": "23358572283570436523", + "reserves": [ + "39428096408300165365784378", + "15467936101547556852535468", + "88080065241402199093114930" + ], + "mAssetSupply": "142580638263204340501422417" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "541334913147845851742208", + "expectedQty": "540614849962812351089387", + "swapFee": "324800947888707511045", + "reserves": [ + "38887481558337353014694991", + "15467936101547556852535468", + "88080065241402199093114930" + ], + "mAssetSupply": "142039628151004383357191254" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "86383870542939382874112", + "expectedQty": "86454072692950894018414", + "reserves": [ + "38973865428880292397569103", + "15467936101547556852535468", + "88080065241402199093114930" + ] + }, + { + "type": "redeemMasset", + "inputQty": "2378613563786701203046", + "expectedQtys": [ + "652068588417033529172", + "258792787127216194226", + "1473660443418106715673" + ], + "redemptionFee": "713584069136010360", + "reserves": [ + "38973213360291875364039931", + "15467677308760429636341242", + "88078591580958780986399257" + ], + "mAssetSupply": "142123704323717616686016982" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "5851413623450748583936", + "expectedQty": "5671816937411241455881", + "swapFee": "3510848174070449150", + "reserves": [ + "38973213360291875364039931", + "15462005491823018394885361", + "88078591580958780986399257" + ], + "mAssetSupply": "142117856420942340007882196" + }, + { + "type": "mintMulti", + "inputQtys": [ + "157461256471177043378176", + "393409420910136989319168", + "206222519894367918882816" + ], + "expectedQty": "767064046694690422551581", + "reserves": [ + "39130674616763052407418107", + "15855414912733155384204529", + "88284814100853148905282073" + ], + "mAssetSupply": "142884920467637030430433777" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "5202873665988608409993216", + "expectedQty": "5250515451048565036276503", + "swapFee": "3121724199593165045995", + "reserves": [ + "39130674616763052407418107", + "15855414912733155384204529", + "83034298649804583869005570" + ], + "mAssetSupply": "137685168525848015185486556" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "5155610254564176013819904", + "expectedQty": "4959322220925707337672150", + "swapFee": "3093366152738505608291", + "reserves": [ + "39130674616763052407418107", + "10896092691807448046532379", + "83034298649804583869005570" + ], + "mAssetSupply": "132532651637436577677274943" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "11818853003660806324224", + "15626595794725040553984", + "9456031300484415356928" + ], + "expectedQty": "37647098559311051855639", + "swapFee": "22601820227723265072", + "reserves": [ + "39118855763759391601093883", + "10880466096012723005978395", + "83024842618504099453648642" + ], + "mAssetSupply": "132495004538877266625419304" + }, + { + "type": "mintMulti", + "inputQtys": [ + "189242652885471461376", + "76299640981781561344", + "520986438630042632192" + ], + "expectedQty": "783739138479172266094", + "reserves": [ + "39119045006412277072555259", + "10880542395653704787539739", + "83025363604942729496280834" + ], + "mAssetSupply": "132495788278015745797685398" + }, + { + "type": "mintMulti", + "inputQtys": [ + "92161838798734376960", + "81994624453636866048", + "32954795286085013504" + ], + "expectedQty": "211208196177442621988", + "reserves": [ + "39119137168251075806932219", + "10880624390278158424405787", + "83025396559738015581294338" + ], + "mAssetSupply": "132495999486211923240307386" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "132171389339644421210112", + "outputIndex": 0, + "expectedQty": "130518540801823080276616", + "swapFee": "78256400167298457576", + "reserves": [ + "38988618627449252726655603", + "10880624390278158424405787", + "83157567949077660002504450" + ], + "mAssetSupply": "132496077742612090538764962", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "196218158892516045225984", + "expectedQty": "185378525117947723243049", + "swapFee": "117730895335509627135", + "reserves": [ + "38988618627449252726655603", + "10695245865160210701162738", + "83157567949077660002504450" + ], + "mAssetSupply": "132299977314614910003166113" + }, + { + "type": "redeemMasset", + "inputQty": "484941955160517745049", + "expectedQtys": [ + "142868843704866956355", + "39191370807349529201", + "304720351642037506729" + ], + "redemptionFee": "145482586548155323", + "reserves": [ + "38988475758605547859699248", + "10695206673789403351633537", + "83157263228726017964997721" + ], + "mAssetSupply": "132299492518142336033576387" + }, + { + "type": "mintMulti", + "inputQtys": [ + "1338139141017304832", + "3498372936191576064", + "705343091768258176" + ], + "expectedQty": "5736366593888687322", + "reserves": [ + "38988477096744688877004080", + "10695210172162339543209601", + "83157263934069109733255897" + ], + "mAssetSupply": "132299498254508929922263709" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "2277821108302081213595648", + "outputIndex": 1, + "expectedQty": "2114912887712304476538480", + "swapFee": "1364239912194410948498", + "reserves": [ + "41266298205046770090599728", + "8580297284450035066671121", + "83157263934069109733255897" + ], + "mAssetSupply": "132300862494421124333212207", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mintMulti", + "inputQtys": [ + "1458020878016137920512", + "1203485850795787157504", + "398858237441355939840" + ], + "expectedQty": "3159962079479814615855", + "reserves": [ + "41267756225924786228520240", + "8581500770300830853828625", + "83157662792306551089195737" + ], + "mAssetSupply": "132304022456500604147828062" + }, + { + "type": "mintMulti", + "inputQtys": [ + "454756407167982632960", + "84808051065611599872", + "15377643889920644743168" + ], + "expectedQty": "15673798659334464497748", + "reserves": [ + "41268210982331954211153200", + "8581585578351896465428497", + "83173040436196471733938905" + ], + "mAssetSupply": "132319696255159938612325810" + }, + { + "type": "mintMulti", + "inputQtys": [ + "1231914725711126919643136", + "834933596690901813428224", + "340435951656611365257216" + ], + "expectedQty": "2468804243814515282316515", + "reserves": [ + "42500125708043081130796336", + "9416519175042798278856721", + "83513476387853083099196121" + ], + "mAssetSupply": "134788500498974453894642325" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "320558240137601613824", + "expectedQty": "325179471370805539010", + "swapFee": "192334944082560968", + "reserves": [ + "42500125708043081130796336", + "9416519175042798278856721", + "83513151208381712293657111" + ], + "mAssetSupply": "134788180133069260375589469" + }, + { + "type": "redeemMasset", + "inputQty": "247918824624645563272396", + "expectedQtys": [ + "78147952047242209826150", + "17314812054871567930898", + "153561468989057472575633" + ], + "redemptionFee": "74375647387393668981", + "reserves": [ + "42421977755995838920970186", + "9399204362987926710925823", + "83359589739392654821081478" + ], + "mAssetSupply": "134540335684092002205986054" + }, + { + "type": "mintMulti", + "inputQtys": [ + "794454473573391382085632", + "857271438207644688449536", + "845669150981827866918912" + ], + "expectedQty": "2545174301941779003601088", + "reserves": [ + "43216432229569230303055818", + "10256475801195571399375359", + "84205258890374482688000390" + ], + "mAssetSupply": "137085509986033781209587142" + }, + { + "type": "redeemMasset", + "inputQty": "29174540794099570153881", + "expectedQtys": [ + "9194562717211345836892", + "2182128536448904429246", + "17915188599414925834239" + ], + "redemptionFee": "8752362238229871046", + "reserves": [ + "43207237666852018957218926", + "10254293672659122494946113", + "84187343701775067762166151" + ], + "mAssetSupply": "137056344197601919869304307" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "389829414399526096076800", + "673897427537393973460992", + "264826186769357560872960" + ], + "expectedQty": "1372029235822410938751807", + "swapFee": "823711768554579310837", + "reserves": [ + "42817408252452492861142126", + "9580396245121728521485121", + "83922517515005710201293191" + ], + "mAssetSupply": "135684314961779508930552500" + }, + { + "type": "redeemMasset", + "inputQty": "122537985415539898240204", + "expectedQtys": [ + "38657267951445603301284", + "8649564741169988879044", + "75768603919449995976627" + ], + "redemptionFee": "36761395624661969472", + "reserves": [ + "42778750984501047257840842", + "9571746680380558532606077", + "83846748911086260205316564" + ], + "mAssetSupply": "135561813737759593694281768" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "11945972912839005831168", + "expectedQty": "11906093689307745750457", + "reserves": [ + "42790696957413886263672010", + "9571746680380558532606077", + "83846748911086260205316564" + ] + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "64839257085057288896512", + "expectedQty": "60164439566712481683487", + "swapFee": "38903554251034373337", + "reserves": [ + "42790696957413886263672010", + "9511582240813846050922590", + "83846748911086260205316564" + ], + "mAssetSupply": "135508919477918095185509050" + }, + { + "type": "redeemMasset", + "inputQty": "117841081629057299251", + "expectedQtys": [ + "37200424015928951051", + "8268967733168681651", + "72892820954838849745" + ], + "redemptionFee": "35352324488717189", + "reserves": [ + "42790659756989870334720959", + "9511573971846112882240939", + "83846676018265305366466819" + ], + "mAssetSupply": "135508801672188790616926988" + }, + { + "type": "redeemMasset", + "inputQty": "21089720286525190989414", + "expectedQtys": [ + "6657665783361427723578", + "1479876237896212259068", + "13045443775477431365097" + ], + "redemptionFee": "6326916085957557296", + "reserves": [ + "42784002091206508906997381", + "9510094095608216669981871", + "83833630574489827935101722" + ], + "mAssetSupply": "135487718278818351383494870" + }, + { + "type": "redeemMasset", + "inputQty": "37265075868187833139", + "expectedQtys": [ + "11763950263509126265", + "2614909042485790399", + "23051014685005245174" + ], + "redemptionFee": "11179522760456349", + "reserves": [ + "42783990327256245397871116", + "9510091480699174184191472", + "83833607523475142929856548" + ], + "mAssetSupply": "135487681024922005956118080" + }, + { + "type": "mintMulti", + "inputQtys": [ + "216414227427402652319744", + "126642396797901280903168", + "218722793622844158771200" + ], + "expectedQty": "567573721104131683073588", + "reserves": [ + "43000404554683648050190860", + "9636733877497075465094640", + "84052330317097987088627748" + ], + "mAssetSupply": "136055254746026137639191668" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "890749272634448150528", + "expectedQty": "887764522025111430889", + "reserves": [ + "43001295303956282498341388", + "9636733877497075465094640", + "84052330317097987088627748" + ] + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "981684755504586", + "expectedQty": "1056293739598820", + "reserves": [ + "43001295303956282498341388", + "9636733878478760220599226", + "84052330317097987088627748" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "2607389113109391605760", + "5101424566776194138112", + "5051777324834970664960" + ], + "expectedQty": "13066248388355263913303", + "swapFee": "7844455706437020560", + "reserves": [ + "42998687914843173106735628", + "9631632453911984026461114", + "84047278539773152117962788" + ], + "mAssetSupply": "136043076263216101226308074" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "118272356654752462798848", + "outputIndex": 0, + "expectedQty": "116867904273938178129486", + "swapFee": "69929881735236010709", + "reserves": [ + "42881820010569234928606142", + "9631632453911984026461114", + "84165550896427904580761636" + ], + "mAssetSupply": "136043146193097836462318783", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "1500279009446009765888", + "outputIndex": 2, + "expectedQty": "1516557637035348310407", + "swapFee": "897197292560303433", + "reserves": [ + "42883320289578680938372030", + "9631632453911984026461114", + "84164034338790869232451229" + ], + "mAssetSupply": "136043147090295129022622216", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "197005487778126645690368", + "expectedQty": "197532082244260000877444", + "swapFee": "118203292666875987414", + "reserves": [ + "42685788207334420937494586", + "9631632453911984026461114", + "84164034338790869232451229" + ], + "mAssetSupply": "135846259805809669252919262" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "1549130510934708324401152", + "expectedQty": "1570881050347586456992488", + "swapFee": "929478306560824994640", + "reserves": [ + "42685788207334420937494586", + "9631632453911984026461114", + "82593153288443282775458741" + ], + "mAssetSupply": "134298058773181521753512750" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "485762308631002441842688", + "expectedQty": "487083616837309072615960", + "swapFee": "291457385178601465105", + "reserves": [ + "42198704590497111864878626", + "9631632453911984026461114", + "82593153288443282775458741" + ], + "mAssetSupply": "133812587921935697913135167" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "228373984834506203332608", + "expectedQty": "212294375170992266809628", + "swapFee": "137024390900703721999", + "reserves": [ + "42198704590497111864878626", + "9419338078740991759651486", + "82593153288443282775458741" + ], + "mAssetSupply": "133584350961492092413524558" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "486625191903909707251712", + "271687057420088252563456", + "554029463333194241671168" + ], + "expectedQty": "1323792951951757059716299", + "swapFee": "794752622744701056463", + "reserves": [ + "41712079398593202157626914", + "9147651021320903507088030", + "82039123825110088533787573" + ], + "mAssetSupply": "132260558009540335353808259" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "3363419843416720775577600", + "817426357842174470520832", + "1675482899783155338706944" + ], + "expectedQty": "5889032033021886464344370", + "swapFee": "3535540544139615647995", + "reserves": [ + "38348659555176481382049314", + "8330224663478729036567198", + "80363640925326933195080629" + ], + "mAssetSupply": "126371525976518448889463889" + }, + { + "type": "redeemMasset", + "inputQty": "22318231447322325575270", + "expectedQtys": [ + "6770650989274979714687", + "1470743554348089726287", + "14188609751793970389800" + ], + "redemptionFee": "6695469434196697672", + "reserves": [ + "38341888904187206402334627", + "8328753919924380946840911", + "80349452315575139224690829" + ], + "mAssetSupply": "126349214440540560760586291" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "1228886052774249758720", + "outputIndex": 2, + "expectedQty": "1245045392935132734041", + "swapFee": "735239367697399470", + "reserves": [ + "38343117790239980652093347", + "8328753919924380946840911", + "80348207270182204091956788" + ], + "mAssetSupply": "126349215175779928457985761", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemBassets", + "inputQtys": [ + "508854551451067416576", + "229634450487744200704", + "266612371259318599680" + ], + "expectedQty": "1020061578136841492135", + "swapFee": "612404389515814383", + "reserves": [ + "38342608935688529584676771", + "8328524285473893202640207", + "80347940657810944773357108" + ], + "mAssetSupply": "126348195114201791616493626" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "1534906981891628645482496", + "540712397209390872002560", + "1018764805429225561522176" + ], + "expectedQty": "3124317297762484621658082", + "swapFee": "1875715808142376198714", + "reserves": [ + "36807701953796900939194275", + "7787811888264502330637647", + "79329175852381719211834932" + ], + "mAssetSupply": "123223877816439306994835544" + }, + { + "type": "redeemMasset", + "inputQty": "76513262008279105745715", + "expectedQtys": [ + "22848107933305503552365", + "4834226456481943190887", + "49242997414252300463607" + ], + "redemptionFee": "22953978602483731723", + "reserves": [ + "36784853845863595435641910", + "7782977661808020387446760", + "79279932854967466911371325" + ], + "mAssetSupply": "123147387508409630372821552" + }, + { + "type": "mintMulti", + "inputQtys": [ + "227793218140544401408", + "164218763229409509376", + "413556337569155448832" + ], + "expectedQty": "814151042084443321244", + "reserves": [ + "36785081639081735980043318", + "7783141880571249796956136", + "79280346411305036066820157" + ], + "mAssetSupply": "123148201659451714816142796" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "1922502760774011480702976", + "outputIndex": 0, + "expectedQty": "2077670480293539528142000", + "swapFee": "1246154084607249970251", + "reserves": [ + "34707411158788196451901318", + "9705644641345261277659112", + "79280346411305036066820157" + ], + "mAssetSupply": "123149447813536322066113047", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemMasset", + "inputQty": "44390964667729", + "expectedQtys": [ + "12507025253993", + "3497487671443", + "28569151705817" + ], + "redemptionFee": "13317289400", + "reserves": [ + "34707411158775689426647325", + "9705644641341763789987669", + "79280346411276466915114340" + ], + "mAssetSupply": "123149447813491944418734718" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "149429499929068172214272", + "expectedQty": "158795858154511284779937", + "reserves": [ + "34707411158775689426647325", + "9855074141270831962201941", + "79280346411276466915114340" + ] + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "34045347709368062181376", + "expectedQty": "34031674287648540519326", + "reserves": [ + "34741456506485057488828701", + "9855074141270831962201941", + "79280346411276466915114340" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "1775186354725284676108288", + "926798653047669325299712", + "1408144078932167408746496" + ], + "expectedQty": "4150381548805923430834904", + "swapFee": "2491723963661751109166", + "reserves": [ + "32966270151759772812720413", + "8928275488223162636902229", + "77872202332344299506367844" + ], + "mAssetSupply": "119191893797128180813199077" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "1776277551776030051532800", + "expectedQty": "1632197636314693552200547", + "swapFee": "1065766531065618030919", + "reserves": [ + "32966270151759772812720413", + "7296077851908469084701682", + "77872202332344299506367844" + ], + "mAssetSupply": "117416682011883216379697196" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "200835867928455249920", + "outputIndex": 1, + "expectedQty": "181149914198179375154", + "swapFee": "120370925699809706", + "reserves": [ + "32966470987627701267970333", + "7295896701994270905326528", + "77872202332344299506367844" + ], + "mAssetSupply": "117416682132254142079506902", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "2238193755531387537981440", + "expectedQty": "2278808444220847450671774", + "swapFee": "1342916253318832522788", + "reserves": [ + "32966470987627701267970333", + "7295896701994270905326528", + "75593393888123452055696070" + ], + "mAssetSupply": "115179831292976073374048250" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "13493712629771606", + "expectedQty": "12243363787058876", + "swapFee": "8096227577862", + "reserves": [ + "32966470987627701267970333", + "7295896689750907118267652", + "75593393888123452055696070" + ], + "mAssetSupply": "115179831279490456971854506" + }, + { + "type": "mintMulti", + "inputQtys": [ + "132591998503763472023552", + "744604254871115234541568", + "325758142996907319885824" + ], + "expectedQty": "1266118716250255243796252", + "reserves": [ + "33099062986131464739993885", + "8040500944622022352809220", + "75919152031120359375581894" + ], + "mAssetSupply": "116445949995740712215650758" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "3646396189982064115712", + "4427626767406217035776", + "2491866043838254546944" + ], + "expectedQty": "10895356107575134183020", + "swapFee": "6541138347553612677", + "reserves": [ + "33095416589941482675878173", + "8036073317854616135773444", + "75916660165076521121034950" + ], + "mAssetSupply": "116435054639633137081467738" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "64329841938818342912", + "expectedQty": "65374643359187334418", + "swapFee": "38597905163291005", + "reserves": [ + "33095416589941482675878173", + "8036073317854616135773444", + "75916594790433161933700532" + ], + "mAssetSupply": "116434990348389103426415831" + }, + { + "type": "redeemMasset", + "inputQty": "1564496595183255053926", + "expectedQtys": [ + "444558230445025841998", + "107945537540014163190", + "1019758943046642202291" + ], + "redemptionFee": "469348978554976516", + "reserves": [ + "33094972031711037650036175", + "8035965372317076121610254", + "75915575031490115291498241" + ], + "mAssetSupply": "116433426321142898726338421" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "501256774340466163318784", + "86803462860404445675520", + "82982875474405321867264" + ], + "expectedQty": "676586461753636082762931", + "swapFee": "406195594408826945825", + "reserves": [ + "32593715257370571486717391", + "7949161909456671675934734", + "75832592156015709969630977" + ], + "mAssetSupply": "115756839859389262643575490" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "1401225768142354073518080", + "expectedQty": "1400952459114058002534302", + "swapFee": "840735460885412444110", + "reserves": [ + "31192762798256513484183089", + "7949161909456671675934734", + "75832592156015709969630977" + ], + "mAssetSupply": "114356454826707793982501520" + }, + { + "type": "redeemMasset", + "inputQty": "18183982029557106475008", + "expectedQtys": [ + "4958517439558209367096", + "1263628304194839101196", + "12054630528384169153957" + ], + "redemptionFee": "5455194608867131942", + "reserves": [ + "31187804280816955274815993", + "7947898281152476836833538", + "75820537525487325800477020" + ], + "mAssetSupply": "114338276299872845743158454" + }, + { + "type": "redeemMasset", + "inputQty": "376290862676011661236633", + "expectedQtys": [ + "102609252576942416120421", + "26148936130403934684423", + "249452914845228010157630" + ], + "redemptionFee": "112887258802803498370", + "reserves": [ + "31085195028240012858695572", + "7921749345022072902149115", + "75571084610642097790319390" + ], + "mAssetSupply": "113962098324455636885420191" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "9258603839894624256", + "expectedQty": "9100275666142907127", + "reserves": [ + "31085195028240012858695572", + "7921749345022072902149115", + "75571093869245937684943646" + ] + }, + { + "type": "redeemMasset", + "inputQty": "438718047894182553", + "expectedQtys": [ + "119632262849996977", + "30487079106774671", + "290837517905683717" + ], + "redemptionFee": "131615414368254", + "reserves": [ + "31085194908607750008698595", + "7921749314534993795374444", + "75571093578408419779259929" + ], + "mAssetSupply": "113962106986144870548513019" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "37567787328430161920", + "expectedQty": "34597250344061444517", + "swapFee": "22540672397058097", + "reserves": [ + "31085194908607750008698595", + "7921714717284649733929927", + "75571093578408419779259929" + ], + "mAssetSupply": "113962069440898214515409196" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "906825955823105987313664", + "expectedQty": "891195581703650636613839", + "reserves": [ + "31085194908607750008698595", + "7921714717284649733929927", + "76477919534231525766573593" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "81481750636574965760", + "89444913774660665344", + "55971657753636921344" + ], + "expectedQty": "233730426407606524403", + "swapFee": "140322449314152406", + "reserves": [ + "31085113426857113433732835", + "7921625272370875073264583", + "76477863562573772129652249" + ], + "mAssetSupply": "114853031292175457545498632" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "4153846113132579303456768", + "expectedQty": "4143796352797974266127494", + "swapFee": "2492307667879547582074", + "reserves": [ + "26941317074059139167605341", + "7921625272370875073264583", + "76477863562573772129652249" + ], + "mAssetSupply": "110701677486710757789623938" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "1162102691032820", + "expectedQty": "1157243101258058", + "swapFee": "697261614619", + "reserves": [ + "26941317072901896066347283", + "7921625272370875073264583", + "76477863562573772129652249" + ], + "mAssetSupply": "110701677485549352360205737" + }, + { + "type": "redeemMasset", + "inputQty": "372807595125595648819", + "expectedQtys": [ + "90702459775166258118", + "26669479286291169159", + "257475546748681412980" + ], + "redemptionFee": "111842278537678694", + "reserves": [ + "26941226370442120900089165", + "7921598602891588782095424", + "76477606087027023448239269" + ], + "mAssetSupply": "110701304789796505302235612" + }, + { + "type": "redeemMasset", + "inputQty": "17513262900984861740236", + "expectedQtys": [ + "4260900380190324191827", + "1252843580120291430563", + "12095346231520183410624" + ], + "redemptionFee": "5253978870295458522", + "reserves": [ + "26936965470061930575897338", + "7920345759311468490664861", + "76465510740795503264828645" + ], + "mAssetSupply": "110683796780874390735953898" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "162378060290661954879488", + "expectedQty": "159374806211053418681375", + "reserves": [ + "26936965470061930575897338", + "7920345759311468490664861", + "76627888801086165219708133" + ] + }, + { + "type": "redeemMasset", + "inputQty": "295117468013915540344012", + "expectedQtys": [ + "71697553047239225267202", + "21081417313388443409566", + "203958835983955122212200" + ], + "redemptionFee": "88535240404174662103", + "reserves": [ + "26865267917014691350630136", + "7899264341998080047255295", + "76423929965102210097495933" + ], + "mAssetSupply": "110548142654311932788953364" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "11534334530976309248", + "6634024010616518656", + "30482849764569415680" + ], + "expectedQty": "48697422166737953497", + "swapFee": "29235994896980960", + "reserves": [ + "26865256382680160374320888", + "7899257707974069430736639", + "76423899482252445528080253" + ], + "mAssetSupply": "110548093956889766050999867" + }, + { + "type": "mintMulti", + "inputQtys": [ + "23747603042609238376448", + "36050243820277102280704", + "17333446280574568235008" + ], + "expectedQty": "79975044080956731276954", + "reserves": [ + "26889003985722769612697336", + "7935307951794346533017343", + "76441232928533020096315261" + ], + "mAssetSupply": "110628069000970722782276821" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "6767560778858005504", + "expectedQty": "7342865883201460826", + "reserves": [ + "26889003985722769612697336", + "7935314719355125391022847", + "76441232928533020096315261" + ] + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "202700627089879306600448", + "expectedQty": "186361686880101160947688", + "swapFee": "121620376253927583960", + "reserves": [ + "26889003985722769612697336", + "7748953032475024230075159", + "76441232928533020096315261" + ], + "mAssetSupply": "110425497337122980604721159" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "66569285916727525244928", + "outputIndex": 1, + "expectedQty": "61264813802538899217865", + "swapFee": "40083700604045478573", + "reserves": [ + "26955573271639497137942264", + "7687688218672485330857294", + "76441232928533020096315261" + ], + "mAssetSupply": "110425537420823584650199732", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "458555654608744049803264", + "outputIndex": 0, + "expectedQty": "447818399463517893468172", + "swapFee": "269895796762525130777", + "reserves": [ + "26507754872175979244474092", + "7687688218672485330857294", + "76899788583141764146118525" + ], + "mAssetSupply": "110425807316620347175330509", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "1832477798077800629927936", + "outputIndex": 0, + "expectedQty": "1785234001624483827898688", + "swapFee": "1077964923778695156377", + "reserves": [ + "24722520870551495416575404", + "7687688218672485330857294", + "78732266381219564776046461" + ], + "mAssetSupply": "110426885281544125870486886", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "36310109536678865534976", + "outputIndex": 0, + "expectedQty": "35298232116559844395392", + "swapFee": "21337895510394265828", + "reserves": [ + "24687222638434935572180012", + "7687688218672485330857294", + "78768576490756243641581437" + ], + "mAssetSupply": "110426906619439636264752714", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "8519322527090734962573312", + "expectedQty": "8679569523725228895771784", + "swapFee": "5111593516254440977543", + "reserves": [ + "24687222638434935572180012", + "7687688218672485330857294", + "70089006967031014745809653" + ], + "mAssetSupply": "101912695685865155743156945" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "628908430718466212757504", + "outputIndex": 1, + "expectedQty": "569756614240653755647686", + "swapFee": "370686123293791050700", + "reserves": [ + "24687222638434935572180012", + "7117931604431831575209608", + "70717915397749480958567157" + ], + "mAssetSupply": "101913066371988449534207645", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemMasset", + "inputQty": "375545659659047770521", + "expectedQtys": [ + "90944157477093067403", + "26221430503762185757", + "260514571791960616827" + ], + "redemptionFee": "112663697897714331", + "reserves": [ + "24687131694277458479112609", + "7117905383001327813023851", + "70717654883177688997950330" + ], + "mAssetSupply": "101912690938992488384151455" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "40350875730670444544", + "outputIndex": 0, + "expectedQty": "43801881196826988443", + "swapFee": "26396283954811912", + "reserves": [ + "24687087892396261652124166", + "7117945733877058483468395", + "70717654883177688997950330" + ], + "mAssetSupply": "101912690965388772338963367", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "12477855462516020215808", + "expectedQty": "12240347165647612341906", + "reserves": [ + "24687087892396261652124166", + "7117945733877058483468395", + "70730132738640205018166138" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "44549548603759183003648", + "156206242198810418741248", + "60626214838600619524096" + ], + "expectedQty": "274229049039055773805922", + "reserves": [ + "24731637441000020835127814", + "7274151976075868902209643", + "70790758953478805637690234" + ], + "mAssetSupply": "102199160361593475725111195" + }, + { + "type": "mintMulti", + "inputQtys": [ + "348453875578009288704", + "4675124902774960029696", + "3936561264661053308928" + ], + "expectedQty": "9293014314636771894143", + "reserves": [ + "24731985894875598844416518", + "7278827100978643862239339", + "70794695514743466690999162" + ], + "mAssetSupply": "102208453375908112497005338" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "309135091018902563454976", + "130629712272352130105344", + "160871535810551931207680" + ], + "expectedQty": "610301865879640979479880", + "swapFee": "366400960103846895825", + "reserves": [ + "24422850803856696280961542", + "7148197388706291732133995", + "70633823978932914759791482" + ], + "mAssetSupply": "101598151510028471517525458" + }, + { + "type": "redeemMasset", + "inputQty": "22890259503883851346739", + "expectedQtys": [ + "5500864639765964254553", + "1610019508754174004070", + "15909162604220164495979" + ], + "redemptionFee": "6867077851165155404", + "reserves": [ + "24417349939216930316706989", + "7146587369197537558129925", + "70617914816328694595295503" + ], + "mAssetSupply": "101575268117602438831334123" + }, + { + "type": "mintMulti", + "inputQtys": [ + "4794180274618593443840", + "5896804710480940630016", + "4042310736112105553920" + ], + "expectedQty": "15201791722818566482416", + "reserves": [ + "24422144119491548910150829", + "7152484173908018498759941", + "70621957127064806700849423" + ], + "mAssetSupply": "101590469909325257397816539" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "5029463810044175", + "1768331513609845", + "15031781977412884" + ], + "expectedQty": "21721803695470698", + "swapFee": "13040906761339", + "reserves": [ + "24422144114462085100106654", + "7152484172139686985150096", + "70621957112033024723436539" + ], + "mAssetSupply": "101590469887603453702345841" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "1644415451494319", + "2013593789503693", + "34497164278057844" + ], + "expectedQty": "37685571350779964", + "swapFee": "22624917761124", + "reserves": [ + "24422144112817669648612335", + "7152484170126093195646403", + "70621957077535860445378695" + ], + "mAssetSupply": "101590469849917882351565877" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "26113378195499722473472", + "expectedQty": "28432483906902814703261", + "reserves": [ + "24422144112817669648612335", + "7178597548321592918119875", + "70621957077535860445378695" + ] + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "1520746297021913297321984", + "expectedQty": "1370579441655395790514803", + "swapFee": "912447778213147978393", + "reserves": [ + "24422144112817669648612335", + "5808018106666197127605072", + "70621957077535860445378695" + ], + "mAssetSupply": "100099068484581085016925547" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "16121379105858360705024", + "14625653031644486959104", + "19474146166518096855040" + ], + "expectedQty": "51796336429016254035505", + "swapFee": "31096459733249702242", + "reserves": [ + "24406022733711811287907311", + "5793392453634552640645968", + "70602482931369342348523655" + ], + "mAssetSupply": "100047272148152068762890042" + }, + { + "type": "mintMulti", + "inputQtys": [ + "226096421907145726885888", + "490736538348701836378112", + "31956983410411526160384" + ], + "expectedQty": "809935467065293938814368", + "reserves": [ + "24632119155618957014793199", + "6284128991983254477024080", + "70634439914779753874684039" + ], + "mAssetSupply": "100857207615217362701704410" + }, + { + "type": "mintMulti", + "inputQtys": [ + "765847638423910875136", + "2359642052269160529920", + "3263097554214957088768" + ], + "expectedQty": "6593077993818456205401", + "reserves": [ + "24632885003257380925668335", + "6286488634035523637554000", + "70637703012333968831772807" + ], + "mAssetSupply": "100863800693211181157909811" + }, + { + "type": "redeemMasset", + "inputQty": "44150616275316407428710", + "expectedQtys": [ + "10779197085024488379765", + "2750928279414874579090", + "30910618967396152669495" + ], + "redemptionFee": "13245184882594922228", + "reserves": [ + "24622105806172356437288570", + "6283737705756108762974910", + "70606792393366572679103312" + ], + "mAssetSupply": "100819663322120747345403329" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "3465720342665319415808", + "expectedQty": "3478064664444029716802", + "reserves": [ + "24625571526515021756704378", + "6283737705756108762974910", + "70606792393366572679103312" + ] + }, + { + "type": "redeemMasset", + "inputQty": "88714576445750829803110", + "expectedQtys": [ + "21661611843521304064015", + "5527420428071212070919", + "62108484617073412989021" + ], + "redemptionFee": "26614372933725248940", + "reserves": [ + "24603909914671500452640363", + "6278210285328037550903991", + "70544683908749499266114291" + ], + "mAssetSupply": "100734453424712374270565961" + }, + { + "type": "mintMulti", + "inputQtys": [ + "175356062176778059776", + "1558451633193581805568", + "3825299035972999053312" + ], + "expectedQty": "5657368255836202359933", + "reserves": [ + "24604085270733677230700139", + "6279768736961231132709559", + "70548509207785472265167603" + ], + "mAssetSupply": "100740110792968210472925894" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "9887227716655751626752", + "49235228299061723398144", + "12825911167142112264192" + ], + "expectedQty": "77407508745433981553901", + "swapFee": "46472388680468670134", + "reserves": [ + "24594198043017021479073387", + "6230533508662169409311415", + "70535683296618330152903411" + ], + "mAssetSupply": "100662703284222776491371993" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "3154640538670439333888", + "outputIndex": 2, + "expectedQty": "3597222095602802871589", + "swapFee": "2113371990363869337", + "reserves": [ + "24594198043017021479073387", + "6233688149200839848645303", + "70532086074522727350031822" + ], + "mAssetSupply": "100662705397594766855241330", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemMasset", + "inputQty": "144293469939245609123840", + "expectedQtys": [ + "35243614080651352202615", + "8932907633145716197711", + "101072847244944092572015" + ], + "redemptionFee": "43288040981773682737", + "reserves": [ + "24558954428936370126870772", + "6224755241567694132447592", + "70431013227277783257459807" + ], + "mAssetSupply": "100518455215696503019800227" + }, + { + "type": "redeemMasset", + "inputQty": "446885527669019444143718", + "expectedQtys": [ + "109151585875830702853253", + "27665750521750920337573", + "313028667846749440693488" + ], + "redemptionFee": "134065658300705833243", + "reserves": [ + "24449802843060539424017519", + "6197089491045943212110019", + "70117984559431033816766319" + ], + "mAssetSupply": "100071703753685784281489752" + }, + { + "type": "mintMulti", + "inputQtys": [ + "396280335017032688861184", + "773425907600786309775360", + "661247645374257196695552" + ], + "expectedQty": "1899931785272500390332611", + "reserves": [ + "24846083178077572112878703", + "6970515398646729521885379", + "70779232204805291013461871" + ], + "mAssetSupply": "101971635538958284671822363" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "4293929336627972947312640", + "expectedQty": "4300574591399761885949968", + "reserves": [ + "29140012514705545060191343", + "6970515398646729521885379", + "70779232204805291013461871" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "64990680967677919232", + "1388822106727703117824", + "670235132372752269312" + ], + "expectedQty": "2245696741395997541098", + "swapFee": "1348226981026214253", + "reserves": [ + "29139947524024577382272111", + "6969126576540001818767555", + "70778561969672918261192559" + ], + "mAssetSupply": "106269964433616650560231233" + }, + { + "type": "mintMulti", + "inputQtys": [ + "102563669863937664352256", + "116296991583012458070016", + "131851718982586997932032" + ], + "expectedQty": "359365332089285986596981", + "reserves": [ + "29242511193888515046624367", + "7085423568123014276837571", + "70910413688655505259124591" + ], + "mAssetSupply": "106629329765705936546828214" + }, + { + "type": "redeemMasset", + "inputQty": "55129866058273318502", + "expectedQtys": [ + "15114528883847234356", + "3662231279134088285", + "36651349426062085698" + ], + "redemptionFee": "16538959817481995", + "reserves": [ + "29242496079359631199390011", + "7085419905891735142749286", + "70910377037306079197038893" + ], + "mAssetSupply": "106629274652378838090991707" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "3887569159928572937240576", + "expectedQty": "3879966325262854451682527", + "swapFee": "2332541495957143762344", + "reserves": [ + "25362529754096776747707484", + "7085419905891735142749286", + "70910377037306079197038893" + ], + "mAssetSupply": "102744038033946222297513475" + }, + { + "type": "redeemMasset", + "inputQty": "18459907354460372231782", + "expectedQtys": [ + "4555490532656199472244", + "1272647626799524052099", + "12736566675031718251875" + ], + "redemptionFee": "5537972206338111669", + "reserves": [ + "25357974263564120548235240", + "7084147258264935618697187", + "70897640470631047478787018" + ], + "mAssetSupply": "102725583664563968263393362" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "3663476737154454913024", + "outputIndex": 2, + "expectedQty": "4074268991279428599979", + "swapFee": "2399700675089339365", + "reserves": [ + "25357974263564120548235240", + "7087810735002090073610211", + "70893566201639768050187039" + ], + "mAssetSupply": "102725586064264643352732727", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mintMulti", + "inputQtys": [ + "84941069504072468398080", + "55984894904275345408", + "58913776545412551802880" + ], + "expectedQty": "143062854736945570129784", + "reserves": [ + "25442915333068193016633320", + "7087866719896994348955619", + "70952479978185180601989919" + ], + "mAssetSupply": "102868648919001588922862511" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "607102391311726270218240", + "278086039727321110282240", + "527684316862805182513152" + ], + "expectedQty": "1431008374694547366546950", + "swapFee": "859120497114997418379", + "reserves": [ + "24835812941756466746415080", + "6809780680169673238673379", + "70424795661322375419476767" + ], + "mAssetSupply": "101437640544307041556315561" + }, + { + "type": "redeemMasset", + "inputQty": "368652710193365201715", + "expectedQtys": [ + "90233201056276138674", + "24741219894992407336", + "255866589153245741851" + ], + "redemptionFee": "110595813058009560", + "reserves": [ + "24835722708555410470276406", + "6809755938949778246266043", + "70424539794733222173734916" + ], + "mAssetSupply": "101437272002192661249123406" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "3714937425082995703808", + "outputIndex": 0, + "expectedQty": "3627337697858084237446", + "swapFee": "2185173073142161710", + "reserves": [ + "24832095370857552386038960", + "6809755938949778246266043", + "70428254732158305169438724" + ], + "mAssetSupply": "101437274187365734391285116", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemBassets", + "inputQtys": [ + "553006567232086", + "646673415234264", + "296538844809243" + ], + "expectedQty": "1555511198165077", + "swapFee": "933867039122", + "reserves": [ + "24832095370304545818806874", + "6809755938303104831031779", + "70428254731861766324629481" + ], + "mAssetSupply": "101437274185810223193120039" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "307773829558021920915456", + "outputIndex": 2, + "expectedQty": "342833890927599213008830", + "swapFee": "201951294208750094709", + "reserves": [ + "24832095370304545818806874", + "7117529767861126751947235", + "70085420840934167111620651" + ], + "mAssetSupply": "101437476137104431943214748", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "6953483554304887357440", + "outputIndex": 0, + "expectedQty": "6795802457799969907384", + "swapFee": "4093847565206778235", + "reserves": [ + "24825299567846745848899490", + "7117529767861126751947235", + "70092374324488471998978091" + ], + "mAssetSupply": "101437480230951997149992983", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemBassets", + "inputQtys": [ + "45735753790447775907840", + "7115405880226156118016", + "56139429425302669885440" + ], + "expectedQty": "108726170486716475304166", + "swapFee": "65274867212357299562", + "reserves": [ + "24779563814056298072991650", + "7110414361980900595829219", + "70036234895063169329092651" + ], + "mAssetSupply": "101328754060465280674688817" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "31464505737829318656", + "expectedQty": "28879477094355970825", + "swapFee": "18878703442697591", + "reserves": [ + "24779563814056298072991650", + "7110385482503806239858394", + "70036234895063169329092651" + ], + "mAssetSupply": "101328722614838246288067752" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "174926937342969315328", + "285615582994643386368", + "763884141720705302528" + ], + "expectedQty": "1236070505361164827289", + "swapFee": "742087555750148985", + "reserves": [ + "24779388887118955103676322", + "7110099866920811596472026", + "70035471010921448623790123" + ], + "mAssetSupply": "101327486544332885123240463" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "568117716674140971204608", + "expectedQty": "518178738939134340166551", + "swapFee": "340870630004484582722", + "reserves": [ + "24779388887118955103676322", + "6591921127981677256305475", + "70035471010921448623790123" + ], + "mAssetSupply": "100759709698288748636618577" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "192170627409504224", + "expectedQty": "192800178014964110", + "reserves": [ + "24779389079289582513180546", + "6591921127981677256305475", + "70035471010921448623790123" + ] + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "4092686983491298462269440", + "hardLimitError": true + }, + { + "type": "redeemBassets", + "inputQtys": [ + "7541341036566629318656", + "1239828948578608349184", + "12129081635353890127872" + ], + "expectedQty": "20818965800369536339903", + "swapFee": "12498878807506225539", + "reserves": [ + "24771847738253015883861890", + "6590681299033098647956291", + "70023341929286094733662251" + ], + "mAssetSupply": "100738890925288557115242784" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "38896015485153467957248", + "expectedQty": "42882914853399690197264", + "reserves": [ + "24771847738253015883861890", + "6629577314518252115913539", + "70023341929286094733662251" + ] + }, + { + "type": "redeemMasset", + "inputQty": "8752529424274941385113", + "expectedQtys": [ + "2150699209448902235817", + "575581879881210408345", + "6079447432487184774266" + ], + "redemptionFee": "2625758827282482415", + "reserves": [ + "24769697039043566981626073", + "6629001732638370905505194", + "70017262481853607548887985" + ], + "mAssetSupply": "100773023936476509146537350" + }, + { + "type": "mintMulti", + "inputQtys": [ + "8897371997153899520", + "639533486835959332864", + "1513097384644602232832" + ], + "expectedQty": "2196473823129675412997", + "reserves": [ + "24769705936415564135525593", + "6629641266125206864838058", + "70018775579238252151120817" + ], + "mAssetSupply": "100775220410299638821950347" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "1992197525610395336704", + "expectedQty": "2031623610696964102420", + "swapFee": "1195318515366237202", + "reserves": [ + "24769705936415564135525593", + "6629641266125206864838058", + "70016743955627555187018397" + ], + "mAssetSupply": "100773229408092543792850845" + }, + { + "type": "mintMulti", + "inputQtys": [ + "24999052440956213133312", + "247189649012031102124032", + "637852134180306940854272" + ], + "expectedQty": "922015448616530058136438", + "reserves": [ + "24794704988856520348658905", + "6876830915137237966962090", + "70654596089807862127872669" + ], + "mAssetSupply": "101695244856709073850987283" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "4054283275564527124480", + "6596722118772378304512", + "8818872895395802906624" + ], + "expectedQty": "19948610382923062809289", + "swapFee": "11976352040978424740", + "reserves": [ + "24790650705580955821534425", + "6870234193018465588657578", + "70645777216912466324966045" + ], + "mAssetSupply": "101675296246326150788177994" + }, + { + "type": "redeemMasset", + "inputQty": "759069227157317746688", + "expectedQtys": [ + "185022079308380176413", + "51275177518500687057", + "527256373794462006305" + ], + "redemptionFee": "227720768147195324", + "reserves": [ + "24790465683501647441358012", + "6870182917840947087970521", + "70645249960538671862959740" + ], + "mAssetSupply": "101674537404819761617626630" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "1539670623265517993984", + "5856072404120340791296", + "5341677049675432067072" + ], + "expectedQty": "13204560171219381498377", + "swapFee": "7927492598290603260", + "reserves": [ + "24788926012878381923364028", + "6864326845436826747179225", + "70639908283488996430892668" + ], + "mAssetSupply": "101661332844648542236128253" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "715970522792810587881472", + "outputIndex": 2, + "expectedQty": "792446159054407834403500", + "swapFee": "467292809474739761830", + "reserves": [ + "24788926012878381923364028", + "7580297368229637335060697", + "69847462124434588596489168" + ], + "mAssetSupply": "101661800137458016975890083", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemBassets", + "inputQtys": [ + "119729864921346518024192", + "130959112662177611251712", + "17674599997367620993024" + ], + "expectedQty": "278852222897597133578806", + "swapFee": "167411780807042505650", + "reserves": [ + "24669196147957035405339836", + "7449338255567459723808985", + "69829787524437220975496144" + ], + "mAssetSupply": "101382947914560419842311277" + }, + { + "type": "redeemMasset", + "inputQty": "36538623185248379836825", + "expectedQtys": [ + "8888161839147583439603", + "2683951419127215521082", + "25159249170017498236879" + ], + "redemptionFee": "10961586955574513951", + "reserves": [ + "24660307986117887821900233", + "7446654304148332508287903", + "69804628275267203477259265" + ], + "mAssetSupply": "101346420252962127036988403" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "983463086706339837116416", + "outputIndex": 0, + "expectedQty": "960780614867207067272273", + "swapFee": "579378055491708832185", + "reserves": [ + "23699527371250680754627960", + "7446654304148332508287903", + "70788091361973543314375681" + ], + "mAssetSupply": "101346999631017618745820588", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "503585471056576380928", + "expectedQty": "512848494558354638940", + "swapFee": "302151282633945828", + "reserves": [ + "23699527371250680754627960", + "7446654304148332508287903", + "70787578513478984959736741" + ], + "mAssetSupply": "101346496347697844803385488" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "1968087461096423161856", + "outputIndex": 0, + "expectedQty": "2118666951803531619208", + "swapFee": "1278311397691037054", + "reserves": [ + "23697408704298877223008752", + "7448622391609428931449759", + "70787578513478984959736741" + ], + "mAssetSupply": "101346497626009242494422542", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mintMulti", + "inputQtys": [ + "18884566674453745893376", + "700098423905034043392", + "2961492187965671604224" + ], + "expectedQty": "22642782297088507942748", + "reserves": [ + "23716293270973330968902128", + "7449322490033333965493151", + "70790540005666950631340965" + ], + "mAssetSupply": "101369140408306331002365290" + }, + { + "type": "redeemMasset", + "inputQty": "60995630855623317913", + "expectedQtys": [ + "14266238094888752545", + "4481046303238918731", + "42583159478072375504" + ], + "redemptionFee": "18298689256686995", + "reserves": [ + "23716279004735236080149583", + "7449318008987030726574420", + "70790497422507472558965461" + ], + "mAssetSupply": "101369079430974164635734372" + }, + { + "type": "redeemMasset", + "inputQty": "17090230310573965312000", + "expectedQtys": [ + "3997225560044438339363", + "1255534409275462327618", + "11931280857718420716506" + ], + "redemptionFee": "5127069093172189593", + "reserves": [ + "23712281779175191641810220", + "7448062474577755264246802", + "70778566141649754138248955" + ], + "mAssetSupply": "101351994327732683842611965" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "117365279387554091630592", + "expectedQty": "108235090129609749352064", + "swapFee": "70419167632532454978", + "reserves": [ + "23712281779175191641810220", + "7339827384448145514894738", + "70778566141649754138248955" + ], + "mAssetSupply": "101234699467512762283436351" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "11636966341611089920", + "expectedQty": "11572661786294367380", + "swapFee": "6982179804966653", + "reserves": [ + "23712270206513405347442840", + "7339827384448145514894738", + "70778566141649754138248955" + ], + "mAssetSupply": "101234687837528600477313084" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "2702639080018477580288", + "expectedQty": "2932066757031901980076", + "reserves": [ + "23712270206513405347442840", + "7342530023528163992475026", + "70778566141649754138248955" + ] + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "3983252483509926362087424", + "outputIndex": 1, + "hardLimitError": true + }, + { + "type": "redeemMasset", + "inputQty": "18666375647551293489152", + "expectedQtys": [ + "4370799678088312747239", + "1353422830614306980105", + "13046365084963431012557" + ], + "redemptionFee": "5599912694265388046", + "reserves": [ + "23707899406835317034695601", + "7341176600697549685494921", + "70765519776564790707236398" + ], + "mAssetSupply": "101218959128550775351192054" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "51727666210158231420928", + "636575759983202308980736", + "230756385254967720542208" + ], + "expectedQty": "973650934159503700372652", + "swapFee": "584541285266862337626", + "reserves": [ + "23656171740625158803274673", + "6704600840714347376514185", + "70534763391309822986694190" + ], + "mAssetSupply": "100245308194391271650819402" + }, + { + "type": "mintMulti", + "inputQtys": [ + "4299123279004245504", + "1039576167363833216", + "635202144287318144" + ], + "expectedQty": "6086400839939633058", + "reserves": [ + "23656176039748437807520177", + "6704601880290514740347401", + "70534764026511967274012334" + ], + "mAssetSupply": "100245314280792111590452460" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "9364566976695096427151360", + "expectedQty": "9536049397679041277706323", + "swapFee": "5618740186017057856290", + "reserves": [ + "23656176039748437807520177", + "6704601880290514740347401", + "60998714628832925996306011" + ], + "mAssetSupply": "90886366044283032221157390" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "1966505333966879091326976", + "expectedQty": "1998104973491053137277690", + "swapFee": "1179903200380127454796", + "reserves": [ + "23656176039748437807520177", + "6704601880290514740347401", + "59000609655341872859028321" + ], + "mAssetSupply": "88921040613516533257285210" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "113827194097337", + "expectedQty": "112001349389547", + "reserves": [ + "23656176039748437807520177", + "6704601880290514740347401", + "59000609655455700053125658" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "186089706748127552", + "219398564517154592", + "99832349290746400" + ], + "expectedQty": "519756324346188376", + "swapFee": "312041019219244", + "reserves": [ + "23656175853658731059392625", + "6704601660891950223192809", + "59000609555623350762379258" + ], + "mAssetSupply": "88921040093872210260486381" + }, + { + "type": "mintMulti", + "inputQtys": [ + "2990270547750897447862272", + "951855113434357978628096", + "1117836521319324733931520" + ], + "expectedQty": "5105852337212298789612692", + "reserves": [ + "26646446401409628507254897", + "7656456774326308201820905", + "60118446076942675496310778" + ], + "mAssetSupply": "94026892431084509050099073" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "14536046464932467703808", + "expectedQty": "14528767230562050393016", + "reserves": [ + "26660982447874560974958705", + "7656456774326308201820905", + "60118446076942675496310778" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "60483681565322457907200", + "28085927201061361156096", + "31801587696159460163584" + ], + "expectedQty": "121553854439046613087743", + "reserves": [ + "26721466129439883432865905", + "7684542701527369562977001", + "60150247664638834956474362" + ], + "mAssetSupply": "94162975052754117713579832" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "3805446936449059129393152", + "outputIndex": 0, + "expectedQty": "3944074864164055226636272", + "swapFee": "2372981211270672706123", + "reserves": [ + "22777391265275828206229633", + "11489989637976428692370153", + "60150247664638834956474362" + ], + "mAssetSupply": "94165348033965388386285955", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "194366476997684709294080", + "expectedQty": "199178683355002288264847", + "reserves": [ + "22777391265275828206229633", + "11684356114974113401664233", + "60150247664638834956474362" + ] + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "2525968062825478582435840", + "expectedQty": "2576044928626362025233601", + "reserves": [ + "22777391265275828206229633", + "14210324177799591984100073", + "60150247664638834956474362" + ] + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "9995310265263027195478016", + "expectedQty": "10082990282345006887623802", + "reserves": [ + "22777391265275828206229633", + "24205634443062619179578089", + "60150247664638834956474362" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "59886535896939012030464", + "14223042321950842028032", + "126916906421018144276480" + ], + "expectedQty": "200698561186978510994595", + "reserves": [ + "22837277801172767218260097", + "24219857485384570021606121", + "60277164571059853100750842" + ], + "mAssetSupply": "107224260489478738098402800" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "1580156208023690943660032", + "outputIndex": 2, + "expectedQty": "1593775272091257646328201", + "swapFee": "951825761532812075865", + "reserves": [ + "22837277801172767218260097", + "25800013693408260965266153", + "58683389298968595454422641" + ], + "mAssetSupply": "107225212315240270910478665", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mintMulti", + "inputQtys": [ + "40151657069138690048", + "41906951062536724480", + "65100154461064544256" + ], + "expectedQty": "147174855342693845861", + "reserves": [ + "22837317952829836356950145", + "25800055600359323501990633", + "58683454399123056518966897" + ], + "mAssetSupply": "107225359490095613604324526" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "2544038493675675189248", + "expectedQty": "2557431264561485785168", + "reserves": [ + "22839861991323512032139393", + "25800055600359323501990633", + "58683454399123056518966897" + ] + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "98808131574308540514304", + "expectedQty": "99257458588756782046530", + "swapFee": "59284878944585124308", + "reserves": [ + "22839861991323512032139393", + "25800055600359323501990633", + "58584196940534299736920367" + ], + "mAssetSupply": "107129168074664811134719698" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "32360449353578035806208", + "expectedQty": "32529864611760620579153", + "reserves": [ + "22872222440677090067945601", + "25800055600359323501990633", + "58584196940534299736920367" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "4793611182225258184704", + "45064951648482800697344", + "43319755806143636570112" + ], + "expectedQty": "93130454514348403346997", + "reserves": [ + "22877016051859315326130305", + "25845120552007806302687977", + "58627516696340443373490479" + ], + "mAssetSupply": "107254828393790920158645848" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "34239392468697020891136", + "33905191123822992949248", + "1681125681264823631872" + ], + "expectedQty": "70108319923242718218718", + "swapFee": "42090246101606594888", + "reserves": [ + "22842776659390618305239169", + "25811215360883983309738729", + "58625835570659178549858607" + ], + "mAssetSupply": "107184720073867677440427130" + }, + { + "type": "mintMulti", + "inputQtys": [ + "480189033041307612741632", + "247594460182027540889600", + "1460578788173099609096192" + ], + "expectedQty": "2184189195726089107465236", + "reserves": [ + "23322965692431925917980801", + "26058809821066010850628329", + "60086414358832278158954799" + ], + "mAssetSupply": "109368909269593766547892366" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "10248343463569636982784", + "expectedQty": "10188617153992163953074", + "swapFee": "6149006078141782189", + "reserves": [ + "23312777075277933754027727", + "26058809821066010850628329", + "60086414358832278158954799" + ], + "mAssetSupply": "109358667075136275052691771" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "85234144687746986278912", + "69740624739713987641344", + "70898552270871632805888" + ], + "expectedQty": "226195884336246120679956", + "swapFee": "135799010007752323802", + "reserves": [ + "23227542930590186767748815", + "25989069196326296862986985", + "60015515806561406526148911" + ], + "mAssetSupply": "109132471190800028932011815" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "224502943240998780928", + "outputIndex": 1, + "expectedQty": "224775334307038588483", + "swapFee": "135414616500757811", + "reserves": [ + "23227767433533427766529743", + "25988844420991989824398502", + "60015515806561406526148911" + ], + "mAssetSupply": "109132471326214645432769626", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "472348446443977375744", + "expectedQty": "469886596305078390475", + "reserves": [ + "23227767433533427766529743", + "25988844420991989824398502", + "60015988155007850503524655" + ] + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "625532039573881539788800", + "expectedQty": "622904020463073199184997", + "swapFee": "375319223744328923873", + "reserves": [ + "23227767433533427766529743", + "25365940400528916625213505", + "60015988155007850503524655" + ], + "mAssetSupply": "108507784492460813300295174" + }, + { + "type": "redeemMasset", + "inputQty": "187833713958520383078", + "expectedQtys": [ + "40196645402535164597", + "43896845209061718954", + "103860235438159739215" + ], + "redemptionFee": "56350114187556114", + "reserves": [ + "23227727236888025231365146", + "25365896503683707563494551", + "60015884294772412343785440" + ], + "mAssetSupply": "108507596715096968967468210" + }, + { + "type": "redeemMasset", + "inputQty": "47874364765526261760", + "expectedQtys": [ + "10245172838228863043", + "11188266128084703902", + "26471514038730687545" + ], + "redemptionFee": "14362309429657878", + "reserves": [ + "23227716991715187002502103", + "25365885315417579478790649", + "60015857823258373613097895" + ], + "mAssetSupply": "108507548855094512870864328" + }, + { + "type": "redeemMasset", + "inputQty": "63227896895310786671411", + "expectedQtys": [ + "13530847564511853894795", + "14776395272261351631536", + "34961052089173078717824" + ], + "redemptionFee": "18968369068593236001", + "reserves": [ + "23214186144150675148607308", + "25351108920145318127159113", + "59980896771169200534380071" + ], + "mAssetSupply": "108444339926568270677428918" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "165132346975316705280", + "1152595115792911826944", + "848863336106912907264" + ], + "expectedQty": "2167286433106094589459", + "swapFee": "1301152551394493449", + "reserves": [ + "23214021011803699831902028", + "25349956325029525215332169", + "59980047907833093621472807" + ], + "mAssetSupply": "108442172640135164582839459" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "4403613786590620", + "expectedQty": "4378159587574917", + "swapFee": "2642168271954", + "reserves": [ + "23214021007425540244327111", + "25349956325029525215332169", + "59980047907833093621472807" + ], + "mAssetSupply": "108442172635734192964520793" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "126625785775200080494592", + "outputIndex": 0, + "expectedQty": "125217045732230655513974", + "swapFee": "75571699787258964951", + "reserves": [ + "23088803961693309588813137", + "25349956325029525215332169", + "60106673693608293701967399" + ], + "mAssetSupply": "108442248207433980223485744", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemBassets", + "inputQtys": [ + "306960244792605286596608", + "510096415543960325324800", + "250987746101665848098816" + ], + "expectedQty": "1070298495785168642796925", + "swapFee": "642564636252852897416", + "reserves": [ + "22781843716900704302216529", + "24839859909485564890007369", + "59855685947506627853868583" + ], + "mAssetSupply": "107371949711648811580688819" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "7420962818599162205962240", + "expectedQty": "7438975085907238524067939", + "reserves": [ + "22781843716900704302216529", + "32260822728084727095969609", + "59855685947506627853868583" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "343794277026444527796224", + "373882619240112334045184", + "78458696700539661451264" + ], + "expectedQty": "798458809989388599322316", + "swapFee": "479362903735874684404", + "reserves": [ + "22438049439874259774420305", + "31886940108844614761924425", + "59777227250806088192417319" + ], + "mAssetSupply": "114012465987566661505434442" + }, + { + "type": "mintMulti", + "inputQtys": [ + "5362361161721676038144", + "12587350457247078547456", + "14850602634216432730112" + ], + "expectedQty": "32782456923161074313234", + "reserves": [ + "22443411801035981450458449", + "31899527459301861840471881", + "59792077853440304625147431" + ], + "mAssetSupply": "114045248444489822579747676" + }, + { + "type": "redeemMasset", + "inputQty": "41734400709454453748531", + "expectedQtys": [ + "8210612502151631158657", + "11670001927157225703322", + "21874106588839557015927" + ], + "redemptionFee": "12520320212836336124", + "reserves": [ + "22435201188533829819299792", + "31887857457374704614768559", + "59770203746851465068131504" + ], + "mAssetSupply": "114003526564100580962335269" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "656746719444516147822592", + "expectedQty": "659378300908848244167836", + "swapFee": "394048031666709688693", + "reserves": [ + "22435201188533829819299792", + "31887857457374704614768559", + "59110825445942616823963668" + ], + "mAssetSupply": "113347173892687731524201370" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "13110880580049651630080", + "12806502743272308342784", + "59808038715115763138560" + ], + "expectedQty": "85552989178092385754353", + "swapFee": "51362611073499531171", + "reserves": [ + "22422090307953780167669712", + "31875050954631432306425775", + "59051017407227501060825108" + ], + "mAssetSupply": "113261620903509639138447017" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "870804405569144909463552", + "2211540069804113435557888", + "629261813920707937042432" + ], + "expectedQty": "3717441158010187360525925", + "swapFee": "2231803777072355829813", + "reserves": [ + "21551285902384635258206160", + "29663510884827318870867887", + "58421755593306793123782676" + ], + "mAssetSupply": "109544179745499451777921092" + }, + { + "type": "mintMulti", + "inputQtys": [ + "1151027727445996909625344", + "2083713488280635314274304", + "2183192207514428669689856" + ], + "expectedQty": "5418237548504683706111020", + "reserves": [ + "22702313629830632167831504", + "31747224373107954185142191", + "60604947800821221793472532" + ], + "mAssetSupply": "114962417294004135484032112" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "7162378818192879386624", + "expectedQty": "7128753744306748844290", + "reserves": [ + "22702313629830632167831504", + "31747224373107954185142191", + "60612110179639414672859156" + ] + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "65122289943294160", + "expectedQty": "64991798961621179", + "swapFee": "39073373965976", + "reserves": [ + "22702313629830632167831504", + "31747224308116155223521012", + "60612110179639414672859156" + ], + "mAssetSupply": "114969545982665225663548218" + }, + { + "type": "redeemMasset", + "inputQty": "14179964652553882304512", + "expectedQtys": [ + "2799188486395112234664", + "3914423270124858731260", + "7473455072350896350880" + ], + "redemptionFee": "4253989395766164691", + "reserves": [ + "22699514441344237055596840", + "31743309884846030364789752", + "60604636724567063776508276" + ], + "mAssetSupply": "114955370272002067547408397" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "210989693112988410576896", + "expectedQty": "210560580690454884658701", + "swapFee": "126593815867793046346", + "reserves": [ + "22699514441344237055596840", + "31532749304155575480131051", + "60604636724567063776508276" + ], + "mAssetSupply": "114744507172704946929877847" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "1455196907241106256691200", + "expectedQty": "1463934159098655395522733", + "reserves": [ + "24154711348585343312288040", + "31532749304155575480131051", + "60604636724567063776508276" + ] + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "6536392958701310312448", + "expectedQty": "6507263079078325886085", + "reserves": [ + "24154711348585343312288040", + "31532749304155575480131051", + "60611173117525765086820724" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "9701778202301999104", + "18188609604171024384", + "18846584446591426560" + ], + "expectedQty": "46737028765813515536", + "swapFee": "28059052691102770", + "reserves": [ + "24154701646807141010288936", + "31532731115545971309106667", + "60611154270941318495394164" + ], + "mAssetSupply": "116214901857853914837771129" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "1110446480713235587661824", + "outputIndex": 0, + "expectedQty": "1104779067792537218978508", + "swapFee": "667269653190099111846", + "reserves": [ + "23049922579014603791310428", + "32643177596259206896768491", + "60611154270941318495394164" + ], + "mAssetSupply": "116215569127507104936882975", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "2729947371613191504134144", + "expectedQty": "2717093650492920212725383", + "reserves": [ + "23049922579014603791310428", + "32643177596259206896768491", + "63341101642554509999528308" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "5829537715902380769280", + "5440591688012630327296", + "4795971405839429795840" + ], + "expectedQty": "16090974209338663021130", + "reserves": [ + "23055752116730506172079708", + "32648618187947219527095787", + "63345897613960349429324148" + ], + "mAssetSupply": "118948753752209363812629488" + }, + { + "type": "redeemMasset", + "inputQty": "39614523154718329195724", + "expectedQtys": [ + "7676151237296036458999", + "10869987221868010138664", + "21090298329247668029627" + ], + "redemptionFee": "11884356946415498758", + "reserves": [ + "23048075965493210135620709", + "32637748200725351516957123", + "63324807315631101761294521" + ], + "mAssetSupply": "118909151113411591898932522" + }, + { + "type": "mintMulti", + "inputQtys": [ + "703625730722320175071232", + "1124894317454722422800384", + "671407604517957860851712" + ], + "expectedQty": "2503054310447291584478390", + "reserves": [ + "23751701696215530310691941", + "33762642518180073939757507", + "63996214920149059622146233" + ], + "mAssetSupply": "121412205423858883483410912" + }, + { + "type": "mintMulti", + "inputQtys": [ + "16654631046477699350528", + "1435547261454123532288", + "3544972779111255638016" + ], + "expectedQty": "21731654707427128787344", + "reserves": [ + "23768356327262008010042469", + "33764078065441528063289795", + "63999759892928170877784249" + ], + "mAssetSupply": "121433937078566310612198256" + }, + { + "type": "mintMulti", + "inputQtys": [ + "1442941436682272243712", + "1749036393942011346944", + "3439717128615844380672" + ], + "expectedQty": "6627432955433711388541", + "reserves": [ + "23769799268698690282286181", + "33765827101835470074636739", + "64003199610056786722164921" + ], + "mAssetSupply": "121440564511521744323586797" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "4566392269945138315264", + "expectedQty": "4557654410798362429803", + "swapFee": "2739835361967082989", + "reserves": [ + "23769799268698690282286181", + "33761269447424671712206936", + "64003199610056786722164921" + ], + "mAssetSupply": "121436000859087161152354522" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "29471573423005614080", + "outputIndex": 0, + "expectedQty": "29297027574808263683", + "swapFee": "17706226022628523", + "reserves": [ + "23769769971671115474022498", + "33761298918998094717821016", + "64003199610056786722164921" + ], + "mAssetSupply": "121436000876793387174983045", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mintMulti", + "inputQtys": [ + "237091567213233569792", + "41637403133211115520", + "58637975606873645056" + ], + "expectedQty": "338728848482431237882", + "reserves": [ + "23770007063238328707592290", + "33761340556401227928936536", + "64003258248032393595809977" + ], + "mAssetSupply": "121436339605641869606220927" + }, + { + "type": "redeemMasset", + "inputQty": "80961904309378846661017", + "expectedQtys": [ + "15842767527609106981353", + "22502015604476510868044", + "42658327308673742665288" + ], + "redemptionFee": "24288571292813653998", + "reserves": [ + "23754164295710719600610937", + "33738838540796751418068492", + "63960599920723719853144689" + ], + "mAssetSupply": "121355401989903783573213908" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "1310226351395589956042752", + "expectedQty": "1300153982459245271634543", + "swapFee": "786135810837353973625", + "reserves": [ + "22454010313251474328976394", + "33738838540796751418068492", + "63960599920723719853144689" + ], + "mAssetSupply": "120045961774319030971144781" + }, + { + "type": "redeemMasset", + "inputQty": "1387249091685675276697", + "expectedQtys": [ + "259400317677299967354", + "389768478478911270735", + "738905866114919699724" + ], + "redemptionFee": "416174727505702583", + "reserves": [ + "22453750912933797029009040", + "33738448772318272506797757", + "63959861014857604933444965" + ], + "mAssetSupply": "120044574941402072801570667" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "39584182264326742016", + "4304354032105157632", + "67440344875124244480" + ], + "expectedQty": "111301282584002700906", + "swapFee": "66820862067642205", + "reserves": [ + "22453711328751532702267024", + "33738444467964240401640125", + "63959793574512729809200485" + ], + "mAssetSupply": "120044463640119488798869761" + }, + { + "type": "redeemMasset", + "inputQty": "132405232121852", + "expectedQtys": [ + "24758300996972", + "37201269361555", + "70524457976545" + ], + "redemptionFee": "39721569636", + "reserves": [ + "22453711328726774401270052", + "33738444467927039132278570", + "63959793574442205351223940" + ], + "mAssetSupply": "120044463639987123288317545" + }, + { + "type": "redeemMasset", + "inputQty": "602367284548611552051", + "expectedQtys": [ + "112635960849786483440", + "169244275682848172076", + "320845525247064181592" + ], + "redemptionFee": "180710185364583465", + "reserves": [ + "22453598692765924614786612", + "33738275223651356284106494", + "63959472728916958287042348" + ], + "mAssetSupply": "120043861453412760041348959" + }, + { + "type": "mintMulti", + "inputQtys": [ + "18440795197585397645312", + "856136440898247425261568", + "188900442516943508865024" + ], + "expectedQty": "1063576893202533384249052", + "reserves": [ + "22472039487963510012431924", + "34594411664549603709368062", + "64148373171433901795907372" + ], + "mAssetSupply": "121107438346615293425598011" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "8564486239196258304", + "outputIndex": 0, + "expectedQty": "8501261754720403764", + "swapFee": "5143508047593652", + "reserves": [ + "22472030986701755292028160", + "34594420229035842905626366", + "64148373171433901795907372" + ], + "mAssetSupply": "121107438351758801473191663", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "34823178521598590976", + "expectedQty": "34533740155589353542", + "swapFee": "20893907112959154", + "reserves": [ + "22471996452961599702674618", + "34594420229035842905626366", + "64148373171433901795907372" + ], + "mAssetSupply": "121107403549474186987559841" + }, + { + "type": "mintMulti", + "inputQtys": [ + "2213985353116775350272", + "73106627024053100544", + "1333987315936276512768" + ], + "expectedQty": "3631821640985633921848", + "reserves": [ + "22474210438314716478024890", + "34594493335662866958726910", + "64149707158749838072420140" + ], + "mAssetSupply": "121111035371115172621481689" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "590251160022912466944", + "expectedQty": "587356949749397255853", + "reserves": [ + "22474210438314716478024890", + "34594493335662866958726910", + "64150297409909860984887084" + ] + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "2853892718059781879758848", + "expectedQty": "2855591014267531364471340", + "reserves": [ + "22474210438314716478024890", + "37448386053722648838485758", + "64150297409909860984887084" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "4777088386783343804416", + "10585487081529958989824", + "10520748459822237614080" + ], + "expectedQty": "25876126724558409877827", + "reserves": [ + "22478987526701499821829306", + "37458971540804178797475582", + "64160818158369683222501164" + ], + "mAssetSupply": "123993089869057011793086709" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "2974428435782828132663296", + "expectedQty": "2944453503639794141452117", + "swapFee": "1784657061469696879597", + "reserves": [ + "19534534023061705680377189", + "37458971540804178797475582", + "64160818158369683222501164" + ], + "mAssetSupply": "121020446090335653357303010" + }, + { + "type": "redeemMasset", + "inputQty": "358147532731133861874892", + "expectedQtys": [ + "57793096256166000094072", + "110822707383698944100931", + "189820363020865566193223" + ], + "redemptionFee": "107444259819340158562", + "reserves": [ + "19476740926805539680283117", + "37348148833420479853374651", + "63970997795348817656307941" + ], + "mAssetSupply": "120662406001864338835586680" + }, + { + "type": "mintMulti", + "inputQtys": [ + "72605911310518062153728", + "107491725458624361791488", + "31185598090984418181120" + ], + "expectedQty": "211901742971528465528323", + "reserves": [ + "19549346838116057742436845", + "37455640558879104215166139", + "64002183393439802074489061" + ], + "mAssetSupply": "120874307744835867301115003" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "20636289755086644576256", + "97262570499963504033792", + "25212327120438890070016" + ], + "expectedQty": "143185288021089676764963", + "swapFee": "85962750462931564997", + "reserves": [ + "19528710548360971097860589", + "37358377988379140711132347", + "63976971066319363184419045" + ], + "mAssetSupply": "120731122456814777624350040" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "126522105416497187782656", + "expectedQty": "126469673936892524873742", + "swapFee": "75913263249898312669", + "reserves": [ + "19528710548360971097860589", + "37231908314442248186258605", + "63976971066319363184419045" + ], + "mAssetSupply": "120604676264661530334880053" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "10351328710383922864717824", + "expectedQty": "10339203231502647155567261", + "reserves": [ + "19528710548360971097860589", + "47583237024826171050976429", + "63976971066319363184419045" + ] + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "6896671945739897667584", + "expectedQty": "6803235281541435693946", + "swapFee": "4138003167443938600", + "reserves": [ + "19521907313079429662166643", + "47583237024826171050976429", + "63976971066319363184419045" + ], + "mAssetSupply": "130936986962221605036718330" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "215697701557778859950080", + "expectedQty": "216594958912398621384430", + "swapFee": "129418620934667315970", + "reserves": [ + "19521907313079429662166643", + "47583237024826171050976429", + "63760376107406964563034615" + ], + "mAssetSupply": "130721418679284760844084220" + }, + { + "type": "mintMulti", + "inputQtys": [ + "4315627443735262694211584", + "931945797301216693190656", + "4045269630084150984704" + ], + "expectedQty": "5296023047545237025244030", + "reserves": [ + "23837534756814692356378227", + "48515182822127387744167085", + "63764421377037048714019319" + ], + "mAssetSupply": "136017441726829997869328250" + }, + { + "type": "redeemMasset", + "inputQty": "276798979761334470574080", + "expectedQtys": [ + "48495441138857348180629", + "98700021495250115071249", + "129723302983727082353815" + ], + "redemptionFee": "83039693928400341172", + "reserves": [ + "23789039315675835008197598", + "48416482800632137629095836", + "63634698074053321631665504" + ], + "mAssetSupply": "135740725786762591799095342" + }, + { + "type": "redeemMasset", + "inputQty": "80298653321738101719040", + "expectedQtys": [ + "14068399453825675932485", + "28632615682791916627036", + "37632387745874817270895" + ], + "redemptionFee": "24089595996521430515", + "reserves": [ + "23774970916222009332265113", + "48387850184949345712468800", + "63597065686307446814394609" + ], + "mAssetSupply": "135660451223036850218806817" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "1324692008799563660918784", + "expectedQty": "1311797645384642143688153", + "swapFee": "794815205279738196551", + "reserves": [ + "22463173270837367188576960", + "48387850184949345712468800", + "63597065686307446814394609" + ], + "mAssetSupply": "134336554029442566296084584" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "571264511650482356224000", + "expectedQty": "571824673205446637854347", + "swapFee": "342758706990289413734", + "reserves": [ + "22463173270837367188576960", + "47816025511743899074614453", + "63597065686307446814394609" + ], + "mAssetSupply": "133765632276499074229274318" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "2924742333800965002493952", + "expectedQty": "2919656329391151235773418", + "reserves": [ + "22463173270837367188576960", + "50740767845544864077108405", + "63597065686307446814394609" + ] + }, + { + "type": "redeemMasset", + "inputQty": "41575061447597571755212", + "expectedQtys": [ + "6830491022280716838373", + "15429002619259256782527", + "19338282306608713966430" + ], + "redemptionFee": "12472518434279271526", + "reserves": [ + "22456342779815086471738587", + "50725338842925604820325878", + "63577727404000838100428179" + ], + "mAssetSupply": "136643726016961062172564050" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "109916614837135548088320", + "expectedQty": "109703280226675346458072", + "reserves": [ + "22456342779815086471738587", + "50835255457762740368414198", + "63577727404000838100428179" + ] + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "209900502064516458086400", + "expectedQty": "209083774151330716611900", + "reserves": [ + "22456342779815086471738587", + "50835255457762740368414198", + "63787627906065354558514579" + ] + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "299242580179828864", + "expectedQty": "298074914484879898", + "reserves": [ + "22456342779815086471738587", + "50835255457762740368414198", + "63787628205307934738343443" + ] + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "408605555400948876050432", + "expectedQty": "404126074990390513156153", + "swapFee": "245163333240569325630", + "reserves": [ + "22052216704824695958582434", + "50835255457762740368414198", + "63787628205307934738343443" + ], + "mAssetSupply": "136554152977346274413789118" + }, + { + "type": "redeemMasset", + "inputQty": "107333799042289696768", + "expectedQtys": [ + "17328203208630032370", + "39945355540697524853", + "50123078261619290856" + ], + "redemptionFee": "32200139712686909", + "reserves": [ + "22052199376621487328550064", + "50835215512407199670889345", + "63787578082229673119052587" + ], + "mAssetSupply": "136554045675747371836779259" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "15060587789153428570112", + "22626858815070513659904", + "13294594261560896520192" + ], + "expectedQty": "51044461335215688322208", + "swapFee": "30645063839433072837", + "reserves": [ + "22037138788832333899979952", + "50812588653592129157229441", + "63774283487968112222532395" + ], + "mAssetSupply": "136503001214412156148457051" + }, + { + "type": "redeemMasset", + "inputQty": "307806322898473543584972", + "expectedQtys": [ + "49677557608751701883520", + "114545056156193335384424", + "143764155242145518533271" + ], + "redemptionFee": "92341896869542063075", + "reserves": [ + "21987461231223582198096432", + "50698043597435935821845017", + "63630519332725966703999124" + ], + "mAssetSupply": "136195287233410552146935154" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "2105906943660537772244992", + "expectedQty": "2112832431385842916918149", + "swapFee": "1263544166196322663346", + "reserves": [ + "21987461231223582198096432", + "50698043597435935821845017", + "61517686901340123787080975" + ], + "mAssetSupply": "134090643833916210697353508" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "1714017118085980618752", + "outputIndex": 2, + "expectedQty": "1715847979916237720598", + "swapFee": "1026251233600675249", + "reserves": [ + "21987461231223582198096432", + "50699757614554021802463769", + "61515971053360207549360377" + ], + "mAssetSupply": "134090644860167444298028757", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "43247210533040645210112", + "expectedQty": "43689498741595052876924", + "reserves": [ + "22030708441756622843306544", + "50699757614554021802463769", + "61515971053360207549360377" + ] + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "748958500680618108518400", + "outputIndex": 1, + "expectedQty": "747173077571109199366231", + "swapFee": "447670384284903880197", + "reserves": [ + "22030708441756622843306544", + "49952584536982912603097538", + "62264929554040825657878777" + ], + "mAssetSupply": "134134782029293324254785878", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemMasset", + "inputQty": "36216119124228630118", + "expectedQtys": [ + "5946462127289401839", + "13483050392804638115", + "16806361285671116467" + ], + "redemptionFee": "10864835737268589", + "reserves": [ + "22030702495294495553904705", + "49952571053932519798459423", + "62264912747679539986762310" + ], + "mAssetSupply": "134134745824039035763424349" + }, + { + "type": "mintMulti", + "inputQtys": [ + "1896557767568664035328", + "969256091463387578368", + "721882332533750628352" + ], + "expectedQty": "3602395796565896363622", + "reserves": [ + "22032599053062064217940033", + "49953540310023983186037791", + "62265634630012073737390662" + ], + "mAssetSupply": "134138348219835601659787971" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "1968698431371166261182464", + "expectedQty": "1960882648819235380062199", + "reserves": [ + "22032599053062064217940033", + "49953540310023983186037791", + "64234333061383239998573126" + ] + }, + { + "type": "redeemMasset", + "inputQty": "88120845214679511859", + "expectedQtys": [ + "14261276710151849913", + "32333963836825141973", + "41577645736403865510" + ], + "redemptionFee": "26436253564403853", + "reserves": [ + "22032584791785354066090120", + "49953507976060146360895818", + "64234291483737503594707616" + ], + "mAssetSupply": "136099142774245875924742164" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "49948117155103178227712", + "expectedQty": "50478205566148401305435", + "reserves": [ + "22082532908940457244317832", + "49953507976060146360895818", + "64234291483737503594707616" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "237105197960716255232", + "228654844460774260736", + "154507013639813005312" + ], + "expectedQty": "621721699376023503755", + "reserves": [ + "22082770014138417960573064", + "49953736630904607135156554", + "64234445990751143407712928" + ], + "mAssetSupply": "136150242701511400349551354" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "21260661067046453248000", + "102484205857529416122368", + "178341887640989220208640" + ], + "expectedQty": "301395962592738377166708", + "swapFee": "180946145242788699519", + "reserves": [ + "22061509353071371507325064", + "49851252425047077719034186", + "64056104103110154187504288" + ], + "mAssetSupply": "135848846738918661972384646" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "1066327760516896692109312", + "outputIndex": 0, + "expectedQty": "1049393460959822272506639", + "swapFee": "637166350652786562800", + "reserves": [ + "21012115892111549234818425", + "49851252425047077719034186", + "65122431863627050879613600" + ], + "mAssetSupply": "135849483905269314758947446", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "8547035634040277303296", + "expectedQty": "8509383300269388197485", + "reserves": [ + "21012115892111549234818425", + "49851252425047077719034186", + "65130978899261091156916896" + ] + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "19419469088806696", + "expectedQty": "19333911237403407", + "reserves": [ + "21012115892111549234818425", + "49851252425047077719034186", + "65130978918680560245723592" + ] + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "5206882559876994695168", + "outputIndex": 2, + "expectedQty": "5216236261189169993216", + "swapFee": "3117825105523730186", + "reserves": [ + "21012115892111549234818425", + "49856459307606954713729354", + "65125762682419371075730376" + ], + "mAssetSupply": "135857996425728600908278524", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "4074665640695175315456", + "expectedQty": "4090237342367581601014", + "swapFee": "2444799384417105189", + "reserves": [ + "21012115892111549234818425", + "49856459307606954713729354", + "65121672445077003494129362" + ], + "mAssetSupply": "135853924204887290150068257" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "728333358200054582607872", + "expectedQty": "726826463096325911014436", + "reserves": [ + "21012115892111549234818425", + "50584792665807009296337226", + "65121672445077003494129362" + ] + }, + { + "type": "redeemMasset", + "inputQty": "1071844811061821702144", + "expectedQtys": [ + "164847321163909102417", + "396855205130513033862", + "510902058003341028285" + ], + "redemptionFee": "321553443318546510", + "reserves": [ + "21011951044790385325716008", + "50584395810601878783303364", + "65121161543019000153101077" + ], + "mAssetSupply": "136579679144725997557927059" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "13103354456674807054336", + "expectedQty": "12938884580799895994269", + "swapFee": "7862012674004884232", + "reserves": [ + "20999012160209585429721739", + "50584395810601878783303364", + "65121161543019000153101077" + ], + "mAssetSupply": "136566583652281996755756955" + }, + { + "type": "redeemMasset", + "inputQty": "192970089703374489", + "expectedQtys": [ + "29662934354235295", + "71454866582807986", + "91989314791788999" + ], + "redemptionFee": "57891026911012", + "reserves": [ + "20999012130546651075486444", + "50584395739147012200495378", + "65121161451029685361312078" + ], + "mAssetSupply": "136566583459369798079293478" + }, + { + "type": "mintMulti", + "inputQtys": [ + "88376896883995342536704", + "97645650347059201441792", + "92365698031906233253888" + ], + "expectedQty": "278845414308731973508697", + "reserves": [ + "21087389027430646418023148", + "50682041389494071401937170", + "65213527149061591594565966" + ], + "mAssetSupply": "136845428873678530052802175" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "1033027226724584521728", + "expectedQty": "1036930005048758319674", + "swapFee": "619816336034750713", + "reserves": [ + "21087389027430646418023148", + "50682041389494071401937170", + "65212490219056542836246292" + ], + "mAssetSupply": "136844396466268141503031160" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "31378060358941106176", + "expectedQty": "31756031147450854323", + "reserves": [ + "21087420405491005359129324", + "50682041389494071401937170", + "65212490219056542836246292" + ] + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "14836184781202216976384", + "expectedQty": "14892222824544284936801", + "swapFee": "8901710868721330185", + "reserves": [ + "21087420405491005359129324", + "50682041389494071401937170", + "65197597996231998551309491" + ], + "mAssetSupply": "136829600939228955458239284" + }, + { + "type": "redeemMasset", + "inputQty": "71750601865595640086528", + "expectedQtys": [ + "11054488100325961195034", + "26568637257049303505525", + "34178010271541355632838" + ], + "redemptionFee": "21525180559678692025", + "reserves": [ + "21076365917390679397934290", + "50655472752237022098431645", + "65163419985960457195676653" + ], + "mAssetSupply": "136757871862543919496844781" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "434008249904807884619776", + "1498861033688516322656256", + "173244131002317453393920" + ], + "expectedQty": "2107529322710875259197641", + "swapFee": "1265276759682334556252", + "reserves": [ + "20642357667485871513314514", + "49156611718548505775775389", + "64990175854958139742282733" + ], + "mAssetSupply": "134650342539833044237647140" + }, + { + "type": "mintMulti", + "inputQtys": [ + "605908132796632006656", + "473649764627807928320", + "601181875262571806720" + ], + "expectedQty": "1684494682552122144570", + "reserves": [ + "20642963575618668145321170", + "49157085368313133583703709", + "64990777036833402314089453" + ], + "mAssetSupply": "134652027034515596359791710" + }, + { + "type": "redeemMasset", + "inputQty": "2955206808821506867", + "expectedQtys": [ + "452915017976937980", + "1078526449059830206", + "1425924085083330616" + ], + "redemptionFee": "886562042646452", + "reserves": [ + "20642963122703650168383190", + "49157084289786684523873503", + "64990775610909317230758837" + ], + "mAssetSupply": "134652024080195349580931295" + }, + { + "type": "redeemMasset", + "inputQty": "115122574798720", + "expectedQtys": [ + "17643686688480", + "42014907868258", + "55548075908691" + ], + "redemptionFee": "34536772439", + "reserves": [ + "20642963122686006481694710", + "49157084289744669616005245", + "64990775610853769154850146" + ], + "mAssetSupply": "134652024080080261542905014" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "12005481038159473016832", + "59212455383408635281408", + "32979022635764727939072" + ], + "expectedQty": "104076818667531245904954", + "swapFee": "62483581349328344549", + "reserves": [ + "20630957641647847008677878", + "49097871834361260980723837", + "64957796588218004426911074" + ], + "mAssetSupply": "134547947261412730297000060" + }, + { + "type": "mintMulti", + "inputQtys": [ + "591971847883042383200256", + "431235436860464850534400", + "306167691084328440168448" + ], + "expectedQty": "1334241044306680125922807", + "reserves": [ + "21222929489530889391878134", + "49529107271221725831258237", + "65263964279302332867079522" + ], + "mAssetSupply": "135882188305719410422922867" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "39493963050642468503552", + "expectedQty": "39954129302694841944180", + "reserves": [ + "21262423452581531860381686", + "49529107271221725831258237", + "65263964279302332867079522" + ] + }, + { + "type": "redeemMasset", + "inputQty": "64334630183353224842444", + "expectedQtys": [ + "10060905104056453723624", + "23436070175899601624361", + "30881453978797015199246" + ], + "redemptionFee": "19300389055005967452", + "reserves": [ + "21252362547477475406658062", + "49505671201045826229633876", + "65233082825323535851880276" + ], + "mAssetSupply": "135857827105227807045992055" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "35059231233349431328768", + "49381505032463300165632", + "80714369727176600715264" + ], + "expectedQty": "165114944245826186395984", + "swapFee": "99128443613663910183", + "reserves": [ + "21217303316244125975329294", + "49456289696013362929468244", + "65152368455596359251165012" + ], + "mAssetSupply": "135692712160981980859596071" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "715301941761043840", + "4403139989774326272", + "4764852278761431040" + ], + "expectedQty": "9862301319088581837", + "swapFee": "5920933351464027", + "reserves": [ + "21217302600942184214285454", + "49456285292873373155141972", + "65152363690744080489733972" + ], + "mAssetSupply": "135692702298680661771014234" + }, + { + "type": "redeemMasset", + "inputQty": "218308262814587864219648", + "expectedQtys": [ + "34125069515447483131035", + "79543531302615356339507", + "104788482393781207538384" + ], + "redemptionFee": "65492478844376359265", + "reserves": [ + "21183177531426736731154419", + "49376741761570757798802465", + "65047575208350299282195588" + ], + "mAssetSupply": "135474459528344918283153851" + }, + { + "type": "redeemMasset", + "inputQty": "12485829392735068160", + "expectedQtys": [ + "1951734627410676253", + "4549378701179289769", + "5993227634281491817" + ], + "redemptionFee": "3745748817820520", + "reserves": [ + "21183175579692109320478166", + "49376737212192056619512696", + "65047569215122665000703771" + ], + "mAssetSupply": "135474447046261274365906211" + }, + { + "type": "redeemMasset", + "inputQty": "519655176597071360", + "expectedQtys": [ + "81230406933787482", + "189343304157579243", + "249435713617161090" + ], + "redemptionFee": "155896552979121", + "reserves": [ + "21183175498461702386690684", + "49376737022848752461933453", + "65047568965686951383542681" + ], + "mAssetSupply": "135474446526761994321813972" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "516921260512963461120", + "1789041559451851554816", + "1455355511908650713088" + ], + "expectedQty": "3757526861672866195457", + "swapFee": "2255869638786991912", + "reserves": [ + "21182658577201189423229564", + "49374947981289300610378637", + "65046113610175042732829593" + ], + "mAssetSupply": "135470688999900321455618515" + }, + { + "type": "mintMulti", + "inputQtys": [ + "1190800294935810816", + "1905173708654546176", + "1584813087176065024" + ], + "expectedQty": "4684050431520195374", + "reserves": [ + "21182659768001484359040380", + "49374949886463009264924813", + "65046115194988129908894617" + ], + "mAssetSupply": "135470693683950752975813889" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "745145517714632559558656", + "965784627730978913124352", + "217452541264551066206208" + ], + "expectedQty": "1934461351252837871304585", + "swapFee": "1161373634932662320174", + "reserves": [ + "20437514250286851799481724", + "48409165258732030351800461", + "64828662653723578842688409" + ], + "mAssetSupply": "133536232332697915104509304" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "799421387008797084483584", + "expectedQty": "788828741864549261043349", + "swapFee": "479652832205278250690", + "reserves": [ + "19648685508422302538438375", + "48409165258732030351800461", + "64828662653723578842688409" + ], + "mAssetSupply": "132737290598521323298276410" + }, + { + "type": "mintMulti", + "inputQtys": [ + "11378861856670132224", + "12112046996843431936", + "9803055711921811456" + ], + "expectedQty": "33373631159408520490", + "reserves": [ + "19648696887284159208570599", + "48409177370779027195232397", + "64828672456779290764499865" + ], + "mAssetSupply": "132737323972152482706796900" + }, + { + "type": "mintMulti", + "inputQtys": [ + "467320423928300830720", + "601461417581350486016", + "100345916509838475264" + ], + "expectedQty": "1173625246085439521431", + "reserves": [ + "19649164207708087509401319", + "48409778832196608545718413", + "64828772802695800602975129" + ], + "mAssetSupply": "132738497597398568146318331" + }, + { + "type": "redeemMasset", + "inputQty": "1017568934467695411", + "expectedQtys": [ + "150584654294627387", + "370996431851591128", + "496826136605307115" + ], + "redemptionFee": "305270680340308", + "reserves": [ + "19649164057123433214773932", + "48409778461200176694127285", + "64828772305869663997668014" + ], + "mAssetSupply": "132738496580134904358963228" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "305802996113294590214144", + "expectedQty": "306256906104468279283475", + "swapFee": "183481797667976754128", + "reserves": [ + "19649164057123433214773932", + "48103521555095708414843810", + "64828772305869663997668014" + ], + "mAssetSupply": "132432877065819277745503212" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "11830889447641904", + "4264374677697508", + "7484804323892501" + ], + "expectedQty": "23692670994770864", + "swapFee": "14224137079109", + "reserves": [ + "19649164045292543767132028", + "48103521550831333737146302", + "64828772298384859673775513" + ], + "mAssetSupply": "132432877042126606750732348" + }, + { + "type": "mintMulti", + "inputQtys": [ + "9889607331143481344", + "16250262084431392768", + "4959240166682887168" + ], + "expectedQty": "31173341648691355981", + "reserves": [ + "19649173934899874910613372", + "48103537801093418168539070", + "64828777257625026356662681" + ], + "mAssetSupply": "132432908215468255442088329" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "1999577835263992325472256", + "expectedQty": "1995168800998397736621728", + "reserves": [ + "19649173934899874910613372", + "50103115636357410494011326", + "64828777257625026356662681" + ] + }, + { + "type": "redeemMasset", + "inputQty": "1144904666354366683073740", + "expectedQtys": [ + "167298993617547489558252", + "426593039017185274368043", + "551971763728604978111912" + ], + "redemptionFee": "343471399906310004922", + "reserves": [ + "19481874941282327421055120", + "49676522597340225219643283", + "64276805493896421378550769" + ], + "mAssetSupply": "133283515821512192805641239" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "50579561022601813819392", + "421307428272146208522240", + "371102376742102849552384" + ], + "expectedQty": "840953911994222182774630", + "swapFee": "504875272359949279232", + "reserves": [ + "19431295380259725607235728", + "49255215169068079011121043", + "63905703117154318528998385" + ], + "mAssetSupply": "132442561909517970622866609" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "30497722646894989017088", + "expectedQty": "30354508471507610323299", + "reserves": [ + "19431295380259725607235728", + "49255215169068079011121043", + "63936200839801213518015473" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "4585578277389101056", + "5383749889820048384", + "4823970964784685056" + ], + "expectedQty": "14820609822991901647", + "swapFee": "8897704516505044", + "reserves": [ + "19431290794681448218134672", + "49255209785318189191072659", + "63936196015830248733330417" + ], + "mAssetSupply": "132472901597379655241288261" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "2312758677184166494208", + "expectedQty": "2280320540669070902443", + "swapFee": "1387655206310499896", + "reserves": [ + "19429010474140779147232229", + "49255209785318189191072659", + "63936196015830248733330417" + ], + "mAssetSupply": "132470590226357677385293949" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "12971334045720784", + "25095931763419944", + "3130533958408616" + ], + "expectedQty": "41301642314351117", + "swapFee": "24795862906354", + "reserves": [ + "19429010461169445101511445", + "49255209760222257427652715", + "63936196012699714774921801" + ], + "mAssetSupply": "132470590185056035070942832" + }, + { + "type": "redeemMasset", + "inputQty": "281908171641037852665446", + "expectedQtys": [ + "41334107813734195394686", + "104787639838173015396041", + "136020597882261048845470" + ], + "redemptionFee": "84572451492311355799", + "reserves": [ + "19387676353355710906116759", + "49150422120384084412256674", + "63800175414817453726076331" + ], + "mAssetSupply": "132188766585866489529633185" + }, + { + "type": "redeemMasset", + "inputQty": "1841256683150360371", + "expectedQtys": [ + "269969833832999240", + "684410604490268240", + "888405729564040233" + ], + "redemptionFee": "552377004945108", + "reserves": [ + "19387676083385877073117519", + "49150421435973479921988434", + "63800174526411724162036098" + ], + "mAssetSupply": "132188764745162183384217922" + }, + { + "type": "redeemMasset", + "inputQty": "108782700644508977489510", + "expectedQtys": [ + "15950001912093393859429", + "40435445306194928478708", + "52487616427643690152371" + ], + "redemptionFee": "32634810193352693246", + "reserves": [ + "19371726081473783679258090", + "49109985990667284993509726", + "63747686909984080471883727" + ], + "mAssetSupply": "132080014679327867759421658" + }, + { + "type": "redeemMasset", + "inputQty": "15337192395777667891", + "expectedQtys": [ + "2248778956483336387", + "5700963485882723115", + "7400190166056393241" + ], + "redemptionFee": "4601157718733300", + "reserves": [ + "19371723832694827195921703", + "49109980289703799110786611", + "63747679509793914415490486" + ], + "mAssetSupply": "132079999346736629700487067" + }, + { + "type": "redeemMasset", + "inputQty": "365033466994481920", + "expectedQtys": [ + "53522154368705302", + "135686011674055089", + "176128524897275802" + ], + "redemptionFee": "109510040098344", + "reserves": [ + "19371723779172672827216401", + "49109980154017787436731522", + "63747679333665389518214684" + ], + "mAssetSupply": "132079998981812672746103491" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "4850464031566783840256", + "outputIndex": 2, + "expectedQty": "4859157116160047006155", + "swapFee": "2903540014263311484", + "reserves": [ + "19371723779172672827216401", + "49114830618049354220571778", + "63742820176549229471208529" + ], + "mAssetSupply": "132080001885352687009414975", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemMasset", + "inputQty": "81011520041653459799244", + "expectedQtys": [ + "11878119071370569590257", + "30115637250548422741726", + "39085050800489488751315" + ], + "redemptionFee": "24303456012496037939", + "reserves": [ + "19359845660101302257626144", + "49084714980798805797830052", + "63703735125748739982457214" + ], + "mAssetSupply": "131999014668767046045653670" + }, + { + "type": "redeemMasset", + "inputQty": "161792203676253002137", + "expectedQtys": [ + "23722392310351079088", + "60145462193224072130", + "78058731604567777113" + ], + "redemptionFee": "48537661102875900", + "reserves": [ + "19359821937708991906547056", + "49084654835336612573757922", + "63703657067017135414680101" + ], + "mAssetSupply": "131998852925101030895527433" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "465023403103903192973312", + "725245202575997351755776", + "583118384046358866690048" + ], + "expectedQty": "1775350388021390746126903", + "swapFee": "1065849742658429505379", + "reserves": [ + "18894798534605088713573744", + "48359409632760615222002146", + "63120538682970776547990053" + ], + "mAssetSupply": "130223502537079640149400530" + }, + { + "type": "redeemMasset", + "inputQty": "2656612179593333964", + "expectedQtys": [ + "385345902197111244", + "986255571898602141", + "1287298241439831392" + ], + "redemptionFee": "796983653878000", + "reserves": [ + "18894798149259186516462500", + "48359408646505043323400005", + "63120537395672535108158661" + ], + "mAssetSupply": "130223499881264444209944566" + }, + { + "type": "redeemMasset", + "inputQty": "699951525631257319833", + "expectedQtys": [ + "101529103197859209516", + "259853921289493044398", + "339171210220143622461" + ], + "redemptionFee": "209985457689377195", + "reserves": [ + "18894696620155988657252984", + "48359148792583753830355607", + "63120198224462314964536200" + ], + "mAssetSupply": "130222800139724270642001928" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "9704105913890336768", + "expectedQty": "9564490517717063449", + "swapFee": "5822463548334202", + "reserves": [ + "18894687055665470940189535", + "48359148792583753830355607", + "63120198224462314964536200" + ], + "mAssetSupply": "130222790441440820299999362" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "2242133822806907827519488", + "expectedQty": "2245665299128076566176466", + "swapFee": "1345280293684144696511", + "reserves": [ + "18894687055665470940189535", + "46113483493455677264179141", + "63120198224462314964536200" + ], + "mAssetSupply": "127982001898927596617176385" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "9403399769060489312600064", + "expectedQty": "9155834114471575343111308", + "swapFee": "5642039861436293587560", + "reserves": [ + "9738852941193895597078227", + "46113483493455677264179141", + "63120198224462314964536200" + ], + "mAssetSupply": "118584244169728543598163881" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "706852013233116125593600", + "381174535346383526821888", + "1408287906569225980870656" + ], + "expectedQty": "2518071825092425071530741", + "swapFee": "1511750145142540567258", + "reserves": [ + "9032000927960779471484627", + "45732308958109293737357253", + "61711910317893088983665544" + ], + "mAssetSupply": "116066172344636118526633140" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "3265957513804653789184", + "expectedQty": "3453168660214560661781", + "reserves": [ + "9035266885474584125273811", + "45732308958109293737357253", + "61711910317893088983665544" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "28803091558323486720", + "44200019919456681984", + "114225904180366360576" + ], + "expectedQty": "187417533427369920011", + "reserves": [ + "9035295688566142448760531", + "45732353158129213194039237", + "61712024543797269350026120" + ], + "mAssetSupply": "116069812930829760457214932" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "9992497720605", + "30121213064315", + "22315554303265" + ], + "expectedQty": "62580787538738", + "swapFee": "37571015132", + "reserves": [ + "9035295688556149951039926", + "45732353158099091980974922", + "61712024543774953795722855" + ], + "mAssetSupply": "116069812930767179669676194" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "9691500067990135635968", + "14945381420433842110464", + "24246090332812257263616" + ], + "expectedQty": "49093171624178555698235", + "swapFee": "29473587126783203340", + "reserves": [ + "9025604188488159815403958", + "45717407776678658138864458", + "61687778453442141538459239" + ], + "mAssetSupply": "116020719759143001113977959" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "116713310520619906891776", + "22685219169169997561856", + "36677596551782638551040" + ], + "expectedQty": "182328885267830303183009", + "swapFee": "109463008966077828606", + "reserves": [ + "8908890877967539908512182", + "45694722557509488141302602", + "61651100856890358899908199" + ], + "mAssetSupply": "115838390873875170810794950" + }, + { + "type": "mintMulti", + "inputQtys": [ + "1907454370384877191168", + "5066555737890393948160", + "14681326643237510709248" + ], + "expectedQty": "21580883379668876058351", + "reserves": [ + "8910798332337924785703350", + "45699789113247378535250762", + "61665782183533596410617447" + ], + "mAssetSupply": "115859971757254839686853301" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "8327022092419619356672", + "expectedQty": "7859470307328351154918", + "swapFee": "4996213255451771614", + "reserves": [ + "8902938862030596434548432", + "45699789113247378535250762", + "61665782183533596410617447" + ], + "mAssetSupply": "115851649731375675519268243" + }, + { + "type": "redeemMasset", + "inputQty": "38422788909376364924108", + "expectedQtys": [ + "2951819146638349946309", + "15152020539771604501080", + "20445634791236527873443" + ], + "redemptionFee": "11526836672812909477", + "reserves": [ + "8899987042883958084602123", + "45684637092707606930749682", + "61645336548742359882744004" + ], + "mAssetSupply": "115813238469302971967253612" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "3463334023410002944", + "1234737750499300352", + "217232883708201248" + ], + "expectedQty": "5109104285766440453", + "swapFee": "3067302953231803", + "reserves": [ + "8899983579549934674599179", + "45684635857969856431449330", + "61645336331509476174542756" + ], + "mAssetSupply": "115813233360198686200813159" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "126321890113872052224", + "outputIndex": 2, + "expectedQty": "135102186821036734041", + "swapFee": "80257622838248915", + "reserves": [ + "8900109901440048546651403", + "45684635857969856431449330", + "61645201229322655137808715" + ], + "mAssetSupply": "115813233440456309039062074", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemMasset", + "inputQty": "76568365472805522348441", + "expectedQtys": [ + "5882422995913964111749", + "30194722931162421741353", + "40743670956292179301792" + ], + "redemptionFee": "22970509641841656704", + "reserves": [ + "8894227478444134582539654", + "45654441135038694009707977", + "61604457558366362958506923" + ], + "mAssetSupply": "115736688045493145358370337" + }, + { + "type": "mintMulti", + "inputQtys": [ + "315772356149508416", + "61385685186671256", + "135187062723158192" + ], + "expectedQty": "529130395381076706", + "reserves": [ + "8894227794216490732048070", + "45654441196424379196379233", + "61604457693553425681665115" + ], + "mAssetSupply": "115736688574623540739447043" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "1320320733234134465380352", + "expectedQty": "1311636902557653345269686", + "reserves": [ + "8894227794216490732048070", + "46974761929658513661759585", + "61604457693553425681665115" + ] + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "528872135524678853722112", + "expectedQty": "496943869440479999490604", + "swapFee": "317323281314807312233", + "reserves": [ + "8397283924776010732557466", + "46974761929658513661759585", + "61604457693553425681665115" + ], + "mAssetSupply": "116519770664937830038306850" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "2534383417067518065377280", + "expectedQty": "2515283249035626313267132", + "reserves": [ + "8397283924776010732557466", + "49509145346726031727136865", + "61604457693553425681665115" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "55848698969601519648768", + "145944773748850235015168", + "29517412112512141230080" + ], + "expectedQty": "233769808282661928056849", + "swapFee": "140346092625172260190", + "reserves": [ + "8341435225806409212908698", + "49363200572977181492121697", + "61574940281440913540435035" + ], + "mAssetSupply": "118801284105690794423517133" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "1790749682753200711532544", + "expectedQty": "1770627785867922147452186", + "reserves": [ + "8341435225806409212908698", + "49363200572977181492121697", + "63365689964194114251967579" + ] + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "59657996486077407297536", + "expectedQty": "63995402381266514413899", + "reserves": [ + "8401093222292486620206234", + "49363200572977181492121697", + "63365689964194114251967579" + ] + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "108835873766831722332160", + "expectedQty": "109616150879987779644991", + "swapFee": "65301524260099033399", + "reserves": [ + "8401093222292486620206234", + "49253584422097193712476706", + "63365689964194114251967579" + ], + "mAssetSupply": "120527136721697411462084457" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "926365167212763392", + "expectedQty": "993136641960141067", + "reserves": [ + "8401094148657653832969626", + "49253584422097193712476706", + "63365689964194114251967579" + ] + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "391824287086878523392", + "expectedQty": "387375296425196864104", + "reserves": [ + "8401094148657653832969626", + "49253584422097193712476706", + "63366081788481201130490971" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "772332074139629360513024", + "927050291123414332604416", + "105198235875790435647488" + ], + "expectedQty": "1848038113401026997664355", + "reserves": [ + "9173426222797283193482650", + "50180634713220608045081122", + "63471280024356991566138459" + ], + "mAssetSupply": "122375563203531505616753983" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "1855230771861669239848960", + "858112682240713844326400", + "1493934130611543770923008" + ], + "expectedQty": "4322790942210119249377230", + "swapFee": "2595231704348680758081", + "reserves": [ + "7318195450935613953633690", + "49322522030979894200754722", + "61977345893745447795215451" + ], + "mAssetSupply": "118052772261321386367376753" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "4428235645568930545664", + "expectedQty": "4466338647131406723038", + "swapFee": "2656941387341358327", + "reserves": [ + "7318195450935613953633690", + "49318055692332762794031684", + "61977345893745447795215451" + ], + "mAssetSupply": "118048346682617204778189416" + }, + { + "type": "mintMulti", + "inputQtys": [ + "91160365178280", + "89680996145809", + "87751727051708" + ], + "expectedQty": "275047566702564", + "reserves": [ + "7318195451026774318811970", + "49318055692422443790177493", + "61977345893833199522267159" + ], + "mAssetSupply": "118048346682892252344891980" + }, + { + "type": "mintMulti", + "inputQtys": [ + "9684941884975120121856", + "6206608329848810110976", + "6242225020966344327168" + ], + "expectedQty": "22888046423830554057549", + "reserves": [ + "7327880392911749438933826", + "49324262300752292600288469", + "61983588118854165866594327" + ], + "mAssetSupply": "118071234729316082898949529" + }, + { + "type": "redeemMasset", + "inputQty": "1095802457083828428", + "expectedQtys": [ + "67988620474500841", + "457634182047294753", + "575088350559996288" + ], + "redemptionFee": "328740737125148", + "reserves": [ + "7327880324923128964432985", + "49324261843118110552993716", + "61983587543765815306598039" + ], + "mAssetSupply": "118071233633842366552246249" + }, + { + "type": "mintMulti", + "inputQtys": [ + "10144568795669145600", + "18123830972292167680", + "9529432894476836864" + ], + "expectedQty": "38442955467203240499", + "reserves": [ + "7327890469491924633578585", + "49324279966949082845161396", + "61983597073198709783434903" + ], + "mAssetSupply": "118071272076797833755486748" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "213266134795120199860224", + "179290418713836730187776", + "153444474824649179398144" + ], + "expectedQty": "562461199497840361440504", + "swapFee": "337679327295081265623", + "reserves": [ + "7114624334696804433718361", + "49144989548235246114973620", + "61830152598374060604036759" + ], + "mAssetSupply": "117508810877299993394046244" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "290828317784194678784", + "1035537832299292393472", + "624011220992585236480" + ], + "expectedQty": "1960634029670023392543", + "swapFee": "1177086669803896373", + "reserves": [ + "7114333506379020239039577", + "49143954010402946822580148", + "61829528587153068018800279" + ], + "mAssetSupply": "117506850243270323370653701" + }, + { + "type": "mintMulti", + "inputQtys": [ + "5138826851115353505792", + "4303270460473086050304", + "9538218738144589643776" + ], + "expectedQty": "19312060066373424411491", + "reserves": [ + "7119472333230135592545369", + "49148257280863419908630452", + "61839066805891212608444055" + ], + "mAssetSupply": "117526162303336696795065192" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "138467204905305210880", + "expectedQty": "139693818638586853466", + "swapFee": "83080322943183126", + "reserves": [ + "7119472333230135592545369", + "49148117587044781321776986", + "61839066805891212608444055" + ], + "mAssetSupply": "117526023919212114433037438" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "116874446333897472", + "expectedQty": "117909778038672989", + "swapFee": "70124667800338", + "reserves": [ + "7119472333230135592545369", + "49148117469135003283103997", + "61839066805891212608444055" + ], + "mAssetSupply": "117526023802407792766940304" + }, + { + "type": "redeemMasset", + "inputQty": "82056850361482841", + "expectedQtys": [ + "4969335271988049", + "34304996530603108", + "43163178601175584" + ], + "redemptionFee": "24617055108444", + "reserves": [ + "7119472328260800320557320", + "49148117434830006752500889", + "61839066762728034007268471" + ], + "mAssetSupply": "117526023720375559460565907" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "19390391737017861931008", + "expectedQty": "17667877738607921722181", + "swapFee": "11634235042210717158", + "reserves": [ + "7101804450522192398835139", + "49148117434830006752500889", + "61839066762728034007268471" + ], + "mAssetSupply": "117506644962873583809352057" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "49028799946616299520", + "expectedQty": "49464442276942984441", + "swapFee": "29417279967969779", + "reserves": [ + "7101804450522192398835139", + "49148067970387729809516448", + "61839066762728034007268471" + ], + "mAssetSupply": "117506595963490917161022316" + }, + { + "type": "redeemMasset", + "inputQty": "302375003600612019404", + "expectedQtys": [ + "18269305703661067151", + "126432807992805843785", + "159080248264835607922" + ], + "redemptionFee": "90712501080183605", + "reserves": [ + "7101786181216488737767988", + "49147941537579737003672663", + "61838907682479769171660549" + ], + "mAssetSupply": "117506293679199817629186517" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "22518270645651562823680", + "expectedQty": "22223384164515078839522", + "reserves": [ + "7101786181216488737767988", + "49147941537579737003672663", + "61861425953125420734484229" + ] + }, + { + "type": "redeemMasset", + "inputQty": "25518612015272521", + "expectedQtys": [ + "1541526791819872", + "10668142733353640", + "13427755082115042" + ], + "redemptionFee": "7655583604581", + "reserves": [ + "7101786179674961945948116", + "49147941526911594270319023", + "61861425939697665652369187" + ], + "mAssetSupply": "117528517037853376276358099" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "4578386124104617380806656", + "expectedQty": "4633649388389341196387271", + "swapFee": "2747031674462770428483", + "reserves": [ + "7101786179674961945948116", + "49147941526911594270319023", + "57227776551308324455981916" + ], + "mAssetSupply": "112952877945423221665979926" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "63865996097059266560", + "332322388929403879424", + "181668366833929289728" + ], + "expectedQty": "578167040824749827921", + "swapFee": "347108489588603058", + "reserves": [ + "7101722313678864886681556", + "49147609204522664866439599", + "57227594882941490526692188" + ], + "mAssetSupply": "112952299778382396916152005" + }, + { + "type": "redeemMasset", + "inputQty": "18393854049948470476", + "expectedQtys": [ + "1156141624244662791", + "8001100891260250369", + "9316501205931463510" + ], + "redemptionFee": "5518156214984541", + "reserves": [ + "7101721157537240642018765", + "49147601203421773606189230", + "57227585566440284595228678" + ], + "mAssetSupply": "112952281390046503182666070" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "88636916231749200", + "89651614929121696", + "102084842895982752" + ], + "expectedQty": "286160958126635678", + "swapFee": "171799654668782", + "reserves": [ + "7101721068900324410269565", + "49147601113770158677067534", + "57227585464355441699245926" + ], + "mAssetSupply": "112952281103885545056030392" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "6414439093165365395456", + "expectedQty": "5887623046428674314557", + "swapFee": "3848663455899219237", + "reserves": [ + "7095833445853895735955008", + "49147601113770158677067534", + "57227585464355441699245926" + ], + "mAssetSupply": "112945870513455835589854173" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "9825823066195283148800", + "expectedQty": "10698127958407774870179", + "reserves": [ + "7105659268920091019103808", + "49147601113770158677067534", + "57227585464355441699245926" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "9244260587133724672", + "12078219413306705920", + "10661035415253467136" + ], + "expectedQty": "32560032729144770622", + "swapFee": "19547748286458737", + "reserves": [ + "7105650024659503885379136", + "49147589035550745370361614", + "57227574803320026445778790" + ], + "mAssetSupply": "112956536081381514219953730" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "37686595456656979525632", + "expectedQty": "34583283159385644102138", + "swapFee": "22611957273994187715", + "reserves": [ + "7071066741500118241276998", + "49147589035550745370361614", + "57227574803320026445778790" + ], + "mAssetSupply": "112918872097882131234615813" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "52969663462473900032", + "expectedQty": "48588847371131648636", + "swapFee": "31781798077484340", + "reserves": [ + "7071018152652747109628362", + "49147589035550745370361614", + "57227574803320026445778790" + ], + "mAssetSupply": "112918819160000466838200121" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "2103228777078097405018112", + "outputIndex": 2, + "expectedQty": "2105651090002887903455116", + "swapFee": "1249421175829305291756", + "reserves": [ + "7071018152652747109628362", + "51250817812628842775379726", + "55121923713317138542323674" + ], + "mAssetSupply": "112920068581176296143491877", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mintMulti", + "inputQtys": [ + "526980627388614705152", + "1283008950365096771584", + "868657819461547589632" + ], + "expectedQty": "2702553325980865426257", + "reserves": [ + "7071545133280135724333514", + "51252100821579207872151310", + "55122792371136600089913306" + ], + "mAssetSupply": "112922771134502277008918134" + }, + { + "type": "redeemMasset", + "inputQty": "19321983740545440573030", + "expectedQtys": [ + "1209634583259099137375", + "8767010950223167396241", + "9429118349840593111038" + ], + "redemptionFee": "5796595122163632171", + "reserves": [ + "7070335498696876625196139", + "51243333810628984704755069", + "55113363252786759496802268" + ], + "mAssetSupply": "112903454947356853731977275" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "376926052357117218652160", + "outputIndex": 0, + "expectedQty": "340729982894580434545557", + "swapFee": "223822264744894118089", + "reserves": [ + "6729605515802296190650582", + "51620259862986101923407229", + "55113363252786759496802268" + ], + "mAssetSupply": "112903678769621598626095364", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "7267160734271997476864", + "expectedQty": "7180115901120457503861", + "reserves": [ + "6729605515802296190650582", + "51620259862986101923407229", + "55120630413521031494279132" + ] + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "632325609411173305810944", + "expectedQty": "689567905369519634276248", + "reserves": [ + "7361931125213469496461526", + "51620259862986101923407229", + "55120630413521031494279132" + ] + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "2257540710383148561596416", + "expectedQty": "2232316016481291365718742", + "reserves": [ + "7361931125213469496461526", + "51620259862986101923407229", + "57378171123904180055875548" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "273152383832990941184", + "173427034735041019904", + "12217291529809393664" + ], + "expectedQty": "480583995807612019202", + "reserves": [ + "7362204277597302487402710", + "51620433290020836964427133", + "57378183341195709865269212" + ], + "mAssetSupply": "115833223391369337695613417" + }, + { + "type": "redeemMasset", + "inputQty": "46517603691977581474611", + "expectedQtys": [ + "2955709503978957352281", + "20724092883309680725487", + "23035660982496803364681" + ], + "redemptionFee": "13955281107593274442", + "reserves": [ + "7359248568093323530050429", + "51599709197137527283701646", + "57355147680213213061904531" + ], + "mAssetSupply": "115786719742958467707413248" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "16309133984390815744", + "16394598335190202368", + "11790555914971801600" + ], + "expectedQty": "45609079467822882334", + "swapFee": "27381876806777796", + "reserves": [ + "7359232258959339139234685", + "51599692802539192093499278", + "57355135889657298090102931" + ], + "mAssetSupply": "115786674133878999884530914" + }, + { + "type": "mintMulti", + "inputQtys": [ + "355913093964442160332800", + "889807711002925658537984", + "15896057637220351213568" + ], + "expectedQty": "1282443581194889726632921", + "reserves": [ + "7715145352923781299567485", + "52489500513542117752037262", + "57371031947294518441316499" + ], + "mAssetSupply": "117069117715073889611163835" + }, + { + "type": "mintMulti", + "inputQtys": [ + "224670373413288542208", + "60499780419279364096", + "85781367241571270656" + ], + "expectedQty": "387440054787551069545", + "reserves": [ + "7715370023297194588109693", + "52489561013322537031401358", + "57371117728661760012587155" + ], + "mAssetSupply": "117069505155128677162233380" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "391395132833991984414720", + "outputIndex": 1, + "expectedQty": "390599203800677472079523", + "swapFee": "232274980340242905574", + "reserves": [ + "7715370023297194588109693", + "52098961809521859559321835", + "57762512861495751997001875" + ], + "mAssetSupply": "117069737430109017405138954", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "59622560056028879126528", + "expectedQty": "60247248488059824656911", + "swapFee": "35773536033617327475", + "reserves": [ + "7715370023297194588109693", + "52098961809521859559321835", + "57702265613007692172344964" + ], + "mAssetSupply": "117010150643589022143339901" + }, + { + "type": "redeemMasset", + "inputQty": "279442526274634488217", + "expectedQtys": [ + "18420245404792231684", + "124384917245507523867", + "137762659444021772573" + ], + "redemptionFee": "83832757882390346", + "reserves": [ + "7715351603051789795878009", + "52098837424604614051797968", + "57702127850348248150572391" + ], + "mAssetSupply": "117009871284895505391242030" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "35519385352912322428928", + "expectedQty": "35130105070801767892632", + "reserves": [ + "7715351603051789795878009", + "52098837424604614051797968", + "57737647235701160473001319" + ] + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "49246336582472194588672", + "expectedQty": "53167559225923280061605", + "reserves": [ + "7764597939634261990466681", + "52098837424604614051797968", + "57737647235701160473001319" + ] + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "4186754257489687675404288", + "expectedQty": "4139139086895323310332058", + "reserves": [ + "7764597939634261990466681", + "52098837424604614051797968", + "61924401493190848148405607" + ] + }, + { + "type": "redeemMasset", + "inputQty": "3731367812377538566553", + "expectedQtys": [ + "238902360386741978602", + "1602985155304698807415", + "1905299642978864094194" + ], + "redemptionFee": "1119410343713261569", + "reserves": [ + "7764359037273875248488079", + "52097234439449309352990553", + "61922496193547869284311413" + ], + "mAssetSupply": "121233577787685519924223341" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "2236927869326925312", + "expectedQty": "2428212291706815564", + "reserves": [ + "7764361274201744575413391", + "52097234439449309352990553", + "61922496193547869284311413" + ] + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "132548550358214801096704", + "expectedQty": "133699754852846049554824", + "swapFee": "79529130214928880658", + "reserves": [ + "7764361274201744575413391", + "51963534684596463303435729", + "61922496193547869284311413" + ], + "mAssetSupply": "121101111194669811758822859" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "1130080676566809444352", + "expectedQty": "1119696421367855721171", + "reserves": [ + "7764361274201744575413391", + "51964664765273030112880081", + "61922496193547869284311413" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "211331624224394149888", + "19944107368170156032", + "88144782641646256128" + ], + "expectedQty": "336225448281869757672", + "reserves": [ + "7764572605825968969563279", + "51964684709380398283036113", + "61922584338330510930567541" + ], + "mAssetSupply": "121102567116539461484301702" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "36041487719727003336704", + "expectedQty": "36451992396074967575394", + "swapFee": "21624892631836202002", + "reserves": [ + "7764572605825968969563279", + "51964684709380398283036113", + "61886132345934435962992147" + ], + "mAssetSupply": "121066547253712366317167000" + }, + { + "type": "redeemMasset", + "inputQty": "2722809452458978099", + "expectedQtys": [ + "174574312470064015", + "1168344938787357081", + "1391413224420950589" + ], + "redemptionFee": "816842835737693", + "reserves": [ + "7764572431251656499499264", + "51964683541035459495679032", + "61886130954521211542041558" + ], + "mAssetSupply": "121066544531719756693926594" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "104251243787701780480", + "172036451075547561984", + "120363825233156915200" + ], + "expectedQty": "402534005117457549249", + "swapFee": "241665402311861646", + "reserves": [ + "7764468180007868797718784", + "51964511504584383948117048", + "61886010590695978385126358" + ], + "mAssetSupply": "121066141997714639236377345" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "126139908849676468224", + "expectedQty": "116158646770022572617", + "swapFee": "75683945309805880", + "reserves": [ + "7764352021361098775146167", + "51964511504584383948117048", + "61886010590695978385126358" + ], + "mAssetSupply": "121066015933489734869715001" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "132093768922711588864", + "45506532347786485760", + "441971004907883790336" + ], + "expectedQty": "625180067839941029033", + "swapFee": "375333240648353629", + "reserves": [ + "7764219927592176063557303", + "51964465998052036161631288", + "61885568619691070501336022" + ], + "mAssetSupply": "121065390753421894928685968" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "148288301184321060864", + "expectedQty": "146530933470212424143", + "reserves": [ + "7764219927592176063557303", + "51964465998052036161631288", + "61885716907992254822396886" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "4850219514044738560", + "569650519328084032", + "473343657038437376" + ], + "expectedQty": "6295994849919671304", + "swapFee": "3779864828849112", + "reserves": [ + "7764215077372662018818743", + "51964465428401516833547256", + "61885716434648597783959510" + ], + "mAssetSupply": "121065530988360515221438807" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "7168061670595701724151808", + "hardLimitError": true + }, + { + "type": "redeemBassets", + "inputQtys": [ + "2343645394231416548491264", + "1114109423205339872886784", + "411948755645964245532672" + ], + "hardLimitError": true + }, + { + "type": "redeemMasset", + "inputQty": "273987926673430885171", + "expectedQtys": [ + "17566213798236265346", + "117567442494811402825", + "140013860398612855953" + ], + "redemptionFee": "82196378002029265", + "reserves": [ + "7764197511158863782553397", + "51964347860959022022144431", + "61885576420788199171103557" + ], + "mAssetSupply": "121065257082630219792582901" + }, + { + "type": "redeemMasset", + "inputQty": "17564704987342697", + "expectedQtys": [ + "1126127588382267", + "7536965108681885", + "8975950808854024" + ], + "redemptionFee": "5269411496202", + "reserves": [ + "7764197510032736194171130", + "51964347853422056913462546", + "61885576411812248362249533" + ], + "mAssetSupply": "121065257065070784216736406" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "100906676762138665549824", + "51712380062731534860288", + "61911492579319986782208" + ], + "expectedQty": "222021264158081514926558", + "swapFee": "133292734135330107020", + "reserves": [ + "7663290833270597528621306", + "51912635473359325378602258", + "61823664919232928375467325" + ], + "mAssetSupply": "120843235800912702701809848" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "51793517018537426944", + "expectedQty": "52249224839551603473", + "swapFee": "31076110211122456", + "reserves": [ + "7663290833270597528621306", + "51912583224134485826998785", + "61823664919232928375467325" + ], + "mAssetSupply": "120843184038471794375505360" + }, + { + "type": "redeemMasset", + "inputQty": "26735968254011552563", + "expectedQtys": [ + "1694957282193429386", + "11481961586425440264", + "13674082498839194776" + ], + "redemptionFee": "8020790476203465", + "reserves": [ + "7663289138313315335191920", + "51912571742172899401558521", + "61823651245150429536272549" + ], + "mAssetSupply": "120843157310524330840156262" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "1714788754527692370477056", + "1426374799982758127992832", + "1352532831039972301602816" + ], + "expectedQty": "4647262233498542118313844", + "swapFee": "2790031358914473955361", + "reserves": [ + "5948500383785622964714864", + "50486196942190141273565689", + "60471118414110457234669733" + ], + "mAssetSupply": "116195895077025788721842418" + }, + { + "type": "mintMulti", + "inputQtys": [ + "308476435359815184678912", + "90204847468568220008448", + "81481539886240589938688" + ], + "expectedQty": "518014478281786499694999", + "reserves": [ + "6256976819145438149393776", + "50576401789658709493574137", + "60552599953996697824608421" + ], + "mAssetSupply": "116713909555307575221537417" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "119215717839585872445440", + "outputIndex": 1, + "expectedQty": "135141068101653466668411", + "swapFee": "80235733710960409427", + "reserves": [ + "6376192536985024021839216", + "50441260721557056026905726", + "60552599953996697824608421" + ], + "mAssetSupply": "116713989791041286181946844", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "107316943982506811588608", + "expectedQty": "108794935630568513754181", + "swapFee": "64390166389504086953", + "reserves": [ + "6376192536985024021839216", + "50441260721557056026905726", + "60443805018366129310854240" + ], + "mAssetSupply": "116606737237225168874445189" + }, + { + "type": "mintMulti", + "inputQtys": [ + "5441138275122361344", + "14872554671041671168", + "12331923524564355072" + ], + "expectedQty": "32954157938463230914", + "reserves": [ + "6376197978123299144200560", + "50441275594111727068576894", + "60443817350289653875209312" + ], + "mAssetSupply": "116606770191383107337676103" + }, + { + "type": "mintMulti", + "inputQtys": [ + "61564205801848073879552", + "18071324009074062786560", + "232897553473838153465856" + ], + "expectedQty": "316319990522483806969622", + "reserves": [ + "6437762183925147218080112", + "50459346918120801131363454", + "60676714903763492028675168" + ], + "mAssetSupply": "116923090181905591144645725" + }, + { + "type": "redeemMasset", + "inputQty": "3150636313104063502745", + "expectedQtys": [ + "173421369261305292925", + "1359281188799110918709", + "1634518126059883517811" + ], + "redemptionFee": "945190893931219050", + "reserves": [ + "6437588762555885912787187", + "50457987636932002020444745", + "60675080385637432145157357" + ], + "mAssetSupply": "116919940490783381012362030" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "95641733067129470976", + "expectedQty": "106864693084934037396", + "reserves": [ + "6437684404288953042258163", + "50457987636932002020444745", + "60675080385637432145157357" + ] + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "9112381772147640500224", + "expectedQty": "9237022297220854514560", + "swapFee": "5467429063288584300", + "reserves": [ + "6437684404288953042258163", + "50457987636932002020444745", + "60665843363340211290642797" + ], + "mAssetSupply": "116910940441133381594483502" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "225644035471565039599616", + "expectedQty": "223170825961205892162516", + "reserves": [ + "6437684404288953042258163", + "50683631672403567060044361", + "60665843363340211290642797" + ] + }, + { + "type": "redeemMasset", + "inputQty": "67367682695646654811340", + "expectedQtys": [ + "3701413431055543644152", + "29141079808435776359478", + "34880455972923841272677" + ], + "redemptionFee": "20210304808693996443", + "reserves": [ + "6433982990857897498614011", + "50654490592595131283684883", + "60630962907367287449370120" + ], + "mAssetSupply": "117066763794703749525831121" + }, + { + "type": "mintMulti", + "inputQtys": [ + "46223712149650318295040", + "185249381896594969853952", + "533634224253813332639744" + ], + "expectedQty": "760995920735768496388470", + "reserves": [ + "6480206703007547816909051", + "50839739974491726253538835", + "61164597131621100782009864" + ], + "mAssetSupply": "117827759715439518022219591" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "11219346637068750028800", + "expectedQty": "11336597957387292015384", + "swapFee": "6731607982241250017", + "reserves": [ + "6480206703007547816909051", + "50828403376534338961523451", + "61164597131621100782009864" + ], + "mAssetSupply": "117816547100410431513440808" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "9587027131310022852608", + "6619619476611344105472", + "27462130631760972611584" + ], + "expectedQty": "44337450943204419241763", + "swapFee": "26618441630901192260", + "reserves": [ + "6470619675876237794056443", + "50821783757057727617417979", + "61137135000989339809398280" + ], + "mAssetSupply": "117772209649467227094199045" + }, + { + "type": "mintMulti", + "inputQtys": [ + "3212647299670", + "6563221912600", + "8820909694455" + ], + "expectedQty": "18779004193912", + "reserves": [ + "6470619675879450441356113", + "50821783757064290839330579", + "61137135000998160719092735" + ], + "mAssetSupply": "117772209649486006098392957" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "4171138173486715371520", + "10550780994530796634112", + "3328089633645413793792" + ], + "expectedQty": "18379330162771018932876", + "swapFee": "11034218628839915308", + "reserves": [ + "6466448537705963725984593", + "50811232976069760042696467", + "61133806911364515305298943" + ], + "mAssetSupply": "117753830319323235079460081" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "15661549421094934413312", + "expectedQty": "15825513003600010773679", + "swapFee": "9396929652656960647", + "reserves": [ + "6466448537705963725984593", + "50795407463066160031922788", + "61133806911364515305298943" + ], + "mAssetSupply": "117738178166831792802007416" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "5371176480322747392", + "expectedQty": "5427395892391031452", + "swapFee": "3222705888193648", + "reserves": [ + "6466448537705963725984593", + "50795402035670267640891336", + "61133806911364515305298943" + ], + "mAssetSupply": "117738172798878018367453672" + }, + { + "type": "mintMulti", + "inputQtys": [ + "545558315770978697216", + "142631066933801598976", + "204122880962538504192" + ], + "expectedQty": "952216881724964472117", + "reserves": [ + "6466994096021734704681809", + "50795544666737201442490312", + "61134011034245477843803135" + ], + "mAssetSupply": "117739125015759743331925789" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "6217832172787581952", + "expectedQty": "6149739102188833812", + "reserves": [ + "6466994096021734704681809", + "50795550884569374230072264", + "61134011034245477843803135" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "347800104147904714768384", + "80061777241168397991936", + "411242285630187726962688" + ], + "expectedQty": "871726398377183033538711", + "reserves": [ + "6814794200169639419450193", + "50875612661810542628064200", + "61545253319875665570765823" + ], + "mAssetSupply": "118610857563876028554298312" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "146563440408940691587072", + "expectedQty": "148477369975333332410981", + "swapFee": "87938064245364414952", + "reserves": [ + "6814794200169639419450193", + "50875612661810542628064200", + "61396775949900332238354842" + ], + "mAssetSupply": "118464382061531333227126192" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "1858763762404799272714240", + "expectedQty": "1882539261219486734938796", + "swapFee": "1115258257442879563628", + "reserves": [ + "6814794200169639419450193", + "50875612661810542628064200", + "59514236688680845503416046" + ], + "mAssetSupply": "116606733557383976833975580" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "1166413603072618790912", + "1490387777985798471680", + "1345921403782494683136" + ], + "expectedQty": "4090385038409317375522", + "swapFee": "2455704445713018236", + "reserves": [ + "6813627786566566800659281", + "50874122274032556829592520", + "59512890767277063008732910" + ], + "mAssetSupply": "116602643172345567516600058" + }, + { + "type": "mintMulti", + "inputQtys": [ + "5296195803827262193664", + "1340289742104170070016", + "1783223073806694219776" + ], + "expectedQty": "8930193682255538543742", + "reserves": [ + "6818923982370394062852945", + "50875462563774660999662536", + "59514673990350869702952686" + ], + "mAssetSupply": "116611573366027823055143800" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "2337763832518252429312", + "expectedQty": "2313410768674311493439", + "reserves": [ + "6818923982370394062852945", + "50877800327607179252091848", + "59514673990350869702952686" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "23403955749524092", + "47872901330252880", + "56062048730076360" + ], + "expectedQty": "128531089945673273", + "reserves": [ + "6818924005774349812377037", + "50877800375480080582344728", + "59514674046412918433029046" + ], + "mAssetSupply": "116613886905327587312310512" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "507760380869457368580096", + "85877534043383468654592", + "451553275593567095488512" + ], + "expectedQty": "1094475435108243183051415", + "swapFee": "657079508770208034651", + "reserves": [ + "6311163624904892443796941", + "50791922841436697113690136", + "59063120770819351337540534" + ], + "mAssetSupply": "115519411470219344129259097" + }, + { + "type": "redeemMasset", + "inputQty": "7774539199592078612889", + "expectedQtys": [ + "424618412229437993194", + "3417307316499179930848", + "3973797868914988083439" + ], + "redemptionFee": "2332361759877623583", + "reserves": [ + "6310739006492663005803747", + "50788505534120197933759288", + "59059146972950436349457095" + ], + "mAssetSupply": "115511639263381511928269791" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "50206408774690791227392", + "outputIndex": 2, + "expectedQty": "56883521176225367893601", + "swapFee": "33679384279652739180", + "reserves": [ + "6360945415267353797031139", + "50788505534120197933759288", + "59002263451774210981563494" + ], + "mAssetSupply": "115511672942765791581008971", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "421759917350348440731648", + "outputIndex": 2, + "expectedQty": "473924820271790353894676", + "swapFee": "280868499288980691256", + "reserves": [ + "6782705332617702237762787", + "50788505534120197933759288", + "58528338631502420627668818" + ], + "mAssetSupply": "115511953811265080561700227", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mintMulti", + "inputQtys": [ + "13007906674371941367808", + "119804024075818520018944", + "19091159701508522508288" + ], + "expectedQty": "151731533391079172608079", + "reserves": [ + "6795713239292074179130595", + "50908309558196016453778232", + "58547429791203929150177106" + ], + "mAssetSupply": "115663685344656159734308306" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "138597234034116118183936", + "expectedQty": "140302839205220262655217", + "swapFee": "83158340420469670910", + "reserves": [ + "6795713239292074179130595", + "50908309558196016453778232", + "58407126951998708887521889" + ], + "mAssetSupply": "115525171268962464085795280" + }, + { + "type": "mintMulti", + "inputQtys": [ + "6063680146911108530176", + "707486662349768097792", + "7755545303662273232896" + ], + "expectedQty": "15038040815094400838184", + "reserves": [ + "6801776919438985287660771", + "50909017044858366221876024", + "58414882497302371160754785" + ], + "mAssetSupply": "115540209309777558486633464" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "695492959557238113959936", + "outputIndex": 1, + "expectedQty": "693365786376135249837656", + "swapFee": "411949794529086795760", + "reserves": [ + "6801776919438985287660771", + "50215651258482230972038368", + "59110375456859609274714721" + ], + "mAssetSupply": "115540621259572087573429224", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "1338720761204586546462720", + "expectedQty": "1321183195184081983629664", + "reserves": [ + "6801776919438985287660771", + "50215651258482230972038368", + "60449096218064195821177441" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "1153099247346235067072512", + "1511408512756861171138560", + "600402573602120552939520" + ], + "hardLimitError": true + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "34312332176097628160", + "expectedQty": "33856912295469297483", + "reserves": [ + "6801776919438985287660771", + "50215651258482230972038368", + "60449130530396371918805601" + ] + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "1624841116862600821342208", + "expectedQty": "1607861199732946547293505", + "reserves": [ + "6801776919438985287660771", + "51840492375344831793380576", + "60449130530396371918805601" + ] + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "12588998729895384186880", + "expectedQty": "13937532771501882942103", + "reserves": [ + "6814365918168880671847651", + "51840492375344831793380576", + "60449130530396371918805601" + ] + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "1965869553804824637603840", + "expectedQty": "1939458098428060161498970", + "reserves": [ + "6814365918168880671847651", + "51840492375344831793380576", + "62415000084201196556409441" + ] + }, + { + "type": "redeemMasset", + "inputQty": "1380978726676857", + "expectedQtys": [ + "78121818819986", + "594314071407232", + "715543219542532" + ], + "redemptionFee": "414293618003", + "reserves": [ + "6814365918090758853027665", + "51840492374750517721973344", + "62415000083485653336866909" + ], + "mAssetSupply": "120423095141220409185032095" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "194574137121524359888896", + "expectedQty": "196529923010787946198514", + "swapFee": "116744482272914615933", + "reserves": [ + "6814365918090758853027665", + "51643962451739729775774830", + "62415000083485653336866909" + ], + "mAssetSupply": "120228637748581157739759132" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "105747732934667452416", + "116520012193989951488", + "101130228877722058752" + ], + "expectedQty": "332477181565043324197", + "swapFee": "199606072582575539", + "reserves": [ + "6814260170357824185575249", + "51643845931727535785823342", + "62414898953256775614808157" + ], + "mAssetSupply": "120228305271399592696434935" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "714283771103905054720", + "expectedQty": "721443940957710591514", + "swapFee": "428570262662343032", + "reserves": [ + "6814260170357824185575249", + "51643124487786578075231828", + "62414898953256775614808157" + ], + "mAssetSupply": "120227591416198751453723247" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "146547445821528594186240", + "expectedQty": "145003018609799873167028", + "reserves": [ + "6814260170357824185575249", + "51789671933608106669418068", + "62414898953256775614808157" + ] + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "1585109641040286671962112", + "expectedQty": "1563089794182939974898066", + "reserves": [ + "6814260170357824185575249", + "51789671933608106669418068", + "64000008594297062286770269" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "8345013174678310617088", + "2393962711214289584128", + "1775634057698333163520" + ], + "expectedQty": "13417426756999103837231", + "swapFee": "8055289227736103964", + "reserves": [ + "6805915157183145874958161", + "51787277970896892379833940", + "63998232960239363953606749" + ], + "mAssetSupply": "121922266802234492197951110" + }, + { + "type": "redeemMasset", + "inputQty": "15687027002458505216000", + "expectedQtys": [ + "875414707043187715540", + "6661168076068166940279", + "8231809104913589366475" + ], + "redemptionFee": "4706108100737551564", + "reserves": [ + "6805039742476102687242621", + "51780616802820824212893661", + "63990001151134450364240274" + ], + "mAssetSupply": "121906584481340134430286674" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "2288329896500832501760", + "4288879536409030426624", + "2190625367481368444928" + ], + "expectedQty": "8953545517931470024656", + "swapFee": "5375352522272245362", + "reserves": [ + "6802751412579601854740861", + "51776327923284415182467037", + "63987810525766968995795346" + ], + "mAssetSupply": "121897630935822202960262018" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "24434307939166614192128", + "81562871055349805219840", + "13865598931787686346752" + ], + "expectedQty": "121611514519290887276407", + "swapFee": "73010715140658927722", + "reserves": [ + "6778317104640435240548733", + "51694765052229065377247197", + "63973944926835181309448594" + ], + "mAssetSupply": "121776019421302912072985611" + }, + { + "type": "redeemMasset", + "inputQty": "13804212327515936102809", + "expectedQtys": [ + "768141857334887218585", + "5858225903082217033530", + "7249744164889688249429" + ], + "redemptionFee": "4141263698254780830", + "reserves": [ + "6777548962783100353330148", + "51688906826325983160213667", + "63966695182670291621199165" + ], + "mAssetSupply": "121762219350239094391663632" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "629331567016857057624064", + "55591251116410166837248", + "647390852201470383620096" + ], + "expectedQty": "1401188513553026055705094", + "swapFee": "841217838835116703445", + "reserves": [ + "6148217395766243295706084", + "51633315575209572993376419", + "63319304330468821237579069" + ], + "mAssetSupply": "120361030836686068335958538" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "15989474577782", + "expectedQty": "18184342535221", + "reserves": [ + "6148217395782232770283866", + "51633315575209572993376419", + "63319304330468821237579069" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "626919289879530930438144", + "673643287617768544796672", + "49901665192505287639040" + ], + "expectedQty": "1420904523592023368860142", + "reserves": [ + "6775136685661763700722010", + "52306958862827341538173091", + "63369205995661326525218109" + ], + "mAssetSupply": "121781935360296276047353901" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "33361730016299", + "expectedQty": "32894881114529", + "reserves": [ + "6775136685661763700722010", + "52306958862827341538173091", + "63369205995694688255234408" + ] + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "457000279884811112284160", + "expectedQty": "461650118719940380214571", + "swapFee": "274200167930886667370", + "reserves": [ + "6775136685661763700722010", + "51845308744107401157958520", + "63369205995694688255234408" + ], + "mAssetSupply": "121325209280612290702851640" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "143775931540082188615680", + "375186854880197088378880", + "182939017600228713824256" + ], + "expectedQty": "711984700748403782264779", + "swapFee": "427447288822335670761", + "reserves": [ + "6631360754121681512106330", + "51470121889227204069579640", + "63186266978094459541410152" + ], + "mAssetSupply": "120613224579863886920586861" + }, + { + "type": "redeemMasset", + "inputQty": "4538973664053", + "expectedQtys": [ + "249479624253", + "1936366779811", + "2377141996671" + ], + "redemptionFee": "1361692099", + "reserves": [ + "6631360754121432032482077", + "51470121889225267702799829", + "63186266978092082399413481" + ], + "mAssetSupply": "120613224579859349308614907" + }, + { + "type": "redeemMasset", + "inputQty": "360890700495184199680", + "expectedQtys": [ + "19835954781879931998", + "153959202080506406075", + "189004938968861959829" + ], + "redemptionFee": "108267210148555259", + "reserves": [ + "6631340918166650152550079", + "51469967930023187196393754", + "63186077973153113537453652" + ], + "mAssetSupply": "120612863797426064272970486" + }, + { + "type": "redeemMasset", + "inputQty": "24388924690143775948", + "expectedQtys": [ + "1340510039933330450", + "10404533504864317889", + "12772917717890341645" + ], + "redemptionFee": "7316677407043132", + "reserves": [ + "6631339577656610219219629", + "51469957525489682332075865", + "63186065200235395647112007" + ], + "mAssetSupply": "120612839415818051536237670" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "196931915172127768576", + "expectedQty": "194813247164110943515", + "reserves": [ + "6631339577656610219219629", + "51470154457404854459844441", + "63186065200235395647112007" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "9067694649845090353152", + "16404546006815279677440", + "14531476070693330747392" + ], + "expectedQty": "40687932367357543936240", + "reserves": [ + "6640407272306455309572781", + "51486559003411669739521881", + "63200596676306088977859399" + ], + "mAssetSupply": "120653722161432573191117425" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "29293007125060681728", + "16296091423764043776", + "17944519350590676992" + ], + "expectedQty": "66549192147676274074", + "swapFee": "39953487381034385", + "reserves": [ + "6640377979299330248891053", + "51486542707320245975478105", + "63200578731786738387182407" + ], + "mAssetSupply": "120653655612240425514843351" + }, + { + "type": "mintMulti", + "inputQtys": [ + "116445815626588311519232", + "565924513167070640209920", + "437099402159722208428032" + ], + "expectedQty": "1120787805027244952787442", + "reserves": [ + "6756823794925918560410285", + "52052467220487316615688025", + "63637678133946460595610439" + ], + "mAssetSupply": "121774443417267670467630793" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "63331981197347139878912", + "expectedQty": "56684336374931570946380", + "swapFee": "37999188718408283927", + "reserves": [ + "6700139458550986989463905", + "52052467220487316615688025", + "63637678133946460595610439" + ], + "mAssetSupply": "121711149435259041736035808" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "1454336272160067944448", + "6770694890580703444992", + "209850556981786148864" + ], + "expectedQty": "8529908016085688043788", + "swapFee": "5121017420103474911", + "reserves": [ + "6698685122278826921519457", + "52045696525596735912243033", + "63637468283389478809461575" + ], + "mAssetSupply": "121702619527242956047992020" + }, + { + "type": "mintMulti", + "inputQtys": [ + "41764588953439471403008", + "35272909923844299423744", + "66739088761725986537472" + ], + "expectedQty": "147336112928567224123313", + "reserves": [ + "6740449711232266392922465", + "52080969435520580211666777", + "63704207372151204795999047" + ], + "mAssetSupply": "121849955640171523272115333" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "303534612154693036539904", + "outputIndex": 0, + "expectedQty": "266594124492741222754068", + "swapFee": "179534427278687348502", + "reserves": [ + "6473855586739525170168397", + "52080969435520580211666777", + "64007741984305897832538951" + ], + "mAssetSupply": "121850135174598801959463835", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mintMulti", + "inputQtys": [ + "7253021450183248885841920", + "1810574385771035079213056", + "1358556598542782504632320" + ], + "expectedQty": "10843565648548569471096243", + "reserves": [ + "13726877036922774056010317", + "53891543821291615290879833", + "65366298582848680337171271" + ], + "mAssetSupply": "132693700823147371430560078" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "4379353032450458517504", + "expectedQty": "4247451899978031521625", + "swapFee": "2627611819470275110", + "reserves": [ + "13722629585022796024488692", + "53891543821291615290879833", + "65366298582848680337171271" + ], + "mAssetSupply": "132689324097726740442317684" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "606087922714410876928", + "outputIndex": 0, + "expectedQty": "583771336993930460645", + "swapFee": "361143784942742443", + "reserves": [ + "13722045813685802094028047", + "53891543821291615290879833", + "65366904670771394748048199" + ], + "mAssetSupply": "132689324458870525385060127", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "2403348867657514352640", + "outputIndex": 2, + "expectedQty": "2492218862985836380638", + "swapFee": "1485907739373862051", + "reserves": [ + "13724449162553459608380687", + "53891543821291615290879833", + "65364412451908408911667561" + ], + "mAssetSupply": "132689325944778264758922178", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemMasset", + "inputQty": "43412791865383358090444", + "expectedQtys": [ + "4488966280621310032959", + "17626741893908883881347", + "21379265570076215970899" + ], + "redemptionFee": "13023837559615007427", + "reserves": [ + "13719960196272838298347728", + "53873917079397706406998486", + "65343033186338332695696662" + ], + "mAssetSupply": "132645926176750441015839161" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "95578058764375056", + "expectedQty": "94918757697621859", + "reserves": [ + "13719960196272838298347728", + "53873917079397706406998486", + "65343033281916391460071718" + ] + }, + { + "type": "redeemMasset", + "inputQty": "22782661658049925401804", + "expectedQtys": [ + "2355771087234686722410", + "9250363295237670802492", + "11219655622584821201489" + ], + "redemptionFee": "6834798497414977620", + "reserves": [ + "13717604425185603611625318", + "53864666716102468736195994", + "65331813626293806638870229" + ], + "mAssetSupply": "132623150444809646203036836" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "3556866418500361762373632", + "outputIndex": 1, + "expectedQty": "3544705905280880952065505", + "swapFee": "2118846987803804185491", + "reserves": [ + "13717604425185603611625318", + "50319960810821587784130489", + "68888680044794168401243861" + ], + "mAssetSupply": "132625269291797450007222327", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemMasset", + "inputQty": "78253369787309302480896", + "expectedQtys": [ + "8091419853689569523240", + "29681562270013765823208", + "40634444333845419086791" + ], + "redemptionFee": "23476010936192790744", + "reserves": [ + "13709513005331914042102078", + "50290279248551574018307281", + "68848045600460322982157070" + ], + "mAssetSupply": "132547039398021076897532175" + }, + { + "type": "redeemMasset", + "inputQty": "6661439415812921858457", + "expectedQtys": [ + "688794658808421159252", + "2526689002221611788809", + "3459070067664126755001" + ], + "redemptionFee": "1998431824743876557", + "reserves": [ + "13708824210673105620942826", + "50287752559549352406518472", + "68844586530392658855402069" + ], + "mAssetSupply": "132540379957037088719550275" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "4453858791790568538112", + "expectedQty": "4591212188414298980986", + "reserves": [ + "13713278069464896189480938", + "50287752559549352406518472", + "68844586530392658855402069" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "949035114809972947419136", + "349549746862704109289472", + "714869420305746803818496" + ], + "expectedQty": "2037530536459589033708251", + "swapFee": "1223252273239697238568", + "reserves": [ + "12764242954654923242061802", + "49938202812686648297229000", + "68129717110086912051583573" + ], + "mAssetSupply": "130507440632765913984823010" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "982945512637703475167232", + "expectedQty": "1014823174089582731308421", + "reserves": [ + "13747188467292626717229034", + "49938202812686648297229000", + "68129717110086912051583573" + ] + }, + { + "type": "redeemMasset", + "inputQty": "21977380966710990444953", + "expectedQtys": [ + "2296467162783677122025", + "8342174343547916151305", + "11381065919427860067843" + ], + "redemptionFee": "6593214290013297133", + "reserves": [ + "13744892000129843040107009", + "49929860638343100381077695", + "68118336044167484191515730" + ], + "mAssetSupply": "131500293019103075738983611" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "659636794406076642492416", + "1918719988086293632385024", + "679811506892445004595200" + ], + "expectedQty": "3265796027464667895889312", + "swapFee": "1960654008884131216263", + "reserves": [ + "13085255205723766397614593", + "48011140650256806748692671", + "67438524537275039186920530" + ], + "mAssetSupply": "128234496991638407843094299" + }, + { + "type": "mintMulti", + "inputQtys": [ + "9523898166486694", + "3772903919342405", + "1446152434816932" + ], + "expectedQty": "15020622942306873", + "reserves": [ + "13085255215247664564101287", + "48011140654029710668035076", + "67438524538721191621737462" + ], + "mAssetSupply": "128234497006659030785401172" + }, + { + "type": "redeemMasset", + "inputQty": "30244301625482274406", + "expectedQtys": [ + "3085251539093631373", + "11320103670876884149", + "15900707185660737728" + ], + "redemptionFee": "9073290487644682", + "reserves": [ + "13085252129996125470469914", + "48011129333926039791150927", + "67438508638014005960999734" + ], + "mAssetSupply": "128234466771430695790771448" + }, + { + "type": "redeemMasset", + "inputQty": "10425903492829816658329", + "expectedQtys": [ + "1063556870845151569273", + "3902299013641349267891", + "5481337960396727808926" + ], + "redemptionFee": "3127771047848944997", + "reserves": [ + "13084188573125280318900641", + "48007227034912398441883036", + "67433027300053609233190808" + ], + "mAssetSupply": "128224043995708913823058116" + }, + { + "type": "redeemMasset", + "inputQty": "23108175569046611558", + "expectedQtys": [ + "2357288163664451932", + "8649131539742102542", + "12148944216607952129" + ], + "redemptionFee": "6932452670713983", + "reserves": [ + "13084186215837116654448709", + "48007218385780858699780494", + "67433015151109392625238679" + ], + "mAssetSupply": "128224020894465797447160541" + }, + { + "type": "redeemMasset", + "inputQty": "65887613440313419785830", + "expectedQtys": [ + "6721261521960889994908", + "24660996441808753645192", + "34639902135935752708370" + ], + "redemptionFee": "19766284032094025935", + "reserves": [ + "13077464954315155764453801", + "47982557389339049946135302", + "67398375248973456872530309" + ], + "mAssetSupply": "128158153047309516121400646" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "1312575257806254601404416", + "expectedQty": "1350644360290329649408137", + "reserves": [ + "14390040212121410365858217", + "47982557389339049946135302", + "67398375248973456872530309" + ] + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "41329075358784550862848", + "outputIndex": 2, + "expectedQty": "42691235664679680619480", + "swapFee": "25449104584073578173", + "reserves": [ + "14431369287480194916721065", + "47982557389339049946135302", + "67355684013308777191910829" + ], + "mAssetSupply": "129508822856704429844386956", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemMasset", + "inputQty": "1155165827300709944524", + "expectedQtys": [ + "128683305793777832442", + "427856427363167138023", + "600604967565561739131" + ], + "redemptionFee": "346549748190212983", + "reserves": [ + "14431240604174401138888623", + "47982129532911686778997279", + "67355083408341211630171698" + ], + "mAssetSupply": "129507668037426877324655415" + }, + { + "type": "redeemMasset", + "inputQty": "21511423866741282832384", + "expectedQtys": [ + "2396332258176157356245", + "7967514919156953798320", + "11184427143212167061971" + ], + "redemptionFee": "6453427160022384849", + "reserves": [ + "14428844271916224981532378", + "47974162017992529825198959", + "67343898981197999463109727" + ], + "mAssetSupply": "129486163066987296064207880" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "4634800259874619463303168", + "expectedQty": "4617169397118441505304072", + "reserves": [ + "14428844271916224981532378", + "52608962277867149288502127", + "67343898981197999463109727" + ] + }, + { + "type": "redeemMasset", + "inputQty": "2094794653497610259660", + "expectedQtys": [ + "225321754813933482080", + "821544919052258397881", + "1051646632848481696546" + ], + "redemptionFee": "628438396049283077", + "reserves": [ + "14428618950161411048050298", + "52608140732948097030104246", + "67342847334565150981413181" + ], + "mAssetSupply": "134101238297890636008535369" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "134173500080130298478592", + "outputIndex": 1, + "expectedQty": "138385357284514764924422", + "swapFee": "82738031005106037284", + "reserves": [ + "14562792450241541346528890", + "52469755375663582265179824", + "67342847334565150981413181" + ], + "mAssetSupply": "134101321035921641114572653", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemMasset", + "inputQty": "386207097387354565482905", + "expectedQtys": [ + "41927748977323903785345", + "151065720383587939336567", + "193886852958277387070135" + ], + "redemptionFee": "115862129216206369644", + "reserves": [ + "14520864701264217442743545", + "52318689655279994325843257", + "67148960481606873594343046" + ], + "mAssetSupply": "133715229800663502755459392" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "5411466081534669225984", + "5177015243350463217664", + "3596555524316322594816" + ], + "expectedQty": "14287796945402124748139", + "swapFee": "8577824862158569990", + "reserves": [ + "14515453235182682773517561", + "52313512640036643862625593", + "67145363926082557271748230" + ], + "mAssetSupply": "133700942003718100630711253" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "234529236491176800", + "expectedQty": "240968105606334545", + "reserves": [ + "14515453469711919264694361", + "52313512640036643862625593", + "67145363926082557271748230" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "38624486761134007779328", + "30625230796949129527296", + "25817582984502259482624" + ], + "expectedQty": "95828011852148869880107", + "swapFee": "57531325906833421981", + "reserves": [ + "14476828982950785256915033", + "52282887409239694733098297", + "67119546343098055012265606" + ], + "mAssetSupply": "133605114232834057367165691" + }, + { + "type": "redeemMasset", + "inputQty": "546532249224468860030156", + "expectedQtys": [ + "59201927523029849070761", + "213807023260534478709256", + "274480448906484307882045" + ], + "redemptionFee": "163959674767340658009", + "reserves": [ + "14417627055427755407844272", + "52069080385979160254389041", + "66845065894191570704383561" + ], + "mAssetSupply": "133058745943284355847793544" + }, + { + "type": "mintMulti", + "inputQtys": [ + "79239636970002863620096", + "21215128560749858783232", + "49908774439977423470592" + ], + "expectedQty": "152111450130126900642698", + "reserves": [ + "14496866692397758271464368", + "52090295514539910113172273", + "66894974668631548127854153" + ], + "mAssetSupply": "133210857393414482748436242" + }, + { + "type": "redeemMasset", + "inputQty": "45430512360568109871923", + "expectedQtys": [ + "4942558844806266140440", + "17759654985237230266658", + "22807159349469738804568" + ], + "redemptionFee": "13629153708170432961", + "reserves": [ + "14491924133552952005323928", + "52072535859554672882905615", + "66872167509282078389049585" + ], + "mAssetSupply": "133165440510207622808997280" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "1957280758692116426653696", + "expectedQty": "1948945552234878466061730", + "reserves": [ + "14491924133552952005323928", + "54029816618246789309559311", + "66872167509282078389049585" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "57550111657693341024256", + "75468667924556564922368", + "93635681362397961912320" + ], + "expectedQty": "227308576201953480264252", + "reserves": [ + "14549474245210645346348184", + "54105285286171345874481679", + "66965803190644476350961905" + ], + "mAssetSupply": "135341694638644454755323262" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "3380336792011755562729472", + "expectedQty": "3364578954696098354281303", + "reserves": [ + "14549474245210645346348184", + "57485622078183101437211151", + "66965803190644476350961905" + ] + }, + { + "type": "redeemMasset", + "inputQty": "118361323955190374", + "expectedQtys": [ + "12411683779005194", + "49039116537745261", + "57126351042064268" + ], + "redemptionFee": "35508397186557", + "reserves": [ + "14549474232798961567342990", + "57485622029143984899465890", + "66965803133518125308897637" + ], + "mAssetSupply": "138706273475014737551600748" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "661898793096355531194368", + "expectedQty": "664738426256866727433654", + "swapFee": "397139275857813318716", + "reserves": [ + "14549474232798961567342990", + "56820883602887118172032236", + "66965803133518125308897637" + ], + "mAssetSupply": "138044771821194239833725096" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "481124939104672595050496", + "expectedQty": "484009068811083727718445", + "swapFee": "288674963462803557030", + "reserves": [ + "14549474232798961567342990", + "56820883602887118172032236", + "66481794064707041581179192" + ], + "mAssetSupply": "137563935557053030042231630" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "19688961048187242545152", + "55960511265887901188096", + "10889381026865816272896" + ], + "expectedQty": "86766182599226751536634", + "swapFee": "52090964138018862239", + "reserves": [ + "14529785271750774324797838", + "56764923091621230270844140", + "66470904683680175764906296" + ], + "mAssetSupply": "137477169374453803290694996" + }, + { + "type": "mintMulti", + "inputQtys": [ + "970996730223439", + "439874936008061", + "850328963752989" + ], + "expectedQty": "2281604913062938", + "reserves": [ + "14529785272721771055021277", + "56764923092061105206852201", + "66470904684530504728659285" + ], + "mAssetSupply": "137477169376735408203757934" + }, + { + "type": "redeemMasset", + "inputQty": "1018987081453983393382", + "expectedQtys": [ + "107663125864895827292", + "420617988831907942521", + "492537586969000461164" + ], + "redemptionFee": "305696124436195018", + "reserves": [ + "14529677609595906159193985", + "56764502474072273298909680", + "66470412146943535728198121" + ], + "mAssetSupply": "137476150695350078656559570" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "3054812199070727667712", + "2318481874869852045312", + "1443712482127540912128" + ], + "expectedQty": "6884737487025220891541", + "swapFee": "4133322485706556468", + "reserves": [ + "14526622797396835431526273", + "56762183992197403446864368", + "66468968434461408187285993" + ], + "mAssetSupply": "137469265957863053435668029" + }, + { + "type": "redeemMasset", + "inputQty": "2414110926521607861043", + "expectedQtys": [ + "255026881192145474960", + "996507099762988333030", + "1166917731142405394250" + ], + "redemptionFee": "724233277956482358", + "reserves": [ + "14526367770515643286051313", + "56761187485097640458531338", + "66467801516730265781891743" + ], + "mAssetSupply": "137466852571169809784289344" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "370872341869161545728", + "expectedQty": "360226294948190139761", + "swapFee": "222523405121496927", + "reserves": [ + "14526007544220695095911552", + "56761187485097640458531338", + "66467801516730265781891743" + ], + "mAssetSupply": "137466481921351345744240543" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "15477970447589596725248", + "expectedQty": "15925377123743282596960", + "reserves": [ + "14541485514668284692636800", + "56761187485097640458531338", + "66467801516730265781891743" + ] + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "129658854961074946048", + "expectedQty": "125944343368413171463", + "swapFee": "77795312976644967", + "reserves": [ + "14541359570324916279465337", + "56761187485097640458531338", + "66467801516730265781891743" + ], + "mAssetSupply": "137482277717415440928536422" + }, + { + "type": "redeemMasset", + "inputQty": "98893558898577083308441", + "expectedQtys": [ + "10456732380070730072741", + "40817128841098029303637", + "47797182167924183430731" + ], + "redemptionFee": "29668067669573124992", + "reserves": [ + "14530902837944845549392596", + "56720370356256542429227701", + "66420004334562341598461012" + ], + "mAssetSupply": "137383413826584533418352973" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "240303321193988602462208", + "outputIndex": 0, + "expectedQty": "231759247579007349697236", + "swapFee": "143238664717161215283", + "reserves": [ + "14299143590365838199695360", + "56720370356256542429227701", + "66660307655756330200923220" + ], + "mAssetSupply": "137383557065249250579568256", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "386315797336980608", + "expectedQty": "388679124022136475", + "swapFee": "231789478402188", + "reserves": [ + "14299143590365838199695360", + "56720370356256542429227701", + "66660307267077206178786745" + ], + "mAssetSupply": "137383556679165242720989836" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "9076601040168052326400", + "expectedQty": "9348186383906761826492", + "reserves": [ + "14308220191406006252021760", + "56720370356256542429227701", + "66660307267077206178786745" + ] + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "8057865708040031232", + "expectedQty": "8107122386020431899", + "swapFee": "4834719424824018", + "reserves": [ + "14308220191406006252021760", + "56720370356256542429227701", + "66660299159954820158354846" + ], + "mAssetSupply": "137392896812518160867609114" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "2763790672259954245632", + "expectedQty": "2846419172836462663187", + "reserves": [ + "14310983982078266206267392", + "56720370356256542429227701", + "66660299159954820158354846" + ] + }, + { + "type": "redeemMasset", + "inputQty": "73484084418380223112806", + "expectedQtys": [ + "7651722254668229287416", + "30326951710064371662158", + "35641580985893569139893" + ], + "redemptionFee": "22045225325514066933", + "reserves": [ + "14303332259823597976979976", + "56690043404546478057565543", + "66624657578968926589214953" + ], + "mAssetSupply": "137322281192497942621226428" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "205088389589692800040960", + "expectedQty": "198935375427414121552836", + "swapFee": "123053033753815680024", + "reserves": [ + "14104396884396183855427140", + "56690043404546478057565543", + "66624657578968926589214953" + ], + "mAssetSupply": "137117315855942003636865492" + }, + { + "type": "redeemMasset", + "inputQty": "357326091318019384934", + "expectedQtys": [ + "36744863454663891601", + "147689257556524496571", + "173570976874687962836" + ], + "redemptionFee": "107197827395405815", + "reserves": [ + "14104360139532729191535539", + "56689895715288921533068972", + "66624484007992051901252117" + ], + "mAssetSupply": "137116958637048513012886373" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "1893914369981303", + "2153099083207894", + "1245877409365948" + ], + "expectedQty": "5331879072015665", + "swapFee": "3201048072052", + "reserves": [ + "14104360137638814821554236", + "56689895713135822449861078", + "66624484006746174491886169" + ], + "mAssetSupply": "137116958631716633940870708" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "91795896131651403776", + "expectedQty": "91336083066411812418", + "reserves": [ + "14104360137638814821554236", + "56689987509031954101264854", + "66624484006746174491886169" + ] + }, + { + "type": "redeemMasset", + "inputQty": "4372311087908894697062", + "expectedQtys": [ + "449616948709667522244", + "1807156011152955613468", + "2123846591844332611149" + ], + "redemptionFee": "1311693326372668409", + "reserves": [ + "14103910520690105154031992", + "56688180353020801145651386", + "66622360160154330159275020" + ], + "mAssetSupply": "137112678968405117830654473" + }, + { + "type": "redeemMasset", + "inputQty": "34064532613381", + "expectedQtys": [ + "3502950934849", + "14079493348407", + "16546819299698" + ], + "redemptionFee": "10219359784", + "reserves": [ + "14103910520686602203097143", + "56688180353006721652302979", + "66622360160137783339975322" + ], + "mAssetSupply": "137112678968371063517400876" + }, + { + "type": "redeemMasset", + "inputQty": "304583247356048630507110", + "expectedQtys": [ + "31321145168059006023698", + "125889817830693223370993", + "147951067255693482002271" + ], + "redemptionFee": "91374974206814589152", + "reserves": [ + "14072589375518543197073445", + "56562290535176028428931986", + "66474409092882089857973051" + ], + "mAssetSupply": "136808187095989221701482918" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "4065250079252722745344", + "477262418868818673664", + "4073398061510377865216" + ], + "expectedQty": "8710906352686059768867", + "swapFee": "5229681620583986253", + "reserves": [ + "14068524125439290474328101", + "56561813272757159610258322", + "66470335694820579480107835" + ], + "mAssetSupply": "136799476189636535641714051" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "103237778823154906431488", + "expectedQty": "103694619297239801084530", + "swapFee": "61942667293892943858", + "reserves": [ + "14068524125439290474328101", + "56458118653459919809173792", + "66470335694820579480107835" + ], + "mAssetSupply": "136696300353480674628226421" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "1294663605385050900660224", + "919817487479428205248512", + "2710642269501519587966976" + ], + "expectedQty": "4943809279734035194591345", + "swapFee": "2968066407685032136036", + "reserves": [ + "12773860520054239573667877", + "55538301165980491603925280", + "63759693425319059892140859" + ], + "mAssetSupply": "131752491073746639433635076" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "505509196572790404153344", + "145714018781529437634560", + "295187875155929846513664" + ], + "expectedQty": "961767339831239724792468", + "swapFee": "577406848007548363893", + "reserves": [ + "12268351323481449169514533", + "55392587147198962166290720", + "63464505550163130045627195" + ], + "mAssetSupply": "130790723733915399708842608" + }, + { + "type": "redeemMasset", + "inputQty": "2763948172478054714572", + "expectedQtys": [ + "259184394167389842105", + "1170238262873367339672", + "1340767719185609885432" + ], + "redemptionFee": "829184451743416414", + "reserves": [ + "12268092139087281779672428", + "55391416908936088798951048", + "63463164782443944435741763" + ], + "mAssetSupply": "130787960614927373397544450" + }, + { + "type": "mintMulti", + "inputQtys": [ + "13430030246982956613632", + "9108310147846599868416", + "248497903126933078016" + ], + "expectedQty": "23236478425725021113551", + "reserves": [ + "12281522169334264736286060", + "55400525219083935398819464", + "63463413280347071368819779" + ], + "mAssetSupply": "130811197093353098418658001" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "505095269718662242631680", + "outputIndex": 0, + "expectedQty": "482802187388046512388481", + "swapFee": "301270269603912966523", + "reserves": [ + "11798719981946218223897579", + "55905620488802597641451144", + "63463413280347071368819779" + ], + "mAssetSupply": "130811498363622702331624524", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "117662977827581036855296", + "expectedQty": "116928139814107434899785", + "reserves": [ + "11798719981946218223897579", + "56023283466630178678306440", + "63463413280347071368819779" + ] + }, + { + "type": "redeemMasset", + "inputQty": "7908136257069126", + "expectedQtys": [ + "712434236030503", + "3382816544298166", + "3832068938448877" + ], + "redemptionFee": "2372440877120", + "reserves": [ + "11798719981233783987867076", + "56023283463247362134008274", + "63463413276515002430370902" + ], + "mAssetSupply": "130928426495531045950332303" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "1150749706040992145080320", + "7784325927145845852995584", + "8643789541028708323688448" + ], + "expectedQty": "17511396842704024500354100", + "swapFee": "10513145993218345707637", + "reserves": [ + "10647970275192791842786756", + "48238957536101516281012690", + "54819623735486294106682454" + ], + "mAssetSupply": "113417029652827021449978203" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "35296170274981556", + "expectedQty": "36621102552552204", + "reserves": [ + "10647970310488962117768312", + "48238957536101516281012690", + "54819623735486294106682454" + ] + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "1375553648397900840960", + "expectedQty": "1367434994471552554484", + "reserves": [ + "10647970310488962117768312", + "48240333089749914181853650", + "54819623735486294106682454" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "6195077079591561461760", + "46790936850579842924544", + "80680860833138285215744" + ], + "expectedQty": "133027699788669332902608", + "reserves": [ + "10654165387568553679230072", + "48287124026600494024778194", + "54900304596319432391898198" + ], + "mAssetSupply": "113551424824231264887987499" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "257112444262510723072", + "expectedQty": "266776628945527518333", + "reserves": [ + "10654422500012816189953144", + "48287124026600494024778194", + "54900304596319432391898198" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "1213812890526070528", + "601628560596656896", + "548033686828377920" + ], + "expectedQty": "2401497930777404648", + "swapFee": "1441763816756496", + "reserves": [ + "10654421286199925663882616", + "48287123424971933428121298", + "54900304048285745563520278" + ], + "mAssetSupply": "113551689199362279638101184" + }, + { + "type": "redeemMasset", + "inputQty": "23866888195216118", + "expectedQtys": [ + "2238730194595864", + "10146195491788958", + "11535771400797286" + ], + "redemptionFee": "7160066458564", + "reserves": [ + "10654421283961195469286752", + "48287123414825737936332340", + "54900304036749974162722992" + ], + "mAssetSupply": "113551689175502551509343630" + }, + { + "type": "redeemMasset", + "inputQty": "18513201703846535181107", + "expectedQtys": [ + "1736550794307249617525", + "7870257828743580255002", + "8948131863928171125513" + ], + "redemptionFee": "5553960511153960554", + "reserves": [ + "10652684733166888219669227", + "48279253156996994356077338", + "54891355904886045991597479" + ], + "mAssetSupply": "113533181527759216128123077" + }, + { + "type": "redeemMasset", + "inputQty": "66722414182904378163", + "expectedQtys": [ + "6258607408968376429", + "28364764289613331010", + "32249470941820445343" + ], + "redemptionFee": "20016724254871313", + "reserves": [ + "10652678474559479251292798", + "48279224792232704742746328", + "54891323655415104171152136" + ], + "mAssetSupply": "113533114825361757478616227" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "21186208971873948008448", + "expectedQty": "20405083187435591837855", + "swapFee": "12711725383124368805", + "reserves": [ + "10632273391372043659454943", + "48279224792232704742746328", + "54891323655415104171152136" + ], + "mAssetSupply": "113511941328115266654976584" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "1719575488683322445398016", + "expectedQty": "1775478386134911475831029", + "reserves": [ + "12351848880055366104852959", + "48279224792232704742746328", + "54891323655415104171152136" + ] + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "843983074257070649769984", + "expectedQty": "818921364418951020898553", + "swapFee": "506389844554242389861", + "reserves": [ + "11532927515636415083954406", + "48279224792232704742746328", + "54891323655415104171152136" + ], + "mAssetSupply": "114443943029837661723427490" + }, + { + "type": "redeemMasset", + "inputQty": "388517605391513854725324", + "expectedQtys": [ + "39140569953506750225298", + "163850537751098024250414", + "186290747987658405106399" + ], + "redemptionFee": "116555281617454156417", + "reserves": [ + "11493786945682908333729108", + "48115374254481606718495914", + "54705032907427445766045737" + ], + "mAssetSupply": "114055541979727765322858583" + }, + { + "type": "mintMulti", + "inputQtys": [ + "10110367869801854926848", + "9567701737751648927744", + "7324253154085272813568" + ], + "expectedQty": "27225965991357942364113", + "reserves": [ + "11503897313552710188655956", + "48124941956219358367423658", + "54712357160581531038859305" + ], + "mAssetSupply": "114082767945719123265222696" + }, + { + "type": "redeemMasset", + "inputQty": "50236269626843557632409", + "expectedQtys": [ + "5064213673461045624219", + "21185428072457259249674", + "24085321668638327864967" + ], + "redemptionFee": "15070880888053067289", + "reserves": [ + "11498833099879249143031737", + "48103756528146901108173984", + "54688271838912892710994338" + ], + "mAssetSupply": "114032546746973167760657576" + }, + { + "type": "redeemMasset", + "inputQty": "149826687975819071560089", + "expectedQtys": [ + "15103716249884268811912", + "63184279904217270855559", + "71833040176933327474698" + ], + "redemptionFee": "44948006392745721468", + "reserves": [ + "11483729383629364874219825", + "48040572248242683837318425", + "54616438798735959383519640" + ], + "mAssetSupply": "113882765007003741434818955" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "566345339042978154414080", + "outputIndex": 0, + "expectedQty": "544442517060657276207641", + "swapFee": "337972644995589942522", + "reserves": [ + "10939286866568707598012184", + "48606917587285661991732505", + "54616438798735959383519640" + ], + "mAssetSupply": "113883102979648737024761477", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemMasset", + "inputQty": "1288713828118738816204", + "expectedQtys": [ + "123753046789978331769", + "549876259747704142968", + "617860267182299276624" + ], + "redemptionFee": "386614148435621644", + "reserves": [ + "10939163113521917619680415", + "48606367711025914287589537", + "54615820938468777084243016" + ], + "mAssetSupply": "113881814652434766721566917" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "544030125405093889048576", + "expectedQty": "562524008972789796641351", + "reserves": [ + "11483193238927011508728991", + "48606367711025914287589537", + "54615820938468777084243016" + ] + }, + { + "type": "redeemMasset", + "inputQty": "11367113393581416932966", + "expectedQtys": [ + "1140218921841648524642", + "4826349172478377850691", + "5423055344471088730575" + ], + "redemptionFee": "3410134018074425079", + "reserves": [ + "11482053020005169860204349", + "48601541361853435909738846", + "54610397883124305995512441" + ], + "mAssetSupply": "114432974958147993175700381" + }, + { + "type": "mintMulti", + "inputQtys": [ + "298062744215778127511552", + "194056861425692147974144", + "216339736292919200448512" + ], + "expectedQty": "715424690019600492075838", + "reserves": [ + "11780115764220947987715901", + "48795598223279128057712990", + "54826737619417225195960953" + ], + "mAssetSupply": "115148399648167593667776219" + }, + { + "type": "redeemMasset", + "inputQty": "507713912692814540", + "expectedQtys": [ + "51925466669931986", + "215085679962317057", + "241670285238188324" + ], + "redemptionFee": "152314173807844", + "reserves": [ + "11780115712295481317783915", + "48795598008193448095395933", + "54826737377746939957772629" + ], + "mAssetSupply": "115148399140605995148769523" + }, + { + "type": "mintMulti", + "inputQtys": [ + "9609386765960800632832", + "5713664230447485288448", + "26735947694939341586432" + ], + "expectedQty": "42150860497435176900473", + "reserves": [ + "11789725099061442118416747", + "48801311672423895580684381", + "54853473325441879299359061" + ], + "mAssetSupply": "115190550001103430325669996" + }, + { + "type": "mintMulti", + "inputQtys": [ + "7983636623071741952", + "17769409734852589568", + "20833731665637310464" + ], + "expectedQty": "46603050708039323664", + "reserves": [ + "11789733082698065190158699", + "48801329441833630433273949", + "54853494159173544936669525" + ], + "mAssetSupply": "115190596604154138364993660" + }, + { + "type": "redeemMasset", + "inputQty": "516341038381963330505932", + "expectedQtys": [ + "52831541329480231642818", + "218685990196292453523741", + "245806637301204896812401" + ], + "redemptionFee": "154902311514588999151", + "reserves": [ + "11736901541368584958515881", + "48582643451637337979750208", + "54607687521872340039857124" + ], + "mAssetSupply": "114674410468083689623486879" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "5395319551364634247168", + "expectedQty": "5359835945451219351323", + "reserves": [ + "11736901541368584958515881", + "48582643451637337979750208", + "54613082841423704674104292" + ] + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "573166770929943835574272", + "expectedQty": "590110830078418365651189", + "reserves": [ + "12310068312298528794090153", + "48582643451637337979750208", + "54613082841423704674104292" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "7986203942138074365952", + "2250223541896546353152", + "6988663686552736497664" + ], + "expectedQty": "17395528428625853060000", + "swapFee": "10443583207099771699", + "reserves": [ + "12302082108356390719724201", + "48580393228095441433397056", + "54606094177737151937606628" + ], + "mAssetSupply": "115252485605678933355429391" + }, + { + "type": "redeemMasset", + "inputQty": "12284974235123143252377", + "expectedQtys": [ + "1310908148462190200989", + "5176719906214007807999", + "5818817756440194755399" + ], + "redemptionFee": "3685492270536942975", + "reserves": [ + "12300771200207928529523212", + "48575216508189227425589057", + "54600275359980711742851229" + ], + "mAssetSupply": "115240204316936080749119989" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "2418194054496899817275392", + "expectedQty": "2431422997271517821292966", + "swapFee": "1450916432698139890365", + "reserves": [ + "12300771200207928529523212", + "48575216508189227425589057", + "52168852362709193921558263" + ], + "mAssetSupply": "112823461178871879071734962" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "22041247687980003360768", + "expectedQty": "22157307148673714044401", + "swapFee": "13224748612788002016", + "reserves": [ + "12300771200207928529523212", + "48575216508189227425589057", + "52146695055560520207513862" + ], + "mAssetSupply": "112801433155932511856376210" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "15008378333899039703040", + "7902311960476072804352", + "12232168710326280257536" + ], + "expectedQty": "35434539706017835754495", + "swapFee": "21273487916360517763", + "reserves": [ + "12285762821874029489820172", + "48567314196228751352784705", + "52134462886850193927256326" + ], + "mAssetSupply": "112765998616226494020621715" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "1892363042237631248203776", + "expectedQty": "1902032855858002843044198", + "swapFee": "1135417825342578748922", + "reserves": [ + "12285762821874029489820172", + "48567314196228751352784705", + "50232430030992191084212128" + ], + "mAssetSupply": "110874770991814205351166861" + }, + { + "type": "mintMulti", + "inputQtys": [ + "1625876909720388612653056", + "413707623367066353926144", + "144716017024633132810240" + ], + "expectedQty": "2218902229480609845746709", + "reserves": [ + "13911639731594418102473228", + "48981021819595817706710849", + "50377146048016824217022368" + ], + "mAssetSupply": "113093673221294815196913570" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "149315203143199870681088", + "expectedQty": "152326029420977171806363", + "reserves": [ + "14060954934737617973154316", + "48981021819595817706710849", + "50377146048016824217022368" + ] + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "10387481063524134813696", + "expectedQty": "10178068860447481648846", + "swapFee": "6232488638114480888", + "reserves": [ + "14050776865877170491505470", + "48981021819595817706710849", + "50377146048016824217022368" + ], + "mAssetSupply": "113235618002140906348387125" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "3549541010274782208", + "expectedQty": "3532845118833085120", + "reserves": [ + "14050776865877170491505470", + "48981021819595817706710849", + "50377149597557834491804576" + ] + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "137828908559960369004544", + "expectedQty": "137216624852697120141999", + "reserves": [ + "14050776865877170491505470", + "49118850728155778075715393", + "50377149597557834491804576" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "3301840613469725917184", + "7456203594094940782592", + "1847999870393896140800" + ], + "expectedQty": "12630295479477287357791", + "reserves": [ + "14054078706490640217422654", + "49126306931749873016497985", + "50378997597428228387945376" + ], + "mAssetSupply": "113385468455318199588972035" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "86694745659942218235904", + "44458085926508225888256", + "167677036544890526236672" + ], + "expectedQty": "299585920325403218701053", + "swapFee": "179859467875967511727", + "reserves": [ + "13967383960830697999186750", + "49081848845823364790609729", + "50211320560883337861708704" + ], + "mAssetSupply": "113085882534992796370270982" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "305942466243833616138240", + "outputIndex": 2, + "expectedQty": "313227200365595394577261", + "swapFee": "187191563395697559717", + "reserves": [ + "14273326427074531615324990", + "49081848845823364790609729", + "49898093360517742467131443" + ], + "mAssetSupply": "113086069726556192067830699", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "3027608105332440", + "expectedQty": "3039097856738954", + "swapFee": "1816564863199", + "reserves": [ + "14273326427074531615324990", + "49081848842784266933870775", + "49898093360517742467131443" + ], + "mAssetSupply": "113086069723530400527361458" + }, + { + "type": "redeemMasset", + "inputQty": "8321391677722338315468", + "expectedQtys": [ + "1049981733842525901918", + "3610584050707936313557", + "3670629047110706229025" + ], + "redemptionFee": "2496417503316701494", + "reserves": [ + "14272276445340689089423072", + "49078238258733558997557218", + "49894422731470631760902418" + ], + "mAssetSupply": "113077750828270181505747484" + }, + { + "type": "redeemMasset", + "inputQty": "37795396066088015259238", + "expectedQtys": [ + "4768970988227558043024", + "16399114416371096921866", + "16671836156762805890084" + ], + "redemptionFee": "11338618819826404577", + "reserves": [ + "14267507474352461531380048", + "49061839144317187900635352", + "49877750895313868955012334" + ], + "mAssetSupply": "113039966770822913316892823" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "683816764004097196032", + "expectedQty": "696946217737904762487", + "reserves": [ + "14268191291116465628576080", + "49061839144317187900635352", + "49877750895313868955012334" + ] + }, + { + "type": "redeemMasset", + "inputQty": "29992927986573566699110", + "expectedQtys": [ + "3784624367686297271630", + "13013606851815554857043", + "13230026679087299288823" + ], + "redemptionFee": "8997878395972070009", + "reserves": [ + "14264406666748779331304450", + "49048825537465372345778309", + "49864520868634781655723511" + ], + "mAssetSupply": "113010679786932473627026209" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "361081123828257571995648", + "112156497389251807150080", + "240679636880767443795968" + ], + "expectedQty": "719402083039614147633563", + "swapFee": "431900390057803170482", + "reserves": [ + "13903325542920521759308802", + "48936669040076120538628229", + "49623841231754014211927543" + ], + "mAssetSupply": "112291277703892859479392646" + }, + { + "type": "redeemMasset", + "inputQty": "14855908667664334848", + "expectedQtys": [ + "1838830002688097357", + "6472279958109020084", + "6563164174203180363" + ], + "redemptionFee": "4456772600299300", + "reserves": [ + "13903323704090519071211445", + "48936662567796162429608145", + "49623834668589840008747180" + ], + "mAssetSupply": "112291262852440964415357098" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "267621225665344474972160", + "expectedQty": "266371271621891645735660", + "reserves": [ + "13903323704090519071211445", + "48936662567796162429608145", + "49891455894255184483719340" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "204033478645847821385728", + "225968688243650034925568", + "345205237832206277148672" + ], + "expectedQty": "776712232876080705993240", + "swapFee": "466307124000048452667", + "reserves": [ + "13699290225444671249825717", + "48710693879552512394682577", + "49546250656422978206570668" + ], + "mAssetSupply": "111780921891186775355099518" + }, + { + "type": "redeemMasset", + "inputQty": "101078007667401228", + "expectedQtys": [ + "12383880271664313", + "44033478452310807", + "44788804817009800" + ], + "redemptionFee": "30323402300220", + "reserves": [ + "13699290213060790978161404", + "48710693835519033942371770", + "49546250611634173389560868" + ], + "mAssetSupply": "111780921790139091089998510" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "1456217678244047104", + "expectedQty": "1426030762284998826", + "swapFee": "873730606946428", + "reserves": [ + "13699288787030028693162578", + "48710693835519033942371770", + "49546250611634173389560868" + ], + "mAssetSupply": "111780920334795143452897834" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "3756788738926483", + "21362000206571308", + "27198877714166380" + ], + "expectedQty": "52168623965124711", + "swapFee": "31319966358890", + "reserves": [ + "13699288783273239954236095", + "48710693814157033735800462", + "49546250584435295675394488" + ], + "mAssetSupply": "111780920282626519487773123" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "7506500629092030742528", + "expectedQty": "7536407897229745775671", + "swapFee": "4503900377455218445", + "reserves": [ + "13699288783273239954236095", + "48703157406259803990024791", + "49546250584435295675394488" + ], + "mAssetSupply": "111773418285897804912249040" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "5836695559494684672", + "203113441389571712", + "934533719437060224" + ], + "expectedQty": "7088952082993409812", + "swapFee": "4255924804678853", + "reserves": [ + "13699282946577680459551423", + "48703157203146362600453079", + "49546249649901576238334264" + ], + "mAssetSupply": "111773411196945721918839228" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "845430169940500141834240", + "outputIndex": 1, + "expectedQty": "864869753678531525984551", + "swapFee": "517071099924213261307", + "reserves": [ + "14544713116518180601385663", + "47838287449467831074468528", + "49546249649901576238334264" + ], + "mAssetSupply": "111773928268045646132100535", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "15442640915326581080064", + "expectedQty": "15379342190207543047368", + "reserves": [ + "14544713116518180601385663", + "47853730090383157655548592", + "49546249649901576238334264" + ] + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "734332117001394334990336", + "expectedQty": "731279686662561760068868", + "reserves": [ + "14544713116518180601385663", + "48588062207384551990538928", + "49546249649901576238334264" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "1427293008698748472131584", + "318869452207885213761536", + "204230282111227371978752" + ], + "expectedQty": "1971965711420944273903891", + "reserves": [ + "15972006125216929073517247", + "48906931659592437204300464", + "49750479932012803610313016" + ], + "mAssetSupply": "114492553008319359709120662" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "1861625185993023018762240", + "expectedQty": "1854082433403900126263269", + "reserves": [ + "15972006125216929073517247", + "48906931659592437204300464", + "51612105118005826629075256" + ] + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "4635606349739467267375104", + "expectedQty": "4614731422728344038578023", + "reserves": [ + "15972006125216929073517247", + "48906931659592437204300464", + "56247711467745293896450360" + ] + }, + { + "type": "redeemMasset", + "inputQty": "151600999013358922576691", + "expectedQtys": [ + "20011725528180270310916", + "61276716595545454569132", + "70474163023494880109342" + ], + "redemptionFee": "45480299704007676773", + "reserves": [ + "15951994399688748803206331", + "48845654942996891749731332", + "56177237304721799016341018" + ], + "mAssetSupply": "120809811345737948959062036" + }, + { + "type": "redeemMasset", + "inputQty": "19736978325254048972", + "expectedQtys": [ + "2605332389437768126", + "7977633624844669560", + "9175051860724018023" + ], + "redemptionFee": "5921093497576214", + "reserves": [ + "15951991794356359365438205", + "48845646965363266905061772", + "56177228129669938292322995" + ], + "mAssetSupply": "120809791614680717202589278" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "95242267398710858088448", + "99432661367149303955456", + "22798586987272361476096" + ], + "expectedQty": "218674694455451639678925", + "swapFee": "131283586825366203529", + "reserves": [ + "15856749526957648507349757", + "48746214303996117601106316", + "56154429542682665930846899" + ], + "mAssetSupply": "120591116920225265562910353" + }, + { + "type": "redeemMasset", + "inputQty": "370449443100342374", + "expectedQtys": [ + "48696470721954862", + "149700832041592248", + "172451644612562796" + ], + "redemptionFee": "111134832930102", + "reserves": [ + "15856749478261177785394895", + "48746214154295285559514068", + "56154429370231021318284103" + ], + "mAssetSupply": "120591116549886957295498081" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "363501638856889625214976", + "expectedQty": "364555684258162452135381", + "swapFee": "218100983314133775128", + "reserves": [ + "15856749478261177785394895", + "48381658470037123107378687", + "56154429370231021318284103" + ], + "mAssetSupply": "120227833012013381804058233" + }, + { + "type": "mintMulti", + "inputQtys": [ + "49752223631879526416384", + "34730628375322535395328", + "25081476327287583408128" + ], + "expectedQty": "110185953745232169531906", + "reserves": [ + "15906501701893057311811279", + "48416389098412445642774015", + "56179510846558308901692231" + ], + "mAssetSupply": "120338018965758613973590139" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "25965247144714638983168", + "28330315093979510603776", + "57269508032304636755968" + ], + "expectedQty": "111639052523550495890848", + "swapFee": "67023645701551228271", + "reserves": [ + "15880536454748342672828111", + "48388058783318466132170239", + "56122241338526004264936263" + ], + "mAssetSupply": "120226379913235063477699291" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "105935664640490525949952", + "expectedQty": "104055527021321758875435", + "swapFee": "63561398784294315569", + "reserves": [ + "15776480927727020913952676", + "48388058783318466132170239", + "56122241338526004264936263" + ], + "mAssetSupply": "120120507809993357246064908" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "6739068705294919925760", + "outputIndex": 1, + "expectedQty": "6725525316784148456263", + "swapFee": "4023649738546273501", + "reserves": [ + "15776480927727020913952676", + "48381333258001681983713976", + "56128980407231299184862023" + ], + "mAssetSupply": "120120511833643095792338409", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "1328766436783077720064", + "expectedQty": "1352117929507655462296", + "reserves": [ + "15777809694163803991672740", + "48381333258001681983713976", + "56128980407231299184862023" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "4618102257824450478080", + "8942520646898989137920", + "6214866947944266858496" + ], + "expectedQty": "19795032982761840292600", + "swapFee": "11884150279824999175", + "reserves": [ + "15773191591905979541194660", + "48372390737354782994576056", + "56122765540283354918003527" + ], + "mAssetSupply": "120102068918589841607508105" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "44984890433592467914752", + "expectedQty": "45773330009172677731195", + "reserves": [ + "15818176482339572009109412", + "48372390737354782994576056", + "56122765540283354918003527" + ] + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "2191945502747208712192", + "expectedQty": "2181248607366622011898", + "reserves": [ + "15818176482339572009109412", + "48372390737354782994576056", + "56124957485786102126715719" + ] + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "558458301747421118464", + "outputIndex": 2, + "expectedQty": "558911838237586132168", + "swapFee": "333910895079937237", + "reserves": [ + "15818176482339572009109412", + "48372949195656530415694520", + "56124398573947864540583551" + ], + "mAssetSupply": "120150023831117275987188435", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "14528215816044307021824", + "outputIndex": 2, + "expectedQty": "14539973666682240723528", + "swapFee": "8686635764158222847", + "reserves": [ + "15818176482339572009109412", + "48387477411472574722716344", + "56109858600281182299860023" + ], + "mAssetSupply": "120150032517753040145411282", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemBassets", + "inputQtys": [ + "380901635151402884923392", + "493077430775749869043712", + "219902485005712721182720" + ], + "expectedQty": "1097843972919589363340524", + "swapFee": "659101844858668819295", + "reserves": [ + "15437274847188169124186020", + "47894399980696824853672632", + "55889956115275469578677303" + ], + "mAssetSupply": "119052188544833450782070758" + }, + { + "type": "mintMulti", + "inputQtys": [ + "17934482963649429241856", + "17224428121919158484992", + "10690467044270373076992" + ], + "expectedQty": "46059674276101408554517", + "reserves": [ + "15455209330151818553427876", + "47911624408818744012157624", + "55900646582319739951754295" + ], + "mAssetSupply": "119098248219109552190625275" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "1063494607748770168832", + "2464500046560359874560", + "1579778543969106132992" + ], + "expectedQty": "5110404567912421851297", + "swapFee": "3068083590901994307", + "reserves": [ + "15454145835544069783259044", + "47909159908772183652283064", + "55899066803775770845621303" + ], + "mAssetSupply": "119093137814541639768773978" + }, + { + "type": "mintMulti", + "inputQtys": [ + "19755927643503247360", + "8543508492775691264", + "6534206064932063232" + ], + "expectedQty": "35128101623143538890", + "reserves": [ + "15454165591471713286506404", + "47909168452280676427974328", + "55899073337981835777684535" + ], + "mAssetSupply": "119093172942643262912312868" + }, + { + "type": "mintMulti", + "inputQtys": [ + "2499668303673609420800", + "10093897106687654887424", + "3429300407265060192256" + ], + "expectedQty": "16015282350713846763542", + "reserves": [ + "15456665259775386895927204", + "47919262349387364082861752", + "55902502638389100837876791" + ], + "mAssetSupply": "119109188224993976759076410" + }, + { + "type": "redeemMasset", + "inputQty": "2594986303106223544729", + "expectedQtys": [ + "336647426516576033487", + "1043685431454335363667", + "1217561054260889960317" + ], + "redemptionFee": "778495890931867063", + "reserves": [ + "15456328612348870319893717", + "47918218663955909747498085", + "55901285077334839947916474" + ], + "mAssetSupply": "119106594017186761467398744" + }, + { + "type": "mintMulti", + "inputQtys": [ + "5361858791910975488", + "755843527345300736", + "4941678182314524672" + ], + "expectedQty": "11128965915119599697", + "reserves": [ + "15456333974207662230869205", + "47918219419799437092798821", + "55901290019013022262441146" + ], + "mAssetSupply": "119106605146152676586998441" + }, + { + "type": "mintMulti", + "inputQtys": [ + "156366474367232286654464", + "74696076016736891043840", + "51908786666840178819072" + ], + "expectedQty": "285253389713562177443082", + "reserves": [ + "15612700448574894517523669", + "47992915495816173983842661", + "55953198805679862441260218" + ], + "mAssetSupply": "119391858535866238764441523" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "7710461893374371692544", + "expectedQty": "7744141500055847430325", + "swapFee": "4626277136024623015", + "reserves": [ + "15612700448574894517523669", + "47992915495816173983842661", + "55945454664179806593829893" + ], + "mAssetSupply": "119384152700250000417371994" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "11930346004827680538624", + "expectedQty": "11714988624086894148125", + "swapFee": "7158207602896608323", + "reserves": [ + "15600985459950807623375544", + "47992915495816173983842661", + "55945454664179806593829893" + ], + "mAssetSupply": "119372229512452775633441693" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "5737820417635013099520", + "expectedQty": "5634134338963174806048", + "swapFee": "3442692250581007859", + "reserves": [ + "15595351325611844448569496", + "47992915495816173983842661", + "55945454664179806593829893" + ], + "mAssetSupply": "119366495134727391201350032" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "2567339076281008255926272", + "expectedQty": "2554171134274125641102029", + "reserves": [ + "15595351325611844448569496", + "47992915495816173983842661", + "58512793740460814849756165" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "265305856378030144880640", + "2949432266946819129344", + "148631232008225384562688" + ], + "expectedQty": "420995274174014774711600", + "reserves": [ + "15860657181989874593450136", + "47995864928083120802972005", + "58661424972469040234318853" + ], + "mAssetSupply": "122341661543175531617163661" + }, + { + "type": "redeemMasset", + "inputQty": "2729113043664385553203", + "expectedQtys": [ + "353702411694544102204", + "1070337312107438749185", + "1308185861917591051873" + ], + "redemptionFee": "818733913099315665", + "reserves": [ + "15860303479578180049347932", + "47994794590771013364222820", + "58660116786607122643266980" + ], + "mAssetSupply": "122338933248865780330926123" + }, + { + "type": "redeemMasset", + "inputQty": "338851064884140346808729", + "expectedQtys": [ + "43916260315057809082477", + "132894802153690310936280", + "162426460643037173004800" + ], + "redemptionFee": "101655319465242104042", + "reserves": [ + "15816387219263122240265455", + "47861899788617323053286540", + "58497690325964085470262180" + ], + "mAssetSupply": "122000183839301105226221436" + }, + { + "type": "mintMulti", + "inputQtys": [ + "710738495459183", + "2608020053755788", + "80234562371149" + ], + "expectedQty": "3402901746422116", + "reserves": [ + "15816387219973860735724638", + "47861899791225343107042328", + "58497690326044320032633329" + ], + "mAssetSupply": "122000183842704006972643552" + }, + { + "type": "mintMulti", + "inputQtys": [ + "112225153125685716320256", + "47734099557232532258816", + "47077724482033158193152" + ], + "expectedQty": "208663508588748918200545", + "reserves": [ + "15928612373099546452044894", + "47909633890782575639301144", + "58544768050526353190826481" + ], + "mAssetSupply": "122208847351292755890844097" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "779721972143710848", + "outputIndex": 2, + "expectedQty": "780758572267542353", + "swapFee": "466304687029544", + "reserves": [ + "15928612373099546452044894", + "47909634670504547783011992", + "58544767269767780923284128" + ], + "mAssetSupply": "122208847351759060577873641", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mintMulti", + "inputQtys": [ + "2578681211468753928192", + "3391083474489164431360", + "4724408568833004011520" + ], + "expectedQty": "10704896059226110616003", + "reserves": [ + "15931191054311015205973086", + "47913025753979036947443352", + "58549491678336613927295648" + ], + "mAssetSupply": "122219552247818286688489644" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "2389285912663358976", + "expectedQty": "2432190282583027018", + "reserves": [ + "15931193443596927869332062", + "47913025753979036947443352", + "58549491678336613927295648" + ] + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "41425092193343842025472", + "expectedQty": "41210091406603816855469", + "reserves": [ + "15931193443596927869332062", + "47913025753979036947443352", + "58590916770529957769321120" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "404994772670284585500672", + "597925648539337667641344", + "302357876182513386258432" + ], + "expectedQty": "1308943095916949576097476", + "reserves": [ + "16336188216267212454832734", + "48510951402518374615084696", + "58893274646712471155579552" + ], + "mAssetSupply": "123569707867332122664469607" + }, + { + "type": "mintMulti", + "inputQtys": [ + "4327824320931042951168", + "6499138248699465957376", + "9222168879455313854464" + ], + "expectedQty": "20056654117966606133604", + "reserves": [ + "16340516040588143497783902", + "48517450540767074081042072", + "58902496815591926469434016" + ], + "mAssetSupply": "123589764521450089270603211" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "11103454517702321766400", + "expectedQty": "11067700777796848092988", + "reserves": [ + "16340516040588143497783902", + "48528553995284776402808472", + "58902496815591926469434016" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "4347391466339174973440", + "3908916437776101015552", + "17153072769132128108544" + ], + "expectedQty": "25385443867198754958901", + "reserves": [ + "16344863432054482672757342", + "48532462911722552503824024", + "58919649888361058597542560" + ], + "mAssetSupply": "123626217666095084873655100" + }, + { + "type": "mintMulti", + "inputQtys": [ + "2644091879881344693567488", + "1622232304597459611418624", + "2457463483255570720358400" + ], + "expectedQty": "6748205314627048272862197", + "reserves": [ + "18988955311935827366324830", + "50154695216320012115242648", + "61377113371616629317900960" + ], + "mAssetSupply": "130374422980722133146517297" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "11623987787421012", + "2001297418631017472", + "1649704272283435520" + ], + "expectedQty": "3650088574533171841", + "swapFee": "2191367965499202", + "reserves": [ + "18988955300311839578903818", + "50154693215022593484225176", + "61377111721912357034465440" + ], + "mAssetSupply": "130374419330633558613345456" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "491854529327851921997824", + "expectedQty": "490533982886036725565912", + "reserves": [ + "18988955300311839578903818", + "50646547744350445406223000", + "61377111721912357034465440" + ] + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "151737254972610171633664", + "expectedQty": "152058036251404594135430", + "swapFee": "91042352983566102980", + "reserves": [ + "18988955300311839578903818", + "50494489708099040812087570", + "61377111721912357034465440" + ], + "mAssetSupply": "130713307100899968733380684" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "23022416288736524369920", + "expectedQty": "23111815264444731137937", + "swapFee": "13813449773241914621", + "reserves": [ + "18988955300311839578903818", + "50494489708099040812087570", + "61353999906647912303327503" + ], + "mAssetSupply": "130690298498061005450925385" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "605873308420876", + "expectedQty": "607148343378646", + "swapFee": "363523985052", + "reserves": [ + "18988955300311839578903818", + "50494489707491892468708924", + "61353999906647912303327503" + ], + "mAssetSupply": "130690298497455495666489561" + }, + { + "type": "mintMulti", + "inputQtys": [ + "171928723260788539392", + "7349145489629364879360", + "282689719853647429632" + ], + "expectedQty": "7785046385780923510446", + "reserves": [ + "18989127229035100367443210", + "50501838852981521833588284", + "61354282596367765950757135" + ], + "mAssetSupply": "130698083543841276590000007" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "2826592823395602432", + "outputIndex": 1, + "expectedQty": "2819899214721204847", + "swapFee": "1688384760948058", + "reserves": [ + "18989127229035100367443210", + "50501836033082307112383437", + "61354285422960589346359567" + ], + "mAssetSupply": "130698083545529661350948065", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "45378523043237208064", + "expectedQty": "45175948181968164532", + "reserves": [ + "18989127229035100367443210", + "50501836033082307112383437", + "61354330801483632583567631" + ] + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "222992195483040250593280", + "expectedQty": "219776765185665861886680", + "swapFee": "133795317289824150355", + "reserves": [ + "18769350463849434505556530", + "50501836033082307112383437", + "61354330801483632583567631" + ], + "mAssetSupply": "130475270321312092892669672" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "454871498114202523926528", + "expectedQty": "453605279683227298908661", + "reserves": [ + "18769350463849434505556530", + "50956707531196509636309965", + "61354330801483632583567631" + ] + }, + { + "type": "redeemMasset", + "inputQty": "6241021730359824980377", + "expectedQtys": [ + "894415243351409830130", + "2428238316221114442472", + "2923715917616108598402" + ], + "redemptionFee": "1872306519107947494", + "reserves": [ + "18768456048606083095726400", + "50954279292880288521867493", + "61351407085566016474969229" + ], + "mAssetSupply": "130922636451571479474545450" + }, + { + "type": "redeemMasset", + "inputQty": "46887674275270184298086", + "expectedQtys": [ + "6719580929047581982388", + "18242917931186545818139", + "21965352075565212654432" + ], + "redemptionFee": "14066302282581055289", + "reserves": [ + "18761736467677035513744012", + "50936036374949101976049354", + "61329441733490451262314797" + ], + "mAssetSupply": "130875762843598491871302653" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "1678257462035823141584896", + "expectedQty": "1670527194901088688414547", + "reserves": [ + "18761736467677035513744012", + "50936036374949101976049354", + "63007699195526274403899693" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "163530733989774822998016", + "167676907827324723920896", + "118838443353066266689536" + ], + "expectedQty": "451431373982607060975986", + "reserves": [ + "18925267201666810336742028", + "51103713282776426699970250", + "63126537638879340670589229" + ], + "mAssetSupply": "132997721412482187620693186" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "793178346410963107840", + "expectedQty": "794869656895619280513", + "swapFee": "475907007846577864", + "reserves": [ + "18925267201666810336742028", + "51102918413119531080689737", + "63126537638879340670589229" + ], + "mAssetSupply": "132996928710042784504163210" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "4990739349410409349120", + "expectedQty": "5063527426133010000295", + "reserves": [ + "18930257941016220746091148", + "51102918413119531080689737", + "63126537638879340670589229" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "38781393729335114858496", + "29891543960820364869632", + "37432797340748472123392" + ], + "expectedQty": "106415724594114036953236", + "swapFee": "63887767416918573315", + "reserves": [ + "18891476547286885631232652", + "51073026869158710715820105", + "63089104841538592198465837" + ], + "mAssetSupply": "132895576512874803477210269" + }, + { + "type": "redeemMasset", + "inputQty": "68584272068752", + "expectedQtys": [ + "9746520567776", + "26349677093418", + "32549031114723" + ], + "redemptionFee": "20575281620", + "reserves": [ + "18891476547277139110664876", + "51073026869132361038726687", + "63089104841506043167351114" + ], + "mAssetSupply": "132895576512806239780423137" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "6427964832754729025011712", + "expectedQty": "6285442658093045180529018", + "swapFee": "3856778899652837415007", + "reserves": [ + "12606033889184093930135858", + "51073026869132361038726687", + "63089104841506043167351114" + ], + "mAssetSupply": "126471468458951163592826432" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "5896695503717097277489152", + "outputIndex": 0, + "expectedQty": "5509174436717747182686535", + "swapFee": "3518745435068111809803", + "reserves": [ + "7096859452466346747449323", + "56969722372849458316215839", + "63089104841506043167351114" + ], + "mAssetSupply": "126474987204386231704636235", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "5361094837579446782787584", + "expectedQty": "5296364525303774611439650", + "reserves": [ + "7096859452466346747449323", + "62330817210428905099003423", + "63089104841506043167351114" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "363561642988548915200", + "77356408841079046144", + "9503175697610952704" + ], + "expectedQty": "493625487558503813784", + "swapFee": "296353104397740932", + "reserves": [ + "7096495890823358198534123", + "62330739854020064019957279", + "63089095338330345556398410" + ], + "mAssetSupply": "131770858104202447812262101" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "6081378659658130432", + "outputIndex": 0, + "expectedQty": "5347278296208106677", + "swapFee": "3601597008266087", + "reserves": [ + "7096490543545061990427446", + "62330739854020064019957279", + "63089101419709005214528842" + ], + "mAssetSupply": "131770858107804044820528188", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemMasset", + "inputQty": "142786452021625906790", + "expectedQtys": [ + "7687426007935138306", + "67521114515325845782", + "68342625991698964325" + ], + "redemptionFee": "42835935606487772", + "reserves": [ + "7096482856119054055289140", + "62330672332905548694111497", + "63089033077083013515564517" + ], + "mAssetSupply": "131770715364187958801109170" + }, + { + "type": "mintMulti", + "inputQtys": [ + "84333471158043131904", + "76656608764149760000", + "31401028980379004928" + ], + "expectedQty": "201287698711154053494", + "reserves": [ + "7096567189590212098421044", + "62330748989514312843871497", + "63089064478111993894569445" + ], + "mAssetSupply": "131770916651886669955162664" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "10096508080783058010112", + "expectedQty": "11325449493327245629450", + "reserves": [ + "7106663697670995156431156", + "62330748989514312843871497", + "63089064478111993894569445" + ] + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "250371736982303902007296", + "expectedQty": "247128151492366829353343", + "reserves": [ + "7106663697670995156431156", + "62330748989514312843871497", + "63339436215094297796576741" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "4530684011909052394110976", + "1804138747896587935023104", + "1155549730452044714606592" + ], + "expectedQty": "7809021939198584589744503", + "reserves": [ + "11637347709580047550542132", + "64134887737410900778894601", + "64494985945546342511183333" + ], + "mAssetSupply": "139838392192070948619889960" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "690012551355442397184", + "147464554101161967616", + "227896748406304571392" + ], + "expectedQty": "1096023150723750676584", + "swapFee": "658008695651641390", + "reserves": [ + "11636657697028692108144948", + "64134740272856799616926985", + "64494758048797936206611941" + ], + "mAssetSupply": "139837296168920224869213376" + }, + { + "type": "redeemMasset", + "inputQty": "92868994240583235639705", + "expectedQtys": [ + "7725839392167252431123", + "42580499977495458829895", + "42819523895502146475269" + ], + "redemptionFee": "27860698272174970691", + "reserves": [ + "11628931857636524855713825", + "64092159772879304158097090", + "64451938524902434060136672" + ], + "mAssetSupply": "139744455035377913808544362" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "84668326912488028241920", + "outputIndex": 2, + "expectedQty": "84622071329140138934905", + "swapFee": "50409540869411335257", + "reserves": [ + "11628931857636524855713825", + "64176828099791792186339010", + "64367316453573293921201767" + ], + "mAssetSupply": "139744505444918783219879619", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "2580223499062260736", + "expectedQty": "2598821464163738968", + "swapFee": "1548134099437356", + "reserves": [ + "11628931857636524855713825", + "64176828099791792186339010", + "64367313854751829757462799" + ], + "mAssetSupply": "139744502866243418257056239" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "260051289406377029533696", + "expectedQty": "247596090805032604004363", + "swapFee": "156030773643826217720", + "reserves": [ + "11381335766831492251709462", + "64176828099791792186339010", + "64367313854751829757462799" + ], + "mAssetSupply": "139484607607610685053740263" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "1387200622106945519616", + "expectedQty": "1397412487300796675497", + "swapFee": "832320373264167311", + "reserves": [ + "11381335766831492251709462", + "64175430687304491389663513", + "64367313854751829757462799" + ], + "mAssetSupply": "139483221239308951372387958" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "339267518656313468911616", + "806375126166599349829632", + "692179837694718334992384" + ], + "expectedQty": "1843360548133599214385137", + "swapFee": "1106680337082408974015", + "reserves": [ + "11042068248175178782797846", + "63369055561137892039833881", + "63675134017057111422470415" + ], + "mAssetSupply": "137639860691175352158002821" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "6936792475176538112", + "outputIndex": 1, + "expectedQty": "7356728303436497725", + "swapFee": "4381102914896124", + "reserves": [ + "11042075184967653959335958", + "63369048204409588603336156", + "63675134017057111422470415" + ], + "mAssetSupply": "137639860695556455072898945", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemMasset", + "inputQty": "119146540725302835806208", + "expectedQtys": [ + "9555592155883734105932", + "54838313433350190754007", + "55103194005286862922249" + ], + "redemptionFee": "35743962217590850741", + "reserves": [ + "11032519592811770225230026", + "63314209890976238412582149", + "63620030823051824559548166" + ], + "mAssetSupply": "137520749898793369827943478" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "128273268040865611776", + "82476014749068673024", + "824749138913101086720" + ], + "expectedQty": "1034888742353717590212", + "swapFee": "621306029029648343", + "reserves": [ + "11032391319543729359618250", + "63314127414961489343909125", + "63619206073912911458461446" + ], + "mAssetSupply": "137519715010051016110353266" + }, + { + "type": "redeemMasset", + "inputQty": "44302221551847737602867", + "expectedQtys": [ + "3553038316113809060071", + "20390640083456863370433", + "20488892233266198581943" + ], + "redemptionFee": "13290666465554321280", + "reserves": [ + "11028838281227615550558179", + "63293736774878032480538692", + "63598717181679645259879503" + ], + "mAssetSupply": "137475426079165633927071679" + }, + { + "type": "mintMulti", + "inputQtys": [ + "766949199682653934059520", + "723841536383642366902272", + "765565797234597525716992" + ], + "expectedQty": "2282883244288366117024581", + "reserves": [ + "11795787480910269484617699", + "64017578311261674847440964", + "64364282978914242785596495" + ], + "mAssetSupply": "139758309323454000044096260" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "707461544510893568", + "762205974685666304", + "240429442241494272" + ], + "expectedQty": "1735863250674731822", + "swapFee": "1042143236346647", + "reserves": [ + "11795786773448724973724131", + "64017577549055700161774660", + "64364282738484800544102223" + ], + "mAssetSupply": "139758307587590749369364438" + }, + { + "type": "redeemMasset", + "inputQty": "178588797429696036864", + "expectedQtys": [ + "15068609747403167042", + "81779699106819576808", + "82222600059273735143" + ], + "redemptionFee": "53576639228908811", + "reserves": [ + "11795771704838977570557089", + "64017495769356593342197852", + "64364200515884741270367080" + ], + "mAssetSupply": "139758129052369958902236385" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "3500796861603794432", + "expectedQty": "3525608384178460817", + "swapFee": "2100478116962276", + "reserves": [ + "11795771704838977570557089", + "64017495769356593342197852", + "64364196990276357091906263" + ], + "mAssetSupply": "139758125553673575415404229" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "969798292837728649216", + "expectedQty": "962395462512077397124", + "reserves": [ + "11795771704838977570557089", + "64017495769356593342197852", + "64365166788569194820555479" + ] + }, + { + "type": "redeemMasset", + "inputQty": "47446202068438018424832", + "expectedQtys": [ + "4003293644090026117556", + "21726499998206250509083", + "21844493904520759714864" + ], + "redemptionFee": "14233860620531405527", + "reserves": [ + "11791768411194887544439533", + "63995769269358387091688769", + "64343322294664674060840615" + ], + "mAssetSupply": "139711655980928270005782048" + }, + { + "type": "mintMulti", + "inputQtys": [ + "12654860490340265099264", + "84530115152351068160000", + "112411030549673843621888" + ], + "expectedQty": "208695060576621213234406", + "reserves": [ + "11804423271685227809538797", + "64080299384510738159848769", + "64455733325214347904462503" + ], + "mAssetSupply": "139920351041504891219016454" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "13287161295329625636864", + "expectedQty": "13185632782365094641560", + "reserves": [ + "11804423271685227809538797", + "64080299384510738159848769", + "64469020486509677530099367" + ] + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "98332173752248240", + "expectedQty": "97580701877064178", + "reserves": [ + "11804423271685227809538797", + "64080299384510738159848769", + "64469020584841851282347607" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "117635661983438178615296", + "19080630068767889555456", + "40827394273658026328064" + ], + "expectedQty": "182592942600572630824830", + "reserves": [ + "11922058933668665988154093", + "64099380014579506049404225", + "64509847979115509308675671" + ], + "mAssetSupply": "140116129714468530821547022" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "37025416377732924702720", + "11725818966669730512896", + "77416932263630557151232" + ], + "expectedQty": "127214297511036418848205", + "swapFee": "76374403148510957883", + "reserves": [ + "11885033517290933063451373", + "64087654195612836318891329", + "64432431046851878751524439" + ], + "mAssetSupply": "139988915416957494402698817" + }, + { + "type": "redeemMasset", + "inputQty": "28310889347421834444", + "expectedQtys": [ + "2402868291649305691", + "12956984254927453669", + "13026689852503742358" + ], + "redemptionFee": "8493266804226550", + "reserves": [ + "11885031114422641414145682", + "64087641238628581391437660", + "64432418020162026247782081" + ], + "mAssetSupply": "139988887114561413785090923" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "5085794920090869065318400", + "expectedQty": "5045182992489175601618068", + "reserves": [ + "11885031114422641414145682", + "64087641238628581391437660", + "69518212940252895313100481" + ] + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "1405087739345866198089728", + "expectedQty": "1414496096303647285161352", + "swapFee": "843052643607519718853", + "reserves": [ + "11885031114422641414145682", + "62673145142324934106276308", + "69518212940252895313100481" + ], + "mAssetSupply": "143629825420348330708338116" + }, + { + "type": "redeemMasset", + "inputQty": "227209250220628725936947", + "expectedQtys": [ + "18795392139158375058771", + "99113441791070141621735", + "109938464649029335989309" + ], + "redemptionFee": "68162775066188617781", + "reserves": [ + "11866235722283483039086911", + "62574031700533863964654573", + "69408274475603865977111172" + ], + "mAssetSupply": "143402684332902768171018950" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "351916537988393784573952", + "outputIndex": 2, + "expectedQty": "371592979015893521472555", + "swapFee": "221273767818000418930", + "reserves": [ + "12218152260271876823660863", + "62574031700533863964654573", + "69036681496587972455638617" + ], + "mAssetSupply": "143402905606670586171437880", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "15468867864829553016832", + "expectedQty": "15362081121980420789645", + "reserves": [ + "12218152260271876823660863", + "62589500568398693517671405", + "69036681496587972455638617" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "751196882554270162878464", + "59723240041402605764608", + "1353242316068676574380032" + ], + "expectedQty": "2186171328623236388993194", + "reserves": [ + "12969349142826146986539327", + "62649223808440096123436013", + "70389923812656649030018649" + ], + "mAssetSupply": "145604439016415802981220719" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "713414712050158141440", + "113067345378719285248", + "1043725372492598870016" + ], + "expectedQty": "1891374838180156154395", + "swapFee": "1135506206632072936", + "reserves": [ + "12968635728114096828397887", + "62649110741094717404150765", + "70388880087284156431148633" + ], + "mAssetSupply": "145602547641577622825066324" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "449612499335693467648", + "expectedQty": "468537306998840218113", + "reserves": [ + "12969085340613432521865535", + "62649110741094717404150765", + "70388880087284156431148633" + ] + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "62082496002942490902528", + "expectedQty": "62444825281709417320676", + "swapFee": "37249497601765494541", + "reserves": [ + "12969085340613432521865535", + "62586665915813007986830089", + "70388880087284156431148633" + ], + "mAssetSupply": "145540970932379280939876450" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "10987424713511792541696", + "expectedQty": "10901739495198960097530", + "reserves": [ + "12969085340613432521865535", + "62586665915813007986830089", + "70399867511997668223690329" + ] + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "4859810099250831961358336", + "expectedQty": "4886236910503038591957060", + "swapFee": "2915886059550499176815", + "reserves": [ + "12969085340613432521865535", + "57700429005309969394873029", + "70399867511997668223690329" + ], + "mAssetSupply": "140694978458683198437792459" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "2104247774993155620864", + "outputIndex": 0, + "expectedQty": "2012136580843626651694", + "swapFee": "1255466447672743105", + "reserves": [ + "12967073204032588895213841", + "57702533253084962550493893", + "70399867511997668223690329" + ], + "mAssetSupply": "140694979714149646110535564", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mintMulti", + "inputQtys": [ + "2073149076810095965241344", + "3157830757113242176192512", + "3416648239180972986204160" + ], + "expectedQty": "8679011459173403564433965", + "reserves": [ + "15040222280842684860455185", + "60860364010198204726686405", + "73816515751178641209894489" + ], + "mAssetSupply": "149373991173323049674969529" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "604256524786071936", + "outputIndex": 0, + "expectedQty": "580821642946516209", + "swapFee": "359969922095128", + "reserves": [ + "15040221700021041913938976", + "60860364010198204726686405", + "73816516355435165995966425" + ], + "mAssetSupply": "149373991173683019597064657", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "15493800562603629477888", + "expectedQty": "15595641456591438958644", + "swapFee": "9296280337562177686", + "reserves": [ + "15040221700021041913938976", + "60860364010198204726686405", + "73800920713978574557007781" + ], + "mAssetSupply": "149358506669400753529764455" + }, + { + "type": "mintMulti", + "inputQtys": [ + "581023652886820474060800", + "463304124875009622540288", + "195336236133105967038464" + ], + "expectedQty": "1254194067930369616907423", + "reserves": [ + "15621245352907862387999776", + "61323668135073214349226693", + "73996256950111680524046245" + ], + "mAssetSupply": "150612700737331123146671878" + }, + { + "type": "redeemMasset", + "inputQty": "3061318999441719217356", + "expectedQtys": [ + "317418574098975519973", + "1246076792099696532096", + "1503579633962643965227" + ], + "redemptionFee": "918395699832515765", + "reserves": [ + "15620927934333763412479803", + "61322422058281114652694597", + "73994753370477717880081018" + ], + "mAssetSupply": "150609640336727381259970287" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "97328800813551596863488", + "expectedQty": "96661767276503295664137", + "reserves": [ + "15620927934333763412479803", + "61322422058281114652694597", + "74092082171291269476944506" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "47896074538309109415936", + "75742689934343812415488", + "13178755204630943105024" + ], + "expectedQty": "137811466196867750637165", + "reserves": [ + "15668824008872072521895739", + "61398164748215458465110085", + "74105260926495900420049530" + ], + "mAssetSupply": "150844113570200752306271589" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "358625592558683328", + "1266710835560874496", + "1086337821789494656" + ], + "expectedQty": "2708995215256200750", + "swapFee": "1626372952925475", + "reserves": [ + "15668823650246479963212411", + "61398163481504622904235589", + "74105259840158078630554874" + ], + "mAssetSupply": "150844110861205537050070839" + }, + { + "type": "mintMulti", + "inputQtys": [ + "107966267202964701184", + "52069553506337128448", + "36679802944011296768" + ], + "expectedQty": "199469385945077590547", + "reserves": [ + "15668931616513682927913595", + "61398215551058129241364037", + "74105296519961022641851642" + ], + "mAssetSupply": "150844310330591482127661386" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "2405430777009182", + "1050088749998041", + "1258201124468001" + ], + "expectedQty": "4772584223265004", + "swapFee": "2865269695776", + "reserves": [ + "15668931614108252150904413", + "61398215550008040491365996", + "74105296518702821517383641" + ], + "mAssetSupply": "150844310325818897904396382" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "571295421332119057596416", + "expectedQty": "567369283801348658514699", + "reserves": [ + "15668931614108252150904413", + "61398215550008040491365996", + "74676591940034940574980057" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "7514934682521342836736", + "5472695652034968289280", + "921008609261682163712" + ], + "expectedQty": "14104621442762426188804", + "reserves": [ + "15676446548790773493741149", + "61403688245660075459655276", + "74677512948644202257143769" + ], + "mAssetSupply": "151425784231063008989099885" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "82919519489353312108544", + "187439966147157686222848", + "256103225243460259807232" + ], + "expectedQty": "526322671328608850361806", + "swapFee": "315983192712792986008", + "reserves": [ + "15593527029301420181632605", + "61216248279512917773432428", + "74421409723400741997336537" + ], + "mAssetSupply": "150899461559734400138738079" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "24265815115928961024000", + "expectedQty": "24149817379755709985142", + "reserves": [ + "15593527029301420181632605", + "61240514094628846734456428", + "74421409723400741997336537" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "72415090783890063360", + "40873546440496259072", + "7456285254642150400" + ], + "expectedQty": "122707601263850705600", + "reserves": [ + "15593599444392204071695965", + "61240554968175287230715500", + "74421417179685996639486937" + ], + "mAssetSupply": "150923734084715419699428821" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "5761389104136559001600", + "expectedQty": "5733835735423018959601", + "reserves": [ + "15593599444392204071695965", + "61246316357279423789717100", + "74421417179685996639486937" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "3741572968818105384960", + "3366640601871698362368", + "5742539767279283863552" + ], + "expectedQty": "12909122862025696712534", + "swapFee": "7750123791490312214", + "reserves": [ + "15589857871423385966311005", + "61242949716677552091354732", + "74415674639918717355623385" + ], + "mAssetSupply": "150916558797588817021675888" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "1130749409962353475190784", + "expectedQty": "1125248872664016411786710", + "reserves": [ + "15589857871423385966311005", + "62373699126639905566545516", + "74415674639918717355623385" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "134422606125275581251584", + "252670956265928965226496", + "556253487561346539061248" + ], + "expectedQty": "942429841678422459618116", + "reserves": [ + "15724280477548661547562589", + "62626370082905834531772012", + "74971928127480063894684633" + ], + "mAssetSupply": "152984237511931255893080714" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "75609208300176505044992", + "outputIndex": 0, + "expectedQty": "72786297250724347575186", + "swapFee": "45053172414955639062", + "reserves": [ + "15651494180297937199987403", + "62626370082905834531772012", + "75047537335780240399729625" + ], + "mAssetSupply": "152984282565103670848719776", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemBassets", + "inputQtys": [ + "2877037449469473849344", + "305567402055151225143296", + "354052973358602858266624" + ], + "expectedQty": "658637592230481724445440", + "swapFee": "395419807222622608232", + "reserves": [ + "15648617142848467726138059", + "62320802680850683306628716", + "74693484362421637541463001" + ], + "mAssetSupply": "152325644972873189124274336" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "379678039819119855927296", + "expectedQty": "381309972315354423122675", + "swapFee": "227806823891471913556", + "reserves": [ + "15648617142848467726138059", + "61939492708535328883506041", + "74693484362421637541463001" + ], + "mAssetSupply": "151946194739877960740260596" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "16398038127082471424000", + "expectedQty": "15899353605963801974308", + "swapFee": "9838822876249482854", + "reserves": [ + "15632717789242503924163751", + "61939492708535328883506041", + "74693484362421637541463001" + ], + "mAssetSupply": "151929806540573754518319450" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "155722034060913989910528", + "expectedQty": "160467655743962365694290", + "reserves": [ + "15788439823303417914074279", + "61939492708535328883506041", + "74693484362421637541463001" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "3981186490806089809920", + "2887965639484446867456", + "689565743348088700928" + ], + "expectedQty": "7660318191410747451156", + "swapFee": "4598950285017458946", + "reserves": [ + "15784458636812611824264359", + "61936604742895844436638585", + "74692794796678289452762073" + ], + "mAssetSupply": "152082613878126306136562584" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "75781981854889082880", + "127107717675694915584", + "98539279085604093952" + ], + "expectedQty": "302433444515039643569", + "swapFee": "181569008113892121", + "reserves": [ + "15784382854830756935181479", + "61936477635178168741723001", + "74692696257399203848668121" + ], + "mAssetSupply": "152082311444681791096919015" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "2793862525138086731448320", + "expectedQty": "2810907533309123342153910", + "swapFee": "1676317515082852038868", + "reserves": [ + "15784382854830756935181479", + "61936477635178168741723001", + "71881788724090080506514211" + ], + "mAssetSupply": "149290125237058787217509563" + }, + { + "type": "mintMulti", + "inputQtys": [ + "3157061380972209256792064", + "3620483328787870436556800", + "206660566276301228343296" + ], + "expectedQty": "7044466801566168141406208", + "reserves": [ + "18941444235802966191973543", + "65556960963966039178279801", + "72088449290366381734857507" + ], + "mAssetSupply": "156334592038624955358915771" + }, + { + "type": "mintMulti", + "inputQtys": [ + "1535334819880427008819200", + "2172012816788611445817344", + "2220892252646325882978304" + ], + "expectedQty": "5939039462671336441638281", + "reserves": [ + "20476779055683393200792743", + "67728973780754650624097145", + "74309341543012707617835811" + ], + "mAssetSupply": "162273631501296291800554052" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "1166430722694941033627648", + "expectedQty": "1171398714914927370459967", + "swapFee": "699858433616964620176", + "reserves": [ + "20476779055683393200792743", + "67728973780754650624097145", + "73137942828097780247375844" + ], + "mAssetSupply": "161107900637034967731546580" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "4627329123011839655936", + "expectedQty": "4646749317087584819881", + "swapFee": "2776397473807103793", + "reserves": [ + "20476779055683393200792743", + "67728973780754650624097145", + "73133296078780692662555963" + ], + "mAssetSupply": "161103276084309429698994437" + }, + { + "type": "redeemMasset", + "inputQty": "2554307868741715558", + "expectedQtys": [ + "324563894291592957", + "1073527209864270437", + "1159187551575452872" + ], + "redemptionFee": "766292360622514", + "reserves": [ + "20476778731119498909199786", + "67728972707227440759826708", + "73133294919593141087103091" + ], + "mAssetSupply": "161103273530767853317901393" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "46273594511485625696256", + "expectedQty": "46467672199998148410590", + "swapFee": "27764156706891375417", + "reserves": [ + "20476778731119498909199786", + "67728972707227440759826708", + "73086827247393142938692501" + ], + "mAssetSupply": "161057027700413074583580554" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "264428702373169130897408", + "expectedQty": "259305485162991653995523", + "swapFee": "158657221423901478538", + "reserves": [ + "20217473245956507255204263", + "67728972707227440759826708", + "73086827247393142938692501" + ], + "mAssetSupply": "160792757655261329354161684" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "230039188477247258624", + "expectedQty": "234500583498088408905", + "reserves": [ + "20217703285144984502462887", + "67728972707227440759826708", + "73086827247393142938692501" + ] + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "144102187238844268544", + "expectedQty": "143403989834958743583", + "reserves": [ + "20217703285144984502462887", + "67728972707227440759826708", + "73086971349580381782961045" + ] + }, + { + "type": "redeemMasset", + "inputQty": "165272786537695343856844", + "expectedQtys": [ + "20774728453736643442501", + "69594997839196959001770", + "75100616616981575198699" + ], + "redemptionFee": "49581835961308603157", + "reserves": [ + "20196928556691247859020386", + "67659377709388243800824938", + "73011870732963400207762346" + ], + "mAssetSupply": "160627912355132928366060485" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "792605135716938573414400", + "outputIndex": 2, + "expectedQty": "792626433011969653320597", + "swapFee": "473586621474881035787", + "reserves": [ + "20196928556691247859020386", + "68451982845105182374239338", + "72219244299951430554441749" + ], + "mAssetSupply": "160628385941754403247096272", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mintMulti", + "inputQtys": [ + "7462564810570", + "19682416834897", + "1446408671835" + ], + "expectedQty": "28646065266199", + "reserves": [ + "20196928556698710423830956", + "68451982845124864791074235", + "72219244299952876963113584" + ], + "mAssetSupply": "160628385941783049312362471" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "337827109985356947128320", + "outputIndex": 2, + "expectedQty": "337783524793996920875438", + "swapFee": "201836560547419206094", + "reserves": [ + "20196928556698710423830956", + "68789809955110221738202555", + "71881460775158880042238146" + ], + "mAssetSupply": "160628587778343596731568565", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "1355693953798272259719168", + "expectedQty": "1349234536180053298392192", + "reserves": [ + "20196928556698710423830956", + "68789809955110221738202555", + "73237154728957152301957314" + ] + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "37289985037780", + "expectedQty": "37132207113050", + "reserves": [ + "20196928556698710423830956", + "68789809955147511723240335", + "73237154728957152301957314" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "18242970900435271680", + "13466352084663259136", + "13357660817174937600" + ], + "expectedQty": "45305994257348196060", + "reserves": [ + "20196946799669610859102636", + "68789823421499596386499471", + "73237168086617969476894914" + ], + "mAssetSupply": "161977867620555039585269867" + }, + { + "type": "redeemMasset", + "inputQty": "5269065988691412582", + "expectedQtys": [ + "656800347521127617", + "2237030199529813558", + "2381656887443046238" + ], + "redemptionFee": "1580719796607423", + "reserves": [ + "20196946142869263337975019", + "68789821184469396856685913", + "73237165704961082033848676" + ], + "mAssetSupply": "161977862353069770690464708" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "24647130161486650933248", + "expectedQty": "24736972723755869763141", + "swapFee": "14788278096891990559", + "reserves": [ + "20196946142869263337975019", + "68765084211745640986922772", + "73237165704961082033848676" + ], + "mAssetSupply": "161953230011186380931522019" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "818210001691844935680", + "expectedQty": "821693975236604774001", + "swapFee": "490926001015106961", + "reserves": [ + "20196946142869263337975019", + "68765084211745640986922772", + "73236344010985845429074675" + ], + "mAssetSupply": "161952412292110690101693300" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "116393630965454969241600", + "expectedQty": "118680157044275594867164", + "reserves": [ + "20313339773834718307216619", + "68765084211745640986922772", + "73236344010985845429074675" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "353376985923553910063104", + "57566730780257846034432", + "47790104144528399138816" + ], + "expectedQty": "465054896322222068234184", + "reserves": [ + "20666716759758272217279723", + "68822650942525898832957204", + "73284134115130373828213491" + ], + "mAssetSupply": "162536147345477187764794648" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "676606307272070397952", + "expectedQty": "678989209312669308748", + "swapFee": "405963784363242238", + "reserves": [ + "20666716759758272217279723", + "68821971953316586163648456", + "73284134115130373828213491" + ], + "mAssetSupply": "162535471145133700057638934" + }, + { + "type": "redeemMasset", + "inputQty": "1265321972294643561267", + "expectedQtys": [ + "160840003796619900722", + "535611261282499918779", + "570338314804844595526" + ], + "redemptionFee": "379596591688393068", + "reserves": [ + "20666555919754475597379001", + "68821436342055303663729677", + "73283563776815568983617965" + ], + "mAssetSupply": "162534206202757997102470735" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "28435937258267352", + "expectedQty": "28302053553968237", + "reserves": [ + "20666555919754475597379001", + "68821436342055303663729677", + "73283563805251506241885317" + ] + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "39015841594287005696", + "outputIndex": 1, + "expectedQty": "39892793846448125858", + "swapFee": "23851675608971242", + "reserves": [ + "20666594935596069884384697", + "68821396449261457215603819", + "73283563805251506241885317" + ], + "mAssetSupply": "162534206254911726265410214", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "1190265528294219972608", + "expectedQty": "1185376641184974611804", + "reserves": [ + "20666594935596069884384697", + "68822586714789751435576427", + "73283563805251506241885317" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "62315669990474088448", + "1005037052394559766528", + "588325635148447612928" + ], + "expectedQty": "1649957348438689708581", + "swapFee": "990568750313401866", + "reserves": [ + "20666532619926079410296249", + "68821581677737356875809899", + "73282975479616357794272389" + ], + "mAssetSupply": "162533741674204472550313437" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "607682143821958400", + "expectedQty": "596058896991198713", + "swapFee": "364609286293175", + "reserves": [ + "20666532023867182419097536", + "68821581677737356875809899", + "73282975479616357794272389" + ], + "mAssetSupply": "162533741066886938014648212" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "352470435602325225603072", + "expectedQty": "351015939845761275329792", + "reserves": [ + "20666532023867182419097536", + "69174052113339682101412971", + "73282975479616357794272389" + ] + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "13193762654399028", + "expectedQty": "13444195327093980", + "reserves": [ + "20666532037060945073496564", + "69174052113339682101412971", + "73282975479616357794272389" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "177856486429216787660800", + "98017611158151657160704", + "28645637100881842274304" + ], + "expectedQty": "307378838913177154709682", + "swapFee": "184538026163604455499", + "reserves": [ + "20488675550631728285835764", + "69076034502181530444252267", + "73254329842515475951998085" + ], + "mAssetSupply": "162577378181263717462362302" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "309482459181698703687680", + "1556611884592509434724352", + "2598013969493013404057600" + ], + "expectedQty": "4451341911405103173549998", + "swapFee": "2672408591998260860646", + "reserves": [ + "20179193091450029582148084", + "67519422617589021009527915", + "70656315873022462547940485" + ], + "mAssetSupply": "158126036269858614288812304" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "121613583703573472", + "expectedQty": "122102582238657702", + "swapFee": "72968150222144", + "reserves": [ + "20179193091450029582148084", + "67519422617589021009527915", + "70656315750919880309282783" + ], + "mAssetSupply": "158126036148317998735460976" + }, + { + "type": "mintMulti", + "inputQtys": [ + "36256165423314846613504", + "13662829932755338395648", + "32356724373769244639232" + ], + "expectedQty": "82747801944016022403659", + "reserves": [ + "20215449256873344428761588", + "67533085447521776347923563", + "70688672475293649553922015" + ], + "mAssetSupply": "158208783950262014757864635" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "876251711202988916736", + "expectedQty": "892607777785533890158", + "reserves": [ + "20216325508584547417678324", + "67533085447521776347923563", + "70688672475293649553922015" + ] + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "45304591185506362982400", + "expectedQty": "45096300420534452133431", + "reserves": [ + "20216325508584547417678324", + "67533085447521776347923563", + "70733977066479155916904415" + ] + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "480713134692966642745344", + "expectedQty": "489480194279669148438152", + "reserves": [ + "20697038643277514060423668", + "67533085447521776347923563", + "70733977066479155916904415" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "4539832663149910016", + "3974562504638017024", + "3639751639311345664" + ], + "expectedQty": "12202697696085483717", + "swapFee": "7326014226187002", + "reserves": [ + "20697034103444850910513652", + "67533081472959271709906539", + "70733973426727516605558751" + ], + "mAssetSupply": "158744240850042307806842659" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "151092498710129184", + "70454925742533648", + "268210944032238208" + ], + "expectedQty": "490966240541785120", + "swapFee": "294756598284041", + "reserves": [ + "20697033952352352200384468", + "67533081402504345967372891", + "70733973158516572573320543" + ], + "mAssetSupply": "158744240359076067265057539" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "64418457680163561472", + "expectedQty": "64130577128448548989", + "reserves": [ + "20697033952352352200384468", + "67533081402504345967372891", + "70734037576974252736882015" + ] + }, + { + "type": "redeemMasset", + "inputQty": "798035944305026457", + "expectedQtys": [ + "104016468461358861", + "339399000261271159", + "355485950581517350" + ], + "redemptionFee": "239410783291507", + "reserves": [ + "20697033848335883739025607", + "67533081063105345706101732", + "70734037221488302155364665" + ], + "mAssetSupply": "158744303691856662191871578" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "60636945991042930311168", + "outputIndex": 1, + "expectedQty": "60573485743739524598771", + "swapFee": "36219461948150194911", + "reserves": [ + "20697033848335883739025607", + "67472507577361606181502961", + "70794674167479345085675833" + ], + "mAssetSupply": "158744339911318610342066489", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemBassets", + "inputQtys": [ + "83680024042204544630784", + "142699745906191904014336", + "156543241559435538071552" + ], + "expectedQty": "383139465947034519904122", + "swapFee": "230021692583770974527", + "reserves": [ + "20613353824293679194394823", + "67329807831455414277488625", + "70638130925919909547604281" + ], + "mAssetSupply": "158361200445371575822162367" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "359769004315549823401984", + "expectedQty": "358147831507873693024033", + "reserves": [ + "20613353824293679194394823", + "67329807831455414277488625", + "70997899930235459371006265" + ] + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "171536045329955139092480", + "expectedQty": "172124081425814720873707", + "swapFee": "102921627197973083455", + "reserves": [ + "20613353824293679194394823", + "67157683750029599556614918", + "70997899930235459371006265" + ], + "mAssetSupply": "158547915153176692349177375" + }, + { + "type": "mintMulti", + "inputQtys": [ + "2064450131713604096", + "8982397361131080704", + "10825084397669898240" + ], + "expectedQty": "21823931512051237399", + "reserves": [ + "20613355888743810907998919", + "67157692732426960687695622", + "70997910755319857040904505" + ], + "mAssetSupply": "158547936977108204400414774" + }, + { + "type": "redeemMasset", + "inputQty": "9266598045941068778700", + "expectedQtys": [ + "1204420456896092516585", + "3923965578503690920555", + "4148346177697582573606" + ], + "redemptionFee": "2779979413782320633", + "reserves": [ + "20612151468286914815482334", + "67153768766848456996775067", + "70993762409142159458330899" + ], + "mAssetSupply": "158538673159041677113956707" + }, + { + "type": "redeemMasset", + "inputQty": "737782733955714881945", + "expectedQtys": [ + "95892863067500043824", + "312416060144601474121", + "330280667101671557623" + ], + "redemptionFee": "221334820186714464", + "reserves": [ + "20612055575423847315438510", + "67153456350788312395300946", + "70993432128475057786773276" + ], + "mAssetSupply": "158537935597642541585789226" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "6713125897676376064", + "expectedQty": "6590930951520632448", + "swapFee": "4027875538605825", + "reserves": [ + "20612048984492895794806062", + "67153456350788312395300946", + "70993432128475057786773276" + ], + "mAssetSupply": "158537928888544519448018987" + }, + { + "type": "mintMulti", + "inputQtys": [ + "2192156603689802173251584", + "2791774878995869847257088", + "1391907249357988548313088" + ], + "expectedQty": "6395600660103134095872478", + "reserves": [ + "22804205588182697968057646", + "69945231229784182242558034", + "72385339377833046335086364" + ], + "mAssetSupply": "164933529548647653543891465" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "1035902330421093439897600", + "outputIndex": 0, + "expectedQty": "1014316575395460929353755", + "swapFee": "618991808357117665983", + "reserves": [ + "21789889012787237038703891", + "69945231229784182242558034", + "73421241708254139774983964" + ], + "mAssetSupply": "164934148540456010661557448", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemMasset", + "inputQty": "639843203879976147353", + "expectedQtys": [ + "84506027937523564192", + "271263137730163827251", + "284743878198016851149" + ], + "redemptionFee": "191952961163992844", + "reserves": [ + "21789804506759299515139699", + "69944959966646452078730783", + "73420956964375941758132815" + ], + "mAssetSupply": "164933508889205091849402939" + }, + { + "type": "mintMulti", + "inputQtys": [ + "5628006167832066785280", + "9880211053894625656832", + "15066758659001618006016" + ], + "expectedQty": "30566968954463126727062", + "reserves": [ + "21795432512927131581924979", + "69954840177700346704387615", + "73436023723034943376138831" + ], + "mAssetSupply": "164964075858159554976130001" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "361256152285418671308800", + "expectedQty": "362460822445113158408538", + "swapFee": "216753691371251202785", + "reserves": [ + "21795432512927131581924979", + "69592379355255233545979077", + "73436023723034943376138831" + ], + "mAssetSupply": "164603036459565507556023986" + }, + { + "type": "mintMulti", + "inputQtys": [ + "151779376493835091968", + "192269351686552158208", + "486499834459366621184" + ], + "expectedQty": "830261597851777285101", + "reserves": [ + "21795584292303625417016947", + "69592571624606920098137285", + "73436510222869402742760015" + ], + "mAssetSupply": "164603866721163359333309087" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "89780253599424585924608", + "expectedQty": "89384304609037416960500", + "reserves": [ + "21795584292303625417016947", + "69592571624606920098137285", + "73526290476468827328684623" + ] + }, + { + "type": "redeemMasset", + "inputQty": "62623697627429298241536", + "expectedQtys": [ + "8285164059920955602238", + "26454251720394116420378", + "27949577820221978764952" + ], + "redemptionFee": "18787109288228789472", + "reserves": [ + "21787299128243704461414709", + "69566117372886525981716907", + "73498340898648605349919671" + ], + "mAssetSupply": "164630646115254255680817523" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "2038259833175582259019776", + "expectedQty": "2070249770307597764218802", + "reserves": [ + "23825558961419286720434485", + "69566117372886525981716907", + "73498340898648605349919671" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "78448847562860505595904", + "75033886201112778768384", + "18598303727985744674816" + ], + "expectedQty": "172874389580769636856212", + "swapFee": "103786905891996980301", + "reserves": [ + "23747110113856426214838581", + "69491083486685413202948523", + "73479742594920619605244855" + ], + "mAssetSupply": "166528021495981083808180113" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "90269902407816151040", + "58827252827161673728", + "88088745145785958400" + ], + "expectedQty": "237932645209691699609", + "swapFee": "142845294302396457", + "reserves": [ + "23747019843954018398687541", + "69491024659432586041274795", + "73479654506175473819286455" + ], + "mAssetSupply": "166527783563335874116480504" + }, + { + "type": "mintMulti", + "inputQtys": [ + "189897080930209824768", + "46245412918213402624", + "340728554545631657984" + ], + "expectedQty": "578094084218229069115", + "reserves": [ + "23747209741034948608512309", + "69491070904845504254677419", + "73479995234730019450944439" + ], + "mAssetSupply": "166528361657420092345549619" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "129115967249984874610688", + "85587451942287620177920", + "164087907699758808956928" + ], + "expectedQty": "379708369705937074575096", + "swapFee": "227961798902903987137", + "reserves": [ + "23618093773784963733901621", + "69405483452903216634499499", + "73315907327030260641987511" + ], + "mAssetSupply": "166148653287714155270974523" + }, + { + "type": "redeemMasset", + "inputQty": "3250982807937248709836", + "expectedQtys": [ + "461989794626016266408", + "1357629678052868035458", + "1434120860610278450578" + ], + "redemptionFee": "975294842381174612", + "reserves": [ + "23617631783990337717635213", + "69404125823225163766464041", + "73314473206169650363536933" + ], + "mAssetSupply": "166145403280201060403439299" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "206657296932709192433664", + "outputIndex": 0, + "expectedQty": "202834524159092704120070", + "swapFee": "123561180812000206523", + "reserves": [ + "23414797259831245013515143", + "69610783120157872958897705", + "73314473206169650363536933" + ], + "mAssetSupply": "166145526841381872403645822", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemBassets", + "inputQtys": [ + "3078297876973334560768", + "1557936277246983012352", + "3579303715994672824320" + ], + "expectedQty": "8241228367919598991927", + "swapFee": "4947705644138242340", + "reserves": [ + "23411718961954271678954375", + "69609225183880625975885353", + "73310893902453655690712613" + ], + "mAssetSupply": "166137285613013952804653895" + }, + { + "type": "redeemMasset", + "inputQty": "473588501547595776", + "expectedQtys": [ + "66717080423435973", + "198367504853149173", + "208916261653078693" + ], + "redemptionFee": "142076550464278", + "reserves": [ + "23411718895237191255518402", + "69609224985513121122736180", + "73310893693537394037633920" + ], + "mAssetSupply": "166137285139567527807522397" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "112691833588636561965056", + "expectedQty": "110972467740227773516820", + "swapFee": "67615100153181937179", + "reserves": [ + "23300746427496963482001582", + "69609224985513121122736180", + "73310893693537394037633920" + ], + "mAssetSupply": "166024660921079044427494520" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "47176435993361268736", + "463731106812688576", + "59027908223266701312" + ], + "expectedQty": "107133540083431630558", + "swapFee": "64318715279226514", + "reserves": [ + "23300699251060970120732846", + "69609224521782014310047604", + "73310834665629170770932608" + ], + "mAssetSupply": "166024553787538960995863962" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "52020902582622225432576", + "71781812661584278847488", + "16069516980844457099264" + ], + "expectedQty": "140330192868332701995832", + "swapFee": "84248664919951592152", + "reserves": [ + "23248678348478347895300270", + "69537442709120430031200116", + "73294765148648326313833344" + ], + "mAssetSupply": "165884223594670628293868130" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "663029444943119000797184", + "expectedQty": "665306296567093147119066", + "swapFee": "397817666965871400478", + "reserves": [ + "23248678348478347895300270", + "69537442709120430031200116", + "72629458852081233166714278" + ], + "mAssetSupply": "165221591967394475164471424" + }, + { + "type": "redeemMasset", + "inputQty": "7122413812674585427968", + "expectedQtys": [ + "1001909192449615421311", + "2996738224229690059350", + "3129989643962020572722" + ], + "redemptionFee": "2136724143802375628", + "reserves": [ + "23247676439285898279878959", + "69534445970896200341140766", + "72626328862437271146141556" + ], + "mAssetSupply": "165214471690305944381419084" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "841262921998835968", + "1001484960178527232", + "282868642443960128" + ], + "expectedQty": "2133392351076873965", + "swapFee": "1280803892981913", + "reserves": [ + "23247675598022976281042991", + "69534444969411240162613534", + "72626328579568628702181428" + ], + "mAssetSupply": "165214469556913593304545119" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "372467753794210889728", + "outputIndex": 1, + "expectedQty": "379138583373764138333", + "swapFee": "226801854177449952", + "reserves": [ + "23248048065776770491932719", + "69534065830827866398475201", + "72626328579568628702181428" + ], + "mAssetSupply": "165214469783715447481995071", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "430426230550016204734464", + "expectedQty": "431709759247682020512449", + "swapFee": "258255738330009722840", + "reserves": [ + "23248048065776770491932719", + "69102356071580184377962752", + "72626328579568628702181428" + ], + "mAssetSupply": "164784301808903761286983447" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "1981684122592415544508416", + "expectedQty": "1988255132816000282093552", + "swapFee": "1189010473555449326705", + "reserves": [ + "23248048065776770491932719", + "69102356071580184377962752", + "70638073446752628420087876" + ], + "mAssetSupply": "162803806696784901191801736" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "56799420466065400", + "outputIndex": 0, + "expectedQty": "55749838917681542", + "swapFee": "33949972922599", + "reserves": [ + "23248048010026931574251177", + "69102356071580184377962752", + "70638073503552048886153276" + ], + "mAssetSupply": "162803806696818851164724335", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "154086921805386630561792", + "expectedQty": "154581499777847260265041", + "swapFee": "92452153083231978337", + "reserves": [ + "23248048010026931574251177", + "69102356071580184377962752", + "70483492003774201625888235" + ], + "mAssetSupply": "162649812227166547766140880" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "2246952674576827648", + "5448161098845331456", + "2272848823845359104" + ], + "expectedQty": "9971819817974211926", + "swapFee": "5986683901125202", + "reserves": [ + "23248045763074256997423529", + "69102350623419085532631296", + "70483489730925377780529131" + ], + "mAssetSupply": "162649802255346729791928954" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "1928731218026649092096", + "expectedQty": "1900381229226818561212", + "swapFee": "1157238730815989455", + "reserves": [ + "23246145381845030178862317", + "69102350623419085532631296", + "70483489730925377780529131" + ], + "mAssetSupply": "162647874681367433958826313" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "714180463366514933760", + "expectedQty": "716467561513168702996", + "swapFee": "428508278019908960", + "reserves": [ + "23246145381845030178862317", + "69102350623419085532631296", + "70482773263363864611826135" + ], + "mAssetSupply": "162647160929412345463801513" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "668920719416686464", + "expectedQty": "666385352106417566", + "reserves": [ + "23246145381845030178862317", + "69102350623419085532631296", + "70482773932284584028512599" + ] + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "469533686351956291878912", + "expectedQty": "467826537950350701584433", + "reserves": [ + "23246145381845030178862317", + "69571884309771041824510208", + "70482773932284584028512599" + ] + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "133633402271460966400", + "expectedQty": "131656186060719457435", + "swapFee": "80180041362876579", + "reserves": [ + "23246013725658969459404882", + "69571884309771041824510208", + "70482773932284584028512599" + ], + "mAssetSupply": "163114854580525818173713691" + }, + { + "type": "redeemMasset", + "inputQty": "3923788267816075080499", + "expectedQtys": [ + "559023716349740556331", + "1673075383130012621238", + "1694980596986092704904" + ], + "redemptionFee": "1177136480344822524", + "reserves": [ + "23245454701942619718848551", + "69570211234387911811888970", + "70481078951687597935807695" + ], + "mAssetSupply": "163110931969394482443455716" + }, + { + "type": "mintMulti", + "inputQtys": [ + "2411080853414688394838016", + "1344385513045412984913920", + "1412158523310580967669760" + ], + "expectedQty": "5189899821783053893885093", + "reserves": [ + "25656535555357308113686567", + "70914596747433324796802890", + "71893237474998178903477455" + ], + "mAssetSupply": "168300831791177536337340809" + }, + { + "type": "redeemMasset", + "inputQty": "444617921254972352102", + "expectedQtys": [ + "67759221254030005655", + "187286309204997117650", + "189870911223620997733" + ], + "redemptionFee": "133385376376491705", + "reserves": [ + "25656467796136054083680912", + "70914409461124119799685240", + "71893047604086955282479722" + ], + "mAssetSupply": "168300387306641657741480412" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "128548846625048670240768", + "outputIndex": 1, + "expectedQty": "128454266772121172885646", + "swapFee": "76866523078825919500", + "reserves": [ + "25656467796136054083680912", + "70785955194351998626799594", + "72021596450712003952720490" + ], + "mAssetSupply": "168300464173164736567399912", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "1130215595667986186240", + "expectedQty": "1115893458866630046597", + "swapFee": "678129357400791711", + "reserves": [ + "25655351902677187453634315", + "70785955194351998626799594", + "72021596450712003952720490" + ], + "mAssetSupply": "168299334635698425982005383" + }, + { + "type": "redeemMasset", + "inputQty": "199300066114076278784", + "expectedQtys": [ + "30371952494339274572", + "83799578216073509975", + "85262385574186402173" + ], + "redemptionFee": "59790019834222883", + "reserves": [ + "25655321530724693114359743", + "70785871394773782553289619", + "72021511188326429766318317" + ], + "mAssetSupply": "168299135395422331739949482" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "859338540427831094018048", + "expectedQty": "856368094135818116705482", + "reserves": [ + "25655321530724693114359743", + "70785871394773782553289619", + "72880849728754260860336365" + ] + }, + { + "type": "redeemMasset", + "inputQty": "168627652426106663652556", + "expectedQtys": [ + "25567591321304177144273", + "70543814037821928458588", + "72631628443346026224588" + ], + "redemptionFee": "50588295727831999095", + "reserves": [ + "25629753939403388937215470", + "70715327580735960624831031", + "72808218100310914834111777" + ], + "mAssetSupply": "168986926425427771025001503" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "102977748385690288128", + "expectedQty": "104252911797235017048", + "reserves": [ + "25629856917151774627503598", + "70715327580735960624831031", + "72808218100310914834111777" + ] + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "24448603521494786048", + "expectedQty": "24135073063628605475", + "swapFee": "14669162112896871", + "reserves": [ + "25629832782078710998898123", + "70715327580735960624831031", + "72808218100310914834111777" + ], + "mAssetSupply": "168987006244405208878129374" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "229211621515717190352896", + "59343175130423299670016", + "129954118252758912991232" + ], + "expectedQty": "420720064327671098167690", + "swapFee": "252583588749852570442", + "reserves": [ + "25400621160562993808545227", + "70655984405605537325161015", + "72678263982058155921120545" + ], + "mAssetSupply": "168566286180077537779961684" + }, + { + "type": "redeemMasset", + "inputQty": "23473542690235030385459", + "expectedQtys": [ + "3536078927221799393280", + "9836182192531708386328", + "10117708386322105948014" + ], + "redemptionFee": "7042062807070509115", + "reserves": [ + "25397085081635772009151947", + "70646148223413005616774687", + "72668146273671833815172531" + ], + "mAssetSupply": "168542819679450109820085340" + }, + { + "type": "mintMulti", + "inputQtys": [ + "3181295457036174014545920", + "4011228000002686872190976", + "1059710296969726763466752" + ], + "expectedQty": "8272694145935915242806802", + "reserves": [ + "28578380538671946023697867", + "74657376223415692488965663", + "73727856570641560578639283" + ], + "mAssetSupply": "176815513825386025062892142" + }, + { + "type": "mintMulti", + "inputQtys": [ + "334724931179604344832", + "95697485577995026432", + "315064975078837714944" + ], + "expectedQty": "747788857049570364205", + "reserves": [ + "28578715263603125628042699", + "74657471920901270483992095", + "73728171635616639416354227" + ], + "mAssetSupply": "176816261614243074633256347" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "12093925659494620069888", + "expectedQty": "12221593915927009653156", + "reserves": [ + "28590809189262620248112587", + "74657471920901270483992095", + "73728171635616639416354227" + ] + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "1304594572327513795592192", + "expectedQty": "1307770208468126326783922", + "swapFee": "782756743396508277355", + "reserves": [ + "28590809189262620248112587", + "73349701712433144157208173", + "73728171635616639416354227" + ], + "mAssetSupply": "175524671392574884355594666" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "1688595899088275", + "250845459311722", + "5193220466521004" + ], + "expectedQty": "7133750386942562", + "swapFee": "4282819924120", + "reserves": [ + "28590809187574024349024312", + "73349701712182298697896451", + "73728171630423418949833223" + ], + "mAssetSupply": "175524671385441133968652104" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "58582705564348489662464", + "outputIndex": 0, + "expectedQty": "57770948086959082800106", + "swapFee": "35043598704037574513", + "reserves": [ + "28533038239487065266224206", + "73349701712182298697896451", + "73786754335987767439495687" + ], + "mAssetSupply": "175524706429039838006226617", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemBassets", + "inputQtys": [ + "28571214623147116462080", + "22078707543358847320064", + "13425365294510065582080" + ], + "expectedQty": "64266472223282191735793", + "swapFee": "38583033153861632020", + "reserves": [ + "28504467024863918149762126", + "73327623004638939850576387", + "73773328970693257373913607" + ], + "mAssetSupply": "175460439956816555814490824" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "5939443644920318490836992", + "expectedQty": "5919933980402140513647301", + "reserves": [ + "28504467024863918149762126", + "73327623004638939850576387", + "79712772615613575864750599" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "510253016054960960", + "477164468804509888", + "35934410112314492" + ], + "expectedQty": "1027673851653572849", + "swapFee": "616974495689557", + "reserves": [ + "28504466514610902094801166", + "73327622527474471046066499", + "79712772579679165752436107" + ], + "mAssetSupply": "181380372909544844674565276" + }, + { + "type": "redeemMasset", + "inputQty": "82215387641756316703129", + "expectedQtys": [ + "12916517232321257952687", + "33227687299314512503796", + "36121054927787201436796" + ], + "redemptionFee": "24664616292526895010", + "reserves": [ + "28491549997378580836848479", + "73294394840175156533562703", + "79676651524751378550999311" + ], + "mAssetSupply": "181298182186519380884757157" + }, + { + "type": "redeemMasset", + "inputQty": "273555478195061961785344", + "expectedQtys": [ + "42977162176728969951683", + "110558572418181358137487", + "120185682231855290758741" + ], + "redemptionFee": "82066643458518588535", + "reserves": [ + "28448572835201851866896796", + "73183836267756975175425216", + "79556465842519523260240570" + ], + "mAssetSupply": "181024708774967777441560348" + }, + { + "type": "mintMulti", + "inputQtys": [ + "4367618372015719424", + "5095239383666222080", + "617203233146667136" + ], + "expectedQty": "10113117892360477908", + "reserves": [ + "28448577202820223882616220", + "73183841362996358841647296", + "79556466459722756406907706" + ], + "mAssetSupply": "181024718888085669802038256" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "27131603856041392996352", + "outputIndex": 0, + "expectedQty": "26735171041903188888465", + "swapFee": "16233150410543963108", + "reserves": [ + "28421842031778320693727755", + "73210972966852400234643648", + "79556466459722756406907706" + ], + "mAssetSupply": "181024735121236080346001364", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "1584978808193141516009472", + "expectedQty": "1589546170792956776975101", + "swapFee": "950987284915884909605", + "reserves": [ + "28421842031778320693727755", + "73210972966852400234643648", + "77966920288929799629932605" + ], + "mAssetSupply": "179440707300327854714901497" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "31338697145388236800", + "expectedQty": "31248951139015812870", + "reserves": [ + "28421842031778320693727755", + "73211004305549545622880448", + "77966920288929799629932605" + ] + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "20570359410927411200", + "expectedQty": "20628258880303622706", + "swapFee": "12342215646556446", + "reserves": [ + "28421842031778320693727755", + "73211004305549545622880448", + "77966899660670919326309899" + ], + "mAssetSupply": "179440717991261798449859613" + }, + { + "type": "redeemMasset", + "inputQty": "57385460676881039333785", + "expectedQtys": [ + "9086628811912447750013", + "23405985450487334804034", + "24926472958368348183650" + ], + "redemptionFee": "17215638203064311800", + "reserves": [ + "28412755402966408245977742", + "73187598320099058288076414", + "77941973187712550978126249" + ], + "mAssetSupply": "179383349746223120474837628" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "38655708623934435885056", + "outputIndex": 0, + "expectedQty": "38097261983989172291009", + "swapFee": "23126965337918028933", + "reserves": [ + "28374658140982419073686733", + "73226254028722992723961470", + "77941973187712550978126249" + ], + "mAssetSupply": "179383372873188458392866561", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "11469481212604200960", + "expectedQty": "11495626083694883967", + "swapFee": "6881688727562520", + "reserves": [ + "28374658140982419073686733", + "73226242533096909029077503", + "77941973187712550978126249" + ], + "mAssetSupply": "179383361410588934516228121" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "176218795361737572352", + "expectedQty": "176715678536856976910", + "swapFee": "105731277217042543", + "reserves": [ + "28374658140982419073686733", + "73226242533096909029077503", + "77941796472034014121149339" + ], + "mAssetSupply": "179383185297524849995698312" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "1930527207845252690870272", + "117761479293796066787328", + "324906440908235870306304" + ], + "expectedQty": "2394807764139472678619749", + "swapFee": "1437747306867804289745", + "reserves": [ + "26444130933137166382816461", + "73108481053803112962290175", + "77616890031125778250843035" + ], + "mAssetSupply": "176988377533385377317078563" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "7421764968268446711152640", + "3018798669850184771436544", + "5636041305550184874246144" + ], + "expectedQty": "16165860889958426824863009", + "swapFee": "9705339737817746742963", + "reserves": [ + "19022365964868719671663821", + "70089682383952928190853631", + "71980848725575593376596891" + ], + "mAssetSupply": "160822516643426950492215554" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "13144878366355315752960", + "5220968214433209778176", + "4418434629868671991808" + ], + "expectedQty": "23030622988092130294978", + "swapFee": "13826669794732117447", + "reserves": [ + "19009221086502364355910861", + "70084461415738494981075455", + "71976430290945724704605083" + ], + "mAssetSupply": "160799486020438858361920576" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "410509522080070423805952", + "expectedQty": "419482055685372041274741", + "reserves": [ + "19419730608582434779716813", + "70084461415738494981075455", + "71976430290945724704605083" + ] + }, + { + "type": "redeemMasset", + "inputQty": "1226856638199337164", + "expectedQtys": [ + "147737441355616791", + "533174183362343916", + "547567515915785750" + ], + "redemptionFee": "368056991459801", + "reserves": [ + "19419730460844993424100022", + "70084460882564311618731539", + "71976429743378208788819333" + ], + "mAssetSupply": "161218966849635649195317954" + }, + { + "type": "redeemMasset", + "inputQty": "12847108798992061405593", + "expectedQtys": [ + "1547042191959787192589", + "5583168015884218098498", + "5733888730543706476890" + ], + "redemptionFee": "3854132639697618421", + "reserves": [ + "19418183418653033636907433", + "70078877714548427400633041", + "71970695854647665082342443" + ], + "mAssetSupply": "161206123594969296831530782" + }, + { + "type": "mintMulti", + "inputQtys": [ + "106963858058204747399168", + "141938040944455397146624", + "132001858872149645721600" + ], + "expectedQty": "381882720876289269095496", + "reserves": [ + "19525147276711238384306601", + "70220815755492882797779665", + "72102697713519814728064043" + ], + "mAssetSupply": "161588006315845586100626278" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "88395059122150539264", + "expectedQty": "90272436573609798885", + "reserves": [ + "19525235671770360534845865", + "70220815755492882797779665", + "72102697713519814728064043" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "14459031512426318135296", + "16496658084417715044352", + "37100048038302029185024" + ], + "expectedQty": "68105849738651188307994", + "reserves": [ + "19539694703282786852981161", + "70237312413577300512824017", + "72139797761558116757249067" + ], + "mAssetSupply": "161656202438020810898733157" + }, + { + "type": "redeemMasset", + "inputQty": "135328750177876110108262", + "expectedQtys": [ + "16352537907273471981351", + "58780770692137153190269", + "60372938033710914522717" + ], + "redemptionFee": "40598625053362833032", + "reserves": [ + "19523342165375513380999810", + "70178531642885163359633748", + "72079424823524405842726350" + ], + "mAssetSupply": "161520914286467988151457927" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "1989746839572435370508288", + "expectedQty": "1997538238084720488974817", + "swapFee": "1193848103743461222304", + "reserves": [ + "19523342165375513380999810", + "68180993404800442870658931", + "72079424823524405842726350" + ], + "mAssetSupply": "159532361294999296242171943" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "14978767963485349347328", + "expectedQty": "14666880870275273272978", + "swapFee": "8987260778091209608", + "reserves": [ + "19508675284505238107726832", + "68180993404800442870658931", + "72079424823524405842726350" + ], + "mAssetSupply": "159517391514296588984034223" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "928267561497154405007360", + "outputIndex": 0, + "expectedQty": "903237304356581699400750", + "swapFee": "554184726027827263015", + "reserves": [ + "18605437980148656408326082", + "68180993404800442870658931", + "73007692385021560247733710" + ], + "mAssetSupply": "159517945699022616811297238", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "1226698478309076658814976", + "outputIndex": 1, + "expectedQty": "1224899972768298815988641", + "swapFee": "732049003017450272917", + "reserves": [ + "18605437980148656408326082", + "66956093432032144054670290", + "74234390863330636906548686" + ], + "mAssetSupply": "159518677748025634261570155", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemMasset", + "inputQty": "530672514434647182226227", + "expectedQtys": [ + "61876343736425011233161", + "222676738750737415651241", + "246882265874338428561356" + ], + "redemptionFee": "159201754330394154667", + "reserves": [ + "18543561636412231397092921", + "66733416693281406639019049", + "73987508597456298477987330" + ], + "mAssetSupply": "158988164435345317473498595" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "126176782040942164049920", + "150411004835461511249920", + "131233356182745088262144" + ], + "expectedQty": "409351173597444385036848", + "swapFee": "245758159053898970404", + "reserves": [ + "18417384854371289233043001", + "66583005688445945127769129", + "73856275241273553389725186" + ], + "mAssetSupply": "158578813261747873088461747" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "101671424617905930240", + "106195885591636606976", + "919450132453766201344" + ], + "expectedQty": "1124125408763133771083", + "swapFee": "674880173361897401", + "reserves": [ + "18417283182946671327112761", + "66582899492560353491162153", + "73855355791141099623523842" + ], + "mAssetSupply": "158577689136339109954690664" + }, + { + "type": "mintMulti", + "inputQtys": [ + "10079605736761708249088", + "83175451298364215263232", + "464640918023211952635904" + ], + "expectedQty": "555178421445402793006943", + "reserves": [ + "18427362788683433035361849", + "66666074943858717706425385", + "74319996709164311576159746" + ], + "mAssetSupply": "159132867557784512747697607" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "5483335878312647", + "outputIndex": 0, + "expectedQty": "5324533617489137", + "swapFee": "3271652980415", + "reserves": [ + "18427362783358899417872712", + "66666074943858717706425385", + "74319996714647647454472393" + ], + "mAssetSupply": "159132867557787784400678022", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "359104706600166227968", + "expectedQty": "357101949689771270343", + "reserves": [ + "18427362783358899417872712", + "66666074943858717706425385", + "74320355819354247620700361" + ] + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "931695079708658570887168", + "outputIndex": 1, + "expectedQty": "929980946388663624886924", + "swapFee": "555870095913203196078", + "reserves": [ + "18427362783358899417872712", + "65736093997470054081538461", + "75252050899062906191587529" + ], + "mAssetSupply": "159133780529833387375144443", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "2303422889090107784036352", + "expectedQty": "2314955451901225610886123", + "swapFee": "1382053733454064670421", + "reserves": [ + "18427362783358899417872712", + "65736093997470054081538461", + "72937095447161680580701406" + ], + "mAssetSupply": "156831739694476733655778512" + }, + { + "type": "mintMulti", + "inputQtys": [ + "138230363028988329984", + "116139093038478196736", + "140182191667952697344" + ], + "expectedQty": "396413267598638860432", + "reserves": [ + "18427501013721928406202696", + "65736210136563092559735197", + "72937235629353348533398750" + ], + "mAssetSupply": "156832136107744332294638944" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "177083790341749243904", + "expectedQty": "176303553873083490462", + "reserves": [ + "18427501013721928406202696", + "65736387220353434308979101", + "72937235629353348533398750" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "2193969874884", + "7874005737172", + "9879922419581" + ], + "expectedQty": "19909168030149", + "reserves": [ + "18427501013724122376077580", + "65736387220361308314716273", + "72937235629363228455818331" + ], + "mAssetSupply": "156832312411318114546159555" + }, + { + "type": "redeemMasset", + "inputQty": "346864892498439977513779", + "expectedQtys": [ + "40743744091678182515878", + "145345076167578643838821", + "161266362759875479903021" + ], + "redemptionFee": "104059467749531993254", + "reserves": [ + "18386757269632444193561702", + "65591042144193729670877452", + "72775969266603352975915310" + ], + "mAssetSupply": "156485551578287424100639030" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "482478235093041873420288", + "951664417315701586395136", + "599114011617894338658304" + ], + "expectedQty": "2036855214082306283430324", + "swapFee": "1222846836551314558793", + "reserves": [ + "17904279034539402320141414", + "64639377726878028084482316", + "72176855254985458637257006" + ], + "mAssetSupply": "154448696364205117817208706" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "9321379565298669060096", + "expectedQty": "9269387374369539038265", + "reserves": [ + "17904279034539402320141414", + "64639377726878028084482316", + "72186176634550757306317102" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "361361751626366991728640", + "103999593609405050912768", + "333016475953659828502528" + ], + "expectedQty": "804641674170867006828066", + "swapFee": "483074849412167504599", + "reserves": [ + "17542917282913035328412774", + "64535378133268623033569548", + "71853160158597097477814574" + ], + "mAssetSupply": "153653324077408620349418905" + }, + { + "type": "redeemMasset", + "inputQty": "132387442915838468816896", + "expectedQtys": [ + "15110413235258995369537", + "55586891060427982702596", + "61889988121483190089817" + ], + "redemptionFee": "39716232874751540645", + "reserves": [ + "17527806869677776333043237", + "64479791242208195050866952", + "71791270170475614287724757" + ], + "mAssetSupply": "153520976350725656632142654" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "1676526832040093679616", + "expectedQty": "1717149992806981208182", + "reserves": [ + "17529483396509816426722853", + "64479791242208195050866952", + "71791270170475614287724757" + ] + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "1495468282630644170752", + "expectedQty": "1503099304016512912056", + "swapFee": "897280969578386502", + "reserves": [ + "17529483396509816426722853", + "64479791242208195050866952", + "71789767071171597774812701" + ], + "mAssetSupply": "153521198929716802547566586" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "446582590928272261906432", + "expectedQty": "448849427353984723312351", + "swapFee": "267949554556963357143", + "reserves": [ + "17529483396509816426722853", + "64479791242208195050866952", + "71340917643817613051500350" + ], + "mAssetSupply": "153074884288343087249017297" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "25748534218804461568", + "expectedQty": "25851796196013208358", + "swapFee": "15449120531282676", + "reserves": [ + "17529483396509816426722853", + "64479765390411999037658594", + "71340917643817613051500350" + ], + "mAssetSupply": "153074858555257988975838405" + }, + { + "type": "mintMulti", + "inputQtys": [ + "4793247057824584826880", + "16765914456318759927808", + "1725282396868865687552" + ], + "expectedQty": "23313070271786653480869", + "reserves": [ + "17534276643567641011549733", + "64496531304868317797586402", + "71342642926214481917187902" + ], + "mAssetSupply": "153098171625529775629319274" + }, + { + "type": "mintMulti", + "inputQtys": [ + "24568989262341912", + "18810316256776832", + "5469589654782807" + ], + "expectedQty": "49322767115430462", + "reserves": [ + "17534276668136630273891645", + "64496531323678634054363234", + "71342642931684071571970709" + ], + "mAssetSupply": "153098171674852542744749736" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "688359494918369", + "expectedQty": "691833745396768", + "swapFee": "413015696951", + "reserves": [ + "17534276668136630273891645", + "64496531323678634054363234", + "71342642930992237826573941" + ], + "mAssetSupply": "153098171674164596265528318" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "1456007587875586714894336", + "outputIndex": 2, + "expectedQty": "1456314353488448948889413", + "swapFee": "869513320501102386786", + "reserves": [ + "17534276668136630273891645", + "65952538911554220769257570", + "69886328577503788877684528" + ], + "mAssetSupply": "153099041187485097367915104", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemMasset", + "inputQty": "725931994052762704596172", + "expectedQtys": [ + "83115307055793920527260", + "312625700306436586331074", + "331272499496759458597144" + ], + "redemptionFee": "217779598215828811378", + "reserves": [ + "17451161361080836353364385", + "65639913211247784182926496", + "69555056078007029419087384" + ], + "mAssetSupply": "152373326973030550492130310" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "393758097301163147264", + "expectedQty": "403215706469308244331", + "reserves": [ + "17451555119178137516511649", + "65639913211247784182926496", + "69555056078007029419087384" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "56063795612828426240", + "54257508985936961536", + "11329983527615266816" + ], + "expectedQty": "122675327622693372797", + "reserves": [ + "17451611182973750344937889", + "65639967468756770119888032", + "69555067407990557034354200" + ], + "mAssetSupply": "152373852864064642493747438" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "177360410874048608731136", + "expectedQty": "181577281807982259159123", + "reserves": [ + "17628971593847798953669025", + "65639967468756770119888032", + "69555067407990557034354200" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "793486772376816320512", + "1341133903136378585088", + "1770541763121157242880" + ], + "expectedQty": "3908007440077048922558", + "swapFee": "2346212191361045981", + "reserves": [ + "17628178107075422137348513", + "65638626334853633741302944", + "69553296866227435877111320" + ], + "mAssetSupply": "152551522138432547703984003" + }, + { + "type": "mintMulti", + "inputQtys": [ + "59854927741777019404288", + "191617088250528636338176", + "143694320817156525129728" + ], + "expectedQty": "394896262230536833430943", + "reserves": [ + "17688033034817199156752801", + "65830243423104162377641120", + "69696991187044592402241048" + ], + "mAssetSupply": "152946418400663084537414946" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "389109509718438215417856", + "expectedQty": "390724122276992558243263", + "swapFee": "233465705831062929250", + "reserves": [ + "17688033034817199156752801", + "65439519300827169819397857", + "69696991187044592402241048" + ], + "mAssetSupply": "152557542356650477384926340" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "2923356699392847380480", + "expectedQty": "2937290322074521249452", + "swapFee": "1754014019635708428", + "reserves": [ + "17688033034817199156752801", + "65439519300827169819397857", + "69694053896722517880991596" + ], + "mAssetSupply": "152554620753965104173254288" + }, + { + "type": "redeemMasset", + "inputQty": "4021241290524939675238", + "expectedQtys": [ + "466105255165085456461", + "1724425987985939395255", + "1836539128521408738016" + ], + "redemptionFee": "1206372387157481902", + "reserves": [ + "17687566929562034071296340", + "65437794874839183880002602", + "69692217357593996472253580" + ], + "mAssetSupply": "152550600719046966391060952" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "2702208942026162962432", + "2261265573874279645184", + "2777561090737978212352" + ], + "expectedQty": "7778688566936458514308", + "swapFee": "4670015149251425964", + "reserves": [ + "17684864720620007908333908", + "65435533609265309600357418", + "69689439796503258494041228" + ], + "mAssetSupply": "152542822030480029932546644" + }, + { + "type": "mintMulti", + "inputQtys": [ + "285364725510599126024192", + "167411138409453947191296", + "71005403578943013912576" + ], + "expectedQty": "529196645095565746956783", + "reserves": [ + "17970229446130607034358100", + "65602944747674763547548714", + "69760445200082201507953804" + ], + "mAssetSupply": "153072018675575595679503427" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "30477172034143", + "expectedQty": "30317329621978", + "reserves": [ + "17970229446130607034358100", + "65602944747674763547548714", + "69760445200112678679987947" + ] + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "2272418635761468928", + "expectedQty": "2260500571809650576", + "reserves": [ + "17970229446130607034358100", + "65602944747674763547548714", + "69760447472531314441456875" + ] + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "302836226026354212077568", + "expectedQty": "309597543030265926138759", + "reserves": [ + "18273065672156961246435668", + "65602944747674763547548714", + "69760447472531314441456875" + ] + }, + { + "type": "redeemMasset", + "inputQty": "1021292800184439193", + "expectedQtys": [ + "121634860475061106", + "436686715535382105", + "464361177660976829" + ], + "redemptionFee": "306387840055331", + "reserves": [ + "18273065550522100771374562", + "65602944310988048012166609", + "69760447008170136780480046" + ], + "mAssetSupply": "153381617458150338400530878" + }, + { + "type": "redeemMasset", + "inputQty": "272382935355441792679936", + "expectedQtys": [ + "32440511018743547232615", + "116466119595451241995852", + "123847010978207650855855" + ], + "redemptionFee": "81714880606632537803", + "reserves": [ + "18240625039503357224141947", + "65486478191392596770170757", + "69636599997191929129624191" + ], + "mAssetSupply": "153109316237675503240388745" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "941871826790416390291456", + "expectedQty": "937549914651286877434551", + "reserves": [ + "18240625039503357224141947", + "66428350018183013160462213", + "69636599997191929129624191" + ] + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "41183869482374354960384", + "expectedQty": "42098388658612819166539", + "reserves": [ + "18281808908985731579102331", + "66428350018183013160462213", + "69636599997191929129624191" + ] + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "29923344217219767730176", + "expectedQty": "30044491718037299078440", + "swapFee": "17954006530331860638", + "reserves": [ + "18281808908985731579102331", + "66398305526464975861383773", + "69636599997191929129624191" + ], + "mAssetSupply": "154059059150774713501120297" + }, + { + "type": "mintMulti", + "inputQtys": [ + "33033789312338434719744", + "12882539039709741449216", + "5566921575715815030784" + ], + "expectedQty": "52125650950151474757490", + "reserves": [ + "18314842698298070013822075", + "66411188065504685602832989", + "69642166918767644944654975" + ], + "mAssetSupply": "154111184801724864975877787" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "3921871851968899579904", + "expectedQty": "3937705474344969067461", + "swapFee": "2353123111181339747", + "reserves": [ + "18314842698298070013822075", + "66407250360030340633765528", + "69642166918767644944654975" + ], + "mAssetSupply": "154107265282996007257637630" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "12086602895782081200128", + "expectedQty": "12141146826368577726757", + "swapFee": "7251961737469248720", + "reserves": [ + "18314842698298070013822075", + "66407250360030340633765528", + "69630025771941276366928218" + ], + "mAssetSupply": "154095185932061962645686222" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "115541232951084154880", + "expectedQty": "114953232436812659464", + "reserves": [ + "18314842698298070013822075", + "66407250360030340633765528", + "69630141313174227451083098" + ] + }, + { + "type": "redeemMasset", + "inputQty": "1459244915043215605760", + "expectedQtys": [ + "173385062175730265634", + "628671805827909298744", + "659182641083315489018" + ], + "redemptionFee": "437773474512964681", + "reserves": [ + "18314669313235894283556441", + "66406621688224512724466784", + "69629482130533144135594080" + ], + "mAssetSupply": "154093842078152830755704607" + }, + { + "type": "redeemMasset", + "inputQty": "47347518917865", + "expectedQtys": [ + "5625753721537", + "20398255229611", + "21388227738381" + ], + "redemptionFee": "14204255675", + "reserves": [ + "18314669313230268529834904", + "66406621688204114469237173", + "69629482130511755907855699" + ], + "mAssetSupply": "154093842078105497441042417" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "262312597215137822146560", + "44883315805899976605696", + "465918837843588246667264" + ], + "expectedQty": "776376292515790174307119", + "swapFee": "466105438772737747232", + "reserves": [ + "18052356716015130707688344", + "66361738372398214492631477", + "69163563292668167661188435" + ], + "mAssetSupply": "153317465785589707266735298" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "1484360171076875674714112", + "outputIndex": 1, + "expectedQty": "1482527847096101951624167", + "swapFee": "885975074951988480620", + "reserves": [ + "18052356716015130707688344", + "64879210525302112541007310", + "70647923463745043335902547" + ], + "mAssetSupply": "153318351760664659255215918", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemMasset", + "inputQty": "496647996085716836260249", + "expectedQtys": [ + "58459910276029311795692", + "210101810292944748833858", + "228782941299533067682729" + ], + "redemptionFee": "148994398825715050878", + "reserves": [ + "17993896805739101395892652", + "64669108715009167792173452", + "70419140522445510268219818" + ], + "mAssetSupply": "152821852758977768134006547" + }, + { + "type": "redeemMasset", + "inputQty": "65740802703069059481", + "expectedQtys": [ + "7738280347017168993", + "27810968265020959985", + "30283771049797217776" + ], + "redemptionFee": "19722240810920717", + "reserves": [ + "17993889067458754378723659", + "64669080904040902771213467", + "70419110238674460471002042" + ], + "mAssetSupply": "152821787037897305875867783" + }, + { + "type": "redeemMasset", + "inputQty": "670541629458831376384", + "expectedQtys": [ + "78928745919555171401", + "283665717643943768204", + "308887758453567163046" + ], + "redemptionFee": "201162488837649412", + "reserves": [ + "17993810138712834823552258", + "64668797238323258827445263", + "70418801350916006903838996" + ], + "mAssetSupply": "152821116697430335882140811" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "1385504707949309697458176", + "outputIndex": 2, + "expectedQty": "1420512304406304536691875", + "swapFee": "848713458549566053352", + "reserves": [ + "19379314846662144521010434", + "64668797238323258827445263", + "68998289046509702367147121" + ], + "mAssetSupply": "152821965410888885448194163", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "1565128463870124621824", + "outputIndex": 1, + "expectedQty": "1600504134857715883602", + "swapFee": "956926011618197307", + "reserves": [ + "19380879975126014645632258", + "64667196734188401111561661", + "68998289046509702367147121" + ], + "mAssetSupply": "152821966367814897066391470", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mintMulti", + "inputQtys": [ + "3836376337405195583488", + "5354161466855252819968", + "4558407388661305311232" + ], + "expectedQty": "13778239509690968427808", + "reserves": [ + "19384716351463419841215746", + "64672550895655256364381629", + "69002847453898363672458353" + ], + "mAssetSupply": "152835744607324588034819278" + }, + { + "type": "redeemMasset", + "inputQty": "14568808015150294630", + "expectedQtys": [ + "1847260848662748212", + "6162951734069295271", + "6575606072162700158" + ], + "redemptionFee": "4370642404545088", + "reserves": [ + "19384714504202571178467534", + "64672544732703522295086358", + "69002840878292291509758195" + ], + "mAssetSupply": "152835730042887215289069736" + }, + { + "type": "redeemMasset", + "inputQty": "2356944191770738278", + "expectedQtys": [ + "298850168346887477", + "997043359942180885", + "1063802647618072164" + ], + "redemptionFee": "707083257531221", + "reserves": [ + "19384714205352402831580057", + "64672543735660162352905473", + "69002839814489643891686031" + ], + "mAssetSupply": "152835727686650106775862679" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "401750579639939380543488", + "outputIndex": 2, + "expectedQty": "401736671145041901010688", + "swapFee": "240053226178278009738", + "reserves": [ + "19384714205352402831580057", + "65074294315300101733448961", + "68601103143344601990675343" + ], + "mAssetSupply": "152835967739876285053872417", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "51024964861072261120", + "expectedQty": "51994160933480456433", + "reserves": [ + "19384765230317263903841177", + "65074294315300101733448961", + "68601103143344601990675343" + ] + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "4391856639531381738700800", + "outputIndex": 2, + "expectedQty": "4472088935923586040429744", + "swapFee": "2675750400168496285931", + "reserves": [ + "23776621869848645642541977", + "65074294315300101733448961", + "64129014207421015950245599" + ], + "mAssetSupply": "152838695484437387030614781", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mintMulti", + "inputQtys": [ + "1771563586905676972032", + "2332189115967692079104", + "677137803713785495552" + ], + "expectedQty": "4791655036659945507696", + "reserves": [ + "23778393433435551319514009", + "65076626504416069425528065", + "64129691345224729735741151" + ], + "mAssetSupply": "152843487139474046976122477" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "5501062359706094592", + "expectedQty": "5483631953582751614", + "reserves": [ + "23778393433435551319514009", + "65076626504416069425528065", + "64129696846287089441835743" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "7221562318482154979328", + "1329460741073612832768", + "1594539813781478309888" + ], + "expectedQty": "10220104241948751162932", + "swapFee": "6135743991564189211", + "reserves": [ + "23771171871117069164534681", + "65075297043674995812695297", + "64128102306473307963525855" + ], + "mAssetSupply": "152833272518864051807711159" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "2444477974028109742080", + "2238350679199729319936", + "1363026186205088186368" + ], + "expectedQty": "6062591094307018017539", + "swapFee": "3639738499684021223", + "reserves": [ + "23768727393143041054792601", + "65073058692995796083375361", + "64126739280287102875339487" + ], + "mAssetSupply": "152827209927769744789693620" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "3140337731557245", + "outputIndex": 0, + "expectedQty": "3092132660442263", + "swapFee": "1877990470249", + "reserves": [ + "23768727390050908394350338", + "65073058696136133814932606", + "64126739280287102875339487" + ], + "mAssetSupply": "152827209927771622780163869", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "41437942042754331705344", + "expectedQty": "41919144838709371140719", + "reserves": [ + "23810165332093662726055682", + "65073058696136133814932606", + "64126739280287102875339487" + ] + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "585206865146176667648", + "expectedQty": "578153960258188176961", + "swapFee": "351124119087706000", + "reserves": [ + "23809587178133404537878721", + "65073058696136133814932606", + "64126739280287102875339487" + ], + "mAssetSupply": "152868544216869305062342940" + }, + { + "type": "mintMulti", + "inputQtys": [ + "930511315011479535616", + "202721713058986590208", + "1789510758044152627200" + ], + "expectedQty": "2927203866855416848256", + "reserves": [ + "23810517689448416017414337", + "65073261417849192801522814", + "64128528791045147027966687" + ], + "mAssetSupply": "152871471420736160479191196" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "35391927611661624541184", + "expectedQty": "35487347054992597634556", + "swapFee": "21235156566996974724", + "reserves": [ + "23810517689448416017414337", + "65037774070794200203888258", + "64128528791045147027966687" + ], + "mAssetSupply": "152836100728281065851624736" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "156673896819757454196736", + "expectedQty": "156157916583965672611196", + "reserves": [ + "23810517689448416017414337", + "65194447967613957658084994", + "64128528791045147027966687" + ] + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "490347086684125115973632", + "expectedQty": "488785988757726383763890", + "reserves": [ + "23810517689448416017414337", + "65194447967613957658084994", + "64618875877729272143940319" + ] + }, + { + "type": "redeemMasset", + "inputQty": "15983278222044062705254", + "expectedQtys": [ + "2478846548841886880203", + "6787212040323997785001", + "6727290836290175848715" + ], + "redemptionFee": "4794983466613218811", + "reserves": [ + "23808038842899574130534134", + "65187660755573633660299993", + "64612148586892981968091604" + ], + "mAssetSupply": "153465066150384180458513379" + }, + { + "type": "redeemMasset", + "inputQty": "4939906135178072607948", + "expectedQtys": [ + "766130020680013603084", + "2097704233948019307099", + "2079184558614727218664" + ], + "redemptionFee": "1481971840553421782", + "reserves": [ + "23807272712878894116931050", + "65185563051339685640992894", + "64610069402334367240872940" + ], + "mAssetSupply": "153460127726220842939327213" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "53352011887159961190400", + "41452909136164069310464", + "607483705296674357248" + ], + "expectedQty": "95899962898359913726442", + "swapFee": "57574522452487440700", + "reserves": [ + "23753920700991734155740650", + "65144110142203521571682430", + "64609461918629070566515692" + ], + "mAssetSupply": "153364227763322483025600771" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "136205674075187836878848", + "expectedQty": "135766143789875976178404", + "reserves": [ + "23753920700991734155740650", + "65144110142203521571682430", + "64745667592704258403394540" + ] + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "522866572714435697180672", + "outputIndex": 2, + "expectedQty": "522488354196093180626613", + "swapFee": "312680417850293569506", + "reserves": [ + "23753920700991734155740650", + "65666976714917957268863102", + "64223179238508165222767927" + ], + "mAssetSupply": "153500306587530209295348681", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "647610515188098126577664", + "expectedQty": "639470261479477376212783", + "swapFee": "388566309112858875946", + "reserves": [ + "23114450439512256779527867", + "65666976714917957268863102", + "64223179238508165222767927" + ], + "mAssetSupply": "152853084638651224027646963" + }, + { + "type": "mintMulti", + "inputQtys": [ + "682339834806767583232", + "130750274617216663552", + "602283501462404726784" + ], + "expectedQty": "1421448546565595414749", + "reserves": [ + "23115132779347063547111099", + "65667107465192574485526654", + "64223781522009627627494711" + ], + "mAssetSupply": "152854506087197789623061712" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "1645314881124209000448", + "expectedQty": "1649751091640691970474", + "swapFee": "987188928674525400", + "reserves": [ + "23115132779347063547111099", + "65667107465192574485526654", + "64222131770917986935524237" + ], + "mAssetSupply": "152852861759505594088586664" + }, + { + "type": "redeemMasset", + "inputQty": "2562652456885667915366", + "expectedQtys": [ + "387420165452067903111", + "1100610664095101917133", + "1076392212577044467934" + ], + "redemptionFee": "768795737065700374", + "reserves": [ + "23114745359181611479207988", + "65666006854528479383609521", + "64221055378705409891056303" + ], + "mAssetSupply": "152850299875844445486371672" + }, + { + "type": "mintMulti", + "inputQtys": [ + "4154446453764803002368", + "13034224041753882624", + "3865483776829850386432" + ], + "expectedQty": "8072017119091769623409", + "reserves": [ + "23118899805635376282210356", + "65666019888752521137492145", + "64224920862482239741442735" + ], + "mAssetSupply": "152858371892963537255995081" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "169600586360523004575744", + "expectedQty": "169008677952684130783549", + "reserves": [ + "23118899805635376282210356", + "65835620475113044142067889", + "64224920862482239741442735" + ] + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "17368473721165087506432", + "expectedQty": "17415184671657356330429", + "swapFee": "10421084232699052503", + "reserves": [ + "23118899805635376282210356", + "65835620475113044142067889", + "64207505677810582385112306" + ], + "mAssetSupply": "153010022518279288998324701" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "221031588914635613405184", + "outputIndex": 1, + "expectedQty": "220941027838027627709714", + "swapFee": "132182480365340500288", + "reserves": [ + "23118899805635376282210356", + "65614679447275016514358175", + "64428537266725217998517490" + ], + "mAssetSupply": "153010154700759654338824989", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemMasset", + "inputQty": "85347925413667934516019", + "expectedQtys": [ + "12891681568940729606759", + "36588400001465468882169", + "35926977208179707144578" + ], + "redemptionFee": "25604377624100380354", + "reserves": [ + "23106008124066435552603597", + "65578091047273551045476006", + "64392610289517038291372912" + ], + "mAssetSupply": "152924832379723610504689324" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "5428266068284650918248448", + "expectedQty": "5482545735420221263838123", + "reserves": [ + "28534274192351086470852045", + "65578091047273551045476006", + "64392610289517038291372912" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "5357953112904217657344", + "10122423434114355953664", + "405698425380863541248" + ], + "expectedQty": "15901687969707909155438", + "reserves": [ + "28539632145463990688509389", + "65588213470707665401429670", + "64393015987942419154914160" + ], + "mAssetSupply": "158423279803113539677682885" + }, + { + "type": "mintMulti", + "inputQtys": [ + "2159574796684317687808", + "12760766583821758889984", + "4587327022790982238208" + ], + "expectedQty": "19480915864478501118733", + "reserves": [ + "28541791720260675006197197", + "65600974237291487160319654", + "64397603314965210137152368" + ], + "mAssetSupply": "158442760718978018178801618" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "1088685954567915299667968", + "232244921115046194446336", + "81660894426875765456896" + ], + "expectedQty": "1410791528852198021333876", + "swapFee": "846983107175624187312", + "reserves": [ + "27453105765692759706529229", + "65368729316176440965873318", + "64315942420538334371695472" + ], + "mAssetSupply": "157031969190125820157467742" + }, + { + "type": "mintMulti", + "inputQtys": [ + "96050527947605812445184", + "46656600008185834635264", + "101022230875585504083968" + ], + "expectedQty": "244169505474293958131719", + "reserves": [ + "27549156293640365518974413", + "65415385916184626800508582", + "64416964651413919875779440" + ], + "mAssetSupply": "157276138695600114115599461" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "49123921402333908434944", + "expectedQty": "48997699363544265912616", + "reserves": [ + "27549156293640365518974413", + "65415385916184626800508582", + "64466088572816253784214384" + ] + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "2503961621178713899008", + "expectedQty": "2525449277195134847178", + "reserves": [ + "27551660255261544232873421", + "65415385916184626800508582", + "64466088572816253784214384" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "556117149441203", + "6888517586797661184", + "2387309099211051008" + ], + "expectedQty": "9251703343770501586", + "reserves": [ + "27551660255817661382314624", + "65415392804702213598169766", + "64466090960125352995265392" + ], + "mAssetSupply": "157327671095944197286860841" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "38354104524761235456", + "expectedQty": "38004985450510859363", + "swapFee": "23012462714856741", + "reserves": [ + "27551622250832210871455261", + "65415392804702213598169766", + "64466090960125352995265392" + ], + "mAssetSupply": "157327632764852135240482126" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "3136364794346291593216", + "outputIndex": 0, + "expectedQty": "3099443886007880572942", + "swapFee": "1876752313713023907", + "reserves": [ + "27548522806946202990882319", + "65418529169496559889762982", + "64466090960125352995265392" + ], + "mAssetSupply": "157327634641604448953506033", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemBassets", + "inputQtys": [ + "23621397167133966729216", + "23693180664061009854464", + "13566522567641549242368" + ], + "expectedQty": "60985239481631141384499", + "swapFee": "36613111555912232170", + "reserves": [ + "27524901409779069024153103", + "65394835988832498879908518", + "64452524437557711446023024" + ], + "mAssetSupply": "157266649402122817812121534" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "295236263365237803057152", + "expectedQty": "295816592905413984803477", + "swapFee": "177141758019142681834", + "reserves": [ + "27524901409779069024153103", + "65394835988832498879908518", + "64156707844652297461219547" + ], + "mAssetSupply": "156971590280515599151746216" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "12802192535969886208", + "12819316509566709760", + "5576467373520422912" + ], + "expectedQty": "31258584122384874900", + "swapFee": "18766410319622698", + "reserves": [ + "27524888607586533054266895", + "65394823169515989313198758", + "64156702268184923940796635" + ], + "mAssetSupply": "156971559021931476766871316" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "6000715961168746774528", + "outputIndex": 1, + "expectedQty": "5998060329221807588135", + "swapFee": "3591259914993906117", + "reserves": [ + "27524888607586533054266895", + "65388825109186767505610623", + "64162702984146092687571163" + ], + "mAssetSupply": "156971562613191391760777433", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "568574477803840", + "expectedQty": "569773807685879", + "swapFee": "341144686682", + "reserves": [ + "27524888607586533054266895", + "65388825108616993697924744", + "64162702984146092687571163" + ], + "mAssetSupply": "156971562612623158427660275" + }, + { + "type": "mintMulti", + "inputQtys": [ + "1480999695800197586092032", + "475775599623797240496128", + "1678988775194577728438272" + ], + "expectedQty": "3642480504374042157945137", + "reserves": [ + "29005888303386730640358927", + "65864600708240790938420872", + "65841691759340670416009435" + ], + "mAssetSupply": "160614043116997200585605412" + }, + { + "type": "mintMulti", + "inputQtys": [ + "149437530487973707776", + "56252262320594657280", + "133385866413161988096" + ], + "expectedQty": "339785313716018372884", + "reserves": [ + "29006037740917218614066703", + "65864656960503111533078152", + "65841825145207083577997531" + ], + "mAssetSupply": "160614382902310916603978296" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "9675761138535868416", + "outputIndex": 0, + "expectedQty": "9570282620984939465", + "swapFee": "5791019459044164", + "reserves": [ + "29006028170634597629127238", + "65864666636264250068946568", + "65841825145207083577997531" + ], + "mAssetSupply": "160614382908101936063022460", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "131195312806940804907008", + "outputIndex": 2, + "expectedQty": "131114082029339180125206", + "swapFee": "78520959573710326726", + "reserves": [ + "29006028170634597629127238", + "65995861949071190873853576", + "65710711063177744397872325" + ], + "mAssetSupply": "160614461429061509773349186", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "156637856691975782400", + "expectedQty": "156936703119291333693", + "swapFee": "93982714015185469", + "reserves": [ + "29006028170634597629127238", + "65995705012368071582519883", + "65710711063177744397872325" + ], + "mAssetSupply": "160614304885187531812752255" + }, + { + "type": "mintMulti", + "inputQtys": [ + "15818594179358174216192", + "910013631668000523288576", + "821990861618283703959552" + ], + "expectedQty": "1743601352878777856772775", + "reserves": [ + "29021846764813955803343430", + "66905718644036072105808459", + "66532701924796028101831877" + ], + "mAssetSupply": "162357906238066309669525030" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "152841091916183699456", + "expectedQty": "153140932285195816513", + "swapFee": "91704655149710219", + "reserves": [ + "29021846764813955803343430", + "66905565503103786909991946", + "66532701924796028101831877" + ], + "mAssetSupply": "162357753488679048635535793" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "1958467713302830592", + "expectedQty": "1962219575243286667", + "swapFee": "1175080627981698", + "reserves": [ + "29021846764813955803343430", + "66905565503103786909991946", + "66532699962576452858545210" + ], + "mAssetSupply": "162357751531386415960686899" + }, + { + "type": "redeemMasset", + "inputQty": "15040256566366457", + "expectedQtys": [ + "2687676248594793", + "6196039168655159", + "6161508566060641" + ], + "redemptionFee": "4512076969909", + "reserves": [ + "29021846762126279554748637", + "66905565496907747741336787", + "66532699956414944292484569" + ], + "mAssetSupply": "162357751516350671471290351" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "4836866039392051200", + "outputIndex": 1, + "expectedQty": "4834186137596254139", + "swapFee": "2894832683051880", + "reserves": [ + "29021846762126279554748637", + "66905560662721610145082648", + "66532704793280983684535769" + ], + "mAssetSupply": "162357751519245504154342231", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "8792246164755716243456", + "expectedQty": "8769763049712794267094", + "reserves": [ + "29021846762126279554748637", + "66914352908886365861326104", + "66532704793280983684535769" + ] + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "3885291672095465930752", + "expectedQty": "3851662576765794613678", + "swapFee": "2331175003257279558", + "reserves": [ + "29017995099549513760134959", + "66914352908886365861326104", + "66532704793280983684535769" + ], + "mAssetSupply": "162362638321798124739958131" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "9983350230384766976", + "outputIndex": 1, + "expectedQty": "10084242425476597623", + "swapFee": "6038690979993376", + "reserves": [ + "29018005082899744144901935", + "66914342824643940384728481", + "66532704793280983684535769" + ], + "mAssetSupply": "162362638327836815719951507", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mintMulti", + "inputQtys": [ + "264782684345162818125824", + "285645482244861809655808", + "247088290826701217202176" + ], + "expectedQty": "798310356722325439820535", + "reserves": [ + "29282787767244906963027759", + "67199988306888802194384289", + "66779793084107684901737945" + ], + "mAssetSupply": "163160948684559141159772042" + }, + { + "type": "mintMulti", + "inputQtys": [ + "584413873912736896", + "553161618564984256", + "516352470682440704" + ], + "expectedQty": "1655933877981001157", + "reserves": [ + "29282788351658780875764655", + "67199988860050420759368545", + "66779793600460155584178649" + ], + "mAssetSupply": "163160950340493019140773199" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "15472531221352792064", + "expectedQty": "15433223261136878441", + "reserves": [ + "29282788351658780875764655", + "67200004332581642112160609", + "66779793600460155584178649" + ] + }, + { + "type": "redeemMasset", + "inputQty": "17669022926605030", + "expectedQtys": [ + "3170139602998614", + "7275037899330644", + "7229546101640282" + ], + "redemptionFee": "5300706877981", + "reserves": [ + "29282788348488641272766041", + "67200004325306604212829965", + "66779793593230609482538367" + ], + "mAssetSupply": "163160965756052558057924591" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "41028583250314690560", + "expectedQty": "40926458844610853942", + "reserves": [ + "29282788348488641272766041", + "67200004325306604212829965", + "66779834621813859797228927" + ] + }, + { + "type": "redeemMasset", + "inputQty": "110281098216706603063705", + "expectedQtys": [ + "19786401923734688472742", + "45407093034767380205574", + "45123184052789816580668" + ], + "redemptionFee": "33084329465011980919", + "reserves": [ + "29263001946564906584293299", + "67154597232271836832624391", + "66734711437761069980648259" + ], + "mAssetSupply": "163050758668624161077695747" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "1123658470238629527552", + "expectedQty": "1125786419291848834002", + "swapFee": "674195082143177716", + "reserves": [ + "29263001946564906584293299", + "67154597232271836832624391", + "66733585651341778131814257" + ], + "mAssetSupply": "163049635684349004591345911" + }, + { + "type": "mintMulti", + "inputQtys": [ + "3646048639472283156480", + "8512581091516385067008", + "1749537988951361191936" + ], + "expectedQty": "13911484535351478854348", + "reserves": [ + "29266647995204378867449779", + "67163109813363353217691399", + "66735335189330729493006193" + ], + "mAssetSupply": "163063547168884356070200259" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "28664415880937111289856", + "expectedQty": "28718643581542658901793", + "swapFee": "17198649528562266773", + "reserves": [ + "29266647995204378867449779", + "67163109813363353217691399", + "66706616545749186834104400" + ], + "mAssetSupply": "163034899951652947521177176" + }, + { + "type": "redeemMasset", + "inputQty": "1825323777749199041331", + "expectedQtys": [ + "327568405071277667963", + "751726428144265318132", + "746617104670574351102" + ], + "redemptionFee": "547597133324759712", + "reserves": [ + "29266320426799307589781816", + "67162358086935208952373267", + "66705869928644516259753298" + ], + "mAssetSupply": "163033075175472331646895557" + }, + { + "type": "mintMulti", + "inputQtys": [ + "60057677238298448", + "101210934861271216", + "125075557655666656" + ], + "expectedQty": "286258358475822761", + "reserves": [ + "29266320486856984828080264", + "67162358188146143813644483", + "66705870053720073915419954" + ], + "mAssetSupply": "163033075461730690122718318" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "3585557208097627832320", + "expectedQty": "3614350478657518064418", + "reserves": [ + "29269906044065082455912584", + "67162358188146143813644483", + "66705870053720073915419954" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "279184380447302528", + "769205621694269440", + "663333618740483584" + ], + "expectedQty": "1710361944673877857", + "swapFee": "1026833266764385", + "reserves": [ + "29269905764880702008610056", + "67162357418940522119375043", + "66705869390386455174936370" + ], + "mAssetSupply": "163036688101847402966904879" + }, + { + "type": "redeemMasset", + "inputQty": "650164894804258310219366", + "expectedQtys": [ + "116688803878971079195256", + "267752660902359115974542", + "265932803931690089534391" + ], + "redemptionFee": "195049468441277493065", + "reserves": [ + "29153216961001730929414800", + "66894604758038163003400501", + "66439936586454765085401979" + ], + "mAssetSupply": "162386718256511585934178578" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "3696356313856143685320704", + "outputIndex": 2, + "expectedQty": "3692244101364734230952397", + "swapFee": "2211812992098087498001", + "reserves": [ + "29153216961001730929414800", + "70590961071894306688721205", + "62747692485090030854449582" + ], + "mAssetSupply": "162388930069503684021676579", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "2049052173659696640", + "expectedQty": "2042929233422605364", + "reserves": [ + "29153216961001730929414800", + "70590963120946480348417845", + "62747692485090030854449582" + ] + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "794562855965377639219200", + "expectedQty": "796438519003027624152998", + "swapFee": "476737713579226583531", + "reserves": [ + "29153216961001730929414800", + "69794524601943452724264847", + "62747692485090030854449582" + ], + "mAssetSupply": "161594845994181119031646274" + }, + { + "type": "mintMulti", + "inputQtys": [ + "12130089918396397568", + "86090344021586460672", + "57496210026303922176" + ], + "expectedQty": "155444089310334400146", + "reserves": [ + "29153229091091649325812368", + "69794610692287474310725519", + "62747749981300057158371758" + ], + "mAssetSupply": "161595001438270429366046420" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "10919882583785136", + "expectedQty": "10888006883710029", + "reserves": [ + "29153229091091649325812368", + "69794610703207356894510655", + "62747749981300057158371758" + ] + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "352491786719752930459648", + "expectedQty": "352995904678514661126052", + "swapFee": "211495072031851758275", + "reserves": [ + "29153229091091649325812368", + "69794610703207356894510655", + "62394754076621542497245706" + ], + "mAssetSupply": "161242721157510715171055076" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "25140946444624437706752", + "expectedQty": "25339196411950900163624", + "reserves": [ + "29178370037536273763519120", + "69794610703207356894510655", + "62394754076621542497245706" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "1221915049602300510208", + "7919951261667802742784", + "2698047772531346636800" + ], + "expectedQty": "11820938987582327230126", + "reserves": [ + "29179591952585876064029328", + "69802530654469024697253439", + "62397452124394073843882506" + ], + "mAssetSupply": "161279881292910248398448826" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "3847454981239625916350464", + "expectedQty": "3855782140010175538377971", + "swapFee": "2308472988743775549810", + "reserves": [ + "29179591952585876064029328", + "65946748514458849158875468", + "62397452124394073843882506" + ], + "mAssetSupply": "157434734784659366257648172" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "99791870918290882560", + "expectedQty": "99990651642475539088", + "swapFee": "59875122550974529", + "reserves": [ + "29179591952585876064029328", + "65946648523807206683336380", + "62397452124394073843882506" + ], + "mAssetSupply": "157434635052663570517740141" + }, + { + "type": "mintMulti", + "inputQtys": [ + "378508934317187268608", + "876049677809203675136", + "871594389881028476928" + ], + "expectedQty": "2124811520442506054904", + "reserves": [ + "29179970461520193251297936", + "65947524573485015887011516", + "62398323718783954872359434" + ], + "mAssetSupply": "157436759864184013023795045" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "1606020306212846082981888", + "expectedQty": "1609101802417839359973969", + "swapFee": "963612183727707649789", + "reserves": [ + "29179970461520193251297936", + "64338422771067176527037547", + "62398323718783954872359434" + ], + "mAssetSupply": "155831703170154894648462946" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "904753835234916040704", + "outputIndex": 1, + "expectedQty": "912910052297370836760", + "swapFee": "546737353879566781", + "reserves": [ + "29180875215355428167338640", + "64337509861014879156200787", + "62398323718783954872359434" + ], + "mAssetSupply": "155831703716892248528029727", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "20053966055600965025792", + "outputIndex": 1, + "expectedQty": "20234559089434398307863", + "swapFee": "12118421211733675124", + "reserves": [ + "29200929181411029132364432", + "64317275301925444757892924", + "62398323718783954872359434" + ], + "mAssetSupply": "155831715835313460261704851", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemBassets", + "inputQtys": [ + "245494655621765568", + "32758792221856352", + "223703748131057952" + ], + "expectedQty": "503140764751645361", + "swapFee": "302065698269949", + "reserves": [ + "29200928935916373510598864", + "64317275269166652536036572", + "62398323495080206741301482" + ], + "mAssetSupply": "155831715332172695510059490" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "652681529315016948318208", + "expectedQty": "653863036171034101038161", + "swapFee": "391608917589010168990", + "reserves": [ + "29200928935916373510598864", + "63663412232995618434998411", + "62398323495080206741301482" + ], + "mAssetSupply": "155179425411775267571910272" + }, + { + "type": "mintMulti", + "inputQtys": [ + "16867814469811591708672", + "10579231184666713128960", + "15080938683803954577408" + ], + "expectedQty": "42588508078369746701664", + "reserves": [ + "29217796750386185102307536", + "63673991464180285148127371", + "62413404433764010695878890" + ], + "mAssetSupply": "155222013919853637318611936" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "246707106116125461577728", + "outputIndex": 1, + "expectedQty": "246591175225132480632035", + "swapFee": "147695025207842744542", + "reserves": [ + "29217796750386185102307536", + "63427400288955152667495336", + "62660111539880136157456618" + ], + "mAssetSupply": "155222161614878845161356478", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "3994367043300812652544", + "expectedQty": "3985401371250242971940", + "reserves": [ + "29217796750386185102307536", + "63427400288955152667495336", + "62664105906923436970109162" + ] + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "7415810168477576454995968", + "expectedQty": "7340291127099581162505411", + "swapFee": "4449486101086545872997", + "reserves": [ + "21877505623286603939802125", + "63427400288955152667495336", + "62664105906923436970109162" + ], + "mAssetSupply": "147814786333873605495205447" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "158220160799391615025152", + "outputIndex": 1, + "expectedQty": "160753465253792315148006", + "swapFee": "96170795062733120377", + "reserves": [ + "22035725784085995554827277", + "63266646823701360352347330", + "62664105906923436970109162" + ], + "mAssetSupply": "147814882504668668228325824", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemMasset", + "inputQty": "984030732121742745", + "expectedQtys": [ + "146651851690580564", + "421051296329454421", + "417041274511673498" + ], + "redemptionFee": "295209219636522", + "reserves": [ + "22035725637434143864246713", + "63266646402650064022892909", + "62664105489882162458435664" + ], + "mAssetSupply": "147814881520933145326219601" + }, + { + "type": "redeemMasset", + "inputQty": "184299598508678525747", + "expectedQtys": [ + "27466497239218764087", + "78858903824841700933", + "78107864871582026005" + ], + "redemptionFee": "55289879552603557", + "reserves": [ + "22035698170936904645482626", + "63266567543746239181191976", + "62664027382017290876409659" + ], + "mAssetSupply": "147814697276624516200297411" + }, + { + "type": "redeemMasset", + "inputQty": "21554995103716147934003", + "expectedQtys": [ + "3212379290558871392978", + "9223043889316140048937", + "9135205168606989489638" + ], + "redemptionFee": "6466498531114844380", + "reserves": [ + "22032485791646345774089648", + "63257344499856923041143039", + "62654892176848683886920021" + ], + "mAssetSupply": "147793148748019331167207788" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "386209869175862460416", + "outputIndex": 1, + "expectedQty": "386010811088047437679", + "swapFee": "230933049193002824", + "reserves": [ + "22032485791646345774089648", + "63256958489045834993705360", + "62655278386717859749380437" + ], + "mAssetSupply": "147793148978952380360210612", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "1486310593797910953984", + "expectedQty": "1490644761491821189070", + "swapFee": "891786356278746572", + "reserves": [ + "22032485791646345774089648", + "63255467844284343172516290", + "62655278386717859749380437" + ], + "mAssetSupply": "147791663560144938728003200" + }, + { + "type": "redeemMasset", + "inputQty": "105510970013419125814067", + "expectedQtys": [ + "15724645700692161449722", + "45145601358337324167904", + "44717244491900496182916" + ], + "redemptionFee": "31653291004025737744", + "reserves": [ + "22016761145945653612639926", + "63210322242926005848348386", + "62610561142225959253197521" + ], + "mAssetSupply": "147686184243422523627926877" + }, + { + "type": "mintMulti", + "inputQtys": [ + "170198958102457745408", + "154188489221394890752", + "66088829785598009344" + ], + "expectedQty": "391907907329916353743", + "reserves": [ + "22016931344903756070385334", + "63210476431415227243239138", + "62610627231055744851206865" + ], + "mAssetSupply": "147686576151329853544280620" + }, + { + "type": "mintMulti", + "inputQtys": [ + "457067758946772", + "225177904295127", + "62548272432418" + ], + "expectedQty": "749694006716584", + "reserves": [ + "22016931345360823829332106", + "63210476431640405147534265", + "62610627231118293123639283" + ], + "mAssetSupply": "147686576152079547550997204" + }, + { + "type": "redeemMasset", + "inputQty": "51628709319096646447923", + "expectedQtys": [ + "7694434839043304920630", + "22090675781237887932574", + "21881041635849041911560" + ], + "redemptionFee": "15488612795728993934", + "reserves": [ + "22009236910521780524411476", + "63188385755859167259601691", + "62588746189482444081727723" + ], + "mAssetSupply": "147634962931373246633543215" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "178585157987583362334720", + "expectedQty": "179104179993860469974925", + "swapFee": "107151094792550017400", + "reserves": [ + "22009236910521780524411476", + "63009281575865306789626766", + "62588746189482444081727723" + ], + "mAssetSupply": "147456484924480455821225895" + }, + { + "type": "redeemMasset", + "inputQty": "13180568181980786589696", + "expectedQtys": [ + "1966730860339627360893", + "5630467747104892137135", + "5592888982987512416542" + ], + "redemptionFee": "3954170454594235976", + "reserves": [ + "22007270179661440897050583", + "63003651108118201897489631", + "62583153300499456569311181" + ], + "mAssetSupply": "147443308310468929628872175" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "29178939333636980736", + "expectedQty": "28790673533286531514", + "swapFee": "17507363600182188", + "reserves": [ + "22007241388987907610519069", + "63003651108118201897489631", + "62583153300499456569311181" + ], + "mAssetSupply": "147443279149036959592073627" + }, + { + "type": "redeemMasset", + "inputQty": "10983110408764473344", + "expectedQtys": [ + "1638836649412469366", + "4691759892016576878", + "4660446234573439883" + ], + "redemptionFee": "3294933122629342", + "reserves": [ + "22007239750151258198049703", + "63003646416358309880912753", + "62583148640053221995871298" + ], + "mAssetSupply": "147443268169221483950229625" + }, + { + "type": "mintMulti", + "inputQtys": [ + "21315970329206059008", + "16225646748975386624", + "1741143803171756288" + ], + "expectedQty": "39494723025408232429", + "reserves": [ + "22007261066121587404108711", + "63003662642005058856299377", + "62583150381197025167627586" + ], + "mAssetSupply": "147443307663944509358462054" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "15919393803967431442432", + "53020371393340350922752", + "90229583543889681186816" + ], + "expectedQty": "158880334047716240381931", + "swapFee": "95385431687642329626", + "reserves": [ + "21991341672317619972666279", + "62950642270611718505376625", + "62492920797653135486440770" + ], + "mAssetSupply": "147284427329896793118080123" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "97114995666701520994304", + "expectedQty": "96782070883490276581713", + "reserves": [ + "21991341672317619972666279", + "62950642270611718505376625", + "62590035793319837007435074" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "16219603618552879251456", + "17339219073191582367744", + "14276609990908425797632" + ], + "expectedQty": "47934961246427207805262", + "reserves": [ + "22007561275936172851917735", + "62967981489684910087744369", + "62604312403310745433232706" + ], + "mAssetSupply": "147429144362026710602467098" + }, + { + "type": "mintMulti", + "inputQtys": [ + "30871979393434243072", + "28385272923775864832", + "27665781342132060160" + ], + "expectedQty": "87126731489860164353", + "reserves": [ + "22007592147915566286160807", + "62968009874957833863609201", + "62604340069092087565292866" + ], + "mAssetSupply": "147429231488758200462631451" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "56734248513671780106240", + "expectedQty": "56536529935725660607581", + "reserves": [ + "22007592147915566286160807", + "63024744123471505643715441", + "62604340069092087565292866" + ] + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "19976422435882602070016", + "outputIndex": 0, + "expectedQty": "19641354402186165932320", + "swapFee": "11944033511502041754", + "reserves": [ + "21987950793513380120228487", + "63044720545907388245785457", + "62604340069092087565292866" + ], + "mAssetSupply": "147485779962727437625280786", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "3278871298526943211683840", + "expectedQty": "3287806464947545196598927", + "swapFee": "1967322779116165927010", + "reserves": [ + "21987950793513380120228487", + "59756914080959843049186530", + "62604340069092087565292866" + ], + "mAssetSupply": "144208875986979610579523956" + }, + { + "type": "redeemMasset", + "inputQty": "48377079091410716380364", + "expectedQtys": [ + "7373982450577294433300", + "20040359370990010089674", + "20995285524090149165912" + ], + "redemptionFee": "14513123727423214914", + "reserves": [ + "21980576811062802825795187", + "59736873721588853039096856", + "62583344783567997416126954" + ], + "mAssetSupply": "144160513421011927286358506" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "78778057740107357618176", + "51064516557896949956608", + "30645751790892067323904" + ], + "expectedQty": "161185141054770442403023", + "swapFee": "96769146120534586193", + "reserves": [ + "21901798753322695468177011", + "59685809205030956089140248", + "62552699031777105348803050" + ], + "mAssetSupply": "143999328279957156843955483" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "26763252756589350912", + "outputIndex": 0, + "expectedQty": "26339046554748348134", + "swapFee": "16007415117916378", + "reserves": [ + "21901772414276140719828877", + "59685835968283712678491160", + "62552699031777105348803050" + ], + "mAssetSupply": "143999328295964571961871861", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemBassets", + "inputQtys": [ + "677087489253915623424", + "890553617261753663488", + "180822497589769568256" + ], + "expectedQty": "1753345996468564075860", + "swapFee": "1052639181389972428", + "reserves": [ + "21901095326786886804205453", + "59684945414666450924827672", + "62552518209279515579234794" + ], + "mAssetSupply": "143997574949968103397796001" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "34572901626925008551936", + "expectedQty": "34464027571083801176355", + "reserves": [ + "21901095326786886804205453", + "59719518316293375933379608", + "62552518209279515579234794" + ] + }, + { + "type": "redeemMasset", + "inputQty": "1322415464258054651904", + "expectedQtys": [ + "201022346456572884648", + "548144169141828326308", + "574147265219984366259" + ], + "redemptionFee": "396724639277416395", + "reserves": [ + "21900894304440430231320805", + "59718970172124234105053300", + "62551944062014295594868535" + ], + "mAssetSupply": "144030716958799568421736847" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "1124450697384151351296", + "outputIndex": 0, + "expectedQty": "1106163865839980036245", + "swapFee": "672270915858483383", + "reserves": [ + "21899788140574590251284560", + "59718970172124234105053300", + "62553068512711679746219831" + ], + "mAssetSupply": "144030717631070484280220230", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "3756889275268139656937472", + "expectedQty": "3765698308701396337530068", + "swapFee": "2254133565160883794162", + "reserves": [ + "21899788140574590251284560", + "55953271863422837767523232", + "62553068512711679746219831" + ], + "mAssetSupply": "140276082489367505507076920" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "1485699208478866688", + "expectedQty": "1490305563182177183", + "swapFee": "891419525087320", + "reserves": [ + "21899788140574590251284560", + "55953271863422837767523232", + "62553067022406116564042648" + ], + "mAssetSupply": "140276081004559716553297552" + }, + { + "type": "redeemMasset", + "inputQty": "90687617509409092009984", + "expectedQtys": [ + "14153829963939864296782", + "36162591656021783543079", + "40428038329636586275419" + ], + "redemptionFee": "27206285252822727602", + "reserves": [ + "21885634310610650386987778", + "55917109271766815983980153", + "62512638984076479977767229" + ], + "mAssetSupply": "140185420593335560284015170" + }, + { + "type": "mintMulti", + "inputQtys": [ + "133140679080549287985152", + "41491667409512211415040", + "582198537604362842144768" + ], + "expectedQty": "756098481117419363991994", + "reserves": [ + "22018774989691199674972930", + "55958600939176328195395193", + "63094837521680842819911997" + ], + "mAssetSupply": "140941519074452979648007164" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "152551543757701775360", + "expectedQty": "152869454779152138802", + "swapFee": "91530926254621065", + "reserves": [ + "22018774989691199674972930", + "55958448069721549043256391", + "63094837521680842819911997" + ], + "mAssetSupply": "140941366614440148200852869" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "27596393989369046761472", + "expectedQty": "27682811462019163873143", + "swapFee": "16557836393621428056", + "reserves": [ + "22018774989691199674972930", + "55958448069721549043256391", + "63067154710218823656038854" + ], + "mAssetSupply": "140913786778287172775519453" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "38420253733205", + "expectedQty": "38277393438890", + "reserves": [ + "22018774989691199674972930", + "55958448069721549043256391", + "63067154710257243909772059" + ] + }, + { + "type": "redeemMasset", + "inputQty": "883417169558748672", + "expectedQtys": [ + "137998763598420753", + "350709639847057969", + "395262196818873729" + ], + "redemptionFee": "265025150867624", + "reserves": [ + "22018774851692436076552177", + "55958447719011909196198422", + "63067154314995047090898330" + ], + "mAssetSupply": "140913785895173305761077295" + }, + { + "type": "mintMulti", + "inputQtys": [ + "426789965783106525855744", + "80441953773833263513600", + "410953138420786292326400" + ], + "expectedQty": "921298325567293822836068", + "reserves": [ + "22445564817475542602407921", + "56038889672785742459712022", + "63478107453415833383224730" + ], + "mAssetSupply": "141835084220740599583913363" + }, + { + "type": "mintMulti", + "inputQtys": [ + "27233571095465598910464", + "49785495527881300770816", + "11090162795296145276928" + ], + "expectedQty": "88243496446621228313356", + "reserves": [ + "22472798388571008201318385", + "56088675168313623760482838", + "63489197616211129528501658" + ], + "mAssetSupply": "141923327717187220812226719" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "9806273830694760448", + "outputIndex": 2, + "expectedQty": "9810926499351904805", + "swapFee": "5868511280869111", + "reserves": [ + "22472798388571008201318385", + "56088684974587454455243286", + "63489187805284630176596853" + ], + "mAssetSupply": "141923327723055732093095830", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "915517122852137600", + "expectedQty": "925728595045298355", + "reserves": [ + "22472799304088131053455985", + "56088684974587454455243286", + "63489187805284630176596853" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "2927370765928704770048", + "12761372951759175024640", + "13165799040693213069312" + ], + "expectedQty": "28805875869845513953093", + "reserves": [ + "22475726674854059758226033", + "56101446347539213630267926", + "63502353604325323389666165" + ], + "mAssetSupply": "141952134524654172652347278" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "482778745907824361472", + "expectedQty": "488164408308151426417", + "reserves": [ + "22476209453599967582587505", + "56101446347539213630267926", + "63502353604325323389666165" + ] + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "2756497037057533149184", + "expectedQty": "2787242599627260856204", + "reserves": [ + "22478965950637025115736689", + "56101446347539213630267926", + "63502353604325323389666165" + ] + }, + { + "type": "redeemMasset", + "inputQty": "33840546944975765504", + "expectedQtys": [ + "5357120892697081921", + "13369931294833859390", + "15133693692859946310" + ], + "redemptionFee": "10152164083492729", + "reserves": [ + "22478960593516132418654768", + "56101432977607918796408536", + "63502338470631630529719855" + ], + "mAssetSupply": "141955376101267327172357124" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "116090520883766416", + "expectedQty": "116322402179168080", + "swapFee": "69654312530259", + "reserves": [ + "22478960593516132418654768", + "56101432861285516617240456", + "63502338470631630529719855" + ], + "mAssetSupply": "141955375985246460601120967" + }, + { + "type": "redeemMasset", + "inputQty": "237400741261282011145830", + "expectedQtys": [ + "37581676030825597184018", + "93793743971689314482852", + "106167022344061756763041" + ], + "redemptionFee": "71220222378384603343", + "reserves": [ + "22441378917485306821470750", + "56007639117313827302757604", + "63396171448287568772956814" + ], + "mAssetSupply": "141718046464207556974578480" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "120384052818904016", + "expectedQty": "120624510090582520", + "swapFee": "72230431691342", + "reserves": [ + "22441378917485306821470750", + "56007638996689317212175084", + "63396171448287568772956814" + ], + "mAssetSupply": "141718046343895734587365806" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "1830899686812139462328320", + "expectedQty": "1825959933023158890496499", + "reserves": [ + "22441378917485306821470750", + "57838538683501456674503404", + "63396171448287568772956814" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "390694762787263086592", + "125715053981507387392", + "311153839032534761472" + ], + "expectedQty": "830585421341294359172", + "swapFee": "498650443070618986", + "reserves": [ + "22440988222722519558384158", + "57838412968447475167116012", + "63395860294448536238195342" + ], + "mAssetSupply": "143543175691497552183503133" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "7543014654307495575552", + "expectedQty": "7559673889098745851266", + "swapFee": "4525808792584497345", + "reserves": [ + "22440988222722519558384158", + "57830853294558376421264746", + "63395860294448536238195342" + ], + "mAssetSupply": "143535637202652037272424926" + }, + { + "type": "mintMulti", + "inputQtys": [ + "866048941115795377750016", + "1135479800720751484469248", + "1085128638474688562987008" + ], + "expectedQty": "3089422477285377881297525", + "reserves": [ + "23307037163838314936134174", + "58966333095279127905733994", + "64480988932923224801182350" + ], + "mAssetSupply": "146625059679937415153722451" + }, + { + "type": "redeemMasset", + "inputQty": "27728209107248814489", + "expectedQtys": [ + "4406262632319217143", + "11147755429237397980", + "12190317028839298473" + ], + "redemptionFee": "8318462732174644", + "reserves": [ + "23307032757575682616917031", + "58966321947523698668336014", + "64480976742606195961883877" + ], + "mAssetSupply": "146625031960046770637082606" + }, + { + "type": "redeemMasset", + "inputQty": "3554944676639129835929", + "expectedQtys": [ + "564912787120541890246", + "1429217937096496798370", + "1562881412953805244616" + ], + "redemptionFee": "1066483402991738950", + "reserves": [ + "23306467844788562075026785", + "58964892729586602171537644", + "64479413861193242156639261" + ], + "mAssetSupply": "146621478081853534498985627" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "401110583761861806653440", + "expectedQty": "402268602200873156944973", + "swapFee": "240666350257117083992", + "reserves": [ + "23306467844788562075026785", + "58964892729586602171537644", + "64077145258992368999694288" + ], + "mAssetSupply": "146220608164441929809416179" + }, + { + "type": "mintMulti", + "inputQtys": [ + "6903057558616198144", + "10742307122463688704", + "988811721339745408" + ], + "expectedQty": "18676910900449062445", + "reserves": [ + "23306474747846120691224929", + "58964903471893724635226348", + "64077146247804090339439696" + ], + "mAssetSupply": "146220626841352830258478624" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "405363619424411926396928", + "outputIndex": 2, + "expectedQty": "410857426303523845207313", + "swapFee": "245834022427197914912", + "reserves": [ + "23711838367270532617621857", + "58964903471893724635226348", + "63666288821500566494232383" + ], + "mAssetSupply": "146220872675375257456393536", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemBassets", + "inputQtys": [ + "20572499622619743518720", + "266274615382425862144", + "34806575206031222112256" + ], + "expectedQty": "55744261494415595402429", + "swapFee": "33466636878776623215", + "reserves": [ + "23691265867647912874103137", + "58964637197278342209364204", + "63631482246294535272120127" + ], + "mAssetSupply": "146165128413880841860991107" + }, + { + "type": "mintMulti", + "inputQtys": [ + "885178575779421329817600", + "313187440374865738072064", + "269215542039085186023424" + ], + "expectedQty": "1474860631336831027075395", + "reserves": [ + "24576444443427334203920737", + "59277824637653207947436268", + "63900697788333620458143551" + ], + "mAssetSupply": "147639989045217672888066502" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "1603302251315904768", + "outputIndex": 1, + "expectedQty": "1622205468325643218", + "swapFee": "971413448435863", + "reserves": [ + "24576446046729585519825505", + "59277823015447739621793050", + "63900697788333620458143551" + ], + "mAssetSupply": "147639989046189086336502365", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemMasset", + "inputQty": "43486419441353550410547", + "expectedQtys": [ + "7236664169212809852567", + "17454667653296156440387", + "18815897513955885381155" + ], + "redemptionFee": "13045925832406065123", + "reserves": [ + "24569209382560372709972938", + "59260368347794443465352663", + "63881881890819664572762396" + ], + "mAssetSupply": "147596515672673565192156941" + }, + { + "type": "mintMulti", + "inputQtys": [ + "75826876329772672", + "976169704418636544", + "1432660703164293120" + ], + "expectedQty": "2478324033184390872", + "reserves": [ + "24569209458387249039745610", + "59260369323964147883989207", + "63881883323480367737055516" + ], + "mAssetSupply": "147596518150997598376547813" + }, + { + "type": "mintMulti", + "inputQtys": [ + "18928923177039257600", + "5288859906165824512", + "36688785198781206528" + ], + "expectedQty": "60961413617939284563", + "reserves": [ + "24569228387310426079003210", + "59260374612824054049813719", + "63881920012265566518262044" + ], + "mAssetSupply": "147596579112411216315832376" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "594465289485631356928", + "342364927358996054016", + "597229132726832201728" + ], + "expectedQty": "1537103375192991686422", + "swapFee": "922815714544521724", + "reserves": [ + "24568633922020940447646282", + "59260032247896695053759703", + "63881322783132839686060316" + ], + "mAssetSupply": "147595042009036023324145954" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "55442784367178056", + "outputIndex": 1, + "expectedQty": "56096487804950159", + "swapFee": "33591847269995", + "reserves": [ + "24568633977463724814824338", + "59260032191800207248809544", + "63881322783132839686060316" + ], + "mAssetSupply": "147595042009069615171415949", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "8644006253303273881600", + "expectedQty": "8616388058247459139193", + "reserves": [ + "24568633977463724814824338", + "59260032191800207248809544", + "63889966789386142959941916" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "275000197040371306332160", + "2165063000474649440026624", + "475679306920954093895680" + ], + "expectedQty": "2911513206887428049349124", + "swapFee": "1747956698151347638192", + "reserves": [ + "24293633780423353508492178", + "57094969191325557808782920", + "63414287482465188866046236" + ], + "mAssetSupply": "144692145190240434581206018" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "86401280782601504", + "expectedQty": "85528476009959443", + "swapFee": "51840768469560", + "reserves": [ + "24293633694894877498532735", + "57094969191325557808782920", + "63414287482465188866046236" + ], + "mAssetSupply": "144692145103890994567074074" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "13706992148955531313152", + "expectedQty": "13662117615728612756064", + "reserves": [ + "24293633694894877498532735", + "57094969191325557808782920", + "63427994474614144397359388" + ] + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "171479260728991936413696", + "outputIndex": 0, + "expectedQty": "169172078964323129695517", + "swapFee": "102549764351545700726", + "reserves": [ + "24124461615930554368837218", + "57094969191325557808782920", + "63599473735343136333773084" + ], + "mAssetSupply": "144705909771271074725530864", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemMasset", + "inputQty": "1229521399789990707200", + "expectedQtys": [ + "204916602228095804343", + "484972774823640372843", + "540222959949310731323" + ], + "redemptionFee": "368856419936997212", + "reserves": [ + "24124256699328326273032875", + "57094484218550734168410077", + "63598933512383187023041761" + ], + "mAssetSupply": "144704680618727704671820876" + }, + { + "type": "mintMulti", + "inputQtys": [ + "514362682816001146880", + "570950346134219522048", + "92106168290564931584" + ], + "expectedQty": "1180766170338713376299", + "reserves": [ + "24124771062011142274179755", + "57095055168896868387932125", + "63599025618551477587973345" + ], + "mAssetSupply": "144705861384898043385197175" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "90074447924648869888", + "outputIndex": 2, + "expectedQty": "90102765520548238937", + "swapFee": "53914429049967366", + "reserves": [ + "24124771062011142274179755", + "57095145243344793036802013", + "63598935515785957039734408" + ], + "mAssetSupply": "144705861438812472435164541", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mintMulti", + "inputQtys": [ + "5301219625659798528", + "22476570984042020864", + "20221039002784911360" + ], + "expectedQty": "47929323486315589710", + "reserves": [ + "24124776363230767933978283", + "57095167719915777078822877", + "63598955736824959824645768" + ], + "mAssetSupply": "144705909368135958750754251" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "2501005597159898742784", + "expectedQty": "2475302104940438820564", + "swapFee": "1500603358295939245", + "reserves": [ + "24122301061125827495157719", + "57095167719915777078822877", + "63598955736824959824645768" + ], + "mAssetSupply": "144703409863142157147950712" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "70533071482684060991488", + "67118850578604630212608", + "44062093677128541274112" + ], + "expectedQty": "182096644876453948508427", + "swapFee": "109323581074517079352", + "reserves": [ + "24051767989643143434166231", + "57028048869337172448610269", + "63554893643147831283371656" + ], + "mAssetSupply": "144521313218265703199442285" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "69187452226327921295360", + "expectedQty": "68956619020259107554458", + "reserves": [ + "24051767989643143434166231", + "57028048869337172448610269", + "63624081095374159204667016" + ] + }, + { + "type": "redeemMasset", + "inputQty": "366781222073687657676", + "expectedQtys": [ + "60993663993723485312", + "144619291706613637449", + "161346385259982023396" + ], + "redemptionFee": "110034366622106297", + "reserves": [ + "24051706995979149710680919", + "57027904250045465834972820", + "63623919748988899222643620" + ], + "mAssetSupply": "144589903166098255241445364" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "969210753761971498123264", + "1167621134474427844526080", + "798640911609535196561408" + ], + "expectedQty": "2939679974561562917859490", + "swapFee": "1764866904879865670117", + "reserves": [ + "23082496242217178212557655", + "55860283115571037990446740", + "62825278837379364026082212" + ], + "mAssetSupply": "141650223191536692323585874" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "3995254566106310377472", + "expectedQty": "3985351054990710937154", + "reserves": [ + "23082496242217178212557655", + "55864278370137144300824212", + "62825278837379364026082212" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "1181549797376529992253440", + "3170809007781020111470592", + "6301849340818678708436992" + ], + "expectedQty": "10636223018521244301695928", + "reserves": [ + "24264046039593708204811095", + "59035087377918164412294804", + "69127128178198042734519204" + ], + "mAssetSupply": "152290431561112927336218956" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "66692984237780570734592", + "expectedQty": "66813460461807750365596", + "swapFee": "40015790542668342440", + "reserves": [ + "24264046039593708204811095", + "58968273917456356661929208", + "69127128178198042734519204" + ], + "mAssetSupply": "152223778592665689433826804" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "426975250061501632", + "expectedQty": "428335569875374885", + "swapFee": "256185150036900", + "reserves": [ + "24264046039593708204811095", + "58968273917456356661929208", + "69127127749862472859144319" + ], + "mAssetSupply": "152223778165946624522362072" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "5692756757819586064154624", + "expectedQty": "5608297348332175633370306", + "swapFee": "3415654054691751638492", + "reserves": [ + "18655748691261532571440789", + "58968273917456356661929208", + "69127127749862472859144319" + ], + "mAssetSupply": "146534437062181730209845940" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "179328415065916443721728", + "expectedQty": "182687883843142300160072", + "reserves": [ + "18835077106327449015162517", + "58968273917456356661929208", + "69127127749862472859144319" + ] + }, + { + "type": "redeemMasset", + "inputQty": "950552783206165454730035", + "expectedQtys": [ + "121992329466769749319873", + "381929792971668793801772", + "447727359752603961640518" + ], + "redemptionFee": "285165834961849636419", + "reserves": [ + "18713084776860679265842644", + "58586344124484687868127436", + "68679400390109868897503801" + ], + "mAssetSupply": "145766857328653668904912396" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "624898099396893036511232", + "484276957030121874653184", + "536409966954956135071744" + ], + "expectedQty": "1652950988979137409677162", + "swapFee": "992366012995279613574", + "reserves": [ + "18088186677463786229331412", + "58102067167454565993474252", + "68142990423154912762432057" + ], + "mAssetSupply": "144113906339674531495235234" + }, + { + "type": "mintMulti", + "inputQtys": [ + "138568937699253984165888", + "112268554166606005010432", + "127237664512531838795776" + ], + "expectedQty": "379688958449884989017645", + "reserves": [ + "18226755615163040213497300", + "58214335721621171998484684", + "68270228087667444601227833" + ], + "mAssetSupply": "144493595298124416484252879" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "379983633398565306368", + "expectedQty": "378001122161435251661", + "reserves": [ + "18226755615163040213497300", + "58214335721621171998484684", + "68270608071300843166534201" + ] + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "115579960693531397324800", + "expectedQty": "117799656941720118313356", + "reserves": [ + "18342335575856571610822100", + "58214335721621171998484684", + "68270608071300843166534201" + ] + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "45379461490690768", + "outputIndex": 0, + "expectedQty": "44341029487977711", + "swapFee": "27128569014157", + "reserves": [ + "18342335531515542122844389", + "58214335767000633489175452", + "68270608071300843166534201" + ], + "mAssetSupply": "144611772956215426606832053", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "25633650181644", + "expectedQty": "26122796183197", + "reserves": [ + "18342335531541175773026033", + "58214335767000633489175452", + "68270608071300843166534201" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "660106613690749157376", + "623315790593680474112", + "1489769627934829051904" + ], + "expectedQty": "2775803074426636404098", + "swapFee": "1666481733696199562", + "reserves": [ + "18341675424927485023868657", + "58213712451210039808701340", + "68269118301672908337482297" + ], + "mAssetSupply": "144608997153167122766611152" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "1026505838110082727936", + "849496575576422088704", + "427822296641267236864" + ], + "expectedQty": "2318105916646868164141", + "swapFee": "1391698569129598657", + "reserves": [ + "18340648919089374941140721", + "58212862954634463386612636", + "68268690479376267070245433" + ], + "mAssetSupply": "144606679047250475898447011" + }, + { + "type": "redeemMasset", + "inputQty": "79545362854455920925081", + "expectedQtys": [ + "10085812832383856223453", + "32012173767012283120742", + "37542032319820528077143" + ], + "redemptionFee": "23863608856336776277", + "reserves": [ + "18330563106256991084917268", + "58180850780867451103491894", + "68231148447056446542168290" + ], + "mAssetSupply": "144527157548004876314298207" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "32681004141689899581440", + "expectedQty": "32561965502286308630073", + "reserves": [ + "18330563106256991084917268", + "58213531785009141003073334", + "68231148447056446542168290" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "1088270011722876059648", + "458619302882284863488", + "59101206002328690688" + ], + "expectedQty": "1624791309071207877295", + "reserves": [ + "18331651376268713960976916", + "58213990404312023287936822", + "68231207548262448870858978" + ], + "mAssetSupply": "144561344304816233830805575" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "5967507536060518236160", + "expectedQty": "5994970368600395724245", + "swapFee": "3580504521636310941", + "reserves": [ + "18331651376268713960976916", + "58213990404312023287936822", + "68225212577893848475134733" + ], + "mAssetSupply": "144555380377784694948880356" + }, + { + "type": "mintMulti", + "inputQtys": [ + "168793338764106796105728", + "195797259808458923835392", + "53587632334689462648832" + ], + "expectedQty": "420389573163870414440953", + "reserves": [ + "18500444715032820757082644", + "58409787664120482211772214", + "68278800210228537937783565" + ], + "mAssetSupply": "144975769950948565363321309" + }, + { + "type": "mintMulti", + "inputQtys": [ + "208519121781821729144832", + "220844646215856968171520", + "13191381766762538205184" + ], + "expectedQty": "445576610369379567332564", + "reserves": [ + "18708963836814642486227476", + "58630632310336339179943734", + "68291991591995300475988749" + ], + "mAssetSupply": "145421346561317944930653873" + }, + { + "type": "mintMulti", + "inputQtys": [ + "537664244296250701119488", + "569583534180793084542976", + "387768369842918638223360" + ], + "expectedQty": "1500776018234184444194537", + "reserves": [ + "19246628081110893187346964", + "59200215844517132264486710", + "68679759961838219114212109" + ], + "mAssetSupply": "146922122579552129374848410" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "447117048940329883926528", + "expectedQty": "454840442860150571825435", + "reserves": [ + "19693745130051223071273492", + "59200215844517132264486710", + "68679759961838219114212109" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "51804564684413109010432", + "6950067590949336252416", + "24285878102813482942464" + ], + "expectedQty": "83776888451901632856930", + "swapFee": "50296310857655573057", + "reserves": [ + "19641940565366809962263060", + "59193265776926182928234294", + "68655474083735405631269645" + ], + "mAssetSupply": "147293186133960378313816915" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "3787884079344396009472", + "4810311634206643453952", + "324863517253405310976" + ], + "expectedQty": "8969376073933317178204", + "swapFee": "5384856558294967287", + "reserves": [ + "19638152681287465566253588", + "59188455465291976284780342", + "68655149220218152225958669" + ], + "mAssetSupply": "147284216757886444996638711" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "328576909483504238592", + "447268355424207896576", + "1165603291734988947456" + ], + "expectedQty": "1939909782580141122805", + "swapFee": "1164644656341889807", + "reserves": [ + "19637824104377982062014996", + "59188008196936552076883766", + "68653983616926417237011213" + ], + "mAssetSupply": "147282276848103864855515906" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "18630601496217379667968", + "102332431710224706961408", + "103872006677817299304448" + ], + "expectedQty": "224304884570452079695490", + "swapFee": "134663728979659043243", + "reserves": [ + "19619193502881764682347028", + "59085675765226327369922358", + "68550111610248599937706765" + ], + "mAssetSupply": "147057971963533412775820416" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "3688625584241081057280", + "outputIndex": 2, + "expectedQty": "3691580525798913214315", + "swapFee": "2205655361182808906", + "reserves": [ + "19619193502881764682347028", + "59089364390810568450979638", + "68546420029722801024492450" + ], + "mAssetSupply": "147057974169188773958629322", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "6669625022927388090040320", + "expectedQty": "6685481624398224656583297", + "swapFee": "4001775013756432854024", + "reserves": [ + "19619193502881764682347028", + "52403882766412343794396341", + "68546420029722801024492450" + ], + "mAssetSupply": "140392350921275142301443026" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "74471081002296691130368", + "expectedQty": "73299038386594172929359", + "swapFee": "44682648601378014678", + "reserves": [ + "19545894464495170509417669", + "52403882766412343794396341", + "68546420029722801024492450" + ], + "mAssetSupply": "140317924522921446988327336" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "165004518930782027776", + "139774266355923746816", + "84633473729105018880" + ], + "expectedQty": "391176378678577987855", + "swapFee": "234846735248295770", + "reserves": [ + "19545729459976239727389893", + "52403742992145987870649525", + "68546335396249071919473570" + ], + "mAssetSupply": "140317533346542768410339481" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "1121097802417944653725696", + "expectedQty": "1137439164098273241485045", + "reserves": [ + "20666827262394184381115589", + "52403742992145987870649525", + "68546335396249071919473570" + ] + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "7115516885154793026224128", + "outputIndex": 2, + "expectedQty": "7120905270855558698899026", + "swapFee": "4257545935991004090523", + "reserves": [ + "20666827262394184381115589", + "59519259877300780896873653", + "61425430125393513220574544" + ], + "mAssetSupply": "141459230056577032655915049", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "959631058863509", + "expectedQty": "962632671511789", + "swapFee": "575778635318", + "reserves": [ + "20666827262394184381115589", + "59519259877300780896873653", + "61425430124430880549062755" + ], + "mAssetSupply": "141459230055617977375686858" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "205148158525286580224", + "538056669602970402816", + "7454662825153170432" + ], + "expectedQty": "751567325405852312953", + "swapFee": "451211121916661384", + "reserves": [ + "20666622114235659094535365", + "59518721820631177926470837", + "61425422669768055395892323" + ], + "mAssetSupply": "141458478488292571523373905" + }, + { + "type": "redeemMasset", + "inputQty": "16349693850039274700", + "expectedQtys": [ + "2387920329758220701", + "6877077688414773641", + "7097387020789170874" + ], + "redemptionFee": "4904908155011782", + "reserves": [ + "20666619726315329336314664", + "59518714943553489511697196", + "61425415572381034606721449" + ], + "mAssetSupply": "141458462143503629639110987" + }, + { + "type": "mintMulti", + "inputQtys": [ + "623565398294775220666368", + "1343274183329551292039168", + "556390004286879170560000" + ], + "expectedQty": "2524925701627812966305691", + "reserves": [ + "21290185124610104556981032", + "60861989126883040803736364", + "61981805576667913777281449" + ], + "mAssetSupply": "143983387845131442605416678" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "175332697828987416608768", + "expectedQty": "174729908376057625809511", + "reserves": [ + "21290185124610104556981032", + "61037321824712028220345132", + "61981805576667913777281449" + ] + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "227010939297512520941568", + "expectedQty": "227687857235999017370324", + "swapFee": "136206563578507512564", + "reserves": [ + "21290185124610104556981032", + "61037321824712028220345132", + "61754117719431914759911125" + ], + "mAssetSupply": "143931243020773566217797185" + }, + { + "type": "mintMulti", + "inputQtys": [ + "3371488817897291120640", + "3202975794033022992384", + "4046125525523240583168" + ], + "expectedQty": "10639506988143726681329", + "reserves": [ + "21293556613428001848101672", + "61040524800506061243337516", + "61758163844957438000494293" + ], + "mAssetSupply": "143941882527761709944478514" + }, + { + "type": "mintMulti", + "inputQtys": [ + "46391147902109352984576", + "58751227034476245680128", + "30010399826064435052544" + ], + "expectedQty": "135452986615492379620095", + "reserves": [ + "21339947761330111201086248", + "61099276027540537489017644", + "61788174244783502435546837" + ], + "mAssetSupply": "144077335514377202324098609" + }, + { + "type": "mintMulti", + "inputQtys": [ + "1841942419889154686976", + "1183201086267925463040", + "3504628210812092153856" + ], + "expectedQty": "6537421151732736340239", + "reserves": [ + "21341789703750000355773224", + "61100459228626805414480684", + "61791678872994314527700693" + ], + "mAssetSupply": "144083872935528935060438848" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "11655391237676791808", + "4944670470727446528", + "12587447980346150912" + ], + "expectedQty": "29278711971724453325", + "swapFee": "17577773847343077", + "reserves": [ + "21341778048358762678981416", + "61100454283956334687034156", + "61791666285546334181549781" + ], + "mAssetSupply": "144083843656816963335985523" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "47161963487343102918656", + "35070322636655800877056", + "61839095284427313381376" + ], + "expectedQty": "144350364583230876915437", + "swapFee": "86662216079586277916", + "reserves": [ + "21294616084871419576062760", + "61065383961319678886157100", + "61729827190261906868168405" + ], + "mAssetSupply": "143939493292233732459070086" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "485247278643202555904", + "outputIndex": 1, + "expectedQty": "493043144638801436044", + "swapFee": "294979857294334465", + "reserves": [ + "21295101332150062778618664", + "61064890918175040084721056", + "61729827190261906868168405" + ], + "mAssetSupply": "143939493587213589753404551", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "223019836703692541657088", + "expectedQty": "225923088464488486533643", + "reserves": [ + "21518121168853755320275752", + "61064890918175040084721056", + "61729827190261906868168405" + ] + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "271239560841855565824", + "outputIndex": 0, + "expectedQty": "266717870646101044559", + "swapFee": "162188904462763633", + "reserves": [ + "21517854450983109219231193", + "61065162157735881940286880", + "61729827190261906868168405" + ], + "mAssetSupply": "144165416837866982702701827", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mintMulti", + "inputQtys": [ + "256575008764293", + "212188300286267", + "140650315417512" + ], + "expectedQty": "611501471633659", + "reserves": [ + "21517854451239684227995486", + "61065162157948070240573147", + "61729827190402557183585917" + ], + "mAssetSupply": "144165416838478484174335486" + }, + { + "type": "mintMulti", + "inputQtys": [ + "9248648040065946091520", + "4430499399770162855936", + "251514328243513262080" + ], + "expectedQty": "14033735706546847671737", + "reserves": [ + "21527103099279750174087006", + "61069592657347840403429083", + "61730078704730800696847997" + ], + "mAssetSupply": "144179450574185031022007223" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "8105177681977436160", + "expectedQty": "7997406813151864670", + "swapFee": "4863106609186461", + "reserves": [ + "21527095101872937022222336", + "61069592657347840403429083", + "61730078704730800696847997" + ], + "mAssetSupply": "144179442473870455653757524" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "2193647643208519774109696", + "969437021230021845450752", + "2243727192322415045640192" + ], + "expectedQty": "5425769222415661240820426", + "swapFee": "3257415983039220276658", + "reserves": [ + "19333447458664417248112640", + "60100155636117818557978331", + "59486351512408385651207805" + ], + "mAssetSupply": "138753673251454794412937098" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "1961827767750115662495744", + "expectedQty": "1953958947421932989570820", + "reserves": [ + "19333447458664417248112640", + "62061983403867934220474075", + "59486351512408385651207805" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "85280579806964117143552", + "81949754473713082826752", + "14629535397936587866112" + ], + "expectedQty": "182812936705441070611554", + "swapFee": "109753614191779710193", + "reserves": [ + "19248166878857453130969088", + "61980033649394221137647323", + "59471721977010449063341693" + ], + "mAssetSupply": "140524819262171286331896364" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "213570264110277920", + "49442063445992728", + "112989743685753936" + ], + "expectedQty": "378757306723493615", + "swapFee": "227390818525211", + "reserves": [ + "19248166665287189020691168", + "61980033599952157691654595", + "59471721864020705377587757" + ], + "mAssetSupply": "140524818883413979608402749" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "8835260244761839140864", + "expectedQty": "8975217132828125831506", + "reserves": [ + "19257001925531950859832032", + "61980033599952157691654595", + "59471721864020705377587757" + ] + }, + { + "type": "redeemMasset", + "inputQty": "2671131977261828066508", + "expectedQtys": [ + "365908873097108421117", + "1177703795054947502282", + "1130042506749521108628" + ], + "redemptionFee": "801339593178548419", + "reserves": [ + "19256636016658853751410915", + "61978855896157102744152313", + "59470591821513955856479129" + ], + "mAssetSupply": "140531123769909139084716166" + }, + { + "type": "mintMulti", + "inputQtys": [ + "95080767753762795159552", + "19558121386198595272704", + "108403680939958673080320" + ], + "expectedQty": "224054759514674180946073", + "reserves": [ + "19351716784412616546570467", + "61998414017543301339425017", + "59578995502453914529559449" + ], + "mAssetSupply": "140755178529423813265662239" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "156330651832245087633408", + "expectedQty": "158766107663934782203608", + "reserves": [ + "19508047436244861634203875", + "61998414017543301339425017", + "59578995502453914529559449" + ] + }, + { + "type": "redeemMasset", + "inputQty": "7187844157797844176076", + "expectedQtys": [ + "994782588155034856699", + "3161512855627494627390", + "3038138365169821240304" + ], + "redemptionFee": "2156353247339353252", + "reserves": [ + "19507052653656706599347176", + "61995252504687673844797627", + "59575957364088744708319145" + ], + "mAssetSupply": "140906758949283197543043023" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "17238108789668726177792", + "expectedQty": "17298122336716542093112", + "swapFee": "10342865273801235706", + "reserves": [ + "19507052653656706599347176", + "61977954382350957302704515", + "59575957364088744708319145" + ], + "mAssetSupply": "140889531183358802618100937" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "2560308485943235209854976", + "expectedQty": "2514071123838845198175190", + "swapFee": "1536185091565941125912", + "reserves": [ + "16992981529817861401171986", + "61977954382350957302704515", + "59575957364088744708319145" + ], + "mAssetSupply": "138330758882507133349371873" + }, + { + "type": "mintMulti", + "inputQtys": [ + "474605106447058552750080", + "690595187072884426145792", + "1638230010643455770886144" + ], + "expectedQty": "2802462827212514254890878", + "reserves": [ + "17467586636264919953922066", + "62668549569423841728850307", + "61214187374732200479205289" + ], + "mAssetSupply": "141133221709719647604262751" + }, + { + "type": "redeemMasset", + "inputQty": "31822935455075", + "expectedQtys": [ + "3937436660094", + "14126361566017", + "13798528125618" + ], + "redemptionFee": "9546880636", + "reserves": [ + "17467586636260982517261972", + "62668549569409715367284290", + "61214187374718401951079671" + ], + "mAssetSupply": "141133221709687834215688312" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "2566342729850481016832", + "expectedQty": "2554868879120648417059", + "reserves": [ + "17467586636260982517261972", + "62668549569409715367284290", + "61216753717448252432096503" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "125758318659750265356288", + "939897039545064828698624", + "1499994776364931042246656" + ], + "expectedQty": "2557124022853601418016459", + "swapFee": "1535195531030779318400", + "reserves": [ + "17341828317601232251905684", + "61728652529864650538585666", + "59716758941083321389849847" + ], + "mAssetSupply": "138578652555713353446088912" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "92189316813701446107136", + "77352720277272117903360", + "96098568377683339640832" + ], + "expectedQty": "266672173487396215294211", + "swapFee": "160099363710664127653", + "reserves": [ + "17249639000787530805798548", + "61651299809587378420682306", + "59620660372705638050209015" + ], + "mAssetSupply": "138311980382225957230794701" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "116880919903607736762368", + "outputIndex": 1, + "expectedQty": "119657935948513720294044", + "swapFee": "71503830281562933559", + "reserves": [ + "17366519920691138542560916", + "61531641873638864700388262", + "59620660372705638050209015" + ], + "mAssetSupply": "138312051886056238793728260", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "3494390916192354063876096", + "outputIndex": 1, + "expectedQty": "3491411626588275979581782", + "swapFee": "2087075831114984477543", + "reserves": [ + "17366519920691138542560916", + "58040230247050588720806480", + "63115051288897992114085111" + ], + "mAssetSupply": "138314138961887353778205803", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemMasset", + "inputQty": "10320741290663429734", + "expectedQtys": [ + "1295468344434501879", + "4329553723608178418", + "4708113736979112451" + ], + "redemptionFee": "3096222387199028", + "reserves": [ + "17366518625222794108059037", + "58040225917496865112628062", + "63115046580784255134972660" + ], + "mAssetSupply": "138314128644242285501975097" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "450200868757504262144", + "726035092706914729984", + "354568560124271329280" + ], + "expectedQty": "1534868445160939438623", + "swapFee": "921473951467444129", + "reserves": [ + "17366068424354036603796893", + "58039499882404158197898078", + "63114692012224130863643380" + ], + "mAssetSupply": "138312593775797124562536474" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "22755455268068979113984", + "3841627640361446277120", + "84567944967634708070400" + ], + "expectedQty": "111178951094439070298489", + "swapFee": "66747419108128319170", + "reserves": [ + "17343312969085967624682909", + "58035658254763796751620958", + "63030124067256496155572980" + ], + "mAssetSupply": "138201414824702685492237985" + }, + { + "type": "redeemMasset", + "inputQty": "162503114747708535786700", + "expectedQtys": [ + "20386888791126409488550", + "68220328657428507286724", + "74091272650186178314312" + ], + "redemptionFee": "48750934424312560736", + "reserves": [ + "17322926080294841215194359", + "57967437926106368244334234", + "62956032794606309977258668" + ], + "mAssetSupply": "138038960460889401269012021" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "14450221805708079267840", + "expectedQty": "14379567604279038705815", + "reserves": [ + "17322926080294841215194359", + "57967437926106368244334234", + "62970483016412018056526508" + ] + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "30531464543014452461568", + "expectedQty": "30382096419852991335774", + "reserves": [ + "17322926080294841215194359", + "57967437926106368244334234", + "63001014480955032508988076" + ] + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "903954072688941465600", + "outputIndex": 2, + "expectedQty": "925557640433634058823", + "swapFee": "552948660830342451", + "reserves": [ + "17323830034367530156659959", + "57967437926106368244334234", + "63000088923314598874929253" + ], + "mAssetSupply": "138083722677862194129396061", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "3252909124406532898816", + "outputIndex": 0, + "expectedQty": "3173160344964784918152", + "swapFee": "1942193755231919121", + "reserves": [ + "17320656874022565371741807", + "57967437926106368244334234", + "63003341832439005407828069" + ], + "mAssetSupply": "138083724620055949361315182", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mintMulti", + "inputQtys": [ + "113029560336439079600128", + "63549164415128101191680", + "53863287904228754849792" + ], + "expectedQty": "232112681226856511142838", + "reserves": [ + "17433686434359004451341935", + "58030987090521496345525914", + "63057205120343234162677861" + ], + "mAssetSupply": "138315837301282805872458020" + }, + { + "type": "mintMulti", + "inputQtys": [ + "63191700000537135022080", + "93582018466824266448896", + "60894445884163573678080" + ], + "expectedQty": "218208904745173471352645", + "reserves": [ + "17496878134359541586364015", + "58124569108988320611974810", + "63118099566227397736355941" + ], + "mAssetSupply": "138534046206027979343810665" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "65774176047033567150080", + "outputIndex": 2, + "expectedQty": "65786345109797835558063", + "swapFee": "39304387297705825362", + "reserves": [ + "17496878134359541586364015", + "58190343285035354179124890", + "63052313221117599900797878" + ], + "mAssetSupply": "138534085510415277049636027", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mintMulti", + "inputQtys": [ + "46126089017259712315392", + "17393909730110611652608", + "30487175632613879578624" + ], + "expectedQty": "94672829603674933120891", + "reserves": [ + "17543004223376801298679407", + "58207737194765464790777498", + "63082800396750213780376502" + ], + "mAssetSupply": "138628758340018951982756918" + }, + { + "type": "mintMulti", + "inputQtys": [ + "1868120440982373314592768", + "563982824869952833454080", + "1536033090747997517512704" + ], + "expectedQty": "3991679991889695398968333", + "reserves": [ + "19411124664359174613272175", + "58771720019635417624231578", + "64618833487498211297889206" + ], + "mAssetSupply": "142620438331908647381725251" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "3045228753663694752186368", + "outputIndex": 2, + "expectedQty": "3096533438121587911904286", + "swapFee": "1852477565128983906912", + "reserves": [ + "22456353418022869365458543", + "58771720019635417624231578", + "61522300049376623385984920" + ], + "mAssetSupply": "142622290809473776365632163", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "5923542516054876433154048", + "expectedQty": "5830154911898487777945988", + "swapFee": "3554125509632925859892", + "reserves": [ + "16626198506124381587512555", + "58771720019635417624231578", + "61522300049376623385984920" + ], + "mAssetSupply": "136702302418928532858338007" + }, + { + "type": "redeemMasset", + "inputQty": "4687998712972045398835", + "expectedQtys": [ + "569999281214594202583", + "2014882605581646002206", + "2109181289631291103224" + ], + "redemptionFee": "1406399613891613619", + "reserves": [ + "16625628506843166993309972", + "58769705137029835978229372", + "61520190868086992094881696" + ], + "mAssetSupply": "136697615826615174704552791" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "3546872987088094494720", + "expectedQty": "3560677923519740764934", + "swapFee": "2128123792252856696", + "reserves": [ + "16625628506843166993309972", + "58766144459106316237464438", + "61520190868086992094881696" + ], + "mAssetSupply": "136694071081751878862914767" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "1247432675300747509760", + "expectedQty": "1241850945607651297383", + "reserves": [ + "16625628506843166993309972", + "58767391891781616984974198", + "61520190868086992094881696" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "739752640259631480832", + "1106353047623039057920", + "700313874660906237952" + ], + "expectedQty": "2553502251347140113113", + "reserves": [ + "16626368259483426624790804", + "58768498244829240024032118", + "61520891181961653001119648" + ], + "mAssetSupply": "136697866434948833654325263" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "119288463400772496", + "expectedQty": "121784737661018087", + "reserves": [ + "16626368378771890025563300", + "58768498244829240024032118", + "61520891181961653001119648" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "10528363818531283795968", + "11097300115915905433600", + "1110970948074150428672" + ], + "expectedQty": "22901726924346393668970", + "reserves": [ + "16636896742590421309359268", + "58779595544945155929465718", + "61522002152909727151548320" + ], + "mAssetSupply": "136720768283657917709012320" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "18059233398036824588288", + "3730205104249181306880", + "8328462786207563120640" + ], + "expectedQty": "30438100886740787584760", + "swapFee": "18273824826940636933", + "reserves": [ + "16618837509192384484770980", + "58775865339840906748158838", + "61513673690123519588427680" + ], + "mAssetSupply": "136690330182771176921427560" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "1015452138593846296576", + "671737288113920409600", + "300139239781611601920" + ], + "expectedQty": "2004112503950057769284", + "swapFee": "1203189416019646449", + "reserves": [ + "16617822057053790638474404", + "58775193602552792827749238", + "61513373550883737976825760" + ], + "mAssetSupply": "136688326070267226863658276" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "256700836956974050443264", + "outputIndex": 0, + "expectedQty": "250052327731745514118684", + "swapFee": "153328097745692550607", + "reserves": [ + "16367769729322045124355720", + "59031894439509766878192502", + "61513373550883737976825760" + ], + "mAssetSupply": "136688479398364972556208883", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemMasset", + "inputQty": "26435696754280588902", + "expectedQtys": [ + "3164594346158865709", + "11413405887037571690", + "11893182600409666651" + ], + "redemptionFee": "7930709026284176", + "reserves": [ + "16367766564727698965490011", + "59031883026103879840620812", + "61513361657701137567159109" + ], + "mAssetSupply": "136688452970598927301904157" + }, + { + "type": "mintMulti", + "inputQtys": [ + "20735118847750348734464", + "24933008610611781697536", + "24525195313055421956096" + ], + "expectedQty": "70405288751994256077785", + "reserves": [ + "16388501683575449314224475", + "59056816034714491622318348", + "61537886853014192989115205" + ], + "mAssetSupply": "136758858259350921557981942" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "36848589853943222272", + "outputIndex": 0, + "expectedQty": "35865729398378244625", + "swapFee": "21998568821780914", + "reserves": [ + "16388465817846050935979850", + "59056816034714491622318348", + "61537923701604046932337477" + ], + "mAssetSupply": "136758858281349490379762856", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mintMulti", + "inputQtys": [ + "37194548958824696381440", + "50492645048442750500864", + "71570909449996300451840" + ], + "expectedQty": "159472840747451943229014", + "reserves": [ + "16425660366804875632361290", + "59107308679762934372819212", + "61609494611054043232789317" + ], + "mAssetSupply": "136918331122096942322991870" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "133824976120158810537984", + "expectedQty": "130894855434748614552892", + "swapFee": "80294985672095286322", + "reserves": [ + "16294765511370127017808398", + "59107308679762934372819212", + "61609494611054043232789317" + ], + "mAssetSupply": "136784586440962455607740208" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "292263279974477955072", + "outputIndex": 1, + "expectedQty": "291967334095114813218", + "swapFee": "174473444828160319", + "reserves": [ + "16294765511370127017808398", + "59107016712428839258005994", + "61609786874334017710744389" + ], + "mAssetSupply": "136784586615435900435900527", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemMasset", + "inputQty": "51800246073619196883763", + "expectedQtys": [ + "6168967295374434338408", + "22377078870616051335572", + "23324592184990454398957" + ], + "redemptionFee": "15540073822085759065", + "reserves": [ + "16288596544074752583469990", + "59084639633558223206670422", + "61586462282149027256345432" + ], + "mAssetSupply": "136732801909436103324775829" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "236841953881998210629632", + "expectedQty": "231544195116461358252579", + "swapFee": "142105172329198926377", + "reserves": [ + "16057052348958291225217411", + "59084639633558223206670422", + "61586462282149027256345432" + ], + "mAssetSupply": "136496102060726434313072574" + }, + { + "type": "mintMulti", + "inputQtys": [ + "67800680753681781489664", + "353743790768546104999936", + "170406215712061226221568" + ], + "expectedQty": "590937438336501364926257", + "reserves": [ + "16124853029711973006707075", + "59438383424326769311670358", + "61756868497861088482567000" + ], + "mAssetSupply": "137087039499062935677998831" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "153737961449803374133248", + "expectedQty": "152949828149220597389084", + "reserves": [ + "16124853029711973006707075", + "59438383424326769311670358", + "61910606459310891856700248" + ] + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "337288827271081920", + "expectedQty": "335556336573075626", + "reserves": [ + "16124853029711973006707075", + "59438383424326769311670358", + "61910606796599719127782168" + ] + }, + { + "type": "redeemMasset", + "inputQty": "1793493743290064966359449", + "expectedQtys": [ + "210661244906792857301837", + "776525765806599665236438", + "808823837133578570905071" + ], + "redemptionFee": "538048122987019489907", + "reserves": [ + "15914191784805180149405238", + "58661857658520169646433920", + "61101782959466140556877097" + ], + "mAssetSupply": "135447033967601414901593999" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "30363532487571722240", + "expectedQty": "30207569543792226371", + "reserves": [ + "15914191784805180149405238", + "58661857658520169646433920", + "61101813322998628128599337" + ] + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "2360687950605993025470464", + "expectedQty": "2371076418660394620306067", + "swapFee": "1416412770363595815282", + "reserves": [ + "15914191784805180149405238", + "58661857658520169646433920", + "58730736904338233508293270" + ], + "mAssetSupply": "133087792637335329264165188" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "67293271522198104834048", + "expectedQty": "65815340219241363507185", + "swapFee": "40375962913318862900", + "reserves": [ + "15848376444585938785898053", + "58661857658520169646433920", + "58730736904338233508293270" + ], + "mAssetSupply": "133020539741776044478194040" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "281860657860329714221056", + "expectedQty": "283054126704795449488039", + "swapFee": "169116394716197828532", + "reserves": [ + "15848376444585938785898053", + "58378803531815374196945881", + "58730736904338233508293270" + ], + "mAssetSupply": "132738848200310430961801516" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "6668339533909736", + "42778647686112136", + "28067570113669072" + ], + "expectedQty": "77318754364983051", + "swapFee": "46419104081438", + "reserves": [ + "15848376437917599251988317", + "58378803489036726510833745", + "58730736876270663394624198" + ], + "mAssetSupply": "132738848122991676596818465" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "48374640194243272", + "outputIndex": 2, + "expectedQty": "49641842673424549", + "swapFee": "29658319139320", + "reserves": [ + "15848376486292239446231589", + "58378803489036726510833745", + "58730736826628820721199649" + ], + "mAssetSupply": "132738848123021334915957785", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "1194720875023549541122048", + "expectedQty": "1199658211377411529358671", + "swapFee": "716832525014129724673", + "reserves": [ + "15848376486292239446231589", + "57179145277659314981475074", + "58730736826628820721199649" + ], + "mAssetSupply": "131544844080522799504560410" + }, + { + "type": "mintMulti", + "inputQtys": [ + "101170277937744011329536", + "88608574149068758974464", + "144978782440554787504128" + ], + "expectedQty": "335794297982212236638949", + "reserves": [ + "15949546764229983457561125", + "57267753851808383740449538", + "58875715609069375508703777" + ], + "mAssetSupply": "131880638378505011741199359" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "1896484826897186681782272", + "2004388344569198681260032", + "345168999773287691059200" + ], + "expectedQty": "4279234527532745980571539", + "swapFee": "2569082165819139071785", + "reserves": [ + "14053061937332796775778853", + "55263365507239185059189506", + "58530546609296087817644577" + ], + "mAssetSupply": "127601403850972265760627820" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "1573563768693730050048", + "expectedQty": "1564611897567747070795", + "reserves": [ + "14053061937332796775778853", + "55263365507239185059189506", + "58532120173064781547694625" + ] + }, + { + "type": "redeemMasset", + "inputQty": "4683239009938144", + "expectedQtys": [ + "515615776907074", + "2027648014901081", + "2147580701745709" + ], + "redemptionFee": "1404971702981", + "reserves": [ + "14053061936817180998871779", + "55263365505211537044288425", + "58532120170917200845948916" + ], + "mAssetSupply": "127602968458187999469463452" + }, + { + "type": "redeemMasset", + "inputQty": "56226824815629989576704", + "expectedQtys": [ + "6190467302396338484268", + "24343880267411095881221", + "25783788450309872239596" + ], + "redemptionFee": "16868047444688996873", + "reserves": [ + "14046871469514784660387511", + "55239021624944125948407204", + "58506336382466890973709320" + ], + "mAssetSupply": "127546758501419814168883621" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "1368758212235683956785152", + "expectedQty": "1401485533396094557812632", + "reserves": [ + "15415629681750468617172663", + "55239021624944125948407204", + "58506336382466890973709320" + ] + }, + { + "type": "redeemMasset", + "inputQty": "108455652846173696819", + "expectedQtys": [ + "12961871796125194665", + "46446439829411493218", + "49193685052532926597" + ], + "redemptionFee": "32536695853852109", + "reserves": [ + "15415616719878672491977998", + "55238975178504296536913986", + "58506287188781838440782723" + ], + "mAssetSupply": "128948135611699758406851543" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "6750662822121233711104", + "expectedQty": "6897614692277788834978", + "reserves": [ + "15422367382700793725689102", + "55238975178504296536913986", + "58506287188781838440782723" + ] + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "3672650112978031132803072", + "outputIndex": 2, + "expectedQty": "3670186914485210910470470", + "swapFee": "2193047011472816275382", + "reserves": [ + "15422367382700793725689102", + "58911625291482327669717058", + "54836100274296627530312253" + ], + "mAssetSupply": "128957226273403509011961903", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mintMulti", + "inputQtys": [ + "74088891528682", + "224724817302616", + "122730151871891" + ], + "expectedQty": "421449151174107", + "reserves": [ + "15422367382774882617217784", + "58911625291707052487019674", + "54836100274419357682184144" + ], + "mAssetSupply": "128957226273824958163136010" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "1473017080097690871660544", + "outputIndex": 0, + "expectedQty": "1430215825837280691626528", + "swapFee": "879780189326771889644", + "reserves": [ + "13992151556937601925591256", + "58911625291707052487019674", + "56309117354517048553844688" + ], + "mAssetSupply": "128958106054014284935025654", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "180602025652443464859648", + "expectedQty": "175666641676366804168041", + "swapFee": "108361215391466078915", + "reserves": [ + "13816484915261235121423215", + "58911625291707052487019674", + "56309117354517048553844688" + ], + "mAssetSupply": "128777612389577232936244921" + }, + { + "type": "redeemMasset", + "inputQty": "6967944456067572", + "expectedQtys": [ + "747362961091713", + "3186654709267145", + "3045879537424804" + ], + "redemptionFee": "2090383336820", + "reserves": [ + "13816484914513872160331502", + "58911625288520397777752529", + "56309117351471169016419884" + ], + "mAssetSupply": "128777612382611378863514169" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "24853101995244179456", + "expectedQty": "24971698884575453426", + "swapFee": "14911861197146507", + "reserves": [ + "13816484914513872160331502", + "58911625288520397777752529", + "56309092379772284440966458" + ], + "mAssetSupply": "128777587544421244816481220" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "78252761369792049315840", + "expectedQty": "77796650614039202315411", + "reserves": [ + "13816484914513872160331502", + "58989878049890189827068369", + "56309092379772284440966458" + ] + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "7015403762504864083476480", + "expectedQty": "6656323807157429398100773", + "swapFee": "4209242257502918450085", + "reserves": [ + "7160161107356442762230729", + "58989878049890189827068369", + "56309092379772284440966458" + ], + "mAssetSupply": "121844189674787922853770236" + }, + { + "type": "mintMulti", + "inputQtys": [ + "47814479630417770053632", + "66655533775609380470784", + "19275724483168340803584" + ], + "expectedQty": "137566863417578913266440", + "reserves": [ + "7207975586986860532284361", + "59056533583665799207539153", + "56328368104255452781770042" + ], + "mAssetSupply": "121981756538205501767036676" + }, + { + "type": "mintMulti", + "inputQtys": [ + "700037713738122412425216", + "877600899462148655153152", + "894416358516022153576448" + ], + "expectedQty": "2517642797656036278292864", + "reserves": [ + "7908013300724982944709577", + "59934134483127947862692305", + "57222784462771474935346490" + ], + "mAssetSupply": "124499399335861538045329540" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "250218065001297149952", + "141725411469136543744", + "44493057756931293184" + ], + "expectedQty": "456050645341335880010", + "swapFee": "273794664003203450", + "reserves": [ + "7907763082659981647559625", + "59933992757716478726148561", + "57222739969713718004053306" + ], + "mAssetSupply": "124498943285216196709449530" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "39854245193175851008", + "expectedQty": "40245009908797642157", + "swapFee": "23912547115905510", + "reserves": [ + "7907763082659981647559625", + "59933992757716478726148561", + "57222699724703809206411149" + ], + "mAssetSupply": "124498903454883550649504032" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "19620430748705263452160", + "expectedQty": "21312638093570235724415", + "reserves": [ + "7927383513408686911011785", + "59933992757716478726148561", + "57222699724703809206411149" + ] + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "2546317475296926819680256", + "outputIndex": 0, + "hardLimitError": true + }, + { + "type": "redeemBassets", + "inputQtys": [ + "1517804081613381888", + "4709667364161606656", + "4997539432036086784" + ], + "expectedQty": "11252547377951940281", + "swapFee": "6755581775836666", + "reserves": [ + "7927381995604605297629897", + "59933988048049114564541905", + "57222694727164377170324365" + ], + "mAssetSupply": "124520204840429742933288166" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "364722995862828075712512", + "expectedQty": "360959848126284985593817", + "reserves": [ + "7927381995604605297629897", + "59933988048049114564541905", + "57587417723027205246036877" + ] + }, + { + "type": "redeemMasset", + "inputQty": "955423857757340876", + "expectedQtys": [ + "60631542827723627", + "458397257150772200", + "440449821384624269" + ], + "redemptionFee": "286627157327202", + "reserves": [ + "7927381934973062469906270", + "59933987589651857413769705", + "57587417282577383861412608" + ], + "mAssetSupply": "124881163733418797318868309" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "452638492588848753672192", + "expectedQty": "447926099720616118803835", + "reserves": [ + "7927381934973062469906270", + "59933987589651857413769705", + "58040055775166232615084800" + ] + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "578127280822173493624832", + "expectedQty": "571758896959911262358837", + "reserves": [ + "7927381934973062469906270", + "60512114870474030907394537", + "58040055775166232615084800" + ] + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "308844112032324980310016", + "expectedQty": "311905254104202905837220", + "swapFee": "185306467219394988186", + "reserves": [ + "7927381934973062469906270", + "60512114870474030907394537", + "57728150521062029709247580" + ], + "mAssetSupply": "125592189924534219114709151" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "392718126900974731657216", + "outputIndex": 1, + "expectedQty": "392727017166334102101475", + "swapFee": "233176157512392753869", + "reserves": [ + "7927381934973062469906270", + "60119387853307696805293062", + "58120868647963004440904796" + ], + "mAssetSupply": "125592423100691731507463020", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemMasset", + "inputQty": "132086407201826380185", + "expectedQtys": [ + "8334780416239908162", + "63209001487044297238", + "61107775777116031072" + ], + "redemptionFee": "39625922160547914", + "reserves": [ + "7927373600192646229998108", + "60119324644306209760995824", + "58120807540187227324873724" + ], + "mAssetSupply": "125592291053910451841630749" + }, + { + "type": "mintMulti", + "inputQtys": [ + "329519639034037824", + "151726408753347136", + "351029252483160896" + ], + "expectedQty": "855790479672858042", + "reserves": [ + "7927373929712285264035932", + "60119324796032618514342960", + "58120807891216479808034620" + ], + "mAssetSupply": "125592291909700931514488791" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "93369373939221348352", + "expectedQty": "92343273060708446821", + "reserves": [ + "7927373929712285264035932", + "60119418165406557735691312", + "58120807891216479808034620" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "11080363533886117888", + "14910919427272450048", + "823288810405026048" + ], + "expectedQty": "27612508736861097439", + "reserves": [ + "7927385010075819150153820", + "60119433076325985008141360", + "58120808714505290213060668" + ], + "mAssetSupply": "125592411865482729084033051" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "68264443735905188970496", + "165833169336398136737792", + "82216894558447505244160" + ], + "expectedQty": "319638830951757008480130", + "swapFee": "191898437633634385719", + "reserves": [ + "7859120566339913961183324", + "59953599906989586871403568", + "58038591819946842707816508" + ], + "mAssetSupply": "125272773034530972075552921" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "112606992270395103510528", + "402191707800295230668800", + "350949863918884737777664" + ], + "expectedQty": "867628790642102869918390", + "swapFee": "520889808270223856264", + "reserves": [ + "7746513574069518857672796", + "59551408199189291640734768", + "57687641956027957970038844" + ], + "mAssetSupply": "124405144243888869205634531" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "134122201436478815338496", + "expectedQty": "135550368319784013883337", + "swapFee": "80473320861887289203", + "reserves": [ + "7746513574069518857672796", + "59415857830869507626851431", + "57687641956027957970038844" + ], + "mAssetSupply": "124271102515773252277585238" + }, + { + "type": "mintMulti", + "inputQtys": [ + "12618670493840525230080", + "6952983326559401148416", + "15762734947959891296256" + ], + "expectedQty": "36222110292934302968964", + "reserves": [ + "7759132244563359382902876", + "59422810814196067027999847", + "57703404690975917861335100" + ], + "mAssetSupply": "124307324626066186580554202" + }, + { + "type": "redeemMasset", + "inputQty": "44241550947660973526220", + "expectedQtys": [ + "2760682548083543870651", + "21142508157115814479022", + "20530747160160546202324" + ], + "redemptionFee": "13272465284298292057", + "reserves": [ + "7756371562015275839032225", + "59401668306038951213520825", + "57682873943815757315132776" + ], + "mAssetSupply": "124263096347583809905320039" + }, + { + "type": "mintMulti", + "inputQtys": [ + "6313485598312793899008", + "1271210731586709618688", + "5289682003144250228736" + ], + "expectedQty": "13369577078871096962592", + "reserves": [ + "7762685047613588632931233", + "59402939516770537923139513", + "57688163625818901565361512" + ], + "mAssetSupply": "124276465924662681002282631" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "1648182613853673728", + "1122848963410188800", + "570780752077326784" + ], + "expectedQty": "3470833596124755189", + "swapFee": "2083750407919604", + "reserves": [ + "7762683399430974779257505", + "59402938393921574512950713", + "57688163055038149488034728" + ], + "mAssetSupply": "124276462453829084877527442" + }, + { + "type": "redeemMasset", + "inputQty": "258308630500690878267392", + "expectedQtys": [ + "16129897229950679686528", + "123431968321841179952286", + "119868876982746894053571" + ], + "redemptionFee": "77492589150207263480", + "reserves": [ + "7746553502201024099570977", + "59279506425599733332998427", + "57568294178055402593981157" + ], + "mAssetSupply": "124018231315917544206523530" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "45299964227441311744", + "100922623341420527616", + "25269414661925990400" + ], + "expectedQty": "174159472576048560485", + "swapFee": "104558418596787208", + "reserves": [ + "7746508202236796658259233", + "59279405502976391912470811", + "57568268908640740667990757" + ], + "mAssetSupply": "124018057156444968157963045" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "570135109495811653763072", + "outputIndex": 1, + "expectedQty": "569965697657188941552445", + "swapFee": "338419692922855440386", + "reserves": [ + "7746508202236796658259233", + "58709439805319202970918366", + "58138404018136552321753829" + ], + "mAssetSupply": "124018395576137891013403431", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mintMulti", + "inputQtys": [ + "2041272584147709", + "2632113737049782", + "2106998297240376" + ], + "expectedQty": "6911567430634226", + "reserves": [ + "7746508204278069242406942", + "58709439807951316707968148", + "58138404020243550618994205" + ], + "mAssetSupply": "124018395583049458444037657" + }, + { + "type": "redeemMasset", + "inputQty": "2411341551546806272", + "expectedQtys": [ + "150573414382991197", + "1141169747101530157", + "1130070190240213651" + ], + "redemptionFee": "723402465464041", + "reserves": [ + "7746508053704654859415745", + "58709438666781569606437991", + "58138402890173360378780554" + ], + "mAssetSupply": "124018393172431309362695426" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "298519608054450732662784", + "expectedQty": "295289060445949480060000", + "reserves": [ + "7746508053704654859415745", + "58709438666781569606437991", + "58436922498227811111443338" + ] + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "67595923179583904", + "expectedQty": "66857246327993464", + "reserves": [ + "7746508053704654859415745", + "58709438734377492786021895", + "58436922498227811111443338" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "26789032887146", + "26854174869838", + "17500323887282" + ], + "expectedQty": "73069729213335", + "swapFee": "43868158423", + "reserves": [ + "7746508053677865826528599", + "58709438734350638611152057", + "58436922498210310787556056" + ], + "mAssetSupply": "124313682299661435441535555" + }, + { + "type": "mintMulti", + "inputQtys": [ + "3405696339437579776", + "464901004390288588800", + "347283218019036233728" + ], + "expectedQty": "807045648755565510382", + "reserves": [ + "7746511459374205264108375", + "58709903635355028899740857", + "58437269781428329823789784" + ], + "mAssetSupply": "124314489345310191007045937" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "125612120683995985870848", + "outputIndex": 1, + "expectedQty": "125541650746299781622648", + "swapFee": "74547965145935388904", + "reserves": [ + "7746511459374205264108375", + "58584361984608729118118209", + "58562881902112325809660632" + ], + "mAssetSupply": "124314563893275336942434841", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemBassets", + "inputQtys": [ + "168078116360216674304", + "178060319494895468544", + "183997029707353063424" + ], + "expectedQty": "541310707807899328705", + "swapFee": "324981413532859312", + "reserves": [ + "7746343381257845047434071", + "58584183924289234222649665", + "58562697905082618456597208" + ], + "mAssetSupply": "124314022582567529043106136" + }, + { + "type": "redeemMasset", + "inputQty": "28581604415616304807936", + "expectedQtys": [ + "1780462869077973480182", + "13465316351041285749177", + "13460377884268145655777" + ], + "redemptionFee": "8574481324684891442", + "reserves": [ + "7744562918388767073953889", + "58570718607938192936900488", + "58549237527198350310941431" + ], + "mAssetSupply": "124285449552633237423189642" + }, + { + "type": "redeemMasset", + "inputQty": "13508015299486388", + "expectedQtys": [ + "841468495817961", + "6363872952594281", + "6361538972886300" + ], + "redemptionFee": "4052404589845", + "reserves": [ + "7744562917547298578135928", + "58570718601574319984306207", + "58549237520836811338055131" + ], + "mAssetSupply": "124285449539129274528293099" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "24934908450412190236672", + "46155933895268514136064", + "450624424388329603072" + ], + "expectedQty": "73282222846800287560218", + "swapFee": "43995731146768233476", + "reserves": [ + "7719628009096886387899256", + "58524562667679051470170143", + "58548786896412423008452059" + ], + "mAssetSupply": "124212167316282474240732881" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "13754706994063001600", + "expectedQty": "14998832946549306128", + "reserves": [ + "7719641763803880450900856", + "58524562667679051470170143", + "58548786896412423008452059" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "1083153138078668161024", + "1774689526806698524672", + "1919119470853669257216" + ], + "expectedQty": "4834585962646026093237", + "swapFee": "2902493073431674660", + "reserves": [ + "7718558610665801782739832", + "58522787978152244771645471", + "58546867776941569339194843" + ], + "mAssetSupply": "124207347729152774763945772" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "15069710773474536980480", + "935170646402117664768", + "16173377560816820158464" + ], + "expectedQty": "33356874764873966063109", + "swapFee": "20026140543250329835", + "reserves": [ + "7703488899892327245759352", + "58521852807505842653980703", + "58530694399380752519036379" + ], + "mAssetSupply": "124173990854387900797882663" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "3018054481252207558656", + "2082582026217424158720", + "1608322693801397977088" + ], + "expectedQty": "6942651226084092628436", + "swapFee": "4168091590604818468", + "reserves": [ + "7700470845411075038200696", + "58519770225479625229821983", + "58529086076686951121059291" + ], + "mAssetSupply": "124167048203161816705254227" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "5514640460417497917554688", + "expectedQty": "5450742427925940376815444", + "reserves": [ + "7700470845411075038200696", + "58519770225479625229821983", + "64043726537104449038613979" + ] + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "957183372276163200", + "outputIndex": 2, + "expectedQty": "958005851093288485", + "swapFee": "568121813984526", + "reserves": [ + "7700470845411075038200696", + "58519771182662997505985183", + "64043725579098597945325494" + ], + "mAssetSupply": "129617790631655878896054197", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemBassets", + "inputQtys": [ + "110647621991716356096", + "131248396373534048256", + "164774529845122039808" + ], + "expectedQty": "414261727096458361186", + "swapFee": "248706260013883346", + "reserves": [ + "7700360197789083321844600", + "58519639934266623971936927", + "64043560804568752823285686" + ], + "mAssetSupply": "129617376369928782437693011" + }, + { + "type": "redeemMasset", + "inputQty": "5020387353345860304896", + "expectedQtys": [ + "298163675259116953563", + "2265923991795980531097", + "2479814317212539140141" + ], + "redemptionFee": "1506116206003758091", + "reserves": [ + "7700062034113824204891037", + "58517374010274827991405830", + "64041080990251540284145545" + ], + "mAssetSupply": "129612357488691642581146206" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "2217684883344656896", + "5349305149456928768", + "5983401245500022784" + ], + "expectedQty": "13640493562951682977", + "swapFee": "8189209663569151", + "reserves": [ + "7700059816428940860234141", + "58517368660969678534477062", + "64041075006850294784122761" + ], + "mAssetSupply": "129612343848198079629463229" + }, + { + "type": "mintMulti", + "inputQtys": [ + "1504306252108666765312", + "474629496879264890880", + "5630724938842276626432" + ], + "expectedQty": "7685539740900255994982", + "reserves": [ + "7701564122681049526999453", + "58517843290466557799367942", + "64046705731789137060749193" + ], + "mAssetSupply": "129620029387938979885458211" + }, + { + "type": "mintMulti", + "inputQtys": [ + "101641347712008427929600", + "186337738449016464605184", + "324659372228908513492992" + ], + "expectedQty": "616723365588307560660758", + "reserves": [ + "7803205470393057954929053", + "58704181028915574263973126", + "64371365104018045574242185" + ], + "mAssetSupply": "130236752753527287446118969" + }, + { + "type": "mintMulti", + "inputQtys": [ + "31141933486044276", + "135401975699626176", + "95064668400955440" + ], + "expectedQty": "262060978856495308", + "reserves": [ + "7803205501534991440973329", + "58704181164317549963599302", + "64371365199082713975197625" + ], + "mAssetSupply": "130236753015588266302614277" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "84202382539297961017344", + "expectedQty": "85057190835671062883005", + "swapFee": "50521429523578776610", + "reserves": [ + "7803205501534991440973329", + "58619123973481878900716297", + "64371365199082713975197625" + ], + "mAssetSupply": "130152601154478491920373543" + }, + { + "type": "mintMulti", + "inputQtys": [ + "51525737673953887911936", + "9086448200098525478912", + "38080277614427119812608" + ], + "expectedQty": "103140497497031836173356", + "reserves": [ + "7854731239208945328885265", + "58628210421681977426195209", + "64409445476697141095010233" + ], + "mAssetSupply": "130255741651975523756546899" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "337558575913693216768", + "outputIndex": 0, + "expectedQty": "304405115004566314992", + "swapFee": "200396559137374365", + "reserves": [ + "7854426834093940762570273", + "58628547980257891119411977", + "64409445476697141095010233" + ], + "mAssetSupply": "130255741852372082893921264", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "680159101078174302208", + "expectedQty": "688039538833433648065", + "swapFee": "408095460646904581", + "reserves": [ + "7854426834093940762570273", + "58628547980257891119411977", + "64408757437158307661362168" + ], + "mAssetSupply": "130255062101366465366523637" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "1124522197985237091221504", + "118725377314087749287936", + "1461489583875277740572672" + ], + "expectedQty": "2809074842635682948015118", + "swapFee": "1686456779649199288382", + "reserves": [ + "6729904636108703671348769", + "58509822602943803370124041", + "62947267853283029920789496" + ], + "mAssetSupply": "127445987258730782418508519" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "57175073961634512", + "expectedQty": "50696958923046634", + "swapFee": "34305044376980", + "reserves": [ + "6729904585411744748302135", + "58509822602943803370124041", + "62947267853283029920789496" + ], + "mAssetSupply": "127445987201590013501250987" + }, + { + "type": "mintMulti", + "inputQtys": [ + "62722346981800083456", + "53623187243686166528", + "87568621603050815488" + ], + "expectedQty": "210012184865582308284", + "reserves": [ + "6729967307758726548385591", + "58509876226131047056290569", + "62947355421904632971604984" + ], + "mAssetSupply": "127446197213774879083559271" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "127877697828619359879168", + "expectedQty": "113176896908202407360367", + "swapFee": "76726618697171615927", + "reserves": [ + "6616790410850524141025224", + "58509876226131047056290569", + "62947355421904632971604984" + ], + "mAssetSupply": "127318396242564956895296030" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "186687389939307347181568", + "expectedQty": "188971839838211662065064", + "swapFee": "112012433963584408308", + "reserves": [ + "6616790410850524141025224", + "58320904386292835394225505", + "62947355421904632971604984" + ], + "mAssetSupply": "127131820865059613132522770" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "24341546235341960118272", + "outputIndex": 2, + "expectedQty": "27891028628065193578479", + "swapFee": "16511052791132500409", + "reserves": [ + "6641131957085866101143496", + "58320904386292835394225505", + "62919464393276567778026505" + ], + "mAssetSupply": "127131837376112404265023179", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "5424404860211452738273280", + "expectedQty": "5493873765404344127005978", + "swapFee": "3254642916126871642963", + "reserves": [ + "6641131957085866101143496", + "58320904386292835394225505", + "57425590627872223651020527" + ], + "mAssetSupply": "121710687158817078398392862" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "23361133372491046060032", + "4348680941312853147648", + "24895580935638516498432" + ], + "expectedQty": "55017621611668448278423", + "swapFee": "33030391201722102228", + "reserves": [ + "6617770823713375055083464", + "58316555705351522541077857", + "57400695046936585134522095" + ], + "mAssetSupply": "121655669537205409950114439" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "2229499844635483940323328", + "expectedQty": "2429962535594404116360618", + "reserves": [ + "8847270668348858995406792", + "58316555705351522541077857", + "57400695046936585134522095" + ] + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "217719855959396745216", + "expectedQty": "219610550085089840182", + "swapFee": "130631913575638047", + "reserves": [ + "8847270668348858995406792", + "58316555705351522541077857", + "57400475436386500044681913" + ], + "mAssetSupply": "124085414483575768245367888" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "1675879957711709446078464", + "expectedQty": "1690131736743981027620133", + "swapFee": "1005527974627025667647", + "reserves": [ + "8847270668348858995406792", + "58316555705351522541077857", + "55710343699642519017061780" + ], + "mAssetSupply": "122410540053838685824957071" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "117989621479315062784", + "989630623838864670720", + "892029290209021132800" + ], + "expectedQty": "1990138474580201311336", + "swapFee": "1194799964726956960", + "reserves": [ + "8847152678727379680344008", + "58315566074727683676407137", + "55709451670352309995928980" + ], + "mAssetSupply": "122408549915364105623645735" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "75639257162090056515584", + "5846903193521304371200", + "84074700819985590124544" + ], + "expectedQty": "169774266329441148313736", + "swapFee": "101925715226800769449", + "reserves": [ + "8771513421565289623828424", + "58309719171534162372035937", + "55625376969532324405804436" + ], + "mAssetSupply": "122238775649034664475331999" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "11435951588965911363584", + "outputIndex": 1, + "expectedQty": "12309469407525062837895", + "swapFee": "7319505133507223771", + "reserves": [ + "8782949373154255535192008", + "58297409702126637309198042", + "55625376969532324405804436" + ], + "mAssetSupply": "122238782968539797982555770", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "293946187448376576", + "expectedQty": "275416271053715654", + "swapFee": "176367712469025", + "reserves": [ + "8782949097737984481476354", + "58297409702126637309198042", + "55625376969532324405804436" + ], + "mAssetSupply": "122238782674769978246648219" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "97891989825386857889792", + "expectedQty": "98711168401714761207916", + "swapFee": "58735193895232114733", + "reserves": [ + "8782949097737984481476354", + "58297409702126637309198042", + "55526665801130609644596520" + ], + "mAssetSupply": "122140949420138486620873160" + }, + { + "type": "redeemMasset", + "inputQty": "99762264069186355", + "expectedQtys": [ + "7171583562164250", + "47601863620523803", + "45339454810655195" + ], + "redemptionFee": "29928679220755", + "reserves": [ + "8782949090566400919312104", + "58297409654524773688674239", + "55526665755791154833941325" + ], + "mAssetSupply": "122140949320406151230907560" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "5802690018249059386523648", + "1156242009859294207410176", + "907146503785958850166784" + ], + "hardLimitError": true + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "857141041908365123387392", + "expectedQty": "798318191698680896400653", + "swapFee": "514284625145019074032", + "reserves": [ + "7984630898867720022911451", + "58297409654524773688674239", + "55526665755791154833941325" + ], + "mAssetSupply": "121284322563122931126594200" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "1308006224223588421992448", + "expectedQty": "1320042158100444653068590", + "swapFee": "784803734534153053195", + "reserves": [ + "7984630898867720022911451", + "58297409654524773688674239", + "54206623597690710180872735" + ], + "mAssetSupply": "119977101142633876857654947" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "76592365319587161440256", + "expectedQty": "77367934382726502703464", + "swapFee": "45955419191752296864", + "reserves": [ + "7984630898867720022911451", + "58220041720142047185970775", + "54206623597690710180872735" + ], + "mAssetSupply": "119900554732733481448511555" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "160953755632893088", + "outputIndex": 1, + "expectedQty": "175315331627247908", + "swapFee": "104135653306774", + "reserves": [ + "7984631059821475655804539", + "58220041544826715558722867", + "54206623597690710180872735" + ], + "mAssetSupply": "119900554732837617101818329", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "201579077842804244480", + "expectedQty": "203403310816787547520", + "swapFee": "120947446705682546", + "reserves": [ + "7984631059821475655804539", + "58220041544826715558722867", + "54206420194379893393325215" + ], + "mAssetSupply": "119900353274707221003256395" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "41441333904668819456", + "71846336189688643584", + "19064176253916037120" + ], + "expectedQty": "134652889736076516224", + "swapFee": "80840237984436571", + "reserves": [ + "7984589618487570986985083", + "58219969698490525870079283", + "54206401130203639477288095" + ], + "mAssetSupply": "119900218621817484926740171" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "58843521218520201297920", + "expectedQty": "63419083107867130068768", + "reserves": [ + "8043433139706091188283003", + "58219969698490525870079283", + "54206401130203639477288095" + ] + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "155022218389461049278464", + "expectedQty": "153548880210398304986344", + "reserves": [ + "8043433139706091188283003", + "58219969698490525870079283", + "54361423348593100526566559" + ] + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "8813133656767868174336", + "expectedQty": "8892509524602510769063", + "swapFee": "5287880194060720904", + "reserves": [ + "8043433139706091188283003", + "58219969698490525870079283", + "54352530839068498015797496" + ], + "mAssetSupply": "120108378739359176554341851" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "9661290731390336237568", + "expectedQty": "9559618933164834118330", + "reserves": [ + "8043433139706091188283003", + "58229630989221916206316851", + "54352530839068498015797496" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "7616364137128629248", + "1783391236097271040", + "3759786507428243968" + ], + "expectedQty": "13694523490429541037", + "swapFee": "8221647082507228", + "reserves": [ + "8043425523341954059653755", + "58229629205830680109045811", + "54352527079281990587553528" + ], + "mAssetSupply": "120117924663768850958919144" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "9056349920215086080", + "4094263105026608128", + "1626091644674259200" + ], + "expectedQty": "15419139584414864046", + "swapFee": "9257037973432978", + "reserves": [ + "8043416466992033844567675", + "58229625111567575082437683", + "54352525453190345913294328" + ], + "mAssetSupply": "120117909244629266544055098" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "1557649228721414995968", + "4688079511271599243264", + "4197575735766593044480" + ], + "expectedQty": "10474582791844799965323", + "swapFee": "6288522788780148068", + "reserves": [ + "8041858817763312429571707", + "58224937032056303483194419", + "54348327877454579320249848" + ], + "mAssetSupply": "120107434661837421744089775" + }, + { + "type": "mintMulti", + "inputQtys": [ + "198270231254226534400", + "307558916953425313792", + "68290336758367617024" + ], + "expectedQty": "585582214935211877141", + "reserves": [ + "8042057087994566656106107", + "58225244590973256908508211", + "54348396167791337687866872" + ], + "mAssetSupply": "120108020244052356955966916" + }, + { + "type": "mintMulti", + "inputQtys": [ + "947892379612087261855744", + "1654758912865500552757248", + "1694689616295910487097344" + ], + "expectedQty": "4332927796190837014220149", + "reserves": [ + "8989949467606653917961851", + "59880003503838757461265459", + "56043085784087248174964216" + ], + "mAssetSupply": "124440948040243193970187065" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "323335026123008267780096", + "outputIndex": 2, + "expectedQty": "346602367240175001472594", + "swapFee": "206351066892784171605", + "reserves": [ + "9313284493729662185741947", + "59880003503838757461265459", + "55696483416847073173491622" + ], + "mAssetSupply": "124441154391310086754358670", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "117706700157631594496", + "outputIndex": 1, + "expectedQty": "117751744613729220715", + "swapFee": "70037584058066731", + "reserves": [ + "9313284493729662185741947", + "59879885752094143732044744", + "55696601123547230805086118" + ], + "mAssetSupply": "124441154461347670812425401", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mintMulti", + "inputQtys": [ + "8076801204056426020864", + "1971217340827997569024", + "9272726491914264641536" + ], + "expectedQty": "19718943217765758157466", + "reserves": [ + "9321361294933718611762811", + "59881856969434971729613768", + "55705873850039145069727654" + ], + "mAssetSupply": "124460873404565436570582867" + }, + { + "type": "mintMulti", + "inputQtys": [ + "2097038131418749730816", + "1089546710569567518720", + "162849527021206405120" + ], + "expectedQty": "3465978327773875680931", + "reserves": [ + "9323458333065137361493627", + "59882946516145541297132488", + "55706036699566166276132774" + ], + "mAssetSupply": "124464339382893210446263798" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "14982192634572056821760", + "35077495337012317650944", + "36248588739986046582784" + ], + "expectedQty": "86597315379532717906491", + "swapFee": "51989582977506134424", + "reserves": [ + "9308476140430565304671867", + "59847869020808528979481544", + "55669788110826180229549990" + ], + "mAssetSupply": "124377742067513677728357307" + }, + { + "type": "mintMulti", + "inputQtys": [ + "26395375258122630201344", + "19643783696997100290048", + "23983413704274764365824" + ], + "expectedQty": "71251643233280272602444", + "reserves": [ + "9334871515688687934873211", + "59867512804505526079771592", + "55693771524530454993915814" + ], + "mAssetSupply": "124448993710746958000959751" + }, + { + "type": "mintMulti", + "inputQtys": [ + "51414276855879220330496", + "69936902340398528069632", + "87702683413780602290176" + ], + "expectedQty": "210799262229524879312481", + "reserves": [ + "9386285792544567155203707", + "59937449706845924607841224", + "55781474207944235596205990" + ], + "mAssetSupply": "124659792972976482880272232" + }, + { + "type": "redeemMasset", + "inputQty": "5015003079800799205785", + "expectedQtys": [ + "377492448523923130004", + "2410531188607992321192", + "2243388465515973011972" + ], + "redemptionFee": "1504500923940239761", + "reserves": [ + "9385908300096043232073703", + "59935039175657316615520032", + "55779230819478719623194018" + ], + "mAssetSupply": "124654779474397606021306208" + }, + { + "type": "redeemMasset", + "inputQty": "47364868940432", + "expectedQtys": [ + "3565278039877", + "22766584986777", + "21187983129983" + ], + "redemptionFee": "14209460682", + "reserves": [ + "9385908300092477954033826", + "59935039175634550030533255", + "55779230819457531640064035" + ], + "mAssetSupply": "124654779474350255361826458" + }, + { + "type": "mintMulti", + "inputQtys": [ + "494783129352848749363200", + "232917144785586028019712", + "332976299621397871722496" + ], + "expectedQty": "1084435514193347897742723", + "reserves": [ + "9880691429445326703397026", + "60167956320420136058552967", + "56112207119078929511786531" + ], + "mAssetSupply": "125739214988543603259569181" + }, + { + "type": "redeemMasset", + "inputQty": "12778030839174888475852", + "expectedQtys": [ + "1003806991123525468701", + "6112630439613187729609", + "5700595570229709495801" + ], + "redemptionFee": "3833409251752466542", + "reserves": [ + "9879687622454203177928325", + "60161843689980522870823358", + "56106506523508699802290730" + ], + "mAssetSupply": "125726440791113680123559871" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "5867546885010963300352", + "expectedQty": "5557746312710147633257", + "swapFee": "3520528131006577980", + "reserves": [ + "9874129876141493030295068", + "60161843689980522870823358", + "56106506523508699802290730" + ], + "mAssetSupply": "125720576764756800166837499" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "530782500050443304960", + "398088136244957609984", + "344546963992431689728" + ], + "expectedQty": "1296500839265064124237", + "swapFee": "778367524073482564", + "reserves": [ + "9873599093641442586990108", + "60161445601844277913213374", + "56106161976544707370601002" + ], + "mAssetSupply": "125719280263917535102713262" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "6074582369711065923584", + "expectedQty": "6409358522108754132690", + "reserves": [ + "9879673676011153652913692", + "60161445601844277913213374", + "56106161976544707370601002" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "274173841256857472", + "268573432420266848", + "48969744954717560" + ], + "expectedQty": "604085790425251476", + "swapFee": "362669075700571", + "reserves": [ + "9879673401837312396056220", + "60161445333270845492946526", + "56106161927574962415883442" + ], + "mAssetSupply": "125725689018353853431594476" + }, + { + "type": "redeemMasset", + "inputQty": "2228644852277098158489", + "expectedQtys": [ + "175077010562173972417", + "1066116821036808990826", + "994253423657742649516" + ], + "redemptionFee": "668593455683129447", + "reserves": [ + "9879498324826750222083803", + "60160379216449808683955700", + "56105167674151304673233926" + ], + "mAssetSupply": "125723461042095032016565434" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "61634212616808664399872", + "142706596112830004461568", + "520459560785329006837760" + ], + "expectedQty": "722877627723049944576636", + "swapFee": "433986968815119038168", + "reserves": [ + "9817864112209941557683931", + "60017672620336978679494132", + "55584708113365975666396166" + ], + "mAssetSupply": "125000583414371982071988798" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "2190474029145887744", + "outputIndex": 2, + "expectedQty": "2186959267032358057", + "swapFee": "1302727371902469", + "reserves": [ + "9817864112209941557683931", + "60017674810811007825381876", + "55584705926406708634038109" + ], + "mAssetSupply": "125000583415674709443891267", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemBassets", + "inputQtys": [ + "928018039575727560458240", + "772387390911334395674624", + "113872266861182441226240" + ], + "expectedQty": "1862210224995732085793256", + "swapFee": "1117996933157333651666", + "reserves": [ + "8889846072634213997225691", + "59245287419899673429707252", + "55470833659545526192811869" + ], + "mAssetSupply": "123138373190678977358098011" + }, + { + "type": "redeemMasset", + "inputQty": "336983106311344076", + "expectedQtys": [ + "24320844495527403", + "162083281381861307", + "151757129251543197" + ], + "redemptionFee": "101094931893403", + "reserves": [ + "8889846048313369501698288", + "59245287257816392047845945", + "55470833507788396941268672" + ], + "mAssetSupply": "123138372853796965978647338" + }, + { + "type": "mintMulti", + "inputQtys": [ + "567017107095717184", + "2505232024013627392", + "2752424174007907840" + ], + "expectedQty": "5813965690136026068", + "reserves": [ + "8889846615330476597415472", + "59245289763048416061473337", + "55470836260212570949176512" + ], + "mAssetSupply": "123138378667762656114673406" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "1578330368142159214804992", + "outputIndex": 2, + "expectedQty": "1575328971746098487503033", + "swapFee": "937725115896939510186", + "reserves": [ + "8889846615330476597415472", + "60823620131190575276278329", + "53895507288466472461673479" + ], + "mAssetSupply": "123139316392878553054183592", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "612356026292197736316928", + "expectedQty": "606189066013811522629816", + "reserves": [ + "8889846615330476597415472", + "61435976157482773012595257", + "53895507288466472461673479" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "78486260091041", + "58223821128596", + "58175696624232" + ], + "expectedQty": "199062270984985", + "reserves": [ + "8889846615408962857506513", + "61435976157540996833723853", + "53895507288524648158297711" + ], + "mAssetSupply": "123745505459091426847798393" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "7351788560515656618868736", + "hardLimitError": true + }, + { + "type": "mintMulti", + "inputQtys": [ + "75957496039639607148544", + "121119954740246273327104", + "8090863519005272965120" + ], + "expectedQty": "208922438648203024389431", + "reserves": [ + "8965804111448602464655057", + "61557096112281243107050957", + "53903598152043653431262831" + ], + "mAssetSupply": "123954427897739629872187824" + }, + { + "type": "redeemMasset", + "inputQty": "22713673780896487833", + "expectedQtys": [ + "1642420196831429788", + "11276469645818424982", + "9874447086542211317" + ], + "redemptionFee": "6814102134268946", + "reserves": [ + "8965802469028405633225269", + "61557084835811597288625975", + "53903588277596566889051514" + ], + "mAssetSupply": "123954405190879951109968937" + }, + { + "type": "mintMulti", + "inputQtys": [ + "36441495307750524059648", + "36407253605982540922880", + "33651190923119502032896" + ], + "expectedQty": "108252391164939596998037", + "reserves": [ + "9002243964336156157284917", + "61593492089417579829548855", + "53937239468519686391084410" + ], + "mAssetSupply": "124062657582044890706966974" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "332964308919040", + "outputIndex": 1, + "expectedQty": "358149708458551", + "swapFee": "212862059850", + "reserves": [ + "9002243964669120466203957", + "61593492089059430121090304", + "53937239468519686391084410" + ], + "mAssetSupply": "124062657582045103569026824", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "58701654884322321104896", + "expectedQty": "58220187211791610935165", + "reserves": [ + "9002243964669120466203957", + "61593492089059430121090304", + "53995941123404008712189306" + ] + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "211777357172919040", + "expectedQty": "225659560307993157", + "reserves": [ + "9002244176446477639122997", + "61593492089059430121090304", + "53995941123404008712189306" + ] + }, + { + "type": "redeemMasset", + "inputQty": "710013672850621183977062", + "expectedQtys": [ + "51480452280905531515650", + "352230040438295873412817", + "308782500883379749604801" + ], + "redemptionFee": "213004101855186355193", + "reserves": [ + "8950763724165572107607347", + "61241262048621134247677487", + "53687158622520628962584505" + ], + "mAssetSupply": "123411077326167689490333277" + }, + { + "type": "redeemMasset", + "inputQty": "1253033066943313503846", + "expectedQtys": [ + "90852770130728787339", + "621616040248877691396", + "544939765099045065626" + ], + "redemptionFee": "375909920082994051", + "reserves": [ + "8950672871395441378820008", + "61240640432580885369986091", + "53686613682755529917518879" + ], + "mAssetSupply": "123409824669010666259823482" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "62387349581602455552", + "expectedQty": "62981531144045252466", + "swapFee": "37432409748961473", + "reserves": [ + "8950672871395441378820008", + "61240577451049741324733625", + "53686613682755529917518879" + ], + "mAssetSupply": "123409762319093494406329403" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "132210666424179664", + "expectedQty": "130884784863775670", + "reserves": [ + "8950672871395441378820008", + "61240577583260407748913289", + "53686613682755529917518879" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "6644996516307290554368", + "401914430673375002624", + "3996448051578045726720" + ], + "expectedQty": "11441822011202788750528", + "reserves": [ + "8957317867911748669374376", + "61240979497691081123915913", + "53690610130807107963245599" + ], + "mAssetSupply": "123421204271989482058855601" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "8380468016670597120", + "expectedQty": "8460216475353216332", + "swapFee": "5028280810002358", + "reserves": [ + "8957317867911748669374376", + "61240971037474605770699581", + "53690610130807107963245599" + ], + "mAssetSupply": "123421195896549746198260839" + }, + { + "type": "redeemMasset", + "inputQty": "12730199393117896704", + "expectedQtys": [ + "923619586775492757", + "6314765334608922674", + "5536221877353244911" + ], + "redemptionFee": "3819059817935369", + "reserves": [ + "8957316944292161893881619", + "61240964722709271161776907", + "53690604594585230610000688" + ], + "mAssetSupply": "123421183170169412898299504" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "128314382967509467791360", + "outputIndex": 0, + "expectedQty": "119257630850922463056417", + "swapFee": "76356099150593187943", + "reserves": [ + "8838059313441239430825202", + "61240964722709271161776907", + "53818918977552740077792048" + ], + "mAssetSupply": "123421259526268563491487447", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemBassets", + "inputQtys": [ + "689464799889592287232", + "520723324788111376384", + "1804923073503614992384" + ], + "expectedQty": "3041171246341175253556", + "swapFee": "1825798226740749601", + "reserves": [ + "8837369848641349838537970", + "61240443999384483050400523", + "53817114054479236462799664" + ], + "mAssetSupply": "123418218355022222316233891" + }, + { + "type": "redeemMasset", + "inputQty": "10994988978211638476", + "expectedQtys": [ + "787060738209190374", + "5454105677134736623", + "4792980065502023263" + ], + "redemptionFee": "3298496693463491", + "reserves": [ + "8837369061580611629347596", + "61240438545278805915663900", + "53817109261499170960776401" + ], + "mAssetSupply": "123418207363331740798058906" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "108512490226229776", + "expectedQty": "107605695035243465", + "reserves": [ + "8837369061580611629347596", + "61240438545278805915663900", + "53817109370011661187006177" + ] + }, + { + "type": "redeemMasset", + "inputQty": "1577084902618042676019", + "expectedQtys": [ + "112893392530966460325", + "782318902750921948395", + "687489230183176949485" + ], + "redemptionFee": "473125470785412802", + "reserves": [ + "8837256168188080662887271", + "61239656226376054993715505", + "53816421880781478010056692" + ], + "mAssetSupply": "123416630859160288576039154" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "4266683962300248279220224", + "hardLimitError": true + }, + { + "type": "mintMulti", + "inputQtys": [ + "4355277303593836544", + "4798990062511292416", + "4377168144468753408" + ], + "expectedQty": "13739429750037282059", + "reserves": [ + "8837260523465384256723815", + "61239661025366117505007921", + "53816426257949622478810100" + ], + "mAssetSupply": "123416644598590038613321213" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "5373291044425905995776", + "expectedQty": "5328385505524600889112", + "reserves": [ + "8837260523465384256723815", + "61239661025366117505007921", + "53821799548994048384805876" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "232825693516774162563072", + "104697665821662343331840", + "67545470737091840180224" + ], + "expectedQty": "419492513825440707076372", + "swapFee": "251846616265023438308", + "reserves": [ + "8604434829948610094160743", + "61134963359544455161676081", + "53754254078256956544625652" + ], + "mAssetSupply": "123002480470270122507133953" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "35096703947812172", + "outputIndex": 2, + "expectedQty": "35011037601914984", + "swapFee": "20838397390214", + "reserves": [ + "8604434829948610094160743", + "61134963394641159109488253", + "53754254043245918942710668" + ], + "mAssetSupply": "123002480470290960904524167", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mintMulti", + "inputQtys": [ + "5122700659998954881024", + "9117523480826017218560", + "74916003535784471691264" + ], + "expectedQty": "88778796461110720723085", + "reserves": [ + "8609557530608609049041767", + "61144080918121985126706813", + "53829170046781703414401932" + ], + "mAssetSupply": "123091259266752071625247252" + }, + { + "type": "mintMulti", + "inputQtys": [ + "18796611784404769964032", + "2677745634602932240384", + "35005529247709243899904" + ], + "expectedQty": "57478707008182090969419", + "reserves": [ + "8628354142393013819005799", + "61146758663756588058947197", + "53864175576029412658301836" + ], + "mAssetSupply": "123148737973760253716216671" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "380905273996476139175936", + "130112156482829419544576", + "242389316361454595604480" + ], + "expectedQty": "777879033886612268467122", + "swapFee": "467007624906911507985", + "reserves": [ + "8247448868396537679829863", + "61016646507273758639402621", + "53621786259667958062697356" + ], + "mAssetSupply": "122370858939873641447749549" + }, + { + "type": "mintMulti", + "inputQtys": [ + "17645873422457069568", + "46019488287062843392", + "11662598742931918848" + ], + "expectedQty": "76073285139392622989", + "reserves": [ + "8247466514269960136899431", + "61016692526762045702246013", + "53621797922266700994616204" + ], + "mAssetSupply": "122370935013158780840372538" + }, + { + "type": "mintMulti", + "inputQtys": [ + "1503977172310491651899392", + "2767142721574660451860480", + "1843644688194909258121216" + ], + "expectedQty": "6172647894928609710212995", + "reserves": [ + "9751443686580451788798823", + "63783835248336706154106493", + "55465442610461610252737420" + ], + "mAssetSupply": "128543582908087390550585533" + }, + { + "type": "redeemMasset", + "inputQty": "28346087834429472269926", + "expectedQtys": [ + "2149717227550072705393", + "14061221484697719862101", + "12227422045977220757555" + ], + "redemptionFee": "8503826350328841680", + "reserves": [ + "9749293969352901716093430", + "63769774026852008434244392", + "55453215188415633031979865" + ], + "mAssetSupply": "128515245324079311407157287" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "5415941551271300825088", + "6750899698568910602240", + "4759840655895699652608" + ], + "expectedQty": "17148222184416385755256", + "swapFee": "10295110376875957027", + "reserves": [ + "9743878027801630415268342", + "63763023127153439523642152", + "55448455347759737332327257" + ], + "mAssetSupply": "128498097101894895021402031" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "3025271315517829380308992", + "outputIndex": 2, + "expectedQty": "3015606908230257469706079", + "swapFee": "1797250786685436464936", + "reserves": [ + "9743878027801630415268342", + "66788294442671268903951144", + "52432848439529479862621178" + ], + "mAssetSupply": "128499894352681580457866967", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemBassets", + "inputQtys": [ + "35530064720669340", + "100388169648158784", + "13999142773855032" + ], + "expectedQty": "150927150131970760", + "swapFee": "90610656473066", + "reserves": [ + "9743877992271565694599002", + "66788294342283099255792360", + "52432848425530337088766146" + ], + "mAssetSupply": "128499894201754430325896207" + }, + { + "type": "redeemMasset", + "inputQty": "1056057925197577177792512", + "expectedQtys": [ + "80054638254195732561463", + "548725337840540361498518", + "430782560770176117793733" + ], + "redemptionFee": "316817377559273153337", + "reserves": [ + "9663823354017369962037539", + "66239569004442558894293842", + "52002065864760160970972413" + ], + "mAssetSupply": "127444153093934412421257032" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "524893442899180091604992", + "791346346534417649893376", + "1223434230979273745760256" + ], + "expectedQty": "2555501938195923340713245", + "swapFee": "1534221695935115073472", + "reserves": [ + "9138929911118189870432547", + "65448222657908141244400466", + "50778631633780887225212157" + ], + "mAssetSupply": "124888651155738489080543787" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "10578045243866847232", + "26219356383366472531968", + "12215432489889496563712" + ], + "expectedQty": "38075589354341390507612", + "swapFee": "22859069054037256658", + "reserves": [ + "9138919333072946003585315", + "65422003301524774771868498", + "50766416201290997728648445" + ], + "mAssetSupply": "124850575566384147690036175" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "140627369014536634368", + "expectedQty": "142072440950017011779", + "swapFee": "84376421408721980", + "reserves": [ + "9138919333072946003585315", + "65421861229083824754856719", + "50766416201290997728648445" + ], + "mAssetSupply": "124850435023391554562123787" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "163012781031611695104", + "outputIndex": 1, + "expectedQty": "175388202528350473360", + "swapFee": "104162582294378804", + "reserves": [ + "9139082345853977615280419", + "65421685840881296404383359", + "50766416201290997728648445" + ], + "mAssetSupply": "124850435127554136856502591", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemBassets", + "inputQtys": [ + "20436073719539999703040", + "4397966316936096645120", + "16483516680699576844288" + ], + "expectedQty": "42481585109275144882811", + "swapFee": "25504253617735728366", + "reserves": [ + "9118646272134437615577379", + "65417287874564360307738239", + "50749932684610298151804157" + ], + "mAssetSupply": "124807953542444861711619780" + }, + { + "type": "redeemMasset", + "inputQty": "6480240211420", + "expectedQtys": [ + "473313512994", + "3395557345956", + "2634231903108" + ], + "redemptionFee": "1944072063", + "reserves": [ + "9118646272133964302064385", + "65417287874560964750392283", + "50749932684607663919901049" + ], + "mAssetSupply": "124807953542438383415480423" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "770754541145414149603328", + "1364182827572958924374016", + "1545767895355580708028416" + ], + "expectedQty": "3707407920704084543955360", + "swapFee": "2225780220554783596531", + "reserves": [ + "8347891730988550152461057", + "64053105046988005826018267", + "49204164789252083211872633" + ], + "mAssetSupply": "121100545621734298871525063" + }, + { + "type": "redeemMasset", + "inputQty": "625917608887460467782451", + "expectedQtys": [ + "43133785045843927104024", + "330964146834768155483271", + "254239266125287126428292" + ], + "redemptionFee": "187775282666238140334", + "reserves": [ + "8304757945942706225357033", + "63722140900153237670534996", + "48949925523126796085444341" + ], + "mAssetSupply": "120474815788129504641882946" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "13462209400038714507264", + "expectedQty": "13358313708136450071501", + "reserves": [ + "8304757945942706225357033", + "63722140900153237670534996", + "48963387732526834799951605" + ] + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "400534855475432016314368", + "expectedQty": "404966366948633094163712", + "swapFee": "240320913285259209788", + "reserves": [ + "8304757945942706225357033", + "63317174533204604576371284", + "48963387732526834799951605" + ], + "mAssetSupply": "120087879567275494334849867" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "4282625833742237171712", + "expectedQty": "4329811057926528430945", + "swapFee": "2569575500245342303", + "reserves": [ + "8304757945942706225357033", + "63312844722146678047940339", + "48963387732526834799951605" + ], + "mAssetSupply": "120083599511017252343020458" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "762749680631370408263680", + "expectedQty": "771086859507265900116487", + "swapFee": "457649808378822244958", + "reserves": [ + "8304757945942706225357033", + "62541757862639412147823852", + "48963387732526834799951605" + ], + "mAssetSupply": "119321307480194260757001736" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "1517509561457601150976", + "1384493185668115857408", + "1974666320397219659776" + ], + "expectedQty": "4955295719548631146459", + "swapFee": "2974962409174683497", + "reserves": [ + "8303240436381248624206057", + "62540373369453744031966444", + "48961413066206437580291829" + ], + "mAssetSupply": "119316352184474712125855277" + }, + { + "type": "mintMulti", + "inputQtys": [ + "96543554096432185344", + "78292451075221585920", + "101687394878350049280" + ], + "expectedQty": "281823370864164341527", + "reserves": [ + "8303336979935345056391401", + "62540451661904819253552364", + "48961514753601315930341109" + ], + "mAssetSupply": "119316634007845576290196804" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "123600053405635739648", + "expectedQty": "122639246917194265561", + "reserves": [ + "8303336979935345056391401", + "62540451661904819253552364", + "48961638353654721566080757" + ] + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "286267147003299406807040", + "expectedQty": "288326525668744610805120", + "swapFee": "171760288201979644084", + "reserves": [ + "8303336979935345056391401", + "62540451661904819253552364", + "48673311827985976955275637" + ], + "mAssetSupply": "119030661260377396057299409" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "119673901750401118502912", + "expectedQty": "120971750556167504009547", + "swapFee": "71804341050240671101", + "reserves": [ + "8303336979935345056391401", + "62419479911348651749542817", + "48673311827985976955275637" + ], + "mAssetSupply": "118911059162968045179467598" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "4159428699269883232256", + "expectedQty": "4189222752892167079872", + "swapFee": "2495657219561929939", + "reserves": [ + "8303336979935345056391401", + "62419479911348651749542817", + "48669122605233084788195765" + ], + "mAssetSupply": "118906902229925994858165281" + }, + { + "type": "redeemMasset", + "inputQty": "249412705756765696819", + "expectedQtys": [ + "17411406880734794658", + "130888456610465758958", + "102055101250952606122" + ], + "redemptionFee": "74823811727029709", + "reserves": [ + "8303319568528464321596743", + "62419349022892041283783859", + "48669020550131833835589643" + ], + "mAssetSupply": "118906652892044049819498171" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "313090524039874458157056", + "expectedQty": "291253735597398601471245", + "swapFee": "187854314423924674894", + "reserves": [ + "8012065832931065720125498", + "62419349022892041283783859", + "48669020550131833835589643" + ], + "mAssetSupply": "118593750222318599286016009" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "7236848627340761104384", + "5939679809899567513600", + "980316686545323163648" + ], + "expectedQty": "14636784752547412310870", + "swapFee": "8787343257482937148", + "reserves": [ + "8004828984303724959021114", + "62413409343082141716270259", + "48668040233445288512425995" + ], + "mAssetSupply": "118579113437566051873705139" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "1053175991588361900916736", + "expectedQty": "1044561279551481212315343", + "reserves": [ + "8004828984303724959021114", + "62413409343082141716270259", + "49721216225033650413342731" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "421963396641313219674112", + "353602238641688912330752", + "234989642086232082087936" + ], + "expectedQty": "1038988474802130321924777", + "swapFee": "623767345288451263913", + "reserves": [ + "7582865587662411739347002", + "62059807104440452803939507", + "49486226582947418331254795" + ], + "mAssetSupply": "118584686242315402764095705" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "26223581439342616", + "18406013721556412", + "13484640277514608" + ], + "expectedQty": "60030358231955661", + "swapFee": "36039838842478", + "reserves": [ + "7582865561438830300004386", + "62059807086034439082383095", + "49486226569462778053740187" + ], + "mAssetSupply": "118584686182285044532140044" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "392251080043534626062336", + "outputIndex": 2, + "expectedQty": "390592834852738466299077", + "swapFee": "232448349874986663461", + "reserves": [ + "7582865561438830300004386", + "62452058166077973708445431", + "49095633734610039587441110" + ], + "mAssetSupply": "118584918630634919518803505", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "909099669137164804816896", + "expectedQty": "979362981390967138547876", + "reserves": [ + "8491965230575995104821282", + "62452058166077973708445431", + "49095633734610039587441110" + ] + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "120235950703397105041408", + "outputIndex": 0, + "expectedQty": "111036727276377870921709", + "swapFee": "71344227878587424491", + "reserves": [ + "8380928503299617233899573", + "62572294116781370813486839", + "49095633734610039587441110" + ], + "mAssetSupply": "119564352956253765244775872", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "6296937453975098517094400", + "expectedQty": "6337014848677873098150451", + "swapFee": "3778162472385059110256", + "reserves": [ + "8380928503299617233899573", + "62572294116781370813486839", + "42758618885932166489290659" + ], + "mAssetSupply": "113271193664751051786791728" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "886017320688978362368", + "outputIndex": 0, + "expectedQty": "826625290269878187005", + "swapFee": "528375631545080761", + "reserves": [ + "8380101878009347355712568", + "62572294116781370813486839", + "42759504903252855467653027" + ], + "mAssetSupply": "113271194193126683331872489", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mintMulti", + "inputQtys": [ + "10829332698718833475584", + "43103584834391979851776", + "22945203128505370411008" + ], + "expectedQty": "76941054992423155592103", + "reserves": [ + "8390931210708066189188152", + "62615397701615762793338615", + "42782450106381360838064035" + ], + "mAssetSupply": "113348135248119106487464592" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "840124880823347183616", + "expectedQty": "849424831083793320112", + "swapFee": "504074928494008310", + "reserves": [ + "8390931210708066189188152", + "62614548276784679000018503", + "42782450106381360838064035" + ], + "mAssetSupply": "113347295627313211634289286" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "206944246589368125358080", + "outputIndex": 1, + "expectedQty": "207949400785106814238316", + "swapFee": "123408160448386423627", + "reserves": [ + "8390931210708066189188152", + "62406598875999572185780187", + "42989394352970728963422115" + ], + "mAssetSupply": "113347419035473660020712913", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "2167155752882780766208", + "expectedQty": "2191011634468280725425", + "swapFee": "1300293451729668459", + "reserves": [ + "8390931210708066189188152", + "62404407864365103905054762", + "42989394352970728963422115" + ], + "mAssetSupply": "113345253180014228969615164" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "55909292584819165757440", + "expectedQty": "59492927396253232547925", + "reserves": [ + "8446840503292885354945592", + "62404407864365103905054762", + "42989394352970728963422115" + ] + }, + { + "type": "redeemMasset", + "inputQty": "559221251685990321356", + "expectedQtys": [ + "41640546673020400672", + "307636169673771609262", + "211925616602078674146" + ], + "redemptionFee": "167766375505797096", + "reserves": [ + "8446798862746212334544920", + "62404100228195430133445500", + "42989182427354126884747969" + ], + "mAssetSupply": "113404187053925171717638829" + }, + { + "type": "mintMulti", + "inputQtys": [ + "501063873710021551325184", + "922103234589599371100160", + "656463443010529458651136" + ], + "expectedQty": "2096035810978963556913983", + "reserves": [ + "8947862736456233885870104", + "63326203462785029504545660", + "43645645870364656343399105" + ], + "mAssetSupply": "115500222864904135274552812" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "569303851322323894272", + "expectedQty": "563086574302796540827", + "reserves": [ + "8947862736456233885870104", + "63326772766636351828439932", + "43645645870364656343399105" + ] + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "3597754707866508328960", + "outputIndex": 1, + "expectedQty": "3614327879559312900122", + "swapFee": "2146202722028358732", + "reserves": [ + "8947862736456233885870104", + "63323158438756792515539810", + "43649243625072522851728065" + ], + "mAssetSupply": "115500788097681160099452371", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "32571150039873073709056", + "expectedQty": "32215361966741108358381", + "reserves": [ + "8947862736456233885870104", + "63355729588796665589248866", + "43649243625072522851728065" + ] + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "3637402269111400529920", + "expectedQty": "3616426253123917922720", + "reserves": [ + "8947862736456233885870104", + "63355729588796665589248866", + "43652881027341634252257985" + ] + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "4738171363473360945152", + "expectedQty": "5015591907795163515836", + "reserves": [ + "8952600907819707246815256", + "63355729588796665589248866", + "43652881027341634252257985" + ] + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "2129585901231142208536576", + "outputIndex": 2, + "expectedQty": "2238193493897292752729283", + "swapFee": "1338320075680727393500", + "reserves": [ + "11082186809050849455351832", + "63355729588796665589248866", + "41414687533444341499528702" + ], + "mAssetSupply": "115542973797884501016642808", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemMasset", + "inputQty": "9657045715295059679641", + "expectedQtys": [ + "925967843550610485416", + "5293663544455098213643", + "3460388239922679831424" + ], + "redemptionFee": "2897113714588517903", + "reserves": [ + "11081260841207298844866416", + "63350435925252210491035223", + "41411227145204418819697278" + ], + "mAssetSupply": "115533319649282920545481070" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "20304482369016552226816", + "expectedQty": "20475089026966050321783", + "swapFee": "12182689421409931336", + "reserves": [ + "11081260841207298844866416", + "63329960836225244440713440", + "41411227145204418819697278" + ], + "mAssetSupply": "115513027349603325403185590" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "1213912637156454301696", + "outputIndex": 2, + "expectedQty": "1262960329165391098450", + "swapFee": "755383696536903853", + "reserves": [ + "11082474753844455299168112", + "63329960836225244440713440", + "41409964184875253428598828" + ], + "mAssetSupply": "115513028104987021940089443", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemMasset", + "inputQty": "7361205591446475977523", + "expectedQtys": [ + "706032058465322970890", + "4034566611236148750833", + "2638107724475590435189" + ], + "redemptionFee": "2208361677433942793", + "reserves": [ + "11081768721785989976197222", + "63325926269614008291962607", + "41407326077150777838163639" + ], + "mAssetSupply": "115505669107757252898054713" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "158740642436649031041024", + "expectedQty": "160071611882933753062661", + "swapFee": "95244385461989418624", + "reserves": [ + "11081768721785989976197222", + "63165854657731074538899946", + "41407326077150777838163639" + ], + "mAssetSupply": "115347023709706065856432313" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "28259109577741289127936", + "29262023640353656012800", + "24512419459068260777984" + ], + "expectedQty": "82727844415854816851038", + "swapFee": "49666506553444957084", + "reserves": [ + "11053509612208248687069286", + "63136592634090720882887146", + "41382813657691709577385655" + ], + "mAssetSupply": "115264295865290211039581275" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "320997486063317680128", + "2815229776587185979392", + "752764256026270236672" + ], + "expectedQty": "3872973700790698652990", + "swapFee": "2325179328071261948", + "reserves": [ + "11053188614722185369389158", + "63133777404314133696907754", + "41382060893435683307148983" + ], + "mAssetSupply": "115260422891589420340928285" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "29995652435329720320", + "expectedQty": "31109559048060943403", + "reserves": [ + "11053218610374620699109478", + "63133777404314133696907754", + "41382060893435683307148983" + ] + }, + { + "type": "redeemMasset", + "inputQty": "137861400352719110563430", + "expectedQtys": [ + "13216632413724424442271", + "75490765021107316520243", + "49481649339455443670288" + ], + "redemptionFee": "41358420105815733169", + "reserves": [ + "11040001977960896274667207", + "63058286639293026380387511", + "41332579244096227863478695" + ], + "mAssetSupply": "115122633959215855107041427" + }, + { + "type": "redeemMasset", + "inputQty": "12833917808877032282521", + "expectedQtys": [ + "1230374663784806121780", + "7027654377014541576656", + "4606390324234947282803" + ], + "redemptionFee": "3850175342663109684", + "reserves": [ + "11038771603297111468545427", + "63051258984916011838810855", + "41327972853771992916195892" + ], + "mAssetSupply": "115109803891582320737868590" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "25652346993920203292672", + "99483397438139556429824", + "119897505698128255254528" + ], + "expectedQty": "244646575986048044249431", + "swapFee": "146876071234369448218", + "reserves": [ + "11013119256303191265252755", + "62951775587477872282381031", + "41208075348073864660941364" + ], + "mAssetSupply": "114865157315596272693619159" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "101155134064012918784", + "outputIndex": 1, + "expectedQty": "101620398868976097226", + "swapFee": "60464386493212440", + "reserves": [ + "11013119256303191265252755", + "62951673967079003306283805", + "41208176503207928673860148" + ], + "mAssetSupply": "114865157376060659186831599", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "895062273097936205250560", + "outputIndex": 2, + "expectedQty": "928254884563009471680356", + "swapFee": "555500153308933432989", + "reserves": [ + "11908181529401127470503315", + "62951673967079003306283805", + "40279921618644919202179792" + ], + "mAssetSupply": "114865712876213968120264588", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemBassets", + "inputQtys": [ + "521958740471996544450560", + "90619062089447959953408", + "36224390749148296511488" + ], + "expectedQty": "665018305651704070929907", + "swapFee": "399250533711249192073", + "reserves": [ + "11386222788929130926052755", + "62861054904989555346330397", + "40243697227895770905668304" + ], + "mAssetSupply": "114200694570562264049334681" + }, + { + "type": "redeemMasset", + "inputQty": "658786544311400569136742", + "expectedQtys": [ + "65663699025366234611120", + "362516127271954015272739", + "232083112321486904367431" + ], + "redemptionFee": "197635963293420170741", + "reserves": [ + "11320559089903764691441635", + "62498538777717601331057658", + "40011614115574284001300873" + ], + "mAssetSupply": "113542105662214156900368680" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "1904660698219835555840", + "expectedQty": "1898292559164621165984", + "reserves": [ + "11320559089903764691441635", + "62498538777717601331057658", + "40013518776272503836856713" + ] + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "19694051218179959554048", + "expectedQty": "19523153514829811732744", + "reserves": [ + "11320559089903764691441635", + "62518232828935781290611706", + "40013518776272503836856713" + ] + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "456722154668567486791680", + "expectedQty": "455169862558098421636438", + "reserves": [ + "11320559089903764691441635", + "62518232828935781290611706", + "40470240930941071323648393" + ] + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "4228195341327216410624", + "expectedQty": "4191625385868550020935", + "reserves": [ + "11320559089903764691441635", + "62522461024277108507022330", + "40470240930941071323648393" + ] + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "363098947866098753601536", + "expectedQty": "364122714191493334079982", + "swapFee": "217859368719659252160", + "reserves": [ + "11320559089903764691441635", + "62522461024277108507022330", + "40106118216749577989568411" + ], + "mAssetSupply": "113660007507734739210575405" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "3522148835815070892032", + "2875719445554404524032", + "3632559275936314818560" + ], + "expectedQty": "10114046889662439765985", + "swapFee": "6072071376623437922", + "reserves": [ + "11317036941067949620549603", + "62519585304831554102498298", + "40102485657473641674749851" + ], + "mAssetSupply": "113649893460845076770809420" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "4107975326615967105024", + "outputIndex": 0, + "expectedQty": "3934849274571788336409", + "swapFee": "2443398944709644728", + "reserves": [ + "11313102091793377832213194", + "62523693280158170069603322", + "40102485657473641674749851" + ], + "mAssetSupply": "113649895904244021480454148", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemMasset", + "inputQty": "326251992700557860431462", + "expectedQtys": [ + "32466504215287439550243", + "179431400420943774121781", + "115086694089532267993777" + ], + "redemptionFee": "97875597810167358129", + "reserves": [ + "11280635587578090392662951", + "62344261879737226295481541", + "39987398963384109406756074" + ], + "mAssetSupply": "113323741787141273787380815" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "42860677941114901102592", + "outputIndex": 2, + "expectedQty": "42606117626496207934111", + "swapFee": "25493083588863198879", + "reserves": [ + "11280635587578090392662951", + "62387122557678341196584133", + "39944792845757613198821963" + ], + "mAssetSupply": "113323767280224862650579694", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mintMulti", + "inputQtys": [ + "419069538963237830656", + "1574102124415955238912", + "751676731930976976896" + ], + "expectedQty": "2743038417843364617767", + "reserves": [ + "11281054657117053630493607", + "62388696659802757151823045", + "39945544522489544175798859" + ], + "mAssetSupply": "113326510318642706015197461" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "564873132573462495232", + "expectedQty": "566434063331653630157", + "swapFee": "338923879544077497", + "reserves": [ + "11281054657117053630493607", + "62388696659802757151823045", + "39944978088426212522168702" + ], + "mAssetSupply": "113325945784434012096779726" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "217438759128061935616", + "expectedQty": "215549021682214382103", + "reserves": [ + "11281054657117053630493607", + "62388914098561885213758661", + "39944978088426212522168702" + ] + }, + { + "type": "redeemMasset", + "inputQty": "19709292668800341114880", + "expectedQtys": [ + "1961373285321710001372", + "10847208273736189478747", + "6945007828321463429132" + ], + "redemptionFee": "5912787800640102334", + "reserves": [ + "11279093283831731920492235", + "62378066890288149024279914", + "39938033080597891058739570" + ], + "mAssetSupply": "113306457953574694610149283" + }, + { + "type": "redeemMasset", + "inputQty": "4890589168724859", + "expectedQtys": [ + "486687731833477", + "2691585141379193", + "1723307915340102" + ], + "redemptionFee": "1467176750617", + "reserves": [ + "11279093283345044188658758", + "62378066887596563882900721", + "39938033078874583143399468" + ], + "mAssetSupply": "113306457948685572618175041" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "4255062101747696140288", + "outputIndex": 1, + "expectedQty": "4437036185166225811426", + "swapFee": "2640678839869020545", + "reserves": [ + "11283348345446791884799046", + "62373629851411397657089295", + "39938033078874583143399468" + ], + "mAssetSupply": "113306460589364412487195586", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "23365627047491412", + "expectedQty": "22576947115762768", + "swapFee": "14019376228494", + "reserves": [ + "11283348322869844769036278", + "62373629851411397657089295", + "39938033078874583143399468" + ], + "mAssetSupply": "113306460566012804815932668" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "77313548169622295937024", + "32732394385268516323328", + "64212174683544989204480" + ], + "expectedQty": "176425539715104489122475", + "swapFee": "105918875154155186585", + "reserves": [ + "11206034774700222473099254", + "62340897457026129140765967", + "39873820904191038154194988" + ], + "mAssetSupply": "113130035026297700326810193" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "57882889304389464", + "expectedQty": "57687390830327252", + "reserves": [ + "11206034774700222473099254", + "62340897457026129140765967", + "39873820962073927458584452" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "33441904175575261184", + "380840830365277618176", + "275532129672935636992" + ], + "expectedQty": "686714984388962081215", + "swapFee": "412276356447245596", + "reserves": [ + "11206001332796046897838070", + "62340516616195763863147791", + "39873545429944254522947460" + ], + "mAssetSupply": "113129348369000702195056230" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "47246298585138388992", + "33451561115971903488", + "39173810773154144256" + ], + "expectedQty": "121087538555620032420", + "swapFee": "72696140817862737", + "reserves": [ + "11205954086497461759449078", + "62340483164634647891244303", + "39873506256133481368803204" + ], + "mAssetSupply": "113129227281462146575023810" + }, + { + "type": "redeemMasset", + "inputQty": "952343789206255330918", + "expectedQtys": [ + "94305595967962698708", + "524636846839801426342", + "335562214675491015826" + ], + "redemptionFee": "285703136761876599", + "reserves": [ + "11205859780901493796750370", + "62339958527787808089817961", + "39873170693918805877787378" + ], + "mAssetSupply": "113128275223376077081569491" + }, + { + "type": "redeemMasset", + "inputQty": "306685288571317832908", + "expectedQtys": [ + "30369430914680844022", + "168949915557609580796", + "108061811089414414628" + ], + "redemptionFee": "92005586571395349", + "reserves": [ + "11205829411470579115906348", + "62339789577872250480237165", + "39873062632107716463372750" + ], + "mAssetSupply": "113127968630093092335131932" + }, + { + "type": "mintMulti", + "inputQtys": [ + "116856083484061760", + "10064956772889810", + "72213950140890992" + ], + "expectedQty": "202861148778052904", + "reserves": [ + "11205829528326662599968108", + "62339789587937207253126975", + "39873062704321666604263742" + ], + "mAssetSupply": "113127968832954241113184836" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "2056146335332413997056", + "expectedQty": "2038164017411842630346", + "reserves": [ + "11205829528326662599968108", + "62341845734272539667124031", + "39873062704321666604263742" + ] + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "17329318581520277504", + "expectedQty": "17270791674503768207", + "reserves": [ + "11205829528326662599968108", + "62341845734272539667124031", + "39873080033640248124541246" + ] + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "10799265368294524190720", + "outputIndex": 1, + "expectedQty": "11265667090509129296758", + "swapFee": "6704370583213584835", + "reserves": [ + "11216628793694957124158828", + "62330580067182030537827273", + "39873080033640248124541246" + ], + "mAssetSupply": "113130030972133910673168224", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemMasset", + "inputQty": "97385492320909193641984", + "expectedQtys": [ + "9652690861975238776921", + "53639808511297551665533", + "34313564472765209512984" + ], + "redemptionFee": "29215647696272758092", + "reserves": [ + "11206976102832981885381907", + "62276940258670732986161740", + "39838766469167482915028262" + ], + "mAssetSupply": "113032674695460697752284332" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "63303906644362858070016", + "outputIndex": 1, + "expectedQty": "63607026283241195991610", + "swapFee": "37853943134662139936", + "reserves": [ + "11206976102832981885381907", + "62213333232387491790170130", + "39902070375811845773098278" + ], + "mAssetSupply": "113032712549403832414424268", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "8657525667108540416", + "expectedQty": "8681786778078771150", + "swapFee": "5194515400265124", + "reserves": [ + "11206976102832981885381907", + "62213333232387491790170130", + "39902061694025067694327128" + ], + "mAssetSupply": "113032703897072680706148976" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "1795870393407443440762880", + "expectedQty": "1849483073523765923128774", + "reserves": [ + "13002846496240425326144787", + "62213333232387491790170130", + "39902061694025067694327128" + ] + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "3422613661250738978816", + "expectedQty": "3429461680355897946467", + "swapFee": "2053568196750443387", + "reserves": [ + "13002846496240425326144787", + "62213333232387491790170130", + "39898632232344711796380661" + ], + "mAssetSupply": "114878766410503392640742321" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "898800744847081524428800", + "outputIndex": 0, + "expectedQty": "871481999800274675404228", + "swapFee": "537825908394176812092", + "reserves": [ + "12131364496440150650740559", + "62213333232387491790170130", + "40797432977191793320809461" + ], + "mAssetSupply": "114879304236411786817554413", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "2145014205187050", + "outputIndex": 2, + "expectedQty": "2214966407865499", + "swapFee": "1325568490499", + "reserves": [ + "12131364498585164855927609", + "62213333232387491790170130", + "40797432974976826912943962" + ], + "mAssetSupply": "114879304236413112386044912", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mintMulti", + "inputQtys": [ + "19122918510516747894784", + "25278159649977277612032", + "184781513682027053056" + ], + "expectedQty": "44955581475617884967368", + "reserves": [ + "12150487417095681603822393", + "62238611392037469067782162", + "40797617756490508939997018" + ], + "mAssetSupply": "114924259817888730271012280" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "21060334011061403648", + "358323780683694931968", + "322343545505195950080" + ], + "expectedQty": "698479577521592852951", + "swapFee": "419339350123029529", + "reserves": [ + "12150466356761670542418745", + "62238253068256785372850194", + "40797295412945003744046938" + ], + "mAssetSupply": "114923561338311208678159329" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "951038140022319304671232", + "expectedQty": "958036318576692155549038", + "swapFee": "570622884013391582802", + "reserves": [ + "12150466356761670542418745", + "61280216749680093217301156", + "40797295412945003744046938" + ], + "mAssetSupply": "113973093821172902765070899" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "1177872646561901324533760", + "expectedQty": "1209270369840924085434980", + "reserves": [ + "13328339003323571866952505", + "61280216749680093217301156", + "40797295412945003744046938" + ] + }, + { + "type": "redeemMasset", + "inputQty": "11964593504966171164672", + "expectedQtys": [ + "1384068810736467201474", + "6363586392666995304352", + "4236556717936017322753" + ], + "redemptionFee": "3589378051489851349", + "reserves": [ + "13326954934512835399751031", + "61273853163287426221996804", + "40793058856227067726724185" + ], + "mAssetSupply": "115170403186886912169192556" + }, + { + "type": "mintMulti", + "inputQtys": [ + "24126212511083974656", + "8980830058291773440", + "2271947200117046528" + ], + "expectedQty": "35894886152971347963", + "reserves": [ + "13326979060725346483725687", + "61273862144117484513770244", + "40793061128174267843770713" + ], + "mAssetSupply": "115170439081773065140540519" + }, + { + "type": "redeemMasset", + "inputQty": "3538943074734563760537", + "expectedQtys": [ + "409386919108066064195", + "1882250848503046424437", + "1253108115511763669339" + ], + "redemptionFee": "1061682922420369128", + "reserves": [ + "13326569673806238417661492", + "61271979893268981467345807", + "40791808020058756080101374" + ], + "mAssetSupply": "115166901200381252997149110" + }, + { + "type": "mintMulti", + "inputQtys": [ + "58882212607701213184", + "69208664358860611584", + "38347062907895767040" + ], + "expectedQty": "167271148776501252523", + "reserves": [ + "13326628556018846118874676", + "61272049101933340327957391", + "40791846367121663975868414" + ], + "mAssetSupply": "115167068471530029498401633" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "224866356021734998016", + "expectedQty": "230327702537006496134", + "reserves": [ + "13326853422374867853872692", + "61272049101933340327957391", + "40791846367121663975868414" + ] + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "6544971133580560302080", + "expectedQty": "6558945379288302065381", + "swapFee": "3926982680148336181", + "reserves": [ + "13326853422374867853872692", + "61272049101933340327957391", + "40785287421742375673803033" + ], + "mAssetSupply": "115160757755081666092931868" + }, + { + "type": "redeemMasset", + "inputQty": "46768171125495908689510", + "expectedQtys": [ + "5410572071597082703961", + "24875852321137691482324", + "16558427564427658298659" + ], + "redemptionFee": "14030451337648772606", + "reserves": [ + "13321442850303270771168731", + "61247173249612202636475067", + "40768728994177948015504374" + ], + "mAssetSupply": "115114003614407507833014964" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "2689834457116812762939392", + "expectedQty": "2694762914656473747662748", + "swapFee": "1613900674270087657763", + "reserves": [ + "13321442850303270771168731", + "61247173249612202636475067", + "38073966079521474267841626" + ], + "mAssetSupply": "112425783057964965157733335" + }, + { + "type": "redeemMasset", + "inputQty": "3582496693180991904153", + "expectedQtys": [ + "424366248154347093080", + "1951082432591415183262", + "1212879589627528427106" + ], + "redemptionFee": "1074749007954297571", + "reserves": [ + "13321018484055116424075651", + "61245222167179611221291805", + "38072753199931846739414520" + ], + "mAssetSupply": "112422201636020792120126753" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "553088334162644893696", + "9349730509181498163200", + "59593155747299901440" + ], + "expectedQty": "9907005242439476011832", + "swapFee": "5947771808548814896", + "reserves": [ + "13320465395720953779181955", + "61235872436670429723128605", + "38072693606776099439513080" + ], + "mAssetSupply": "112412294630778352644114921" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "1479231018586859238326272", + "expectedQty": "1468267523577547569858805", + "reserves": [ + "13320465395720953779181955", + "62715103455257288961454877", + "38072693606776099439513080" + ] + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "2379609199902150564511744", + "outputIndex": 1, + "expectedQty": "2441889211222616896378648", + "swapFee": "1456900531118220884278", + "reserves": [ + "15700074595623104343693699", + "60273214244034672065076229", + "38072693606776099439513080" + ], + "mAssetSupply": "113882019054887018434858004", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemMasset", + "inputQty": "1226374596064158307424665", + "expectedQtys": [ + "169020505153805635080655", + "648876478689493497448740", + "409874861854308773226937" + ], + "redemptionFee": "367912378819247492227", + "reserves": [ + "15531054090469298708613044", + "59624337765345178567627489", + "37662818744921790666286143" + ], + "mAssetSupply": "112656012371201679374925566" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "13752870982499398844416", + "expectedQty": "13828106886063188221575", + "swapFee": "8251722589499639306", + "reserves": [ + "15531054090469298708613044", + "59610509658459115379405914", + "37662818744921790666286143" + ], + "mAssetSupply": "112642267751941769475720456" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "1016277629693539647488", + "expectedQty": "1014796366435198047067", + "reserves": [ + "15531054090469298708613044", + "59610509658459115379405914", + "37663835022551484205933631" + ] + }, + { + "type": "redeemMasset", + "inputQty": "277089964990363886157824", + "expectedQtys": [ + "38193206794877298437237", + "146591242891277859883073", + "92621056582836482230668" + ], + "redemptionFee": "83126989497109165847", + "reserves": [ + "15492860883674421410175807", + "59463918415567837519522841", + "37571213965968647723702963" + ], + "mAssetSupply": "112366275710307337896775546" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "14352857847178391977984", + "25678699692429527744512", + "28283164609955942629376" + ], + "expectedQty": "68351998277626939179770", + "swapFee": "41035820458851474392", + "reserves": [ + "15478508025827243018197823", + "59438239715875407991778329", + "37542930801358691781073587" + ], + "mAssetSupply": "112297923712029710957595776" + }, + { + "type": "redeemMasset", + "inputQty": "2109960782556116602060", + "expectedQtys": [ + "290737763569229706329", + "1116447454538294241222", + "705180868906001612743" + ], + "redemptionFee": "632988234766834980", + "reserves": [ + "15478217288063673788491494", + "59437123268420869697537107", + "37542225620489785779460844" + ], + "mAssetSupply": "112295814384235389607828696" + }, + { + "type": "mintMulti", + "inputQtys": [ + "30494526045408905396224", + "13260787398703260368896", + "6072021575451089567744" + ], + "expectedQty": "50233994943937952259318", + "reserves": [ + "15508711814109082693887718", + "59450384055819572957906003", + "37548297642065236869028588" + ], + "mAssetSupply": "112346048379179327560088014" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "48763438660645013159936", + "expectedQty": "47953891540938644641435", + "swapFee": "29258063196387007895", + "reserves": [ + "15460757922568144049246283", + "59450384055819572957906003", + "37548297642065236869028588" + ], + "mAssetSupply": "112297314198581878933935973" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "142223844655800287232", + "outputIndex": 1, + "expectedQty": "142794406454126218968", + "swapFee": "85209532604463769", + "reserves": [ + "15460757922568144049246283", + "59450241261413118831687035", + "37548439865909892669315820" + ], + "mAssetSupply": "112297314283791411538399742", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "49607324382372136", + "expectedQty": "49534788230122488", + "reserves": [ + "15460757922568144049246283", + "59450241261413118831687035", + "37548439915517217051687956" + ] + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "85294205597120227966976", + "expectedQty": "85761235483187462122470", + "swapFee": "51176523358272136780", + "reserves": [ + "15460757922568144049246283", + "59364480025929931369564565", + "37548439915517217051687956" + ], + "mAssetSupply": "112212071304252437812692034" + }, + { + "type": "redeemMasset", + "inputQty": "840453526602668508918579", + "expectedQtys": [ + "115764285913544770076465", + "444498689731061616425803", + "281148463468436623262155" + ], + "redemptionFee": "252136057980800552675", + "reserves": [ + "15344993636654599279169818", + "58919981336198869753138762", + "37267291452048780428425801" + ], + "mAssetSupply": "111371869913707750104326130" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "1984192172856358656", + "outputIndex": 2, + "expectedQty": "2018267398020231184", + "swapFee": "1209908495330254", + "reserves": [ + "15344995620846772135528474", + "58919981336198869753138762", + "37267289433781382408194617" + ], + "mAssetSupply": "111371869914917658599656384", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemBassets", + "inputQtys": [ + "807335953612491374723072", + "1157469178276388035100672", + "1137023537852150586540032" + ], + "expectedQty": "3106580539716575392631156", + "swapFee": "1865067364248494332178", + "reserves": [ + "14537659667234280760805402", + "57762512157922481718038090", + "36130265895929231821654585" + ], + "mAssetSupply": "108265289375201083207025228" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "4095909715314003618562048", + "outputIndex": 1, + "expectedQty": "4167534031033830639065003", + "swapFee": "2490490404516834247384", + "reserves": [ + "18633569382548284379367450", + "53594978126888651078973087", + "36130265895929231821654585" + ], + "mAssetSupply": "108267779865605600041272612", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemMasset", + "inputQty": "248742002710443417", + "expectedQtys": [ + "42797228189226848", + "123095927656314226", + "82983308368912135" + ], + "redemptionFee": "74622600813133", + "reserves": [ + "18633569339751056190140602", + "53594978003792723422658861", + "36130265812945923452742450" + ], + "mAssetSupply": "108267779616938219931642328" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "2157329441640688384", + "15533792321827868672", + "12479937784917139456" + ], + "expectedQty": "30113074641885305847", + "swapFee": "18078692000331382", + "reserves": [ + "18633567182421614549452218", + "53594962470000401594790189", + "36130253333008138535602994" + ], + "mAssetSupply": "108267749503863578046336481" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "6574867791435811840", + "expectedQty": "6599537978481687150", + "swapFee": "3944920674861487", + "reserves": [ + "18633567182421614549452218", + "53594955870462423113103039", + "36130253333008138535602994" + ], + "mAssetSupply": "108267742932940707285386128" + }, + { + "type": "redeemMasset", + "inputQty": "59412067476732441631129", + "expectedQtys": [ + "10222127137484675402005", + "29401479999630886407800", + "19820576460955493734346" + ], + "redemptionFee": "17823620243019732489", + "reserves": [ + "18623345055284129874050213", + "53565554390462792226695239", + "36110432756547183041868648" + ], + "mAssetSupply": "108208348689084217863487488" + }, + { + "type": "redeemMasset", + "inputQty": "66419178579351", + "expectedQtys": [ + "11427733735596", + "32869116217129", + "22158232551348" + ], + "redemptionFee": "19925753573", + "reserves": [ + "18623345055272702140314617", + "53565554390429923110478110", + "36110432756525024809317300" + ], + "mAssetSupply": "108208348689017818610661710" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "343873682961038656", + "expectedQty": "347044503395879203", + "reserves": [ + "18623345399146385101353273", + "53565554390429923110478110", + "36110432756525024809317300" + ] + }, + { + "type": "redeemMasset", + "inputQty": "6809315967317735951564", + "expectedQtys": [ + "1171575027691011850451", + "3369752561810339916753", + "2271669259734577980375" + ], + "redemptionFee": "2042794790195320785", + "reserves": [ + "18622173824118694089502822", + "53562184637868112770561357", + "36108161087265290231336925" + ], + "mAssetSupply": "108201541762889794465910134" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "637859206440239912452096", + "1283887431225630175264768", + "197989374348275098845184" + ], + "expectedQty": "2119974639238424342553370", + "swapFee": "1272748432602616175237", + "reserves": [ + "17984314617678454177050726", + "52278297206642482595296589", + "35910171712917015132491741" + ], + "mAssetSupply": "106081567123651370123356764" + }, + { + "type": "mintMulti", + "inputQtys": [ + "504554538554856648474624", + "225176216847385322586112", + "399505794627382192111616" + ], + "expectedQty": "1132594996838969844327683", + "reserves": [ + "18488869156233310825525350", + "52503473423489867917882701", + "36309677507544397324603357" + ], + "mAssetSupply": "107214162120490339967684447" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "540431656644768890880", + "expectedQty": "535214040396355689556", + "swapFee": "324258993986861334", + "reserves": [ + "18488333942192914469835794", + "52503473423489867917882701", + "36309677507544397324603357" + ], + "mAssetSupply": "107213622013092689185654901" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "2442040127091141213421568", + "165129016636967760166912", + "1382747599647481335382016" + ], + "expectedQty": "4013222144457394862789630", + "swapFee": "2409378914022850628050", + "reserves": [ + "16046293815101773256414226", + "52338344406852900157715789", + "34926929907896915989221341" + ], + "mAssetSupply": "103200399868635294322865271" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "38447897530785226752", + "expectedQty": "37969228877240273778", + "swapFee": "23068738518471136", + "reserves": [ + "16046255845872896016140448", + "52338344406852900157715789", + "34926929907896915989221341" + ], + "mAssetSupply": "103200361443806502056109655" + }, + { + "type": "mintMulti", + "inputQtys": [ + "149332838161841504911360", + "463603504209199489875968", + "447769280245045233975296" + ], + "expectedQty": "1059634386968598331884762", + "reserves": [ + "16195588684034737521051808", + "52801947911062099647591757", + "35374699188141961223196637" + ], + "mAssetSupply": "104259995830775100387994417" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "987859189377528889344", + "expectedQty": "992193820476331083225", + "swapFee": "592715513626517333", + "reserves": [ + "16195588684034737521051808", + "52800955717241623316508532", + "35374699188141961223196637" + ], + "mAssetSupply": "104259008564301236485622406" + }, + { + "type": "redeemMasset", + "inputQty": "687732491534384977726668", + "expectedQtys": [ + "106800277895436250460873", + "348190908880329129832017", + "233275108269779838846112" + ], + "redemptionFee": "206319747460315493318", + "reserves": [ + "16088788406139301270590935", + "52452764808361294186676515", + "35141424079872181384350525" + ], + "mAssetSupply": "103571482392514311823389056" + }, + { + "type": "mintMulti", + "inputQtys": [ + "11768493468116846", + "16053643834352740", + "67296882594665200" + ], + "expectedQty": "95095715682134609", + "reserves": [ + "16088788417907794738707781", + "52452764824414938021029255", + "35141424147169063979015725" + ], + "mAssetSupply": "103571482487610027505523665" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "13853571427737423314944", + "expectedQty": "14019948373857424779389", + "reserves": [ + "16102641989335532162022725", + "52452764824414938021029255", + "35141424147169063979015725" + ] + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "3508569547044952735744", + "expectedQty": "3510888255855542428870", + "swapFee": "2105141728226971641", + "reserves": [ + "16102641989335532162022725", + "52452764824414938021029255", + "35137913258913208436586855" + ], + "mAssetSupply": "103581995971578568204538951" + }, + { + "type": "mintMulti", + "inputQtys": [ + "38756454854455690526720", + "43722092150373100814336", + "18298877658348067487744" + ], + "expectedQty": "101001845115745951350218", + "reserves": [ + "16141398444189987852549445", + "52496486916565311121843591", + "35156212136571556504074599" + ], + "mAssetSupply": "103682997816694314155889169" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "31968647609335652352", + "expectedQty": "31572009451512780497", + "swapFee": "19181188565601391", + "reserves": [ + "16141366872180536339768948", + "52496486916565311121843591", + "35156212136571556504074599" + ], + "mAssetSupply": "103682965867227893385838208" + }, + { + "type": "mintMulti", + "inputQtys": [ + "426688784470345646080", + "299705744358545620992", + "289621702667495014400" + ], + "expectedQty": "1019270158346626634572", + "reserves": [ + "16141793560965006685415028", + "52496786622309669667464583", + "35156501758274223999088999" + ], + "mAssetSupply": "103683985137386240012472780" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "167417083269221122572288", + "outputIndex": 2, + "expectedQty": "166689332408040654286810", + "swapFee": "99951371123197855683", + "reserves": [ + "16141793560965006685415028", + "52664203705578890790036871", + "34989812425866183344802189" + ], + "mAssetSupply": "103684085088757363210328463", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "7888757368548028841984", + "expectedQty": "7879252997068310465983", + "reserves": [ + "16141793560965006685415028", + "52664203705578890790036871", + "34997701183234731373644173" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "1519716758343159906304", + "5920069242301588701184", + "4806522107643547353088" + ], + "expectedQty": "12229167159923031586552", + "swapFee": "7341905439217349361", + "reserves": [ + "16140273844206663525508724", + "52658283636336589201335687", + "34992894661127087826291085" + ], + "mAssetSupply": "103679735174594508489207894" + }, + { + "type": "mintMulti", + "inputQtys": [ + "332758332254659029237760", + "103475740115650639560704", + "442273590058903675076608" + ], + "expectedQty": "881383223229895645651898", + "reserves": [ + "16473032176461322554746484", + "52761759376452239840896391", + "35435168251185991501367693" + ], + "mAssetSupply": "104561118397824404134859792" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "10422980525843826688", + "68128877462945316864", + "60027702959267356672" + ], + "expectedQty": "138295894068661534814", + "swapFee": "83027352852908666", + "reserves": [ + "16473021753480796710919796", + "52761691247574776895579527", + "35435108223483032234011021" + ], + "mAssetSupply": "104560980101930335473324978" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "871597611333685", + "outputIndex": 1, + "expectedQty": "885487399280584", + "swapFee": "529023277263", + "reserves": [ + "16473021754352394322253481", + "52761691246689289496298943", + "35435108223483032234011021" + ], + "mAssetSupply": "104560980101930864496602241", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "1062922061204739258843136", + "expectedQty": "1067399492562311231959522", + "swapFee": "637753236722843555305", + "reserves": [ + "16473021754352394322253481", + "51694291754126978264339421", + "35435108223483032234011021" + ], + "mAssetSupply": "103498695793962848081314410" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "130030852027786625024", + "expectedQty": "129863667159319923527", + "reserves": [ + "16473021754352394322253481", + "51694291754126978264339421", + "35435238254335060020636045" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "197364658368656277766144", + "46064787070623028346880", + "34911851538807057809408" + ], + "expectedQty": "280279199617578863448955", + "reserves": [ + "16670386412721050600019625", + "51740356541197601292686301", + "35470150105873867078445453" + ], + "mAssetSupply": "103779104857247586264686892" + }, + { + "type": "mintMulti", + "inputQtys": [ + "106055070768745119744", + "63287093553137139712", + "23786556125609652224" + ], + "expectedQty": "193971515255219279080", + "reserves": [ + "16670492467791819345139369", + "51740419828291154429826013", + "35470173892429992688097677" + ], + "mAssetSupply": "103779298828762841483965972" + }, + { + "type": "mintMulti", + "inputQtys": [ + "1649710268358554880", + "710094621438739712", + "312268040633891648" + ], + "expectedQty": "2686533182253243171", + "reserves": [ + "16670494117502087703694249", + "51740420538385775868565725", + "35470174204698033321989325" + ], + "mAssetSupply": "103779301515296023737209143" + }, + { + "type": "mintMulti", + "inputQtys": [ + "4284191235639100833792", + "386150734620210340298752", + "224747523418759507214336" + ], + "expectedQty": "613141005426120593582634", + "reserves": [ + "16674778308737726804528041", + "52126571273005986208864477", + "35694921728116792829203661" + ], + "mAssetSupply": "104392442520722144330791777" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "405961402821564497920", + "276725690719029592064", + "3272965959231558647808" + ], + "expectedQty": "3954751545126073675294", + "swapFee": "2374275492371066845", + "reserves": [ + "16674372347334905240030121", + "52126294547315267179272413", + "35691648762157561270555853" + ], + "mAssetSupply": "104388487769177018257116483" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "694049030798263189504", + "expectedQty": "696907575764059398780", + "swapFee": "416429418478957913", + "reserves": [ + "16674372347334905240030121", + "52125597639739503119873633", + "35691648762157561270555853" + ], + "mAssetSupply": "104387794136575638472884892" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "12772708975117904", + "expectedQty": "12825314656347573", + "swapFee": "7663625385070", + "reserves": [ + "16674372347334905240030121", + "52125597626914188463526060", + "35691648762157561270555853" + ], + "mAssetSupply": "104387794123810593123152058" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "5858677234776207785984", + "4695024831312248176640", + "6784267180133833506816" + ], + "expectedQty": "17372773969125773154865", + "swapFee": "10429922334876389726", + "reserves": [ + "16668513670100129032244137", + "52120902602082876215349420", + "35684864494977427437049037" + ], + "mAssetSupply": "104370421349841467349997193" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "1725584118968062836736", + "expectedQty": "1717472297751431171856", + "reserves": [ + "16668513670100129032244137", + "52122628186201844278186156", + "35684864494977427437049037" + ] + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "5310505099844571136", + "expectedQty": "5332386532214463743", + "swapFee": "3186303059906742", + "reserves": [ + "16668513670100129032244137", + "52122622853815312063722413", + "35684864494977427437049037" + ], + "mAssetSupply": "104372133514820421996504655" + }, + { + "type": "mintMulti", + "inputQtys": [ + "170586449355390976000", + "109744116760775163904", + "379731247255673569280" + ], + "expectedQty": "660972201133669179770", + "reserves": [ + "16668684256549484423220137", + "52122732597932072838886317", + "35685244226224683110618317" + ], + "mAssetSupply": "104372794487021555665684425" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "1230896948345065695084544", + "expectedQty": "1235860049412023523032932", + "swapFee": "738538169007039417050", + "reserves": [ + "16668684256549484423220137", + "50886872548520049315853385", + "35685244226224683110618317" + ], + "mAssetSupply": "103142636076845497010016931" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "18178487287495882964992", + "outputIndex": 0, + "expectedQty": "17891674386259637777949", + "swapFee": "10857712997639300305", + "reserves": [ + "16650792582163224785442188", + "50905051035807545198818377", + "35685244226224683110618317" + ], + "mAssetSupply": "103142646934558494649317236", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemBassets", + "inputQtys": [ + "2503910891237045248", + "638221330936292480", + "2278463840648830720" + ], + "expectedQty": "5441765715326129035", + "swapFee": "3267019640980265", + "reserves": [ + "16650790078252333548396940", + "50905050397586214262525897", + "35685241947760842461787597" + ], + "mAssetSupply": "103142641492792779323188201" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "139974186487393097351168", + "expectedQty": "138377285235771277982839", + "swapFee": "83984511892435858410", + "reserves": [ + "16512412793016562270414101", + "50905050397586214262525897", + "35685241947760842461787597" + ], + "mAssetSupply": "103002751290817278661695443" + }, + { + "type": "mintMulti", + "inputQtys": [ + "525863574312412812148736", + "241113595942457908920320", + "204438525078074524958720" + ], + "expectedQty": "975696445998891690098450", + "reserves": [ + "17038276367328975082562837", + "51146163993528672171446217", + "35889680472838916986746317" + ], + "mAssetSupply": "103978447736816170351793893" + }, + { + "type": "redeemMasset", + "inputQty": "2920993816402854936576", + "expectedQtys": [ + "478500789193267871610", + "1436382372693511127303", + "1007921227470958068466" + ], + "redemptionFee": "876298144920856480", + "reserves": [ + "17037797866539781814691227", + "51144727611155978660318914", + "35888672551611446028677851" + ], + "mAssetSupply": "103975527619297912417713797" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "81876235824393688711168", + "expectedQty": "81512013244233381110759", + "reserves": [ + "17037797866539781814691227", + "51226603846980372349030082", + "35888672551611446028677851" + ] + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "1491440620802164020740096", + "expectedQty": "1473585727418995942149543", + "swapFee": "894864372481298412444", + "reserves": [ + "15564212139120785872541684", + "51226603846980372349030082", + "35888672551611446028677851" + ], + "mAssetSupply": "102566493876112463076496904" + }, + { + "type": "mintMulti", + "inputQtys": [ + "7939433682951526678528", + "3662681970431635750912", + "5211071149422852177920" + ], + "expectedQty": "16887205526315982681896", + "reserves": [ + "15572151572803737399220212", + "51230266528950803984780994", + "35893883622760868880855771" + ], + "mAssetSupply": "102583381081638779059178800" + }, + { + "type": "redeemMasset", + "inputQty": "16425400992444278374", + "expectedQtys": [ + "2492626949435003422", + "8200404573496520559", + "5745517003201666941" + ], + "redemptionFee": "4927620297733283", + "reserves": [ + "15572149080176787964216790", + "51230258328546230488260435", + "35893877877243865679188830" + ], + "mAssetSupply": "102583364661165406912633709" + }, + { + "type": "mintMulti", + "inputQtys": [ + "1632125781980206596096", + "13462347309686852681728", + "11068994935619435102208" + ], + "expectedQty": "26099993540049122396239", + "reserves": [ + "15573781205958768170812886", + "51243720675855917340942163", + "35904946872179485114291038" + ], + "mAssetSupply": "102609464654705456035029948" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "74140950756132321755136", + "3729264232774544543186944", + "1665737254955954452037632" + ], + "expectedQty": "5449855286733267340913625", + "swapFee": "3271876297818651595505", + "reserves": [ + "15499640255202635849057750", + "47514456443081372797755219", + "34239209617223530662253406" + ], + "mAssetSupply": "97159609367972188694116323" + }, + { + "type": "mintMulti", + "inputQtys": [ + "787583137135040659456", + "1726443326202256556032", + "505026321690303201280" + ], + "expectedQty": "3019293686911237353360", + "reserves": [ + "15500427838339770889717206", + "47516182886407575054311251", + "34239714643545220965454686" + ], + "mAssetSupply": "97162628661659099931469683" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "19806424795909898240", + "expectedQty": "19883699512715282255", + "swapFee": "11883854877545938", + "reserves": [ + "15500427838339770889717206", + "47516163002708062339028996", + "34239714643545220965454686" + ], + "mAssetSupply": "97162608867118158899117381" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "175844745550882340864", + "expectedQty": "173804662828296086637", + "swapFee": "105506847330529404", + "reserves": [ + "15500254033676942593630569", + "47516163002708062339028996", + "34239714643545220965454686" + ], + "mAssetSupply": "97162433127879455347305921" + }, + { + "type": "mintMulti", + "inputQtys": [ + "244572800868597268480", + "116664063421101326336", + "98013925787696021504" + ], + "expectedQty": "461297751905650090719", + "reserves": [ + "15500498606477811190899049", + "47516279666771483440355332", + "34239812657471008661476190" + ], + "mAssetSupply": "97162894425631360997396640" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "78671531165811094847488", + "101213718578023710588928", + "91393309671513087016960" + ], + "expectedQty": "271559894945967100773402", + "swapFee": "163033757221913408509", + "reserves": [ + "15421827075312000096051561", + "47415065948193459729766404", + "34148419347799495574459230" + ], + "mAssetSupply": "96891334530685393896623238" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "132336791221411417948160", + "265174055058956676497408", + "54634170919480360697856" + ], + "expectedQty": "452353383985059015627149", + "swapFee": "271574975376261166075", + "reserves": [ + "15289490284090588678103401", + "47149891893134503053268996", + "34093785176880015213761374" + ], + "mAssetSupply": "96438981146700334880996089" + }, + { + "type": "mintMulti", + "inputQtys": [ + "69425526955245437976576", + "108725756080921665077248", + "6691350866505370697728" + ], + "expectedQty": "185124687980807512756566", + "reserves": [ + "15358915811045834116079977", + "47258617649215424718346244", + "34100476527746520584459102" + ], + "mAssetSupply": "96624105834681142393752655" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "274690213340556010979328", + "expectedQty": "274249306072204156955635", + "reserves": [ + "15358915811045834116079977", + "47258617649215424718346244", + "34375166741087076595438430" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "776159334652888", + "82228287002247", + "840640798414296" + ], + "expectedQty": "1706058618197713", + "reserves": [ + "15358915811821993450732865", + "47258617649297653005348491", + "34375166741927717393852726" + ], + "mAssetSupply": "96898355142459405168906003" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "9094897395285642706944", + "expectedQty": "9104301672397437777112", + "swapFee": "5456938437171385624", + "reserves": [ + "15358915811821993450732865", + "47258617649297653005348491", + "34366062440255319956075614" + ], + "mAssetSupply": "96889265702002556697584683" + }, + { + "type": "redeemMasset", + "inputQty": "138662468246263893170585", + "expectedQtys": [ + "21974222315289843536380", + "67613585702424357861028", + "49168021064484158714876" + ], + "redemptionFee": "41598740473879167951", + "reserves": [ + "15336941589506703607196485", + "47191004063595228647487463", + "34316894419190835797360738" + ], + "mAssetSupply": "96750644832496766683582049" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "6151021055201808832528384", + "outputIndex": 0, + "expectedQty": "6004417462677388624864328", + "swapFee": "3682433892927881234067", + "reserves": [ + "9332524126829314982332157", + "47191004063595228647487463", + "40467915474392644629889122" + ], + "mAssetSupply": "96754327266389694564816116", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mintMulti", + "inputQtys": [ + "147896798474555204042752", + "29618801357605488820224", + "248765619559052223709184" + ], + "expectedQty": "429870903491869203931020", + "reserves": [ + "9480420925303870186374909", + "47220622864952834136307687", + "40716681093951696853598306" + ], + "mAssetSupply": "97184198169881563768747136" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "1993585582475768496128", + "2846493380600847663104", + "3868043344523160977408" + ], + "expectedQty": "8735426152199171198503", + "swapFee": "5244402332719134199", + "reserves": [ + "9478427339721394417878781", + "47217776371572233288644583", + "40712813050607173692620898" + ], + "mAssetSupply": "97175462743729364597548633" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "12062922204982902784", + "33435186774969249792", + "44507285751757168640" + ], + "expectedQty": "89938961484460366526", + "swapFee": "53995774355289393", + "reserves": [ + "9478415276799189434975997", + "47217742936385458319394791", + "40712768543321421935452258" + ], + "mAssetSupply": "97175372804767880137182107" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "3816733727546117980160", + "7255014589237515255808", + "2668682129287719419904" + ], + "expectedQty": "13805790929996186173337", + "swapFee": "8288447626573655897", + "reserves": [ + "9474598543071643316995837", + "47210487921796220804138983", + "40710099861192134216032354" + ], + "mAssetSupply": "97161567013837883951008770" + }, + { + "type": "mintMulti", + "inputQtys": [ + "176569208449913350782976", + "1658170726386462573461504", + "1233187781668506420903936" + ], + "expectedQty": "3055331494287811534138702", + "reserves": [ + "9651167751521556667778813", + "48868658648182683377600487", + "41943287642860640636936290" + ], + "mAssetSupply": "100216898508125695485147472" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "35965487568330006528", + "expectedQty": "35703177606739233096", + "reserves": [ + "9651167751521556667778813", + "48868694613670251707607015", + "41943287642860640636936290" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "14573035510860", + "2903591337822", + "7784504083699" + ], + "expectedQty": "25714793911006", + "reserves": [ + "9651167751536129703289673", + "48868694613673155298944837", + "41943287642868425141019989" + ], + "mAssetSupply": "100216934211329017018291574" + }, + { + "type": "mintMulti", + "inputQtys": [ + "3569125877767157579776", + "16608429925376406323200", + "1208857396670653792256" + ], + "expectedQty": "21385428184894079304023", + "reserves": [ + "9654736877413896860869449", + "48885303043598531705268037", + "41944496500265095794812245" + ], + "mAssetSupply": "100238319639513911097595597" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "498464151139766894592", + "expectedQty": "495697914099491343710", + "reserves": [ + "9654736877413896860869449", + "48885303043598531705268037", + "41944994964416235561706837" + ] + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "693894700630758945456128", + "outputIndex": 0, + "expectedQty": "663899490155972300238939", + "swapFee": "413994763879772525796", + "reserves": [ + "8990837387257924560630510", + "48885303043598531705268037", + "42638889665046994507162965" + ], + "mAssetSupply": "100239229332191890361465103", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "235502751605074803294208", + "expectedQty": "236828167195946103972471", + "swapFee": "141301650963044881976", + "reserves": [ + "8990837387257924560630510", + "48885303043598531705268037", + "42402061497851048403190494" + ], + "mAssetSupply": "100003867882237778603052871" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "163404681711292317696", + "199184768687100624896", + "263341406407258701824" + ], + "expectedQty": "629491036144366829258", + "swapFee": "377921374511326893", + "reserves": [ + "8990673982576213268312814", + "48885103858829844604643141", + "42401798156444641144488670" + ], + "mAssetSupply": "100003238391201634236223613" + }, + { + "type": "mintMulti", + "inputQtys": [ + "646379786362988920832", + "301484555881731391488", + "774028029959625506816" + ], + "expectedQty": "1741448310322530530555", + "reserves": [ + "8991320362362576257233646", + "48885405343385726336034629", + "42402572184474600769995486" + ], + "mAssetSupply": "100004979839511956766754168" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "425473368413678285619200", + "225813889207930800046080", + "861012017299461192548352" + ], + "expectedQty": "1523320394094725680682117", + "swapFee": "914540961033455481698", + "reserves": [ + "8565846993948897971614446", + "48659591454177795535988549", + "41541560167175139577447134" + ], + "mAssetSupply": "98481659445417231086072051" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "282673351770426408960", + "outputIndex": 1, + "expectedQty": "297518599662544007629", + "swapFee": "177140829536556603", + "reserves": [ + "8566129667300668398023406", + "48659293935578132991980920", + "41541560167175139577447134" + ], + "mAssetSupply": "98481659622558060622628654", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemMasset", + "inputQty": "257813261795760281", + "expectedQtys": [ + "22418380238561223", + "127346023928616992", + "108718234220270426" + ], + "redemptionFee": "77343978538728", + "reserves": [ + "8566129644882288159462183", + "48659293808232109063363928", + "41541560058456905357176708" + ], + "mAssetSupply": "98481659364822142805407101" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "209126652459307570823168", + "expectedQty": "207391934464481647001651", + "reserves": [ + "8566129644882288159462183", + "48868420460691416634187096", + "41541560058456905357176708" + ] + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "5415760206839350820864", + "expectedQty": "5657441402503422858534", + "reserves": [ + "8571545405089127510283047", + "48868420460691416634187096", + "41541560058456905357176708" + ] + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "2461324607981439418368", + "outputIndex": 1, + "expectedQty": "2591051419945250465593", + "swapFee": "1542637720101702441", + "reserves": [ + "8574006729697108949701415", + "48865829409271471383721503", + "41541560058456905357176708" + ], + "mAssetSupply": "98694710283326847976969727", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mintMulti", + "inputQtys": [ + "35813573618793042673664", + "40059828148826730921984", + "25483495283987882967040" + ], + "expectedQty": "102454555234878755117204", + "reserves": [ + "8609820303315901992375079", + "48905889237420298114643487", + "41567043553740893240143748" + ], + "mAssetSupply": "98797164838561726732086931" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "310246546222042578944", + "outputIndex": 0, + "expectedQty": "295046001886489695834", + "swapFee": "184975592316497177", + "reserves": [ + "8609525257314015502679245", + "48905889237420298114643487", + "41567353800287115282722692" + ], + "mAssetSupply": "98797165023537319048584108", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "2333729818280440889344", + "outputIndex": 2, + "expectedQty": "2327675500559173504262", + "swapFee": "1388642970629655902", + "reserves": [ + "8609525257314015502679245", + "48908222967238578555532831", + "41565026124786556109218430" + ], + "mAssetSupply": "98797166412180289678240010", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mintMulti", + "inputQtys": [ + "27074956598342764724224", + "3230454217531212169216", + "165514399630594391670784" + ], + "expectedQty": "195946497355924832975070", + "reserves": [ + "8636600213912358267403469", + "48911453421456109767702047", + "41730540524417150500889214" + ], + "mAssetSupply": "98993112909536214511215080" + }, + { + "type": "mintMulti", + "inputQtys": [ + "1499010565606706432", + "1038030098056750208", + "1663765283068835072" + ], + "expectedQty": "4247921362973990644", + "reserves": [ + "8636601712922923874109901", + "48911454459486207824452255", + "41730542188182433569724286" + ], + "mAssetSupply": "98993117157457577485205724" + }, + { + "type": "mintMulti", + "inputQtys": [ + "122195838824344964825088", + "256875363684826524680192", + "194182436147135070076928" + ], + "expectedQty": "575273099625420234018939", + "reserves": [ + "8758797551747268838934989", + "49168329823171034349132447", + "41924724624329568639801214" + ], + "mAssetSupply": "99568390257082997719224663" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "4315600859336062747541504", + "expectedQty": "4441242610824519250950220", + "reserves": [ + "13074398411083331586476493", + "49168329823171034349132447", + "41924724624329568639801214" + ] + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "150899536093435393998848", + "expectedQty": "153805871516076571279132", + "reserves": [ + "13225297947176766980475341", + "49168329823171034349132447", + "41924724624329568639801214" + ] + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "1432735579685969559814144", + "expectedQty": "1436909780731342514519038", + "swapFee": "859641347811581735888", + "reserves": [ + "13225297947176766980475341", + "49168329823171034349132447", + "40487814843598226125282176" + ], + "mAssetSupply": "102731562801085435563375759" + }, + { + "type": "redeemMasset", + "inputQty": "9856259029087137090764", + "expectedQtys": [ + "1268479259561701786177", + "4715886693599638743580", + "3883311634959592749146" + ], + "redemptionFee": "2956877708726141127", + "reserves": [ + "13224029467917205278689164", + "49163613936477434710388867", + "40483931531963266532533030" + ], + "mAssetSupply": "102721709498934057152426122" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "3107297182082073624576", + "21446833956941820067840", + "17556607354687702695936" + ], + "expectedQty": "41996540572727635412013", + "swapFee": "25213052174941546174", + "reserves": [ + "13220922170735123205064588", + "49142167102520492890321027", + "40466374924608578829837094" + ], + "mAssetSupply": "102679712958361329517014109" + }, + { + "type": "redeemMasset", + "inputQty": "20004793727796700774", + "expectedQtys": [ + "2575021576830427704", + "9571355083029020280", + "7881582481260679603" + ], + "redemptionFee": "6001438118339010", + "reserves": [ + "13220919595713546374636884", + "49142157531165409861300747", + "40466367043026097569157491" + ], + "mAssetSupply": "102679692959569039838652345" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "94195892531317407744", + "147413061184040714240", + "34340248389140344832" + ], + "expectedQty": "276800754878065247693", + "swapFee": "166180161023453220", + "reserves": [ + "13220825399821015057229140", + "49142010118104225820586507", + "40466332702777708428812659" + ], + "mAssetSupply": "102679416158814161773404652" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "591998967764176200531968", + "expectedQty": "589971326838204858996732", + "reserves": [ + "13220825399821015057229140", + "49142010118104225820586507", + "41058331670541884629344627" + ] + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "24196282772137107783680", + "expectedQty": "23737075641899208213903", + "swapFee": "14517769663282264670", + "reserves": [ + "13197088324179115849015237", + "49142010118104225820586507", + "41058331670541884629344627" + ], + "mAssetSupply": "103245205720649892806882374" + }, + { + "type": "redeemMasset", + "inputQty": "580708092908880579788", + "expectedQtys": [ + "74205449467703170148", + "276318901486716148987", + "230865466773035809643" + ], + "redemptionFee": "174212427872664173", + "reserves": [ + "13197014118729648145845089", + "49141733799202739104437520", + "41058100805075111593534984" + ], + "mAssetSupply": "103244625186769411798966759" + }, + { + "type": "mintMulti", + "inputQtys": [ + "794010236949616914333696", + "444916818181558978478080", + "25749585143238987087872" + ], + "expectedQty": "1276448334601974908093788", + "reserves": [ + "13991024355679265060178785", + "49586650617384298082915600", + "41083850390218350580622856" + ], + "mAssetSupply": "104521073521371386707060547" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "5774141582310857752182784", + "outputIndex": 0, + "expectedQty": "5561014472956557595081891", + "swapFee": "3445783226288187214666", + "reserves": [ + "8430009882722707465096894", + "55360792199695155835098384", + "41083850390218350580622856" + ], + "mAssetSupply": "104524519304597674894275213", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemMasset", + "inputQty": "7404155097813792849920", + "expectedQtys": [ + "596973570725074489649", + "3920390397804230336114", + "2909364663598952364682" + ], + "redemptionFee": "2221246529344137854", + "reserves": [ + "8429412909151982390607245", + "55356871809297351604762270", + "41080941025554751628258174" + ], + "mAssetSupply": "104517117370746390445563147" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "161424192773310621155328", + "102684105626162437292032", + "305057607402221329186816" + ], + "expectedQty": "574990812944858356140990", + "swapFee": "345201608732154306268", + "reserves": [ + "8267988716378671769451917", + "55254187703671189167470238", + "40775883418152530299071358" + ], + "mAssetSupply": "103942126557801532089422157" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "305798635465035808768", + "outputIndex": 0, + "expectedQty": "286816828460775615576", + "swapFee": "181618676115401554", + "reserves": [ + "8267701899550210993836341", + "55254493502306654203279006", + "40775883418152530299071358" + ], + "mAssetSupply": "103942126739420208204823711", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "1488912521625233408", + "expectedQty": "1479849533509210469", + "reserves": [ + "8267701899550210993836341", + "55254493502306654203279006", + "40775884907065051924304766" + ] + }, + { + "type": "redeemMasset", + "inputQty": "67222208840461690758758", + "expectedQtys": [ + "5345344195714919287179", + "35723867371874014841423", + "26362965472301018545694" + ], + "redemptionFee": "20166662652138507227", + "reserves": [ + "8262356555354496074549162", + "55218769634934780188437583", + "40749521941592750905759072" + ], + "mAssetSupply": "103874926177091932161782649" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "580646667342813134848", + "expectedQty": "586243060332135360669", + "swapFee": "348388000405687880", + "reserves": [ + "8262356555354496074549162", + "55218183391874448053076914", + "40749521941592750905759072" + ], + "mAssetSupply": "103874345878812589754335681" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "12204111036226528608256", + "expectedQty": "12271465047689774378438", + "swapFee": "7322466621735917164", + "reserves": [ + "8262356555354496074549162", + "55218183391874448053076914", + "40737250476545061131380634" + ], + "mAssetSupply": "103862149090242984961644589" + }, + { + "type": "redeemMasset", + "inputQty": "29460489291870843699", + "expectedQtys": [ + "2342913612283923486", + "15657933986227254702", + "11551650915701998263" + ], + "redemptionFee": "8838146787561253", + "reserves": [ + "8262354212440883790625676", + "55218167733940461825822212", + "40737238924894145429382371" + ], + "mAssetSupply": "103862119638591839878362143" + }, + { + "type": "redeemMasset", + "inputQty": "448021760932964330373120", + "expectedQtys": [ + "35629967713363722936735", + "238118759250117034567347", + "175672268497039744938634" + ], + "redemptionFee": "134406528279889299111", + "reserves": [ + "8226724244727520067688941", + "54980048974690344791254865", + "40561566656397105684443737" + ], + "mAssetSupply": "103414232284187155437288134" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "157167488100184162304", + "312939761937213030400", + "233634564193772437504" + ], + "expectedQty": "707748129855216662299", + "swapFee": "424903820205253149", + "reserves": [ + "8226567077239419883526637", + "54979736034928407578224465", + "40561333021832911912006233" + ], + "mAssetSupply": "103413524536057300220625835" + }, + { + "type": "redeemMasset", + "inputQty": "26514056495781052940288", + "expectedQtys": [ + "2108565870191896628596", + "14091952799625327895596", + "10396346575225929306860" + ], + "redemptionFee": "7954216948734315882", + "reserves": [ + "8224458511369227986898041", + "54965644082128782250328869", + "40550936675257685982699373" + ], + "mAssetSupply": "103387018433778467902001429" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "1264738945589980245786624", + "expectedQty": "1324841977309684277462496", + "reserves": [ + "9489197456959208232684665", + "54965644082128782250328869", + "40550936675257685982699373" + ] + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "17028538959758875250655232", + "hardLimitError": true + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "96489519949977904742400", + "expectedQty": "100430813643852668866163", + "reserves": [ + "9585686976909186137427065", + "54965644082128782250328869", + "40550936675257685982699373" + ] + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "5551493840098267404173312", + "expectedQty": "5593402677430583254101623", + "swapFee": "3330896304058960442503", + "reserves": [ + "9585686976909186137427065", + "49372241404698198996227246", + "40550936675257685982699373" + ], + "mAssetSupply": "99264128280937796404599279" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "43638966037992660992", + "expectedQty": "43943095752692975950", + "swapFee": "26183379622795596", + "reserves": [ + "9585686976909186137427065", + "49372197461602446303251296", + "40550936675257685982699373" + ], + "mAssetSupply": "99264084668155138034733883" + }, + { + "type": "mintMulti", + "inputQtys": [ + "2641133832065257519972352", + "207685927643306463854592", + "1913573986284641290551296" + ], + "expectedQty": "4827087296147514194818427", + "reserves": [ + "12226820808974443657399417", + "49579883389245752767105888", + "42464510661542327273250669" + ], + "mAssetSupply": "104091171964302652229552310" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "5582706261338347274240", + "expectedQty": "5455066715305764468697", + "swapFee": "3349623756803008364", + "reserves": [ + "12221365742259137892930720", + "49579883389245752767105888", + "42464510661542327273250669" + ], + "mAssetSupply": "104085592607665070685286434" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "1526787891390863951003648", + "877107745728826714357760", + "473669739680124597436416" + ], + "expectedQty": "2909273836909884534029500", + "swapFee": "1746612269507635301598", + "reserves": [ + "10694577850868273941927072", + "48702775643516926052748128", + "41990840921862202675814253" + ], + "mAssetSupply": "101176318770755186151256934" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "1434430208898945119158272", + "expectedQty": "1442723397914727520040295", + "swapFee": "860658125339367071494", + "reserves": [ + "10694577850868273941927072", + "47260052245602198532707833", + "41990840921862202675814253" + ], + "mAssetSupply": "99742749219981580399170156" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "410031195020458127785984", + "expectedQty": "407469493147065208480133", + "reserves": [ + "10694577850868273941927072", + "47670083440622656660493817", + "41990840921862202675814253" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "4771647807606484992", + "7454785503047359488", + "4860968400880413696" + ], + "expectedQty": "17151145128639247046", + "reserves": [ + "10694582622516081548412064", + "47670090895408159707853305", + "41990845782830603556227949" + ], + "mAssetSupply": "100150235864273774246897335" + }, + { + "type": "mintMulti", + "inputQtys": [ + "7409161800896845185024", + "9855400162962926731264", + "3832339482187822792704" + ], + "expectedQty": "21224945624840726175488", + "reserves": [ + "10701991784316978393597088", + "47679946295571122634584569", + "41994678122312791379020653" + ], + "mAssetSupply": "100171460809898614973072823" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "9178718360745184780615680", + "outputIndex": 2, + "expectedQty": "9138441575157101402445067", + "swapFee": "5467904497182454424069", + "reserves": [ + "10701991784316978393597088", + "56858664656316307415200249", + "32856236547155689976575586" + ], + "mAssetSupply": "100176928714395797427496892", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "1233893860253260476055552", + "outputIndex": 1, + "expectedQty": "1240757094816902564130883", + "swapFee": "738637595153722998752", + "reserves": [ + "10701991784316978393597088", + "55617907561499404851069366", + "34090130407408950452631138" + ], + "mAssetSupply": "100177667351990951150495644", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mintMulti", + "inputQtys": [ + "10317404750755401728", + "5934810634859160576", + "9258967177081280512" + ], + "expectedQty": "25743269815275722976", + "reserves": [ + "10702002101721729148998816", + "55617913496310039710229942", + "34090139666376127533911650" + ], + "mAssetSupply": "100177693095260766426218620" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "14030501198061070336", + "expectedQty": "13994206312851946435", + "reserves": [ + "10702002101721729148998816", + "55617913496310039710229942", + "34090153696877325594981986" + ] + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "7659959755938012856320", + "expectedQty": "7675209972662838663020", + "swapFee": "4595975853562807713", + "reserves": [ + "10702002101721729148998816", + "55617913496310039710229942", + "34082478486904662756318966" + ], + "mAssetSupply": "100170051725686994828116448" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "730021031210386230083584", + "expectedQty": "750228867656504454855898", + "reserves": [ + "11432023132932115379082400", + "55617913496310039710229942", + "34082478486904662756318966" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "241717459934952948760576", + "52177950993467563835392", + "199968747632271837626368" + ], + "expectedQty": "499162811251326759029363", + "reserves": [ + "11673740592867068327842976", + "55670091447303507274065334", + "34282447234536934593945334" + ], + "mAssetSupply": "101419443404594826042001709" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "123738725906944498860032", + "outputIndex": 2, + "expectedQty": "126988289483467377349993", + "swapFee": "76075879470514800527", + "reserves": [ + "11797479318774012826703008", + "55670091447303507274065334", + "34155458945053467216595341" + ], + "mAssetSupply": "101419519480474296556802236", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "2015570330961932189696", + "outputIndex": 2, + "expectedQty": "2003455089287116757998", + "swapFee": "1200247018432305379", + "reserves": [ + "11797479318774012826703008", + "55672107017634469206255030", + "34153455489964180099837343" + ], + "mAssetSupply": "101419520680721314989107615", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "3969512452021469919051776", + "expectedQty": "3973235950255548303580401", + "swapFee": "2381707471212881951431", + "reserves": [ + "11797479318774012826703008", + "55672107017634469206255030", + "30180219539708631796256942" + ], + "mAssetSupply": "97452389936171057952007270" + }, + { + "type": "mintMulti", + "inputQtys": [ + "54679267465739736", + "51149115822824848", + "12886159190186588" + ], + "expectedQty": "119549183938147596", + "reserves": [ + "11797479373453280292442744", + "55672107068783585029079878", + "30180219552594790986443530" + ], + "mAssetSupply": "97452390055720241890154866" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "2260566560799039107891200", + "expectedQty": "2242209099606259091750463", + "reserves": [ + "11797479373453280292442744", + "57932673629582624136971078", + "30180219552594790986443530" + ] + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "1404862227118768391192576", + "expectedQty": "1366316919387824448113623", + "swapFee": "842917336271261034715", + "reserves": [ + "10431162454065455844329121", + "57932673629582624136971078", + "30180219552594790986443530" + ], + "mAssetSupply": "98290579845544003851747468" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "10693048564059363328", + "expectedQty": "10592689517221794687", + "reserves": [ + "10431162454065455844329121", + "57932684322631188196334406", + "30180219552594790986443530" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "1852477989107515015561216", + "2457329672350282127769600", + "604089288413415724810240" + ], + "expectedQty": "4955841132783860778757177", + "swapFee": "2975289853582465946822", + "reserves": [ + "8578684464957940828767905", + "55475354650280906068564806", + "29576130264181375261633290" + ], + "mAssetSupply": "93334749305449660294784978" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "63364788245535268012032", + "expectedQty": "62681889348236210528310", + "reserves": [ + "8578684464957940828767905", + "55538719438526441336576838", + "29576130264181375261633290" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "296686487720016092332032", + "532481884344794658897920", + "93192691830811562868736" + ], + "expectedQty": "928872986218532671100939", + "reserves": [ + "8875370952677956921099937", + "56071201322871235995474758", + "29669322956012186824502026" + ], + "mAssetSupply": "94326304181016429176414227" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "4896213012339344384", + "6441650298731823104", + "1189627770829775104" + ], + "expectedQty": "12656385940759692191", + "swapFee": "7598390598815104", + "reserves": [ + "8875366056464944581755553", + "56071194881220937263651654", + "29669321766384415994726922" + ], + "mAssetSupply": "94326291524630488416722036" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "195076028205947748352", + "expectedQty": "195345957481060300602", + "swapFee": "117045616923568649", + "reserves": [ + "8875366056464944581755553", + "56071194881220937263651654", + "29669126420426934934426320" + ], + "mAssetSupply": "94326096565647899392542333" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "7176888287375646523392", + "6797482223359077908480", + "16687909695701039185920" + ], + "expectedQty": "30849694622893000426304", + "swapFee": "18520929331334601016", + "reserves": [ + "8868189168177568935232161", + "56064397398997578185743174", + "29652438510731233895240400" + ], + "mAssetSupply": "94295246871025006392116029" + }, + { + "type": "redeemMasset", + "inputQty": "4978778778071455334", + "expectedQtys": [ + "468098951638671226", + "2959306026183668288", + "1565175834341823945" + ], + "redemptionFee": "1493633633421436", + "reserves": [ + "8868188700078617296560935", + "56064394439691552002074886", + "29652436945555399553416455" + ], + "mAssetSupply": "94295241893739861954082131" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "11145053529719988813824", + "expectedQty": "11598602666172750193862", + "reserves": [ + "8879333753608337285374759", + "56064394439691552002074886", + "29652436945555399553416455" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "33865021859940", + "41920034878557", + "28660942353181" + ], + "expectedQty": "105323438771283", + "reserves": [ + "8879333753642202307234699", + "56064394439733472036953443", + "29652436945584060495769636" + ], + "mAssetSupply": "94306840496511358143047276" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "99381923451335323156480", + "outputIndex": 2, + "expectedQty": "103510820502243114380508", + "swapFee": "62026000322900524428", + "reserves": [ + "8978715677093537630391179", + "56064394439733472036953443", + "29548926125081817381389128" + ], + "mAssetSupply": "94306902522511681043571704", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mintMulti", + "inputQtys": [ + "404556978706201378816", + "930454284908150784000", + "705138986632121679872" + ], + "expectedQty": "2045159198435258915952", + "reserves": [ + "8979120234072243831769995", + "56065324894018380187737443", + "29549631264068449503069000" + ], + "mAssetSupply": "94308947681710116302487656" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "1025018287727209128919040", + "2261999769346693876678656", + "1433747154561934498463744" + ], + "expectedQty": "4737210015841695515410468", + "swapFee": "2844032428962394746093", + "reserves": [ + "7954101946345034702850955", + "53803325124671686311058787", + "28115884109506515004605256" + ], + "mAssetSupply": "89571737665868420787077188" + }, + { + "type": "mintMulti", + "inputQtys": [ + "7293390606230810001408", + "13638315041730026536960", + "9945354332277743550464" + ], + "expectedQty": "31039095659765350330033", + "reserves": [ + "7961395336951265512852363", + "53816963439713416337595747", + "28125829463838792748155720" + ], + "mAssetSupply": "89602776761528186137407221" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "42930860655520800", + "expectedQty": "43396202165273611", + "swapFee": "25758516393312", + "reserves": [ + "7961395336951265512852363", + "53816963396317214172322136", + "28125829463838792748155720" + ], + "mAssetSupply": "89602776718623083998279733" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "1238037468348470001664", + "1259157822375030161408", + "1336964693396387266560" + ], + "expectedQty": "3874358814023833034864", + "swapFee": "2326010894951270583", + "reserves": [ + "7960157299482917042850699", + "53815704238494839142160728", + "28124492499145396360889160" + ], + "mAssetSupply": "89598902359809060165244869" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "3669495625879850389078016", + "expectedQty": "3707376312341770361902035", + "swapFee": "2201697375527910233446", + "reserves": [ + "7960157299482917042850699", + "50108327926153068780258693", + "28124492499145396360889160" + ], + "mAssetSupply": "85931608431304737686400299" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "386536889442941", + "outputIndex": 0, + "expectedQty": "367098547601080", + "swapFee": "229531328851", + "reserves": [ + "7960157299115818495249619", + "50108327926539605669701634", + "28124492499145396360889160" + ], + "mAssetSupply": "85931608431304967217729150", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemMasset", + "inputQty": "3434116192267108404428", + "expectedQtys": [ + "318019233449016843514", + "2001896625633281009334", + "1123612161120775847604" + ], + "redemptionFee": "1030234857680132521", + "reserves": [ + "7959839279882369478406105", + "50106326029913972388692300", + "28123368886984275585041556" + ], + "mAssetSupply": "85928175345347557789457243" + }, + { + "type": "redeemMasset", + "inputQty": "96768204647097385877504", + "expectedQtys": [ + "8961301406575663475987", + "56410421635654237475706", + "31661692692908596216798" + ], + "redemptionFee": "29030461394129215763", + "reserves": [ + "7950877978475793814930118", + "50049915608278318151216594", + "28091707194291366988824758" + ], + "mAssetSupply": "85831436171161854532795502" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "73318030377111945216", + "109900824506954645504", + "135699647287614439424" + ], + "expectedQty": "320464615899878098396", + "swapFee": "192394206063564998", + "reserves": [ + "7950804660445416702984902", + "50049805707453811196571090", + "28091571494644079374385334" + ], + "mAssetSupply": "85831115706545954654697106" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "887419737176220150792192", + "expectedQty": "884895082655999333983035", + "reserves": [ + "7950804660445416702984902", + "50049805707453811196571090", + "28978991231820299525177526" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "14287423435072870547456", + "9422753934148139745280", + "18782363027992456724480" + ], + "expectedQty": "42940273372972459823147", + "reserves": [ + "7965092083880489573532358", + "50059228461387959336316370", + "28997773594848291981902006" + ], + "mAssetSupply": "86758951062574926448503288" + }, + { + "type": "redeemMasset", + "inputQty": "1021892936984200793292", + "expectedQtys": [ + "93788933613023078343", + "589447253771977337109", + "341448690607944855335" + ], + "redemptionFee": "306567881095260237", + "reserves": [ + "7964998294946876550454015", + "50058639014134187358979261", + "28997432146157684037046671" + ], + "mAssetSupply": "86757929476205823342970233" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "79372234157772784", + "outputIndex": 2, + "expectedQty": "82904032782899242", + "swapFee": "49622058744625", + "reserves": [ + "7964998374319110708226799", + "50058639014134187358979261", + "28997432063253651254147429" + ], + "mAssetSupply": "86757929476255445401714858", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemMasset", + "inputQty": "12090005019757395941785", + "expectedQtys": [ + "1109615937677794852934", + "6973744507925414156510", + "4039675999540417462568" + ], + "redemptionFee": "3627001505927218782", + "reserves": [ + "7963888758381432913373865", + "50051665269626261944822751", + "28993392387254110836684861" + ], + "mAssetSupply": "86745843098237193932991855" + }, + { + "type": "redeemMasset", + "inputQty": "349320307321445808498278", + "expectedQtys": [ + "32060481341814989602189", + "201494587529843221893739", + "116719625784476643630440" + ], + "redemptionFee": "104796092196433742549", + "reserves": [ + "7931828277039617923771676", + "49850170682096418722929012", + "28876672761469634193054421" + ], + "mAssetSupply": "86396627587007944558236126" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "143671379310663719452672", + "expectedQty": "142205173112513408737076", + "reserves": [ + "7931828277039617923771676", + "49993842061407082442381684", + "28876672761469634193054421" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "156644851242641108500480", + "40233928289361441325056", + "98589608432989917675520" + ], + "expectedQty": "301253617287841713083448", + "reserves": [ + "8088473128282259032272156", + "50034075989696443883706740", + "28975262369902624110729941" + ], + "mAssetSupply": "86840086377408299680056650" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "855413425501100", + "expectedQty": "846833815915699", + "reserves": [ + "8088473128282259032272156", + "50034075990551857309207840", + "28975262369902624110729941" + ] + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "3636200050456654848", + "expectedQty": "3625561638817897930", + "reserves": [ + "8088473128282259032272156", + "50034075990551857309207840", + "28975266006102674567384789" + ] + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "143716869145248296599552", + "expectedQty": "145083033620548364796014", + "swapFee": "86230121487148977959", + "reserves": [ + "8088473128282259032272156", + "49888992956931308944411826", + "28975266006102674567384789" + ], + "mAssetSupply": "86696459364793011166248686" + }, + { + "type": "redeemMasset", + "inputQty": "7614301397184519392460", + "expectedQtys": [ + "710174282447105476902", + "4380292697185680019404", + "2544051073452474386606" + ], + "redemptionFee": "2284290419155355817", + "reserves": [ + "8087762953999811926795254", + "49884612664234123264392422", + "28972721955029222092998183" + ], + "mAssetSupply": "86688847347686245802212043" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "1334101548171912355512320", + "expectedQty": "1320537947118384670486299", + "reserves": [ + "8087762953999811926795254", + "51218714212406035619904742", + "28972721955029222092998183" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "551621535914379116544", + "620414278529422196736", + "573580147625464168448" + ], + "expectedQty": "1760837712501260375705", + "swapFee": "1057136909646544151", + "reserves": [ + "8087211332463897547678710", + "51218093798127506197708006", + "28972148374881596628829735" + ], + "mAssetSupply": "88007624457092129212322637" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "34066151310634090758144", + "62425498191514883325952", + "132873478387220625752064" + ], + "expectedQty": "229787450556873312286429", + "swapFee": "137955243480212114640", + "reserves": [ + "8053145181153263456920566", + "51155668299935991314382054", + "28839274896494376003077671" + ], + "mAssetSupply": "87777837006535255900036208" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "4832826044558539713675264", + "expectedQty": "4877452064368324444186299", + "swapFee": "2899695626735123828205", + "reserves": [ + "8053145181153263456920566", + "46278216235567666870195755", + "28839274896494376003077671" + ], + "mAssetSupply": "82947910657603451310189149" + }, + { + "type": "redeemMasset", + "inputQty": "316541188319785588359168", + "expectedQtys": [ + "30722743701523287326817", + "176551365259928051580919", + "110021815235160966689992" + ], + "redemptionFee": "94962356495935676507", + "reserves": [ + "8022422437451740169593749", + "46101664870307738818614836", + "28729253081259215036387679" + ], + "mAssetSupply": "82631464431640161657506488" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "1513162664846485713059840", + "expectedQty": "1499082233859394942913395", + "reserves": [ + "8022422437451740169593749", + "47614827535154224531674676", + "28729253081259215036387679" + ] + }, + { + "type": "redeemMasset", + "inputQty": "6205328611628988497920", + "expectedQtys": [ + "591542964213929672516", + "3510936558163465053881", + "2118386018667255150793" + ], + "redemptionFee": "1861598583488696549", + "reserves": [ + "8021830894487526239921233", + "47611316598596061066620795", + "28727134695240547781236886" + ], + "mAssetSupply": "84124343198486511100618512" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "83552887403816534016", + "outputIndex": 2, + "expectedQty": "86969436513586966998", + "swapFee": "52048891571319365", + "reserves": [ + "8021914447374930056455249", + "47611316598596061066620795", + "28727047725804034194269888" + ], + "mAssetSupply": "84124343250535402671937877", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "54293147324130432", + "outputIndex": 1, + "expectedQty": "56876065143198364", + "swapFee": "33821654513982", + "reserves": [ + "8021914501668077380585681", + "47611316541719995923422431", + "28727047725804034194269888" + ], + "mAssetSupply": "84124343250569224326451859", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemMasset", + "inputQty": "46904266937191819221401", + "expectedQtys": [ + "4471347127280952891008", + "26538144155066242410090", + "16012212832401428503063" + ], + "redemptionFee": "14071280081157545766", + "reserves": [ + "8017443154540796427694673", + "47584778397564929681012341", + "28711035512971632765766825" + ], + "mAssetSupply": "84077453054912113664776224" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "410517944044768102187008", + "320413552827049097297920", + "1877189920947910937149440" + ], + "expectedQty": "2615630509467688301762269", + "swapFee": "1570320497979400621430", + "reserves": [ + "7606925210496028325507665", + "47264364844737880583714421", + "26833845592023721828617385" + ], + "mAssetSupply": "81461822545444425363013955" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "62589535636384672382976", + "expectedQty": "60091257153280549704776", + "swapFee": "37553721381830803429", + "reserves": [ + "7546833953342747775802889", + "47264364844737880583714421", + "26833845592023721828617385" + ], + "mAssetSupply": "81399270563529422521434408" + }, + { + "type": "redeemMasset", + "inputQty": "540213714141982", + "expectedQtys": [ + "50070229140531", + "313580183768258", + "178031848298341" + ], + "redemptionFee": "162064114242", + "reserves": [ + "7546833953292677546662358", + "47264364844424300399946163", + "26833845591845689980319044" + ], + "mAssetSupply": "81399270562989370871406668" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "132259804622378896", + "5907892448039539712", + "5829217753704724480" + ], + "expectedQty": "11798319699734030774", + "swapFee": "7083241764899358", + "reserves": [ + "7546833821032872924283462", + "47264358936531852360406451", + "26833839762627936275594564" + ], + "mAssetSupply": "81399258764669671137375894" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "53945392669023419760640", + "91467582191603313278976", + "140359943523598071758848" + ], + "expectedQty": "286683776728452570292616", + "swapFee": "172113534157566081824", + "reserves": [ + "7492888428363849504522822", + "47172891354340249047127475", + "26693479819104338203835716" + ], + "mAssetSupply": "81112574987941218567083278" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "49808909617630752", + "39138458205423848", + "39128176854602976" + ], + "expectedQty": "129639224719627198", + "swapFee": "77830232971559", + "reserves": [ + "7492888378554939886892070", + "47172891315201790841703627", + "26693479779976161349232740" + ], + "mAssetSupply": "81112574858301993847456080" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "261193250379855776710656", + "expectedQty": "263738368979186356545684", + "swapFee": "156715950227913466026", + "reserves": [ + "7492888378554939886892070", + "46909152946222604485157943", + "26693479779976161349232740" + ], + "mAssetSupply": "80851538323872365984211450" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "2796497295512181470658560", + "outputIndex": 0, + "expectedQty": "2612206257080130064336795", + "swapFee": "1672257666004267108462", + "reserves": [ + "4880682121474809822555275", + "46909152946222604485157943", + "29489977075488342819891300" + ], + "mAssetSupply": "80853210581538370251319912", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mintMulti", + "inputQtys": [ + "39348337427105192", + "33259729447297540", + "85736023043946704" + ], + "expectedQty": "161203417003783498", + "reserves": [ + "4880682160823147249660467", + "46909152979482333932455483", + "29489977161224365863838004" + ], + "mAssetSupply": "80853210742741787255103410" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "265462315492589659226112", + "expectedQty": "267194795858787874937810", + "swapFee": "159277389295553795535", + "reserves": [ + "4880682160823147249660467", + "46909152979482333932455483", + "29222782365365577988900194" + ], + "mAssetSupply": "80587907704638493149672833" + }, + { + "type": "mintMulti", + "inputQtys": [ + "1296440309390302773248", + "2507024638017945468928", + "3954113439596765249536" + ], + "expectedQty": "7822174028105605704387", + "reserves": [ + "4881978601132537552433715", + "46911660004120351877924411", + "29226736478805174754149730" + ], + "mAssetSupply": "80595729878666598755377220" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "66927257234575164702720", + "outputIndex": 2, + "expectedQty": "66337224937080184117789", + "swapFee": "39547900899185196029", + "reserves": [ + "4881978601132537552433715", + "46978587261354927042627131", + "29160399253868094570031941" + ], + "mAssetSupply": "80595769426567497940573249", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemMasset", + "inputQty": "8554891015437389555302", + "expectedQtys": [ + "518045372989037505217", + "4985077106782252614194", + "3094321205028410623451" + ], + "redemptionFee": "2566467304631216866", + "reserves": [ + "4881460555759548514928498", + "46973602184248144790012937", + "29157304932663066159408490" + ], + "mAssetSupply": "80587217102019365182234813" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "69481376663250483019776", + "expectedQty": "68995744092200517376275", + "reserves": [ + "4881460555759548514928498", + "46973602184248144790012937", + "29226786309326316642428266" + ] + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "19904232531691523014656", + "outputIndex": 1, + "expectedQty": "22222779715614838027692", + "swapFee": "13140209668657404198", + "reserves": [ + "4901364788291240037943154", + "46951379404532529951985245", + "29226786309326316642428266" + ], + "mAssetSupply": "80656225986321234357015286", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemMasset", + "inputQty": "84341597549397900", + "expectedQtys": [ + "5123782010405637", + "49081968706218844", + "30553057848588298" + ], + "redemptionFee": "25302479264819", + "reserves": [ + "4901364783167458027537517", + "46951379355450561245766401", + "29226786278773258793839968" + ], + "mAssetSupply": "80656225902004939286882205" + }, + { + "type": "redeemMasset", + "inputQty": "119224011437977122321203", + "expectedQtys": [ + "7242901044843491498618", + "69381531396786369752001", + "43189342201774222618503" + ], + "redemptionFee": "35767203431393136696", + "reserves": [ + "4894121882122614536038899", + "46881997824053774876014400", + "29183596936571484571221465" + ], + "mAssetSupply": "80537037657770393557697698" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "3635968947755065077137408", + "outputIndex": 0, + "hardLimitError": true + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "15972622280563531776", + "expectedQty": "14514203327728251916", + "swapFee": "9583573368338119", + "reserves": [ + "4894107367919286807786983", + "46881997824053774876014400", + "29183596936571484571221465" + ], + "mAssetSupply": "80537021694731686362504041" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "29335566928740727390208", + "expectedQty": "28892549333674902830150", + "reserves": [ + "4894107367919286807786983", + "46911333390982515603404608", + "29183596936571484571221465" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "25162440470943", + "139381424920457", + "20556315321323" + ], + "expectedQty": "185365220432890", + "reserves": [ + "4894107367944449248257926", + "46911333391121897028325065", + "29183596936592040886542788" + ], + "mAssetSupply": "80565914244250726485767081" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "80818956408609753268224", + "4595537083098745798656", + "35332890567622493470720" + ], + "expectedQty": "128632510690392402655801", + "swapFee": "77225841919387073837", + "reserves": [ + "4813288411535839494989702", + "46906737854038798282526409", + "29148264046024418393072068" + ], + "mAssetSupply": "80437281733560334083111280" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "1400673211931750563840", + "6534615481477664604160", + "5387811780041766862848" + ], + "expectedQty": "13328937821463297009874", + "swapFee": "8002163991272741851", + "reserves": [ + "4811887738323907744425862", + "46900203238557320617922249", + "29142876234244376626209220" + ], + "mAssetSupply": "80423952795738870786101406" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "3704287819691231849480192", + "912238113806316413648896", + "2360067823430187744231424" + ], + "hardLimitError": true + }, + { + "type": "redeemBassets", + "inputQtys": [ + "39024100968559873622016", + "26915777307102301650944", + "295039871147658291707904" + ], + "expectedQty": "362524347537436800637482", + "swapFee": "217645195639845987975", + "reserves": [ + "4772863637355347870803846", + "46873287461250218316271305", + "28847836363096718334501316" + ], + "mAssetSupply": "80061428448201433985463924" + }, + { + "type": "redeemMasset", + "inputQty": "52483241704299121606656", + "expectedQtys": [ + "3127850853376028469120", + "30717963747954408050991", + "18905155571626943828720" + ], + "redemptionFee": "15744972511289736481", + "reserves": [ + "4769735786501971842334726", + "46842569497502263908220314", + "28828931207525091390672596" + ], + "mAssetSupply": "80008960951469646153593749" + }, + { + "type": "redeemMasset", + "inputQty": "13128324294458177119846", + "expectedQtys": [ + "782410518374183776815", + "7683888735773755455556", + "4728995487357078532443" + ], + "redemptionFee": "3938497288337453135", + "reserves": [ + "4768953375983597658557911", + "46834885608766490152764758", + "28824202212037734312140153" + ], + "mAssetSupply": "79995836565672476313927038" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "32641471910959648768", + "expectedQty": "36041396386212270718", + "reserves": [ + "4768986017455508618206679", + "46834885608766490152764758", + "28824202212037734312140153" + ] + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "1868205829318980352868352", + "expectedQty": "2008943978580477283329757", + "reserves": [ + "6637191846774488971075031", + "46834885608766490152764758", + "28824202212037734312140153" + ] + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "43350108138657963573248", + "expectedQty": "43814995135528123298301", + "swapFee": "26010064883194778143", + "reserves": [ + "6637191846774488971075031", + "46791070613630962029466457", + "28824202212037734312140153" + ], + "mAssetSupply": "81961492487575565040732408" + }, + { + "type": "redeemMasset", + "inputQty": "42452806158973319249920", + "expectedQtys": [ + "3436771099892576416437", + "24228650147593589621958", + "14925315920758374554310" + ], + "redemptionFee": "12735841847691995774", + "reserves": [ + "6633755075674596394658594", + "46766841963483368439844499", + "28809276896116975937585843" + ], + "mAssetSupply": "81919052417258439413478262" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "55636752925672576385024", + "expectedQty": "56232539804275192412331", + "swapFee": "33382051755403545831", + "reserves": [ + "6633755075674596394658594", + "46710609423679093247432168", + "28809276896116975937585843" + ], + "mAssetSupply": "81863449046384522240639069" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "400752964316281", + "expectedQty": "396272475456585", + "reserves": [ + "6633755075674596394658594", + "46710609424079846211748449", + "28809276896116975937585843" + ] + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "4894379150277905219584", + "expectedQty": "4913284272326907572453", + "swapFee": "2936627490166743131", + "reserves": [ + "6633755075674596394658594", + "46710609424079846211748449", + "28804363611844649030013390" + ], + "mAssetSupply": "81858557604258006977619201" + }, + { + "type": "mintMulti", + "inputQtys": [ + "18109390321303005691904", + "4531844553808872472576", + "6028504342426339508224" + ], + "expectedQty": "29572924352606658983013", + "reserves": [ + "6651864465995899400350498", + "46715141268633655084221025", + "28810392116187075369521614" + ], + "mAssetSupply": "81888130528610613636602214" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "135616407251462225920", + "24388695266072563712", + "106017775691347869696" + ], + "expectedQty": "272605725393060769556", + "swapFee": "163661632215165561", + "reserves": [ + "6651728849588647938124578", + "46715116879938389011657313", + "28810286098411384021651918" + ], + "mAssetSupply": "81887857922885220575832658" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "13313787396321309622272", + "15023921928177096589312", + "3584633776914502254592" + ], + "expectedQty": "32459058143959561716189", + "swapFee": "19487127162673341034", + "reserves": [ + "6638415062192326628502306", + "46700092958010211915068001", + "28806701464634469519397326" + ], + "mAssetSupply": "81855398864741261014116469" + }, + { + "type": "redeemMasset", + "inputQty": "545359200908769154931097", + "expectedQtys": [ + "44214977724051178228944", + "311044662092525037125276", + "191866228855773305162182" + ], + "redemptionFee": "163607760272630746479", + "reserves": [ + "6594200084468275450273362", + "46389048295917686877942725", + "28614835235778696214235144" + ], + "mAssetSupply": "81310203271592764489931851" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "5657507457071070576640", + "33348262185260189483008", + "24142089355237710102528" + ], + "expectedQty": "62974748148866676423599", + "swapFee": "37807533409365625229", + "reserves": [ + "6588542577011204379696722", + "46355700033732426688459717", + "28590693146423458504132616" + ], + "mAssetSupply": "81247228523443897813508252" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "301034984672494228602880", + "outputIndex": 0, + "expectedQty": "281406309965707149828809", + "swapFee": "178594894087123137186", + "reserves": [ + "6307136267045497229867913", + "46656735018404920917062597", + "28590693146423458504132616" + ], + "mAssetSupply": "81247407118337984936645438", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemBassets", + "inputQtys": [ + "50008977095397323309056", + "75735122781435366211584", + "58419357889033362472960" + ], + "expectedQty": "185994163353296458785864", + "swapFee": "111663496109643661468", + "reserves": [ + "6257127289950099906558857", + "46580999895623485550851013", + "28532273788534425141659656" + ], + "mAssetSupply": "81061412954984688477859574" + }, + { + "type": "mintMulti", + "inputQtys": [ + "1100344178892838071697408", + "1520505901598735203303424", + "695809904333002968662016" + ], + "expectedQty": "3355064196369208087988612", + "reserves": [ + "7357471468842937978256265", + "48101505797222220754154437", + "29228083692867428110321672" + ], + "mAssetSupply": "84416477151353896565848186" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "2106434447013559140352", + "1786704763231422382080", + "1574479657222194331648" + ], + "expectedQty": "5540991994172703065333", + "swapFee": "3326591151194338442", + "reserves": [ + "7355365034395924419115913", + "48099719092458989331772357", + "29226509213210205915990024" + ], + "mAssetSupply": "84410936159359723862782853" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "1064274003821410476097536", + "585807461686842423771136", + "945500755772589834502144" + ], + "expectedQty": "2641851006114246898558829", + "swapFee": "1586062241013156032754", + "reserves": [ + "6291091030574513943018377", + "47513911630772146908001221", + "28281008457437616081487880" + ], + "mAssetSupply": "81769085153245476964224024" + }, + { + "type": "mintMulti", + "inputQtys": [ + "356972105049725728718848", + "481386246816312185585664", + "633991243482784285589504" + ], + "expectedQty": "1484819730757776992333653", + "reserves": [ + "6648063135624239671737225", + "47995297877588459093586885", + "28914999700920400367077384" + ], + "mAssetSupply": "83253904884003253956557677" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "43998052918855327744", + "61208511104260792320", + "9403700969392175104" + ], + "expectedQty": "116341827295916758355", + "swapFee": "69847004580298233", + "reserves": [ + "6648019137571320816409481", + "47995236669077354832794565", + "28914990297219430974902280" + ], + "mAssetSupply": "83253788542175958039799322" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "235159492907750574260224", + "expectedQty": "236029728815824945679786", + "swapFee": "141095695744650344556", + "reserves": [ + "6648019137571320816409481", + "47995236669077354832794565", + "28678960568403606029222494" + ], + "mAssetSupply": "83018770144963952115883654" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "558065091853427186597888", + "outputIndex": 2, + "expectedQty": "588738102461422171482747", + "swapFee": "352183226182366418437", + "reserves": [ + "7206084229424748003007369", + "47995236669077354832794565", + "28090222465942183857739747" + ], + "mAssetSupply": "83019122328190134482302091", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mintMulti", + "inputQtys": [ + "47601395778244152", + "9558111329956718", + "34087506151691492" + ], + "expectedQty": "93278818623878757", + "reserves": [ + "7206084277026143781251521", + "47995236678635466162751283", + "28090222500029690009431239" + ], + "mAssetSupply": "83019122421468953106180848" + }, + { + "type": "redeemMasset", + "inputQty": "28914207119918662", + "expectedQtys": [ + "2509008765330727", + "16710943820728556", + "9780431613512925" + ], + "redemptionFee": "8674262135975", + "reserves": [ + "7206084274517135015920794", + "47995236661924522342022727", + "28090222490249258395918314" + ], + "mAssetSupply": "83019122392563420248398161" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "2170124803339976704000", + "expectedQty": "2070781573993989082011", + "swapFee": "1302074882003986022", + "reserves": [ + "7204013492943141026838783", + "47995236661924522342022727", + "28090222490249258395918314" + ], + "mAssetSupply": "83016953569834962275680183" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "158322669891638377054208", + "expectedQty": "156616987034604971832416", + "reserves": [ + "7204013492943141026838783", + "48153559331816160719076935", + "28090222490249258395918314" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "15718496011546777354240", + "31289916393746830721024", + "35456877674139765178368" + ], + "expectedQty": "82753554154866145407588", + "swapFee": "49681941657914435906", + "reserves": [ + "7188294996931594249484543", + "48122269415422413888355911", + "28054765612575118630739946" + ], + "mAssetSupply": "83090817002714701102105011" + }, + { + "type": "redeemMasset", + "inputQty": "1251245574507957862", + "expectedQtys": [ + "108214413226718320", + "724444830123260172", + "422343546038921970" + ], + "redemptionFee": "375373672352387", + "reserves": [ + "7188294888717181022766223", + "48122268690977583765095739", + "28054765190231572591817976" + ], + "mAssetSupply": "83090815751844500266499536" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "3801776422518731722194944", + "outputIndex": 0, + "hardLimitError": true + }, + { + "type": "redeemBassets", + "inputQtys": [ + "1167856182550679", + "5750890596729462", + "698852409327927" + ], + "expectedQty": "7608717480424659", + "swapFee": "4567971271017", + "reserves": [ + "7188294887549324840215544", + "48122268685226693168366277", + "28054765189532720182490049" + ], + "mAssetSupply": "83090815744235782786074877" + }, + { + "type": "mintMulti", + "inputQtys": [ + "37175876039836979691520", + "561164256558280733622272", + "220877888102312435515392" + ], + "expectedQty": "814146224049253901074686", + "reserves": [ + "7225470763589161819907064", + "48683432941784973901988549", + "28275643077635032618005441" + ], + "mAssetSupply": "83904961968285036687149563" + }, + { + "type": "redeemMasset", + "inputQty": "287670812036669269606", + "expectedQtys": [ + "24765322884977477078", + "166862613579181776664", + "96914852126557739731" + ], + "redemptionFee": "86301243611000780", + "reserves": [ + "7225445998266276842429986", + "48683266079171394720211885", + "28275546162782906060265710" + ], + "mAssetSupply": "83904674383774243628880737" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "34653218863133851648", + "expectedQty": "34533439447989555336", + "reserves": [ + "7225445998266276842429986", + "48683266079171394720211885", + "28275580816001769194117358" + ] + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "146951723825822498291712", + "expectedQty": "153901282061011971238187", + "reserves": [ + "7372397722092099340721698", + "48683266079171394720211885", + "28275580816001769194117358" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "133544109305373380313088", + "9927027164306527485952", + "34288380541074965266432" + ], + "expectedQty": "183837545251107746494287", + "swapFee": "110368748399704470578", + "reserves": [ + "7238853612786725960408610", + "48673339052007088192725933", + "28241292435460694228850926" + ], + "mAssetSupply": "83874772654023595843179973" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "43422370365874320179200", + "expectedQty": "45495372271947813404932", + "reserves": [ + "7282275983152600280587810", + "48673339052007088192725933", + "28241292435460694228850926" + ] + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "16653054034890891651448832", + "expectedQty": "16550007032780591720718344", + "reserves": [ + "7282275983152600280587810", + "48673339052007088192725933", + "44894346470351585880299758" + ] + }, + { + "type": "redeemMasset", + "inputQty": "23955446896261631207014", + "expectedQtys": [ + "1735815299033558111314", + "11601857273328087625720", + "10701090376639810021620" + ], + "redemptionFee": "7186634068878489362", + "reserves": [ + "7280540167853566722476496", + "48661737194733760105100213", + "44883645379974946070278138" + ], + "mAssetSupply": "100446326798813942624585597" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "90282202771665264", + "32704062883485496", + "94920836515226720" + ], + "expectedQty": "222687748497416349", + "swapFee": "133692864817340", + "reserves": [ + "7280540077571363950811232", + "48661737162029697221614717", + "44883645285054109555051418" + ], + "mAssetSupply": "100446326576126194127169248" + }, + { + "type": "mintMulti", + "inputQtys": [ + "634050143570438016466944", + "189734712178436380557312", + "392925342628053763751936" + ], + "expectedQty": "1250190588463178356815645", + "reserves": [ + "7914590221141801967278176", + "48851471874208133602172029", + "45276570627682163318803354" + ], + "mAssetSupply": "101696517164589372483984893" + }, + { + "type": "redeemMasset", + "inputQty": "9504832443211220582", + "expectedQtys": [ + "739497162235604440", + "4564421380339978511", + "4230401645494237426" + ], + "redemptionFee": "2851449732963366", + "reserves": [ + "7914589481644639731673736", + "48851467309786753262193518", + "45276566397280517824565928" + ], + "mAssetSupply": "101696507662608379005727677" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "264517713662444300140544", + "outputIndex": 0, + "expectedQty": "247555001182871430481509", + "swapFee": "157295664075147366979", + "reserves": [ + "7667034480461768301192227", + "49115985023449197562334062", + "45276566397280517824565928" + ], + "mAssetSupply": "101696664958272454153094656", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "8812105365172465434624", + "expectedQty": "8879338594541586829077", + "swapFee": "5287263219103479260", + "reserves": [ + "7667034480461768301192227", + "49115985023449197562334062", + "45267687058685976237736851" + ], + "mAssetSupply": "101687858140170500791139292" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "250606017912812704", + "expectedQty": "252796160796541003", + "swapFee": "150363610747687", + "reserves": [ + "7667034480461768301192227", + "49115984770653036765793059", + "45267687058685976237736851" + ], + "mAssetSupply": "101687857889714846489074275" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "2905683294416392895332352", + "expectedQty": "2930030664440142364917309", + "swapFee": "1743409976649835737199", + "reserves": [ + "7667034480461768301192227", + "46185954106212894400875750", + "45267687058685976237736851" + ], + "mAssetSupply": "98783918005275103429479122" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "12160952208597436071936", + "outputIndex": 2, + "expectedQty": "12946356565527529173942", + "swapFee": "7708197126539633705", + "reserves": [ + "7679195432670365737264163", + "46185954106212894400875750", + "45254740702120448708562909" + ], + "mAssetSupply": "98783925713472229969112827", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemBassets", + "inputQtys": [ + "477472016230160256", + "782284237481551744", + "1738098008233662464" + ], + "expectedQty": "3003692471467785927", + "swapFee": "1803297461357486", + "reserves": [ + "7679194955198349507103907", + "46185953323928656919324006", + "45254738964022440474900445" + ], + "mAssetSupply": "98783922709779758501326900" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "26304125225116677177344", + "outputIndex": 1, + "expectedQty": "26295198851234728422566", + "swapFee": "15651924290744056073", + "reserves": [ + "7679194955198349507103907", + "46159658125077422190901440", + "45281043089247557152077789" + ], + "mAssetSupply": "98783938361704049245382973", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemBassets", + "inputQtys": [ + "19005585028177964564480", + "6203288289543986348032", + "3988213379450914996224" + ], + "expectedQty": "30183761126960870636352", + "swapFee": "18121129353788795659", + "reserves": [ + "7660189370170171542539427", + "46153454836787878204553408", + "45277054875868106237081565" + ], + "mAssetSupply": "98753754600577088374746621" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "3511099238274090038984704", + "outputIndex": 0, + "hardLimitError": true + }, + { + "type": "redeemBassets", + "inputQtys": [ + "58121769379815415808", + "2895917786399592960", + "21196612369390166016" + ], + "expectedQty": "85301751118704534008", + "swapFee": "51211777737865439", + "reserves": [ + "7660131248400791727123619", + "46153451940870091804960448", + "45277033679255736846915549" + ], + "mAssetSupply": "98753669298825969670212613" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "35744037777576202240", + "expectedQty": "36030626372898228068", + "swapFee": "21446422666545721", + "reserves": [ + "7660131248400791727123619", + "46153415910243718906732380", + "45277033679255736846915549" + ], + "mAssetSupply": "98753633576234614760556094" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "103625350561254516719616", + "expectedQty": "109410789994028670150805", + "reserves": [ + "7763756598962046243843235", + "46153415910243718906732380", + "45277033679255736846915549" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "8233814494375", + "636794811411069", + "786816548047450" + ], + "expectedQty": "1420502411403100", + "swapFee": "852813134722", + "reserves": [ + "7763756598953812429348860", + "46153415909606924095321311", + "45277033678468920298868099" + ], + "mAssetSupply": "98863044364808141019303799" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "312747944134589153280", + "264030685434233880576", + "156949740987225047040" + ], + "expectedQty": "747453293205071251135", + "swapFee": "448741220655436012", + "reserves": [ + "7763443851009677840195580", + "46153151878921489861440735", + "45276876728727933073821059" + ], + "mAssetSupply": "98862296911514935948052664" + }, + { + "type": "redeemMasset", + "inputQty": "166983717335483914649", + "expectedQtys": [ + "13108938831481691800", + "77931760243513598974", + "76452128579540036907" + ], + "redemptionFee": "50095115200645174", + "reserves": [ + "7763430742070846358503780", + "46153073947161246347841761", + "45276800276599353533784152" + ], + "mAssetSupply": "98862129977892715664783189" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "307371318693340490235904", + "expectedQty": "290564531792904456771633", + "swapFee": "184422791216004294141", + "reserves": [ + "7472866210277941901732147", + "46153073947161246347841761", + "45276800276599353533784152" + ], + "mAssetSupply": "98554943081990591178841426" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "35547216742906360496128", + "expectedQty": "37648656654524511094372", + "reserves": [ + "7508413427020848262228275", + "46153073947161246347841761", + "45276800276599353533784152" + ] + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "434908873436136634056704", + "expectedQty": "438455758579801795997631", + "swapFee": "260945324061681980434", + "reserves": [ + "7508413427020848262228275", + "45714618188581444551844130", + "45276800276599353533784152" + ], + "mAssetSupply": "98157943810533040737859528" + }, + { + "type": "mintMulti", + "inputQtys": [ + "667472524454717685760", + "334224387360736542720", + "839882236370227429376" + ], + "expectedQty": "1870454212064372627918", + "reserves": [ + "7509080899545302979914035", + "45714952412968805288386850", + "45277640158835723761213528" + ], + "mAssetSupply": "98159814264745105110487446" + }, + { + "type": "redeemMasset", + "inputQty": "13543155090296108639846", + "expectedQtys": [ + "1035720564219466289478", + "6305420988245466770937", + "6245102914615679631944" + ], + "redemptionFee": "4062946527088832591", + "reserves": [ + "7508045178981083513624557", + "45708646991980559821615913", + "45271395055921108081581584" + ], + "mAssetSupply": "98146275172601336090680191" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "75667181133069717340160", + "62605043119987160514560", + "44821731239463426719744" + ], + "expectedQty": "186616610505547663407484", + "swapFee": "112037188616498497142", + "reserves": [ + "7432377997848013796284397", + "45646041948860572661101353", + "45226573324681644654861840" + ], + "mAssetSupply": "97959658562095788427272707" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "6284798871523700787642368", + "expectedQty": "6487886116108433617162778", + "reserves": [ + "13717176869371714583926765", + "45646041948860572661101353", + "45226573324681644654861840" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "162437604361526770139136", + "424278985759184268558336", + "425591770732655913467904" + ], + "expectedQty": "1011577364808609568220145", + "swapFee": "607310805368386772995", + "reserves": [ + "13554739265010187813787629", + "45221762963101388392543017", + "44800981553948988741393936" + ], + "mAssetSupply": "103435967313395612476215340" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "10905640798915684990976", + "30893705013926066913280", + "22653428773966151942144" + ], + "expectedQty": "64418266608494742616775", + "swapFee": "38674164463775110636", + "reserves": [ + "13543833624211272128796653", + "45190869258087462325629737", + "44778328125175022589451792" + ], + "mAssetSupply": "103371549046787117733598565" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "3935710176147336081702912", + "5707704879323371016290304", + "268673912983827915997184" + ], + "expectedQty": "9974785294707200413105887", + "swapFee": "5988464255377546775929", + "reserves": [ + "9608123448063936047093741", + "39483164378764091309339433", + "44509654212191194673454608" + ], + "mAssetSupply": "93396763752079917320492678" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "842708580090810597376", + "expectedQty": "838287456314875486328", + "reserves": [ + "9608123448063936047093741", + "39484007087344182119936809", + "44509654212191194673454608" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "830723364136726298624", + "603197212069192400896", + "421610216809265627136" + ], + "expectedQty": "1875065930358418862678", + "reserves": [ + "9608954171428072773392365", + "39484610284556251312337705", + "44510075822408003939081744" + ], + "mAssetSupply": "93399477105466590614841684" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "2373080873634176696320", + "1698837834336078921728", + "2904664644994845900800" + ], + "expectedQty": "7021386086993122160527", + "swapFee": "4215360868717103558", + "reserves": [ + "9606581090554438596696045", + "39482911446721915233415977", + "44507171157763009093180944" + ], + "mAssetSupply": "93392455719379597492681157" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "87892674918066197364736", + "expectedQty": "88418327346510729077507", + "swapFee": "52735604950839718418", + "reserves": [ + "9606581090554438596696045", + "39482911446721915233415977", + "44418752830416498364103437" + ], + "mAssetSupply": "93304615780066482135034839" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "425441934886094784954368", + "outputIndex": 2, + "expectedQty": "425686952924338985592844", + "swapFee": "253912602415197637752", + "reserves": [ + "9606581090554438596696045", + "39908353381608010018370345", + "43993065877492159378510593" + ], + "mAssetSupply": "93304869692668897332672591", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "74745228026604335136768", + "expectedQty": "75182721719298214110942", + "swapFee": "44847136815962601082", + "reserves": [ + "9606581090554438596696045", + "39908353381608010018370345", + "43917883155772861164399651" + ], + "mAssetSupply": "93230169311779108960136905" + }, + { + "type": "redeemMasset", + "inputQty": "1272220110562726091161", + "expectedQtys": [ + "131052203826837167205", + "544426535565535747626", + "599124217109105371765" + ], + "redemptionFee": "381666033168817827", + "reserves": [ + "9606450038350611759528840", + "39907808955072444482622719", + "43917284031555752059027886" + ], + "mAssetSupply": "93228897473334579402863571" + }, + { + "type": "redeemMasset", + "inputQty": "351834796725949440", + "expectedQtys": [ + "36242726483476368", + "150562153421853943", + "165688897219945864" + ], + "redemptionFee": "105550439017784", + "reserves": [ + "9606450002107885276052472", + "39907808804510291060768776", + "43917283865866854839082022" + ], + "mAssetSupply": "93228897121605333115931915" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "827120218865975888445440", + "expectedQty": "821749139881504484335943", + "reserves": [ + "9606450002107885276052472", + "39907808804510291060768776", + "44744404084732830727527462" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "176640396473515596840960", + "149827802798073944473600", + "73382615534004588249088" + ], + "expectedQty": "404145196318859226998027", + "swapFee": "242632697409761393034", + "reserves": [ + "9429809605634369679211512", + "39757981001712217116295176", + "44671021469198826139278374" + ], + "mAssetSupply": "93646501065167978373269831" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "6404786817647334635077632", + "outputIndex": 2, + "expectedQty": "6398424276771402719708222", + "swapFee": "3819350067703063251237", + "reserves": [ + "9429809605634369679211512", + "46162767819359551751372808", + "38272597192427423419570152" + ], + "mAssetSupply": "93650320415235681436521068", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "118389117755310608", + "expectedQty": "117548981615277869", + "reserves": [ + "9429809605634369679211512", + "46162767937748669506683416", + "38272597192427423419570152" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "209925273895105429504", + "889556861980902948864", + "583843363388554936320" + ], + "expectedQty": "1680866558175715912047", + "swapFee": "1009125410151520459", + "reserves": [ + "9429599680360474573782008", + "46161878380886688603734552", + "38272013349064034864633832" + ], + "mAssetSupply": "93648639666226487335886890" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "2458690746116140433408", + "5044970919603007913984", + "171799362672070426624" + ], + "expectedQty": "7718217803982528695795", + "swapFee": "4633710908934878144", + "reserves": [ + "9427140989614358433348600", + "46156833409967085595820568", + "38271841549701362794207208" + ], + "mAssetSupply": "93640921448422504807191095" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "3730683205885076480", + "995428329321735782400", + "563427602668396675072" + ], + "expectedQty": "1552817520360068283409", + "swapFee": "932249862133320962", + "reserves": [ + "9427137258931152548272120", + "46155837981637763860038168", + "38271278122098694397532136" + ], + "mAssetSupply": "93639368630902144738907686" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "2555438198310701197426688", + "948402882175834225901568", + "2315433079355317103362048" + ], + "expectedQty": "5906371757740306213632916", + "swapFee": "3545950625019195245326", + "reserves": [ + "6871699060620451350845432", + "45207435099461929634136600", + "35955845042743377294170088" + ], + "mAssetSupply": "87732996873161838525274770" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "729764640594676416512", + "expectedQty": "724820186597264673163", + "reserves": [ + "6871699060620451350845432", + "45207435099461929634136600", + "35956574807383971970586600" + ] + }, + { + "type": "redeemMasset", + "inputQty": "682912207792759193", + "expectedQtys": [ + "53472704178903949", + "351785458361190412", + "279799110962270762" + ], + "redemptionFee": "204873662337827", + "reserves": [ + "6871699007147747171941483", + "45207434747676471272946188", + "35956574527584861008315838" + ], + "mAssetSupply": "87733721010641101659526567" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "607796218286027520", + "184460883150465248", + "548201560518673216" + ], + "expectedQty": "1369013509969870622", + "swapFee": "821901246729960", + "reserves": [ + "6871698399351528885913963", + "45207434563215588122480940", + "35956573979383300489642622" + ], + "mAssetSupply": "87733719641627591689655945" + }, + { + "type": "redeemMasset", + "inputQty": "3956248574167313966694", + "expectedQtys": [ + "309778170371208311520", + "2037964350631368028230", + "1620932854271002901275" + ], + "redemptionFee": "1186874572250194190", + "reserves": [ + "6871388621181157677602443", + "45205396598864956754452710", + "35954953046529029486741347" + ], + "mAssetSupply": "87729764579927996625883441" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "3170131060686746112", + "expectedQty": "3189841817446968285", + "swapFee": "1902078636412047", + "reserves": [ + "6871388621181157677602443", + "45205396598864956754452710", + "35954949856687212039773062" + ], + "mAssetSupply": "87729761411699014575549376" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "56555552104627953664", + "outputIndex": 0, + "expectedQty": "53158027276289120020", + "swapFee": "33703415041856853", + "reserves": [ + "6871335463153881388482423", + "45205396598864956754452710", + "35955006412239316667726726" + ], + "mAssetSupply": "87729761445402429617406229", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "83781750703590041714688", + "expectedQty": "84301600879192038921752", + "swapFee": "50269050422154025028", + "reserves": [ + "6871335463153881388482423", + "45205396598864956754452710", + "35870704811360124628804974" + ], + "mAssetSupply": "87646029963749261729716569" + }, + { + "type": "mintMulti", + "inputQtys": [ + "10464025145096148090880", + "16589095277809127915520", + "34022661644907603558400" + ], + "expectedQty": "61268542789315706640114", + "reserves": [ + "6881799488298977536573303", + "45221985694142765882368230", + "35904727473005032232363374" + ], + "mAssetSupply": "87707298506538577436356683" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "1184993414889710261633024", + "expectedQty": "1192108649710434042716600", + "swapFee": "710996048933826156979", + "reserves": [ + "6881799488298977536573303", + "45221985694142765882368230", + "34712618823294598189646774" + ], + "mAssetSupply": "86523016087697801000880638" + }, + { + "type": "redeemMasset", + "inputQty": "583201369398841", + "expectedQtys": [ + "46372295193359", + "304723680689079", + "233907397294174" + ], + "redemptionFee": "174960410819", + "reserves": [ + "6881799488252605241379944", + "45221985693838042201679151", + "34712618823060690792352600" + ], + "mAssetSupply": "86523016087114774591892616" + }, + { + "type": "redeemMasset", + "inputQty": "123736859462268490455449", + "expectedQtys": [ + "9838732339051695274361", + "64652713849277127820902", + "49627741402611117200883" + ], + "redemptionFee": "37121057838680547136", + "reserves": [ + "6871960755913553546105583", + "45157332979988765073858249", + "34662991081658079675151717" + ], + "mAssetSupply": "86399316348710344781984303" + }, + { + "type": "mintMulti", + "inputQtys": [ + "1866145879820110659584", + "3529064035450083606528", + "1638782593780275216384" + ], + "expectedQty": "7090302686196673308803", + "reserves": [ + "6873826901793373656765167", + "45160862044024215157464777", + "34664629864251859950368101" + ], + "mAssetSupply": "86406406651396541455293106" + }, + { + "type": "mintMulti", + "inputQtys": [ + "3436835691990344531968", + "10269994168718247067648", + "26298092344811622236160" + ], + "expectedQty": "39922803990269890413367", + "reserves": [ + "6877263737485364001297135", + "45171132038192933404532425", + "34690927956596671572604261" + ], + "mAssetSupply": "86446329455386811345706473" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "31736494319624169455616", + "expectedQty": "33456329282965510709980", + "reserves": [ + "6909000231804988170752751", + "45171132038192933404532425", + "34690927956596671572604261" + ] + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "41849412838538035200", + "outputIndex": 0, + "expectedQty": "39293622093411820178", + "swapFee": "24862937885973799", + "reserves": [ + "6908960938182894758932573", + "45171173887605771942567625", + "34690927956596671572604261" + ], + "mAssetSupply": "86479785809532714742390252", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemBassets", + "inputQtys": [ + "791830853719110975488", + "1401370520347836416000", + "3669208815680490569728" + ], + "expectedQty": "5868072762061166159082", + "swapFee": "3522957431695717125", + "reserves": [ + "6908169107329175647957085", + "45169772517085424106151625", + "34687258747780991082034533" + ], + "mAssetSupply": "86473917736770653576231170" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "190761102519503808", + "expectedQty": "188886612126152007", + "reserves": [ + "6908169107329175647957085", + "45169772707846526625655433", + "34687258747780991082034533" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "82668233570799243493376", + "55865830125539438886912", + "55472133317894682443776" + ], + "expectedQty": "197524604344020945208096", + "reserves": [ + "6990837340899974891450461", + "45225638537972066064542345", + "34742730881098885764478309" + ], + "mAssetSupply": "86671442530001286647591273" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "1946695097676633473024", + "expectedQty": "2049540637418220564477", + "reserves": [ + "6992784035997651524923485", + "45225638537972066064542345", + "34742730881098885764478309" + ] + }, + { + "type": "redeemMasset", + "inputQty": "12204600530941038192230", + "expectedQtys": [ + "984367082478123646159", + "6366367048039735474752", + "4890698820197541988576" + ], + "redemptionFee": "3661380159282311457", + "reserves": [ + "6991799668915173401277326", + "45219272170924026329067593", + "34737840182278688222489733" + ], + "mAssetSupply": "86661291131487923112274977" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "842203521756237266944", + "1232976541864770404352", + "2764569258305567850496" + ], + "expectedQty": "4854938055393690363497", + "swapFee": "2914711660232353630", + "reserves": [ + "6990957465393417164010382", + "45218039194382161558663241", + "34735075613020382654639237" + ], + "mAssetSupply": "86656436193432529421911480" + }, + { + "type": "mintMulti", + "inputQtys": [ + "324853837380529208426496", + "249699298234795481366528", + "542707986662363876032512" + ], + "expectedQty": "1128101733862037637509842", + "reserves": [ + "7315811302773946372436878", + "45467738492616957040029769", + "35277783599682746530671749" + ], + "mAssetSupply": "87784537927294567059421322" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "68414383606178754068480", + "981066626387157608038400", + "863355894987866599587840" + ], + "expectedQty": "1901910444984930338592016", + "swapFee": "1141831365810444469837", + "reserves": [ + "7247396919167767618368398", + "44486671866229799431991369", + "34414427704694879931083909" + ], + "mAssetSupply": "85882627482309636720829306" + }, + { + "type": "redeemMasset", + "inputQty": "3280910039325262374502", + "expectedQtys": [ + "276783845473004314633", + "1698981337542741423595", + "1314314331903869445555" + ], + "redemptionFee": "984273011797578712", + "reserves": [ + "7247120135322294614053765", + "44484972884892256690567774", + "34413113390362976061638354" + ], + "mAssetSupply": "85879347556543323256033516" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "357208694417857158578176", + "expectedQty": "359106554938986257612249", + "swapFee": "214325216650714295146", + "reserves": [ + "7247120135322294614053765", + "44484972884892256690567774", + "34054006835423989804026105" + ], + "mAssetSupply": "85522353187342116811750486" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "37018305041924452515840", + "62049496370730814668800", + "116494917753647315025920" + ], + "expectedQty": "216075075167521253962204", + "swapFee": "129722878827809438040", + "reserves": [ + "7210101830280370161537925", + "44422923388521525875898974", + "33937511917670342489000185" + ], + "mAssetSupply": "85306278112174595557788282" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "423293439343848", + "expectedQty": "426989015079754", + "swapFee": "253976063606", + "reserves": [ + "7210101830280370161537925", + "44422923388094536860819220", + "33937511917670342489000185" + ], + "mAssetSupply": "85306278111751556094508040" + }, + { + "type": "redeemMasset", + "inputQty": "41110345847030268978790", + "expectedQtys": [ + "3473611362026601865975", + "21401635517444844661357", + "16350077956048623156011" + ], + "redemptionFee": "12333103754109080693", + "reserves": [ + "7206628218918343559671950", + "44401521752577092016157863", + "33921161839714293865844174" + ], + "mAssetSupply": "85265180099008279934609943" + }, + { + "type": "mintMulti", + "inputQtys": [ + "1673227602616233651863552", + "490227088904861358489600", + "724751631377196105334784" + ], + "expectedQty": "2946334856204860303633233", + "reserves": [ + "8879855821534577211535502", + "44891748841481953374647463", + "34645913471091489971178958" + ], + "mAssetSupply": "88211514955213140238243176" + }, + { + "type": "redeemMasset", + "inputQty": "430264674984911658024960", + "expectedQtys": [ + "43299812665285519313896", + "218900436461962419795199", + "168939855901478165361123" + ], + "redemptionFee": "129079402495473497407", + "reserves": [ + "8836556008869291692221606", + "44672848405019990954852264", + "34476973615190011805817835" + ], + "mAssetSupply": "87781379359630724053715623" + }, + { + "type": "redeemMasset", + "inputQty": "2690445919109542576128", + "expectedQtys": [ + "270753819814769450123", + "1368784890349265143159", + "1056381274853728452191" + ], + "redemptionFee": "807133775732862772", + "reserves": [ + "8836285255049476922771483", + "44671479620129641689709105", + "34475917233915158077365644" + ], + "mAssetSupply": "87778689720845390244002267" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "134540444693164571230208", + "expectedQty": "133922502710605918728064", + "reserves": [ + "8836285255049476922771483", + "44671479620129641689709105", + "34610457678608322648595852" + ] + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "151972555017418803511296", + "expectedQty": "153024393215556625831298", + "swapFee": "91183533010451282106", + "reserves": [ + "8836285255049476922771483", + "44518455226914085063877807", + "34610457678608322648595852" + ], + "mAssetSupply": "87760730852071587810501141" + }, + { + "type": "mintMulti", + "inputQtys": [ + "2422813808289324954812416", + "2621759796239899444641792", + "2614271649522212124229632" + ], + "expectedQty": "7696120538202695799999931", + "reserves": [ + "11259099063338801877583899", + "47140215023153984508519599", + "37224729328130534772825484" + ], + "mAssetSupply": "95456851390274283610501072" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "11185711338977295859712", + "7421159649446415302656", + "13653899965552887070720" + ], + "expectedQty": "32419807308031545664558", + "swapFee": "19463562522332326794", + "reserves": [ + "11247913351999824581724187", + "47132793863504538093216943", + "37211075428164981885754764" + ], + "mAssetSupply": "95424431582966252064836514" + }, + { + "type": "redeemMasset", + "inputQty": "9164686754268", + "expectedQtys": [ + "1079940175905", + "4525336931658", + "3572728032831" + ], + "redemptionFee": "2749406026", + "reserves": [ + "11247913351998744641548282", + "47132793863500012756285285", + "37211075428161409157721933" + ], + "mAssetSupply": "95424431582957090127488272" + }, + { + "type": "mintMulti", + "inputQtys": [ + "70227914385033397272576", + "50949959614172562980864", + "10918638713655540056064" + ], + "expectedQty": "133336355853488810811253", + "reserves": [ + "11318141266383778038820858", + "47183743823114185319266149", + "37221994066875064697777997" + ], + "mAssetSupply": "95557767938810578938299525" + }, + { + "type": "mintMulti", + "inputQtys": [ + "101607662601557744", + "80057488148777664", + "50848385242174184" + ], + "expectedQty": "234130412354163207", + "reserves": [ + "11318141367991440640378602", + "47183743903171673468043813", + "37221994117723449939952181" + ], + "mAssetSupply": "95557768172940991292462732" + }, + { + "type": "mintMulti", + "inputQtys": [ + "5680513399017389948928", + "3120770628587296391168", + "691455539030422978560" + ], + "expectedQty": "9599099383908760633390", + "reserves": [ + "11323821881390458030327530", + "47186864673800260764434981", + "37222685573262480362930741" + ], + "mAssetSupply": "95567367272324900053096122" + }, + { + "type": "redeemMasset", + "inputQty": "14562994050097196", + "expectedQtys": [ + "1725058278398193", + "7188393847042681", + "5670462019355336" + ], + "redemptionFee": "4368898215029", + "reserves": [ + "11323821879665399751929337", + "47186864666611866917392300", + "37222685567592018343575405" + ], + "mAssetSupply": "95567367257766274901213955" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "339450894969471546425344", + "expectedQty": "338204817634274204025826", + "reserves": [ + "11323821879665399751929337", + "47186864666611866917392300", + "37562136462561489890000749" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "24611525753400132108288", + "4304020088667092549632", + "22407505141211842215936" + ], + "expectedQty": "51772199270419466335099", + "swapFee": "31081968743497778468", + "reserves": [ + "11299210353911999619821049", + "47182560646523199824842668", + "37539728957420278047784813" + ], + "mAssetSupply": "95853799876130129638904682" + }, + { + "type": "redeemMasset", + "inputQty": "4934304432129874853888", + "expectedQtys": [ + "581479478933384764123", + "2428106913682192195464", + "1931867922602553547938" + ], + "redemptionFee": "1480291329638962456", + "reserves": [ + "11298628874433066235056926", + "47180132539609517632647204", + "37537797089497675494236875" + ], + "mAssetSupply": "95848867051989329403013250" + }, + { + "type": "mintMulti", + "inputQtys": [ + "92543475468979601408", + "34581688746517168128", + "163004456876253839360" + ], + "expectedQty": "291418383265488212846", + "reserves": [ + "11298721417908535214658334", + "47180167121298264149815332", + "37537960093954551748076235" + ], + "mAssetSupply": "95849158470372594891226096" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "101519989056394519117824", + "4138889071140351770624", + "246470215234845556080640" + ], + "expectedQty": "353510863284705363477969", + "swapFee": "212233858285794694903", + "reserves": [ + "11197201428852140695540510", + "47176028232227123798044708", + "37291489878719706191995595" + ], + "mAssetSupply": "95495647607087889527748127" + }, + { + "type": "mintMulti", + "inputQtys": [ + "7365381176212740577951744", + "3845161180841929108094976", + "6712738927241069332529152" + ], + "expectedQty": "17998034999234560374838017", + "reserves": [ + "18562582605064881273492254", + "51021189413069052906139684", + "44004228805960775524524747" + ], + "mAssetSupply": "113493682606322449902586144" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "31147405393428725366784", + "expectedQty": "31201117197053823940302", + "swapFee": "18688443236057235220", + "reserves": [ + "18562582605064881273492254", + "51021189413069052906139684", + "43973027688763721700584445" + ], + "mAssetSupply": "113462553889372257234454580" + }, + { + "type": "redeemMasset", + "inputQty": "964417973647094542709555", + "expectedQtys": [ + "157732371268432441460936", + "433543831819144309530616", + "373653282884711826051612" + ], + "redemptionFee": "289325392094128362812", + "reserves": [ + "18404850233796448832031318", + "50587645581249908596609068", + "43599374405879009874532833" + ], + "mAssetSupply": "112498425241117256820107837" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "1088340201315024699916288", + "944023179474395532886016", + "724518458852426924425216" + ], + "expectedQty": "2763369060449786753335645", + "swapFee": "1659016846377698671204", + "reserves": [ + "17316510032481424132115030", + "49643622401775513063723052", + "42874855947026582950107617" + ], + "mAssetSupply": "109735056180667470066772192" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "257303837446311", + "outputIndex": 0, + "expectedQty": "253324879937408", + "swapFee": "153799105343", + "reserves": [ + "17316510032228099252177622", + "49643622402032816901169363", + "42874855947026582950107617" + ], + "mAssetSupply": "109735056180667623865877535", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemBassets", + "inputQtys": [ + "694154668824472695341056", + "663954301755763376259072", + "1090650976322718105862144" + ], + "expectedQty": "2451450652134200992664421", + "swapFee": "1471753443346528512706", + "reserves": [ + "16622355363403626556836566", + "48979668100277053524910291", + "41784204970703864844245473" + ], + "mAssetSupply": "107283605528533422873213114" + }, + { + "type": "redeemMasset", + "inputQty": "25643863670665052894003", + "expectedQtys": [ + "3972028478169367105385", + "11704035456606192721748", + "9984629040400796012743" + ], + "redemptionFee": "7693159101199515868", + "reserves": [ + "16618383334925457189731181", + "48967964064820447332188543", + "41774220341663464048232730" + ], + "mAssetSupply": "107257969358021859019834979" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "17489334763911991263232", + "1093517148572747563008", + "27078902213697926594560" + ], + "expectedQty": "45795174869545903553461", + "swapFee": "27493601082376968313", + "reserves": [ + "16600894000161545198467949", + "48966870547671874584625535", + "41747141439449766121638170" + ], + "mAssetSupply": "107212174183152313116281518" + }, + { + "type": "redeemMasset", + "inputQty": "90621096141367810614886", + "expectedQtys": [ + "14027696997252605852554", + "41376833256073413262770", + "35276187572088022192623" + ], + "redemptionFee": "27186328842410343184", + "reserves": [ + "16586866303164292592615395", + "48925493714415801171362765", + "41711865251877678099445547" + ], + "mAssetSupply": "107121580273339787716009816" + }, + { + "type": "redeemMasset", + "inputQty": "1991817768331295640780", + "expectedQtys": [ + "308323528599877893636", + "909447305163487633558", + "775357396863330509603" + ], + "redemptionFee": "597545330499388692", + "reserves": [ + "16586557979635692714721759", + "48924584267110637683729207", + "41711089894480814768935944" + ], + "mAssetSupply": "107119589053116786919757728" + }, + { + "type": "redeemMasset", + "inputQty": "57449064711160856576", + "expectedQtys": [ + "8892830774045833360", + "26230761627103789894", + "22363269358720697260" + ], + "redemptionFee": "17234719413348256", + "reserves": [ + "16586549086804918668888399", + "48924558036349010579939313", + "41711067531211456048238684" + ], + "mAssetSupply": "107119531621286795172249408" + }, + { + "type": "mintMulti", + "inputQtys": [ + "19504529349961079324672", + "59143460920570750697472", + "18667050428881338105856" + ], + "expectedQty": "97265109000973306478112", + "reserves": [ + "16606053616154879748213071", + "48983701497269581330636785", + "41729734581640337386344540" + ], + "mAssetSupply": "107216796730287768478727520" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "166745345926979481763840", + "expectedQty": "166320291978569240420716", + "reserves": [ + "16606053616154879748213071", + "48983701497269581330636785", + "41896479927567316868108380" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "22854657795028930265088", + "8998534700462763933696", + "2481528688683980423168" + ], + "expectedQty": "34564209484345458425895", + "swapFee": "20750976276373098914", + "reserves": [ + "16583198958359850817947983", + "48974702962569118566703089", + "41893998398878632887685212" + ], + "mAssetSupply": "107348552812781992260722341" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "1482214768891750179143680", + "expectedQty": "1498308484333432179306222", + "reserves": [ + "18065413727251600997091663", + "48974702962569118566703089", + "41893998398878632887685212" + ] + }, + { + "type": "redeemMasset", + "inputQty": "2197570268907081564160", + "expectedQtys": [ + "364623339843930004319", + "988481084999380511905", + "845567660184405892549" + ], + "redemptionFee": "659271080672124469", + "reserves": [ + "18065049103911757067087344", + "48973714481484119186191184", + "41893152831218448481792663" + ], + "mAssetSupply": "108844664386117598030588872" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "525262047786600461500416", + "expectedQty": "523382435084525844230734", + "reserves": [ + "18065049103911757067087344", + "49498976529270719647691600", + "41893152831218448481792663" + ] + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "108325484289364148092928", + "expectedQty": "109406275747768467330216", + "reserves": [ + "18173374588201121215180272", + "49498976529270719647691600", + "41893152831218448481792663" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "336688356846184075100160", + "296662885039644866510848", + "212320167098296081317888" + ], + "expectedQty": "847518566916924271936855", + "swapFee": "508816430008159458837", + "reserves": [ + "17836686231354937140080112", + "49202313644231074781180752", + "41680832664120152400474775" + ], + "mAssetSupply": "108629934530032968070212967" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "82712233090287241527296", + "expectedQty": "82846104374938743819776", + "swapFee": "49627339854172344916", + "reserves": [ + "17836686231354937140080112", + "49202313644231074781180752", + "41597986559745213656654999" + ], + "mAssetSupply": "108547271924282535001030587" + }, + { + "type": "redeemMasset", + "inputQty": "43808411881314216574976", + "expectedQtys": [ + "7196518752647779053925", + "19851522206626216451778", + "16783425265582878203221" + ], + "redemptionFee": "13142523564394264972", + "reserves": [ + "17829489712602289361026187", + "49182462122024448564728974", + "41581203134479630778451778" + ], + "mAssetSupply": "108503476654924785178720583" + }, + { + "type": "redeemMasset", + "inputQty": "54515390839293889740", + "expectedQtys": [ + "8955381298591189963", + "24703326264852597146", + "20885372207833674031" + ], + "redemptionFee": "16354617251788166", + "reserves": [ + "17829480757220990769836224", + "49182437418698183712131828", + "41581182249107422944777747" + ], + "mAssetSupply": "108503422155888563136619009" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "21301184074551243309056", + "expectedQty": "21517678897223147105335", + "reserves": [ + "17850781941295542013145280", + "49182437418698183712131828", + "41581182249107422944777747" + ] + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "338320697138169118720", + "expectedQty": "341754770107663722434", + "reserves": [ + "17851120261992680182264000", + "49182437418698183712131828", + "41581182249107422944777747" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "13564718845147086848", + "20232401894215892992", + "4082787937240507904" + ], + "expectedQty": "37934951169520171637", + "reserves": [ + "17851133826711525329350848", + "49182457651100077928024820", + "41581186331895360185285651" + ], + "mAssetSupply": "108525319524507063467618415" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "132441220255022432", + "outputIndex": 1, + "expectedQty": "134193699064929358", + "swapFee": "80271309701389", + "reserves": [ + "17851133959152745584373280", + "49182457516906378863095462", + "41581186331895360185285651" + ], + "mAssetSupply": "108525319524587334777319804", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemMasset", + "inputQty": "40219013922087179282022", + "expectedQtys": [ + "6613568353180743426430", + "18221337944679594160469", + "15405184827002830109839" + ], + "redemptionFee": "12065704176626153784", + "reserves": [ + "17844520390799564840946850", + "49164236178961699268934993", + "41565781147068357355175812" + ], + "mAssetSupply": "108485112576369424224191566" + }, + { + "type": "redeemMasset", + "inputQty": "41906636375002500300", + "expectedQtys": [ + "6891079046713401069", + "18985920067383296952", + "16051598880209712397" + ], + "redemptionFee": "12571990912500750", + "reserves": [ + "17844513499720518127545781", + "49164217193041631885638041", + "41565765095469477145463415" + ], + "mAssetSupply": "108485070682305040134192016" + }, + { + "type": "mintMulti", + "inputQtys": [ + "345665696643993703546880", + "134759552780262375948288", + "526995230233680836296704" + ], + "expectedQty": "1009238655734160996322545", + "reserves": [ + "18190179196364511831092661", + "49298976745821894261586329", + "42092760325703157981760119" + ], + "mAssetSupply": "109494309338039201130514561" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "2559616308846112704299008", + "outputIndex": 2, + "expectedQty": "2553354520487386685311004", + "swapFee": "1530066340594877912533", + "reserves": [ + "18190179196364511831092661", + "51858593054668006965885337", + "39539405805215771296449115" + ], + "mAssetSupply": "109495839404379796008427094", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemBassets", + "inputQtys": [ + "2601328456322350592", + "50781418766052212736", + "17839210075370000384" + ], + "expectedQty": "71014469848027510105", + "swapFee": "42634262466296283", + "reserves": [ + "18190176595036055508742069", + "51858542273249240913672601", + "39539387966005695926448731" + ], + "mAssetSupply": "109495768389909947980916989" + }, + { + "type": "mintMulti", + "inputQtys": [ + "133479499604758974431232", + "219901191340438872653824", + "5332682100908439371776" + ], + "expectedQty": "359147162338702801589594", + "reserves": [ + "18323656094640814483173301", + "52078443464589679786326425", + "39544720648106604365820507" + ], + "mAssetSupply": "109854915552248650782506583" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "32850460934383935160320", + "expectedQty": "33174202598012616495506", + "reserves": [ + "18356506555575198418333621", + "52078443464589679786326425", + "39544720648106604365820507" + ] + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "2544341987045511", + "expectedQty": "2540237298620615", + "reserves": [ + "18356506555575198418333621", + "52078443464589679786326425", + "39544720650650946352866018" + ] + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "14754537905043843072", + "expectedQty": "14769512246157284719", + "swapFee": "8852722743026305", + "reserves": [ + "18356506555575198418333621", + "52078443464589679786326425", + "39544705881138700195581299" + ], + "mAssetSupply": "109888075011701718396805937" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "478493571861029524078592", + "outputIndex": 2, + "expectedQty": "477015977168153644032915", + "swapFee": "285938704824510090017", + "reserves": [ + "18356506555575198418333621", + "52556937036450709310405017", + "39067689903970546551548384" + ], + "mAssetSupply": "109888360950406542906895954", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemMasset", + "inputQty": "13605393295400222326784", + "expectedQtys": [ + "2272056520012221429188", + "6505177393313542980081", + "4835560584438802570745" + ], + "redemptionFee": "4081617988620066698", + "reserves": [ + "18354234499055186196904433", + "52550431859057395767424936", + "39062854343386107748977639" + ], + "mAssetSupply": "109874759638729131304635868" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "8532314017180717940736", + "expectedQty": "8519468459979357364696", + "reserves": [ + "18354234499055186196904433", + "52550431859057395767424936", + "39071386657403288466918375" + ] + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "1505865206356533099626496", + "expectedQty": "1488891073110680507101525", + "swapFee": "903519123813919859775", + "reserves": [ + "16865343425944505689802908", + "52550431859057395767424936", + "39071386657403288466918375" + ], + "mAssetSupply": "108378317419956391482233843" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "514394058618525586554880", + "outputIndex": 2, + "expectedQty": "512659453327845604800728", + "swapFee": "307238248261625420220", + "reserves": [ + "16865343425944505689802908", + "53064825917675921353979816", + "38558727204075442862117647" + ], + "mAssetSupply": "108378624658204653107654063", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "456895309585624776835072", + "expectedQty": "456092895932908581038001", + "reserves": [ + "16865343425944505689802908", + "53064825917675921353979816", + "39015622513661067638952719" + ] + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "722456564424275840", + "expectedQty": "723323444682593144", + "swapFee": "433473938654565", + "reserves": [ + "16865343425944505689802908", + "53064825917675921353979816", + "39015621790337622956359575" + ], + "mAssetSupply": "108834716832114471203070789" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "53334048621787904737280", + "49132367661842955239424", + "43153062853883946074112" + ], + "expectedQty": "145955645787346701765061", + "swapFee": "87625963050238163957", + "reserves": [ + "16812009377322717785065628", + "53015693550014078398740392", + "38972468727483739010285463" + ], + "mAssetSupply": "108688761186327124501305728" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "1733840233743565778321408", + "expectedQty": "1752592271868662564636121", + "reserves": [ + "18545849611066283563387036", + "53015693550014078398740392", + "38972468727483739010285463" + ] + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "479138959979047419904", + "expectedQty": "477171175570577392413", + "reserves": [ + "18545849611066283563387036", + "53016172688974057446160296", + "38972468727483739010285463" + ] + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "2942993894465345566015488", + "outputIndex": 1, + "expectedQty": "2975402463671329902624190", + "swapFee": "1780423267769127792944", + "reserves": [ + "21488843505531629129402524", + "50040770225302727543536106", + "38972468727483739010285463" + ], + "mAssetSupply": "110443611052639126771127206", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "100008412588303680798720", + "expectedQty": "99900842774855436001917", + "reserves": [ + "21488843505531629129402524", + "50040770225302727543536106", + "39072477140072042691084183" + ] + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "2267940053886747484880896", + "outputIndex": 2, + "expectedQty": "2280959327462805834361750", + "swapFee": "1368616294722584683343", + "reserves": [ + "23756783559418376614283420", + "50040770225302727543536106", + "36791517812609236856722433" + ], + "mAssetSupply": "110544880511708704791812466", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mintMulti", + "inputQtys": [ + "141397422460723533971456", + "111013221303825821859840", + "192630027367917115408384" + ], + "expectedQty": "445324778355065732335000", + "reserves": [ + "23898180981879100148254876", + "50151783446606553365395946", + "36984147839977153972130817" + ], + "mAssetSupply": "110990205290063770524147466" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "5014444289231401517056", + "outputIndex": 0, + "expectedQty": "4985670283805453773525", + "swapFee": "3007496421686325632", + "reserves": [ + "23893195311595294694481351", + "50151783446606553365395946", + "36989162284266385373647873" + ], + "mAssetSupply": "110990208297560192210473098", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemBassets", + "inputQtys": [ + "14102859330551732502528", + "20082574415280511909888", + "18635308082941581590528" + ], + "expectedQty": "52823332525713223713076", + "swapFee": "31713027331827030446", + "reserves": [ + "23879092452264742961978823", + "50131700872191272853486058", + "36970526976183443792057345" + ], + "mAssetSupply": "110937384965034478986760022" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "894747941868243188187136", + "expectedQty": "894331856370400248030199", + "reserves": [ + "23879092452264742961978823", + "50131700872191272853486058", + "37865274918051686980244481" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "625497448733109387264", + "308798833784534728704", + "657255415661756022784" + ], + "expectedQty": "1593393228311261499402", + "swapFee": "956609902928514008", + "reserves": [ + "23878466954816009852591559", + "50131392073357488318757354", + "37864617662636025224221697" + ], + "mAssetSupply": "111830123428176567973290819" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "57175227199292596224", + "expectedQty": "57144402191253362129", + "reserves": [ + "23878466954816009852591559", + "50131392073357488318757354", + "37864674837863224516817921" + ] + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "4208738009589759688572928", + "outputIndex": 1, + "expectedQty": "4212393786630084591846533", + "swapFee": "2523058589761987668983", + "reserves": [ + "23878466954816009852591559", + "45918998286727403726910821", + "42073412847452984205390849" + ], + "mAssetSupply": "111832703631168521214321931", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "42134500739027509968896", + "outputIndex": 0, + "expectedQty": "41846230486264705683324", + "swapFee": "25245376137778189052", + "reserves": [ + "23836620724329745146908235", + "45918998286727403726910821", + "42115547348192011715359745" + ], + "mAssetSupply": "111832728876544658992510983", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "989113068345860428922880", + "expectedQty": "990525980657601801431751", + "swapFee": "593467841007516257353", + "reserves": [ + "23836620724329745146908235", + "44928472306069801925479070", + "42115547348192011715359745" + ], + "mAssetSupply": "110844209276039806079845456" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "3671642489945672646656", + "64058568085130243473408", + "6852903056359635812352" + ], + "expectedQty": "74464889007180203015239", + "swapFee": "44705756858423175714", + "reserves": [ + "23832949081839799474261579", + "44864413737984671682005662", + "42108694445135652079547393" + ], + "mAssetSupply": "110769744387032625876830217" + }, + { + "type": "mintMulti", + "inputQtys": [ + "912332396822658929393664", + "866701977554499879829504", + "505251349882258436653056" + ], + "expectedQty": "2286104787176620263845507", + "reserves": [ + "24745281478662458403655243", + "45731115715539171561835166", + "42613945795017910516200449" + ], + "mAssetSupply": "113055849174209246140675724" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "424979553798045433856", + "expectedQty": "422826713005212552567", + "swapFee": "254987732278827260", + "reserves": [ + "24744858651949453191102676", + "45731115715539171561835166", + "42613945795017910516200449" + ], + "mAssetSupply": "113055424449643180374069128" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "7304384230415478554624", + "expectedQty": "7313997825824127338438", + "swapFee": "4382630538249287132", + "reserves": [ + "24744858651949453191102676", + "45723801717713347434496728", + "42613945795017910516200449" + ], + "mAssetSupply": "113048124448043303144801636" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "472866321548923200", + "expectedQty": "473227240009372519", + "swapFee": "283719792929353", + "reserves": [ + "24744858651949453191102676", + "45723801717713347434496728", + "42613945321790670506827930" + ], + "mAssetSupply": "113048123975460701388807789" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "97608513761887376", + "expectedQty": "97475549774672852", + "reserves": [ + "24744858651949453191102676", + "45723801717713347434496728", + "42613945419399184268715306" + ] + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "1068207691045060227366912", + "expectedQty": "1072747035716650079951065", + "reserves": [ + "25813066342994513418469588", + "45723801717713347434496728", + "42613945419399184268715306" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "67306099874714336886784", + "92909881590532154589184", + "32282659291420906487808" + ], + "expectedQty": "192563965283913560183061", + "reserves": [ + "25880372442869227755356372", + "45816711599303879589085912", + "42646228078690605175203114" + ], + "mAssetSupply": "114313435073936814803614767" + }, + { + "type": "redeemMasset", + "inputQty": "270102186572630212162355", + "expectedQtys": [ + "61132342651213753554279", + "108224211951486296011380", + "100735174250038539704826" + ], + "redemptionFee": "81030655971789063648", + "reserves": [ + "25819240100218014001802093", + "45708487387352393293074532", + "42545492904440566635498288" + ], + "mAssetSupply": "114043413918020156380516060" + }, + { + "type": "mintMulti", + "inputQtys": [ + "70866754752872892596224", + "75808017779453824335872", + "150859079214873010241536" + ], + "expectedQty": "297498463431650979704284", + "reserves": [ + "25890106854970886894398317", + "45784295405131847117410404", + "42696351983655439645739824" + ], + "mAssetSupply": "114340912381451807360220344" + }, + { + "type": "redeemMasset", + "inputQty": "20647078753339157617049", + "expectedQtys": [ + "4673696383159947690500", + "8265006283641773166515", + "7707569032370410336583" + ], + "redemptionFee": "6194123626001747285", + "reserves": [ + "25885433158587726946707817", + "45776030398848205344243889", + "42688644414623069235403241" + ], + "mAssetSupply": "114320271496822094204350580" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "1024620891988494208", + "1448719707575254016", + "2360527031173020672" + ], + "expectedQty": "4832506460161040219", + "swapFee": "2901244622870346", + "reserves": [ + "25885432133966834958213609", + "45776028950128497768989873", + "42688642054096038062382569" + ], + "mAssetSupply": "114320266664315634043310361" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "27261737461193211904", + "expectedQty": "27213437429527419764", + "reserves": [ + "25885432133966834958213609", + "45776056211865958962201777", + "42688642054096038062382569" + ] + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "1061300679939782656", + "expectedQty": "1065551766976119410", + "reserves": [ + "25885433195267514897996265", + "45776056211865958962201777", + "42688642054096038062382569" + ] + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "72908499893889789853696", + "expectedQty": "72779012740784283060301", + "reserves": [ + "25885433195267514897996265", + "45848964711759848752055473", + "42688642054096038062382569" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "46958707745431945740288", + "40558752078660403986432", + "16883415786010758348800" + ], + "expectedQty": "104496719888595755070010", + "swapFee": "62735673337159748891", + "reserves": [ + "25838474487522082952255977", + "45808405959681188348069041", + "42671758638310027304033769" + ], + "mAssetSupply": "114288577236157019074839826" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "3141969643469961877782528", + "expectedQty": "3152774107565610385014061", + "reserves": [ + "28980444130992044830038505", + "45808405959681188348069041", + "42671758638310027304033769" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "2320946666272570872954880", + "487063325530314778869760", + "1041806937326275914629120" + ], + "expectedQty": "3855506334066164918759057", + "swapFee": "2314692616009304533975", + "reserves": [ + "26659497464719473957083625", + "45321342634150873569199281", + "41629951700983751389404649" + ], + "mAssetSupply": "113585845009656464541094830" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "254099435782038320316416", + "outputIndex": 1, + "expectedQty": "254103240143176416631799", + "swapFee": "152300972036456874906", + "reserves": [ + "26659497464719473957083625", + "45067239394007697152567482", + "41884051136765789709721065" + ], + "mAssetSupply": "113585997310628500997969736", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemBassets", + "inputQtys": [ + "11292016152434141184", + "1049240520215486529536", + "1716303601833165455360" + ], + "expectedQty": "2773316177687321650215", + "swapFee": "1664988699832292365", + "reserves": [ + "26659486172703321522942441", + "45066190153487481666037946", + "41882334833163956544265705" + ], + "mAssetSupply": "113583223994450813676319521" + }, + { + "type": "redeemMasset", + "inputQty": "6168840581931851776", + "expectedQtys": [ + "1447474168963516395", + "2446864343828290554", + "2273997233636044511" + ], + "redemptionFee": "1850652174579555", + "reserves": [ + "26659484725229152559426046", + "45066187706623137837747392", + "41882332559166722908221194" + ], + "mAssetSupply": "113583217827460883919047300" + }, + { + "type": "mintMulti", + "inputQtys": [ + "8197618000784347187118080", + "315157109575820498698240", + "7433874438215801258377216" + ], + "expectedQty": "15959886602339338504697936", + "reserves": [ + "34857102726013499746544126", + "45381344816198958336445632", + "49316206997382524166598410" + ], + "mAssetSupply": "129543104429800222423745236" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "10479959297862258", + "115075270760466592", + "126990621216416688" + ], + "expectedQty": "252362586194864458", + "swapFee": "151508456790993", + "reserves": [ + "34857102715533540448681868", + "45381344701123687575979040", + "49316206870391902950181722" + ], + "mAssetSupply": "129543104177437636228880778" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "417174482906789445632", + "outputIndex": 0, + "expectedQty": "415904818590934500651", + "swapFee": "250179078274004338", + "reserves": [ + "34856686810714949514181217", + "45381761875606594365424672", + "49316206870391902950181722" + ], + "mAssetSupply": "129543104427616714502885116", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "798210026646519364452352", + "outputIndex": 1, + "expectedQty": "797108753537998650420361", + "swapFee": "478355710959774795926", + "reserves": [ + "34856686810714949514181217", + "44584653122068595715004311", + "50114416897038422314634074" + ], + "mAssetSupply": "129543582783327674277681042", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "13625979728409287137951744", + "expectedQty": "13624346164424122883890670", + "swapFee": "8175587837045572282771", + "reserves": [ + "34856686810714949514181217", + "44584653122068595715004311", + "36490070732614299430743404" + ], + "mAssetSupply": "115925778642755432712012069" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "1661875094787271950336", + "1091270562715855093760", + "582093342318121189376" + ], + "expectedQty": "3335661394482730007952", + "swapFee": "2002598395727074249", + "reserves": [ + "34855024935620162242230881", + "44583561851505879859910551", + "36489488639271981309554028" + ], + "mAssetSupply": "115922442981360949982004117" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "1745753169493960349974528", + "174924828367830063775744", + "1544425566273396531003392" + ], + "expectedQty": "3467315345567389293862476", + "swapFee": "2081638190254586328114", + "reserves": [ + "33109271766126201892256353", + "44408637023138049796134807", + "34945063072998584778550636" + ], + "mAssetSupply": "112455127635793560688141641" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "15872147908106381164544", + "expectedQty": "15853939130511115743074", + "swapFee": "9523288744863828698", + "reserves": [ + "33109271766126201892256353", + "44408637023138049796134807", + "34929209133868073662807562" + ], + "mAssetSupply": "112439265011174199170805795" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "2418298409955877204262912", + "outputIndex": 2, + "expectedQty": "2416450807251591858968056", + "swapFee": "1452169579604592917594", + "reserves": [ + "35527570176082079096519265", + "44408637023138049796134807", + "32512758326616481803839506" + ], + "mAssetSupply": "112440717180753803763723389", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemBassets", + "inputQtys": [ + "18034845129385", + "23046546837872", + "9381807568379" + ], + "expectedQty": "50449599310068", + "swapFee": "30287932345", + "reserves": [ + "35527570176064044251389880", + "44408637023115003249296935", + "32512758326607099996271127" + ], + "mAssetSupply": "112440717180703354164413321" + }, + { + "type": "redeemMasset", + "inputQty": "37725655550663696003891", + "expectedQtys": [ + "11916490914926932998623", + "14895336692256311274685", + "10905276868026756433292" + ], + "redemptionFee": "11317696665199108801", + "reserves": [ + "35515653685149117318391257", + "44393741686422746938022250", + "32501853049739073239837835" + ], + "mAssetSupply": "112403002842849355667518231" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "1111613359773642522624", + "expectedQty": "1112050522089537013334", + "reserves": [ + "35516765298508890960913881", + "44393741686422746938022250", + "32501853049739073239837835" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "24224326559057500438528", + "71640534700778097475584", + "106212486687842856075264" + ], + "expectedQty": "202117337239398561073752", + "swapFee": "121343208268600296822", + "reserves": [ + "35492540971949833460475353", + "44322101151721968840546666", + "32395640563051230383762571" + ], + "mAssetSupply": "112201997556132046643457813" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "19725973646637071859712", + "expectedQty": "19741709162862084839237", + "swapFee": "11835584187982243115", + "reserves": [ + "35492540971949833460475353", + "44302359442559106755707429", + "32395640563051230383762571" + ], + "mAssetSupply": "112182283418069597553841216" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "200508678364337895636992", + "outputIndex": 1, + "expectedQty": "200906592562551598627373", + "swapFee": "120451350403395086175", + "reserves": [ + "35492540971949833460475353", + "44101452849996555157080056", + "32596149241415568279399563" + ], + "mAssetSupply": "112182403869420000948927391", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemBassets", + "inputQtys": [ + "644774233151706507509760", + "980157866094605037993984", + "74502518588485228560384" + ], + "expectedQty": "1698478531242969135379422", + "swapFee": "1019698938108646669229", + "reserves": [ + "34847766738798126952965593", + "43121294983901950119086072", + "32521646722827083050839179" + ], + "mAssetSupply": "110483925338177031813547969" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "17676620822514979831808", + "expectedQty": "17653739741848415798923", + "reserves": [ + "34847766738798126952965593", + "43138971604724465098917880", + "32521646722827083050839179" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "86427976459415868932096", + "24812158357368261836800", + "32936975423773188554752" + ], + "expectedQty": "144215849861064874495272", + "reserves": [ + "34934194715257542821897689", + "43163783763081833360754680", + "32554583698250856239393931" + ], + "mAssetSupply": "110645794927779945103842164" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "222813895155690227367936", + "expectedQty": "222584654480265929849509", + "swapFee": "133688337093414136420", + "reserves": [ + "34711610060777276892048180", + "43163783763081833360754680", + "32554583698250856239393931" + ], + "mAssetSupply": "110423114720961348290610648" + }, + { + "type": "mintMulti", + "inputQtys": [ + "53533694424423182893056", + "85373106836666104938496", + "57734836820381920133120" + ], + "expectedQty": "196614333326170246762638", + "reserves": [ + "34765143755201700074941236", + "43249156869918499465693176", + "32612318535071238159527051" + ], + "mAssetSupply": "110619729054287518537373286" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "6227879279940606099456", + "expectedQty": "6217660083359300122386", + "swapFee": "3736727567964363659", + "reserves": [ + "34765143755201700074941236", + "43249156869918499465693176", + "32606100874987878859404665" + ], + "mAssetSupply": "110613504911735145895637489" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "1877345020393520365568", + "outputIndex": 2, + "expectedQty": "1875105698497378510260", + "swapFee": "1126913647877040738", + "reserves": [ + "34767021100222093595306804", + "43249156869918499465693176", + "32604225769289381480894405" + ], + "mAssetSupply": "110613506038648793772678227", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemBassets", + "inputQtys": [ + "12787927802672224256", + "1547288090295555328", + "11769645747578574848" + ], + "expectedQty": "26120870530897978099", + "swapFee": "15681931477425242", + "reserves": [ + "34767008312294290923082548", + "43249155322630409170137848", + "32604213999643633902319557" + ], + "mAssetSupply": "110613479917778262874700128" + }, + { + "type": "redeemMasset", + "inputQty": "288723646575699148", + "expectedQtys": [ + "90721727683519344", + "112855211943399582", + "85078088895123140" + ], + "redemptionFee": "86617093972709", + "reserves": [ + "34767008221572563239563204", + "43249155209775197226738266", + "32604213914565545007196417" + ], + "mAssetSupply": "110613479629141233392973689" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "498782406559390760960", + "389003948285190799360", + "609803602253140328448" + ], + "expectedQty": "1497941950048368064110", + "swapFee": "899304752880749288", + "reserves": [ + "34766509439166003848802244", + "43248766205826912035938906", + "32603604110963291866867969" + ], + "mAssetSupply": "110611981687191185024909579" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "263053620293274048", + "expectedQty": "263240023708776897", + "swapFee": "157832172175964", + "reserves": [ + "34766509439166003848802244", + "43248765942586888327162009", + "32603604110963291866867969" + ], + "mAssetSupply": "110611981424295396903811495" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "1253353161648691075874816", + "expectedQty": "1251622688887203689932213", + "reserves": [ + "34766509439166003848802244", + "44502119104235579403036825", + "32603604110963291866867969" + ] + }, + { + "type": "redeemMasset", + "inputQty": "127096999262064135372", + "expectedQtys": [ + "39489103214995537983", + "50547173211856948428", + "37032394355594161774" + ], + "redemptionFee": "38129099778619240", + "reserves": [ + "34766469950062788853264261", + "44502068557062367546088397", + "32603567078568936272706195" + ], + "mAssetSupply": "111863477054312438308227576" + }, + { + "type": "mintMulti", + "inputQtys": [ + "499253069286363136", + "432708576229267392", + "185520751994102080" + ], + "expectedQty": "1117335080016493881", + "reserves": [ + "34766470449315858139627397", + "44502068989770943775355789", + "32603567264089688266808275" + ], + "mAssetSupply": "111863478171647518324721457" + }, + { + "type": "mintMulti", + "inputQtys": [ + "616973880693970842943488", + "76182480940870588694528", + "3066281979445175371431936" + ], + "expectedQty": "3762414037254811503690725", + "reserves": [ + "35383444330009828982570885", + "44578251470711814364050317", + "35669849243534863638240211" + ], + "mAssetSupply": "115625892208902329828412182" + }, + { + "type": "mintMulti", + "inputQtys": [ + "84632720321547832655872", + "162453361586903269244928", + "133962821567904273661952" + ], + "expectedQty": "380999502099696649844531", + "reserves": [ + "35468077050331376815226757", + "44740704832298717633295245", + "35803812065102767911902163" + ], + "mAssetSupply": "116006891711002026478256713" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "221305412614603784847360", + "49973932866603992481792", + "92189691038174388682752" + ], + "expectedQty": "363626612024999278913631", + "swapFee": "218306951385831065987", + "reserves": [ + "35246771637716773030379397", + "44690730899432113640813453", + "35711622374064593523219411" + ], + "mAssetSupply": "115643265098977027199343082" + }, + { + "type": "mintMulti", + "inputQtys": [ + "2099259720287434", + "35536235337708972", + "102571823141457" + ], + "expectedQty": "37696796402111198", + "reserves": [ + "35246771639816032750666831", + "44690730934968348978522425", + "35711622374167165346360868" + ], + "mAssetSupply": "115643265136673823601454280" + }, + { + "type": "mintMulti", + "inputQtys": [ + "1395313107909537538506752", + "600047767672060827926528", + "616500913525707751030784" + ], + "expectedQty": "2612483931420293638666177", + "reserves": [ + "36642084747725570289173583", + "45290778702640409806448953", + "36328123287692873097391652" + ], + "mAssetSupply": "118255749068094117240120457" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "819697296471881368469504", + "expectedQty": "818731650037137822807890", + "reserves": [ + "36642084747725570289173583", + "46110475999112291174918457", + "36328123287692873097391652" + ] + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "3707010329690601684992000", + "outputIndex": 2, + "expectedQty": "3694533738220908411979604", + "swapFee": "2221042229877169897822", + "reserves": [ + "36642084747725570289173583", + "49817486328802892859910457", + "32633589549471964685412048" + ], + "mAssetSupply": "119076701760361132232826169", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mintMulti", + "inputQtys": [ + "257695129877904544", + "458893096625164736", + "70584616435475424" + ], + "expectedQty": "786574654131163870", + "reserves": [ + "36642085005420700167078127", + "49817486787695989485075193", + "32633589620056581120887472" + ], + "mAssetSupply": "119076702546935786363990039" + }, + { + "type": "redeemMasset", + "inputQty": "2421685890818472778137", + "expectedQtys": [ + "744973598397656090860", + "1012843903120339559129", + "663476510255610253899" + ], + "redemptionFee": "726505767245541833", + "reserves": [ + "36641340031822302510987267", + "49816473943792869145516064", + "32632926143546325510633573" + ], + "mAssetSupply": "119074281587550735136753735" + }, + { + "type": "redeemMasset", + "inputQty": "73037762746569993696051", + "expectedQtys": [ + "22468316447859724779782", + "30547253455075954977279", + "20010373817552997642534" + ], + "redemptionFee": "21911328823970998108", + "reserves": [ + "36618871715374442786207485", + "49785926690337793190538785", + "32612915769728772512991039" + ], + "mAssetSupply": "119001265736132989114055792" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "199730582455320508891136", + "outputIndex": 1, + "expectedQty": "200328315127726255183897", + "swapFee": "120043963100641788897", + "reserves": [ + "36618871715374442786207485", + "49585598375210066935354888", + "32812646352184093021882175" + ], + "mAssetSupply": "119001385780096089755844689", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemMasset", + "inputQty": "2813115174141994572185", + "expectedQtys": [ + "865386558957187940849", + "1171819565749757830122", + "775436865933633004553" + ], + "redemptionFee": "843934552242598371", + "reserves": [ + "36618006328815485598266636", + "49584426555644317177524766", + "32811870915318159388877622" + ], + "mAssetSupply": "118998573508856500003870875" + }, + { + "type": "mintMulti", + "inputQtys": [ + "2211667335185934751629312", + "2115109171608236725370880", + "959966447139252984610816" + ], + "expectedQty": "5285637201330317918778107", + "reserves": [ + "38829673664001420349895948", + "51699535727252553902895646", + "33771837362457412373488438" + ], + "mAssetSupply": "124284210710186817922648982" + }, + { + "type": "mintMulti", + "inputQtys": [ + "996483538287114846208", + "1551801336458044768256", + "3395042399749096865792" + ], + "expectedQty": "5947102977967803972388", + "reserves": [ + "38830670147539707464742156", + "51701087528589011947663902", + "33775232404857161470354230" + ], + "mAssetSupply": "124290157813164785726621370" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "135780462086135709696", + "expectedQty": "135840972572082241840", + "reserves": [ + "38830805928001793600451852", + "51701087528589011947663902", + "33775232404857161470354230" + ] + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "3511381422426750976000", + "expectedQty": "3515796415812868802975", + "swapFee": "2106828853456050585", + "reserves": [ + "38830805928001793600451852", + "51697571732173199078860927", + "33775232404857161470354230" + ], + "mAssetSupply": "124286784379543784513937795" + }, + { + "type": "mintMulti", + "inputQtys": [ + "33809091546573965361152", + "17902673065449176956928", + "40945251961478328614912" + ], + "expectedQty": "92713673565761326507527", + "reserves": [ + "38864615019548367565813004", + "51715474405238648255817855", + "33816177656818639798969142" + ], + "mAssetSupply": "124379498053109545840445322" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "377187908766327464001536", + "outputIndex": 1, + "expectedQty": "378315190993363825220720", + "swapFee": "226716098729701593330", + "reserves": [ + "38864615019548367565813004", + "51337159214245284430597135", + "34193365565584967262970678" + ], + "mAssetSupply": "124379724769208275542038652", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mintMulti", + "inputQtys": [ + "828125809969666850816", + "562401665706681630720", + "59526380425560260608" + ], + "expectedQty": "1449528320369274675035", + "reserves": [ + "38865443145358337232663820", + "51337721615910991112227855", + "34193425091965392823231286" + ], + "mAssetSupply": "124381174297528644816713687" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "19438302545403487191040", + "13099033215284979695616", + "19757402010564717182976" + ], + "expectedQty": "52314009104288577500786", + "swapFee": "31407249812460622874", + "reserves": [ + "38846004842812933745472780", + "51324622582695706132532239", + "34173667689954828106048310" + ], + "mAssetSupply": "124328860288424356239212901" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "9808429519757859880960", + "expectedQty": "9790921211795527842508", + "reserves": [ + "38846004842812933745472780", + "51334431012215463992413199", + "34173667689954828106048310" + ] + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "18669383199880743223296", + "outputIndex": 0, + "expectedQty": "18681564185864100651816", + "swapFee": "11220799770574304531", + "reserves": [ + "38827323278627069644820964", + "51334431012215463992413199", + "34192337073154708849271606" + ], + "mAssetSupply": "124338662430435922341359940", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "285252324375205773312", + "outputIndex": 1, + "expectedQty": "285722102381315668266", + "swapFee": "171229957793890712", + "reserves": [ + "38827608530951444850594276", + "51334145290113082676744933", + "34192337073154708849271606" + ], + "mAssetSupply": "124338662601665880135250652", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemBassets", + "inputQtys": [ + "2051218806072002442428416", + "489334651068333250576384", + "2963848778269071843000320" + ], + "expectedQty": "5510171526430826657298152", + "swapFee": "3308087768519607759034", + "reserves": [ + "36776389724879442408165860", + "50844810639044749426168549", + "31228488294885637006271286" + ], + "mAssetSupply": "118828491075235053477952500" + }, + { + "type": "mintMulti", + "inputQtys": [ + "67347365994381557760", + "45298170976698474496", + "46595192445876420608" + ], + "expectedQty": "159280108373672669145", + "reserves": [ + "36776457072245436789723620", + "50844855937215726124643045", + "31228534890078082882691894" + ], + "mAssetSupply": "118828650355343427150621645" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "790267238995437329317888", + "outputIndex": 0, + "expectedQty": "790927626542341974283608", + "swapFee": "475147385300747807106", + "reserves": [ + "35985529445703094815440012", + "50844855937215726124643045", + "32018802129073520212009782" + ], + "mAssetSupply": "118829125502728727898428751", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemBassets", + "inputQtys": [ + "7553353603699160645632", + "6619067470713191399424", + "22833993930940853780480" + ], + "expectedQty": "37041537943558046638359", + "swapFee": "22238265725570170085", + "reserves": [ + "35977976092099395654794380", + "50838236869745012933243621", + "31995968135142579358229302" + ], + "mAssetSupply": "118792083964785169851790392" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "138165853482431209799680", + "expectedQty": "137816872767618568241378", + "swapFee": "82899512089458725879", + "reserves": [ + "35977976092099395654794380", + "50838236869745012933243621", + "31858151262374960789987924" + ], + "mAssetSupply": "118654001010814828100716591" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "1556888066542077980180480", + "expectedQty": "1554638362751375763287123", + "swapFee": "934132839925246788108", + "reserves": [ + "34423337729348019891507257", + "50838236869745012933243621", + "31858151262374960789987924" + ], + "mAssetSupply": "117098047077112675367324219" + }, + { + "type": "mintMulti", + "inputQtys": [ + "2520396599972132864", + "995094850994506240", + "1594432080673775360" + ], + "expectedQty": "5113086310141612202", + "reserves": [ + "34423340249744619863640121", + "50838237864839863927749861", + "31858152856807041463763284" + ], + "mAssetSupply": "117098052190198985508936421" + }, + { + "type": "mintMulti", + "inputQtys": [ + "156808926251567657517056", + "280377902763305670279168", + "222717183128389931761664" + ], + "expectedQty": "659835666222771325573156", + "reserves": [ + "34580149175996187521157177", + "51118615767603169598029029", + "32080870039935431395524948" + ], + "mAssetSupply": "117757887856421756834509577" + }, + { + "type": "redeemMasset", + "inputQty": "116457855883172485529", + "expectedQtys": [ + "34188129249198952076", + "50539106526356106636", + "31717183340359913690" + ], + "redemptionFee": "34937356764951745", + "reserves": [ + "34580114987866938322205101", + "51118565228496643241922393", + "32080838322752091035611258" + ], + "mAssetSupply": "117757771433503230426975793" + }, + { + "type": "mintMulti", + "inputQtys": [ + "14937165991128063803392", + "23527392553205957132288", + "36999217991296172949504" + ], + "expectedQty": "75492428979253325074721", + "reserves": [ + "34595052153858066386008493", + "51142092621049849199054681", + "32117837540743387208560762" + ], + "mAssetSupply": "117833263862482483752050514" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "133154860586361421824", + "outputIndex": 2, + "expectedQty": "132972521526972048659", + "swapFee": "79973555580089587", + "reserves": [ + "34595185308718652747430317", + "51142092621049849199054681", + "32117704568221860236512103" + ], + "mAssetSupply": "117833263942456039332140101", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mintMulti", + "inputQtys": [ + "18637137331898835533824", + "39601153122764261949440", + "12042637778260397654016" + ], + "expectedQty": "70233027683134199977992", + "reserves": [ + "34613822446050551582964141", + "51181693774172613461004121", + "32129747206000120634166119" + ], + "mAssetSupply": "117903496970139173532118093" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "162186149065793632", + "expectedQty": "162450669786451917", + "swapFee": "97311689439476", + "reserves": [ + "34613822446050551582964141", + "51181693611721943674552204", + "32129747206000120634166119" + ], + "mAssetSupply": "117903496808050336155763937" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "582200251746776759926784", + "expectedQty": "580774761372405458762472", + "swapFee": "349320151048066055956", + "reserves": [ + "34613822446050551582964141", + "51181693611721943674552204", + "31548972444627715175403647" + ], + "mAssetSupply": "117321645876454607461893109" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "15271164202145070186496", + "expectedQty": "15296830792190648708592", + "swapFee": "9162698521287042111", + "reserves": [ + "34613822446050551582964141", + "51166396780929753025843612", + "31548972444627715175403647" + ], + "mAssetSupply": "117306383874950983678748724" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "40013081682001885396992", + "expectedQty": "39921924446581837719721", + "reserves": [ + "34613822446050551582964141", + "51206409862611754911240604", + "31548972444627715175403647" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "1771519704933130043392", + "3582529970653333291008", + "2849371425926715277312" + ], + "expectedQty": "8202434519728524319250", + "swapFee": "4924415361053746839", + "reserves": [ + "34612050926345618452920749", + "51202827332641101577949596", + "31546123073201788460126335" + ], + "mAssetSupply": "117338103364877836992149195" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "362585089977774625521664", + "outputIndex": 0, + "expectedQty": "362677084143031694532619", + "swapFee": "217960453438264691533", + "reserves": [ + "34249373842202586758388130", + "51202827332641101577949596", + "31908708163179563085647999" + ], + "mAssetSupply": "117338321325331275256840728", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemBassets", + "inputQtys": [ + "11803318821448799223808", + "10788863080809216606208", + "13999044600308208500736" + ], + "expectedQty": "36604465871373981839447", + "swapFee": "21975865041849498802", + "reserves": [ + "34237570523381137959164322", + "51192038469560292361343388", + "31894709118579254877147263" + ], + "mAssetSupply": "117301716859459901275001281" + }, + { + "type": "mintMulti", + "inputQtys": [ + "9918697980645534072832", + "16745181186993671897088", + "39828399917771501076480" + ], + "expectedQty": "66536452036628710182050", + "reserves": [ + "34247489221361783493237154", + "51208783650747286033240476", + "31934537518497026378223743" + ], + "mAssetSupply": "117368253311496529985183331" + }, + { + "type": "redeemMasset", + "inputQty": "2140566519780219027456", + "expectedQtys": [ + "624419585683296211138", + "933667494976547660257", + "582248542583662577510" + ], + "redemptionFee": "642169955934065708", + "reserves": [ + "34246864801776100197026016", + "51207849983252309485580219", + "31933955269954442715646233" + ], + "mAssetSupply": "117366113387146705700221583" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "3967057544328721823956992", + "outputIndex": 0, + "expectedQty": "3962599676377437980788215", + "swapFee": "2383471374237244424356", + "reserves": [ + "30284265125398662216237801", + "51207849983252309485580219", + "35901012814283164539603225" + ], + "mAssetSupply": "117368496858520942944645939", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "107567931109200025878528", + "outputIndex": 0, + "expectedQty": "106997309584586520582943", + "swapFee": "64391694842596739810", + "reserves": [ + "30177267815814075695654858", + "51315417914361509511458747", + "35901012814283164539603225" + ], + "mAssetSupply": "117368561250215785541385749", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "137584363012917", + "expectedQty": "137169272847524", + "swapFee": "82550617807", + "reserves": [ + "30177267815676906422807334", + "51315417914361509511458747", + "35901012814283164539603225" + ], + "mAssetSupply": "117368561250078283728990639" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "3858443124939728879616", + "expectedQty": "3853868509732840186183", + "swapFee": "2315065874963837327", + "reserves": [ + "30177267815676906422807334", + "51315417914361509511458747", + "35897158945773431699417042" + ], + "mAssetSupply": "117364705122019218963948350" + }, + { + "type": "mintMulti", + "inputQtys": [ + "88375857524790712598528", + "2919456436885573425168384", + "2111053066805887056740352" + ], + "expectedQty": "5113169132088718616486110", + "reserves": [ + "30265643673201697135405862", + "54234874351247082936627131", + "38008212012579318756157394" + ], + "mAssetSupply": "122477874254107937580434460" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "5833973775255701815296", + "3088638917165726564352", + "2776759977055644286976" + ], + "expectedQty": "11709762668081739821682", + "swapFee": "7030075646236785964", + "reserves": [ + "30259809699426441433590566", + "54231785712329917210062779", + "38005435252602263111870418" + ], + "mAssetSupply": "122466164491439855840612778" + }, + { + "type": "mintMulti", + "inputQtys": [ + "102194210934514211880960", + "78252795619071055888384", + "70020301941399948886016" + ], + "expectedQty": "250598029970163467995057", + "reserves": [ + "30362003910360955645471526", + "54310038507948988265951163", + "38075455554543663060756434" + ], + "mAssetSupply": "122716762521410019308607835" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "182213814899303050641408", + "168460359767023763324928", + "148739335120596257210368" + ], + "expectedQty": "499585374014789035291528", + "swapFee": "299931183118744667975", + "reserves": [ + "30179790095461652594830118", + "54141578148181964502626235", + "37926716219423066803546066" + ], + "mAssetSupply": "122217177147395230273316307" + }, + { + "type": "redeemMasset", + "inputQty": "45763946226847591484620", + "expectedQtys": [ + "11297364080940579674106", + "20267109821571870252175", + "14197312843132364579084" + ], + "redemptionFee": "13729183868054277445", + "reserves": [ + "30168492731380712015156012", + "54121311038360392632374060", + "37912518906579934438966982" + ], + "mAssetSupply": "122171426930352250736109132" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "2400932055034783858688", + "outputIndex": 1, + "expectedQty": "2412434699785210945852", + "swapFee": "1444737911584569758", + "reserves": [ + "30170893663435746799014700", + "54118898603660607421428208", + "37912518906579934438966982" + ], + "mAssetSupply": "122171428375090162320678890", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemBassets", + "inputQtys": [ + "155365876378325", + "160011565050502", + "102049907811312" + ], + "expectedQty": "417523719689571", + "swapFee": "250664630592", + "reserves": [ + "30170893663280380922636375", + "54118898603500595856377706", + "37912518906477884531155670" + ], + "mAssetSupply": "122171428374672638600989319" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "70340949484178751488", + "expectedQty": "70370315210860858129", + "reserves": [ + "30170893663280380922636375", + "54118898603500595856377706", + "37912589247427368709907158" + ] + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "78204474119158180610048", + "outputIndex": 1, + "expectedQty": "78383330986296747994938", + "swapFee": "46941958642226077880", + "reserves": [ + "30170893663280380922636375", + "54040515272514299108382768", + "37990793721546526890517206" + ], + "mAssetSupply": "122171545686946491687925328", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mintMulti", + "inputQtys": [ + "25235664458068030128128", + "113339619503359312003072", + "88412863989274462126080" + ], + "expectedQty": "226816752233614520701670", + "reserves": [ + "30196129327738448952764503", + "54153854892017658420385840", + "38079206585535801352643286" + ], + "mAssetSupply": "122398362439180106208626998" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "2176878252135832354816", + "2432712201117710680064", + "671963833594428915712" + ], + "expectedQty": "5282150148739946416868", + "swapFee": "3171192804926924004", + "reserves": [ + "30193952449486313120409687", + "54151422179816540709705776", + "38078534621702206923727574" + ], + "mAssetSupply": "122393080289031366262210130" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "107450123413188704", + "937577728805380096", + "965748082866994688" + ], + "expectedQty": "2009152959581268315", + "swapFee": "1206215505051792", + "reserves": [ + "30193952342036189707220983", + "54151421242238811904325680", + "38078533655954124056732886" + ], + "mAssetSupply": "122393078279878406680941815" + }, + { + "type": "redeemMasset", + "inputQty": "10346770036807273676", + "expectedQtys": [ + "2551746902768246307", + "4576437025205393010", + "3218087490429705241" + ], + "redemptionFee": "3104031011042182", + "reserves": [ + "30193949790289286938974676", + "54151416665801786698932670", + "38078530437866633627027645" + ], + "mAssetSupply": "122393067936212400884710321" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "1563415576250362424721408", + "outputIndex": 1, + "expectedQty": "1570193351662929402267678", + "swapFee": "940567756994033650563", + "reserves": [ + "31757365366539649363696084", + "52581223314138857296664992", + "38078530437866633627027645" + ], + "mAssetSupply": "122394008503969394918360884", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemBassets", + "inputQtys": [ + "191081334717944602558464", + "173873486968488332361728", + "54893037748415084101632" + ], + "expectedQty": "419941948473175702168329", + "swapFee": "252116438947273785572", + "reserves": [ + "31566284031821704761137620", + "52407349827170368964303264", + "38023637400118218542926013" + ], + "mAssetSupply": "121974066555496219216192555" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "449917625109447", + "expectedQty": "450107854973097", + "reserves": [ + "31566284031821704761137620", + "52407349827170368964303264", + "38023637400568136168035460" + ] + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "79435281988979232079872", + "expectedQty": "79353543450167109335948", + "swapFee": "47661169193387539247", + "reserves": [ + "31566284031821704761137620", + "52407349827170368964303264", + "37944283857117969058699512" + ], + "mAssetSupply": "121894678935126541226625027" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "140187662618075", + "expectedQty": "139775712308907", + "swapFee": "84112597570", + "reserves": [ + "31566284031681929048828713", + "52407349827170368964303264", + "37944283857117969058699512" + ], + "mAssetSupply": "121894678934986437676604522" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "83100377566252023939072", + "expectedQty": "83136037965658970588008", + "reserves": [ + "31566284031681929048828713", + "52407349827170368964303264", + "38027384234684221082638584" + ] + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "70619315736094189813760", + "expectedQty": "70648714840408834751799", + "reserves": [ + "31566284031681929048828713", + "52407349827170368964303264", + "38098003550420315272452344" + ] + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "1878037831696110657208320", + "expectedQty": "1873800050488754635729716", + "reserves": [ + "31566284031681929048828713", + "54285387658866479621511584", + "38098003550420315272452344" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "866832181164712320", + "4456795404481521664", + "4599460760324767232" + ], + "expectedQty": "9917253726308299990", + "swapFee": "5953924590539303", + "reserves": [ + "31566283164849747884116393", + "54285383202071075139989920", + "38097998950959554947685112" + ], + "mAssetSupply": "123922253821027533809374055" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "1479013641871319688544256", + "expectedQty": "1482470260288126410070404", + "reserves": [ + "33045296806721067572660649", + "54285383202071075139989920", + "38097998950959554947685112" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "8991741604290801696768", + "74029335831016554496", + "20551039994451292323840" + ], + "expectedQty": "29649745624982100890752", + "swapFee": "17800527691604223068", + "reserves": [ + "33036305065116776770963881", + "54285309172735244123435424", + "38077447910965103655361272" + ], + "mAssetSupply": "125375074335690678118553707" + }, + { + "type": "redeemMasset", + "inputQty": "118888988141187743350784", + "expectedQtys": [ + "31317824583998990759496", + "51461499305351091214158", + "36096737571936714305350" + ], + "redemptionFee": "35666696442356323005", + "reserves": [ + "33004987240532777780204385", + "54233847673429893032221266", + "38041351173393166941055922" + ], + "mAssetSupply": "125256221014245932731525928" + }, + { + "type": "mintMulti", + "inputQtys": [ + "346654137320589688832", + "1121875060883624427520", + "1102903311329197686784" + ], + "expectedQty": "2570426400229064191398", + "reserves": [ + "33005333894670098369893217", + "54234969548490776656648786", + "38042454076704496138742706" + ], + "mAssetSupply": "125258791440646161795717326" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "1356185366684218043662336", + "expectedQty": "1358297611427728394670949", + "swapFee": "813711220010530826197", + "reserves": [ + "33005333894670098369893217", + "52876671937063048261977837", + "38042454076704496138742706" + ], + "mAssetSupply": "123903419785181954282881187" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "8101402030395676958916608", + "expectedQty": "8070349448141062185904432", + "swapFee": "4860841218237406175349", + "reserves": [ + "24934984446529036183988785", + "52876671937063048261977837", + "38042454076704496138742706" + ], + "mAssetSupply": "115806878596004514730139928" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "637932153890703356723200", + "expectedQty": "639418393415492268209670", + "swapFee": "382759292334422014033", + "reserves": [ + "24934984446529036183988785", + "52237253543647555993768167", + "38042454076704496138742706" + ], + "mAssetSupply": "115169329201406145795430761" + }, + { + "type": "redeemMasset", + "inputQty": "28890111140001078889676", + "expectedQtys": [ + "6253039455786368623799", + "13099731751218844827933", + "9540048715357725714711" + ], + "redemptionFee": "8667033342000323666", + "reserves": [ + "24928731407073249815364986", + "52224153811896337148940234", + "38032914027989138413027995" + ], + "mAssetSupply": "115140447757299486716864751" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "751122622843126921822208", + "expectedQty": "752814277742090296783858", + "swapFee": "450673573705876153093", + "reserves": [ + "24928731407073249815364986", + "51471339534154246852156376", + "38032914027989138413027995" + ], + "mAssetSupply": "114389775808030065671195636" + }, + { + "type": "redeemMasset", + "inputQty": "584718659619354419", + "expectedQtys": [ + "127388321404573734", + "263023714950867949", + "194352010819744365" + ], + "redemptionFee": "175415597885806", + "reserves": [ + "24928731279684928410791252", + "51471339271130531901288427", + "38032913833637127593283630" + ], + "mAssetSupply": "114389775223486821649727023" + }, + { + "type": "mintMulti", + "inputQtys": [ + "31717403929628364", + "8353274844762554", + "12553480492693858" + ], + "expectedQty": "52741930037956985", + "reserves": [ + "24928731311402332340419616", + "51471339279483806746050981", + "38032913846190608085977488" + ], + "mAssetSupply": "114389775276228751687684008" + }, + { + "type": "mintMulti", + "inputQtys": [ + "56787657745644937805824", + "69447876661787620278272", + "68994892777719836180480" + ], + "expectedQty": "195272109148001150650686", + "reserves": [ + "24985518969147977278225440", + "51540787156145594366329253", + "38101908738968327922157968" + ], + "mAssetSupply": "114585047385376752838334694" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "19032952568475164672", + "79923028510258266112", + "12541270560758677504" + ], + "expectedQty": "111356303681282019356", + "swapFee": "66853894545496509", + "reserves": [ + "24985499936195408803060768", + "51540707233117084108063141", + "38101896197697767163480464" + ], + "mAssetSupply": "114584936029073071556315338" + }, + { + "type": "redeemMasset", + "inputQty": "498757645143647065630310", + "expectedQtys": [ + "108722586318147374118368", + "224275640085679711133521", + "165797630978685108670375" + ], + "redemptionFee": "149627293543094119689", + "reserves": [ + "24876777349877261428942400", + "51316431593031404396929620", + "37936098566719082054810089" + ], + "mAssetSupply": "114086328011222967584804717" + }, + { + "type": "redeemMasset", + "inputQty": "95377492272114318075494", + "expectedQtys": [ + "20791034959227165133181", + "42888261137199482854471", + "31705503507319667996000" + ], + "redemptionFee": "28613247681634295422", + "reserves": [ + "24855986314918034263809219", + "51273543331894204914075149", + "37904393063211762386814089" + ], + "mAssetSupply": "113990979132198534901024645" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "6501762774429996154880", + "9532674860447430606848", + "12061032729720593055744" + ], + "expectedQty": "28094348178048758295577", + "swapFee": "16866728944195772440", + "reserves": [ + "24849484552143604267654339", + "51264010657033757483468301", + "37892332030482041793758345" + ], + "mAssetSupply": "113962884784020486142729068" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "37276009148616691154944", + "expectedQty": "37358175324382808060096", + "swapFee": "22365605489170014692", + "reserves": [ + "24849484552143604267654339", + "51226652481709374675408205", + "37892332030482041793758345" + ], + "mAssetSupply": "113925631140477358621588816" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "2813946443458091696521216", + "expectedQty": "2805638386934023674348501", + "reserves": [ + "24849484552143604267654339", + "54040598925167466371929421", + "37892332030482041793758345" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "147351150279362560000", + "94733993932273876992", + "90050450048141541376" + ], + "expectedQty": "332557675489782942989", + "swapFee": "199654397932629343", + "reserves": [ + "24849337200993324905094339", + "54040504191173534098052429", + "37892241980031993652216969" + ], + "mAssetSupply": "116730936969735892512994328" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "7663158956628465982373888", + "expectedQty": "7657226081355001620167767", + "reserves": [ + "24849337200993324905094339", + "54040504191173534098052429", + "45555400936660459634590857" + ] + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "236642701575366213632", + "expectedQty": "236812788921168111338", + "swapFee": "141985620945219728", + "reserves": [ + "24849337200993324905094339", + "54040504191173534098052429", + "45555164123871538466479519" + ], + "mAssetSupply": "124387926550374939712168191" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "2487945037802315448320", + "outputIndex": 0, + "expectedQty": "2468430970480118468016", + "swapFee": "1490799628349721633", + "reserves": [ + "24846868770022844786626323", + "54040504191173534098052429", + "45557652068909340781927839" + ], + "mAssetSupply": "124387928041174568061889824", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mintMulti", + "inputQtys": [ + "3587309670884770316288", + "2075052264822016311296", + "1757561373111525572608" + ], + "expectedQty": "7433448604909123593227", + "reserves": [ + "24850456079693729556942611", + "54042579243438356114363725", + "45559409630282452307500447" + ], + "mAssetSupply": "124395361489779477185483051" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "20671223518893707264", + "4940813842533518336", + "18209309227005220864" + ], + "expectedQty": "43907503362078144916", + "swapFee": "26360318208171790", + "reserves": [ + "24850435408470210663235347", + "54042574302624513580845389", + "45559391420973225302279583" + ], + "mAssetSupply": "124395317582276115107338135" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "24573408863677835116544", + "24285577644439530110976", + "26030144459465088303104" + ], + "expectedQty": "74936263692698725947190", + "swapFee": "44988751466499135049", + "reserves": [ + "24825861999606532828118803", + "54018288724980074050734413", + "45533361276513760213976479" + ], + "mAssetSupply": "124320381318583416381390945" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "485026512088364608", + "6114223243621638144", + "3403212273645373440" + ], + "expectedQty": "9984403494606447184", + "swapFee": "5994238639947837", + "reserves": [ + "24825861514580020739754195", + "54018282610756830429096269", + "45533357873301486568603039" + ], + "mAssetSupply": "124320371334179921774943761" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "449904017818940927377408", + "expectedQty": "448681311537574452696890", + "reserves": [ + "24825861514580020739754195", + "54468186628575771356473677", + "45533357873301486568603039" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "326041836938294410084352", + "5191859054738166687727616", + "2370825945758721151860736" + ], + "expectedQty": "7872507955445982768500825", + "reserves": [ + "25151903351518315149838547", + "59660045683313938044201293", + "47904183819060207720463775" + ], + "mAssetSupply": "132641560601163478996141476" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "553994421957049712640", + "expectedQty": "555396713009315821207", + "swapFee": "332396653174229827", + "reserves": [ + "25151903351518315149838547", + "59659490286600928728380086", + "47904183819060207720463775" + ], + "mAssetSupply": "132641006939138175120658663" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "3243906939247236019650560", + "outputIndex": 1, + "expectedQty": "3269785657905134347911758", + "swapFee": "1958108356024516920513", + "reserves": [ + "28395810290765551169489107", + "56389704628695794380468328", + "47904183819060207720463775" + ], + "mAssetSupply": "132642965047494199637579176", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemBassets", + "inputQtys": [ + "40087658714073505792", + "198418399475376652288", + "473195809893139873792" + ], + "expectedQty": "710923850145243808821", + "swapFee": "426810396324941250", + "reserves": [ + "28395770203106837095983315", + "56389506210296319003816040", + "47903710623250314580589983" + ], + "mAssetSupply": "132642254123644054393770355" + }, + { + "type": "redeemMasset", + "inputQty": "16718434611202223400550", + "expectedQtys": [ + "3577973027243328003213", + "7105288245287158716453", + "6036046329749009105616" + ], + "redemptionFee": "5015530383360667020", + "reserves": [ + "28392192230079593767980102", + "56382400922051031845099587", + "47897674576920565571484367" + ], + "mAssetSupply": "132625540704563235531036825" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "125176460525461238185984", + "outputIndex": 0, + "expectedQty": "124200491995027561465568", + "swapFee": "74928395465252807613", + "reserves": [ + "28267991738084566206514534", + "56507577382576493083285571", + "47897674576920565571484367" + ], + "mAssetSupply": "132625615632958700783844438", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "494913503799120970645504", + "expectedQty": "492152021370212234625245", + "swapFee": "296948102279472582387", + "reserves": [ + "27775839716714353971889289", + "56507577382576493083285571", + "47897674576920565571484367" + ], + "mAssetSupply": "132130999077261859285781321" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "361250095794390720", + "expectedQty": "359195239108471804", + "swapFee": "216750057476634", + "reserves": [ + "27775839357519114863417485", + "56507577382576493083285571", + "47897674576920565571484367" + ], + "mAssetSupply": "132130998716228513548867235" + }, + { + "type": "redeemMasset", + "inputQty": "203251264774715", + "expectedQtys": [ + "42713525910539", + "86897027290702", + "73656768307239" + ], + "redemptionFee": "60975379432", + "reserves": [ + "27775839357476401337506946", + "56507577382489596055994869", + "47897674576846908803177128" + ], + "mAssetSupply": "132130998716025323259471952" + }, + { + "type": "redeemMasset", + "inputQty": "2406801406977606451", + "expectedQtys": [ + "505792543886062540", + "1028991813542973573", + "872207185484359132" + ], + "redemptionFee": "722040422093281", + "reserves": [ + "27775838851683857451444406", + "56507576353497782513021296", + "47897673704639723318817996" + ], + "mAssetSupply": "132130996309945956703958782" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "18356112565853201891328", + "expectedQty": "18311233560842317033576", + "reserves": [ + "27775838851683857451444406", + "56525932466063635714912624", + "47897673704639723318817996" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "1621275912847872", + "6340869875109646", + "5429075710732882" + ], + "expectedQty": "13377882662732244", + "reserves": [ + "27775838853305133364292278", + "56525932472404505590022270", + "47897673710068799029550878" + ], + "mAssetSupply": "132149307556884681683724602" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "1600679267826390676799488", + "expectedQty": "1603511805808079686315058", + "swapFee": "960407560695834406079", + "reserves": [ + "27775838853305133364292278", + "54922420666596425903707212", + "47897673710068799029550878" + ], + "mAssetSupply": "130549588696618986841331193" + }, + { + "type": "redeemMasset", + "inputQty": "212372309854854316032", + "expectedQtys": [ + "45170953570907060098", + "89318566651946274741", + "77894446563385137760" + ], + "redemptionFee": "63711692956456294", + "reserves": [ + "27775793682351562457232180", + "54922331348029773957432471", + "47897595815622235644413118" + ], + "mAssetSupply": "130549376388020824943471455" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "1118732315441502464", + "outputIndex": 2, + "expectedQty": "1124918538057964814", + "swapFee": "674543939453691", + "reserves": [ + "27775794801083877898734644", + "54922331348029773957432471", + "47897594690703697586448304" + ], + "mAssetSupply": "130549376388695368882925146", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mintMulti", + "inputQtys": [ + "458856667074968086904832", + "1056772983980757060943872", + "100824867782310162857984" + ], + "expectedQty": "1616143885717969963310004", + "reserves": [ + "28234651468158845985639476", + "55979104332010531018376343", + "47998419558486007749306288" + ], + "mAssetSupply": "132165520274413338846235150" + }, + { + "type": "mintMulti", + "inputQtys": [ + "882279318533132414615552", + "21833926821240360665088", + "119920408054368898646016" + ], + "expectedQty": "1027989726377499714760697", + "reserves": [ + "29116930786691978400255028", + "56000938258831771379041431", + "48118339966540376647952304" + ], + "mAssetSupply": "133193510000790838560995847" + }, + { + "type": "mintMulti", + "inputQtys": [ + "95381362665589858893824", + "268830161223363019669504", + "207848047579699167100928" + ], + "expectedQty": "571677709380572740543910", + "reserves": [ + "29212312149357568259148852", + "56269768420055134398710935", + "48326188014120075815053232" + ], + "mAssetSupply": "133765187710171411301539757" + }, + { + "type": "mintMulti", + "inputQtys": [ + "732068497965768576", + "2767312144490686464", + "2859414171201776128" + ], + "expectedQty": "6352987021260977881", + "reserves": [ + "29212312881426066224917428", + "56269771187367278889397399", + "48326190873534247016829360" + ], + "mAssetSupply": "133765194063158432562517638" + }, + { + "type": "mintMulti", + "inputQtys": [ + "678308253305778045190144", + "7881466994460285992960", + "844970792704619206148096" + ], + "expectedQty": "1533274155220873405198392", + "reserves": [ + "29890621134731844270107572", + "56277652654361739175390359", + "49171161666238866222977456" + ], + "mAssetSupply": "135298468218379305967716030" + }, + { + "type": "redeemMasset", + "inputQty": "376000512489742768537", + "expectedQtys": [ + "83042456774171065460", + "156351201831375884564", + "136607869364741139690" + ], + "redemptionFee": "112800153746922830", + "reserves": [ + "29890538092275070099042112", + "56277496303159907799505795", + "49171025058369501481837766" + ], + "mAssetSupply": "135298092330666969971870323" + }, + { + "type": "redeemMasset", + "inputQty": "4570166291865208566579", + "expectedQtys": [ + "1009354573029587110774", + "1900398985019630166781", + "1660425076658099511856" + ], + "redemptionFee": "1371049887559562569", + "reserves": [ + "29889528737702040511931338", + "56275595904174888169339014", + "49169364633292843382325910" + ], + "mAssetSupply": "135293523535424992322866313" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "9532854877607564410880", + "114433924253605624283136", + "106622003003834977222656" + ], + "expectedQty": "230275661942524626623524", + "swapFee": "138248346173218707198", + "reserves": [ + "29879995882824432947520458", + "56161161979921282545055878", + "49062742630289008405103254" + ], + "mAssetSupply": "135063247873482467696242789" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "1832095085114312483667968", + "expectedQty": "1822429879817735999765373", + "swapFee": "1099257051068587490200", + "reserves": [ + "28057566003006696947755085", + "56161161979921282545055878", + "49062742630289008405103254" + ], + "mAssetSupply": "133232252045419223800065021" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "3803885437713411676831744", + "expectedQty": "3794340392303037239564837", + "reserves": [ + "28057566003006696947755085", + "59965047417634694221887622", + "49062742630289008405103254" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "433953684561876307935232", + "205910272347015129071616", + "421819957816654609514496" + ], + "expectedQty": "1063062950384396930929465", + "reserves": [ + "28491519687568573255690317", + "60170957689981709350959238", + "49484562588105663014617750" + ], + "mAssetSupply": "138089655388106657970559323" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "1091632091017015094935552", + "expectedQty": "1092077214728839200230935", + "swapFee": "654979254610209056961", + "reserves": [ + "28491519687568573255690317", + "60170957689981709350959238", + "48392485373376823814386815" + ], + "mAssetSupply": "136998678276344253084680732" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "398487220400171522195456", + "outputIndex": 2, + "expectedQty": "397525980795609773159231", + "swapFee": "238444651852202104021", + "reserves": [ + "28491519687568573255690317", + "60569444910381880873154694", + "47994959392581214041227584" + ], + "mAssetSupply": "136998916720996105286784753", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "275226896829250929688576", + "expectedQty": "276670371889381513449579", + "reserves": [ + "28766746584397824185378893", + "60569444910381880873154694", + "47994959392581214041227584" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "28033882813038520696832", + "26049065174904715870208", + "29949858822117878923264" + ], + "expectedQty": "84082302846867029898784", + "swapFee": "50479669509826113607", + "reserves": [ + "28738712701584785664682061", + "60543395845206976157284486", + "47965009533759096162304320" + ], + "mAssetSupply": "137191504790038619770335548" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "857418125829317184192512", + "327438011505401887981568", + "413069354202536219770880" + ], + "expectedQty": "1601239607158448643409270", + "swapFee": "961320556629046614013", + "reserves": [ + "27881294575755468480489549", + "60215957833701574269302918", + "47551940179556559942533440" + ], + "mAssetSupply": "135590265182880171126926278" + }, + { + "type": "redeemMasset", + "inputQty": "5017510741629432600985", + "expectedQtys": [ + "1031436338200614378680", + "2227619914867344537012", + "1759129186769747291459" + ], + "redemptionFee": "1505253222488829780", + "reserves": [ + "27880263139417267866110869", + "60213730213786706924765906", + "47550181050369790195241981" + ], + "mAssetSupply": "135585249177391764183155073" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "191763075852048990732288", + "expectedQty": "191818840038828032381030", + "swapFee": "115057845511229394439", + "reserves": [ + "27880263139417267866110869", + "60213730213786706924765906", + "47358362210330962162860951" + ], + "mAssetSupply": "135393601159385226421817224" + }, + { + "type": "mintMulti", + "inputQtys": [ + "4001961228905896960", + "3396915823653457920", + "3370403253717046272" + ], + "expectedQty": "10778645963627755638", + "reserves": [ + "27880267141378496772007829", + "60213733610702530578223826", + "47358365580734215879907223" + ], + "mAssetSupply": "135393611938031190049572862" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "291675106737497445498880", + "84770940225358978351104", + "258989268174999610458112" + ], + "expectedQty": "636577115521805699550753", + "swapFee": "382175574657878146618", + "reserves": [ + "27588592034640999326508949", + "60128962670477171599872722", + "47099376312559216269449111" + ], + "mAssetSupply": "134757034822509384350022109" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "1351142522416798367744", + "19057299661170818416640", + "21246965993103305998336" + ], + "expectedQty": "41589676206916757986991", + "swapFee": "24968786996347863510", + "reserves": [ + "27587240892118582528141205", + "60109905370816000781456082", + "47078129346566112963450775" + ], + "mAssetSupply": "134715445146302467592035118" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "102045925571859601948672", + "expectedQty": "102611516310076085270037", + "reserves": [ + "27689286817690442130089877", + "60109905370816000781456082", + "47078129346566112963450775" + ] + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "88916625639950354743296", + "expectedQty": "89116593614020887899288", + "swapFee": "53349975383970212845", + "reserves": [ + "27689286817690442130089877", + "60020788777201979893556794", + "47078129346566112963450775" + ], + "mAssetSupply": "134729193386947977292774704" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "5797945616080576708608", + "expectedQty": "5762727496475218316961", + "swapFee": "3478767369648346025", + "reserves": [ + "27683524090193966911772916", + "60020788777201979893556794", + "47078129346566112963450775" + ], + "mAssetSupply": "134723398920099266364412121" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "66959910500131351298048", + "expectedQty": "66552026461817893921436", + "swapFee": "40175946300078810778", + "reserves": [ + "27616972063732149017851480", + "60020788777201979893556794", + "47078129346566112963450775" + ], + "mAssetSupply": "134656479185545435091924851" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "94152059943720566784", + "158031291594364977152", + "158426337398791110656" + ], + "expectedQty": "410541649580607359576", + "swapFee": "246472873472447884", + "reserves": [ + "27616877911672205297284696", + "60020630745910385528579642", + "47077970920228714172340119" + ], + "mAssetSupply": "134656068643895854484565275" + }, + { + "type": "mintMulti", + "inputQtys": [ + "1128282332327217463296", + "16267265875378452824064", + "3612635107994684096512" + ], + "expectedQty": "20964917436308343564338", + "reserves": [ + "27618006194004532514747992", + "60036898011785763981403706", + "47081583555336708856436631" + ], + "mAssetSupply": "134677033561332162828129613" + }, + { + "type": "redeemMasset", + "inputQty": "242113069340560253045964", + "expectedQtys": [ + "49634849148783932656079", + "107897809684133180327957", + "84614627176175668006639" + ], + "redemptionFee": "72633920802168075913", + "reserves": [ + "27568371344855748582091913", + "59929000202101630801075749", + "46996968928160533188429992" + ], + "mAssetSupply": "134434993125912404743159562" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "39075676855217246175232", + "expectedQty": "39086591927766151612622", + "swapFee": "23445406113130347705", + "reserves": [ + "27568371344855748582091913", + "59929000202101630801075749", + "46957882336232767036817370" + ], + "mAssetSupply": "134395940894463300627332035" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "381956902641400086528", + "222517174770471829504", + "49403132382059364352" + ], + "expectedQty": "655315090452111327600", + "swapFee": "393425109336868917", + "reserves": [ + "27567989387953107182005385", + "59928777684926860329246245", + "46957832933100384977453018" + ], + "mAssetSupply": "134395285579372848516004435" + }, + { + "type": "redeemMasset", + "inputQty": "15433153743492270050508", + "expectedQtys": [ + "3164793902435349866786", + "6879799158677142894640", + "5390740008163077200346" + ], + "redemptionFee": "4629946123047681015", + "reserves": [ + "27564824594050671832138599", + "59921897885768183186351605", + "46952442193092221900252672" + ], + "mAssetSupply": "134379857055575479293634942" + }, + { + "type": "redeemMasset", + "inputQty": "85816457268944298416537", + "expectedQtys": [ + "17597919725764488162026", + "38255304154440316947582", + "29975351587071867683712" + ], + "redemptionFee": "25744937180683289524", + "reserves": [ + "27547226674324907343976573", + "59883642581613742869404023", + "46922466841505150032568960" + ], + "mAssetSupply": "134294066343243715678507929" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "7687267437623014400", + "45944935256077795328", + "42805768735328985088" + ], + "expectedQty": "96312047481437625294", + "swapFee": "57821921641847683", + "reserves": [ + "27547218987057469720962173", + "59883596636678486791608695", + "46922424035736414703583872" + ], + "mAssetSupply": "134293970031196234240882635" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "10168228363047182", + "expectedQty": "10106152244810748", + "swapFee": "6100937017828", + "reserves": [ + "27547218976951317476151425", + "59883596636678486791608695", + "46922424035736414703583872" + ], + "mAssetSupply": "134293970021034106814853281" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "100769935880898633269248", + "expectedQty": "100680941551227018274780", + "reserves": [ + "27547218976951317476151425", + "59883596636678486791608695", + "47023193971617313336853120" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "1049213576686715032043520", + "1554629131913039691382784", + "74079151774131646627840" + ], + "expectedQty": "2679101415014592652207009", + "reserves": [ + "28596432553638032508194945", + "61438225768591526482991479", + "47097273123391444983480960" + ], + "mAssetSupply": "137073752377599926485335070" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "8534035262662765268959232", + "outputIndex": 2, + "expectedQty": "8554700848326195010440481", + "swapFee": "5139574064965801133116", + "reserves": [ + "37130467816300797777154177", + "61438225768591526482991479", + "38542572275065249973040479" + ], + "mAssetSupply": "137078891951664892286468186", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "1889257321828280904450048", + "expectedQty": "1892354771435748184865922", + "reserves": [ + "39019725138129078681604225", + "61438225768591526482991479", + "38542572275065249973040479" + ] + }, + { + "type": "redeemMasset", + "inputQty": "10661566913856384204", + "expectedQtys": [ + "2992609024555580221", + "4711990877355164403", + "2956013893271531064" + ], + "redemptionFee": "3198470074156915", + "reserves": [ + "39019722145520054126024004", + "61438221056600649127827076", + "38542569319051356701509415" + ], + "mAssetSupply": "138971236064732196689106819" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "100547006780567510319104", + "166925073649904641900544", + "119124896604153159090176" + ], + "expectedQty": "386532342875076007788901", + "swapFee": "232058640909591359489", + "reserves": [ + "38919175138739486615704900", + "61271295982950744485926532", + "38423444422447203542419239" + ], + "mAssetSupply": "138584703721857120681317918" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "3668445736182903329521664", + "expectedQty": "3673041295162949198858187", + "reserves": [ + "38919175138739486615704900", + "61271295982950744485926532", + "42091890158630106871940903" + ] + }, + { + "type": "redeemMasset", + "inputQty": "29778452619737603191603", + "expectedQtys": [ + "8144408073428582744553", + "12821917111399975371588", + "8808345213169365949491" + ], + "redemptionFee": "8933535785921280957", + "reserves": [ + "38911030730666058032960347", + "61258474065839344510554944", + "42083081813416937505991412" + ], + "mAssetSupply": "142227975497936118198265459" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "84023165002594", + "239265847850129", + "44129794711692" + ], + "expectedQty": "367091228302017", + "swapFee": "220386969162", + "reserves": [ + "38911030730582034867957753", + "61258474065600078662704815", + "42083081813372807711279720" + ], + "mAssetSupply": "142227975497569026969963442" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "663302648579687710720", + "19974773386795765760", + "243992843800937234432" + ], + "expectedQty": "928613549299992533054", + "swapFee": "557502631158690734", + "reserves": [ + "38910367427933455180247033", + "61258454090826691866939055", + "42082837820529006774045288" + ], + "mAssetSupply": "142227046884019726977430388" + }, + { + "type": "redeemMasset", + "inputQty": "8584667920987446470246", + "expectedQtys": [ + "2347882351447593938683", + "3696383579599967707540", + "2539311724584734539722" + ], + "redemptionFee": "2575400376296233941", + "reserves": [ + "38908019545582007586308350", + "61254757707247091899231515", + "42080298508804422039505566" + ], + "mAssetSupply": "142218464791499115827194083" + }, + { + "type": "mintMulti", + "inputQtys": [ + "59782048404718273691648", + "66100465937470256578560", + "85905704105603690921984" + ], + "expectedQty": "211830625374178129300028", + "reserves": [ + "38967801593986725859999998", + "61320858173184562155810075", + "42166204212910025730427550" + ], + "mAssetSupply": "142430295416873293956494111" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "46165708844475555840", + "outputIndex": 0, + "expectedQty": "46100672856021640460", + "swapFee": "27725290438670684", + "reserves": [ + "38967755493313869838359538", + "61320858173184562155810075", + "42166250378618870205983390" + ], + "mAssetSupply": "142430295444598584395164795", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mintMulti", + "inputQtys": [ + "455163481025817", + "119933999400677", + "526526272456769" + ], + "expectedQty": "1102651396932684", + "reserves": [ + "38967755493769033319385355", + "61320858173304496155210752", + "42166250379145396478440159" + ], + "mAssetSupply": "142430295445701235792097479" + }, + { + "type": "mintMulti", + "inputQtys": [ + "18623630698928943398912", + "9894603787910355353600", + "12452647853860149264384" + ], + "expectedQty": "40993699855073834688389", + "reserves": [ + "38986379124467962262784267", + "61330752777092406510564352", + "42178703026999256627704543" + ], + "mAssetSupply": "142471289145556309626785868" + }, + { + "type": "mintMulti", + "inputQtys": [ + "9124143315302983680", + "382152732803883991040", + "9028551031475765510144" + ], + "expectedQty": "9427446946147853402860", + "reserves": [ + "38986388248611277565767947", + "61331134929825210394555392", + "42187731578030732393214687" + ], + "mAssetSupply": "142480716592502457480188728" + }, + { + "type": "redeemMasset", + "inputQty": "307655472259455936102", + "expectedQtys": [ + "84157194477792813433", + "132391239140160843455", + "91067710821243391790" + ], + "redemptionFee": "92296641677836780", + "reserves": [ + "38986304091416799772954514", + "61331002538586070233711937", + "42187640510319911149822897" + ], + "mAssetSupply": "142480409029326839702089406" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "325477950299489088", + "807136830014787712", + "4666810736670580736" + ], + "expectedQty": "5802609266014339585", + "swapFee": "3483655753060440", + "reserves": [ + "38986303765938849473465426", + "61331001731449240218924225", + "42187635843509174479242161" + ], + "mAssetSupply": "142480403226717573687749821" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "48820660323147852021760", + "expectedQty": "48745726922031976082969", + "swapFee": "29292396193888711213", + "reserves": [ + "38986303765938849473465426", + "61331001731449240218924225", + "42138890116587142503159192" + ], + "mAssetSupply": "142431611858790619724439274" + }, + { + "type": "redeemMasset", + "inputQty": "11671140168094073854361", + "expectedQtys": [ + "3193659789193247619611", + "5024081155182422544990", + "3451911720960662186877" + ], + "redemptionFee": "3501342050428222156", + "reserves": [ + "38983110106149656225845815", + "61325977650294057796379235", + "42135438204866181840972315" + ], + "mAssetSupply": "142419944219964576078807069" + }, + { + "type": "mintMulti", + "inputQtys": [ + "20587186074406696779776", + "6249491074423928651776", + "14279340243756148326400" + ], + "expectedQty": "41151778474836727989789", + "reserves": [ + "39003697292224062922625591", + "61332227141368481725031011", + "42149717545109937989298715" + ], + "mAssetSupply": "142461095998439412806796858" + }, + { + "type": "redeemMasset", + "inputQty": "13562250629596101738496", + "expectedQtys": [ + "3712025525820656981127", + "5837056702559808185202", + "4011435794441250599873" + ], + "redemptionFee": "4068675188878830521", + "reserves": [ + "38999985266698242265644464", + "61326390084665921916845809", + "42145706109315496738698842" + ], + "mAssetSupply": "142447537816485005583888883" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "3444244485049902287552512", + "outputIndex": 0, + "expectedQty": "3426188228400080387526521", + "swapFee": "2061798496402203722020", + "reserves": [ + "35573797038298161878117943", + "64770634569715824204398321", + "42145706109315496738698842" + ], + "mAssetSupply": "142449599614981407787610903", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemMasset", + "inputQty": "36735575011122279874560", + "expectedQtys": [ + "9171186482061443349925", + "16698345907826578748815", + "10865472969628769980843" + ], + "redemptionFee": "11020672503336683962", + "reserves": [ + "35564625851816100434768018", + "64753936223807997625649506", + "42134840636345867968717999" + ], + "mAssetSupply": "142412875060642788844420305" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "115740214654932468367360", + "outputIndex": 2, + "expectedQty": "115254339910622174149563", + "swapFee": "69255521441589029086", + "reserves": [ + "35564625851816100434768018", + "64869676438462930094016866", + "42019586296435245794568436" + ], + "mAssetSupply": "142412944316164230433449391", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "1202103044776539193344", + "expectedQty": "1203181220937000682402", + "reserves": [ + "35564625851816100434768018", + "64869676438462930094016866", + "42020788399480022333761780" + ] + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "1486434272574526782963712", + "expectedQty": "1482283948867576254351538", + "reserves": [ + "35564625851816100434768018", + "66356110711037456876980578", + "42020788399480022333761780" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "216995542471775969345536", + "370492168721365632811008", + "19869063667707151384576" + ], + "expectedQty": "606950236503139994162387", + "swapFee": "364388775166984187009", + "reserves": [ + "35347630309344324465422482", + "65985618542316091244169570", + "42000919335812315182377204" + ], + "mAssetSupply": "143289481209749603694320944" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "372040776974948237312", + "expectedQty": "370982574188830281477", + "reserves": [ + "35347630309344324465422482", + "65985990583093066192406882", + "42000919335812315182377204" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "458748993160561098752", + "58169468353883496448", + "81109397288007630848" + ], + "expectedQty": "599277138579004798725", + "reserves": [ + "35348089058337485026521234", + "65986048752561420075903330", + "42001000445209603190008052" + ], + "mAssetSupply": "143290451469462371529401146" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "205035621442655497486336", + "expectedQty": "204311320577071292031318", + "swapFee": "123021372865593298491", + "reserves": [ + "35143777737760413734489916", + "65986048752561420075903330", + "42001000445209603190008052" + ], + "mAssetSupply": "143085538869392581625213301" + }, + { + "type": "redeemMasset", + "inputQty": "3008618674980471072358", + "expectedQtys": [ + "738736468958404102183", + "1387053521101933626293", + "882878072845215487321" + ], + "redemptionFee": "902585602494141321", + "reserves": [ + "35143039001291455330387733", + "65984661699040318142277037", + "42000117567136757974520731" + ], + "mAssetSupply": "143082531153303203648282264" + }, + { + "type": "mintMulti", + "inputQtys": [ + "9506225485867279974400", + "39725064226110957420544", + "2822336606874920550400" + ], + "expectedQty": "51970757172135424977294", + "reserves": [ + "35152545226777322610362133", + "66024386763266429099697581", + "42002939903743632895071131" + ], + "mAssetSupply": "143134501910475339073259558" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "766278642743756062720", + "expectedQty": "768555548128994708854", + "reserves": [ + "35153311505420066366424853", + "66024386763266429099697581", + "42002939903743632895071131" + ] + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "30316133626677188100096", + "outputIndex": 0, + "expectedQty": "30236179391165325818382", + "swapFee": "18206657227369403625", + "reserves": [ + "35123075326028901040606471", + "66024386763266429099697581", + "42033256037370310083171227" + ], + "mAssetSupply": "143135288672680695437372037", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "400262344120965185667072", + "expectedQty": "399108544349565498577858", + "reserves": [ + "35123075326028901040606471", + "66424649107387394285364653", + "42033256037370310083171227" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "10100682015497576448", + "160795249726194122752", + "373899864482400567296" + ], + "expectedQty": "544716326118216378063", + "reserves": [ + "35123085426710916538182919", + "66424809902637120479487405", + "42033629937234792483738523" + ], + "mAssetSupply": "143534941933356379152327958" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "633912809819035546943488", + "expectedQty": "634482885307333949704101", + "reserves": [ + "35123085426710916538182919", + "66424809902637120479487405", + "42667542747053828030682011" + ] + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "5253410646576809608478720", + "outputIndex": 0, + "expectedQty": "5229625563846862646420225", + "swapFee": "3153443624359507809405", + "reserves": [ + "29893459862864053891762694", + "66424809902637120479487405", + "47920953393630637639160731" + ], + "mAssetSupply": "144172578262288072609841464", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "10959187232382980096", + "expectedQty": "10925013885816749150", + "reserves": [ + "29893459862864053891762694", + "66424820861824352862467501", + "47920953393630637639160731" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "6353419198086566117376", + "7039887147515104985088", + "2947690713582262550528" + ], + "expectedQty": "16352019269265274152350", + "swapFee": "9817101822652756145", + "reserves": [ + "29887106443665967325645318", + "66417780974676837757482413", + "47918005702917055376610203" + ], + "mAssetSupply": "144156237168032693152438264" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "1396660033521996267520", + "outputIndex": 2, + "expectedQty": "1392068530726875886795", + "swapFee": "835382658988870503", + "reserves": [ + "29887106443665967325645318", + "66419177634710359753749933", + "47916613634386328500723408" + ], + "mAssetSupply": "144156238003415352141308767", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "3129307962161767250919424", + "expectedQty": "3136768803653923837844808", + "swapFee": "1877584777297060350551", + "reserves": [ + "29887106443665967325645318", + "63282408831056435915905125", + "47916613634386328500723408" + ], + "mAssetSupply": "141028807626030881950739894" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "198308675547106410496", + "outputIndex": 1, + "expectedQty": "199750092597204382929", + "swapFee": "119582075318502381", + "reserves": [ + "29887304752341514432055814", + "63282209080963838711522196", + "47916613634386328500723408" + ], + "mAssetSupply": "141028807745612957269242275", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemMasset", + "inputQty": "144162707015332639277056", + "expectedQtys": [ + "30542285912476714918248", + "64669040548813770162288", + "48966707627406616238444" + ], + "redemptionFee": "43248812104599791783", + "reserves": [ + "29856762466429037717137566", + "63217540040415024941359908", + "47867646926758921884484964" + ], + "mAssetSupply": "140884688287409729229757002" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "65124873058247491190784", + "32767496978468813406208", + "71581353046607742894080" + ], + "expectedQty": "169666312990095144041330", + "swapFee": "101860904336659081873", + "reserves": [ + "29791637593370790225946782", + "63184772543436556127953700", + "47796065573712314141590884" + ], + "mAssetSupply": "140715021974419634085715672" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "154929877033983020105728", + "371124853841004194693120", + "381251170337208703909888" + ], + "expectedQty": "906810107689725851297869", + "swapFee": "544412712241180218910", + "reserves": [ + "29636707716336807205841054", + "62813647689595551933260580", + "47414814403375105437680996" + ], + "mAssetSupply": "139808211866729908234417803" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "16866228261350415532032", + "outputIndex": 1, + "expectedQty": "16988834792256997454070", + "swapFee": "10170430027611124698", + "reserves": [ + "29653573944598157621373086", + "62796658854803294935806510", + "47414814403375105437680996" + ], + "mAssetSupply": "139808222037159935845542501", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemBassets", + "inputQtys": [ + "393168704283437120356352", + "417631884635571146981376", + "1333318796111851441618944" + ], + "expectedQty": "2144203078314724465590084", + "swapFee": "1287294223522948448423", + "reserves": [ + "29260405240314720501016734", + "62379026970167723788825134", + "46081495607263253996062052" + ], + "mAssetSupply": "137664018958845211379952417" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "12943369300322929344512", + "expectedQty": "13007754965803468043421", + "reserves": [ + "29273348609615043430361246", + "62379026970167723788825134", + "46081495607263253996062052" + ] + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "2088402165959365369004032", + "expectedQty": "2087778430579696725543227", + "swapFee": "1253041299575619221402", + "reserves": [ + "29273348609615043430361246", + "62379026970167723788825134", + "43993717176683557270518825" + ], + "mAssetSupply": "135589877589151225098213208" + }, + { + "type": "mintMulti", + "inputQtys": [ + "170967365346449980129280", + "148109333343915525275648", + "91374350508597908078592" + ], + "expectedQty": "410798964504553532117783", + "reserves": [ + "29444315974961493410490526", + "62527136303511639314100782", + "44085091527192155178597417" + ], + "mAssetSupply": "136000676553655778630330991" + }, + { + "type": "redeemMasset", + "inputQty": "134563122540262640844", + "expectedQtys": [ + "29124343814280005130", + "61847652259077602839", + "43606017671246846762" + ], + "redemptionFee": "40368936762078792", + "reserves": [ + "29444286850617679130485396", + "62527074455859380236497943", + "44085047921174483931750655" + ], + "mAssetSupply": "136000542030902175129768939" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "88189823309618905088", + "expectedQty": "87724228215224983749", + "swapFee": "52913893985771343", + "reserves": [ + "29444199126389463905501647", + "62527074455859380236497943", + "44085047921174483931750655" + ], + "mAssetSupply": "136000453893992759496635194" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "23399154083801881116672", + "36588566612473524224", + "5299189163682836774912" + ], + "expectedQty": "28844265793282200659137", + "swapFee": "17316949645756774460", + "reserves": [ + "29420799972305662024384975", + "62527037867292767762973719", + "44079748732010801094975743" + ], + "mAssetSupply": "135971609628199477295976057" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "551854927227533918208", + "expectedQty": "550191532239345164921", + "reserves": [ + "29420799972305662024384975", + "62527589722219995296891927", + "44079748732010801094975743" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "8497958757501412311040", + "2315279768188068560896", + "10799422514610168659968" + ], + "expectedQty": "21644212488039758461099", + "reserves": [ + "29429297931063163436696015", + "62529905001988183365452823", + "44090548154525411263635711" + ], + "mAssetSupply": "135993804032219756399602077" + }, + { + "type": "mintMulti", + "inputQtys": [ + "4895974816624629776384", + "5907603494426465271808", + "7388503057935155331072" + ], + "expectedQty": "18196308398538419042240", + "reserves": [ + "29434193905879788066472399", + "62535812605482609830724631", + "44097936657583346418966783" + ], + "mAssetSupply": "136012000340618294818644317" + }, + { + "type": "redeemMasset", + "inputQty": "173634017964183795636633", + "expectedQtys": [ + "37564656849495386591966", + "79809773246755628156899", + "56278893303818114181719" + ], + "redemptionFee": "52090205389255138690", + "reserves": [ + "29396629249030292679880433", + "62456002832235854202567732", + "44041657764279528304785064" + ], + "mAssetSupply": "135838418412859500278146374" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "3659886629619778977792", + "expectedQty": "3668741846481299169755", + "swapFee": "2195931977771867386", + "reserves": [ + "29396629249030292679880433", + "62452334090389372903397977", + "44041657764279528304785064" + ], + "mAssetSupply": "135834760722161858271035968" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "31880312007344904994816", + "expectedQty": "31784238456315660825611", + "reserves": [ + "29396629249030292679880433", + "62484214402396717808392793", + "44041657764279528304785064" + ] + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "1892983725973451046912", + "expectedQty": "1892719426243500769537", + "reserves": [ + "29396629249030292679880433", + "62484214402396717808392793", + "44043550748005501755831976" + ] + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "1173878992437957632", + "expectedQty": "1176722441776105768", + "swapFee": "704327395462774", + "reserves": [ + "29396629249030292679880433", + "62484213225674276032287025", + "44043550748005501755831976" + ], + "mAssetSupply": "135868436506869752390136258" + }, + { + "type": "redeemMasset", + "inputQty": "3081703620939897792102", + "expectedQtys": [ + "666560414021877752760", + "1416812202674924989702", + "998675296166908441849" + ], + "redemptionFee": "924511086281969337", + "reserves": [ + "29395962688616270802127673", + "62482796413471601107297323", + "44042552072709334847390127" + ], + "mAssetSupply": "135865355727759898774313493" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "312190255022577956159488", + "expectedQty": "310519028503550891551897", + "swapFee": "187314153013546773695", + "reserves": [ + "29085443660112719910575776", + "62482796413471601107297323", + "44042552072709334847390127" + ], + "mAssetSupply": "135553352786890334364927700" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "6818202824720329728", + "17732769563790778368", + "2413236769973015040" + ], + "expectedQty": "26942695159959367673", + "swapFee": "16175322289349230", + "reserves": [ + "29085436841909895190246048", + "62482778680702037316518955", + "44042549659472564874375087" + ], + "mAssetSupply": "135553325844195174405560027" + }, + { + "type": "redeemMasset", + "inputQty": "891959610092167577", + "expectedQtys": [ + "191328776574680295", + "411021971818533927", + "289719119206571110" + ], + "redemptionFee": "267587883027650", + "reserves": [ + "29085436650581118615565753", + "62482778269680065497985028", + "44042549369753445667803977" + ], + "mAssetSupply": "135553324952503152196420100" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "90925108247429168234496", + "83177348587994866515968", + "30828558073379283795968" + ], + "expectedQty": "205113034489471579493459", + "swapFee": "123141705717113215625", + "reserves": [ + "28994511542333689447331257", + "62399600921092070631469060", + "44011720811680066384008009" + ], + "mAssetSupply": "135348211918013680616926641" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "169615456087656529920", + "207717020265883041792", + "240366557831555874816" + ], + "expectedQty": "617845989774679987194", + "swapFee": "370930151955981581", + "reserves": [ + "28994341926877601790801337", + "62399393204071804748427268", + "44011480445122234828133193" + ], + "mAssetSupply": "135347594072023905936939447" + }, + { + "type": "redeemMasset", + "inputQty": "13238421955163594738892", + "expectedQtys": [ + "2835101603182392660201", + "6101487668063923713928", + "4303495457254331931617" + ], + "redemptionFee": "3971526586549078421", + "reserves": [ + "28991506825274419398141136", + "62393291716403740824713340", + "44007176949664980496201576" + ], + "mAssetSupply": "135334359621595328891278976" + }, + { + "type": "mintMulti", + "inputQtys": [ + "1062329070870623551488", + "855533047362492694528", + "387903725455076753408" + ], + "expectedQty": "2308252046709777547446", + "reserves": [ + "28992569154345290021692624", + "62394147249451103317407868", + "44007564853390435572954984" + ], + "mAssetSupply": "135336667873642038668826422" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "10115797354134194176", + "outputIndex": 1, + "expectedQty": "10190100132907554385", + "swapFee": "6099029286305470", + "reserves": [ + "28992579270142644155886800", + "62394137059350970409853483", + "44007564853390435572954984" + ], + "mAssetSupply": "135336667879741067955131892", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "9941990907426967126016", + "expectedQty": "9937833389548025509467", + "swapFee": "5965194544456180275", + "reserves": [ + "28992579270142644155886800", + "62394137059350970409853483", + "43997627020000887547445517" + ], + "mAssetSupply": "135326731854028185444186151" + }, + { + "type": "mintMulti", + "inputQtys": [ + "318017859850340266934272", + "1137070094370876552118272", + "715019307847087820898304" + ], + "expectedQty": "2168041283029641509946768", + "reserves": [ + "29310597129992984422821072", + "63531207153721846961971755", + "44712646327847975368343821" + ], + "mAssetSupply": "137494773137057826954132919" + }, + { + "type": "redeemMasset", + "inputQty": "17377597202992539369472", + "expectedQtys": [ + "3703376752157838071162", + "8027130752954180311664", + "5649416632613221480989" + ], + "redemptionFee": "5213279160897761810", + "reserves": [ + "29306893753240826584749910", + "63523180022968892781660091", + "44706996911215362146862832" + ], + "mAssetSupply": "137477400753133995312525257" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "21985567876935277608960", + "expectedQty": "21917668140400238015666", + "reserves": [ + "29306893753240826584749910", + "63545165590845828059269051", + "44706996911215362146862832" + ] + }, + { + "type": "redeemMasset", + "inputQty": "338730271340979", + "expectedQtys": [ + "72176022743389", + "156496875975133", + "110102873850139" + ], + "redemptionFee": "101619081402", + "reserves": [ + "29306893753168650562006521", + "63545165590689331183293918", + "44706996911105259273012693" + ], + "mAssetSupply": "137499318420935766898281346" + }, + { + "type": "redeemMasset", + "inputQty": "3930058311455336929689", + "expectedQtys": [ + "837409591258263743221", + "1815727439145079399379", + "1277449201031935524298" + ], + "redemptionFee": "1179017493436601078", + "reserves": [ + "29306056343577392298263300", + "63543349863250186103894539", + "44705719461904227337488395" + ], + "mAssetSupply": "137495389541641804997952735" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "16914933394001856512", + "expectedQty": "16821520381826051754", + "swapFee": "10148960036401113", + "reserves": [ + "29306039522057010472211546", + "63543349863250186103894539", + "44705719461904227337488395" + ], + "mAssetSupply": "137495372636857371032497336" + }, + { + "type": "mintMulti", + "inputQtys": [ + "666541697435656", + "598856189546043", + "1167563859161707" + ], + "expectedQty": "2434189303133901", + "reserves": [ + "29306039522723552169647202", + "63543349863849042293440582", + "44705719463071791196650102" + ], + "mAssetSupply": "137495372639291560335631237" + }, + { + "type": "redeemMasset", + "inputQty": "15649249410464901339545", + "expectedQtys": [ + "3334511756045143185916", + "7230115382025615440718", + "5086724427450546714874" + ], + "redemptionFee": "4694774823139470401", + "reserves": [ + "29302705010967507026461286", + "63536119748467016677999864", + "44700632738644340649935228" + ], + "mAssetSupply": "137479728084655918573762093" + }, + { + "type": "mintMulti", + "inputQtys": [ + "223434535059546202701824", + "181289345463089539055616", + "168275447144523837210624" + ], + "expectedQty": "573509629626226821770900", + "reserves": [ + "29526139546027053229163110", + "63717409093930106217055480", + "44868908185788864487145852" + ], + "mAssetSupply": "138053237714282145395532993" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "393689947628672909312", + "332152568958380998656", + "402576045222530842624" + ], + "expectedQty": "1129253091550670963659", + "swapFee": "677958630108467658", + "reserves": [ + "29525745856079424556253798", + "63717076941361147836056824", + "44868505609743641956303228" + ], + "mAssetSupply": "138052108461190594724569334" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "596948961410481127424", + "outputIndex": 2, + "expectedQty": "599619526599202579756", + "swapFee": "359922652880184323", + "reserves": [ + "29526342805040835037381222", + "63717076941361147836056824", + "44867905990217042753723472" + ], + "mAssetSupply": "138052108821113247604753657", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemBassets", + "inputQtys": [ + "287160967605689920", + "6742703129772660736", + "7331739856682651648" + ], + "expectedQty": "14340981878497873790", + "swapFee": "8609754980086776", + "reserves": [ + "29526342517879867431691302", + "63717070198658018063396088", + "44867898658477186071071824" + ], + "mAssetSupply": "138052094480131369106879867" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "441256664938464640237568", + "453714972197851498545152", + "947937685193171153190912" + ], + "expectedQty": "1843529765250757177723364", + "swapFee": "1106781928307438769895", + "reserves": [ + "29085085852941402791453734", + "63263355226460166564850936", + "43919960973284014917880912" + ], + "mAssetSupply": "136208564714880611929156503" + }, + { + "type": "mintMulti", + "inputQtys": [ + "248444105881545965830144", + "366456351641082265600", + "15723614746953107111936" + ], + "expectedQty": "265742304624189884289628", + "reserves": [ + "29333529958822948757283878", + "63263721682811807647116536", + "43935684588030968024992848" + ], + "mAssetSupply": "136474307019504801813446131" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "688493140051493870632960", + "outputIndex": 0, + "expectedQty": "682475108306675865889726", + "swapFee": "411801346535320800763", + "reserves": [ + "28651054850516272891394152", + "63952214822863301517749496", + "43935684588030968024992848" + ], + "mAssetSupply": "136474718820851337134246894", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mintMulti", + "inputQtys": [ + "21398957082150550110208", + "17172613547293828710400", + "11123280039975604715520" + ], + "expectedQty": "49748969675618886065800", + "reserves": [ + "28672453807598423441504360", + "63969387436410595346459896", + "43946807868070943629708368" + ], + "mAssetSupply": "136524467790526956020312694" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "7061213022852446420992", + "expectedQty": "7020472622922377205554", + "swapFee": "4236727813711467852", + "reserves": [ + "28665433334975501064298806", + "63969387436410595346459896", + "43946807868070943629708368" + ], + "mAssetSupply": "136517410814231917285359554" + }, + { + "type": "redeemMasset", + "inputQty": "46405635653643973899059", + "expectedQtys": [ + "9741164705428907361862", + "21738249404489695932823", + "14934122527231767454259" + ], + "redemptionFee": "13921690696093192169", + "reserves": [ + "28655692170270072156936944", + "63947649187006105650527073", + "43931873745543711862254109" + ], + "mAssetSupply": "136471019100268969404652664" + }, + { + "type": "redeemMasset", + "inputQty": "623830050271923302", + "expectedQtys": [ + "130950286151669614", + "292226860548596896", + "200759116338028110" + ], + "redemptionFee": "187149015081576", + "reserves": [ + "28655692039319786005267330", + "63947648894779245101930177", + "43931873544784595524225999" + ], + "mAssetSupply": "136471018476626068147810938" + }, + { + "type": "redeemMasset", + "inputQty": "1389441382920893549772", + "expectedQtys": [ + "291662363179126707066", + "650869724968021238431", + "447145859865354282035" + ], + "redemptionFee": "416832414876268064", + "reserves": [ + "28655400376956606878560264", + "63946998025054277080691746", + "43931426398924730169943964" + ], + "mAssetSupply": "136469629452075562130529230" + }, + { + "type": "redeemMasset", + "inputQty": "194649386887759535066316", + "expectedQtys": [ + "40859514383907130697613", + "91181531273020285007152", + "62641482067578952782055" + ], + "redemptionFee": "58394816066327860519", + "reserves": [ + "28614540862572699747862651", + "63855816493781256795684594", + "43868784916857151217161909" + ], + "mAssetSupply": "136275038460003868923323433" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "65470029883160346624", + "expectedQty": "65461946912066655860", + "reserves": [ + "28614540862572699747862651", + "63855816493781256795684594", + "43868850386887034377508533" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "877310548827046718472192", + "1107890282908237772619776", + "833170367625228730761216" + ], + "expectedQty": "2819262115631743814547791", + "swapFee": "1692572813066886420581", + "reserves": [ + "27737230313745653029390459", + "62747926210873019023064818", + "43035680019261805646747317" + ], + "mAssetSupply": "133455841806319037175431502" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "28901607458992365240320", + "expectedQty": "28729741290437374783658", + "swapFee": "17340964475395419144", + "reserves": [ + "27708500572455215654606801", + "62747926210873019023064818", + "43035680019261805646747317" + ], + "mAssetSupply": "133426957539824520205610326" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "449656111066114490368", + "expectedQty": "450877581307255105771", + "swapFee": "269793666639668694", + "reserves": [ + "27708500572455215654606801", + "62747475333291711767959047", + "43035680019261805646747317" + ], + "mAssetSupply": "133426508153507120730788652" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "84726049433658", + "expectedQty": "84688664244149", + "swapFee": "50835629660", + "reserves": [ + "27708500572455215654606801", + "62747475333291711767959047", + "43035680019177116982503168" + ], + "mAssetSupply": "133426508153422445516984654" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "178293720500164829904896", + "expectedQty": "178212571446128696079658", + "swapFee": "106976232300098897942", + "reserves": [ + "27708500572455215654606801", + "62747475333291711767959047", + "42857467447730988286423510" + ], + "mAssetSupply": "133248321409154580785977700" + }, + { + "type": "redeemMasset", + "inputQty": "3232167762363483684864", + "expectedQtys": [ + "671915816951377051460", + "1521591579448979367202", + "1039269886773868964396" + ], + "redemptionFee": "969650328709045105", + "reserves": [ + "27707828656638264277555341", + "62745953741712262788591845", + "42856428177844214417459114" + ], + "mAssetSupply": "133245090211042546011337941" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "684153612616661324529664", + "outputIndex": 0, + "expectedQty": "677640924976531132532268", + "swapFee": "409116726403232333260", + "reserves": [ + "27030187731661733145023073", + "63430107354328924113121509", + "42856428177844214417459114" + ], + "mAssetSupply": "133245499327768949243671201", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "103100009992371967098880", + "expectedQty": "103694821488218869488658", + "reserves": [ + "27133287741654105112121953", + "63430107354328924113121509", + "42856428177844214417459114" + ] + }, + { + "type": "redeemMasset", + "inputQty": "199015390061354701081804", + "expectedQtys": [ + "40482598304695280514438", + "94637095986969990528831", + "63941369111501763732062" + ], + "redemptionFee": "59704617018406410324", + "reserves": [ + "27092805143349409831607515", + "63335470258341954122592678", + "42792486808732712653727052" + ], + "mAssetSupply": "133150238463812831818488379" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "15863936020617152", + "expectedQty": "15809006448510052", + "reserves": [ + "27092805143349409831607515", + "63335470274205890143209830", + "42792486808732712653727052" + ] + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "50539006518303039422464", + "expectedQty": "50219636451791446073374", + "swapFee": "30323403910981823653", + "reserves": [ + "27042585506897618385534141", + "63335470274205890143209830", + "42792486808732712653727052" + ], + "mAssetSupply": "133099729796507446209399620" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "10044824270300256403456", + "expectedQty": "10102742762271546165789", + "reserves": [ + "27052630331167918641937597", + "63335470274205890143209830", + "42792486808732712653727052" + ] + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "1238299303840654819328", + "expectedQty": "1238096269685318368416", + "reserves": [ + "27052630331167918641937597", + "63335470274205890143209830", + "42793725108036553308546380" + ] + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "1441807326231065264128", + "expectedQty": "1450116730466461920636", + "reserves": [ + "27054072138494149707201725", + "63335470274205890143209830", + "42793725108036553308546380" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "3870852539436967133184", + "4133948579912342831104", + "2996085291638061531136" + ], + "expectedQty": "11008367374298595333089", + "swapFee": "6608985816068798478", + "reserves": [ + "27050201285954712740068541", + "63331336325625977800378726", + "42790729022744915247015244" + ], + "mAssetSupply": "133101512384895570940521372" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "1747364873681024896204800", + "expectedQty": "1741154792851371014125644", + "reserves": [ + "27050201285954712740068541", + "65078701199307002696583526", + "42790729022744915247015244" + ] + }, + { + "type": "redeemMasset", + "inputQty": "736555738948046766787788", + "expectedQtys": [ + "147712917724441018366430", + "355374983507352311126202", + "233667149781524632492278" + ], + "redemptionFee": "220966721684414030036", + "reserves": [ + "26902488368230271721702111", + "64723326215799650385457324", + "42557061872963390614522966" + ], + "mAssetSupply": "134106332405520579601889264" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "41406231149195061886976", + "expectedQty": "41654704002666397107592", + "reserves": [ + "26943894599379466783589087", + "64723326215799650385457324", + "42557061872963390614522966" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "34738152705682573361152", + "115815795400825261522944", + "365405905232394958405632" + ], + "expectedQty": "515718261335684244660841", + "reserves": [ + "26978632752085149356950239", + "64839142011200475646980268", + "42922467778195785572928598" + ], + "mAssetSupply": "134663705370858930243657697" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "121474913369227337400320", + "expectedQty": "121460655204899945478210", + "reserves": [ + "26978632752085149356950239", + "64839142011200475646980268", + "43043942691565012910328918" + ] + }, + { + "type": "redeemMasset", + "inputQty": "151165437575758708998144", + "expectedQtys": [ + "30248234834156102736723", + "72697145627159486304232", + "48260536354340840063441" + ], + "redemptionFee": "45349631272727612699", + "reserves": [ + "26948384517250993254213516", + "64766444865573316160676036", + "42995682155210672070265477" + ], + "mAssetSupply": "134634045938119344207750462" + }, + { + "type": "mintMulti", + "inputQtys": [ + "663305995516151168", + "398281041249602688", + "522819391231594560" + ], + "expectedQty": "1586911746293134595", + "reserves": [ + "26948385180556988770364684", + "64766445263854357410278724", + "42995682678030063301860037" + ], + "mAssetSupply": "134634047525031090500885057" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "263616997854449632", + "95212638986252681216", + "1366168850651912704" + ], + "expectedQty": "96499950733213039410", + "swapFee": "57934731278695040", + "reserves": [ + "26948384916939990915915052", + "64766350051215371157597508", + "42995681311861212649947333" + ], + "mAssetSupply": "134633951025080357287845647" + }, + { + "type": "mintMulti", + "inputQtys": [ + "578122104882274893824", + "431987076761598361600", + "326974803470413266944" + ], + "expectedQty": "1338977401264398229821", + "reserves": [ + "26948963039044873190808876", + "64766782038292132755959108", + "42996008286664683063214277" + ], + "mAssetSupply": "134635290002481621686075468" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "250665306472514781708288", + "outputIndex": 1, + "expectedQty": "251379255983479279569840", + "swapFee": "150377031838664959721", + "reserves": [ + "26948963039044873190808876", + "64515402782308653476389268", + "43246673593137197844922565" + ], + "mAssetSupply": "134635440379513460351035189", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "548164686797875428982784", + "expectedQty": "548041437552743193208429", + "reserves": [ + "26948963039044873190808876", + "64515402782308653476389268", + "43794838279935073273905349" + ] + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "1649215302092849479155712", + "expectedQty": "1653950880065776023017048", + "swapFee": "989529181255709687493", + "reserves": [ + "26948963039044873190808876", + "62861451902242877453372220", + "43794838279935073273905349" + ], + "mAssetSupply": "133535256044154609774775399" + }, + { + "type": "redeemMasset", + "inputQty": "141375429062551302202982", + "expectedQtys": [ + "28522641502351023925866", + "66532231846071882670827", + "46352227731442230152149" + ], + "redemptionFee": "42412628718765390660", + "reserves": [ + "26920440397542522166883010", + "62794919670396805570701393", + "43748486052203631043753200" + ], + "mAssetSupply": "133393923027720777237963077" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "45629370297374866407424", + "outputIndex": 0, + "expectedQty": "45318673860258812428278", + "swapFee": "27367718205213652420", + "reserves": [ + "26875121723682263354454732", + "62794919670396805570701393", + "43794115422501005910160624" + ], + "mAssetSupply": "133393950395438982451615497", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "68472487246763537727488", + "expectedQty": "68456422898617819460243", + "swapFee": "41083492348058122636", + "reserves": [ + "26875121723682263354454732", + "62794919670396805570701393", + "43725658999602388090700381" + ], + "mAssetSupply": "133325518991684566972010645" + }, + { + "type": "mintMulti", + "inputQtys": [ + "2832966510879461867520", + "5149280760864952025088", + "1905214532026793459712" + ], + "expectedQty": "9886018389646088511727", + "reserves": [ + "26877954690193142816322252", + "62800068951157670522726481", + "43727564214134414884160093" + ], + "mAssetSupply": "133335405010074213060522372" + }, + { + "type": "mintMulti", + "inputQtys": [ + "46596826087187365756928", + "519632038196460751159296", + "99973147444614143148032" + ], + "expectedQty": "664672150006656093655648", + "reserves": [ + "26924551516280330182079180", + "63319700989354131273885777", + "43827537361579029027308125" + ], + "mAssetSupply": "134000077160080869154178020" + }, + { + "type": "redeemMasset", + "inputQty": "14183298064808147314278", + "expectedQtys": [ + "2848986238110839865569", + "6700091424396931960557", + "4637553599283777045057" + ], + "redemptionFee": "4254989419442444194", + "reserves": [ + "26921702530042219342213611", + "63313000897929734341925220", + "43822899807979745250263068" + ], + "mAssetSupply": "133985898117005480449307936" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "2873897917706963779584", + "2476373372049769889792", + "4887307578164497088512" + ], + "expectedQty": "10244529776868708490397", + "swapFee": "6150408110987817784", + "reserves": [ + "26918828632124512378434027", + "63310524524557684572035428", + "43818012500401580753174556" + ], + "mAssetSupply": "133975653587228611740817539" + }, + { + "type": "mintMulti", + "inputQtys": [ + "403052236579585080164352", + "179144401449856534577152", + "202704536835238752419840" + ], + "expectedQty": "786591829669050171883179", + "reserves": [ + "27321880868704097458598379", + "63489668926007541106612580", + "44020717037236819505594396" + ], + "mAssetSupply": "134762245416897661912700718" + }, + { + "type": "mintMulti", + "inputQtys": [ + "1215792142982420671496192", + "56072352781885121757184", + "1527645640087654987988992" + ], + "expectedQty": "2805573480964083582485588", + "reserves": [ + "28537673011686518130094571", + "63545741278789426228369764", + "45548362677324474493583388" + ], + "mAssetSupply": "137567818897861745495186306" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "18346967440636493824", + "outputIndex": 0, + "expectedQty": "18180486507571361362", + "swapFee": "10973603744466454", + "reserves": [ + "28537654831200010558733209", + "63545759625756866864863588", + "45548362677324474493583388" + ], + "mAssetSupply": "137567818908835349239652760", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mintMulti", + "inputQtys": [ + "523739555344982933504", + "15269334232766044160", + "916829136956769697792" + ], + "expectedQty": "1458247358262648615428", + "reserves": [ + "28538178570755355541666713", + "63545774895091099630907748", + "45549279506461431263281180" + ], + "mAssetSupply": "137569277156193611888268188" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "106873147638575464972288", + "expectedQty": "107145014459506051130520", + "swapFee": "64123888583145278983", + "reserves": [ + "28538178570755355541666713", + "63438629880631593579777228", + "45549279506461431263281180" + ], + "mAssetSupply": "137462468132443619568574883" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "52852062462091968118784", + "6480139608194842361856", + "42759264383019035656192" + ], + "expectedQty": "102338322200905023096185", + "swapFee": "61439857234883944224", + "reserves": [ + "28485326508293263573547929", + "63432149741023398737415372", + "45506520242078412227624988" + ], + "mAssetSupply": "137360129810242714545478698" + }, + { + "type": "mintMulti", + "inputQtys": [ + "10856568078468124", + "50815186491851128", + "62668121858489368" + ], + "expectedQty": "124213736562453301", + "reserves": [ + "28485326519149831652016053", + "63432149791838585229266500", + "45506520304746534086114356" + ], + "mAssetSupply": "137360129934456451107931999" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "311875674451560013758464", + "1236318305541474123513856", + "2364144821181048602755072" + ], + "expectedQty": "3909406131717223223490128", + "swapFee": "2347051910176439797972", + "reserves": [ + "28173450844698271638257589", + "62195831486297111105752644", + "43142375483565485483359284" + ], + "mAssetSupply": "133450723802739227884441871" + }, + { + "type": "redeemMasset", + "inputQty": "81931535165953199308", + "expectedQtys": [ + "17291787744936124265", + "38173425137348762073", + "26479141791554284409" + ], + "redemptionFee": "24579460549785959", + "reserves": [ + "28173433552910526702133324", + "62195793312871973756990571", + "43142349004423693929074875" + ], + "mAssetSupply": "133450641895783522481028522" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "2484480559280601195085824", + "expectedQty": "2482880904591918800339899", + "swapFee": "1490688335568360717051", + "reserves": [ + "28173433552910526702133324", + "62195793312871973756990571", + "40659468099831775128734976" + ], + "mAssetSupply": "130967652024838489646659749" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "777018121682174311661568", + "314348560246984537014272", + "301828118615261630693376" + ], + "expectedQty": "1396061990627869423261664", + "swapFee": "838140078423775919508", + "reserves": [ + "27396415431228352390471756", + "61881444752624989219976299", + "40357639981216513498041600" + ], + "mAssetSupply": "129571590034210620223398085" + }, + { + "type": "mintMulti", + "inputQtys": [ + "333191817410173013590016", + "325318327516784609984512", + "368193704973489129127936" + ], + "expectedQty": "1027357893239491658586807", + "reserves": [ + "27729607248638525404061772", + "62206763080141773829960811", + "40725833686190002627169536" + ], + "mAssetSupply": "130598947927450111881984892" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "918627050927750784", + "expectedQty": "923258062234393414", + "reserves": [ + "27729608167265576331812556", + "62206763080141773829960811", + "40725833686190002627169536" + ] + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "937274793139474037473280", + "expectedQty": "936460058299618201310009", + "swapFee": "562364875883684422483", + "reserves": [ + "27729608167265576331812556", + "62206763080141773829960811", + "39789373627890384425859527" + ], + "mAssetSupply": "129662236422444583763327509" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "1788937657413587299205120", + "outputIndex": 1, + "expectedQty": "1794041962638980669844576", + "swapFee": "1073573541079017337640", + "reserves": [ + "27729608167265576331812556", + "60412721117502793160116235", + "41578311285303971725064647" + ], + "mAssetSupply": "129663309995985662780665149", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "117233093638759616", + "expectedQty": "117534057467942353", + "swapFee": "70339856183255", + "reserves": [ + "27729608167265576331812556", + "60412720999968735692173882", + "41578311285303971725064647" + ], + "mAssetSupply": "129663309878822908998088788" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "10294116062764231294976", + "16825466809823134744576", + "22455567695888269705216" + ], + "expectedQty": "49571151342127060423775", + "swapFee": "29760547133556370076", + "reserves": [ + "27719314051202812100517580", + "60395895533158912557429306", + "41555855717608083455359431" + ], + "mAssetSupply": "129613738727480781937665013" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "1212963073150546944", + "2139412695809908992", + "1711509714515294464" + ], + "expectedQty": "5062974092089380629", + "swapFee": "3039608220185739", + "reserves": [ + "27719312838239738949970636", + "60395893393746216747520314", + "41555854006098368940064967" + ], + "mAssetSupply": "129613733664506689848284384" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "92722876035065274433536", + "expectedQty": "92671969274554893621430", + "swapFee": "55633725621039164660", + "reserves": [ + "27719312838239738949970636", + "60395893393746216747520314", + "41463182036823814046443537" + ], + "mAssetSupply": "129521066422197245613015508" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "3758368339486642274304", + "outputIndex": 2, + "expectedQty": "3744383930372538831133", + "swapFee": "2247882360351902571", + "reserves": [ + "27719312838239738949970636", + "60399651762085703389794618", + "41459437652893441507612404" + ], + "mAssetSupply": "129521068670079605964918079", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemBassets", + "inputQtys": [ + "285882233357976341577728", + "250484962002965956132864", + "128076509796107900944384" + ], + "expectedQty": "665052014736542431777593", + "swapFee": "399270771304708284036", + "reserves": [ + "27433430604881762608392908", + "60149166800082737433661754", + "41331361143097333606668020" + ], + "mAssetSupply": "128856016655343063533140486" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "143533970612189879336960", + "194021014151704799608832", + "359736057264145554210816" + ], + "expectedQty": "697365820818739245539378", + "swapFee": "418670694908188460399", + "reserves": [ + "27289896634269572729055948", + "59955145785931032634052922", + "40971625085833188052457204" + ], + "mAssetSupply": "128158650834524324287601108" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "9969342317371453440", + "expectedQty": "9995408065814144210", + "swapFee": "5981605390422872", + "reserves": [ + "27289896634269572729055948", + "59955135790522966819908712", + "40971625085833188052457204" + ], + "mAssetSupply": "128158640871163612306570540" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "202805503733499166720", + "9551390835110557696", + "339870786573721468928" + ], + "expectedQty": "553193092389500444255", + "swapFee": "332115124508405309", + "reserves": [ + "27289693828765839229889228", + "59955126239132131709351016", + "40971285215046614330988276" + ], + "mAssetSupply": "128158087678071222806126285" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "38644767679041106870272", + "expectedQty": "38429997563600963491391", + "swapFee": "23186860607424664122", + "reserves": [ + "27251263831202238266397837", + "59955126239132131709351016", + "40971285215046614330988276" + ], + "mAssetSupply": "128119466097252789123920135" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "98371157260008010285056", + "outputIndex": 2, + "expectedQty": "98803244962130182066618", + "swapFee": "59316122603731935512", + "reserves": [ + "27349634988462246276682893", + "59955126239132131709351016", + "40872481970084484148921658" + ], + "mAssetSupply": "128119525413375392855855647", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "5207445909223621263360", + "expectedQty": "5207361601728018336415", + "reserves": [ + "27349634988462246276682893", + "59955126239132131709351016", + "40877689415993707770185018" + ] + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "5977042824188153475104768", + "outputIndex": 0, + "expectedQty": "5926356009595868798120496", + "swapFee": "3584544927429180494667", + "reserves": [ + "21423278978866377478562397", + "59955126239132131709351016", + "46854732240181861245289786" + ], + "mAssetSupply": "128128317319904550054686729", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "4971691044139648000", + "outputIndex": 2, + "expectedQty": "4958136274724175862", + "swapFee": "2971452217903120", + "reserves": [ + "21423278978866377478562397", + "59955131210823175848999016", + "46854727282045586521113924" + ], + "mAssetSupply": "128128317322876002272589849", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemBassets", + "inputQtys": [ + "436931135158299721728", + "7175844376859757248512", + "14156851683317184987136" + ], + "expectedQty": "21721295039737628929568", + "swapFee": "13040601384673381386", + "reserves": [ + "21422842047731219178840669", + "59947955366446316091750504", + "46840570430362269336126788" + ], + "mAssetSupply": "128106596027836264643660281" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "266073682911937477738496", + "297864201685569340702720", + "219875446731561787981824" + ], + "expectedQty": "784890031965778720365719", + "swapFee": "471216749229004635000", + "reserves": [ + "21156768364819281701102173", + "59650091164760746751047784", + "46620694983630707548144964" + ], + "mAssetSupply": "127321705995870485923294562" + }, + { + "type": "redeemMasset", + "inputQty": "29436500700748970563993", + "expectedQtys": [ + "4889931277301142210698", + "13786833671888132391997", + "10775369406088384209525" + ], + "redemptionFee": "8830950210224691169", + "reserves": [ + "21151878433541980558891475", + "59636304331088858618655787", + "46609919614224619163935439" + ], + "mAssetSupply": "127292278326119947177421738" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "11447517628109703610368", + "5731721040300348538880", + "4106671045179643265024" + ], + "expectedQty": "21370077753109765142567", + "swapFee": "12829744498564998084", + "reserves": [ + "21140430915913870855281107", + "59630572610048558270116907", + "46605812943179439520670415" + ], + "mAssetSupply": "127270908248366837412279171" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "208042657940876328960", + "64999367046118449152", + "506383420192994689024" + ], + "expectedQty": "780339246001281167126", + "swapFee": "468484638383798979", + "reserves": [ + "21140222873255929978952147", + "59630507610681512151667755", + "46605306559759246525981391" + ], + "mAssetSupply": "127270127909120836131112045" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "495332979900266481451008", + "expectedQty": "494432394117929403641567", + "reserves": [ + "21140222873255929978952147", + "59630507610681512151667755", + "47100639539659513007432399" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "2664917575004943872", + "2795120061234571264", + "191558670326326240" + ], + "expectedQty": "5667142401052936487", + "swapFee": "3402326836733802", + "reserves": [ + "21140220208338354974008275", + "59630504815561450917096491", + "47100639348100842681106159" + ], + "mAssetSupply": "127764554636096364481817125" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "2627267049295820651233280", + "expectedQty": "2621925748853106632973857", + "reserves": [ + "21140220208338354974008275", + "59630504815561450917096491", + "49727906397396663332339439" + ] + }, + { + "type": "redeemMasset", + "inputQty": "170563803740338514821120", + "expectedQtys": [ + "27646076748824157043693", + "77981662274828224155220", + "65031560848099193751315" + ], + "redemptionFee": "51169141122101554446", + "reserves": [ + "21112574131589530816964582", + "59552523153286622692941271", + "49662874836548564138588124" + ], + "mAssetSupply": "130215967750350254701524308" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "3151895366236060160", + "5727762669611490304", + "7209205532249245696" + ], + "expectedQty": "16084534566055472818", + "swapFee": "9656514648422337", + "reserves": [ + "21112570979694164580904422", + "59552517425523953081450967", + "49662867627343031889342428" + ], + "mAssetSupply": "130215951665815688646051490" + }, + { + "type": "redeemMasset", + "inputQty": "95249235421159207259340", + "expectedQtys": [ + "15438607413299766122180", + "43547890869881925300317", + "36316065772124633873512" + ], + "redemptionFee": "28574770626347762177", + "reserves": [ + "21097132372280864814782242", + "59508969534654071156150650", + "49626551561570907255468916" + ], + "mAssetSupply": "130120731005165155786554327" + }, + { + "type": "mintMulti", + "inputQtys": [ + "81752156220671033344", + "3781067182550033408", + "1047147771184666240" + ], + "expectedQty": "87425416045842958130", + "reserves": [ + "21097214124437085485815586", + "59508973315721253706184058", + "49626552608718678440135156" + ], + "mAssetSupply": "130120818430581201629512457" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "72152720630855770112", + "expectedQty": "72269089593733371833", + "swapFee": "43291632378513462", + "reserves": [ + "21097214124437085485815586", + "59508973315721253706184058", + "49626480339629084706763323" + ], + "mAssetSupply": "130120746321152203152255807" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "38532598776533354545152", + "expectedQty": "38107076516391742422692", + "swapFee": "23119559265920012727", + "reserves": [ + "21059107047920693743392894", + "59508973315721253706184058", + "49626480339629084706763323" + ], + "mAssetSupply": "130082236841934935717723382" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "46229259756169810935808", + "9765544477512093925376", + "73919379830518723903488" + ], + "expectedQty": "130203225663160584544068", + "swapFee": "78168836699916300506", + "reserves": [ + "21012877788164523932457086", + "59499207771243741612258682", + "49552560959798565982859835" + ], + "mAssetSupply": "129952033616271775133179314" + }, + { + "type": "redeemMasset", + "inputQty": "256328547273452", + "expectedQtys": [ + "41435169789210", + "117326136913700", + "97712402725530" + ], + "redemptionFee": "76898564182", + "reserves": [ + "21012877788123088762667876", + "59499207771126415475344982", + "49552560959700853580134305" + ], + "mAssetSupply": "129952033616015523484470044" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "5691414046192360751104", + "outputIndex": 0, + "expectedQty": "5606878987003164218879", + "swapFee": "3401887211568030989", + "reserves": [ + "21007270909136085598448997", + "59504899185172607836096086", + "49552560959700853580134305" + ], + "mAssetSupply": "129952037017902735052501033", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "32355710635576798478336", + "expectedQty": "32232794391690544372601", + "reserves": [ + "21007270909136085598448997", + "59537254895808184634574422", + "49552560959700853580134305" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "18413616337934467727360", + "76125053895652021370880", + "121538632752647219707904" + ], + "expectedQty": "215714739787515373109905", + "swapFee": "129506547801189937828", + "reserves": [ + "20988857292798151130721637", + "59461129841912532613203542", + "49431022326948206360426401" + ], + "mAssetSupply": "129768555072506910223763729" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "323364794647538231672832", + "expectedQty": "322129722684362175556072", + "reserves": [ + "20988857292798151130721637", + "59784494636560070844876374", + "49431022326948206360426401" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "169720965216621494272", + "41254404518928302080", + "102038572551351304192" + ], + "expectedQty": "314444192914253961654", + "reserves": [ + "20989027013763367752215909", + "59784535890964589773178454", + "49431124365520757711730593" + ], + "mAssetSupply": "130090999239384186653281455" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "730390888499081522446336", + "outputIndex": 1, + "expectedQty": "731070190402155904841660", + "swapFee": "437252472526271367777", + "reserves": [ + "20989027013763367752215909", + "59053465700562433868336794", + "50161515254019839234176929" + ], + "mAssetSupply": "130091436491856712924649232", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemMasset", + "inputQty": "14765985270599637375385", + "expectedQtys": [ + "2381637830939958194694", + "6700833148118238302534", + "5691858050776069822853" + ], + "redemptionFee": "4429795581179891212", + "reserves": [ + "20986645375932427794021215", + "59046764867414315630034260", + "50155823395969063164354076" + ], + "mAssetSupply": "130076674936381694467165059" + }, + { + "type": "mintMulti", + "inputQtys": [ + "432369070412131520", + "135136396674076213248", + "128188453490711085056" + ], + "expectedQty": "262961145253909869798", + "reserves": [ + "20986645808301498206152735", + "59046900003810989706247508", + "50155951584422553875439132" + ], + "mAssetSupply": "130076937897526948377034857" + }, + { + "type": "mintMulti", + "inputQtys": [ + "136474820182293159608320", + "359598857947511150084096", + "751083549592512708476928" + ], + "expectedQty": "1245518564497068597671634", + "reserves": [ + "21123120628483791365761055", + "59406498861758500856331604", + "50907035134015066583916060" + ], + "mAssetSupply": "131322456462024016974706491" + }, + { + "type": "mintMulti", + "inputQtys": [ + "647245628859471233024", + "296747822047157551104", + "123772170825697263616" + ], + "expectedQty": "1073321624903521809693", + "reserves": [ + "21123767874112650836994079", + "59406795609580548013882708", + "50907158906185892281179676" + ], + "mAssetSupply": "131323529783648920496516184" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "1153971887818836275101696", + "expectedQty": "1157493142659670851015752", + "swapFee": "692383132691301765061", + "reserves": [ + "21123767874112650836994079", + "58249302466920877162866956", + "50907158906185892281179676" + ], + "mAssetSupply": "130170250278962775523179549" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "10560522824449896448", + "7668853464321425408", + "6877172291384982528" + ], + "expectedQty": "25173237285011357322", + "swapFee": "15113010177113082", + "reserves": [ + "21123757313589826387097631", + "58249294798067412841441548", + "50907152029013600896197148" + ], + "mAssetSupply": "130170225105725490511822227" + }, + { + "type": "redeemMasset", + "inputQty": "5262180599178434759884", + "expectedQtys": [ + "853679700709552074121", + "2354043355618634048774", + "2057323498984971212745" + ], + "redemptionFee": "1578654179753530427", + "reserves": [ + "21122903633889116835023510", + "58246940754711794207392774", + "50905094705514615924984403" + ], + "mAssetSupply": "130164964503780491830592770" + }, + { + "type": "redeemMasset", + "inputQty": "23828356760243994624", + "expectedQtys": [ + "3865656847783106210", + "10659646481065346095", + "9316031135970721940" + ], + "redemptionFee": "7148507028073198", + "reserves": [ + "21122899768232269051917300", + "58246930095065313142046679", + "50905085389483479954262463" + ], + "mAssetSupply": "130164940682572238614671344" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "1355613714014511038464", + "expectedQty": "1352331222240051892919", + "reserves": [ + "21122899768232269051917300", + "58246930095065313142046679", + "50906441003197494465300927" + ] + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "17657427613605020303360", + "expectedQty": "17710135369888500248767", + "swapFee": "10594456568163012182", + "reserves": [ + "21122899768232269051917300", + "58229219959695424641797912", + "50906441003197494465300927" + ], + "mAssetSupply": "130148646180637441809273085" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "3706635654554910195712", + "expectedQty": "3693389762523741879696", + "reserves": [ + "21122899768232269051917300", + "58232926595349979551993624", + "50906441003197494465300927" + ] + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "4760992645704861089792", + "expectedQty": "4743976676394685055121", + "reserves": [ + "21122899768232269051917300", + "58237687587995684413083416", + "50906441003197494465300927" + ] + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "1682073826260469415936", + "expectedQty": "1676061420747414188248", + "reserves": [ + "21122899768232269051917300", + "58239369661821944882499352", + "50906441003197494465300927" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "122752721482129774477312", + "86997919811008645300224", + "82711017204999641890816" + ], + "expectedQty": "293233401467911191790100", + "reserves": [ + "21245652489714398826394612", + "58326367581632953527799576", + "50989152020402494107191743" + ], + "mAssetSupply": "130451993009965018842186250" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "852652292465368", + "expectedQty": "861513466787530", + "reserves": [ + "21245652490567051118859980", + "58326367581632953527799576", + "50989152020402494107191743" + ] + }, + { + "type": "redeemMasset", + "inputQty": "81288423158096425543270", + "expectedQtys": [ + "13234811077994152566630", + "36333949082114145822210", + "31763288715974825160788" + ], + "redemptionFee": "24386526947428927662", + "reserves": [ + "21232417679489056966293350", + "58290033632550839381977366", + "50957388731686519282030955" + ], + "mAssetSupply": "130370728974195383312358172" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "906129764634314928029696", + "436395894385746229854208", + "811809859847942676938752" + ], + "expectedQty": "2160499546828375037952790", + "swapFee": "1297077974881954195288", + "reserves": [ + "20326287914854742038263654", + "57853637738165093152123158", + "50145578871838576605092203" + ], + "mAssetSupply": "128210229427367008274405382" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "28166102638474186752", + "expectedQty": "28254785227242325326", + "swapFee": "16899661583084512", + "reserves": [ + "20326287914854742038263654", + "57853609483379865909797832", + "50145578871838576605092203" + ], + "mAssetSupply": "128210201278164031383303142" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "1079755343885419751145472", + "outputIndex": 1, + "expectedQty": "1080257411266677998379817", + "swapFee": "646188802783347018308", + "reserves": [ + "20326287914854742038263654", + "56773352072113187911418015", + "51225334215723996356237675" + ], + "mAssetSupply": "128210847466966814730321450", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemMasset", + "inputQty": "19383457235778943320064", + "expectedQtys": [ + "3072092121857554313283", + "8580660097051989954948", + "7742138965208616998394" + ], + "redemptionFee": "5815037170733682996", + "reserves": [ + "20323215822732884483950371", + "56764771412016135921463067", + "51217592076758787739239281" + ], + "mAssetSupply": "128191469824768206520684382" + }, + { + "type": "redeemMasset", + "inputQty": "22336095005563595574476", + "expectedQtys": [ + "3540056898260352267296", + "9887732451795501741457", + "8921481311082850587578" + ], + "redemptionFee": "6700828501669078672", + "reserves": [ + "20319675765834624131683075", + "56754883679564340419721610", + "51208670595447704888651703" + ], + "mAssetSupply": "128169140430591144594188578" + }, + { + "type": "redeemMasset", + "inputQty": "818254614397324556343705", + "expectedQtys": [ + "129685510896559833669064", + "362224583240381530691283", + "326827193752296500558206" + ], + "redemptionFee": "245476384319197366903", + "reserves": [ + "20189990254938064298014011", + "56392659096323958889030327", + "50881843401695408388093497" + ], + "mAssetSupply": "127351131292578139235211776" + }, + { + "type": "redeemMasset", + "inputQty": "26481632802089965977", + "expectedQtys": [ + "4197084891288531995", + "11722877251754877216", + "10577291691853765789" + ], + "redemptionFee": "7944489840626989", + "reserves": [ + "20189986057853173009482016", + "56392647373446707134153111", + "50881832824403716534327708" + ], + "mAssetSupply": "127351104818889826985872788" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "2996425469841951344820224", + "outputIndex": 0, + "expectedQty": "2945245095226184226562237", + "swapFee": "1792695049470492670832", + "reserves": [ + "17244740962626988782919779", + "56392647373446707134153111", + "53878258294245667879147932" + ], + "mAssetSupply": "127352897513939297478543620", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemBassets", + "inputQtys": [ + "132240682745586490802176", + "16524350736521737797632", + "2968937018574457274368" + ], + "expectedQty": "153822882457600302614104", + "swapFee": "92349138957934942533", + "reserves": [ + "17112500279881402292117603", + "56376123022710185396355479", + "53875289357227093421873564" + ], + "mAssetSupply": "127199074631481697175929516" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "52864381854818025472", + "expectedQty": "52638757252302135269", + "reserves": [ + "17112500279881402292117603", + "56376175887092040214380951", + "53875289357227093421873564" + ] + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "100956996395367439269888", + "outputIndex": 0, + "expectedQty": "98859766532495234071119", + "swapFee": "60340757814280599225", + "reserves": [ + "17013640513348907058046484", + "56376175887092040214380951", + "53976246353622460861143452" + ], + "mAssetSupply": "127199187610996763758664010", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "1642810794804797", + "expectedQty": "1648907605881012", + "swapFee": "985686476882", + "reserves": [ + "17013640513348907058046484", + "56376175885443132608499939", + "53976246353622460861143452" + ], + "mAssetSupply": "127199187609354938650336095" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "89649198166048759611392", + "829762610956653428736", + "16172007902302898749440" + ], + "expectedQty": "108095316085548083483328", + "swapFee": "64896127327725485381", + "reserves": [ + "16923991315182858298435092", + "56375346122832175955071203", + "53960074345720157962394012" + ], + "mAssetSupply": "127091092293269390566852767" + }, + { + "type": "redeemMasset", + "inputQty": "5092938961810978609561", + "expectedQtys": [ + "677993991138127813095", + "2258459320132272736462", + "2161700835602776116965" + ], + "redemptionFee": "1527881688543293582", + "reserves": [ + "16923313321191720170621997", + "56373087663512043682334741", + "53957912644884555186277047" + ], + "mAssetSupply": "127086000882189268131536788" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "715757466473636697210880", + "expectedQty": "712629011026129587188889", + "reserves": [ + "16923313321191720170621997", + "57088845129985680379545621", + "53957912644884555186277047" + ] + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "5007824288415959453007872", + "expectedQty": "4986681150667059412119913", + "reserves": [ + "16923313321191720170621997", + "57088845129985680379545621", + "58965736933300514639284919" + ] + }, + { + "type": "redeemMasset", + "inputQty": "6918150114383484", + "expectedQtys": [ + "881444624123170", + "2973451751567680", + "3071208979049904" + ], + "redemptionFee": "2075445034315", + "reserves": [ + "16923313320310275546498827", + "57088845127012228627977941", + "58965736930229305660235015" + ], + "mAssetSupply": "132785311036966382461496421" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "35347768217932023201792", + "expectedQty": "35476913355861901740948", + "swapFee": "21208660930759213921", + "reserves": [ + "16923313320310275546498827", + "57053368213656366726236993", + "58965736930229305660235015" + ], + "mAssetSupply": "132749984477409381197508550" + }, + { + "type": "redeemMasset", + "inputQty": "99325452037410232729", + "expectedQtys": [ + "12658468303420807235", + "42675346101949036289", + "44105778684801449532" + ], + "redemptionFee": "29797635611223069", + "reserves": [ + "16923300661841972125691592", + "57053325538310264777200704", + "58965692824450620858785483" + ], + "mAssetSupply": "132749885181754979398498890" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "29807056542208742129664", + "15585071898277198168064", + "25780661259260884156416" + ], + "expectedQty": "71549390130372025512528", + "swapFee": "42955407322616785378", + "reserves": [ + "16893493605299763383561928", + "57037740466411987579032640", + "58939912163191359974629067" + ], + "mAssetSupply": "132678335791624607372986362" + }, + { + "type": "redeemMasset", + "inputQty": "7626899062499038986240", + "expectedQtys": [ + "970816496008258392262", + "3277781412984882274239", + "3387093299834273008840" + ], + "redemptionFee": "2288069718749711695", + "reserves": [ + "16892522788803755125169666", + "57034462684999002696758401", + "58936525069891525701620227" + ], + "mAssetSupply": "132670711180631827083711817" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "5443640482386527911936", + "expectedQty": "5418829549169260672368", + "reserves": [ + "16892522788803755125169666", + "57034462684999002696758401", + "58941968710373912229532163" + ] + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "4169577257084939164188672", + "expectedQty": "4232209499909516249387919", + "reserves": [ + "21062100045888694289358338", + "57034462684999002696758401", + "58941968710373912229532163" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "6458088425412374822912", + "27597070507645872373760", + "8600528086584300404736" + ], + "expectedQty": "42616459189522879683275", + "reserves": [ + "21068558134314106664181250", + "57062059755506648569132161", + "58950569238460496529936899" + ], + "mAssetSupply": "136950955969280035473455379" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "56983732187364458496", + "expectedQty": "56804244732866734148", + "reserves": [ + "21068558134314106664181250", + "57062116739238835933590657", + "58950569238460496529936899" + ] + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "2770295491844697455853568", + "outputIndex": 2, + "expectedQty": "2768266023009579613217631", + "swapFee": "1656678010192782174822", + "reserves": [ + "21068558134314106664181250", + "59832412231083533389444225", + "56182303215450916916719268" + ], + "mAssetSupply": "136952669451534961122364349", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mintMulti", + "inputQtys": [ + "772187345101391828877312", + "15326112205954965569536", + "473071684161179574337536" + ], + "expectedQty": "1268063110143387980338909", + "reserves": [ + "21840745479415498493058562", + "59847738343289488355013761", + "56655374899612096491056804" + ], + "mAssetSupply": "138220732561678349102703258" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "632439330450830655488", + "783497793125032394752", + "89175769430717251584" + ], + "expectedQty": "1509277610113889523088", + "swapFee": "906110232207658308", + "reserves": [ + "21840113040085047662403074", + "59846954845496363322619009", + "56655285723842665773805220" + ], + "mAssetSupply": "138219223284068235213180170" + }, + { + "type": "mintMulti", + "inputQtys": [ + "286428987940171153408", + "975881145259318050816", + "1427344641207568433152" + ], + "expectedQty": "2685400987855242459736", + "reserves": [ + "21840399469072987833556482", + "59847930726641622640669825", + "56656713068483873342238372" + ], + "mAssetSupply": "138221908685056090455639906" + }, + { + "type": "mintMulti", + "inputQtys": [ + "220582437810161408", + "661250539882156160", + "757005988019615360" + ], + "expectedQty": "1636865049848795138", + "reserves": [ + "21840399689655425643717890", + "59847931387892162522825985", + "56656713825489861361853732" + ], + "mAssetSupply": "138221910321921140304435044" + }, + { + "type": "mintMulti", + "inputQtys": [ + "453599503209025344", + "245566220242326720", + "795207647059562496" + ], + "expectedQty": "1496301689337711166", + "reserves": [ + "21840400143254928852743234", + "59847931633458382765152705", + "56656714620697508421416228" + ], + "mAssetSupply": "138221911818222829642146210" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "5479801489608514994176", + "41220510918834969903104", + "260139486731352691179520" + ], + "expectedQty": "306007395662353453275294", + "swapFee": "183714666197130350175", + "reserves": [ + "21834920341765320337749058", + "59806711122539547795249601", + "56396575133966155730236708" + ], + "mAssetSupply": "137915904422560476188870916" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "2346416565534603870208", + "expectedQty": "2352984150076840741673", + "swapFee": "1407849939320762322", + "reserves": [ + "21834920341765320337749058", + "59804358138389470954507928", + "56396575133966155730236708" + ], + "mAssetSupply": "137913559413844880905763030" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "2799386633038547386368", + "884156887841779482624", + "5201504664182109241344" + ], + "expectedQty": "8898215052739580031633", + "swapFee": "5342134312231086670", + "reserves": [ + "21832120955132281790362690", + "59803473981501629175025304", + "56391373629301973620995364" + ], + "mAssetSupply": "137904661198792141325731397" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "2994216394573886259200", + "expectedQty": "2959461396103599776787", + "swapFee": "1796529836744331755", + "reserves": [ + "21829161493736178190585903", + "59803473981501629175025304", + "56391373629301973620995364" + ], + "mAssetSupply": "137901668778927404183803952" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "1859887899539072545193984", + "expectedQty": "1836343387009526928102472", + "swapFee": "1115932739723443527116", + "reserves": [ + "19992818106726651262483431", + "59803473981501629175025304", + "56391373629301973620995364" + ], + "mAssetSupply": "136042896812128055082137084" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "5740910685881659031552", + "9572234961448706506752", + "25902874757713610407936" + ], + "expectedQty": "41171510387706615491354", + "swapFee": "24717736874748818585", + "reserves": [ + "19987077196040769603451879", + "59793901746540180468518552", + "56365470754544260010587428" + ], + "mAssetSupply": "136001725301740348466645730" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "39861574334957372833792", + "outputIndex": 1, + "expectedQty": "40523382961821926986018", + "swapFee": "24236385158832659055", + "reserves": [ + "20026938770375726976285671", + "59753378363578358541532534", + "56365470754544260010587428" + ], + "mAssetSupply": "136001749538125507299304785", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "70160903657820572876800", + "expectedQty": "69931126567734004854767", + "reserves": [ + "20026938770375726976285671", + "59753378363578358541532534", + "56435631658202080583464228" + ] + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "87631866114460251848704", + "outputIndex": 0, + "expectedQty": "86092179575412476346276", + "swapFee": "52379755548738704880", + "reserves": [ + "19940846590800314499939395", + "59841010229692818793381238", + "56435631658202080583464228" + ], + "mAssetSupply": "136071733044448790042864432", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mintMulti", + "inputQtys": [ + "22495575606791776501760", + "7928138790956858081280", + "24903628827255585636352" + ], + "expectedQty": "55517930812731397577600", + "reserves": [ + "19963342166407106276441155", + "59848938368483775651462518", + "56460535287029336169100580" + ], + "mAssetSupply": "136127250975261521440442032" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "2139776078442987784241152", + "expectedQty": "2106699660169951438627462", + "swapFee": "1283865647065792670544", + "reserves": [ + "17856642506237154837813693", + "59848938368483775651462518", + "56460535287029336169100580" + ], + "mAssetSupply": "133988758762465599448871424" + }, + { + "type": "mintMulti", + "inputQtys": [ + "540893943267651968", + "517235734940535296", + "216349024982921216" + ], + "expectedQty": "1280529122779793753", + "reserves": [ + "17856643047131098105465661", + "59848938885719510591997814", + "56460535503378361152021796" + ], + "mAssetSupply": "133988760042994722228665177" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "31779982603861402583040", + "43420118749848568594432", + "12083263412520873885696" + ], + "expectedQty": "87584672381493990237916", + "swapFee": "52582352840600754595", + "reserves": [ + "17824863064527236702882621", + "59805518766969662023403382", + "56448452239965840278136100" + ], + "mAssetSupply": "133901175370613228238427261" + }, + { + "type": "redeemMasset", + "inputQty": "14547149786127340", + "expectedQtys": [ + "1935928955914915", + "6495378678947529", + "6130773224586817" + ], + "redemptionFee": "4364144935838", + "reserves": [ + "17824863062591307746967706", + "59805518760474283344455853", + "56448452233835067053549283" + ], + "mAssetSupply": "133901175356070442597235759" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "2874525543565749125120", + "expectedQty": "2923274760328455346335", + "reserves": [ + "17827737588134873496092826", + "59805518760474283344455853", + "56448452233835067053549283" + ] + }, + { + "type": "redeemMasset", + "inputQty": "67894286773045820810854", + "expectedQtys": [ + "9036604706185855484673", + "30314493334615474576818", + "28612848186226192670664" + ], + "redemptionFee": "20368286031913746243", + "reserves": [ + "17818700983428687640608153", + "59775204267139667869879035", + "56419839385648840860878619" + ], + "mAssetSupply": "133836224712343757145517483" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "446776926990054925008896", + "expectedQty": "438875723618226033485782", + "swapFee": "268066156194032955005", + "reserves": [ + "17379825259810461607122371", + "59775204267139667869879035", + "56419839385648840860878619" + ], + "mAssetSupply": "133389715851509896253463592" + }, + { + "type": "redeemMasset", + "inputQty": "26485211758243996", + "expectedQtys": [ + "3449818127912676", + "11865112577242938", + "11199087549897245" + ], + "redemptionFee": "7945563527473", + "reserves": [ + "17379825256360643479209695", + "59775204255274555292636097", + "56419839374449753310981374" + ], + "mAssetSupply": "133389715825032630058747069" + }, + { + "type": "mintMulti", + "inputQtys": [ + "3147942266031683665920", + "543131349648490627072", + "3702563016583256473600" + ], + "expectedQty": "7432587562213256351804", + "reserves": [ + "17382973198626675162875615", + "59775747386624203783263169", + "56423541937466336567454974" + ], + "mAssetSupply": "133397148412594843315098873" + }, + { + "type": "redeemMasset", + "inputQty": "715348327970812047497625", + "expectedQtys": [ + "93189026125999929440571", + "320454022523223035277274", + "302483059925986114643667" + ], + "redemptionFee": "214604498391243614249", + "reserves": [ + "17289784172500675233435044", + "59455293364100980747985895", + "56121058877540350452811307" + ], + "mAssetSupply": "132682014689122422511215497" + }, + { + "type": "mintMulti", + "inputQtys": [ + "183941508495446278144", + "51372110992388923392", + "182661939519047565312" + ], + "expectedQty": "420296353987110598242", + "reserves": [ + "17289968114009170679713188", + "59455344736211973136909287", + "56121241539479869500376619" + ], + "mAssetSupply": "132682434985476409621813739" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "203271268400090908196864", + "expectedQty": "199548366029875833913152", + "swapFee": "121962761040054544918", + "reserves": [ + "17090419747979294845800036", + "59455344736211973136909287", + "56121241539479869500376619" + ], + "mAssetSupply": "132479285679837358768161793" + }, + { + "type": "redeemMasset", + "inputQty": "138639594635598146777907", + "expectedQtys": [ + "17879761588364077919042", + "62201362208389166177108", + "58713269396881657462865" + ], + "redemptionFee": "41591878390679444033", + "reserves": [ + "17072539986390930767880994", + "59393143374003583970732179", + "56062528270082987842913754" + ], + "mAssetSupply": "132340687677080151300827919" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "5746117350452307647528960", + "expectedQty": "5590631614140816913578855", + "swapFee": "3447670410271384588517", + "reserves": [ + "11481908372250113854302139", + "59393143374003583970732179", + "56062528270082987842913754" + ], + "mAssetSupply": "126598017997038115037887476" + }, + { + "type": "mintMulti", + "inputQtys": [ + "1535774664695837641146368", + "392215091978939538604032", + "823772925782346828873728" + ], + "expectedQty": "2799285665336560103674884", + "reserves": [ + "13017683036945951495448507", + "59785358465982523509336211", + "56886301195865334671787482" + ], + "mAssetSupply": "129397303662374675141562360" + }, + { + "type": "mintMulti", + "inputQtys": [ + "8307112499758147567616", + "34343283820057321275392", + "44428692034700294750208" + ], + "expectedQty": "86869713046183432158889", + "reserves": [ + "13025990149445709643016123", + "59819701749802580830611603", + "56930729887900034966537690" + ], + "mAssetSupply": "129484173375420858573721249" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "221605365048346214400", + "expectedQty": "222766522202676265359", + "swapFee": "132963219029007728", + "reserves": [ + "13025990149445709643016123", + "59819701749802580830611603", + "56930507121377832290272331" + ], + "mAssetSupply": "129483951903019029256514577" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "275184511297189088067584", + "expectedQty": "273579929750241227577453", + "reserves": [ + "13025990149445709643016123", + "59819701749802580830611603", + "57205691632675021378339915" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "1228208913357830625427456", + "1786931915329055255166976", + "447553437043024109502464" + ], + "expectedQty": "3486156801437892665689772", + "reserves": [ + "14254199062803540268443579", + "61606633665131636085778579", + "57653245069718045487842379" + ], + "mAssetSupply": "133243688634207163149781802" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "1826562381923504569188352", + "expectedQty": "1768906189982326656594999", + "swapFee": "1095937429154102741513", + "reserves": [ + "12485292872821213611848580", + "61606633665131636085778579", + "57653245069718045487842379" + ], + "mAssetSupply": "131418222189712812683334963" + }, + { + "type": "mintMulti", + "inputQtys": [ + "69701857239550500864", + "38681253784456142848", + "199575338893040615424" + ], + "expectedQty": "309001616239461023904", + "reserves": [ + "12485362574678453162349444", + "61606672346385420541921427", + "57653444645056938528457803" + ], + "mAssetSupply": "131418531191329052144358867" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "568066040086135807410176", + "expectedQty": "587890611888994819700441", + "reserves": [ + "13053428614764588969759620", + "61606672346385420541921427", + "57653444645056938528457803" + ] + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "6538578135144854370385920", + "expectedQty": "6683953274625372952766157", + "reserves": [ + "19592006749909443340145540", + "61606672346385420541921427", + "57653444645056938528457803" + ] + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "5465289451185182343168", + "expectedQty": "5481003402894094502491", + "swapFee": "3279173670711109405", + "reserves": [ + "19592006749909443340145540", + "61606672346385420541921427", + "57647963641654044433955312" + ], + "mAssetSupply": "138684913067565905445591702" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "747403908158299176960", + "expectedQty": "749552580890564432330", + "swapFee": "448442344894979506", + "reserves": [ + "19592006749909443340145540", + "61606672346385420541921427", + "57647214089073153869522982" + ], + "mAssetSupply": "138684166112100092041394248" + }, + { + "type": "mintMulti", + "inputQtys": [ + "43540063426087210713088", + "60934047571573873836032", + "28382115380930281472000" + ], + "expectedQty": "133150673616615872256781", + "reserves": [ + "19635546813335530550858628", + "61667606393956994415757459", + "57675596204454084150994982" + ], + "mAssetSupply": "138817316785716707913651029" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "1330859037402128518742016", + "601848148180417086750720", + "227575027377965268729856" + ], + "expectedQty": "2177770916121778546518567", + "swapFee": "1307447017883797406354", + "reserves": [ + "18304687775933402032116612", + "61065758245776577329006739", + "57448021177076118882265126" + ], + "mAssetSupply": "136639545869594929367132462" + }, + { + "type": "redeemMasset", + "inputQty": "6178854539713878949888", + "expectedQtys": [ + "827491571651823498230", + "2760571547761963241594", + "2597026177884746106721" + ], + "redemptionFee": "1853656361914163684", + "reserves": [ + "18303860284361750208618382", + "61062997674228815365765145", + "57445424150898234136158405" + ], + "mAssetSupply": "136633368868711577402346258" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "650970401099038890917888", + "expectedQty": "648102514556687113508089", + "reserves": [ + "18303860284361750208618382", + "61713968075327854256683033", + "57445424150898234136158405" + ] + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "1226318470761892890542080", + "outputIndex": 0, + "expectedQty": "1198707086926255324902869", + "swapFee": "732956165391045418178", + "reserves": [ + "17105153197435494883715513", + "61713968075327854256683033", + "58671742621660127026700485" + ], + "mAssetSupply": "137282204339433655561272525", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mintMulti", + "inputQtys": [ + "16817351430680", + "20646373641957", + "9710800358696" + ], + "expectedQty": "47366930045659", + "reserves": [ + "17105153197452312235146193", + "61713968075348500630324990", + "58671742621669837827059181" + ], + "mAssetSupply": "137282204339481022491318184" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "947649526747999185666048", + "expectedQty": "951107211023830498775576", + "swapFee": "568589716048799511399", + "reserves": [ + "17105153197452312235146193", + "61713968075348500630324990", + "57720635410646007328283605" + ], + "mAssetSupply": "136335123402449072105163535" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "37066905179409837195264", + "expectedQty": "37223839566487058116610", + "swapFee": "22240143107645902317", + "reserves": [ + "17105153197452312235146193", + "61676744235782013572208380", + "57720635410646007328283605" + ], + "mAssetSupply": "136298078737412769913870588" + }, + { + "type": "mintMulti", + "inputQtys": [ + "190977139080000557809664", + "101832211482964412858368", + "15762353015190917742592" + ], + "expectedQty": "311700422269889017044544", + "reserves": [ + "17296130336532312792955857", + "61778576447264977985066748", + "57736397763661198246026197" + ], + "mAssetSupply": "136609779159682658930915132" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "155592417539699156975616", + "149921185025289617408000", + "26528709045152026460160" + ], + "expectedQty": "334207934354176829969665", + "swapFee": "200645147701126774046", + "reserves": [ + "17140537918992613635980241", + "61628655262239688367658748", + "57709869054616046219566037" + ], + "mAssetSupply": "136275571225328482100945467" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "267104419600912592404480", + "266623459659431888814080", + "43233388866515326992384" + ], + "expectedQty": "580736976220254690006283", + "swapFee": "348651376558087666603", + "reserves": [ + "16873433499391701043575761", + "61362031802580256478844668", + "57666635665749530892573653" + ], + "mAssetSupply": "135694834249108227410939184" + }, + { + "type": "mintMulti", + "inputQtys": [ + "234399052257603223552", + "727390502283907956736", + "161084599295676973056" + ], + "expectedQty": "1123322274959799354904", + "reserves": [ + "16873667898443958646799313", + "61362759193082540386801404", + "57666796750348826569546709" + ], + "mAssetSupply": "135695957571383187210294088" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "233490316320239639330816", + "outputIndex": 2, + "expectedQty": "238921674814426552284581", + "swapFee": "142842424475926405568", + "reserves": [ + "17107158214764198286130129", + "61362759193082540386801404", + "57427875075534400017262128" + ], + "mAssetSupply": "135696100413807663136699656", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mintMulti", + "inputQtys": [ + "130358645870626111488", + "554345361315130507264", + "511931416724779433984" + ], + "expectedQty": "1194375756918737470208", + "reserves": [ + "17107288573410068912241617", + "61363313538443855517308668", + "57428387006951124796696112" + ], + "mAssetSupply": "135697294789564581874169864" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "839086644678750720", + "expectedQty": "855255648599270118", + "reserves": [ + "17107289412496713590992337", + "61363313538443855517308668", + "57428387006951124796696112" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "1028088448268909312", + "407130734423440832", + "1127594329826278912" + ], + "expectedQty": "2576005469941488553", + "reserves": [ + "17107290440585161859901649", + "61363313945574589940749500", + "57428388134545454622975024" + ], + "mAssetSupply": "135697298220825700414928535" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "523630569558222438400", + "expectedQty": "521127131739205347887", + "reserves": [ + "17107290440585161859901649", + "61363837576144148163187900", + "57428388134545454622975024" + ] + }, + { + "type": "redeemMasset", + "inputQty": "81022015334881625846579", + "expectedQtys": [ + "10211301367472545311118", + "36627930105640425003605", + "34278869603968061768672" + ], + "redemptionFee": "24306604600464487753", + "reserves": [ + "17097079139217689314590531", + "61327209646038507738184295", + "57394109264941486561206352" + ], + "mAssetSupply": "135616821639227158458917596" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "41875009530437771264", + "32120152391105306624", + "29584073985942294528" + ], + "expectedQty": "104110008656411910845", + "swapFee": "62503507298226082", + "reserves": [ + "17097037264208158876819267", + "61327177525886116632877671", + "57394079680867500618911824" + ], + "mAssetSupply": "135616717529218502047006751" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "1207192072390255103180800", + "expectedQty": "1228898635600455958822652", + "reserves": [ + "18304229336598413980000067", + "61327177525886116632877671", + "57394079680867500618911824" + ] + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "32279850861951", + "expectedQty": "32382971123866", + "swapFee": "19367910517", + "reserves": [ + "18304229336598413980000067", + "61327177525886116632877671", + "57394079680835117647787958" + ], + "mAssetSupply": "136845616164786697522877969" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "18984074306144190464", + "expectedQty": "19044720248455899124", + "swapFee": "11390444583686514", + "reserves": [ + "18304229336598413980000067", + "61327177525886116632877671", + "57394060636114869191888834" + ], + "mAssetSupply": "136845597192102835962374019" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "1692046793219740270592", + "expectedQty": "1684601874350381333769", + "reserves": [ + "18304229336598413980000067", + "61328869572679336373148263", + "57394060636114869191888834" + ] + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "13010407396645226992893952", + "hardLimitError": true + }, + { + "type": "redeemBassets", + "inputQtys": [ + "754160357153498464256000", + "2226548203580648595652608", + "3822435463239691208228864" + ], + "expectedQty": "6791702633027594401604482", + "swapFee": "4077468060652948410008", + "reserves": [ + "17550068979444915515744067", + "59102321369098687777495655", + "53571625172875177983659970" + ], + "mAssetSupply": "130055579160949591942103306" + }, + { + "type": "redeemMasset", + "inputQty": "35703512626696715606425", + "expectedQtys": [ + "4816487948579091787034", + "16220199415781210179023", + "14702340334568339709418" + ], + "redemptionFee": "10711053788009014681", + "reserves": [ + "17545252491496336423957033", + "59086101169682906567316632", + "53556922832540609643950552" + ], + "mAssetSupply": "130019886359376683235511562" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "1855564912493902367293440", + "expectedQty": "1820970596806265197637375", + "swapFee": "1113338947496341420376", + "reserves": [ + "15724281894690071226319658", + "59086101169682906567316632", + "53556922832540609643950552" + ], + "mAssetSupply": "128165434785830277209638498" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "59675188336074301440", + "expectedQty": "59888287464565272919", + "swapFee": "35805113001644580", + "reserves": [ + "15724281894690071226319658", + "59086101169682906567316632", + "53556862944253145078677633" + ], + "mAssetSupply": "128165375146447054136981638" + }, + { + "type": "redeemMasset", + "inputQty": "80211697314643259791769", + "expectedQtys": [ + "9838015587160796841470", + "36967664926447031758464", + "33508255319622791603336" + ], + "redemptionFee": "24063509194392977937", + "reserves": [ + "15714443879102910429478188", + "59049133504756459535558168", + "53523354688933522287074297" + ], + "mAssetSupply": "128085187512641605270167806" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "3106982108032388825088", + "47788785250541215154176", + "24519306898670413152256" + ], + "expectedQty": "75132556149869692424590", + "swapFee": "45106597648510922007", + "reserves": [ + "15711336896994878040653100", + "59001344719505918320403992", + "53498835382034851873922041" + ], + "mAssetSupply": "128010054956491735577743216" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "25652407627313932402688", + "outputIndex": 0, + "expectedQty": "24991843746837348547555", + "swapFee": "15312729129238128009", + "reserves": [ + "15686345053248040692105545", + "59026997127133232252806680", + "53498835382034851873922041" + ], + "mAssetSupply": "128010070269220864815871225", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemBassets", + "inputQtys": [ + "529351198044550751846400", + "497503999030108581003264", + "895303109920684872040448" + ], + "expectedQty": "1926952950527342769468154", + "swapFee": "1156865889850315851191", + "reserves": [ + "15156993855203489940259145", + "58529493128103123671803416", + "52603532272114167001881593" + ], + "mAssetSupply": "126083117318693522046403071" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "736882048936119296", + "outputIndex": 0, + "expectedQty": "717853206151604172", + "swapFee": "440253300277585", + "reserves": [ + "15156993137350283788654973", + "58529493128103123671803416", + "52603533008996215938000889" + ], + "mAssetSupply": "126083117319133775346680656", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemMasset", + "inputQty": "582119430220180828979", + "expectedQtys": [ + "69958083544023275092", + "270146666488560969363", + "242795013734332350184" + ], + "redemptionFee": "174635829066054248", + "reserves": [ + "15156923179266739765379881", + "58529222981436635110834053", + "52603290213982481605650705" + ], + "mAssetSupply": "126082535374339384231905925" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "25232445816759832805376", + "expectedQty": "25351613495272747875310", + "swapFee": "15139467490055899683", + "reserves": [ + "15156923179266739765379881", + "58503871367941362362958743", + "52603290213982481605650705" + ], + "mAssetSupply": "126057318067990114455000232" + }, + { + "type": "mintMulti", + "inputQtys": [ + "41403494407690810032128", + "19156577385514016964608", + "77968844226063511846912" + ], + "expectedQty": "138986599911252125508772", + "reserves": [ + "15198326673674430575412009", + "58523027945326876379923351", + "52681259058208545117497617" + ], + "mAssetSupply": "126196304667901366580509004" + }, + { + "type": "mintMulti", + "inputQtys": [ + "246902817992354650128384", + "558520883406629173723136", + "584573760278083812720640" + ], + "expectedQty": "1389854326886885037543091", + "reserves": [ + "15445229491666785225540393", + "59081548828733505553646487", + "53265832818486628930218257" + ], + "mAssetSupply": "127586158994788251618052095" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "954913351567954528960512", + "expectedQty": "950823101826768351543512", + "reserves": [ + "15445229491666785225540393", + "59081548828733505553646487", + "54220746170054583459178769" + ] + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "199306773837035040", + "outputIndex": 0, + "expectedQty": "193972550670350869", + "swapFee": "118962108238213", + "reserves": [ + "15445229297694234555189524", + "59081549028040279390681527", + "54220746170054583459178769" + ], + "mAssetSupply": "128536982096733982077833820", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "126829435727073168", + "expectedQty": "127307428973529116", + "swapFee": "76097661436243", + "reserves": [ + "15445229297694234555189524", + "59081549028040279390681527", + "54220746042747154485649653" + ], + "mAssetSupply": "128536981969980644012196895" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "331832372672012891455488", + "expectedQty": "338829340589483339980251", + "reserves": [ + "15777061670366247446645012", + "59081549028040279390681527", + "54220746042747154485649653" + ] + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "33829309304245890056192", + "expectedQty": "33123931372026749067474", + "swapFee": "20297585582547534033", + "reserves": [ + "15743937738994220697577538", + "59081549028040279390681527", + "54220746042747154485649653" + ], + "mAssetSupply": "128842002298851464009654987" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "10659616399227377664", + "expectedQty": "10707667216768718338", + "swapFee": "6395769839536426", + "reserves": [ + "15743937738994220697577538", + "59081538320373062621963189", + "54220746042747154485649653" + ], + "mAssetSupply": "128841991645630834621813749" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "96911851136577355776", + "expectedQty": "96500536342056778154", + "reserves": [ + "15743937738994220697577538", + "59081538320373062621963189", + "54220842954598291063005429" + ] + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "245012838360720686972928", + "outputIndex": 2, + "expectedQty": "244648629231577234717567", + "swapFee": "146257773138438913201", + "reserves": [ + "15743937738994220697577538", + "59326551158733783308936117", + "53976194325366713828287862" + ], + "mAssetSupply": "128842234403940315117505104", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemBassets", + "inputQtys": [ + "9271685325962592256", + "37183459580376121344", + "27906680236275204096" + ], + "expectedQty": "74246210158999435738", + "swapFee": "44574470777866381", + "reserves": [ + "15743928467308894734985282", + "59326513975274202932814773", + "53976166418686477553083766" + ], + "mAssetSupply": "128842160157730156118069366" + }, + { + "type": "redeemMasset", + "inputQty": "194851248990309633228", + "expectedQtys": [ + "23802797196795285641", + "89694067365619154936", + "81605029227122374233" + ], + "redemptionFee": "58455374697092889", + "reserves": [ + "15743904664511697939699641", + "59326424281206837313659837", + "53976084813657250430709533" + ], + "mAssetSupply": "128841965364936540505529027" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "226999603219182615789568", + "expectedQty": "222190169637797307995206", + "swapFee": "136199761931509569473", + "reserves": [ + "15521714494873900631704435", + "59326424281206837313659837", + "53976084813657250430709533" + ], + "mAssetSupply": "128615101961479289399308932" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "34851878424949551104", + "10039479766242492416", + "94013842284343263232" + ], + "expectedQty": "139194061788475196140", + "swapFee": "83566577019296695", + "reserves": [ + "15521679642995475682153331", + "59326414241727071071167421", + "53975990799814966087446301" + ], + "mAssetSupply": "128614962767417500924112792" + }, + { + "type": "redeemMasset", + "inputQty": "68392643574877134625177", + "expectedQtys": [ + "8251374568407635508865", + "31538111658548034892838", + "28693809435191133242878" + ], + "redemptionFee": "20517793072463140387", + "reserves": [ + "15513428268427068046644466", + "59294876130068523036274583", + "53947296990379774954203423" + ], + "mAssetSupply": "128546590641635696252628002" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "22393150127350585753600", + "expectedQty": "22870241999129745799508", + "reserves": [ + "15535821418554418632398066", + "59294876130068523036274583", + "53947296990379774954203423" + ] + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "5396324451446665773056", + "outputIndex": 0, + "expectedQty": "5258132599465075050146", + "swapFee": "3223960893267144799", + "reserves": [ + "15530563285954953557347920", + "59294876130068523036274583", + "53952693314831221619976479" + ], + "mAssetSupply": "128569464107595719265572309", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "58259950260851868434432", + "expectedQty": "58010650763037416243565", + "reserves": [ + "15530563285954953557347920", + "59294876130068523036274583", + "54010953265092073488410911" + ] + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "137347956486909361913856", + "expectedQty": "137854649317337015788472", + "swapFee": "82408773892145617148", + "reserves": [ + "15530563285954953557347920", + "59294876130068523036274583", + "53873098615774736472622439" + ], + "mAssetSupply": "128490209210645739465519166" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "7775033493989448", + "8078923479865090", + "13013902911013528" + ], + "expectedQty": "28935606620518987", + "swapFee": "17371787044538", + "reserves": [ + "15530563278179920063358472", + "59294876121989599556409493", + "53873098602760833561608911" + ], + "mAssetSupply": "128490209181710132845000179" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "1189794031881950238605312", + "expectedQty": "1162354444106110823873845", + "swapFee": "713876419129170143163", + "reserves": [ + "14368208834073809239484627", + "59294876121989599556409493", + "53873098602760833561608911" + ], + "mAssetSupply": "127301129026247311776538030" + }, + { + "type": "mintMulti", + "inputQtys": [ + "596617681040962368831488", + "165006351367611994865664", + "475321999013080358453248" + ], + "expectedQty": "1248144157837018669947282", + "reserves": [ + "14964826515114771608316115", + "59459882473357211551275157", + "54348420601773913920062159" + ], + "mAssetSupply": "128549273184084330446485312" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "789572437721158204260352", + "outputIndex": 1, + "expectedQty": "789705164291984648892652", + "swapFee": "471565100400389818989", + "reserves": [ + "14964826515114771608316115", + "58670177309065226902382505", + "55137993039495072124322511" + ], + "mAssetSupply": "128549744749184730836304301", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemMasset", + "inputQty": "637157930747268012441", + "expectedQtys": [ + "74151041121020367492", + "290712005637219125897", + "273209955696621528581" + ], + "redemptionFee": "191147379224180403", + "reserves": [ + "14964752364073650587948623", + "58669886597059589683256608", + "55137719829539375502793930" + ], + "mAssetSupply": "128549107782401362792472263" + }, + { + "type": "mintMulti", + "inputQtys": [ + "131970105663951709667328", + "326521725547474910707712", + "8082855988179273515008" + ], + "expectedQty": "467842579085615341297412", + "reserves": [ + "15096722469737602297615951", + "58996408322607064593964320", + "55145802685527554776308938" + ], + "mAssetSupply": "129016950361486978133769675" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "9118701821190536192", + "expectedQty": "9070393222609884081", + "reserves": [ + "15096722469737602297615951", + "58996417441308885784500512", + "55145802685527554776308938" + ] + }, + { + "type": "redeemMasset", + "inputQty": "380273334557883970355", + "expectedQtys": [ + "44483754348543126242", + "173837874158714950806", + "162491715995549796116" + ], + "redemptionFee": "114082000367365191", + "reserves": [ + "15096677985983253754489709", + "58996243603434727069549706", + "55145640193811559226512822" + ], + "mAssetSupply": "129016579272627643227048592" + }, + { + "type": "redeemMasset", + "inputQty": "70495035090549150528307", + "expectedQtys": [ + "8246394208538916141672", + "32226048805480222787438", + "30122699069466855170316" + ], + "redemptionFee": "21148510527164745158", + "reserves": [ + "15088431591774714838348037", + "58964017554629246846762268", + "55115517494742092371342506" + ], + "mAssetSupply": "128946105386047621241265443" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "222722705670676064239616", + "10987395375325182427136", + "124680044188658766446592" + ], + "expectedQty": "362917248140151375097440", + "swapFee": "217881077530609190572", + "reserves": [ + "14865708886104038774108421", + "58953030159253921664335132", + "54990837450553433604895914" + ], + "mAssetSupply": "128583188137907469866168003" + }, + { + "type": "mintMulti", + "inputQtys": [ + "1159638585156181032960", + "212950600982392209408", + "1453678377467404615680" + ], + "expectedQty": "2845569743026423340782", + "reserves": [ + "14866868524689194955141381", + "58953243109854904056544540", + "54992291128930901009511594" + ], + "mAssetSupply": "128586033707650496289508785" + }, + { + "type": "mintMulti", + "inputQtys": [ + "15312752184044151635968", + "30609320122996236484608", + "12019238149280495566848" + ], + "expectedQty": "58079747811738789619601", + "reserves": [ + "14882181276873239106777349", + "58983852429977900293029148", + "55004310367080181505078442" + ], + "mAssetSupply": "128644113455462235079128386" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "524933050221188370923520", + "expectedQty": "527067604497985483087181", + "swapFee": "314959830132713022554", + "reserves": [ + "14882181276873239106777349", + "58983852429977900293029148", + "54477242762582196021991261" + ], + "mAssetSupply": "128119495365071179421227420" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "632238992779091445284864", + "outputIndex": 1, + "expectedQty": "649278994272089655764434", + "swapFee": "387810534915705043763", + "reserves": [ + "15514420269652330552062213", + "58334573435705810637264714", + "54477242762582196021991261" + ], + "mAssetSupply": "128119883175606095126271183", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "22544210566606911176704", + "outputIndex": 0, + "expectedQty": "21951417953350317305031", + "swapFee": "13458023350814555447", + "reserves": [ + "15492468851698980234757182", + "58357117646272417548441418", + "54477242762582196021991261" + ], + "mAssetSupply": "128119896633629445940826630", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "26569927389123653632", + "expectedQty": "27133762396957496249", + "reserves": [ + "15492495421626369358410814", + "58357117646272417548441418", + "54477242762582196021991261" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "19887892825858138701824", + "297262695188304001761280", + "194521962783423984566272" + ], + "expectedQty": "509727237927670274222144", + "reserves": [ + "15512383314452227497112638", + "58654380341460721550202698", + "54671764725365620006557533" + ], + "mAssetSupply": "128629651005319513172545023" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "894731437212097629388800", + "expectedQty": "890731129241315613446531", + "reserves": [ + "15512383314452227497112638", + "58654380341460721550202698", + "55566496162577717635946333" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "45669875739342912", + "64741054713564880", + "67085567122351448" + ], + "expectedQty": "177854506082672211", + "swapFee": "106776769711430", + "reserves": [ + "15512383268782351757769726", + "58654380276719666836637818", + "55566496095492150513594885" + ], + "mAssetSupply": "129520381956706322703319343" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "6344811710515721011200", + "expectedQty": "6206364670260314512335", + "swapFee": "3806887026309432606", + "reserves": [ + "15506176904112091443257391", + "58654380276719666836637818", + "55566496095492150513594885" + ], + "mAssetSupply": "129514040951882833291740749" + }, + { + "type": "redeemMasset", + "inputQty": "804381448896658656355942", + "expectedQtys": [ + "96276350340243348133762", + "364179365386563039409965", + "345006991623490770479507" + ], + "redemptionFee": "241314434668997596906", + "reserves": [ + "15409900553771848095123629", + "58290200911333103797227853", + "55221489103868659743115378" + ], + "mAssetSupply": "128709900817420843632981713" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "40088844126605", + "expectedQty": "39906976805221", + "reserves": [ + "15409900553771848095123629", + "58290200911333103797227853", + "55221489103908748587241983" + ] + }, + { + "type": "redeemMasset", + "inputQty": "82247338280966225920", + "expectedQtys": [ + "9844177244204034108", + "37237039095036478761", + "35276679724886429873" + ], + "redemptionFee": "24674201484289867", + "reserves": [ + "15409890709594603891089521", + "58290163674294008760749092", + "55221453827229023700812110" + ], + "mAssetSupply": "128709818594796671127850881" + }, + { + "type": "mintMulti", + "inputQtys": [ + "288347896632578880", + "257104002377289920", + "284602367976514688" + ], + "expectedQty": "833717194263445025", + "reserves": [ + "15409890997942500523668401", + "58290163931398011138039012", + "55221454111831391677326798" + ], + "mAssetSupply": "128709819428513865391295906" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "85478136551588132552704", + "188210711420469432549376", + "86934888671343265447936" + ], + "expectedQty": "361133624625256979715471", + "swapFee": "216810260931713215758", + "reserves": [ + "15324412861390912391115697", + "58101953219977541705489636", + "55134519223160048411878862" + ], + "mAssetSupply": "128348685803888608411580435" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "416357282947742144", + "outputIndex": 0, + "expectedQty": "405356021345937639", + "swapFee": "248674429662884", + "reserves": [ + "15324412456034891045178058", + "58101953219977541705489636", + "55134519639517331359621006" + ], + "mAssetSupply": "128348685804137282841243319", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemBassets", + "inputQtys": [ + "2150372980299950165327872", + "2627487673527229231398912", + "1866279154892939141840896" + ], + "expectedQty": "6673202278391595476605158", + "swapFee": "4006325162132236627939", + "reserves": [ + "13174039475734940879850186", + "55474465546450312474090724", + "53268240484624392217780110" + ], + "mAssetSupply": "121675483525745687364638161" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "1583602262968403492864", + "outputIndex": 0, + "expectedQty": "1532474446242803146444", + "swapFee": "945121402020360785", + "reserves": [ + "13172507001288698076703742", + "55474465546450312474090724", + "53269824086887360621272974" + ], + "mAssetSupply": "121675484470867089384998946", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "215939800473259888082944", + "expectedQty": "214698742699844002578146", + "reserves": [ + "13172507001288698076703742", + "55690405346923572362173668", + "53269824086887360621272974" + ] + }, + { + "type": "redeemMasset", + "inputQty": "218977812517434608844", + "expectedQtys": [ + "23657536205600495295", + "100018757300377053874", + "95671445980496762689" + ], + "redemptionFee": "65693343755230382", + "reserves": [ + "13172483343752492476208447", + "55690305328166271985119794", + "53269728415441380124510285" + ], + "mAssetSupply": "121889964301447759708198630" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "309175829443290633076736", + "89879698624398382596096", + "338752654618662925238272" + ], + "expectedQty": "744104949518844798378837", + "swapFee": "446731008316296657021", + "reserves": [ + "12863307514309201843131711", + "55600425629541873602523698", + "52930975760822717199272013" + ], + "mAssetSupply": "121145859351928914909819793" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "569241992818666700800", + "6115202086877249142784", + "2456096296643929833472" + ], + "expectedQty": "9107265173261120257575", + "swapFee": "5467639687769333754", + "reserves": [ + "12862738272316383176430911", + "55594310427454996353380914", + "52928519664526073269438541" + ], + "mAssetSupply": "121136752086755653789562218" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "760128040678022797328384", + "outputIndex": 0, + "expectedQty": "732684507874932174238619", + "swapFee": "453348065825438003481", + "reserves": [ + "12130053764441451002192292", + "56354438468133019150709298", + "52928519664526073269438541" + ], + "mAssetSupply": "121137205434821479227565699", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mintMulti", + "inputQtys": [ + "7604144130214233899008", + "4548993110277144182784", + "8967208220662961274880" + ], + "expectedQty": "21286005171581083697741", + "reserves": [ + "12137657908571665236091300", + "56358987461243296294892082", + "52937486872746736230713421" + ], + "mAssetSupply": "121158491439993060311263440" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "29032342119217692147712", + "expectedQty": "29183193947737135375493", + "swapFee": "17419405271530615288", + "reserves": [ + "12137657908571665236091300", + "56358987461243296294892082", + "52908303678798999095337928" + ], + "mAssetSupply": "121129476517279114149731016" + }, + { + "type": "mintMulti", + "inputQtys": [ + "708064955523925671936", + "342274600599836295168", + "88325109212055912448" + ], + "expectedQty": "1158900140665673344804", + "reserves": [ + "12138365973527189161763236", + "56359329735843896131187250", + "52908392003908211151250376" + ], + "mAssetSupply": "121130635417419779823075820" + }, + { + "type": "redeemMasset", + "inputQty": "53923487178087492222976", + "expectedQtys": [ + "5401991467930039891279", + "25081845368253969583100", + "23546059066792059993786" + ], + "redemptionFee": "16177046153426247666", + "reserves": [ + "12132963982059259121871957", + "56334247890475642161604150", + "52884845944841419091256590" + ], + "mAssetSupply": "121076728107287845757100510" + }, + { + "type": "mintMulti", + "inputQtys": [ + "37742401631325423403008", + "38609540693815772315648", + "68730751442810499497984" + ], + "expectedQty": "145658904384653897174581", + "reserves": [ + "12170706383690584545274965", + "56372857431169457933919798", + "52953576696284229590754574" + ], + "mAssetSupply": "121222387011672499654275091" + }, + { + "type": "mintMulti", + "inputQtys": [ + "2687049211682901458944", + "1200451051217028644864", + "890308930453859467264" + ], + "expectedQty": "4851681923100909169668", + "reserves": [ + "12173393432902267446733909", + "56374057882220674962564662", + "52954467005214683450221838" + ], + "mAssetSupply": "121227238693595600563444759" + }, + { + "type": "redeemMasset", + "inputQty": "49075322378386843631616", + "expectedQtys": [ + "4926565923900898008669", + "22814551594456375909553", + "21430644963885606826977" + ], + "redemptionFee": "14722596713516053089", + "reserves": [ + "12168466866978366548725240", + "56351243330626218586655109", + "52933036360250797843394861" + ], + "mAssetSupply": "121178178093813927235866232" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "73825747059613716447232", + "outputIndex": 1, + "expectedQty": "73831463545521529986579", + "swapFee": "44040454715894589943", + "reserves": [ + "12168466866978366548725240", + "56277411867080697056668530", + "53006862107310411559842093" + ], + "mAssetSupply": "121178222134268643130456175", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "31103500096503541760", + "expectedQty": "32107075734999348396", + "reserves": [ + "12168497970478463052267000", + "56277411867080697056668530", + "53006862107310411559842093" + ] + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "37233291627016042315776", + "expectedQty": "37018505570434088523293", + "reserves": [ + "12168497970478463052267000", + "56277411867080697056668530", + "53044095398937427602157869" + ] + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "1754935347003159", + "expectedQty": "1743663852015530", + "reserves": [ + "12168497970478463052267000", + "56277411868835632403671689", + "53044095398937427602157869" + ] + }, + { + "type": "redeemMasset", + "inputQty": "8655781910378636849971", + "expectedQtys": [ + "868671610947055151801", + "4017471190498144853432", + "3786654681063522993554" + ], + "redemptionFee": "2596734573113591054", + "reserves": [ + "12167629298867515997115199", + "56273394397645134258818257", + "53040308744256364079164315" + ], + "mAssetSupply": "121206619563482670547084477" + }, + { + "type": "redeemMasset", + "inputQty": "69724053265121489715", + "expectedQtys": [ + "6997323442143185958", + "32361533386315462979", + "30502260270966718926" + ], + "redemptionFee": "20917215979536446", + "reserves": [ + "12167622301544073853929241", + "56273362036111747943355278", + "53040278241996093112445389" + ], + "mAssetSupply": "121206549860346621405131208" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "4224118994545090756608", + "5015333027795867533312", + "7123844693902951972864" + ], + "expectedQty": "16426372898527098755207", + "swapFee": "9861740783586411099", + "reserves": [ + "12163398182549528763172633", + "56268346703083952075821966", + "53033154397302190160472525" + ], + "mAssetSupply": "121190123487448094306376001" + }, + { + "type": "mintMulti", + "inputQtys": [ + "804947315840703660032", + "4551568012259133751296", + "2685462820261263835136" + ], + "expectedQty": "8023233248748027148955", + "reserves": [ + "12164203129865369466832665", + "56272898271096211209573262", + "53035839860122451424307661" + ], + "mAssetSupply": "121198146720696842333524956" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "367087010270422040576", + "expectedQty": "364728508336559956650", + "reserves": [ + "12164203129865369466832665", + "56273265358106481631613838", + "53035839860122451424307661" + ] + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "2110226685798841581568", + "outputIndex": 2, + "expectedQty": "2189711303924478067110", + "swapFee": "1307028092703406702", + "reserves": [ + "12166313356551168308414233", + "56273265358106481631613838", + "53033650148818526946240551" + ], + "mAssetSupply": "121198512756233271596888308", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mintMulti", + "inputQtys": [ + "821988190084206853881856", + "874845799715668473413632", + "537686365188165426216960" + ], + "expectedQty": "2251244475541224641297947", + "reserves": [ + "12988301546635375162296089", + "57148111157822150105027470", + "53571336514006692372457511" + ], + "mAssetSupply": "123449757231774496238186255" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "7287932814551768", + "expectedQty": "7323000833693452", + "swapFee": "4372759688731", + "reserves": [ + "12988301546635375162296089", + "57148111157822150105027470", + "53571336506683691538764059" + ], + "mAssetSupply": "123449757224490936183323218" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "1721641058746798702592", + "outputIndex": 1, + "expectedQty": "1721802871789355811435", + "swapFee": "1027420964160854472", + "reserves": [ + "12988301546635375162296089", + "57146389354950360749216035", + "53573058147742438337466651" + ], + "mAssetSupply": "123449758251911900344177690", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mintMulti", + "inputQtys": [ + "31435776878949055856640", + "5358232735764144193536", + "17642696287709592289280" + ], + "expectedQty": "55221640226015072638222", + "reserves": [ + "13019737323514324218152729", + "57151747587686124893409571", + "53590700844030147929755931" + ], + "mAssetSupply": "123504979892137915416815912" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "356567642618069637922816", + "outputIndex": 1, + "expectedQty": "368553178422991588399862", + "swapFee": "219971310017648782101", + "reserves": [ + "13376304966132393856075545", + "56783194409263133305009709", + "53590700844030147929755931" + ], + "mAssetSupply": "123505199863447933065598013", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemBassets", + "inputQtys": [ + "1861426549330816008192", + "14707579954979911237632", + "5550778689410115305472" + ], + "expectedQty": "22056040258567238469990", + "swapFee": "13241569096598302063", + "reserves": [ + "13374443539583063040067353", + "56768486829308153393772077", + "53585150065340737814450459" + ], + "mAssetSupply": "123483143823189365827128023" + }, + { + "type": "mintMulti", + "inputQtys": [ + "610863807661551780888576", + "541405247338529576452096", + "289256019266836396769280" + ], + "expectedQty": "1453006692432508712928389", + "reserves": [ + "13985307347244614820955929", + "57309892076646682970224173", + "53874406084607574211219739" + ], + "mAssetSupply": "124936150515621874540056412" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "281821550906556098281472", + "expectedQty": "280240257144048713123463", + "reserves": [ + "13985307347244614820955929", + "57591713627553239068505645", + "53874406084607574211219739" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "4679726369703092224", + "23197978821084749824", + "1683043488516710656" + ], + "expectedQty": "29540797995659842693", + "swapFee": "17735119869317496", + "reserves": [ + "13985302667518245117863705", + "57591690429574417983755821", + "53874404401564085694509083" + ], + "mAssetSupply": "125216361231967927593337182" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "127615984265453387776", + "outputIndex": 1, + "expectedQty": "127627581210702833182", + "swapFee": "76191005604176773", + "reserves": [ + "13985302667518245117863705", + "57591562801993207280922639", + "53874532017548351147896859" + ], + "mAssetSupply": "125216361308158933197513955", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemMasset", + "inputQty": "30414345191563554560409", + "expectedQtys": [ + "3395931748448002479814", + "13984467924048994127487", + "13081893045911241237743" + ], + "redemptionFee": "9124303557469066368", + "reserves": [ + "13981906735769797115383891", + "57577578334069158286795152", + "53861450124502439906659116" + ], + "mAssetSupply": "125185956087270927112019914" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "419519678151606216425472", + "expectedQty": "408564369888859991722517", + "swapFee": "251711806890963729855", + "reserves": [ + "13573342365880937123661374", + "57577578334069158286795152", + "53861450124502439906659116" + ], + "mAssetSupply": "124766688120926211859324297" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "1501562609081355708923904", + "expectedQty": "1538042583135908532763367", + "reserves": [ + "15074904974962292832585278", + "57577578334069158286795152", + "53861450124502439906659116" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "5340005267605650669568", + "14787496068475233763328", + "11721801945432633376768" + ], + "expectedQty": "31837162857484579749621", + "reserves": [ + "15080244980229898483254846", + "57592365830137633520558480", + "53873171926447872540035884" + ], + "mAssetSupply": "126336567866919604971837285" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "930968068857598801084416", + "outputIndex": 2, + "expectedQty": "929635531463897183290767", + "swapFee": "555665543782091628797", + "reserves": [ + "15080244980229898483254846", + "58523333898995232321642896", + "52943536394983975356745117" + ], + "mAssetSupply": "126337123532463387063466082", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "1058756957551039360", + "expectedQty": "1035459251069709394", + "swapFee": "635254174530623", + "reserves": [ + "15080243944770647413545452", + "58523333898995232321642896", + "52943536394983975356745117" + ], + "mAssetSupply": "126337122474341683686957345" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "373563736061764603740160", + "outputIndex": 0, + "expectedQty": "363509202304204972292494", + "swapFee": "223163246464014024597", + "reserves": [ + "14716734742466442441252958", + "58523333898995232321642896", + "53317100131045739960485277" + ], + "mAssetSupply": "126337345637588147700981942", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "14475185494832687603515392", + "hardLimitError": true + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "7228224053166865383424", + "expectedQty": "7195555161750545663656", + "reserves": [ + "14716734742466442441252958", + "58523333898995232321642896", + "53324328355098906825868701" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "41318720929358225408", + "41698074311819255808", + "46408188192940105728" + ], + "expectedQty": "129943741628719636076", + "reserves": [ + "14716776061187371799478366", + "58523375597069544140898704", + "53324374763287099765974429" + ], + "mAssetSupply": "126344671136491526966281674" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "639263876776777712926720", + "expectedQty": "635746693681140255135862", + "reserves": [ + "14716776061187371799478366", + "59162639473846321853825424", + "53324374763287099765974429" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "32166612043847000129536", + "48137386206952767356928", + "38232113792197003837440" + ], + "expectedQty": "118849676650542143433734", + "reserves": [ + "14748942673231218799607902", + "59210776860053274621182352", + "53362606877079296769811869" + ], + "mAssetSupply": "127099267506823209364851270" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "114361030444952208", + "104088048383076928", + "120195064435864096" + ], + "expectedQty": "340198462926816121", + "swapFee": "204241622729727", + "reserves": [ + "14748942558870188354655694", + "59210776755965226238105424", + "53362606756884232333947773" + ], + "mAssetSupply": "127099267166624746438035149" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "241992599670296812716032", + "expectedQty": "240902094215833005942114", + "reserves": [ + "14748942558870188354655694", + "59210776755965226238105424", + "53604599356554529146663805" + ] + }, + { + "type": "redeemMasset", + "inputQty": "758314483603512012", + "expectedQtys": [ + "87804041129367298", + "352496150610868622", + "319121213459164531" + ], + "redemptionFee": "227494345081053", + "reserves": [ + "14748942471066147225288396", + "59210776403469075627236802", + "53604599037433315687499274" + ], + "mAssetSupply": "127340168502753590185546304" + }, + { + "type": "redeemMasset", + "inputQty": "138617005146198530169241", + "expectedQtys": [ + "16050244963341968331175", + "64434956445840001108928", + "58334144797185381673182" + ], + "redemptionFee": "41585101543859559050", + "reserves": [ + "14732892226102805256957221", + "59146341447023235626127874", + "53546264892636130305826092" + ], + "mAssetSupply": "127201593082708935514936113" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "261674722866348785664", + "outputIndex": 2, + "expectedQty": "261253622789927313023", + "swapFee": "156136640214137881", + "reserves": [ + "14732892226102805256957221", + "59146603121746101974913538", + "53546003639013340378513069" + ], + "mAssetSupply": "127201593238845575729073994", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mintMulti", + "inputQtys": [ + "25075843156692011319296", + "2375999212973019103232", + "6949705148724758446080" + ], + "expectedQty": "34943978069637379299358", + "reserves": [ + "14757968069259497268276517", + "59148979120959074994016770", + "53552953344162065136959149" + ], + "mAssetSupply": "127236537216915213108373352" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "261033352956761473024", + "expectedQty": "259854685198392076740", + "reserves": [ + "14757968069259497268276517", + "59148979120959074994016770", + "53553214377515021898432173" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "11139884869341061120", + "2348542240556226048", + "1383235399949215232" + ], + "expectedQty": "15112791632569021808", + "reserves": [ + "14757979209144366609337637", + "59148981469501315550242818", + "53553215760750421847647405" + ], + "mAssetSupply": "127236812184392044069471900" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "88448885647332282990592", + "expectedQty": "86365544570031593792870", + "swapFee": "53069331388399369794", + "reserves": [ + "14671613664574335015544767", + "59148981469501315550242818", + "53553215760750421847647405" + ], + "mAssetSupply": "127148416368076100185851102" + }, + { + "type": "redeemMasset", + "inputQty": "71878270920644964961484", + "expectedQtys": [ + "8291521678939768923719", + "33427479304867978599936", + "30265086009547936089306" + ], + "redemptionFee": "21563481276193489488", + "reserves": [ + "14663322142895395246621048", + "59115553990196447571642882", + "53522950674740873911558099" + ], + "mAssetSupply": "127076559660636731414379106" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "223203797257133456621568", + "expectedQty": "217840677201742847019641", + "swapFee": "133922278354280073972", + "reserves": [ + "14445481465693652399601407", + "59115553990196447571642882", + "53522950674740873911558099" + ], + "mAssetSupply": "126853489785657952237831510" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "2345481872351258017267712", + "expectedQty": "2334187929707652536423241", + "reserves": [ + "14445481465693652399601407", + "59115553990196447571642882", + "55868432547092131928825811" + ] + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "9113197051465311453184", + "expectedQty": "9158747964056408663444", + "swapFee": "5467918230879186871", + "reserves": [ + "14445481465693652399601407", + "59106395242232391162979438", + "55868432547092131928825811" + ], + "mAssetSupply": "129178569986232370341988438" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "8840154937041475584", + "1510437592871235328", + "2016520704802446336" + ], + "expectedQty": "12572779842667626497", + "swapFee": "7548196823694792", + "reserves": [ + "14445472625538715358125823", + "59106393731794798291744110", + "55868430530571427126379475" + ], + "mAssetSupply": "129178557413452527674361941" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "1561313787307981281427456", + "expectedQty": "1568939340367045632900271", + "swapFee": "936788272384788768856", + "reserves": [ + "14445472625538715358125823", + "57537454391427752658843839", + "55868430530571427126379475" + ], + "mAssetSupply": "127618180414416931181703341" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "1950176618747029253783552", + "outputIndex": 1, + "expectedQty": "2000216902404127948755968", + "swapFee": "1195506406688698490436", + "reserves": [ + "16395649244285744611909375", + "55537237489023624710087871", + "55868430530571427126379475" + ], + "mAssetSupply": "127619375920823619880193777", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "1515507424914011324416", + "expectedQty": "1521163728194012040003", + "swapFee": "909304454948406794", + "reserves": [ + "16395649244285744611909375", + "55535716325295430698047868", + "55868430530571427126379475" + ], + "mAssetSupply": "127617861322703160817276155" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "462738249001115213365248", + "234384639923881292857344", + "287744257007772292349952" + ], + "expectedQty": "991297167449617718960301", + "swapFee": "595135381698789905319", + "reserves": [ + "15932910995284629398544127", + "55301331685371549405190524", + "55580686273563654834029523" + ], + "mAssetSupply": "126626564155253543098315854" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "127211011587692315017216", + "outputIndex": 1, + "expectedQty": "130146258644384196052962", + "swapFee": "77790844157969019711", + "reserves": [ + "16060122006872321713561343", + "55171185426727165209137562", + "55580686273563654834029523" + ], + "mAssetSupply": "126626641946097701067335565", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemMasset", + "inputQty": "480460959669095", + "expectedQtys": [ + "60918829045617", + "209273877982789", + "210827185739217" + ], + "redemptionFee": "144138287900", + "reserves": [ + "16060122006811402884515726", + "55171185426517891331154773", + "55580686273352827648290306" + ], + "mAssetSupply": "126626641945617384245954370" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "58168269537122697216", + "outputIndex": 0, + "expectedQty": "56799760240181760059", + "swapFee": "34747708755138168", + "reserves": [ + "16060065207051162702755667", + "55171243594787428453851989", + "55580686273352827648290306" + ], + "mAssetSupply": "126626641980365093001092538", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "12380512724648065024", + "expectedQty": "12615556660551822458", + "reserves": [ + "16060077587563887350820691", + "55171243594787428453851989", + "55580686273352827648290306" + ] + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "1815728392216041876357120", + "outputIndex": 2, + "expectedQty": "1814196180031437874135225", + "swapFee": "1084518399610399689128", + "reserves": [ + "16060077587563887350820691", + "56986971987003470330209109", + "53766490093321389774155081" + ], + "mAssetSupply": "126627739114321363952604124", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "22688788223394456", + "expectedQty": "22252412716698913", + "swapFee": "13613272934036", + "reserves": [ + "16060077565311474634121778", + "56986971987003470330209109", + "53766490093321389774155081" + ], + "mAssetSupply": "126627739091646189002143704" + }, + { + "type": "redeemMasset", + "inputQty": "14266807441220956900556", + "expectedQtys": [ + "1808902993516750841419", + "6418642985971565936854", + "6055908789056432449117" + ], + "redemptionFee": "4280042232366287070", + "reserves": [ + "16058268662317957883280359", + "56980553344017498764272255", + "53760434184532333341705964" + ], + "mAssetSupply": "126613476564247200411530218" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "7712088192520874520215552", + "expectedQty": "7809939787251598997955426", + "reserves": [ + "23770356854838832403495911", + "56980553344017498764272255", + "53760434184532333341705964" + ] + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "112440510143362127364096", + "outputIndex": 2, + "expectedQty": "113571631916734881211372", + "swapFee": "68025816421595268334", + "reserves": [ + "23882797364982194530860007", + "56980553344017498764272255", + "53646862552615598460494592" + ], + "mAssetSupply": "134423484377315221004753978", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "1322206670278624590954496", + "outputIndex": 1, + "expectedQty": "1321809875066623328922442", + "swapFee": "791430861400342825083", + "reserves": [ + "23882797364982194530860007", + "55658743468950875435349813", + "54969069222894223051449088" + ], + "mAssetSupply": "134424275808176621347579061", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemBassets", + "inputQtys": [ + "908994729696296304640", + "7532150701144329420800", + "18982128270224157310976" + ], + "expectedQty": "27363432147428427328489", + "swapFee": "16427916038079904339", + "reserves": [ + "23881888370252498234555367", + "55651211318249731105929013", + "54950087094623998894138112" + ], + "mAssetSupply": "134396912376029192920250572" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "314844573690901219508224", + "expectedQty": "315474891333204890857614", + "swapFee": "188906744214540731704", + "reserves": [ + "23881888370252498234555367", + "55335736426916526215071399", + "54950087094623998894138112" + ], + "mAssetSupply": "134082256709082506241474052" + }, + { + "type": "redeemMasset", + "inputQty": "145046442311899750", + "expectedQtys": [ + "25827009731984514", + "59842696736020000", + "59425637209409913" + ], + "redemptionFee": "43513932693569", + "reserves": [ + "23881888344425488502570853", + "55335736367073829479051399", + "54950087035198361684728199" + ], + "mAssetSupply": "134082256564079577862267871" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "832695184015885696", + "expectedQty": "825425554029460493", + "swapFee": "499617110409531", + "reserves": [ + "23881887518999934473110360", + "55335736367073829479051399", + "54950087035198361684728199" + ], + "mAssetSupply": "134082255731884010956791706" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "3580258364810023273496576", + "outputIndex": 2, + "expectedQty": "3575982720916506702302107", + "swapFee": "2142198909397512318206", + "reserves": [ + "23881887518999934473110360", + "58915994731883852752547975", + "51374104314281854982426092" + ], + "mAssetSupply": "134084397930793408469109912", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "409263899655567191310336", + "expectedQty": "405617915932915233028867", + "swapFee": "245558339793340314786", + "reserves": [ + "23476269603067019240081493", + "58915994731883852752547975", + "51374104314281854982426092" + ], + "mAssetSupply": "133675379589477634618114362" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "37318455670580862976", + "outputIndex": 2, + "expectedQty": "37691341452500694426", + "swapFee": "22582341424836584", + "reserves": [ + "23476306921522689820944469", + "58915994731883852752547975", + "51374066622940402481731666" + ], + "mAssetSupply": "133675379612059976042950946", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemMasset", + "inputQty": "359421229943844735916441", + "expectedQtys": [ + "63103256320054428406391", + "158363541989163284760028", + "138091178699783806809100" + ], + "redemptionFee": "107826368983153420774", + "reserves": [ + "23413203665202635392538078", + "58757631189894689467787947", + "51235975444240618674922566" + ], + "mAssetSupply": "133316066208485114460455279" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "10908974544607", + "expectedQty": "11002160468785", + "reserves": [ + "23413203665213544367082685", + "58757631189894689467787947", + "51235975444240618674922566" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "14708283774614835822592", + "19528397075474727043072", + "20836858478767120580608" + ], + "expectedQty": "55094785347137101109146", + "reserves": [ + "23427911948988159202905277", + "58777159586970164194831019", + "51256812302719385795503174" + ], + "mAssetSupply": "133371160993843253722033210" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "1904682801334415872", + "366032776595403968", + "1709960189674456832" + ], + "expectedQty": "3992297192844016041", + "swapFee": "2396816405549739", + "reserves": [ + "23427910044305357868489405", + "58777159220937387599427051", + "51256810592759196121046342" + ], + "mAssetSupply": "133371157001546060878017169" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "317955984321448016609280", + "expectedQty": "318771169470419568316137", + "swapFee": "190773590592868809965", + "reserves": [ + "23427910044305357868489405", + "58458388051466968031110914", + "51256810592759196121046342" + ], + "mAssetSupply": "133053391790815205730217854" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "11170571981735224", + "expectedQty": "11135509296396261", + "reserves": [ + "23427910044305357868489405", + "58458388062637540012846138", + "51256810592759196121046342" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "362331946628582723289088", + "602818674897384957280256", + "202567944495022685028352" + ], + "expectedQty": "1168503593054117902751239", + "swapFee": "701523069674275306834", + "reserves": [ + "23065578097676775145200317", + "57855569387740155055565882", + "51054242648264173436017990" + ], + "mAssetSupply": "131884888208896597123862876" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "11560504241567955943424", + "14007092974247343030272", + "8055778671801657196544" + ], + "expectedQty": "33662143888215019974564", + "swapFee": "20209411980117082234", + "reserves": [ + "23054017593435207189256893", + "57841562294765907712535610", + "51046186869592371778821446" + ], + "mAssetSupply": "131851226065008382103888312" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "1782471522902709188427776", + "expectedQty": "1786854235448429406881835", + "swapFee": "1069482913741625513056", + "reserves": [ + "23054017593435207189256893", + "56054708059317478305653775", + "51046186869592371778821446" + ], + "mAssetSupply": "130069824025019414540973592" + }, + { + "type": "mintMulti", + "inputQtys": [ + "651155231317035712512", + "226548217048727846912", + "589775773433155158016" + ], + "expectedQty": "1470942186534573706149", + "reserves": [ + "23054668748666524224969405", + "56054934607534527033500687", + "51046776645365804933979462" + ], + "mAssetSupply": "130071294967205949114679741" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "923203711354310198558720", + "931833772369195072225280", + "3764729252867708893003776" + ], + "expectedQty": "5616867837803523338733800", + "swapFee": "3372143989075559338843", + "reserves": [ + "22131465037312214026410685", + "55123100835165331961275407", + "47282047392498096040975686" + ], + "mAssetSupply": "124454427129402425775945941" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "3984650052004107226447872", + "expectedQty": "3976052517516622791637225", + "reserves": [ + "22131465037312214026410685", + "55123100835165331961275407", + "51266697444502203267423558" + ] + }, + { + "type": "redeemMasset", + "inputQty": "9843594935539465191424", + "expectedQtys": [ + "1695764290555872045062", + "4223660106702824557764", + "3928173515605494987891" + ], + "redemptionFee": "2953078480661839557", + "reserves": [ + "22129769273021658154365623", + "55118877175058629136717643", + "51262769270986597772435667" + ], + "mAssetSupply": "128420639005061989764231299" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "4738486239443786447978496", + "expectedQty": "4725770434982737615127840", + "reserves": [ + "22129769273021658154365623", + "55118877175058629136717643", + "56001255510430384220414163" + ] + }, + { + "type": "redeemMasset", + "inputQty": "12831905064127193048678", + "expectedQtys": [ + "2132103370018123317007", + "5310454995110355272799", + "5395468164441976600757" + ], + "redemptionFee": "3849571519238157914", + "reserves": [ + "22127637169651640031048616", + "55113566720063518781444844", + "55995860042265942243813406" + ], + "mAssetSupply": "133133581384552119424468375" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "283924347300859525201920", + "outputIndex": 2, + "expectedQty": "283779814093483170177793", + "swapFee": "169871022461410833285", + "reserves": [ + "22127637169651640031048616", + "55397491067364378306646764", + "55712080228172459073635613" + ], + "mAssetSupply": "133133751255574580835301660", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemBassets", + "inputQtys": [ + "444976702140057321472", + "571787304112159850496", + "986652851537610014720" + ], + "expectedQty": "2003279756731414859039", + "swapFee": "1202689467719480603", + "reserves": [ + "22127192192949499973727144", + "55396919280060266146796268", + "55711093575320921463620893" + ], + "mAssetSupply": "133131747975817849420442621" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "93131936091876009967616", + "outputIndex": 2, + "expectedQty": "94259735278765267119591", + "swapFee": "56426225283604707469", + "reserves": [ + "22220324129041375983694760", + "55396919280060266146796268", + "55616833840042156196501302" + ], + "mAssetSupply": "133131804402043133025150090", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemMasset", + "inputQty": "657927919954625560576", + "expectedQtys": [ + "109778319982140918851", + "273685509510776382266", + "274771985603304253514" + ], + "redemptionFee": "197378375986387668", + "reserves": [ + "22220214350721393842775909", + "55396645594550755370414002", + "55616559068056552892247788" + ], + "mAssetSupply": "133131146671501554385977182" + }, + { + "type": "redeemMasset", + "inputQty": "5110150518182945587", + "expectedQtys": [ + "852652276530047919", + "2125725487287590735", + "2134164187331825952" + ], + "redemptionFee": "1533045155454883", + "reserves": [ + "22220213498069117312727990", + "55396643468825268082823267", + "55616556933892365560421836" + ], + "mAssetSupply": "133131141562884081358486478" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "208811521520908959744", + "874513477941430190080", + "1112757580938130620416" + ], + "expectedQty": "2192409637424229361443", + "swapFee": "1316235523768798896", + "reserves": [ + "22220004686547596403768246", + "55395768955347326652633187", + "55615444176311427429801420" + ], + "mAssetSupply": "133128949153246657129125035" + }, + { + "type": "redeemMasset", + "inputQty": "862826190393815911628", + "expectedQtys": [ + "143967563144855763070", + "358919540186467077247", + "360342856999026363220" + ], + "redemptionFee": "258847857118144773", + "reserves": [ + "22219860718984451548005176", + "55395410035807140185555940", + "55615083833454428403438200" + ], + "mAssetSupply": "133128086585904120431358180" + }, + { + "type": "redeemMasset", + "inputQty": "3016693064283538227", + "expectedQtys": [ + "503352765662642190", + "1254887832069813634", + "1259864164504467700" + ], + "redemptionFee": "905007919285061", + "reserves": [ + "22219860215631685885362986", + "55395408780919308115742306", + "55615082573590263898970500" + ], + "mAssetSupply": "133128083570116064067105014" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "561060062076788146176", + "expectedQty": "562327042388445292652", + "swapFee": "336636037246072887", + "reserves": [ + "22219860215631685885362986", + "55394846453876919670449654", + "55615082573590263898970500" + ], + "mAssetSupply": "133127522846690024525031725" + }, + { + "type": "redeemMasset", + "inputQty": "427014055561656780", + "expectedQtys": [ + "71250076348419222", + "177628796979157088", + "178335004857693432" + ], + "redemptionFee": "128104216668497", + "reserves": [ + "22219860144381609536943764", + "55394846276248122691292566", + "55615082395255259041277068" + ], + "mAssetSupply": "133127522419804073180043442" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "3841158758762412507136", + "expectedQty": "3849960686297800301559", + "swapFee": "2304695255257447504", + "reserves": [ + "22219860144381609536943764", + "55394846276248122691292566", + "55611232434568961240975509" + ], + "mAssetSupply": "133123683565740566024983810" + }, + { + "type": "redeemMasset", + "inputQty": "26646100933911292936192", + "expectedQtys": [ + "4446203699445003704261", + "11084532883791301656033", + "11127831848383483174337" + ], + "redemptionFee": "7993830280173387880", + "reserves": [ + "22215413940682164533239503", + "55383761743364331389636533", + "55600104602720577757801172" + ], + "mAssetSupply": "133097045458636934905435498" + }, + { + "type": "mintMulti", + "inputQtys": [ + "7879307443344741376", + "21939881083883208704", + "980113498893281024" + ], + "expectedQty": "30810550578337739811", + "reserves": [ + "22215421819989607877980879", + "55383783683245415272845237", + "55600105582834076651082196" + ], + "mAssetSupply": "133097076269187513243175309" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "2786538604216792941330432", + "1093966291906962974048256", + "3089496401589311031476224" + ], + "expectedQty": "6987264645359124741233174", + "swapFee": "4194875712643060681148", + "reserves": [ + "19428883215772814936650447", + "54289817391338452298796981", + "52510609181244765619605972" + ], + "mAssetSupply": "126109811623828388501942135" + }, + { + "type": "redeemMasset", + "inputQty": "11116155019091960555110", + "expectedQtys": [ + "1712076820597408509828", + "4784028856312185255192", + "4627244696271268565965" + ], + "redemptionFee": "3334846505727588166", + "reserves": [ + "19427171138952217528140619", + "54285033362482140113541789", + "52505981936548494351040007" + ], + "mAssetSupply": "126098698803655802268975191" + }, + { + "type": "mintMulti", + "inputQtys": [ + "90961582730991590440960", + "140509727108607844024320", + "120211381997801654190080" + ], + "expectedQty": "351906019643264826504440", + "reserves": [ + "19518132721683209118581579", + "54425543089590747957566109", + "52626193318546296005230087" + ], + "mAssetSupply": "126450604823299067095479631" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "65100823082456588484608", + "outputIndex": 1, + "expectedQty": "66055118422796003591070", + "swapFee": "39522022883924254105", + "reserves": [ + "19583233544765665707066187", + "54359487971167951953975039", + "52626193318546296005230087" + ], + "mAssetSupply": "126450644345321951019733736", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemBassets", + "inputQtys": [ + "7826933838946", + "11103477639920", + "17657365057979" + ], + "expectedQty": "36587100235776", + "swapFee": "21965439405", + "reserves": [ + "19583233544757838773227241", + "54359487971156848476335119", + "52626193318528638640172108" + ], + "mAssetSupply": "126450644345285363919497960" + }, + { + "type": "redeemMasset", + "inputQty": "155311347214853341184", + "expectedQtys": [ + "24045634175192057587", + "66746299007146628389", + "64618041227875482495" + ], + "redemptionFee": "46593404164456002", + "reserves": [ + "19583209499123663581169654", + "54359421224857841329706730", + "52626128700487410764689613" + ], + "mAssetSupply": "126450489080531553230612778" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "64545994986430160", + "24835732981114816", + "29807716287968924" + ], + "expectedQty": "119771249616958062", + "swapFee": "71905893306158", + "reserves": [ + "19583209434577668594739494", + "54359421200022108348591914", + "52626128670679694476720689" + ], + "mAssetSupply": "126450488960760303613654716" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "38497632310692749312", + "expectedQty": "38594761002252628815", + "swapFee": "23098579386415649", + "reserves": [ + "19583209434577668594739494", + "54359421200022108348591914", + "52626090075918692224091874" + ], + "mAssetSupply": "126450450486226572307321053" + }, + { + "type": "redeemMasset", + "inputQty": "328084410458146662", + "expectedQtys": [ + "50794743821057253", + "140996953708758573", + "136501055796823844" + ], + "redemptionFee": "98425323137443", + "reserves": [ + "19583209383782924773682241", + "54359421059025154639833341", + "52626089939417636427268030" + ], + "mAssetSupply": "126450450158240587172311834" + }, + { + "type": "redeemMasset", + "inputQty": "1003189152026410247782", + "expectedQtys": [ + "155315931988623576611", + "431128727609691500469", + "417381545878097232933" + ], + "redemptionFee": "300956745607923074", + "reserves": [ + "19583054067850936150105630", + "54358989930297544948332872", + "52625672557871758330035097" + ], + "mAssetSupply": "126449447270045306369987126" + }, + { + "type": "redeemMasset", + "inputQty": "52507338729378714275020", + "expectedQtys": [ + "8129300675273956936786", + "22565457462175748685748", + "21845924235269259798741" + ], + "redemptionFee": "15752201618813614282", + "reserves": [ + "19574924767175662193168844", + "54336424472835369199647124", + "52603826633636489070236356" + ], + "mAssetSupply": "126396955683517546469326388" + }, + { + "type": "redeemMasset", + "inputQty": "499115201799350386688", + "expectedQtys": [ + "77274103872202964388", + "214498832496090797656", + "207659217683393560672" + ], + "redemptionFee": "149734560539805116", + "reserves": [ + "19574847493071789990204456", + "54336209974002873108849468", + "52603618974418805676675684" + ], + "mAssetSupply": "126396456718050307658744816" + }, + { + "type": "mintMulti", + "inputQtys": [ + "377635418581039503638528", + "58285683129517093158912", + "91177933688885248786432" + ], + "expectedQty": "530981767296875523628569", + "reserves": [ + "19952482911652829493842984", + "54394495657132390202008380", + "52694796908107690925462116" + ], + "mAssetSupply": "126927438485347183182373385" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "1340435881721937369497600", + "1884468270349013913436160", + "276165714919988075167744" + ], + "expectedQty": "3509835585510592857307750", + "swapFee": "2107165650696773778651", + "reserves": [ + "18612047029930892124345384", + "52510027386783376288572220", + "52418631193187702850294372" + ], + "mAssetSupply": "123417602899836590325065635" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "6826174823263649136640", + "4081622507682869018624", + "5149389894823875444736" + ], + "expectedQty": "16111534551141786043676", + "swapFee": "9672724365304254178", + "reserves": [ + "18605220855107628475208744", + "52505945764275693419553596", + "52413481803292878974849636" + ], + "mAssetSupply": "123401491365285448539021959" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "107711261044915459588096", + "56500920504206432927744", + "113185882598328206622720" + ], + "expectedQty": "278178887589339390471961", + "swapFee": "167007537075849143769", + "reserves": [ + "18497509594062713015620648", + "52449444843771486986625852", + "52300295920694550768226916" + ], + "mAssetSupply": "123123312477696109148549998" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "335897710001171267584", + "expectedQty": "334744357398065758772", + "reserves": [ + "18497509594062713015620648", + "52449780741481488157893436", + "52300295920694550768226916" + ] + }, + { + "type": "redeemMasset", + "inputQty": "65010066381218", + "expectedQtys": [ + "9763872305788", + "27685508636841", + "27606603382359" + ], + "redemptionFee": "19503019914", + "reserves": [ + "18497509594052949143314860", + "52449780741453802649256595", + "52300295920666944164844557" + ], + "mAssetSupply": "123123647221988516650947466" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "5924590334062629448843264", + "expectedQty": "5939104946808264455253776", + "swapFee": "3554754200437577669305", + "reserves": [ + "18497509594052949143314860", + "46510675794645538194002819", + "52300295920666944164844557" + ], + "mAssetSupply": "117202611642126324779773507" + }, + { + "type": "mintMulti", + "inputQtys": [ + "57347058630808152571904", + "114352927406821289754624", + "58520746227653050105856" + ], + "expectedQty": "230349272180015953645396", + "reserves": [ + "18554856652683757295886764", + "46625028722052359483757443", + "52358816666894597214950413" + ], + "mAssetSupply": "117432960914306340733418903" + }, + { + "type": "redeemMasset", + "inputQty": "2268097636707995956019", + "expectedQtys": [ + "358260584829767722862", + "900244629766576925031", + "1010953661954758010815" + ], + "redemptionFee": "680429291012398786", + "reserves": [ + "18554498392098927528163902", + "46624128477422592906832412", + "52357805713232642456939598" + ], + "mAssetSupply": "117430693497098923749861670" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "275360724897735", + "289224752148948", + "271722719328835" + ], + "expectedQty": "837642130437032", + "swapFee": "502887010468", + "reserves": [ + "18554498391823566803266167", + "46624128477133368154683464", + "52357805712960919737610763" + ], + "mAssetSupply": "117430693496261281619424638" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "1614061943323627685412864", + "expectedQty": "1630623499918601030485467", + "reserves": [ + "20168560335147194488679031", + "46624128477133368154683464", + "52357805712960919737610763" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "2891094339464178", + "4311099757110480", + "16088927745462954" + ], + "expectedQty": "23255699188839943", + "swapFee": "13961796591258", + "reserves": [ + "20168560332256100149214853", + "46624128472822268397572984", + "52357805696871991992147809" + ], + "mAssetSupply": "119061316972924183461070162" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "713896984855432003584", + "expectedQty": "715111357639652890625", + "swapFee": "428338190913259202", + "reserves": [ + "20168560332256100149214853", + "46623413361464628744682359", + "52357805696871991992147809" + ], + "mAssetSupply": "119060603504277518942325780" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "57374911549452984320", + "outputIndex": 0, + "expectedQty": "56676917659592235383", + "swapFee": "34345869530646987", + "reserves": [ + "20168503655338440556979470", + "46623470736376178197666679", + "52357805696871991992147809" + ], + "mAssetSupply": "119060603538623388472972767", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemMasset", + "inputQty": "4156804190048735985664", + "expectedQtys": [ + "703938725778297616222", + "1627293087399629011106", + "1827437853429849940484" + ], + "redemptionFee": "1247041257014620795", + "reserves": [ + "20167799716612662259363248", + "46621843443288778568655573", + "52355978259018562142207325" + ], + "mAssetSupply": "119056447981474596751607898" + }, + { + "type": "redeemMasset", + "inputQty": "27221495190268352921", + "expectedQtys": [ + "4609855014073418682", + "10656588313169156098", + "11967268233789897817" + ], + "redemptionFee": "8166448557080505", + "reserves": [ + "20167795106757648185944566", + "46621832786700465399499475", + "52355966291750328352309508" + ], + "mAssetSupply": "119056420768145855040335482" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "984759731900653056", + "expectedQty": "975019332506852957", + "swapFee": "590855839140391", + "reserves": [ + "20167794131738315679091609", + "46621832786700465399499475", + "52355966291750328352309508" + ], + "mAssetSupply": "119056419783976978978822817" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "35538168214740285784064", + "36247864364734835851264", + "39629930853479649116160" + ], + "expectedQty": "111536703106609673361495", + "swapFee": "66962199183475889550", + "reserves": [ + "20132255963523575393307545", + "46585584922335730563648211", + "52316336360896848703193348" + ], + "mAssetSupply": "118944883080870369305461322" + }, + { + "type": "mintMulti", + "inputQtys": [ + "300311027626476352", + "235805584285233664", + "281890546426168640" + ], + "expectedQty": "819365056214909606", + "reserves": [ + "20132256263834603019783897", + "46585585158141314848881875", + "52316336642787395129361988" + ], + "mAssetSupply": "118944883900235425520370928" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "107522630035071523880960", + "94588289775420785557504", + "91218974800122824622080" + ], + "expectedQty": "293826979996864425868982", + "swapFee": "176402029215648044347", + "reserves": [ + "20024733633799531495902937", + "46490996868365894063324371", + "52225117667987272304739908" + ], + "mAssetSupply": "118651056920238561094501946" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "9668516117482540367872", + "expectedQty": "9636673874521444437770", + "reserves": [ + "20024733633799531495902937", + "46490996868365894063324371", + "52234786184104754845107780" + ] + }, + { + "type": "redeemMasset", + "inputQty": "318833702407033361688166", + "expectedQtys": [ + "53789038331614383417590", + "124880862754977308698180", + "140309427714838570762108" + ], + "redemptionFee": "95650110722110008506", + "reserves": [ + "19970944595467917112485347", + "46366116005610916754626191", + "52094476756389916274345672" + ], + "mAssetSupply": "118341955541816771287260056" + }, + { + "type": "redeemMasset", + "inputQty": "272971701953445597544448", + "expectedQtys": [ + "46051860982611111554463", + "106917623169340396143895", + "120126896856524217422149" + ], + "redemptionFee": "81891510586033679263", + "reserves": [ + "19924892734485306000930884", + "46259198382441576358482296", + "51974349859533392056923523" + ], + "mAssetSupply": "118069065731373911723394871" + }, + { + "type": "mintMulti", + "inputQtys": [ + "1515332869605347072", + "4043509709493129216", + "11173898199051636736" + ], + "expectedQty": "16700942027435290441", + "reserves": [ + "19924894249818175606277956", + "46259202425951285851611512", + "51974361033431591108560259" + ], + "mAssetSupply": "118069082432315939158685312" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "790146745090511495757824", + "expectedQty": "792243846476262742710786", + "swapFee": "474088047054306897454", + "reserves": [ + "19924894249818175606277956", + "46259202425951285851611512", + "51182117186955328365849473" + ], + "mAssetSupply": "117279409775272481969824942" + }, + { + "type": "mintMulti", + "inputQtys": [ + "478612945638390876864512", + "471675360647408535994368", + "436842661080257169195008" + ], + "expectedQty": "1389038856833597308982931", + "reserves": [ + "20403507195456566483142468", + "46730877786598694387605880", + "51618959848035585535044481" + ], + "mAssetSupply": "118668448632106079278807873" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "51305214286736520", + "207761479877529600", + "59823410547601112" + ], + "expectedQty": "318688139192709224", + "swapFee": "191327680123699", + "reserves": [ + "20403507144151352196405948", + "46730877578837214510076280", + "51618959788212174987443369" + ], + "mAssetSupply": "118668448313417940086098649" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "16096359791373762691072", + "expectedQty": "16045973185430364898026", + "reserves": [ + "20403507144151352196405948", + "46730877578837214510076280", + "51635056148003548750134441" + ] + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "603637774345623889248256", + "outputIndex": 2, + "expectedQty": "603717347242579621295158", + "swapFee": "361335903392919044895", + "reserves": [ + "20403507144151352196405948", + "47334515353182838399324536", + "51031338800760969128839283" + ], + "mAssetSupply": "118684855622506763370041570", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemBassets", + "inputQtys": [ + "127644119330554285916160", + "44131793073211021721600", + "89995339537043345637376" + ], + "expectedQty": "262548234398062745404323", + "swapFee": "157623514747686258997", + "reserves": [ + "20275863024820797910489788", + "47290383560109627377602936", + "50941343461223925783201907" + ], + "mAssetSupply": "118422307388108700624637247" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "23061803210530780872704", + "expectedQty": "22991473620509893983685", + "reserves": [ + "20275863024820797910489788", + "47290383560109627377602936", + "50964405264434456564074611" + ] + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "802848032557459285475328", + "expectedQty": "800359161756815988342378", + "reserves": [ + "20275863024820797910489788", + "47290383560109627377602936", + "51767253296991915849549939" + ] + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "74947215062380871680", + "expectedQty": "75081774909767411729", + "swapFee": "44968329037428523", + "reserves": [ + "20275863024820797910489788", + "47290308478334717610191207", + "51767253296991915849549939" + ], + "mAssetSupply": "119245583121239293163520153" + }, + { + "type": "redeemMasset", + "inputQty": "647650902757621524070", + "expectedQtys": [ + "110089960099991082556", + "256767771962306023162", + "281075821185783592993" + ], + "redemptionFee": "194295270827286457", + "reserves": [ + "20275752934860697919407232", + "47290051710562755304168045", + "51766972221170730065956946" + ], + "mAssetSupply": "119244935664631806369282540" + }, + { + "type": "redeemMasset", + "inputQty": "14521074913079832294195", + "expectedQtys": [ + "2468342977649200349410", + "5757027491282019696524", + "6302041791828821486069" + ], + "redemptionFee": "4356322473923949688", + "reserves": [ + "20273284591883048719057822", + "47284294683071473284471521", + "51760670179378901244470877" + ], + "mAssetSupply": "119230418946041200460938033" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "230197213335842291712", + "expectedQty": "232334393816277843866", + "reserves": [ + "20273514789096384561349534", + "47284294683071473284471521", + "51760670179378901244470877" + ] + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "959722320112318545920", + "outputIndex": 1, + "expectedQty": "958417707025353733501", + "swapFee": "574020121102848576", + "reserves": [ + "20273514789096384561349534", + "47283336265364447930738020", + "51761629901699013563016797" + ], + "mAssetSupply": "119230651854455137841630475", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemBassets", + "inputQtys": [ + "20569341905227814535168", + "12581594252156696788992", + "5917022737795019440128" + ], + "expectedQty": "39210353539174584273592", + "swapFee": "23540336325299930522", + "reserves": [ + "20252945447191156746814366", + "47270754671112291233949028", + "51755712878961218543576669" + ], + "mAssetSupply": "119191441500915963257356883" + }, + { + "type": "mintMulti", + "inputQtys": [ + "119311791032958205952", + "173128069258397876224", + "114572671988323237888" + ], + "expectedQty": "407346559316185969142", + "reserves": [ + "20253064758982189705020318", + "47270927799181549631825252", + "51755827451633206866814557" + ], + "mAssetSupply": "119191848847475279443326025" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "100095418567984548937728", + "18797773273533050257408", + "84113429525221160779776" + ], + "expectedQty": "203630596866689897224544", + "swapFee": "122251709145501239078", + "reserves": [ + "20152969340414205156082590", + "47252130025908016581567844", + "51671714022107985706034781" + ], + "mAssetSupply": "118988218250608589546101481" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "1672280775860288000", + "1934660387120848640", + "978063478228388224" + ], + "expectedQty": "4592922739801579350", + "swapFee": "2757408088734188", + "reserves": [ + "20152967668133429295794590", + "47252128091247629460719204", + "51671713044044507477646557" + ], + "mAssetSupply": "118988213657685849744522131" + }, + { + "type": "mintMulti", + "inputQtys": [ + "54629171752314515488768", + "381481817325972439957504", + "101526363255630983069696" + ], + "expectedQty": "536902596779371645451505", + "reserves": [ + "20207596839885743811283358", + "47633609908573601900676708", + "51773239407300138460716253" + ], + "mAssetSupply": "119525116254465221389973636" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "1314951423118010774192128", + "outputIndex": 2, + "expectedQty": "1314790540682100178225021", + "swapFee": "786970550196437745596", + "reserves": [ + "20207596839885743811283358", + "48948561331691612674868836", + "50458448866618038282491232" + ], + "mAssetSupply": "119525903225015417827719232", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemMasset", + "inputQty": "358813680656695312148070", + "expectedQtys": [ + "60644486049524013728008", + "146898236754451531169613", + "151429520423346894335466" + ], + "redemptionFee": "107644104197008593644", + "reserves": [ + "20146952353836219797555350", + "48801663094937161143699223", + "50307019346194691388155766" + ], + "mAssetSupply": "119167197188462919524164806" + }, + { + "type": "redeemMasset", + "inputQty": "45302147448204001961574", + "expectedQtys": [ + "7656690915206952153140", + "18546688546411665072429", + "19118787359707306240299" + ], + "redemptionFee": "13590644234461200588", + "reserves": [ + "20139295662921012845402210", + "48783116406390749478626794", + "50287900558834984081915467" + ], + "mAssetSupply": "119121908631658949983403820" + }, + { + "type": "redeemMasset", + "inputQty": "2885128466534874113638", + "expectedQtys": [ + "487626705647445247357", + "1181170917921463374330", + "1217605803790775766857" + ], + "redemptionFee": "865538539960462234", + "reserves": [ + "20138808036215365400154853", + "48781935235472828015252464", + "50286682953031193306148610" + ], + "mAssetSupply": "119119024368730955069752416" + }, + { + "type": "mintMulti", + "inputQtys": [ + "227982650142850453340160", + "1046684168708874903224320", + "797532165725665462583296" + ], + "expectedQty": "2069192039738503417084593", + "reserves": [ + "20366790686358215853495013", + "49828619404181702918476784", + "51084215118756858768731906" + ], + "mAssetSupply": "121188216408469458486837009" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "71479695325365387264", + "47055795292503883776", + "29614356669640839168" + ], + "expectedQty": "148617610849906336949", + "swapFee": "89224100970526117", + "reserves": [ + "20366719206662890488107749", + "49828572348386410414593008", + "51084185504400189127892738" + ], + "mAssetSupply": "121188067790858608580500060" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "1496523209032629028388864", + "outputIndex": 2, + "expectedQty": "1512738607060325431162179", + "swapFee": "905862898992222959890", + "reserves": [ + "21863242415695519516496613", + "49828572348386410414593008", + "49571446897339863696730559" + ], + "mAssetSupply": "121188973653757600803459950", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mintMulti", + "inputQtys": [ + "2600020677604789248", + "786489118616226560", + "8623601521063417856" + ], + "expectedQty": "12007446836069260431", + "reserves": [ + "21863245015716197121285861", + "49828573134875529030819568", + "49571455520941384760148415" + ], + "mAssetSupply": "121188985661204436872720381" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "230583328859900690300928", + "outputIndex": 0, + "expectedQty": "228025625859597765449322", + "swapFee": "138000612719154385419", + "reserves": [ + "21635219389856599355836539", + "50059156463735429721120496", + "49571455520941384760148415" + ], + "mAssetSupply": "121189123661817156027105800", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "72196825043035391787008", + "outputIndex": 1, + "expectedQty": "72158459903009209479063", + "swapFee": "43209623764810361630", + "reserves": [ + "21635219389856599355836539", + "49986998003832420511641433", + "49643652345984420151935423" + ], + "mAssetSupply": "121189166871440920837467430", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "1187823425386025472", + "outputIndex": 2, + "expectedQty": "1187043401218357004", + "swapFee": "710863739130090", + "reserves": [ + "21635219389856599355836539", + "49986999191655845897666905", + "49643651158941018933578419" + ], + "mAssetSupply": "121189166872151784576597520", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemBassets", + "inputQtys": [ + "112630324422726228377600", + "675885368210564765974528", + "21753561453638715441152" + ], + "expectedQty": "809415173437254655155751", + "swapFee": "485940668463430851604", + "reserves": [ + "21522589065433873127458939", + "49311113823445281131692377", + "49621897597487380218137267" + ], + "mAssetSupply": "120379751698714529921441769" + }, + { + "type": "mintMulti", + "inputQtys": [ + "825460546582277914624", + "425473361759704973312", + "161381667775001559040" + ], + "expectedQty": "1417537669341240682002", + "reserves": [ + "21523414525980455405373563", + "49311539296807040836665689", + "49622058979155155219696307" + ], + "mAssetSupply": "120381169236383871162123771" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "843340219290128896", + "expectedQty": "841225987085874388", + "reserves": [ + "21523414525980455405373563", + "49311540140147260126794585", + "49622058979155155219696307" + ] + }, + { + "type": "redeemMasset", + "inputQty": "1381547462730951373619", + "expectedQtys": [ + "246938105211069695184", + "565751232108134883841", + "569313814320376036502" + ], + "redemptionFee": "414464238819285412", + "reserves": [ + "21523167587875244335678379", + "49310974388915151991910744", + "49621489665340834843659805" + ], + "mAssetSupply": "120379788944611366115909952" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "2165575409450248568832", + "157880791261456214523904", + "202139324483201423900672" + ], + "expectedQty": "361292788106802713568549", + "swapFee": "216905816353893964519", + "reserves": [ + "21521002012465794087109547", + "49153093597653695777386840", + "49419350340857633419759133" + ], + "mAssetSupply": "120018496156504563402341403" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "180900328141652819968", + "84463854444258443264", + "75264625978278068224" + ], + "expectedQty": "341683866534257901336", + "swapFee": "205133399960531059", + "reserves": [ + "21520821112137652434289579", + "49153009133799251518943576", + "49419275076231655141690909" + ], + "mAssetSupply": "120018154472638029144440067" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "919368878732693864448", + "2302612129573121556480", + "4335855200662074687488" + ], + "expectedQty": "7548475068307760133691", + "swapFee": "4531804123458731319", + "reserves": [ + "21519901743258919740425131", + "49150706521669678397387096", + "49414939221030993067003421" + ], + "mAssetSupply": "120010605997569721384306376" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "5172532377532161536819200", + "expectedQty": "5205179411061411038770646", + "reserves": [ + "26692434120791081277244331", + "49150706521669678397387096", + "49414939221030993067003421" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "1205693475822501049139200", + "1016355797013840118415360", + "1302695316896792002428928" + ], + "expectedQty": "3526647004861465662227675", + "swapFee": "2117258558051710423590", + "reserves": [ + "25486740644968580228105131", + "48134350724655838278971736", + "48112243904134201064574493" + ], + "mAssetSupply": "121689138403769666760849347" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "773236103136497329242112", + "expectedQty": "774151881044043249052268", + "swapFee": "463941661881898397545", + "reserves": [ + "25486740644968580228105131", + "47360198843611795029919468", + "48112243904134201064574493" + ], + "mAssetSupply": "120916366242295051330004780" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "112541131477442166784", + "263465573664033275904", + "69927413686133063680" + ], + "expectedQty": "445915844936892884627", + "swapFee": "267710133041960907", + "reserves": [ + "25486628103837102785938347", + "47359935378038130996643564", + "48112173976720514931510813" + ], + "mAssetSupply": "120915920326450114437120153" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "13884068710634571694080", + "outputIndex": 0, + "expectedQty": "13780119299918567347985", + "swapFee": "8314935388304725535", + "reserves": [ + "25472847984537184218590362", + "47359935378038130996643564", + "48126058045431149503204893" + ], + "mAssetSupply": "120915928641385502741845688", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemMasset", + "inputQty": "317146355721883083813683", + "expectedQtys": [ + "66791839690811608125127", + "124181529032690659775447", + "126190363789411765930346" + ], + "redemptionFee": "95143906716564925144", + "reserves": [ + "25406056144846372610465235", + "47235753849005440336868117", + "47999867681641737737274547" + ], + "mAssetSupply": "120598877429570336222957149" + }, + { + "type": "mintMulti", + "inputQtys": [ + "12521388655591626375168", + "80891146846975113035776", + "552384564925813751808" + ], + "expectedQty": "93886480808156848342805", + "reserves": [ + "25418577533501964236840403", + "47316644995852415449903893", + "48000420066206663551026355" + ], + "mAssetSupply": "120692763910378493071299954" + }, + { + "type": "mintMulti", + "inputQtys": [ + "41648336747596003409920", + "195103507031807114608640", + "38123160768145977769984" + ], + "expectedQty": "274673667961851310973693", + "reserves": [ + "25460225870249560240250323", + "47511748502884222564512533", + "48038543226974809528796339" + ], + "mAssetSupply": "120967437578340344382273647" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "70916666447209233907712", + "expectedQty": "71275871529344664462315", + "reserves": [ + "25531142536696769474158035", + "47511748502884222564512533", + "48038543226974809528796339" + ] + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "36503415886692583735296", + "expectedQty": "36548648529451830387381", + "swapFee": "21902049532015550241", + "reserves": [ + "25531142536696769474158035", + "47511748502884222564512533", + "48001994578445357698408958" + ], + "mAssetSupply": "121002231936032528478550907" + }, + { + "type": "redeemMasset", + "inputQty": "92042628145675593318", + "expectedQtys": [ + "19414918510294527947", + "36129864699131889723", + "36502667741272697367" + ], + "redemptionFee": "27612788443702677", + "reserves": [ + "25531123121778259179630088", + "47511712373019523432622810", + "48001958075777616425711591" + ], + "mAssetSupply": "121002139921017171246660266" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "10715327314313166716928", + "expectedQty": "10727708835550634898933", + "swapFee": "6429196388587900030", + "reserves": [ + "25531123121778259179630088", + "47500984664183972797723877", + "48001958075777616425711591" + ], + "mAssetSupply": "120991431022899246667843368" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "64796769135830147072", + "178894259433222537216", + "128118161298328616960" + ], + "expectedQty": "371587179505568730237", + "swapFee": "223086159398980626", + "reserves": [ + "25531058325009123349483016", + "47500805769924539575186661", + "48001829957616318097094631" + ], + "mAssetSupply": "120991059435719741099113131" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "3976657987263177779314688", + "expectedQty": "3949946236428801817531534", + "swapFee": "2385994792357906667588", + "reserves": [ + "21581112088580321531951482", + "47500805769924539575186661", + "48001829957616318097094631" + ], + "mAssetSupply": "117016787443248921226466031" + }, + { + "type": "redeemMasset", + "inputQty": "336140960058003931581644", + "expectedQtys": [ + "61975034576735079999162", + "136409285486803097309532", + "137848089531216047648239" + ], + "redemptionFee": "100842288017401179474", + "reserves": [ + "21519137054003586451952320", + "47364396484437736477877129", + "47863981868085102049446392" + ], + "mAssetSupply": "116680747325478934696063861" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "523292743627101278568448", + "expectedQty": "527094250045883577501724", + "reserves": [ + "22042429797630687730520768", + "47364396484437736477877129", + "47863981868085102049446392" + ] + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "169557066262847244206080", + "outputIndex": 1, + "expectedQty": "169436057235990039805246", + "swapFee": "101495119913337349318", + "reserves": [ + "22042429797630687730520768", + "47194960427201746438071883", + "48033538934347949293652472" + ], + "mAssetSupply": "117207943070644731610914903", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "302100451385292162596864", + "expectedQty": "299766580705141110946883", + "swapFee": "181260270831175297558", + "reserves": [ + "21742663216925546619573885", + "47194960427201746438071883", + "48033538934347949293652472" + ], + "mAssetSupply": "116906023879530270623615597" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "21198284021855277056", + "expectedQty": "21150014748489109563", + "reserves": [ + "21742663216925546619573885", + "47194981625485768293348939", + "48033538934347949293652472" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "3159683743159422550016", + "3020128293120085852160", + "2727226727117654327296" + ], + "expectedQty": "8916605426714048008914", + "swapFee": "5353175161125103867", + "reserves": [ + "21739503533182387197023869", + "47191961497192648207496779", + "48030811707620831639325176" + ], + "mAssetSupply": "116897128424118305064716246" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "4265291738351536701440", + "outputIndex": 2, + "expectedQty": "4304229337023992020913", + "swapFee": "2577836898972216544", + "reserves": [ + "21743768824920738733725309", + "47191961497192648207496779", + "48026507478283807647304263" + ], + "mAssetSupply": "116897131001955204036932790", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "2867067195518196725579776", + "outputIndex": 2, + "expectedQty": "2864351631178465829703484", + "swapFee": "1716019119871197809604", + "reserves": [ + "21743768824920738733725309", + "50059028692710844933076555", + "45162155847105341817600779" + ], + "mAssetSupply": "116898847021075075234742394", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemMasset", + "inputQty": "423258989821094631833", + "expectedQtys": [ + "78704665516438611099", + "181195778020877300704", + "163470849905002845981" + ], + "redemptionFee": "126977696946328389", + "reserves": [ + "21743690120255222295114210", + "50058847496932824055775851", + "45161992376255436814754798" + ], + "mAssetSupply": "116898423889062951086438950" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "515832782922109761355776", + "expectedQty": "514824212972322854208482", + "reserves": [ + "21743690120255222295114210", + "50058847496932824055775851", + "45677825159177546576110574" + ] + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "223861510401899314020352", + "outputIndex": 0, + "expectedQty": "221448579426725109470038", + "swapFee": "133947794840788684940", + "reserves": [ + "21522241540828497185644172", + "50282709007334723369796203", + "45677825159177546576110574" + ], + "mAssetSupply": "117413382049830114729332372", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mintMulti", + "inputQtys": [ + "605031845621513033089024", + "638537864329675759681536", + "1178060599308997460230144" + ], + "expectedQty": "2422032161950297897039356", + "reserves": [ + "22127273386450010218733196", + "50921246871664399129477739", + "46855885758486544036340718" + ], + "mAssetSupply": "119835414211780412626371728" + }, + { + "type": "mintMulti", + "inputQtys": [ + "29935060416286263607296", + "48411939944665773506560", + "17942068333347854090240" + ], + "expectedQty": "96343837390227246696347", + "reserves": [ + "22157208446866296482340492", + "50969658811609064902984299", + "46873827826819891890430958" + ], + "mAssetSupply": "119931758049170639873068075" + }, + { + "type": "mintMulti", + "inputQtys": [ + "976254680668417", + "4010418090427358", + "1524083464065792" + ], + "expectedQty": "6504027912647676", + "reserves": [ + "22157208447842551163008909", + "50969658815619482993411657", + "46873827828343975354496750" + ], + "mAssetSupply": "119931758055674667785715751" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "195260518808311417536512", + "expectedQty": "195672377107158648701638", + "swapFee": "117156311284986850521", + "reserves": [ + "22157208447842551163008909", + "50773986438512324344710019", + "46873827828343975354496750" + ], + "mAssetSupply": "119736614693177641355029760" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "15691530483041530", + "outputIndex": 1, + "expectedQty": "15840826711952521", + "swapFee": "9484599793574", + "reserves": [ + "22157208463534081646050439", + "50773986422671497632757498", + "46873827828343975354496750" + ], + "mAssetSupply": "119736614693187125954823334", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemBassets", + "inputQtys": [ + "357686520914928795648", + "185156831386570162176", + "309496902956396707840" + ], + "expectedQty": "853857176249195968118", + "swapFee": "512621878876843687", + "reserves": [ + "22156850777013166717254791", + "50773801265840111062595322", + "46873518331441018957788910" + ], + "mAssetSupply": "119735760836010876758855216" + }, + { + "type": "mintMulti", + "inputQtys": [ + "1079502669520470357835776", + "619203552250675947634688", + "1083139338047452002385920" + ], + "expectedQty": "2785772157471755558318962", + "reserves": [ + "23236353446533637075090567", + "51393004818090787010230010", + "47956657669488470960174830" + ], + "mAssetSupply": "122521532993482632317174178" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "1599490767581034491936768", + "expectedQty": "1609733406811688077683961", + "reserves": [ + "24835844214114671567027335", + "51393004818090787010230010", + "47956657669488470960174830" + ] + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "3467502603818691121381376", + "outputIndex": 1, + "expectedQty": "3465405189221915229320871", + "swapFee": "2076452705671861702499", + "reserves": [ + "24835844214114671567027335", + "47927599628868871780909139", + "51424160273307162081556206" + ], + "mAssetSupply": "124133342852999992256560638", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemBassets", + "inputQtys": [ + "43047599917764452352", + "17976164480526043136", + "17290061283498319872" + ], + "expectedQty": "78497996598941861504", + "swapFee": "47127074203887449", + "reserves": [ + "24835801166514753802574983", + "47927581652704391254866003", + "51424142983245878583236334" + ], + "mAssetSupply": "124133264355003393314699134" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "65099784434996582809600", + "24644222218918237831168", + "86859011963560413626368" + ], + "expectedQty": "176746947034985650234266", + "swapFee": "106111835322184700961", + "reserves": [ + "24770701382079757219765383", + "47902937430485473017034835", + "51337283971282318169609966" + ], + "mAssetSupply": "123956517407968407664464868" + }, + { + "type": "mintMulti", + "inputQtys": [ + "2556320381380189487104", + "32179875266842289242112", + "57365079109385964224512" + ], + "expectedQty": "91928231809829764656141", + "reserves": [ + "24773257702461137409252487", + "47935117305752315306276947", + "51394649050391704133834478" + ], + "mAssetSupply": "124048445639778237429121009" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "95549213175288269111296", + "expectedQty": "95328610607565827879472", + "reserves": [ + "24773257702461137409252487", + "47935117305752315306276947", + "51490198263566992402945774" + ] + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "497553685626870848", + "expectedQty": "498123991026106690", + "swapFee": "298532211376122", + "reserves": [ + "24773257702461137409252487", + "47935116807628324280170257", + "51490198263566992402945774" + ], + "mAssetSupply": "124143773753130649841505755" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "97022594226226383028224", + "74617472070391439556608", + "85652403938836090978304" + ], + "expectedQty": "257544527093799012422422", + "swapFee": "154619487949048836755", + "reserves": [ + "24676235108234911026224263", + "47860499335557932840613649", + "51404545859628156311967470" + ], + "mAssetSupply": "123886229226036850829083333" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "3179932227108330496", + "expectedQty": "3199028209975487735", + "reserves": [ + "24676238288167138134554759", + "47860499335557932840613649", + "51404545859628156311967470" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "5460052223524556767232", + "7846333538480315957248", + "784771070061722075136" + ], + "expectedQty": "14108376991171933387250", + "swapFee": "8470108259658955405", + "reserves": [ + "24670778235943613577787527", + "47852653002019452524656401", + "51403761088558094589892334" + ], + "mAssetSupply": "123872124048073888871183818" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "1160007521596944678912", + "1026480258664547745792", + "651100843071398739968" + ], + "expectedQty": "2841245699800306619430", + "swapFee": "1705770882409629749", + "reserves": [ + "24669618228422016633108615", + "47851626521760787976910609", + "51403109987715023191152366" + ], + "mAssetSupply": "123869282802374088564564388" + }, + { + "type": "mintMulti", + "inputQtys": [ + "136894719189234", + "94111033234881", + "164258764706077" + ], + "expectedQty": "395540393154457", + "reserves": [ + "24669618228558911352297849", + "47851626521854899010145490", + "51403109987879281955858443" + ], + "mAssetSupply": "123869282802769628957718845" + }, + { + "type": "redeemMasset", + "inputQty": "7721485799903926943744", + "expectedQtys": [ + "1537338044590329914086", + "2981972613682902021584", + "3203290616923512005091" + ], + "redemptionFee": "2316445739971178083", + "reserves": [ + "24668080890514321022383763", + "47848644549241216108123906", + "51399906697262358443853352" + ], + "mAssetSupply": "123861563633415465001953184" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "2599719974779819101519872", + "1376048710060270516436992", + "1896720548098636555223040" + ], + "expectedQty": "5882305916763012709916656", + "swapFee": "3531502451528724860866", + "reserves": [ + "22068360915734501920863891", + "46472595839180945591686914", + "49503186149163721888630312" + ], + "mAssetSupply": "117979257716652452292036528" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "7178357864003008462848", + "expectedQty": "7122878908463741666606", + "swapFee": "4307014718401805077", + "reserves": [ + "22061238036826038179197285", + "46472595839180945591686914", + "49503186149163721888630312" + ], + "mAssetSupply": "117972083665803167685378757" + }, + { + "type": "redeemMasset", + "inputQty": "62219304159020757863628", + "expectedQtys": [ + "11631761061042827778451", + "24502619924839732124857", + "26100494998794691582834" + ], + "redemptionFee": "18665791247706227359", + "reserves": [ + "22049606275764995351418834", + "46448093219256105859562057", + "49477085654164927197047478" + ], + "mAssetSupply": "117909883027435394633742488" + }, + { + "type": "redeemMasset", + "inputQty": "6216090961340420915", + "expectedQtys": [ + "1162084433011726367", + "2447962353527437944", + "2607599895907804287" + ], + "redemptionFee": "1864827288402126", + "reserves": [ + "22049605113680562339692467", + "46448090771293752332124113", + "49477083046565031289243191" + ], + "mAssetSupply": "117909876813209260581723699" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "3864796479306391040", + "238591520894182976", + "6816407969241250816" + ], + "expectedQty": "10929517009240751638", + "swapFee": "6561647193860767", + "reserves": [ + "22049601248884083033301427", + "46448090532702231437941137", + "49477076230157062047992375" + ], + "mAssetSupply": "117909865883692251340972061" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "489742613093236408320", + "expectedQty": "490461339274041196822", + "swapFee": "293845567855941844", + "reserves": [ + "22049601248884083033301427", + "46447600071362957396744315", + "49477076230157062047992375" + ], + "mAssetSupply": "117909376434924725960505585" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "103944668708480080", + "outputIndex": 2, + "expectedQty": "104899137324179711", + "swapFee": "62815012566004", + "reserves": [ + "22049601352828751741781507", + "46447600071362957396744315", + "49477076125257924723812664" + ], + "mAssetSupply": "117909376434987540973071589", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "202162309345458025136128", + "outputIndex": 2, + "expectedQty": "203994242647074123363117", + "swapFee": "122160190598336115869", + "reserves": [ + "22251763662174209766917635", + "46447600071362957396744315", + "49273081882610850600449547" + ], + "mAssetSupply": "117909498595178139309187458", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mintMulti", + "inputQtys": [ + "8189490184680249491456", + "8473808918858435657728", + "3854828567101241294848" + ], + "expectedQty": "20548493380268771353580", + "reserves": [ + "22259953152358890016409091", + "46456073880281815832402043", + "49276936711177951841744395" + ], + "mAssetSupply": "117930047088558408080541038" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "13200102832401844224", + "12806010767319048192", + "7055864970368954368" + ], + "expectedQty": "33110523909757431548", + "swapFee": "19878241290628836", + "reserves": [ + "22259939952256057614564867", + "46456061074271048513353851", + "49276929655312981472790027" + ], + "mAssetSupply": "117930013978034498323109490" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "1034075790982158614528", + "expectedQty": "1031965981968420035443", + "reserves": [ + "22259939952256057614564867", + "46457095150062030671968379", + "49276929655312981472790027" + ] + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "34760883894446186299392", + "outputIndex": 2, + "expectedQty": "35070829471258148729918", + "swapFee": "21002314928275171577", + "reserves": [ + "22294700836150503800864259", + "46457095150062030671968379", + "49241858825841723324060109" + ], + "mAssetSupply": "117931066946331395018316510", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "1464576061916681216", + "outputIndex": 0, + "expectedQty": "1449920401830266443", + "swapFee": "876543183102898", + "reserves": [ + "22294699386230101970597816", + "46457095150062030671968379", + "49241860290417785240741325" + ], + "mAssetSupply": "117931066947207938201419408", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mintMulti", + "inputQtys": [ + "46210952797815216013312", + "44960259757076069220352", + "38795863530184831401984" + ], + "expectedQty": "130100198126977690568401", + "reserves": [ + "22340910339027917186611128", + "46502055409819106741188731", + "49280656153947970072143309" + ], + "mAssetSupply": "118061167145334915891987809" + }, + { + "type": "mintMulti", + "inputQtys": [ + "48704894095213953024", + "6199219315659154432", + "24082139194825216000" + ], + "expectedQty": "79252051047750749800", + "reserves": [ + "22340959043922012400564152", + "46502061609038422400343163", + "49280680236087164897359309" + ], + "mAssetSupply": "118061246397385963642737609" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "1193911826569856548864", + "expectedQty": "1202212293760513444043", + "reserves": [ + "22342152955748582257113016", + "46502061609038422400343163", + "49280680236087164897359309" + ] + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "99472194877358174371840", + "expectedQty": "99269388510309342289043", + "reserves": [ + "22342152955748582257113016", + "46601533803915780574715003", + "49280680236087164897359309" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "454413397276825472", + "188250497890290912", + "523183306477004800" + ], + "expectedQty": "1167322501973978270", + "swapFee": "700813989578133", + "reserves": [ + "22342152501335184980287544", + "46601533615665282684424091", + "49280679712903858420354509" + ], + "mAssetSupply": "118161716830867531524492425" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "216603227498726555648", + "973186514920687665152", + "1014212104647641137152" + ], + "expectedQty": "2200989007497704302243", + "swapFee": "1321386236240366801", + "reserves": [ + "22341935898107686253731896", + "46600560429150361996758939", + "49279665500799210779217357" + ], + "mAssetSupply": "118159515841860033820190182" + }, + { + "type": "redeemMasset", + "inputQty": "540762571749955", + "expectedQtys": [ + "102218243899067", + "213205671769187", + "225463043596497" + ], + "redemptionFee": "162228771524", + "reserves": [ + "22341935898005468009832829", + "46600560428937156324989752", + "49279665500573747735620860" + ], + "mAssetSupply": "118159515841319433477211751" + }, + { + "type": "redeemMasset", + "inputQty": "20592591965882743049420", + "expectedQtys": [ + "3892537498057304531427", + "8119011249885328702720", + "8585779975755315569495" + ], + "redemptionFee": "6177777589764822914", + "reserves": [ + "22338043360507410705301402", + "46592441417687270996287032", + "49271079720597992420051365" + ], + "mAssetSupply": "118138929427131140498985245" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "177499680948221240147968", + "outputIndex": 2, + "expectedQty": "177468101549857903905055", + "swapFee": "106280813434866352467", + "reserves": [ + "22338043360507410705301402", + "46769941098635492236435000", + "49093611619048134516146310" + ], + "mAssetSupply": "118139035707944575365337712", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mintMulti", + "inputQtys": [ + "8403544170992940032", + "3871882643656889856", + "9756704032525842432" + ], + "expectedQty": "22058572738004716495", + "reserves": [ + "22338051764051581698241434", + "46769944970518135893324856", + "49093621375752167041988742" + ], + "mAssetSupply": "118139057766517313370054207" + }, + { + "type": "mintMulti", + "inputQtys": [ + "27184438294174559633408", + "116726916513891455336448", + "74235969094193801854976" + ], + "expectedQty": "217911098768729036219064", + "reserves": [ + "22365236202345756257874842", + "46886671887032027348661304", + "49167857344846360843843718" + ], + "mAssetSupply": "118356968865286042406273271" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "22240896071582160519168", + "expectedQty": "22194548123530907279230", + "reserves": [ + "22365236202345756257874842", + "46908912783103609509180472", + "49167857344846360843843718" + ] + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "4981301910483171316596736", + "expectedQty": "4969401398286517086631296", + "reserves": [ + "22365236202345756257874842", + "51890214693586780825777208", + "49167857344846360843843718" + ] + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "3810557539956641490796544", + "expectedQty": "3772203292735178258370266", + "swapFee": "2286334523973984894477", + "reserves": [ + "18593032909610577999504576", + "51890214693586780825777208", + "49167857344846360843843718" + ], + "mAssetSupply": "119540293606263422894281730" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "12729850618559518998528", + "expectedQty": "12760456288168089194325", + "swapFee": "7637910371135711399", + "reserves": [ + "18593032909610577999504576", + "51890214693586780825777208", + "49155096888558192754649393" + ], + "mAssetSupply": "119527571393555234510994601" + }, + { + "type": "redeemMasset", + "inputQty": "1507104129453758668", + "expectedQtys": [ + "234366262608185378", + "654079178087519016", + "619602858873007418" + ], + "redemptionFee": "452131238836127", + "reserves": [ + "18593032675244315391319198", + "51890214039507602738258192", + "49155096268955333881641975" + ], + "mAssetSupply": "119527569886903236296072060" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "1713094356075732229160960", + "expectedQty": "1707767390055125660492945", + "reserves": [ + "18593032675244315391319198", + "51890214039507602738258192", + "50868190625031066110802935" + ] + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "302868567692887218716672", + "expectedQty": "303712105591893214563678", + "swapFee": "181721140615732331230", + "reserves": [ + "18593032675244315391319198", + "51586501933915709523694514", + "50868190625031066110802935" + ], + "mAssetSupply": "120932650430406090470179563" + }, + { + "type": "redeemMasset", + "inputQty": "159171689121378651340", + "expectedQtys": [ + "24464828654236633834", + "67877841809263155887", + "66932683297512606891" + ], + "redemptionFee": "47751506736413595", + "reserves": [ + "18593008210415661154685364", + "51586434056073900260538627", + "50868123692347768598196044" + ], + "mAssetSupply": "120932491306468475827941818" + }, + { + "type": "redeemMasset", + "inputQty": "11817737534531465484697", + "expectedQtys": [ + "1816396656082360295876", + "5039605493541115080033", + "4969431989182065420605" + ], + "redemptionFee": "3545321260359439645", + "reserves": [ + "18591191813759578794389488", + "51581394450580359145458594", + "50863154260358586532775439" + ], + "mAssetSupply": "120920677114255204721896766" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "447994275074782527488", + "expectedQty": "446490677059289959866", + "reserves": [ + "18591191813759578794389488", + "51581842444855433927986082", + "50863154260358586532775439" + ] + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "1757730576367407576645632", + "expectedQty": "1776864155389513953658365", + "reserves": [ + "20348922390126986371035120", + "51581842444855433927986082", + "50863154260358586532775439" + ] + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "5577324536153845760", + "expectedQty": "5519394468169164247", + "swapFee": "3346394721692307", + "reserves": [ + "20348916870732518201870873", + "51581842444855433927986082", + "50863154260358586532775439" + ], + "mAssetSupply": "122697982186343636533361544" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "46227393125144422514688", + "expectedQty": "46683447698427568653583", + "reserves": [ + "20395144263857662624385561", + "51581842444855433927986082", + "50863154260358586532775439" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "415158628245344637419520", + "1725009262303145204121600", + "282306934244163488579584" + ], + "expectedQty": "2420758245407605078587210", + "swapFee": "1453326943410609412800", + "reserves": [ + "19979985635612317986966041", + "49856833182552288723864482", + "50580847326114423044195855" + ], + "mAssetSupply": "120323907388634459023427917" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "1000177191507646524424192", + "expectedQty": "997159639427891786482119", + "reserves": [ + "19979985635612317986966041", + "49856833182552288723864482", + "51581024517622069568620047" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "13349778011960687722496", + "3503569311997126246400", + "13602983559995798323200" + ], + "expectedQty": "30539050589386009023977", + "reserves": [ + "19993335413624278674688537", + "49860336751864285850110882", + "51594627501182065366943247" + ], + "mAssetSupply": "121351606078651736818934013" + }, + { + "type": "redeemMasset", + "inputQty": "236560975932610194282905", + "expectedQtys": [ + "38963011677399547876391", + "97167823322671839417127", + "100547609102268550027104" + ], + "redemptionFee": "70968292779783058284", + "reserves": [ + "19954372401946879126812146", + "49763168928541614010693755", + "51494079892079796816916143" + ], + "mAssetSupply": "121115116071011906407709392" + }, + { + "type": "redeemMasset", + "inputQty": "119504313359205993650585", + "expectedQtys": [ + "19683077221666504582569", + "49086600023549431332979", + "50793977909101330187946" + ], + "redemptionFee": "35851294007761798095", + "reserves": [ + "19934689324725212622229577", + "49714082328518064579360776", + "51443285914170695486728197" + ], + "mAssetSupply": "120995647608946708175856902" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "579773250899055191523328", + "expectedQty": "585429554041594885605855", + "reserves": [ + "20514462575624267813752905", + "49714082328518064579360776", + "51443285914170695486728197" + ] + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "42251421754352377856", + "outputIndex": 1, + "expectedQty": "42213941716487201843", + "swapFee": "25275903187094066", + "reserves": [ + "20514462575624267813752905", + "49714040114576348092158933", + "51443328165592449839106053" + ], + "mAssetSupply": "121581077188264206248556823", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "2126778169771532288", + "expectedQty": "2121099622830246586", + "reserves": [ + "20514462575624267813752905", + "49714042241354517863691221", + "51443328165592449839106053" + ] + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "865256514567291264", + "outputIndex": 1, + "expectedQty": "864488964167457835", + "swapFee": "517619026567507", + "reserves": [ + "20514462575624267813752905", + "49714041376865553696233386", + "51443329030848964406397317" + ], + "mAssetSupply": "121581079309881448105370916", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "66091585980316984016896", + "expectedQty": "66228486862722824845965", + "swapFee": "39654951588190190410", + "reserves": [ + "20514462575624267813752905", + "49647812890002830871387421", + "51443329030848964406397317" + ], + "mAssetSupply": "121515027378852719311544430" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "160858105878109984", + "outputIndex": 1, + "expectedQty": "160713620110350663", + "swapFee": "96229247310606", + "reserves": [ + "20514462575624267813752905", + "49647812729289210761036758", + "51443329191707070284507301" + ], + "mAssetSupply": "121515027378948948558855036", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mintMulti", + "inputQtys": [ + "735589687455183", + "759433180888272", + "386492731003488" + ], + "expectedQty": "1885299810639324", + "reserves": [ + "20514462576359857501208088", + "49647812730048643941925030", + "51443329192093563015510789" + ], + "mAssetSupply": "121515027380834248369494360" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "1496690573254569375039488", + "1597321009761287592214528", + "1895827907410095864020992" + ], + "expectedQty": "4994450363780199853098654", + "swapFee": "2998469299848028729096", + "reserves": [ + "19017772003105288126168600", + "48050491720287356349710502", + "49547501284683467151489797" + ], + "mAssetSupply": "116520577017054048516395706" + }, + { + "type": "mintMulti", + "inputQtys": [ + "782895365559289643008", + "823183834146397356032", + "846545549748811202560" + ], + "expectedQty": "2455710823872015852164", + "reserves": [ + "19018554898470847415811608", + "48051314904121502747066534", + "49548347830233215962692357" + ], + "mAssetSupply": "116523032727877920532247870" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "3174580479718124408537088", + "expectedQty": "3133660519639538800047267", + "swapFee": "1904748287830874645122", + "reserves": [ + "15884894378831308615764341", + "48051314904121502747066534", + "49548347830233215962692357" + ], + "mAssetSupply": "113350356996447626998355904" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "36753709864295178240", + "19124485806576140288", + "40038492017645461504" + ], + "expectedQty": "96239543917426297055", + "swapFee": "57778393386487670", + "reserves": [ + "15884857625121444320586101", + "48051295779635696170926246", + "49548307791741198317230853" + ], + "mAssetSupply": "113350260756903709572058849" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "730095248620499968", + "expectedQty": "732349012281679816", + "swapFee": "438057149172299", + "reserves": [ + "15884857625121444320586101", + "48051295047286683889246430", + "49548307791741198317230853" + ], + "mAssetSupply": "113350260027246518100731180" + }, + { + "type": "mintMulti", + "inputQtys": [ + "21931207949929832", + "63367362607859912", + "35328773329904468" + ], + "expectedQty": "120583799433011941", + "reserves": [ + "15884857647052652270515933", + "48051295110654046497106342", + "49548307827069971647135321" + ], + "mAssetSupply": "113350260147830317533743121" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "313243541748787466731520", + "expectedQty": "308335109849097718643030", + "swapFee": "187946125049272480038", + "reserves": [ + "15576522537203554551872903", + "48051295110654046497106342", + "49548307827069971647135321" + ], + "mAssetSupply": "113037204552206579339491639" + }, + { + "type": "redeemMasset", + "inputQty": "36570270074786093465", + "expectedQtys": [ + "5037870026746042591", + "15541092615897341652", + "16025267146873459661" + ], + "redemptionFee": "10971081022435828", + "reserves": [ + "15576517499333527805830312", + "48051279569561430599764690", + "49548291801802824773675660" + ], + "mAssetSupply": "113037167992907585575834002" + }, + { + "type": "mintMulti", + "inputQtys": [ + "83164918175885688832", + "184467613336889950208", + "184941379088751624192" + ], + "expectedQty": "452426981352877427925", + "reserves": [ + "15576600664251703691519144", + "48051464037174767489714898", + "49548476743181913525299852" + ], + "mAssetSupply": "113037620419888938453261927" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "1101579025178682506346496", + "expectedQty": "1104997176718436906147102", + "swapFee": "660947415107209503807", + "reserves": [ + "15576600664251703691519144", + "46946466860456330583567796", + "49548476743181913525299852" + ], + "mAssetSupply": "111936702342125363156419238" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "69760908340966146048", + "94980302412697468928", + "178404986418712641536" + ], + "expectedQty": "343136715391274888961", + "swapFee": "206005632614333533", + "reserves": [ + "15576530903343362725373096", + "46946371880153917886098868", + "49548298338195494812658316" + ], + "mAssetSupply": "111936359205409971881530277" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "285286241178597326848", + "expectedQty": "286289168156625426857", + "swapFee": "171171744707158396", + "reserves": [ + "15576530903343362725373096", + "46946371880153917886098868", + "49548012049027338187231459" + ], + "mAssetSupply": "111936074090340537991361825" + }, + { + "type": "redeemMasset", + "inputQty": "17307729059407682181529", + "expectedQtys": [ + "2407744781455106127622", + "7256743019617379031416", + "7658891969129906814772" + ], + "redemptionFee": "5192318717822304654", + "reserves": [ + "15574123158561907619245474", + "46939115137134300507067452", + "49540353157058208280416687" + ], + "mAssetSupply": "111918771553599848131484950" + }, + { + "type": "redeemMasset", + "inputQty": "141029383851333146325811", + "expectedQtys": [ + "19619140202296254691245", + "59130460923631176455807", + "62407310149288838254329" + ], + "redemptionFee": "42308815155399943897", + "reserves": [ + "15554504018359611364554229", + "46879984676210669330611645", + "49477945846908919442162358" + ], + "mAssetSupply": "111777784478563670385103036" + }, + { + "type": "mintMulti", + "inputQtys": [ + "65893529165263183872", + "38530249350161530880", + "31377840574780825600" + ], + "expectedQty": "136539791856550948780", + "reserves": [ + "15554569911888776627738101", + "46880023206460019492142525", + "49477977224749494222987958" + ], + "mAssetSupply": "111777921018355526936051816" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "33387227898048539525120", + "expectedQty": "33895784289370053971332", + "reserves": [ + "15587957139786825167263221", + "46880023206460019492142525", + "49477977224749494222987958" + ] + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "21658629585280916520960", + "outputIndex": 2, + "expectedQty": "22064198423740708566826", + "swapFee": "13192404600032494653", + "reserves": [ + "15609615769372106083784181", + "46880023206460019492142525", + "49455913026325753514421132" + ], + "mAssetSupply": "111811829995049497022517801", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemMasset", + "inputQty": "3634336333818", + "expectedQtys": [ + "507223382104", + "1523333070797", + "1607034781695" + ], + "redemptionFee": "1090300900", + "reserves": [ + "15609615769371598860402077", + "46880023206458496159071728", + "49455913026324146479639437" + ], + "mAssetSupply": "111811829995045863776484883" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "262672009052247392", + "156152111705032256", + "380836262830182016" + ], + "expectedQty": "801524696252429373", + "swapFee": "481203539875382", + "reserves": [ + "15609615506699589808154685", + "46880023050306384454039472", + "49455912645487883649457421" + ], + "mAssetSupply": "111811829193521167524055510" + }, + { + "type": "mintMulti", + "inputQtys": [ + "1224496213740531744768", + "15738189259332468604928", + "11678955182415711043584" + ], + "expectedQty": "28555993441222786352612", + "reserves": [ + "15610840002913330339899453", + "46895761239565716922644400", + "49467591600670299360501005" + ], + "mAssetSupply": "111840385186962390310408122" + }, + { + "type": "redeemMasset", + "inputQty": "121140104390056337630822", + "expectedQtys": [ + "16903835361195653414732", + "50779985380903308326362", + "53564832127966441924827" + ], + "redemptionFee": "36342031317016901289", + "reserves": [ + "15593936167552134686484721", + "46844981254184813614318038", + "49414026768542332918576178" + ], + "mAssetSupply": "111719281424603650989678589" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "255466605743422021042176", + "112857327024502682419200", + "115575907285395295961088" + ], + "expectedQty": "486942507418442781869527", + "swapFee": "292340908996463547250", + "reserves": [ + "15338469561808712665442545", + "46732123927160310931898838", + "49298450861256937622615090" + ], + "mAssetSupply": "111232338917185208207809062" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "309925670293091270000640", + "outputIndex": 2, + "expectedQty": "315745441857973587970759", + "swapFee": "188797497402848032760", + "reserves": [ + "15648395232101803935443185", + "46732123927160310931898838", + "48982705419398964034644331" + ], + "mAssetSupply": "111232527714682611055841822", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemBassets", + "inputQtys": [ + "608793100401739", + "8399141751056380", + "2102514212977701" + ], + "expectedQty": "11081027516023258", + "swapFee": "6652608074458", + "reserves": [ + "15648395231493010835041446", + "46732123918761169180842458", + "48982705417296449821666630" + ], + "mAssetSupply": "111232527703601583539818564" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "482871305563246121975808", + "expectedQty": "481126059784688213034690", + "reserves": [ + "15648395231493010835041446", + "47214995224324415302818266", + "48982705417296449821666630" + ] + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "1409549461331287981686784", + "expectedQty": "1403790107635424969395594", + "reserves": [ + "15648395231493010835041446", + "47214995224324415302818266", + "50392254878627737803353414" + ] + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "18528976345451427004416", + "expectedQty": "18235126570956598628368", + "swapFee": "11117385807270856202", + "reserves": [ + "15630160104922054236413078", + "47214995224324415302818266", + "50392254878627737803353414" + ], + "mAssetSupply": "113098926012062052566100634" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "5065540752425021865984", + "expectedQty": "5044298237038839570398", + "reserves": [ + "15630160104922054236413078", + "47214995224324415302818266", + "50397320419380162825219398" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "7565630264540702703616", + "1960841741935667314688", + "2750675778239468666880" + ], + "expectedQty": "12376063894487366350078", + "swapFee": "7430096394529137292", + "reserves": [ + "15622594474657513533709462", + "47213034382582479635503578", + "50394569743601923356552518" + ], + "mAssetSupply": "113091594246404604039320954" + }, + { + "type": "redeemMasset", + "inputQty": "15759142183812179558", + "expectedQtys": [ + "2176331756926392628", + "6577091035317581298", + "7020300161253923823" + ], + "redemptionFee": "4727742655143653", + "reserves": [ + "15622592298325756607316834", + "47213027805491444317922280", + "50394562723301762102628695" + ], + "mAssetSupply": "113091578491990162882285049" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "24335079934574", + "outputIndex": 0, + "expectedQty": "23862166196035", + "swapFee": "14548504414", + "reserves": [ + "15622592298301894441120799", + "47213027805515779397856854", + "50394562723301762102628695" + ], + "mAssetSupply": "113091578491990177430789463", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mintMulti", + "inputQtys": [ + "28945775452493560414208", + "4478171512475387691008", + "8087594051826978127872" + ], + "expectedQty": "41910537719940201428883", + "reserves": [ + "15651538073754388001535007", + "47217505977028254785547862", + "50402650317353589080756567" + ], + "mAssetSupply": "113133489029710117632218346" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "1209603591079046718423040", + "outputIndex": 0, + "expectedQty": "1184065626097734412772608", + "swapFee": "723091427536477437257", + "reserves": [ + "14467472447656653588762399", + "48427109568107301503970902", + "50402650317353589080756567" + ], + "mAssetSupply": "113134212121137654109655603", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "775985046310788792320", + "expectedQty": "772443868909749175164", + "reserves": [ + "14467472447656653588762399", + "48427109568107301503970902", + "50403426302399899869548887" + ] + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "3052035281802418605522944", + "expectedQty": "3098801015607124103720531", + "reserves": [ + "17519507729459072194285343", + "48427109568107301503970902", + "50403426302399899869548887" + ] + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "35742906323680081477632", + "expectedQty": "35276889231453438556238", + "swapFee": "21445743794208048886", + "reserves": [ + "17484230840227618755729105", + "48427109568107301503970902", + "50403426302399899869548887" + ], + "mAssetSupply": "116198064120033802089122552" + }, + { + "type": "redeemMasset", + "inputQty": "48953428480752359833", + "expectedQtys": [ + "7363773885087726445", + "20395880609596666076", + "21228239189715723495" + ], + "redemptionFee": "14686028544225707", + "reserves": [ + "17484223476453733668002660", + "48427089172226691907304826", + "50403405074160710153825392" + ], + "mAssetSupply": "116198015181291349880988426" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "259610065187321264734208", + "expectedQty": "258765372647646310222720", + "reserves": [ + "17484223476453733668002660", + "48686699237414013172039034", + "50403405074160710153825392" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "3745646347530229760", + "14389835332151726080", + "15639135134745098240" + ], + "expectedQty": "33719166129487477169", + "swapFee": "20243645865211613", + "reserves": [ + "17484219730807386137772900", + "48686684847578681020312954", + "50403389435025575408727152" + ], + "mAssetSupply": "116456746834772866703733977" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "915718652948016", + "expectedQty": "918453958486397", + "swapFee": "549431191768", + "reserves": [ + "17484219730807386137772900", + "48686684847578681020312954", + "50403389434107121450240755" + ], + "mAssetSupply": "116456746833857697481977729" + }, + { + "type": "mintMulti", + "inputQtys": [ + "106592841559025534369792", + "202324416301378972942336", + "378582523527842100150272" + ], + "expectedQty": "686836086542214212543155", + "reserves": [ + "17590812572366411672142692", + "48889009263880059993255290", + "50781971957634963550391027" + ], + "mAssetSupply": "117143582920399911694520884" + }, + { + "type": "mintMulti", + "inputQtys": [ + "29811386362497018626048", + "28966799634926917386240", + "9293439195537628725248" + ], + "expectedQty": "68321888819485865575235", + "reserves": [ + "17620623958728908690768740", + "48917976063514986910641530", + "50791265396830501179116275" + ], + "mAssetSupply": "117211904809219397560096119" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "400730469906950717440", + "expectedQty": "405802337428254648412", + "reserves": [ + "17621024689198815641486180", + "48917976063514986910641530", + "50791265396830501179116275" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "401574793583385915686912", + "849344444954795669716992", + "476996629659525475991552" + ], + "expectedQty": "1728557001081508457775015", + "swapFee": "1037756854761762131944", + "reserves": [ + "17219449895615429725799268", + "48068631618560191240924538", + "50314268767170975703124723" + ], + "mAssetSupply": "115483753610475317356969516" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "407257136726948561551360", + "expectedQty": "405754250477364821003226", + "reserves": [ + "17219449895615429725799268", + "48068631618560191240924538", + "50721525903897924264676083" + ] + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "21293786256454958710784", + "outputIndex": 1, + "expectedQty": "21270786495058355084808", + "swapFee": "12728754944634606426", + "reserves": [ + "17219449895615429725799268", + "48047360832065132885839730", + "50742819690154379223386867" + ], + "mAssetSupply": "115889520589707626812579168", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemBassets", + "inputQtys": [ + "3527871607634889015296", + "2499754778628682416128", + "3766570495458774876160" + ], + "expectedQty": "9818051155862230607768", + "swapFee": "5894367313905681773", + "reserves": [ + "17215922024007794836783972", + "48044861077286504203423602", + "50739053119658920448510707" + ], + "mAssetSupply": "115879702538551764581971400" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "13618196788195217155031040", + "expectedQty": "13561687547103172984925466", + "reserves": [ + "17215922024007794836783972", + "61663057865481721358454642", + "50739053119658920448510707" + ] + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "78794685028479876988928", + "outputIndex": 1, + "expectedQty": "80491230695634994253410", + "swapFee": "48082316733232998631", + "reserves": [ + "17294716709036274713772900", + "61582566634786086364201232", + "50739053119658920448510707" + ], + "mAssetSupply": "129441438167971670799895497", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemMasset", + "inputQty": "23475176828998297190", + "expectedQtys": [ + "3135585788729284976", + "11165110364173729140", + "9199147726568818416" + ], + "redemptionFee": "7042553048699489", + "reserves": [ + "17294713573450485984487924", + "61582555469675722190472092", + "50739043920511193879692291" + ], + "mAssetSupply": "129441414699837394850297796" + }, + { + "type": "mintMulti", + "inputQtys": [ + "738355492153837486080", + "13401166831948916588544", + "13922923229490096111616" + ], + "expectedQty": "27964040936252623137573", + "reserves": [ + "17295451928942639821974004", + "61595956636507671107060636", + "50752966843740683975803907" + ], + "mAssetSupply": "129469378740773647473435369" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "35139891390497030144", + "outputIndex": 2, + "expectedQty": "35054363511064632424", + "swapFee": "20978691392318774", + "reserves": [ + "17295451928942639821974004", + "61595991776399061604090780", + "50752931789377172911171483" + ], + "mAssetSupply": "129469378761752338865754143", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemBassets", + "inputQtys": [ + "16996159581202438144", + "14251729235335157760", + "12498084540630904832" + ], + "expectedQty": "43923210499489727173", + "swapFee": "26369748148582986", + "reserves": [ + "17295434932783058619535860", + "61595977524669826268933020", + "50752919291292632280266651" + ], + "mAssetSupply": "129469334838541839376026970" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "534150924339222", + "outputIndex": 1, + "expectedQty": "545596513703626", + "swapFee": "325919403987", + "reserves": [ + "17295434933317209543875082", + "61595977524124229755229394", + "50752919291292632280266651" + ], + "mAssetSupply": "129469334838542165295430957", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemMasset", + "inputQty": "27624025244501220419174", + "expectedQtys": [ + "3689106775352281645112", + "13138388187102431401004", + "10825569819336395643470" + ], + "redemptionFee": "8287207573350366125", + "reserves": [ + "17291745826541857262229970", + "61582839135937127323828390", + "50742093721473295884623181" + ], + "mAssetSupply": "129441719100505237425377908" + }, + { + "type": "mintMulti", + "inputQtys": [ + "9202036925891080192", + "11968736026601422848", + "517313326670196288" + ], + "expectedQty": "21782581551634630022", + "reserves": [ + "17291755028578783153310162", + "61582851104673153925251238", + "50742094238786622554819469" + ], + "mAssetSupply": "129441740883086789060007930" + }, + { + "type": "mintMulti", + "inputQtys": [ + "49536447084828639100928", + "56641787841723964063744", + "64680788959035886927872" + ], + "expectedQty": "171209865440390723708823", + "reserves": [ + "17341291475663611792411090", + "61639492892514877889314982", + "50806775027745658441747341" + ], + "mAssetSupply": "129612950748527179783716753" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "8261733433588149630533632", + "outputIndex": 2, + "expectedQty": "8228806875897230982888431", + "swapFee": "4929808424806356488792", + "reserves": [ + "17341291475663611792411090", + "69901226326103027519848614", + "42577968151848427458858910" + ], + "mAssetSupply": "129617880556951986140205545", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemBassets", + "inputQtys": [ + "453489309016559871590400", + "267461719807902785470464", + "467594038130598389743616" + ], + "expectedQty": "1194314338362690296085349", + "swapFee": "717018814306197896389", + "reserves": [ + "16887802166647051920820690", + "69633764606295124734378150", + "42110374113717829069115294" + ], + "mAssetSupply": "128423566218589295844120196" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "370487663255338950328320", + "outputIndex": 2, + "expectedQty": "377388827238852798884168", + "swapFee": "226285309628353259326", + "reserves": [ + "17258289829902390871149010", + "69633764606295124734378150", + "41732985286478976270231126" + ], + "mAssetSupply": "128423792503898924197379522", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "1388677784795042623258624", + "expectedQty": "1386793087783206843405054", + "reserves": [ + "17258289829902390871149010", + "69633764606295124734378150", + "43121663071274018893489750" + ] + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "638458541127129235456", + "expectedQty": "634369975876708474244", + "reserves": [ + "17258289829902390871149010", + "69634403064836251863613606", + "43121663071274018893489750" + ] + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "288223033109713944576", + "outputIndex": 0, + "expectedQty": "282585286151799014589", + "swapFee": "172674750027484439", + "reserves": [ + "17258007244616239072134421", + "69634403064836251863613606", + "43121951294307128607434326" + ], + "mAssetSupply": "129811220134332757776743259", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemBassets", + "inputQtys": [ + "173555713901387558420480", + "159829539614869696806912", + "230406427181161461579776" + ], + "expectedQty": "565530887346723214822151", + "swapFee": "339522245755487221226", + "reserves": [ + "17084451530714851513713941", + "69474573525221382166806694", + "42891544867125967145854550" + ], + "mAssetSupply": "129245689246986034561921108" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "46150292236391686144", + "expectedQty": "46984094082958080696", + "reserves": [ + "17084497681007087905400085", + "69474573525221382166806694", + "42891544867125967145854550" + ] + }, + { + "type": "redeemMasset", + "inputQty": "64948322772170346541875", + "expectedQtys": [ + "8582693861267642013829", + "34901757537301843706550", + "21547311820622849079430" + ], + "redemptionFee": "19484496831651103962", + "reserves": [ + "17075914987145820263386256", + "69439671767684080323100144", + "42869997555305344296775120" + ], + "mAssetSupply": "129180807392804778824563891" + }, + { + "type": "redeemMasset", + "inputQty": "26416738864651262361", + "expectedQtys": [ + "3490879714995545677", + "14195757110071820765", + "8764040167708647402" + ], + "redemptionFee": "7925021659395378", + "reserves": [ + "17075911496266105267840579", + "69439657571926970251279379", + "42869988791265176588127718" + ], + "mAssetSupply": "129180780983990935832696908" + }, + { + "type": "redeemMasset", + "inputQty": "74199751201621735060275", + "expectedQtys": [ + "9805237794664369369724", + "39873265624601811746356", + "24616573729892362639922" + ], + "redemptionFee": "22259925360486520518", + "reserves": [ + "17066106258471440898470855", + "69399784306302368439533023", + "42845372217535284225487796" + ], + "mAssetSupply": "129106603492714674584157151" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "1937503570412206292992", + "20674345038489411649536", + "3271140876052063059968" + ], + "expectedQty": "25779471517218564569556", + "swapFee": "15476969091786210468", + "reserves": [ + "17064168754901028692177863", + "69379109961263879027883487", + "42842101076659232162427828" + ], + "mAssetSupply": "129080824021197456019587595" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "158565099143546077184", + "1259491540740988993536", + "860308019293198090240" + ], + "expectedQty": "2271795571637200381514", + "swapFee": "1363895680390554561", + "reserves": [ + "17064010189801885146100679", + "69377850469723138038889951", + "42841240768639938964337588" + ], + "mAssetSupply": "129078552225625818819206081" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "24456894542201938247680", + "outputIndex": 0, + "expectedQty": "23852590568295741620013", + "swapFee": "14579305445313586397", + "reserves": [ + "17040157599233589404480666", + "69402307364265339977137631", + "42841240768639938964337588" + ], + "mAssetSupply": "129078566804931264132792478", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemMasset", + "inputQty": "598496317929003627315", + "expectedQtys": [ + "78986095762938939214", + "321699917604596493502", + "198581634368634776898" + ], + "redemptionFee": "179548895378701088", + "reserves": [ + "17040078613137826465541452", + "69401985664347735380644129", + "42841042187005570329560690" + ], + "mAssetSupply": "129077968488162230507866251" + }, + { + "type": "redeemMasset", + "inputQty": "2368907774202746608025", + "expectedQtys": [ + "312634799415665935518", + "1273320174150700075518", + "786005800499427330298" + ], + "redemptionFee": "710672332260823982", + "reserves": [ + "17039765978338410799605934", + "69400712344173584680568611", + "42840256181205070902230392" + ], + "mAssetSupply": "129075600291060360022082208" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "21469580729009947279360", + "14380045093897796321280", + "27324597502269122936832" + ], + "expectedQty": "63429272260371639297080", + "swapFee": "38080411603184894514", + "reserves": [ + "17018296397609400852326574", + "69386332299079686884247331", + "42812931583702801779293560" + ], + "mAssetSupply": "129012171018799988382785128" + }, + { + "type": "mintMulti", + "inputQtys": [ + "68435910809986069954560", + "29753162320000076218368", + "48875507272492121063424" + ], + "expectedQty": "148036842325542866333850", + "reserves": [ + "17086732308419386922281134", + "69416085461399686960465699", + "42861807090975293900356984" + ], + "mAssetSupply": "129160207861125531249118978" + }, + { + "type": "mintMulti", + "inputQtys": [ + "4449893491278416445440", + "3402690336161201127424", + "3619166325062331531264" + ], + "expectedQty": "11524575841601983383885", + "reserves": [ + "17091182201910665338726574", + "69419488151735848161593123", + "42865426257300356231888248" + ], + "mAssetSupply": "129171732436967133232502863" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "27598682031896716", + "expectedQty": "27557240774592970", + "reserves": [ + "17091182201910665338726574", + "69419488151735848161593123", + "42865426284899038263784964" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "5752217509665400946688", + "5823992426860644401152", + "1370878324208541106176" + ], + "expectedQty": "13011100015917242179809", + "reserves": [ + "17096934419420330739673262", + "69425312144162708805994275", + "42866797163223246804891140" + ], + "mAssetSupply": "129184743564540291249275642" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "18466982103520812990464", + "33365715618389133623296", + "20882533682306506293248" + ], + "expectedQty": "72801396713363244320825", + "swapFee": "43707062265377172896", + "reserves": [ + "17078467437316809926682798", + "69391946428544319672370979", + "42845914629540940298597892" + ], + "mAssetSupply": "129111942167826928004954817" + }, + { + "type": "mintMulti", + "inputQtys": [ + "49981106620754970017792", + "12838606723340583305216", + "90819246620990498668544" + ], + "expectedQty": "154319032291008050705754", + "reserves": [ + "17128448543937564896700590", + "69404785035267660255676195", + "42936733876161930797266436" + ], + "mAssetSupply": "129266261200117936055660571" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "18943369699387462647808", + "expectedQty": "19054576300639278511808", + "swapFee": "11366021819632477588", + "reserves": [ + "17128448543937564896700590", + "69385730458967020977164387", + "42936733876161930797266436" + ], + "mAssetSupply": "129247329196440368225490351" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "81276418473285697536", + "expectedQty": "81350389612014561330", + "swapFee": "48765851083971418", + "reserves": [ + "17128448543937564896700590", + "69385730458967020977164387", + "42936652525772318782705106" + ], + "mAssetSupply": "129247247968787746023764233" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "114899428167444987904", + "115238554865321328640", + "2991090983403059712" + ], + "expectedQty": "234445813024183067972", + "swapFee": "140751938977896578", + "reserves": [ + "17128333644509397451712686", + "69385615220412155655835747", + "42936649534681335379645394" + ], + "mAssetSupply": "129247013522974721840696261" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "10330769467112833024", + "outputIndex": 1, + "expectedQty": "10375724908295539246", + "swapFee": "6189109608597778", + "reserves": [ + "17128333644509397451712686", + "69385604844687247360296501", + "42936659865450802492478418" + ], + "mAssetSupply": "129247013529163831449294039", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mintMulti", + "inputQtys": [ + "50896876537342181376", + "5107353725099101184", + "47737678531163676672" + ], + "expectedQty": "104550619906621402210", + "reserves": [ + "17128384541385934793894062", + "69385609952040972459397685", + "42936707603129333656155090" + ], + "mAssetSupply": "129247118079783738070696249" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "440437149395083526144", + "expectedQty": "440837991331538057483", + "swapFee": "264262289637050115", + "reserves": [ + "17128384541385934793894062", + "69385609952040972459397685", + "42936266765138002118097607" + ], + "mAssetSupply": "129246677906896632624220220" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "787256050665379007037440", + "expectedQty": "782151861101956852827124", + "reserves": [ + "17128384541385934793894062", + "70172866002706351466435125", + "42936266765138002118097607" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "202786153110651520", + "159107028838247936", + "167014838791721536" + ], + "expectedQty": "531325099672161066", + "reserves": [ + "17128384744172087904545582", + "70172866161813380304683061", + "42936266932152840909819143" + ], + "mAssetSupply": "130028830299323689149208410" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "102481595619718012600320", + "60078093402332461006848", + "68666956411602219302912" + ], + "expectedQty": "232611872687158465913412", + "swapFee": "139650914160791554480", + "reserves": [ + "17025903148552369891945262", + "70112788068411047843676213", + "42867599975741238690516231" + ], + "mAssetSupply": "129796218426636530683294998" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "2272431247105180915728384", + "outputIndex": 2, + "expectedQty": "2309551362727342105824662", + "swapFee": "1385546222259303188452", + "reserves": [ + "19298334395657550807673646", + "70112788068411047843676213", + "40558048613013896584691569" + ], + "mAssetSupply": "129797603972858789986483450", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemBassets", + "inputQtys": [ + "625690445714284783599616", + "729118521868249286574080", + "88315955279071413272576" + ], + "expectedQty": "1447536126136764035306582", + "swapFee": "869043101542984211710", + "reserves": [ + "18672643949943266024074030", + "69383669546542798557102133", + "40469732657734825171418993" + ], + "mAssetSupply": "128350067846722025951176868" + }, + { + "type": "redeemMasset", + "inputQty": "339256572924160481689", + "expectedQtys": [ + "49340969233421272601", + "183340801312084054212", + "106938034019341173037" + ], + "redemptionFee": "101776971877248144", + "reserves": [ + "18672594608974032602801429", + "69383486205741486473047921", + "40469625719700805830245956" + ], + "mAssetSupply": "128349728691926073667943323" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "3488444342359631727689728", + "expectedQty": "3425068925824761728897469", + "swapFee": "2093066605415779036613", + "reserves": [ + "15247525683149270873903960", + "69383486205741486473047921", + "40469625719700805830245956" + ], + "mAssetSupply": "124863377416171857719290208" + }, + { + "type": "redeemMasset", + "inputQty": "574371777898068889", + "expectedQtys": [ + "70117606073279489", + "319068421648342494", + "186104508568432040" + ], + "redemptionFee": "172311533369420", + "reserves": [ + "15247525613031664800624471", + "69383485886673064824705427", + "40469625533596297261813916" + ], + "mAssetSupply": "124863376841972391354590739" + }, + { + "type": "redeemMasset", + "inputQty": "36190307352061634150", + "expectedQtys": [ + "4418005571006833931", + "20104024414374928466", + "11726166959914950294" + ], + "redemptionFee": "10857092205618490", + "reserves": [ + "15247521195026093793790540", + "69383465782648650449776961", + "40469613807429337346863622" + ], + "mAssetSupply": "124863340662522131498575079" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "4375471409660633708232704", + "expectedQty": "4243039436638453889781774", + "swapFee": "2625282845796380224939", + "reserves": [ + "11004481758387639904008766", + "69383465782648650449776961", + "40469613807429337346863622" + ], + "mAssetSupply": "120490494535707294170567314" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "11993361244930344747008", + "expectedQty": "11498337648745285172592", + "swapFee": "7196016746958206848", + "reserves": [ + "10992983420738894618836174", + "69383465782648650449776961", + "40469613807429337346863622" + ], + "mAssetSupply": "120478508370479110784027154" + }, + { + "type": "redeemMasset", + "inputQty": "182038221847320094310", + "expectedQtys": [ + "16604976595578102223", + "104804199310211974721", + "61129628271492490263" + ], + "redemptionFee": "54611466554196028", + "reserves": [ + "10992966815762299040733951", + "69383360978449340237802240", + "40469552677801065854373359" + ], + "mAssetSupply": "120478326386868730018128872" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "35003232222103896064", + "outputIndex": 1, + "expectedQty": "35232648451589450834", + "swapFee": "20936398652935115", + "reserves": [ + "10992966815762299040733951", + "69383325745800888648351406", + "40469587681033287958269423" + ], + "mAssetSupply": "120478326407805128671063987", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "55565905420766037409792", + "outputIndex": 0, + "expectedQty": "53091618677533978386896", + "swapFee": "33235241143553691790", + "reserves": [ + "10939875197084765062347055", + "69383325745800888648351406", + "40525153586454053995679215" + ], + "mAssetSupply": "120478359643046272224755777", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemMasset", + "inputQty": "8085452935330127885107", + "expectedQtys": [ + "733968408373086337950", + "4655004581665364321068", + "2718877678316725287860" + ], + "redemptionFee": "2425635880599038365", + "reserves": [ + "10939141228676391976009105", + "69378670741219223284030338", + "40522434708775737270391355" + ], + "mAssetSupply": "120470276615746822695909035" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "557121895136603945304064", + "expectedQty": "579876398745016595538938", + "reserves": [ + "11496263123812995921313169", + "69378670741219223284030338", + "40522434708775737270391355" + ] + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "704737749030002768216064", + "outputIndex": 0, + "expectedQty": "669353873097940431821417", + "swapFee": "418687272351204376187", + "reserves": [ + "10826909250715055489491752", + "70083408490249226052246402", + "40522434708775737270391355" + ], + "mAssetSupply": "121050571701764190495824160", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemBassets", + "inputQtys": [ + "364753621647073428373504", + "401261611438463625723904", + "11156525199045116821504" + ], + "expectedQty": "789574832237040837356126", + "swapFee": "474029316932383932773", + "reserves": [ + "10462155629067982061118248", + "69682146878810762426522498", + "40511278183576692153569851" + ], + "mAssetSupply": "120260996869527149658468034" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "48926681520481517568", + "156715659911889027072", + "61875585602010726400" + ], + "expectedQty": "267927992575033267746", + "swapFee": "160853307529537683", + "reserves": [ + "10462106702386461579600680", + "69681990163150850537495426", + "40511216307991090142843451" + ], + "mAssetSupply": "120260728941534574625200288" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "908620672885316663640064", + "outputIndex": 0, + "expectedQty": "860204244428082178944386", + "swapFee": "543248703237640710106", + "reserves": [ + "9601902457958379400656294", + "69681990163150850537495426", + "41419836980876406806483515" + ], + "mAssetSupply": "120261272190237812265910394", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemMasset", + "inputQty": "3576194968984019353", + "expectedQtys": [ + "285444957924150125", + "2071503312732137599", + "1231327195417617925" + ], + "redemptionFee": "1072858490695205", + "reserves": [ + "9601902172513421476506169", + "69681988091647537805357827", + "41419835749549211388865590" + ], + "mAssetSupply": "120261268615115701772586246" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "48142929950999714988032", + "expectedQty": "45528736878487333230978", + "swapFee": "28885757970599828992", + "reserves": [ + "9556373435634934143275191", + "69681988091647537805357827", + "41419835749549211388865590" + ], + "mAssetSupply": "120213154570922672657427206" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "550746398232782307328", + "539751912890582106112", + "603471303476507443200" + ], + "expectedQty": "1716523543749527529342", + "swapFee": "1030532445717146805", + "reserves": [ + "9555822689236701360967863", + "69681448339734647223251715", + "41419232278245734881422390" + ], + "mAssetSupply": "120211438047378923129897864" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "15040225976700096217088", + "expectedQty": "15897035832018940349178", + "reserves": [ + "9570862915213401457184951", + "69681448339734647223251715", + "41419232278245734881422390" + ] + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "71863270195718373376", + "expectedQty": "71559513226145036882", + "reserves": [ + "9570862915213401457184951", + "69681448339734647223251715", + "41419304141515930599795766" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "3345367154928152215552", + "9317656884578332180480", + "4722190810423893688320" + ], + "expectedQty": "17446781892166992295471", + "swapFee": "10474353747548724612", + "reserves": [ + "9567517548058473304969399", + "69672130682850068891071235", + "41414581950705506706107446" + ], + "mAssetSupply": "120209959860832001222988453" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "57882864856172847104", + "5870481697899564032", + "72929777543043072000" + ], + "expectedQty": "139599993423613923635", + "swapFee": "83810282223502455", + "reserves": [ + "9567459665193617132122295", + "69672124812368370991507203", + "41414509020927963663035446" + ], + "mAssetSupply": "120209820260838577609064818" + }, + { + "type": "redeemMasset", + "inputQty": "822276053774410019818700", + "expectedQtys": [ + "65425044586061501977228", + "476438054799219888846550", + "283204339921220362086462" + ], + "redemptionFee": "246682816132323005945", + "reserves": [ + "9502034620607555630145067", + "69195686757569151102660653", + "41131304681006743300948984" + ], + "mAssetSupply": "119387790889880299912252063" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "1024831578740014312325120", + "expectedQty": "1020343371670940728027614", + "reserves": [ + "9502034620607555630145067", + "69195686757569151102660653", + "42156136259746757613274104" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "2526407421089633280", + "5471325153632223232", + "99231312177356944" + ], + "expectedQty": "8178669969847730730", + "reserves": [ + "9502037147014976719778347", + "69195692228894304734883885", + "42156136358978069790631048" + ], + "mAssetSupply": "120408142440221210488010407" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "1601870245048941044301824", + "outputIndex": 1, + "expectedQty": "1611530246168885828848974", + "swapFee": "956552617046960970574", + "reserves": [ + "9502037147014976719778347", + "67584161982725418906034911", + "43758006604027010834932872" + ], + "mAssetSupply": "120409098992838257448980981", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "42565025756353650491392", + "expectedQty": "42090379809766100388292", + "reserves": [ + "9502037147014976719778347", + "67626727008481772556526303", + "43758006604027010834932872" + ] + }, + { + "type": "redeemMasset", + "inputQty": "893834747719398297", + "expectedQtys": [ + "70490819103175325", + "501688564919182803", + "324618571798470949" + ], + "redemptionFee": "268150424315819", + "reserves": [ + "9502037076524157616603022", + "67626726506793207637343500", + "43758006279408439036461923" + ], + "mAssetSupply": "120451188479081426254286795" + }, + { + "type": "redeemMasset", + "inputQty": "116396128708590226846515", + "expectedQtys": [ + "9179390792360310709158", + "65330428161305891320377", + "42272181922508128576701" + ], + "redemptionFee": "34918838612577068053", + "reserves": [ + "9492857685731797305893864", + "67561396078631901746023123", + "43715734097485930907885222" + ], + "mAssetSupply": "120334827269211448604508333" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "145216397843192544", + "45863893104739632", + "91257986243000512" + ], + "expectedQty": "289633844920444985", + "swapFee": "173884637734907", + "reserves": [ + "9492857540515399462701320", + "67561396032768008641283491", + "43715734006227944664884710" + ], + "mAssetSupply": "120334826979577603684063348" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "602509954906342686720", + "897901685566324211712", + "139779492714971807744" + ], + "expectedQty": "1663782416445256617528", + "swapFee": "998868771129831869", + "reserves": [ + "9492255030560493120014600", + "67560498131082442317071779", + "43715594226735229693076966" + ], + "mAssetSupply": "120333163197161158427445820" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "154104334523211811127296", + "outputIndex": 0, + "expectedQty": "143941293954581250552021", + "swapFee": "91429610160557171077", + "reserves": [ + "9348313736605911869462579", + "67714602465605654128199075", + "43715594226735229693076966" + ], + "mAssetSupply": "120333254626771318984616897", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "265293075660095147212800", + "expectedQty": "250012690955280780259903", + "swapFee": "159175845396057088327", + "reserves": [ + "9098301045650631089202676", + "67714602465605654128199075", + "43715594226735229693076966" + ], + "mAssetSupply": "120068120726956619894492424" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "827231689901897425092608", + "1997609935103402478403584", + "762720732284733093838848" + ], + "expectedQty": "3614139568692497985417657", + "swapFee": "2169785612583048620422", + "reserves": [ + "8271069355748733664110068", + "65716992530502251649795491", + "42952873494450496599238118" + ], + "mAssetSupply": "116453981158264121909074767" + }, + { + "type": "mintMulti", + "inputQtys": [ + "134489274084818017058816", + "134513071579171823550464", + "44336383981884918464512" + ], + "expectedQty": "320848710801150930815895", + "reserves": [ + "8405558629833551681168884", + "65851505602081423473345955", + "42997209878432381517702630" + ], + "mAssetSupply": "116774829869065272839890662" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "574524706761979592704", + "expectedQty": "571126295034757554675", + "reserves": [ + "8405558629833551681168884", + "65851505602081423473345955", + "42997784403139143497295334" + ] + }, + { + "type": "redeemMasset", + "inputQty": "766008600784521186508", + "expectedQtys": [ + "55121185891242163376", + "431834841842318221532", + "281966847341343047538" + ], + "redemptionFee": "229802580235356355", + "reserves": [ + "8405503508647660439005508", + "65851073767239581155124423", + "42997502436291802154247796" + ], + "mAssetSupply": "116774635216562103311615184" + }, + { + "type": "mintMulti", + "inputQtys": [ + "43454664572621", + "163885259338148", + "33272146176004" + ], + "expectedQty": "241413639707959", + "reserves": [ + "8405503508691115103578129", + "65851073767403466414462571", + "42997502436325074300423800" + ], + "mAssetSupply": "116774635216803516951323143" + }, + { + "type": "mintMulti", + "inputQtys": [ + "197684418145542242304", + "166315583793770168320", + "290498302913318518784" + ], + "expectedQty": "664415105522328221172", + "reserves": [ + "8405701193109260645820433", + "65851240082987260184630891", + "42997792934627987618942584" + ], + "mAssetSupply": "116775299631909039279544315" + }, + { + "type": "mintMulti", + "inputQtys": [ + "1973566293709030558793728", + "6898379142922043941453824", + "10577638678826557303160832" + ], + "expectedQty": "19432040674023212261713229", + "reserves": [ + "10379267486818291204614161", + "72749619225909304126084715", + "53575431613454544922103416" + ], + "mAssetSupply": "136207340305932251541257544" + }, + { + "type": "redeemMasset", + "inputQty": "110642322883149442318336", + "expectedQtys": [ + "8428633479731440819632", + "59077374874860294147502", + "43506699982606467325913" + ], + "redemptionFee": "33192696864944832695", + "reserves": [ + "10370838853338559763794529", + "72690541851034443831937213", + "53531924913471938454777503" + ], + "mAssetSupply": "136096731175745967043771903" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "6904302498790411075584", + "expectedQty": "6830755297775169604273", + "reserves": [ + "10370838853338559763794529", + "72697446153533234243012797", + "53531924913471938454777503" + ] + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "2635479481388613909872640", + "outputIndex": 0, + "expectedQty": "2409060642773435113311802", + "swapFee": "1564062915912955507196", + "reserves": [ + "7961778210565124650482727", + "75332925634921848152885437", + "53531924913471938454777503" + ], + "mAssetSupply": "136105125993959655168883372", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mintMulti", + "inputQtys": [ + "132937294360720064512", + "180658386975830245376", + "152068909404841738240" + ], + "expectedQty": "475732407261865369786", + "reserves": [ + "7961911147859485370547239", + "75333106293308823983130813", + "53532076982381343296515743" + ], + "mAssetSupply": "136105601726366917034253158" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "31013802466865993220096", + "outputIndex": 1, + "expectedQty": "31176497743686748733553", + "swapFee": "18445590847382302273", + "reserves": [ + "7961911147859485370547239", + "75301929795565137234397260", + "53563090784848209289735839" + ], + "mAssetSupply": "136105620171957764416555431", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemBassets", + "inputQtys": [ + "505770633700381940514816", + "3841947642820809868705792", + "4081850317675324946513920" + ], + "expectedQty": "8391668605434632320004831", + "swapFee": "5038023977647367812690", + "reserves": [ + "7456140514159103430032423", + "71459982152744327365691468", + "49481240467172884343221919" + ], + "mAssetSupply": "127713951566523132096550600" + }, + { + "type": "redeemMasset", + "inputQty": "116180484292015449702", + "expectedQtys": [ + "6780763791718391649", + "64987141620790482815", + "44999232926467511575" + ], + "redemptionFee": "34854145287604634", + "reserves": [ + "7456133733395311711640774", + "71459917165602706575208653", + "49481195467939957875710344" + ], + "mAssetSupply": "127713835420892985368705532" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "52859354708778646765568", + "expectedQty": "58441690986934050880879", + "reserves": [ + "7508993088104090358406342", + "71459917165602706575208653", + "49481195467939957875710344" + ] + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "297396975656376526176256", + "expectedQty": "327428814914962131977797", + "reserves": [ + "7806390063760466884582598", + "71459917165602706575208653", + "49481195467939957875710344" + ] + }, + { + "type": "redeemMasset", + "inputQty": "796374392268009984", + "expectedQtys": [ + "48516458762544515", + "444121046478903238", + "307524010436813826" + ], + "redemptionFee": "238912317680402", + "reserves": [ + "7806390015244008122038083", + "71459916721481660096305415", + "49481195160415947438896518" + ], + "mAssetSupply": "128099705130659401601234626" + }, + { + "type": "redeemMasset", + "inputQty": "26333508408080629760", + "expectedQtys": [ + "1604281336966696124", + "14685637088795126955", + "10168817823814665756" + ], + "redemptionFee": "7900052522424188", + "reserves": [ + "7806388410962671155341959", + "71459902035844571301178460", + "49481184991598123624230762" + ], + "mAssetSupply": "128099678805051046043029054" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "318401033589469937664", + "outputIndex": 1, + "expectedQty": "320167587020295201006", + "swapFee": "189503057244723688", + "reserves": [ + "7806388410962671155341959", + "71459581868257551005977454", + "49481503392631713094168426" + ], + "mAssetSupply": "128099678994554103287752742", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "22698728725335896064", + "expectedQty": "24905646556341969517", + "reserves": [ + "7806411109691396491238023", + "71459581868257551005977454", + "49481503392631713094168426" + ] + }, + { + "type": "redeemMasset", + "inputQty": "93674260054830226813747", + "expectedQtys": [ + "5706807933126591061201", + "52239896538039579706277", + "36173016272936733638391" + ], + "redemptionFee": "28102278016449068044", + "reserves": [ + "7800704301758269900176822", + "71407341971719511426271177", + "49445330376358776360530035" + ], + "mAssetSupply": "128006057742423845851976556" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "1736046127950467170304", + "outputIndex": 0, + "expectedQty": "1558915525952155376789", + "swapFee": "1026926611306073732", + "reserves": [ + "7799145386232317744800033", + "71409078017847461893441481", + "49445330376358776360530035" + ], + "mAssetSupply": "128006058769350457158050288", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemMasset", + "inputQty": "3010821807907762549555", + "expectedQtys": [ + "183388135581193763078", + "1679104188054043261825", + "1162651354970714630426" + ], + "redemptionFee": "903246542372328764", + "reserves": [ + "7798961998096736551036955", + "71407398913659407850179656", + "49444167725003805645899609" + ], + "mAssetSupply": "128003048850789091767829497" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "4573962988066000695459840", + "expectedQty": "4506923495623321313629401", + "reserves": [ + "7798961998096736551036955", + "75981361901725408545639496", + "49444167725003805645899609" + ] + }, + { + "type": "redeemMasset", + "inputQty": "1694237482041263469363", + "expectedQtys": [ + "99685552084617043268", + "971186166974913895558", + "631990405676326168396" + ], + "redemptionFee": "508271244612379040", + "reserves": [ + "7798862312544651933993687", + "75980390715558433631743938", + "49443535734598129319731213" + ], + "mAssetSupply": "132508278617201616430368575" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "209332288079636685914112", + "outputIndex": 2, + "expectedQty": "207626616660717638713605", + "swapFee": "123687210624816082218", + "reserves": [ + "7798862312544651933993687", + "76189723003638070317658050", + "49235909117937411681017608" + ], + "mAssetSupply": "132508402304412241246450793", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemMasset", + "inputQty": "6764457183507058052300", + "expectedQtys": [ + "398006788664306861141", + "3888262898695384290793", + "2512703172548250779699" + ], + "redemptionFee": "2029337155052117415", + "reserves": [ + "7798464305755987627132546", + "76185834740739374933367257", + "49233396414764863430237909" + ], + "mAssetSupply": "132501639876565889240515908" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "2852274236631219557105664", + "outputIndex": 2, + "expectedQty": "2826024795353384384423558", + "swapFee": "1684659395567312610323", + "reserves": [ + "7798464305755987627132546", + "79038108977370594490472921", + "46407371619411479045814351" + ], + "mAssetSupply": "132503324535961456553126231", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "6925834081767740407808", + "expectedQty": "6245643401546010208429", + "swapFee": "4155500449060644244", + "reserves": [ + "7792218662354441616924117", + "79038108977370594490472921", + "46407371619411479045814351" + ], + "mAssetSupply": "132496402857380137873362667" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "826337914941289200091136", + "outputIndex": 1, + "expectedQty": "833619868419308228866597", + "swapFee": "492459859782082698916", + "reserves": [ + "7792218662354441616924117", + "78204489108951286261606324", + "47233709534352768245905487" + ], + "mAssetSupply": "132496895317239919956061583", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mintMulti", + "inputQtys": [ + "61654402904452595712", + "141301378745508298752", + "122017936512129744896" + ], + "expectedQty": "328513237022417100985", + "reserves": [ + "7792280316757346069519829", + "78204630410330031769905076", + "47233831552289280375650383" + ], + "mAssetSupply": "132497223830476942373162568" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "870818972151925425831936", + "outputIndex": 1, + "expectedQty": "877945233654543949194230", + "swapFee": "518790317293785745080", + "reserves": [ + "7792280316757346069519829", + "77326685176675487820710846", + "48104650524441205801482319" + ], + "mAssetSupply": "132497742620794236158907648", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "235394590958488754585600", + "outputIndex": 0, + "expectedQty": "208576147727643298829367", + "swapFee": "139025559835331459918", + "reserves": [ + "7583704169029702770690462", + "77562079767633976575296446", + "48104650524441205801482319" + ], + "mAssetSupply": "132497881646354071490367566", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "57426138850336339656704", + "expectedQty": "56993567524575803864953", + "reserves": [ + "7583704169029702770690462", + "77562079767633976575296446", + "48162076663291542141139023" + ] + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "302074584186758037504", + "expectedQty": "306833384131442266958", + "swapFee": "181244750512054822", + "reserves": [ + "7583704169029702770690462", + "77561772934249845133029488", + "48162076663291542141139023" + ], + "mAssetSupply": "132554573320539211048249837" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "16682516558165072412672", + "outputIndex": 1, + "expectedQty": "18859892892242122019229", + "swapFee": "11140848725061727769", + "reserves": [ + "7600386685587867843103134", + "77542913041357603011010259", + "48162076663291542141139023" + ], + "mAssetSupply": "132554584461387936109977606", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemBassets", + "inputQtys": [ + "11163548936400046915584", + "28896307141641544663040", + "19192332857591101128704" + ], + "expectedQty": "59903351766512111394029", + "swapFee": "35963589213435328033", + "reserves": [ + "7589223136651467796187550", + "77514016734215961466347219", + "48142884330433951040010319" + ], + "mAssetSupply": "132494681109621423998583577" + }, + { + "type": "mintMulti", + "inputQtys": [ + "6802384864576254509056", + "23023822473824483409920", + "21073887626357794406400" + ], + "expectedQty": "51139480572765087568343", + "reserves": [ + "7596025521516044050696606", + "77537040556689785949757139", + "48163958218060308834416719" + ], + "mAssetSupply": "132545820590194189086151920" + }, + { + "type": "mintMulti", + "inputQtys": [ + "21314293125401049825280", + "20392989423291055734784", + "49009412494897402871808" + ], + "expectedQty": "92420894637069890628392", + "reserves": [ + "7617339814641445100521886", + "77557433546113077005491923", + "48212967630555206237288527" + ], + "mAssetSupply": "132638241484831258976780312" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "2487283662800515760128", + "2276332719210726686720", + "219310876471825465344" + ], + "expectedQty": "5224323280149680979027", + "swapFee": "3136475853601969769", + "reserves": [ + "7614852530978644584761758", + "77555157213393866278805203", + "48212748319678734411823183" + ], + "mAssetSupply": "132633017161551109295801285" + }, + { + "type": "mintMulti", + "inputQtys": [ + "11204425768873219850240", + "10395788190435787145216", + "5122439001427352223744" + ], + "expectedQty": "27775547846075948043335", + "reserves": [ + "7626056956747517804611998", + "77565553001584302065950419", + "48217870758680161764046927" + ], + "mAssetSupply": "132660792709397185243844620" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "71560355978042656423936", + "expectedQty": "72057480172441741739192", + "swapFee": "42936213586825593854", + "reserves": [ + "7626056956747517804611998", + "77565553001584302065950419", + "48145813278507720022307735" + ], + "mAssetSupply": "132589275289632729413014538" + }, + { + "type": "redeemMasset", + "inputQty": "1365588165348353024", + "expectedQtys": [ + "78520143425826572", + "798637930601754638", + "495723567949041884" + ], + "redemptionFee": "409676449604505", + "reserves": [ + "7626056878227374378785426", + "77565552202946371464195781", + "48145812782784152073265851" + ], + "mAssetSupply": "132589273924454240514266019" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "3349764358623167488", + "2321370556047465984", + "4462975293789523456" + ], + "expectedQty": "10438820744755352130", + "swapFee": "6267052678460287", + "reserves": [ + "7626053528463015755617938", + "77565549881575815416729797", + "48145808319808858283742395" + ], + "mAssetSupply": "132589263485633495758913889" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "5497285485803967488", + "expectedQty": "5535411340050633945", + "swapFee": "3298371291482380", + "reserves": [ + "7626053528463015755617938", + "77565549881575815416729797", + "48145802784397518233108450" + ], + "mAssetSupply": "132589257991646381246428781" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "28739868744088559812608", + "outputIndex": 0, + "expectedQty": "25405488535919283172946", + "swapFee": "16967696048810124135", + "reserves": [ + "7600648039927096472444992", + "77594289750319903976542405", + "48145802784397518233108450" + ], + "mAssetSupply": "132589274959342430056552916", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "15587312436881820", + "expectedQty": "15336756218446905", + "reserves": [ + "7600648039927096472444992", + "77594289765907216413424225", + "48145802784397518233108450" + ] + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "2723037029836185105596416", + "expectedQty": "2764904089353763302180224", + "swapFee": "1633822217901711063357", + "reserves": [ + "7600648039927096472444992", + "74829385676553453111244001", + "48145802784397518233108450" + ], + "mAssetSupply": "129867871767060902880466762" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "199613973526942670913536", + "outputIndex": 1, + "expectedQty": "201037112977931290405222", + "swapFee": "118841412828831940720", + "reserves": [ + "7600648039927096472444992", + "74628348563575521820838779", + "48345416757924460904021986" + ], + "mAssetSupply": "129867990608473731712407482", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "173525137028609877213184", + "expectedQty": "191703422167453096874566", + "reserves": [ + "7774173176955706349658176", + "74628348563575521820838779", + "48345416757924460904021986" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "391316572231448", + "216113369960625", + "163249450245651" + ], + "expectedQty": "806304475375823", + "reserves": [ + "7774173177347022921889624", + "74628348563791635190799404", + "48345416758087710354267637" + ], + "mAssetSupply": "130059694031447489284657871" + }, + { + "type": "mintMulti", + "inputQtys": [ + "192065195913974315483136", + "240322943138764907610112", + "21962473823272762867712" + ], + "expectedQty": "469883741182071086494109", + "reserves": [ + "7966238373260997237372760", + "74868671506930400098409516", + "48367379231910983117135349" + ], + "mAssetSupply": "130529577772629560371151980" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "38609722439438765654016", + "expectedQty": "42382192515772401154637", + "reserves": [ + "8004848095700436003026776", + "74868671506930400098409516", + "48367379231910983117135349" + ] + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "1361169354065248768", + "outputIndex": 0, + "expectedQty": "1221654499951994639", + "swapFee": "804757338352189", + "reserves": [ + "8004846874045936051032137", + "74868672868099754163658284", + "48367379231910983117135349" + ], + "mAssetSupply": "130571959965950090110658806", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "2588143206602793524658176", + "expectedQty": "2604555175030101649677607", + "swapFee": "1552885923961676114794", + "reserves": [ + "8004846874045936051032137", + "74868672868099754163658284", + "45762824056880881467457742" + ], + "mAssetSupply": "127985369645271258262115424" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "45047472404701675520", + "expectedQty": "44380298206745865041", + "reserves": [ + "8004846874045936051032137", + "74868717915572158865333804", + "45762824056880881467457742" + ] + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "30371299905168527360", + "expectedQty": "30809378526442635943", + "swapFee": "18222779943101116", + "reserves": [ + "8004846874045936051032137", + "74868687106193632422697861", + "45762824056880881467457742" + ], + "mAssetSupply": "127985383672492339782554221" + }, + { + "type": "mintMulti", + "inputQtys": [ + "3157225434508730", + "3196361349169827", + "3782002046777876" + ], + "expectedQty": "10361557309710981", + "reserves": [ + "8004846877203161485540867", + "74868687109389993771867688", + "45762824060662883514235618" + ], + "mAssetSupply": "127985383682853897092265202" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "215230907912719347744768", + "expectedQty": "235018107013814950029961", + "reserves": [ + "8220077785115880833285635", + "74868687109389993771867688", + "45762824060662883514235618" + ] + }, + { + "type": "redeemMasset", + "inputQty": "127094707382503", + "expectedQtys": [ + "8145466303856", + "74189123753530", + "45347446958526" + ], + "redemptionFee": "38128412214", + "reserves": [ + "8220077785107735366981779", + "74868687109315804648114158", + "45762824060617536067277092" + ], + "mAssetSupply": "128220401789740655463324874" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "2476009684077718274048", + "expectedQty": "2460477329758116789550", + "reserves": [ + "8220077785107735366981779", + "74868687109315804648114158", + "45765300070301613785551140" + ] + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "19619205219256161533952", + "outputIndex": 0, + "expectedQty": "17731979534266398395614", + "swapFee": "11601614340571142024", + "reserves": [ + "8202345805573468968586165", + "74888306314535060809648110", + "45765300070301613785551140" + ], + "mAssetSupply": "128222873868684754151256448", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mintMulti", + "inputQtys": [ + "183336053538938400", + "433574628511679872", + "217983406708530304" + ], + "expectedQty": "843750081967445356", + "reserves": [ + "8202345988909522507524565", + "74888306748109689321327982", + "45765300288285020494081444" + ], + "mAssetSupply": "128222874712434836118701804" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "193725503140341565358080", + "215989297842454983081984", + "233736246278303380406272" + ], + "expectedQty": "656591831114276386112587", + "swapFee": "394191613636747880395", + "reserves": [ + "8008620485769180942166485", + "74672317450267234338245998", + "45531564042006717113675172" + ], + "mAssetSupply": "127566282881320559732589217" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "229193079142327854825472", + "expectedQty": "208970803832169962390577", + "swapFee": "137515847485396712895", + "reserves": [ + "7799649681937010979775908", + "74672317450267234338245998", + "45531564042006717113675172" + ], + "mAssetSupply": "127337227318025717274476640" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "23019647367472083894272", + "expectedQty": "22866109068670188166126", + "reserves": [ + "7799649681937010979775908", + "74672317450267234338245998", + "45554583689374189197569444" + ] + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "40767607052086280192000", + "expectedQty": "40495274427952846715577", + "reserves": [ + "7799649681937010979775908", + "74672317450267234338245998", + "45595351296426275477761444" + ] + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "363976055205363512770560", + "expectedQty": "358443677880118994310656", + "reserves": [ + "7799649681937010979775908", + "75036293505472597851016558", + "45595351296426275477761444" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "35753310957875541049344", + "6016357394652825911296", + "33079445246731983257600" + ], + "expectedQty": "78076416424710384525390", + "reserves": [ + "7835402992894886520825252", + "75042309862867250676927854", + "45628430741673007461019044" + ], + "mAssetSupply": "127837108795827169688194389" + }, + { + "type": "mintMulti", + "inputQtys": [ + "84169986004527196667904", + "116034543050945814593536", + "28960591932075813109760" + ], + "expectedQty": "235440916315345536384782", + "reserves": [ + "7919572978899413717493156", + "75158344405918196491521390", + "45657391333605083274128804" + ], + "mAssetSupply": "128072549712142515224579171" + }, + { + "type": "redeemMasset", + "inputQty": "467796751859273465384140", + "expectedQtys": [ + "28918289663251569929675", + "274440399745241185512314", + "166717785336591594675712" + ], + "redemptionFee": "140339025557782039615", + "reserves": [ + "7890654689236162147563481", + "74883904006172955306009076", + "45490673548268491679453092" + ], + "mAssetSupply": "127604893299308799541234646" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "400215542636271701590016", + "1171960292675850428481536", + "1011086009009121831944192" + ], + "expectedQty": "2598634390017779873877113", + "swapFee": "1560116704033087776992", + "reserves": [ + "7490439146599890445973465", + "73711943713497104877527540", + "44479587539259369847508900" + ], + "mAssetSupply": "125006258909291019667357533" + }, + { + "type": "redeemMasset", + "inputQty": "46404481432396358", + "expectedQtys": [ + "2779746153092603", + "27354937135772862", + "16506637319058433" + ], + "redemptionFee": "13921344429718", + "reserves": [ + "7490439143820144292880862", + "73711943686142167741754678", + "44479587522752732528450467" + ], + "mAssetSupply": "125006258862900459579390893" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "5222285995073373995008", + "expectedQty": "4729311077319137120605", + "swapFee": "3133371597044024397", + "reserves": [ + "7485709832742825155760257", + "73711943686142167741754678", + "44479587522752732528450467" + ], + "mAssetSupply": "125001039710276983249420282" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "118727268696314769047552", + "expectedQty": "119461190433445194143567", + "swapFee": "71236361217788861428", + "reserves": [ + "7485709832742825155760257", + "73711943686142167741754678", + "44360126332319287334306900" + ], + "mAssetSupply": "124882383677941886269234158" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "1386687618020535668047872", + "expectedQty": "1377048669432969694068260", + "reserves": [ + "7485709832742825155760257", + "73711943686142167741754678", + "45746813950339823002354772" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "854414401744485195186176", + "724503797670714978336768", + "4593652770966885648826368" + ], + "expectedQty": "6226340696124470574470316", + "swapFee": "3738047246022295722115", + "reserves": [ + "6631295430998339960574081", + "72987439888471452763417910", + "41153161179372937353528404" + ], + "mAssetSupply": "120033091651250385388832102" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "1416970449795919", + "159205126327226", + "1520349945754344" + ], + "expectedQty": "3260156689152932", + "swapFee": "1957268374516", + "reserves": [ + "6631295429581369510778162", + "72987439888312247637090684", + "41153161177852587407774060" + ], + "mAssetSupply": "120033091647990228699679170" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "506013217316238029488128", + "expectedQty": "564719466816778661570342", + "reserves": [ + "7137308646897607540266290", + "72987439888312247637090684", + "41153161177852587407774060" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "6236126737228938", + "19085891598210996", + "39442894983101832" + ], + "expectedQty": "64885804030601244", + "swapFee": "38954855331559", + "reserves": [ + "7137308640661480803037352", + "72987439869226356038879688", + "41153161138409692424672228" + ], + "mAssetSupply": "120597811049921203330648268" + }, + { + "type": "mintMulti", + "inputQtys": [ + "49265921313793099431936", + "91822933604776670134272", + "82699252363015070154752" + ], + "expectedQty": "227074069011583675473143", + "reserves": [ + "7186574561975273902469288", + "73079262802831132709013960", + "41235860390772707494826980" + ], + "mAssetSupply": "120824885118932787006121411" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "1219307908057428798734336", + "outputIndex": 0, + "expectedQty": "1062421764156473621564055", + "swapFee": "719477519569235436036", + "reserves": [ + "6124152797818800280905233", + "74298570710888561507748296", + "41235860390772707494826980" + ], + "mAssetSupply": "120825604596452356241557447", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "2020243991375020055068672", + "outputIndex": 1, + "expectedQty": "2042093487319244494568139", + "swapFee": "1202760146827989293956", + "reserves": [ + "6124152797818800280905233", + "72256477223569317013180157", + "43256104382147727549895652" + ], + "mAssetSupply": "120826807356599184230851403", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemBassets", + "inputQtys": [ + "69858355775483338752", + "123702727849252814848", + "97288337254870351872" + ], + "expectedQty": "297981676150605132877", + "swapFee": "178896343496460956", + "reserves": [ + "6124082939463024797566481", + "72256353520841467760365309", + "43256007093810472679543780" + ], + "mAssetSupply": "120826509374923033625718526" + }, + { + "type": "redeemMasset", + "inputQty": "18286954928905935388672", + "expectedQtys": [ + "926594933722962022570", + "10932636243423830567527", + "6544783508389858036998" + ], + "redemptionFee": "5486086478671780616", + "reserves": [ + "6123156344529301835543911", + "72245420884598043929797782", + "43249462310302082821506782" + ], + "mAssetSupply": "120808227906080606362110470" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "220271088829562387169280", + "expectedQty": "251506800217857130395112", + "reserves": [ + "6343427433358864222713191", + "72245420884598043929797782", + "43249462310302082821506782" + ] + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "46166458598126168047616", + "expectedQty": "45334514927946659597297", + "reserves": [ + "6343427433358864222713191", + "72291587343196170097845398", + "43249462310302082821506782" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "458190118224453347311616", + "298278506418306340093952", + "385516974361593709068288" + ], + "hardLimitError": true + }, + { + "type": "redeemMasset", + "inputQty": "336488779859567900098560", + "expectedQtys": [ + "17619838899010142935916", + "200800929169985654417587", + "120131989587973686653083" + ], + "redemptionFee": "100946633957870370029", + "reserves": [ + "6325807594459854079777275", + "72090786414026184443427811", + "43129330320714109134853699" + ], + "mAssetSupply": "120768681388000800122374348" + }, + { + "type": "mintMulti", + "inputQtys": [ + "4743398203720428683264", + "9764414988972963397632", + "6189270312378244792320" + ], + "expectedQty": "21121758013604662148311", + "reserves": [ + "6330550992663574508460539", + "72100550829015157406825443", + "43135519591026487379646019" + ], + "mAssetSupply": "120789803146014404784522659" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "502677210475161291063296", + "expectedQty": "511553292988425309838735", + "swapFee": "301606326285096774637", + "reserves": [ + "6330550992663574508460539", + "71588997536026732096986708", + "43135519591026487379646019" + ], + "mAssetSupply": "120287427541865528590234000" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "2141793063089480", + "expectedQty": "1884931583439556", + "swapFee": "1285075837853", + "reserves": [ + "6330550990778642925020983", + "71588997536026732096986708", + "43135519591026487379646019" + ], + "mAssetSupply": "120287427539725020602982373" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "28085987104810996", + "expectedQty": "24717683996869320", + "swapFee": "16851592262886", + "reserves": [ + "6330550966060958928151663", + "71588997536026732096986708", + "43135519591026487379646019" + ], + "mAssetSupply": "120287427511655885090434263" + }, + { + "type": "mintMulti", + "inputQtys": [ + "8566659116581807718400", + "2981057933414703300608", + "1075374937460411990016" + ], + "expectedQty": "13721287775330467626461", + "reserves": [ + "6339117625177540735870063", + "71591978593960146800287316", + "43136594965963947791636035" + ], + "mAssetSupply": "120301148799431215558060724" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "93705076480682917625856", + "expectedQty": "92031841731793376654522", + "reserves": [ + "6339117625177540735870063", + "71685683670440829717913172", + "43136594965963947791636035" + ] + }, + { + "type": "redeemMasset", + "inputQty": "33086508065547446806118", + "expectedQtys": [ + "1741596521807242277643", + "19694781628273911088788", + "11851261989041657241842" + ], + "redemptionFee": "9925952419664234041", + "reserves": [ + "6337376028655733493592420", + "71665988888812555806824384", + "43124743703974906134394193" + ], + "mAssetSupply": "120360104059049881152143169" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "35388597741294807154688", + "expectedQty": "31129200550772647158677", + "swapFee": "21233158644776884292", + "reserves": [ + "6306246828104960846433743", + "71665988888812555806824384", + "43124743703974906134394193" + ], + "mAssetSupply": "120324736694467231121872773" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "18576670056088499912704", + "expectedQty": "16326433871160124205609", + "swapFee": "11146002033653099947", + "reserves": [ + "6289920394233800722228134", + "71665988888812555806824384", + "43124743703974906134394193" + ], + "mAssetSupply": "120306171170413176275060016" + }, + { + "type": "redeemMasset", + "inputQty": "19275015431686590352588", + "expectedQtys": [ + "1007445752699217726314", + "11478618423408274091945", + "6907216174093432860422" + ], + "redemptionFee": "5782504629505977105", + "reserves": [ + "6288912948481101504501820", + "71654510270389147532732439", + "43117836487800812701533771" + ], + "mAssetSupply": "120286901937486119190684533" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "596569852699659326193664", + "231140886041742115078144", + "113088738541417449652224" + ], + "hardLimitError": true + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "24980403389458909495296", + "outputIndex": 0, + "expectedQty": "21542646054999990977151", + "swapFee": "14718393744189794383", + "reserves": [ + "6267370302426101513524669", + "71679490673778606442227735", + "43117836487800812701533771" + ], + "mAssetSupply": "120286916655879863380478916", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemBassets", + "inputQtys": [ + "31343070061649169743872", + "259004346756240699817984", + "262981938884409108201472" + ], + "expectedQty": "550854067011827009185631", + "swapFee": "330710866727132485002", + "reserves": [ + "6236027232364452343780797", + "71420486327022365742409751", + "42854854548916403593332299" + ], + "mAssetSupply": "119736062588868036371293285" + }, + { + "type": "mintMulti", + "inputQtys": [ + "1467423276193608105984", + "1481566698056027471872", + "1617012900393584164864" + ], + "expectedQty": "4729546061496858393183", + "reserves": [ + "6237494655640645951886781", + "71421967893720421769881623", + "42856471561816797177497163" + ], + "mAssetSupply": "119740792134929533229686468" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "1560475511696289169408", + "outputIndex": 1, + "expectedQty": "1808396243003698623543", + "swapFee": "1066045516612436994", + "reserves": [ + "6239055131152342241056189", + "71420159497477418071258080", + "42856471561816797177497163" + ], + "mAssetSupply": "119740793200975049842123462", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "2381150672494444624740352", + "outputIndex": 2, + "expectedQty": "2353164109421370148852965", + "swapFee": "1402328581292564086833", + "reserves": [ + "6239055131152342241056189", + "73801310169971862695998432", + "40503307452395427028644198" + ], + "mAssetSupply": "119742195529556342406210295", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "65537679043468107710464", + "expectedQty": "65950180230116601195330", + "swapFee": "39322607426080864626", + "reserves": [ + "6239055131152342241056189", + "73801310169971862695998432", + "40437357272165310427448868" + ], + "mAssetSupply": "119676697173120300379364457" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "375379401669597340893184", + "682690425096145807081472", + "274889050066328517345280" + ], + "hardLimitError": true + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "621152770731663071117312", + "expectedQty": "624964567209456798699975", + "swapFee": "372691662438997842670", + "reserves": [ + "6239055131152342241056189", + "73801310169971862695998432", + "39812392704955853628748893" + ], + "mAssetSupply": "119055917094051076306089815" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "195278190098762400", + "expectedQty": "196448473053458211", + "swapFee": "117166914059257", + "reserves": [ + "6239055131152342241056189", + "73801310169971862695998432", + "39812392508507380575290682" + ], + "mAssetSupply": "119055916898890053121386672" + }, + { + "type": "mintMulti", + "inputQtys": [ + "1939999520053162294640640", + "814541898100308568965120", + "2107396479200017751474176" + ], + "expectedQty": "5049526300921444220316149", + "reserves": [ + "8179054651205504535696829", + "74615852068072171264963552", + "41919788987707398326764858" + ], + "mAssetSupply": "124105443199811497341702821" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "73991510320586", + "outputIndex": 1, + "expectedQty": "81529783680187", + "swapFee": "48224217598", + "reserves": [ + "8179054651279496046017415", + "74615852067990641481283365", + "41919788987707398326764858" + ], + "mAssetSupply": "124105443199811545565920419", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemBassets", + "inputQtys": [ + "583969777813030830080", + "3567571881605665390592", + "11687533911863367565312" + ], + "expectedQty": "15777500331623775489345", + "swapFee": "9472183509079713121", + "reserves": [ + "8178470681501683015187335", + "74612284496109035815892773", + "41908101453795534959199546" + ], + "mAssetSupply": "124089665699479921790431074" + }, + { + "type": "mintMulti", + "inputQtys": [ + "657098575031091020693504", + "550349390530544601661440", + "169040585064337018716160" + ], + "expectedQty": "1420691702234306811998514", + "reserves": [ + "8835569256532774035880839", + "75162633886639580417554213", + "42077142038859871977915706" + ], + "mAssetSupply": "125510357401714228602429588" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "184787831139658851418112", + "expectedQty": "171545971613802553575329", + "swapFee": "110872698683795310850", + "reserves": [ + "8664023284918971482305510", + "75162633886639580417554213", + "42077142038859871977915706" + ], + "mAssetSupply": "125325680443273253546322326" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "4766167415471094104064", + "expectedQty": "4831352569783511334306", + "swapFee": "2859700449282656462", + "reserves": [ + "8664023284918971482305510", + "75157802534069796906219907", + "42077142038859871977915706" + ], + "mAssetSupply": "125320917135558231734874724" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "194814241407681045725184", + "expectedQty": "195599986221892717700661", + "swapFee": "116888544844608627435", + "reserves": [ + "8664023284918971482305510", + "75157802534069796906219907", + "41881542052637979260215045" + ], + "mAssetSupply": "125126219782695395297776975" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "10442070562805548306137088", + "hardLimitError": true + }, + { + "type": "redeemMasset", + "inputQty": "3494382516365015859", + "expectedQtys": [ + "241886384143281969", + "2098291809391294760", + "1169269107008425181" + ], + "redemptionFee": "1048314754909504", + "reserves": [ + "8664023043032587339023541", + "75157800435777987514925147", + "41881540883368872251789864" + ], + "mAssetSupply": "125126216289361193687670620" + }, + { + "type": "redeemMasset", + "inputQty": "1717284360916081783603", + "expectedQtys": [ + "118872991912716893204", + "1031187539438106183235", + "574627288731012243261" + ], + "redemptionFee": "515185308274824535", + "reserves": [ + "8663904170040674622130337", + "75156769248238549408741912", + "41880966256080141239546603" + ], + "mAssetSupply": "125124499520185585880711552" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "165592561742706693373952", + "expectedQty": "167857026116858718572043", + "swapFee": "99355537045624016024", + "reserves": [ + "8663904170040674622130337", + "74988912222121690690169869", + "41880966256080141239546603" + ], + "mAssetSupply": "124959006313979924811353624" + }, + { + "type": "mintMulti", + "inputQtys": [ + "524947859804984115200", + "720623365438470488064", + "574415417738353180672" + ], + "expectedQty": "1847945577848898702467", + "reserves": [ + "8664429117900479606245537", + "74989632845487129160657933", + "41881540671497879592727275" + ], + "mAssetSupply": "124960854259557773710056091" + }, + { + "type": "redeemMasset", + "inputQty": "1827650109439271731", + "expectedQtys": [ + "126686027043554080", + "1096452925562347849", + "612366483923728656" + ], + "redemptionFee": "548295032831781", + "reserves": [ + "8664428991214452562691457", + "74989631749034203598310084", + "41881540059131395668998619" + ], + "mAssetSupply": "124960852432455959303616141" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "414934687401838016", + "833549131502468224", + "879875446379500288" + ], + "expectedQty": "2144788357449535169", + "swapFee": "1287645601830819", + "reserves": [ + "8664428576279765160853441", + "74989630915485072095841860", + "41881539179255949289498331" + ], + "mAssetSupply": "124960850287667601854080972" + }, + { + "type": "redeemMasset", + "inputQty": "1596295217862264832", + "expectedQtys": [ + "110649347969574156", + "957657356423169213", + "534849466568816754" + ], + "redemptionFee": "478888565358679", + "reserves": [ + "8664428465630417191279285", + "74989629957827715672672647", + "41881538644406482720681577" + ], + "mAssetSupply": "124960848691851272557174819" + }, + { + "type": "mintMulti", + "inputQtys": [ + "492025353659462320128", + "207841312766570725376", + "312980180779067572224" + ], + "expectedQty": "1046660318494151034657", + "reserves": [ + "8664920490984076653599413", + "74989837799140482243398023", + "41881851624587261788253801" + ], + "mAssetSupply": "124961895352169766708209476" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "191667274778156984172544", + "expectedQty": "177498966112812496984248", + "swapFee": "115000364866894190503", + "reserves": [ + "8487421524871264156615165", + "74989837799140482243398023", + "41881851624587261788253801" + ], + "mAssetSupply": "124770343077756476618227435" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "1825894279036363520", + "outputIndex": 2, + "expectedQty": "1981643494067299147", + "swapFee": "1184053211223693", + "reserves": [ + "8487423350765543192978685", + "74989837799140482243398023", + "41881849642943767720954654" + ], + "mAssetSupply": "124770343078940529829451128", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "1300973116002238201856", + "expectedQty": "1282310174137120601314", + "reserves": [ + "8487423350765543192978685", + "74991138772256484481599879", + "41881849642943767720954654" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "87443580406612956807168", + "229115723542055446642688", + "305651071127729727340544" + ], + "expectedQty": "624507253298131278709965", + "reserves": [ + "8574866931172156149785853", + "75220254495798539928242567", + "42187500714071497448295198" + ], + "mAssetSupply": "125396132642412798228762407" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "240234654987394987589632", + "705809689811504074850304", + "70151906739695915106304" + ], + "expectedQty": "1025298013657485045444812", + "swapFee": "615548137076737069508", + "reserves": [ + "8334632276184761162196221", + "74514444805987035853392263", + "42117348807331801533188894" + ], + "mAssetSupply": "124370834628755313183317595" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "2286144270194307072", + "expectedQty": "2318299424287900196", + "swapFee": "1371686562116584", + "reserves": [ + "8334632276184761162196221", + "74514442487687611565492067", + "42117348807331801533188894" + ], + "mAssetSupply": "124370832343982729551127107" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "13986359312870157582336", + "310748663812670558830592", + "50538003350567298007040" + ], + "expectedQty": "371693337625891031513622", + "swapFee": "223149892511041243654", + "reserves": [ + "8320645916871891004613885", + "74203693823874941006661475", + "42066810803981234235181854" + ], + "mAssetSupply": "123999139006356838519613485" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "1007031930531668673167360", + "2383060955760899102081024", + "2979724014108789214019584" + ], + "expectedQty": "6409241127500756057498486", + "swapFee": "3847853388533573778766", + "reserves": [ + "7313613986340222331446525", + "71820632868114041904580451", + "39087086789872445021162270" + ], + "mAssetSupply": "117589897878856082462114999" + }, + { + "type": "mintMulti", + "inputQtys": [ + "207651981706810392576", + "82541141920028016640", + "152219698114695790592" + ], + "expectedQty": "460711636301898000523", + "reserves": [ + "7313821638321929141839101", + "71820715409255961932597091", + "39087239009570559716952862" + ], + "mAssetSupply": "117590358590492384360115522" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "582555158616630534078464", + "outputIndex": 1, + "expectedQty": "644804859615961021742823", + "swapFee": "381394709288286424751", + "reserves": [ + "7896376796938559675917565", + "71175910549640000910854268", + "39087239009570559716952862" + ], + "mAssetSupply": "117590739985201672646540273", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "6404393514816957841408", + "expectedQty": "6430408014969723722391", + "swapFee": "3842636108890174704", + "reserves": [ + "7896376796938559675917565", + "71175910549640000910854268", + "39080808601555589993230471" + ], + "mAssetSupply": "117584339434322964578873569" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "2032906104301600144097280", + "expectedQty": "2022705555344451080208290", + "reserves": [ + "7896376796938559675917565", + "71175910549640000910854268", + "41113714705857190137327751" + ] + }, + { + "type": "redeemMasset", + "inputQty": "915517746466354627818291", + "expectedQtys": [ + "60423734313305878660424", + "544644008151493927421613", + "314605576443986032640284" + ], + "redemptionFee": "274655323939906388345", + "reserves": [ + "7835953062625253797257141", + "70631266541488506983432655", + "40799109129413204104687467" + ], + "mAssetSupply": "118691801898525000937651913" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "7036095815589058396028928", + "expectedQty": "7128814391568564721218227", + "swapFee": "4221657489353435037617", + "reserves": [ + "7835953062625253797257141", + "63502452149919942262214428", + "40799109129413204104687467" + ], + "mAssetSupply": "111659927740425295976660602" + }, + { + "type": "redeemMasset", + "inputQty": "93989468960015889360486", + "expectedQtys": [ + "6593915408428580120069", + "53436996668797049097904", + "34332246784600572683159" + ], + "redemptionFee": "28196840688004766808", + "reserves": [ + "7829359147216825217137072", + "63449015153251145213116524", + "40764776882628603532004308" + ], + "mAssetSupply": "111565966468305968092066924" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "235720840011131", + "expectedQty": "236997044562894", + "swapFee": "141432504006", + "reserves": [ + "7829359147216825217137072", + "63449015153251145213116524", + "40764776882391606487441414" + ], + "mAssetSupply": "111565966468070388684559799" + }, + { + "type": "redeemMasset", + "inputQty": "5596673541271909197414", + "expectedQtys": [ + "392639646847187331758", + "3181946112592149951000", + "2044339427780162633666" + ], + "redemptionFee": "1679002062381572759", + "reserves": [ + "7828966507569978029805314", + "63445833207138553063165524", + "40762732542963826324807748" + ], + "mAssetSupply": "111560371473531179156935144" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "8207964442744635145584640", + "3087927508727877093818368", + "3885676140051337161211904" + ], + "insufficientLiquidityError": true + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "5024048685109563308900352", + "outputIndex": 2, + "expectedQty": "4977308205615465145410685", + "swapFee": "2974229122828061941816", + "reserves": [ + "7828966507569978029805314", + "68469881892248116372065876", + "35785424337348361179397063" + ], + "mAssetSupply": "111563345702654007218876960", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemMasset", + "inputQty": "28167977746855673856", + "expectedQtys": [ + "1976097033763976790", + "17282374420508011430", + "9032542266804076216" + ], + "redemptionFee": "8450393324056702", + "reserves": [ + "7828964531472944265828524", + "68469864609873695864054446", + "35785415304806094375320847" + ], + "mAssetSupply": "111563317543126653687259806" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "52912275821346636693504", + "expectedQty": "53075997989156294669771", + "swapFee": "31747365492807982016", + "reserves": [ + "7828964531472944265828524", + "68469864609873695864054446", + "35732339306816938080651076" + ], + "mAssetSupply": "111510437014670799858548318" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "321012319758803533824", + "241382516527208529920", + "237181649192498135040" + ], + "expectedQty": "819921853981250371248", + "swapFee": "492248461465629600", + "reserves": [ + "7828643519153185462294700", + "68469623227357168655524526", + "35732102125167745582516036" + ], + "mAssetSupply": "111509617092816818608177070" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "3551079044631327408128", + "expectedQty": "3824360848142756810259", + "reserves": [ + "7832194598197816789702828", + "68469623227357168655524526", + "35732102125167745582516036" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "754734121068428663980032", + "152878768643836074786816", + "249994088501199327199232" + ], + "expectedQty": "1218208517075344649434937", + "swapFee": "731363928602368210587", + "reserves": [ + "7077460477129388125722796", + "68316744458713332580737710", + "35482108036666546255316804" + ], + "mAssetSupply": "110295232936589616715552392" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "5370661158170128285696", + "expectedQty": "4909364597352435173532", + "swapFee": "3222396694902076971", + "reserves": [ + "7072551112532035690549264", + "68316744458713332580737710", + "35482108036666546255316804" + ], + "mAssetSupply": "110289865497828141489343667" + }, + { + "type": "mintMulti", + "inputQtys": [ + "52353365604502178103296", + "71299297937308354871296", + "68392946211551447089152" + ], + "expectedQty": "195478881619392397425438", + "reserves": [ + "7124904478136537868652560", + "68388043756650640935609006", + "35550500982878097702405956" + ], + "mAssetSupply": "110485344379447533886769105" + }, + { + "type": "mintMulti", + "inputQtys": [ + "194575000915530682990592", + "578981849771076724195328", + "118088736778533390516224" + ], + "expectedQty": "899658987605590183594342", + "reserves": [ + "7319479479052068551643152", + "68967025606421717659804334", + "35668589719656631092922180" + ], + "mAssetSupply": "111385003367053124070363447" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "825349300667134902272", + "expectedQty": "822020837422500654807", + "reserves": [ + "7319479479052068551643152", + "68967025606421717659804334", + "35669415068957298227824452" + ] + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "9223984252291015245824", + "expectedQty": "9364563573085444078394", + "swapFee": "5534390551374609147", + "reserves": [ + "7319479479052068551643152", + "68957661042848632215725940", + "35669415068957298227824452" + ], + "mAssetSupply": "111376606938028806930381577" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "1012160955267369373007872", + "305094740382439505395712", + "934651057614228788609024" + ], + "expectedQty": "2345736781407247127766965", + "swapFee": "1408287041068989670462", + "reserves": [ + "6307318523784699178635280", + "68652566302466192710330228", + "34734764011343069439215428" + ], + "mAssetSupply": "109030870156621559802614612" + }, + { + "type": "redeemMasset", + "inputQty": "1088497931909205830769049", + "expectedQtys": [ + "62949543631288136381120", + "685179875022991154205030", + "346666738711414903541835" + ], + "redemptionFee": "326549379572761749230", + "reserves": [ + "6244368980153411042254160", + "67967386427443201556125198", + "34388097272631654535673593" + ], + "mAssetSupply": "107942698774091926733594793" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "4516338804677950924914688", + "expectedQty": "4825241670977171262979471", + "reserves": [ + "10760707784831361967168848", + "67967386427443201556125198", + "34388097272631654535673593" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "1543973530914639052800", + "913046176357664555008", + "3245612841781552480256" + ], + "expectedQty": "5749914161921652292704", + "reserves": [ + "10762251758362276606221648", + "67968299473619559220680206", + "34391342885473436088153849" + ], + "mAssetSupply": "112773690359231019648866968" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "963175938820024809029632", + "outputIndex": 0, + "expectedQty": "920430310453767304785733", + "swapFee": "576983028582109737126", + "reserves": [ + "9841821447908509301435915", + "67968299473619559220680206", + "35354518824293460897183481" + ], + "mAssetSupply": "112774267342259601758604094", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemBassets", + "inputQtys": [ + "191735790964698576322560", + "59542376665982533894144", + "118683320377319610122240" + ], + "expectedQty": "378417217841041635813992", + "swapFee": "227186642690239124963", + "reserves": [ + "9650085656943810725113355", + "67908757096953576686786062", + "35235835503916141287061241" + ], + "mAssetSupply": "112395850124418560122790102" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "106295127067063140352", + "86188905704279703552", + "64313648246088335360" + ], + "expectedQty": "260951567328965893517", + "swapFee": "156664939360996133", + "reserves": [ + "9649979361816743661973003", + "67908670908047872407082510", + "35235771190267895198725881" + ], + "mAssetSupply": "112395589172851231156896585" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "67125796705293509328896", + "81655166913748785954816", + "74224408854341747736576" + ], + "expectedQty": "225245548071976889708438", + "swapFee": "135228465922739777691", + "reserves": [ + "9582853565111450152644107", + "67827015741134123621127694", + "35161546781413553450989305" + ], + "mAssetSupply": "112170343624779254267188147" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "368058967386345897984", + "expectedQty": "367206840565348921212", + "reserves": [ + "9582853565111450152644107", + "67827015741134123621127694", + "35161914840380939796887289" + ] + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "5702270977791060955103232", + "outputIndex": 2, + "expectedQty": "5628781361482812959525150", + "swapFee": "3378540444538367721815", + "reserves": [ + "9582853565111450152644107", + "73529286718925184576230926", + "29533133478898126837362139" + ], + "mAssetSupply": "112174089372064357983831174", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "1180104049381158682624", + "expectedQty": "1117730778768879649204", + "swapFee": "708062429628695209", + "reserves": [ + "9581735834332681272994903", + "73529286718925184576230926", + "29533133478898126837362139" + ], + "mAssetSupply": "112172909976077406453843759" + }, + { + "type": "mintMulti", + "inputQtys": [ + "3201069152183421239296", + "4521995149633731428352", + "10523377952963814227968" + ], + "expectedQty": "18373147430643607692833", + "reserves": [ + "9584936903484864694234199", + "73533808714074818307659278", + "29543656856851090651590107" + ], + "mAssetSupply": "112191283123508050061536592" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "15413522389002576", + "expectedQty": "15195724484570248", + "reserves": [ + "9584936903484864694234199", + "73533808729488340696661854", + "29543656856851090651590107" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "2159097772509818257408", + "6441459963957291778048", + "10514340024652958531584" + ], + "expectedQty": "19156922704103718291785", + "reserves": [ + "9587096001257374512491607", + "73540250189452297988439902", + "29554171196875743610121691" + ], + "mAssetSupply": "112210440061407878264398625" + }, + { + "type": "mintMulti", + "inputQtys": [ + "126410002848337453121536", + "165513990549444963074048", + "98225519307147144331264" + ], + "expectedQty": "394850345604927924784374", + "reserves": [ + "9713506004105711965613143", + "73705764180001742951513950", + "29652396716182890754452955" + ], + "mAssetSupply": "112605290407012806189182999" + }, + { + "type": "redeemMasset", + "inputQty": "559142920627355955", + "expectedQtys": [ + "48218060853150479", + "365877060348456790", + "147195159883395877" + ], + "redemptionFee": "167742876188206", + "reserves": [ + "9713505955887651112462664", + "73705763814124682603057160", + "29652396568987730871057078" + ], + "mAssetSupply": "112605289848037628438015250" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "2945843066285913538560", + "expectedQty": "2949797239243957954621", + "reserves": [ + "9713505955887651112462664", + "73705763814124682603057160", + "29655342412054016784595638" + ] + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "253630242751170871296", + "outputIndex": 1, + "expectedQty": "270946172999472133084", + "swapFee": "160391296919429225", + "reserves": [ + "9713759586130402283333960", + "73705492867951683130924076", + "29655342412054016784595638" + ], + "mAssetSupply": "112608239805668169315399096", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "791220568194025", + "expectedQty": "833921853695958", + "reserves": [ + "9713759586921622851527985", + "73705492867951683130924076", + "29655342412054016784595638" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "5302520740722197397504", + "42221707755956140507136", + "198395999021216808566784" + ], + "expectedQty": "245872011121180978638891", + "reserves": [ + "9719062107662345048925489", + "73747714575707639271431212", + "29853738411075233593162422" + ], + "mAssetSupply": "112854111817623272147733945" + }, + { + "type": "mintMulti", + "inputQtys": [ + "1552177612745803342807040", + "1643880672047032078172160", + "1618463984358242012626944" + ], + "expectedQty": "4869077964261384362523733", + "reserves": [ + "11271239720408148391732529", + "75391595247754671349603372", + "31472202395433475605789366" + ], + "mAssetSupply": "117723189781884656510257678" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "237368842034075533312", + "outputIndex": 0, + "expectedQty": "224813956906788628891", + "swapFee": "140676175307588977", + "reserves": [ + "11271014906451241603103638", + "75391832616596705425136684", + "31472202395433475605789366" + ], + "mAssetSupply": "117723189922560831817846655", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "8354254821081311232", + "expectedQty": "8363647095027929352", + "reserves": [ + "11271014906451241603103638", + "75391832616596705425136684", + "31472210749688296687100598" + ] + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "2199690892562686357274624", + "expectedQty": "2277425027437538058750744", + "reserves": [ + "13470705799013927960378262", + "75391832616596705425136684", + "31472210749688296687100598" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "272809616043864355766272", + "422684691317740426756096", + "1659717548998369931689984" + ], + "expectedQty": "2361164487225134270007528", + "reserves": [ + "13743515415057792316144534", + "75814517307914445851892780", + "33131928298686666618790582" + ], + "mAssetSupply": "122361787800870599174534279" + }, + { + "type": "mintMulti", + "inputQtys": [ + "86780880408986536378368", + "100624707177156018438144", + "240811323514002622906368" + ], + "expectedQty": "429966762629909849819593", + "reserves": [ + "13830296295466778852522902", + "75915142015091601870330924", + "33372739622200669241696950" + ], + "mAssetSupply": "122791754563500509024353872" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "1712159287863575838720", + "expectedQty": "1713897725645897316546", + "reserves": [ + "13830296295466778852522902", + "75915142015091601870330924", + "33374451781488532817535670" + ] + }, + { + "type": "redeemMasset", + "inputQty": "5956848279926326532505", + "expectedQtys": [ + "670721840808003851181", + "3681623495966090587318", + "1618546215974792974988" + ], + "redemptionFee": "1787054483977897959", + "reserves": [ + "13829625573625970848671721", + "75911460391595635779743606", + "33372833235272558024560682" + ], + "mAssetSupply": "122787513400000712573035872" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "15017250349308826353664", + "expectedQty": "15032445521414983944858", + "reserves": [ + "13829625573625970848671721", + "75911460391595635779743606", + "33387850485621866850914346" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "24667693675251941507072", + "21387527360586421633024", + "25314921257567256576000" + ], + "expectedQty": "71892425228739271967870", + "swapFee": "43161351948412610747", + "reserves": [ + "13804957879950718907164649", + "75890072864235049358110582", + "33362535564364299594338346" + ], + "mAssetSupply": "122730653420293388285012860" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "3326469736934194987139072", + "expectedQty": "3357017947546116788649792", + "swapFee": "1995881842160516992283", + "reserves": [ + "13804957879950718907164649", + "72533054916688932569460790", + "33362535564364299594338346" + ], + "mAssetSupply": "119406179565201353814866071" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "3792254472675170189312", + "expectedQty": "3794377309574631693511", + "reserves": [ + "13804957879950718907164649", + "72533054916688932569460790", + "33366327818836974764527658" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "106898990427074776268800", + "101147076534895604924416", + "52618089391409565007872" + ], + "expectedQty": "262579872548560819958627", + "reserves": [ + "13911856870377793683433449", + "72634201993223828174385206", + "33418945908228384329535530" + ], + "mAssetSupply": "119672553815059489266518209" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "953548119633084958113792", + "outputIndex": 2, + "expectedQty": "975452147650851881021144", + "swapFee": "586207617598935177835", + "reserves": [ + "14865404990010878641547241", + "72634201993223828174385206", + "32443493760577532448514386" + ], + "mAssetSupply": "119673140022677088201696044", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemMasset", + "inputQty": "6379932018814355046", + "expectedQtys": [ + "792256484357864247", + "3871062884190441024", + "1729086313108422755" + ], + "redemptionFee": "1913979605644306", + "reserves": [ + "14865404197754394283682994", + "72634198122160943983944182", + "32443492031491219340091631" + ], + "mAssetSupply": "119673133644659048992985304" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "7128481754786555756544", + "expectedQty": "7188237051879325270292", + "swapFee": "4277089052871933453", + "reserves": [ + "14865404197754394283682994", + "72627009885109064658673890", + "32443492031491219340091631" + ], + "mAssetSupply": "119666009439993315309162213" + }, + { + "type": "redeemMasset", + "inputQty": "103472127767914576923852", + "expectedQtys": [ + "12849877447798352454153", + "62779872246236656158885", + "28044639152580982403057" + ], + "redemptionFee": "31041638330374373077", + "reserves": [ + "14852554320306595931228841", + "72564230012862828002515005", + "32415447392338638357688574" + ], + "mAssetSupply": "119562568353863731106611438" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "267799028944139915886592", + "86240548838220222169088", + "60841010535044011261952" + ], + "expectedQty": "420381100870979150096722", + "swapFee": "252380088575732929815", + "reserves": [ + "14584755291362456015342249", + "72477989464024607780345917", + "32354606381803594346426622" + ], + "mAssetSupply": "119142187252992751956514716" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "369198340516371912196096", + "404011703889002011557888", + "336942214877634055110656" + ], + "expectedQty": "1115719435272352775534953", + "swapFee": "669833561300191780389", + "reserves": [ + "14215556950846084103146153", + "72073977760135605768788029", + "32017664166925960291315966" + ], + "mAssetSupply": "118026467817720399180979763" + }, + { + "type": "redeemMasset", + "inputQty": "255927332833898633625", + "expectedQtys": [ + "30815614476601395394", + "156237558621949854207", + "69405933149215242070" + ], + "redemptionFee": "76778199850169590", + "reserves": [ + "14215526135231607501750759", + "72073821522576983818933822", + "32017594760992811076073896" + ], + "mAssetSupply": "118026211967165765132515728" + }, + { + "type": "mintMulti", + "inputQtys": [ + "884862822458819739648", + "840640506174734860288", + "121144043694772830208" + ], + "expectedQty": "1860719963857330402049", + "reserves": [ + "14216410998054066321490407", + "72074662163083158553794110", + "32017715905036505848904104" + ], + "mAssetSupply": "118028072687129622462917777" + }, + { + "type": "redeemMasset", + "inputQty": "122077133234102101606", + "expectedQtys": [ + "14699706691893948056", + "74524884927686005047", + "33106177980704612947" + ], + "redemptionFee": "36623139970230630", + "reserves": [ + "14216396298347374427542351", + "72074587638198230867789063", + "32017682798858525144291157" + ], + "mAssetSupply": "118027950646619528331046801" + }, + { + "type": "redeemMasset", + "inputQty": "13008765353496447392153", + "expectedQtys": [ + "1566427962830399943818", + "7941509726981114314782", + "3527855624494382017647" + ], + "redemptionFee": "3902629606048934217", + "reserves": [ + "14214829870384544027598533", + "72066646128471249753474281", + "32014154943234030762273510" + ], + "mAssetSupply": "118014945783895637932588865" + }, + { + "type": "mintMulti", + "inputQtys": [ + "28731873893087166464", + "70311168681640919040", + "39543918487697088512" + ], + "expectedQty": "138687082232626286976", + "reserves": [ + "14214858602258437114764997", + "72066716439639931394393321", + "32014194487152518459362022" + ], + "mAssetSupply": "118015084470977870558875841" + }, + { + "type": "redeemMasset", + "inputQty": "33538242908412", + "expectedQtys": [ + "4038452884505", + "20474212725288", + "9095258678917" + ], + "redemptionFee": "10061472872", + "reserves": [ + "14214858602254398661880492", + "72066716439619457181668033", + "32014194487143423200683105" + ], + "mAssetSupply": "118015084470944342377440301" + }, + { + "type": "redeemMasset", + "inputQty": "223746229993465446400", + "expectedQtys": [ + "26942037791963608606", + "136591172109937241141", + "60677890782191739078" + ], + "redemptionFee": "67123868998039633", + "reserves": [ + "14214831660216606698271886", + "72066579848447347244426892", + "32014133809252641008944027" + ], + "mAssetSupply": "118014860791838217910033534" + }, + { + "type": "mintMulti", + "inputQtys": [ + "260667241442053", + "144386949007766", + "132219006948195" + ], + "expectedQty": "542482421701198", + "reserves": [ + "14214831660477273939713939", + "72066579848591734193434658", + "32014133809384860015892222" + ], + "mAssetSupply": "118014860792380700331734732" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "180976866396834594816", + "expectedQty": "181183196594965160706", + "reserves": [ + "14214831660477273939713939", + "72066579848591734193434658", + "32014314786251256850487038" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "19364847394956563709952", + "28756282961198871216128", + "24904485010308895604736" + ], + "expectedQty": "73263558940256571781196", + "swapFee": "43984526079801824163", + "reserves": [ + "14195466813082317376003987", + "72037823565630535322218530", + "31989410301240947954882302" + ], + "mAssetSupply": "117941778416637038725114242" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "372689591284754538299392", + "expectedQty": "363299961266230250917845", + "swapFee": "223613754770852722979", + "reserves": [ + "13832166851816087125086142", + "72037823565630535322218530", + "31989410301240947954882302" + ], + "mAssetSupply": "117569312439107055039537829" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "321249689254227345408", + "expectedQty": "320718482132614977656", + "swapFee": "192749813552536407", + "reserves": [ + "13832166851816087125086142", + "72037823565630535322218530", + "31989089582758815339904646" + ], + "mAssetSupply": "117568991382167614364728828" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "1449280051391167090130944", + "expectedQty": "1462061735566391893534700", + "swapFee": "869568030834700254078", + "reserves": [ + "13832166851816087125086142", + "70575761830064143428683830", + "31989089582758815339904646" + ], + "mAssetSupply": "116120580898807281974851962" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "133340518932742265634816", + "expectedQty": "136641770752961031748412", + "reserves": [ + "13965507370748829390720958", + "70575761830064143428683830", + "31989089582758815339904646" + ] + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "145746276806899632439296", + "expectedQty": "149281609588533840589027", + "reserves": [ + "14111253647555729023160254", + "70575761830064143428683830", + "31989089582758815339904646" + ] + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "3036203408934738258296832", + "expectedQty": "3007939158792817055096656", + "reserves": [ + "14111253647555729023160254", + "73611965238998881686980662", + "31989089582758815339904646" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "3348678386068885602304", + "1932721261549351862272", + "688472115688817426432" + ], + "expectedQty": "6038793636949315240089", + "swapFee": "3625451453041413992", + "reserves": [ + "14107904969169660137557950", + "73610032517737332335118390", + "31988401110643126522478214" + ], + "mAssetSupply": "119408404644304644587045968" + }, + { + "type": "redeemMasset", + "inputQty": "70925015979940347117568", + "expectedQtys": [ + "8377159106563227352028", + "43709037988839808606690", + "18994452135453615413075" + ], + "redemptionFee": "21277504793982104135", + "reserves": [ + "14099527810063096910205922", + "73566323479748492526511700", + "31969406658507672907065139" + ], + "mAssetSupply": "119337500905829498222032535" + }, + { + "type": "mintMulti", + "inputQtys": [ + "29362932977327056879616", + "96152293713413419302912", + "27234764779079549845504" + ], + "expectedQty": "152623524352922142975112", + "reserves": [ + "14128890743040423967085538", + "73662475773461905945814612", + "31996641423286752456910643" + ], + "mAssetSupply": "119490124430182420365007647" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "20068695254957639598080", + "expectedQty": "19876401165606709904924", + "reserves": [ + "14128890743040423967085538", + "73682544468716863585412692", + "31996641423286752456910643" + ] + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "208782262473646734835712", + "outputIndex": 1, + "expectedQty": "210941852659348862018634", + "swapFee": "125433617053582025579", + "reserves": [ + "14128890743040423967085538", + "73471602616057514723394058", + "32205423685760399191746355" + ], + "mAssetSupply": "119510126264965080656938150", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mintMulti", + "inputQtys": [ + "335404300978489351208960", + "198845542641281716453376", + "407298974399666336038912" + ], + "expectedQty": "948629373594806771466011", + "reserves": [ + "14464295044018913318294498", + "73670448158698796439847434", + "32612722660160065527785267" + ], + "mAssetSupply": "120458755638559887428404161" + }, + { + "type": "redeemMasset", + "inputQty": "5487594695823018393", + "expectedQtys": [ + "658734818279559807", + "3355109193549075318", + "1485252884413862211" + ], + "redemptionFee": "1646278408746905", + "reserves": [ + "14464294385284095038734691", + "73670444803589602890772116", + "32612721174907181113923056" + ], + "mAssetSupply": "120458750152611470014132673" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "19040881356561184", + "expectedQty": "18570214921434617", + "swapFee": "11424528813936", + "reserves": [ + "14464294366713880117300074", + "73670444803589602890772116", + "32612721174907181113923056" + ], + "mAssetSupply": "120458750133582013186385425" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "2411668534743384283152384", + "outputIndex": 0, + "expectedQty": "2314959605243899008475456", + "swapFee": "1433246227365849401645", + "reserves": [ + "12149334761469981108824618", + "76082113338332987173924500", + "32612721174907181113923056" + ], + "mAssetSupply": "120460183379809379035787070", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemMasset", + "inputQty": "37826049474429513524838", + "expectedQtys": [ + "3813903121157328732409", + "23883596527897908993304", + "10237742355480450615142" + ], + "redemptionFee": "11347814842328854057", + "reserves": [ + "12145520858348823780092209", + "76058229741805089264931196", + "32602483432551700663307914" + ], + "mAssetSupply": "120422368678149791851116289" + }, + { + "type": "redeemMasset", + "inputQty": "495688870599855806873", + "expectedQtys": [ + "49979031830477815641", + "312980952366686541240", + "134159792423233180386" + ], + "redemptionFee": "148706661179956742", + "reserves": [ + "12145470879316993302276568", + "76057916760852722578389956", + "32602349272759277430127528" + ], + "mAssetSupply": "120421873137985853175266158" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "1036356657602903146496", + "612484803677854760960", + "568524244291802824704" + ], + "expectedQty": "2249548425236409518673", + "swapFee": "1350539378769107175", + "reserves": [ + "12144434522659390399130072", + "76057304276049044723628996", + "32601780748514985627302824" + ], + "mAssetSupply": "120419623589560616765747485" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "1169628689361957896060928", + "expectedQty": "1167509442454650917027122", + "swapFee": "701777213617174737636", + "reserves": [ + "12144434522659390399130072", + "76057304276049044723628996", + "31434271306060334710275702" + ], + "mAssetSupply": "119250696677412276044424193" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "50757019222713065472", + "59014063972284645376", + "17168047787153235968" + ], + "expectedQty": "128156996877764884011", + "swapFee": "76940362344065369", + "reserves": [ + "12144383765640167686064600", + "76057245261985072438983620", + "31434254138012547557039734" + ], + "mAssetSupply": "119250568520415398279540182" + }, + { + "type": "mintMulti", + "inputQtys": [ + "191783191419751989248", + "2931566212773728768", + "471312313406448926720" + ], + "expectedQty": "673791038288539907808", + "reserves": [ + "12144575548831587438053848", + "76057248193551285212712388", + "31434725450325954005966454" + ], + "mAssetSupply": "119251242311453686819447990" + }, + { + "type": "mintMulti", + "inputQtys": [ + "1859267934467804889088", + "1487984500697223135232", + "724262782833750573056" + ], + "expectedQty": "4124069417305751971855", + "reserves": [ + "12146434816766055242942936", + "76058736178051982435847620", + "31435449713108787756539510" + ], + "mAssetSupply": "119255366380870992571419845" + }, + { + "type": "mintMulti", + "inputQtys": [ + "1037411301840602136576", + "6834834808608963690496", + "6604467153370804649984" + ], + "expectedQty": "14445782776208956794622", + "reserves": [ + "12147472228067895845079512", + "76065571012860591399538116", + "31442054180262158561189494" + ], + "mAssetSupply": "119269812163647201528214467" + }, + { + "type": "mintMulti", + "inputQtys": [ + "33728303432634011222016", + "1992650958048557294157824", + "1003579659364094057644032" + ], + "expectedQty": "3009355366874097623498973", + "reserves": [ + "12181200531500529856301528", + "78058221970909148693695940", + "32445633839626252618833526" + ], + "mAssetSupply": "122279167530521299151713440" + }, + { + "type": "redeemMasset", + "inputQty": "207821759086220401442816", + "expectedQtys": [ + "20696567680263977570502", + "132625455910049068912692", + "55127017649398157223595" + ], + "redemptionFee": "62346527725866120432", + "reserves": [ + "12160503963820265878731026", + "77925596514999099624783248", + "32390506821976854461609931" + ], + "mAssetSupply": "122071408117962804616391056" + }, + { + "type": "redeemMasset", + "inputQty": "12755245662393222142361", + "expectedQtys": [ + "1270270284934849568353", + "8140005544451879885064", + "3383469834173794662409" + ], + "redemptionFee": "3826573698717966642", + "reserves": [ + "12159233693535331029162673", + "77917456509454647744898184", + "32387123352142680666947522" + ], + "mAssetSupply": "122058656698874110112215337" + }, + { + "type": "redeemMasset", + "inputQty": "38815799460048057139", + "expectedQtys": [ + "3865590514298100060", + "24771049588537744104", + "10296319650637813595" + ], + "redemptionFee": "11644739838014417", + "reserves": [ + "12159229827944816731062613", + "77917431738405059207154080", + "32387113055823030029133927" + ], + "mAssetSupply": "122058617894719389902172615" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "156522628908803", + "31200228997604", + "29570399527982" + ], + "expectedQty": "223030874868473", + "swapFee": "133898864239", + "reserves": [ + "12159229827788294102153810", + "77917431738373858978156476", + "32387113055793459629605945" + ], + "mAssetSupply": "122058617894496359027304142" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "3536615394955459297280", + "expectedQty": "3494866356766938945341", + "reserves": [ + "12159229827788294102153810", + "77920968353768814437453756", + "32387113055793459629605945" + ] + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "4362770462965138555142144", + "expectedQty": "4486678689203434236896146", + "reserves": [ + "16522000290753432657295954", + "77920968353768814437453756", + "32387113055793459629605945" + ] + }, + { + "type": "redeemMasset", + "inputQty": "14615216362984515934617", + "expectedQtys": [ + "1907565962897601501910", + "8996452270422537447027", + "3739290244191784143105" + ], + "redemptionFee": "4384564908895354780", + "reserves": [ + "16520092724790535055794044", + "77911971901498391900006729", + "32383373765549267845462840" + ], + "mAssetSupply": "126534180618258484582565792" + }, + { + "type": "redeemMasset", + "inputQty": "145276377709722045985587", + "expectedQtys": [ + "18961352774358184508639", + "89425429335108344069462", + "37168833384999128443253" + ], + "redemptionFee": "43582913312916613795", + "reserves": [ + "16501131372016176871285405", + "77822546472163283555937267", + "32346204932164268717019587" + ], + "mAssetSupply": "126388947823462075453194000" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "971842549408136020623360", + "expectedQty": "968844200930561837374761", + "swapFee": "583105529644881612374", + "reserves": [ + "16501131372016176871285405", + "77822546472163283555937267", + "31377360731233706879644826" + ], + "mAssetSupply": "125417688379583584314183014" + }, + { + "type": "redeemMasset", + "inputQty": "6025901365102839542579", + "expectedQtys": [ + "792586445242896328764", + "3737991903556704208298", + "1507125192957841349012" + ], + "redemptionFee": "1807770409530851862", + "reserves": [ + "16500338785570933974956641", + "77818808480259726851728969", + "31375853606040749038295814" + ], + "mAssetSupply": "125411664285988891005492297" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "2282005754671577956352", + "outputIndex": 2, + "expectedQty": "2321206085162002959674", + "swapFee": "1397345801263769891", + "reserves": [ + "16502620791325605552912993", + "77818808480259726851728969", + "31373532399955587035336140" + ], + "mAssetSupply": "125411665683334692269262188", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mintMulti", + "inputQtys": [ + "13322906383627356", + "6536795895823014", + "3936789971567817" + ], + "expectedQty": "24021536018050896", + "reserves": [ + "16502620804648511936540349", + "77818808486796522747551983", + "31373532403892377006903957" + ], + "mAssetSupply": "125411665707356228287313084" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "211433842892836779851776", + "69229720507224583831552", + "98840482260159421218816" + ], + "expectedQty": "383538045403724332069166", + "swapFee": "230260983832534119713", + "reserves": [ + "16291186961755675156688573", + "77749578766289298163720431", + "31274691921632217585685141" + ], + "mAssetSupply": "125028127661952503955243918" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "112344487429961383936", + "expectedQty": "112649911556556054896", + "reserves": [ + "16291186961755675156688573", + "77749578766289298163720431", + "31274804266119647547069077" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "6741613453745162551296", + "4609213094357058977792", + "2140331065840392470528" + ], + "expectedQty": "13596588899500083656415", + "swapFee": "8162851050330248342", + "reserves": [ + "16284445348301929994137277", + "77744969553194941104742639", + "31272663935053807154598549" + ], + "mAssetSupply": "125014643722964560427642399" + }, + { + "type": "mintMulti", + "inputQtys": [ + "8168724859338440572928", + "297495223152605790208", + "2084781343172417814528" + ], + "expectedQty": "10726006667638078718359", + "reserves": [ + "16292614073161268434710205", + "77745267048418093710532847", + "31274748716396979572413077" + ], + "mAssetSupply": "125025369729632198506360758" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "851669361915672960", + "outputIndex": 2, + "expectedQty": "841041065392598844", + "swapFee": "506300088378215", + "reserves": [ + "16292614073161268434710205", + "77745267900087455626205807", + "31274747875355914179814233" + ], + "mAssetSupply": "125025369730138498594738973", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemMasset", + "inputQty": "23143996241408845414400", + "expectedQtys": [ + "3015092671399133636596", + "14387451051679726208428", + "5787669350995979602391" + ], + "redemptionFee": "6943198872422653624", + "reserves": [ + "16289598980489869301073609", + "77730880449035775899997379", + "31268960206004918200211842" + ], + "mAssetSupply": "125002232677095962171978197" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "260121678834317622509568", + "expectedQty": "254518130319207734528428", + "swapFee": "156073007300590573505", + "reserves": [ + "16035080850170661566545181", + "77730880449035775899997379", + "31268960206004918200211842" + ], + "mAssetSupply": "124742267071268945140042134" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "6755678911194924", + "113720423885191520", + "43904215682552848" + ], + "expectedQty": "163583812389166673", + "swapFee": "98209212961276", + "reserves": [ + "16035080843414982655350257", + "77730880335315352014805859", + "31268960162100702517658994" + ], + "mAssetSupply": "124742266907685132750875461" + }, + { + "type": "redeemMasset", + "inputQty": "17313586193368489551462", + "expectedQtys": [ + "2224919217471013986461", + "10785410509483335567024", + "4338669137646637885414" + ], + "redemptionFee": "5194075858010546865", + "reserves": [ + "16032855924197511641363796", + "77720094924805868679238835", + "31264621492963055879773580" + ], + "mAssetSupply": "124724958515567622271870864" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "15409550509465537609728", + "expectedQty": "15265765588242623328918", + "reserves": [ + "16032855924197511641363796", + "77735504475315334216848563", + "31264621492963055879773580" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "719510382839311106048", + "19798284429993724346368", + "18618566455315411238912" + ], + "expectedQty": "39017172363235765437056", + "swapFee": "23424358032761115931", + "reserves": [ + "16032136413814672330257748", + "77715706190885340492502195", + "31246002926507740468534668" + ], + "mAssetSupply": "124701207108792629129762726" + }, + { + "type": "redeemMasset", + "inputQty": "148672301482290246267699", + "expectedQtys": [ + "19108231693824164994344", + "92627063656032118224697", + "37241191567653014688698" + ], + "redemptionFee": "44601690444687073880", + "reserves": [ + "16013028182120848165263404", + "77623079127229308374277498", + "31208761734940087453845970" + ], + "mAssetSupply": "124552579409000783570568907" + }, + { + "type": "mintMulti", + "inputQtys": [ + "207208011011304882176", + "35069640304681656320", + "147972218374140887040" + ], + "expectedQty": "394827207588399529781", + "reserves": [ + "16013235390131859470145580", + "77623114196869613055933818", + "31208909707158461594733010" + ], + "mAssetSupply": "124552974236208371970098688" + }, + { + "type": "redeemMasset", + "inputQty": "3641237583087899823308", + "expectedQtys": [ + "467997673186652064318", + "2268588198736122023647", + "912101569095975779629" + ], + "redemptionFee": "1092371274926369946", + "reserves": [ + "16012767392458672818081262", + "77620845608670876933910171", + "31207997605589365618953381" + ], + "mAssetSupply": "124549334090996558996645326" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "17980919239973941248", + "8551620095829322752", + "263446251329261273088" + ], + "expectedQty": "290997182965241775745", + "swapFee": "174703131658139949", + "reserves": [ + "16012749411539432844140014", + "77620837057050781104587419", + "31207734159338036357680293" + ], + "mAssetSupply": "124549043093813593754869581" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "21194008789649994022912", + "8627997321996748718080", + "20227580150469189697536" + ], + "expectedQty": "50484940975656092330513", + "swapFee": "30309150075438918749", + "reserves": [ + "15991555402749782850117102", + "77612209059728784355869339", + "31187506579187567167982757" + ], + "mAssetSupply": "124498558152837937662539068" + }, + { + "type": "redeemMasset", + "inputQty": "1137753922854813", + "expectedQtys": [ + "146098049852365", + "709061257819283", + "284927499309644" + ], + "redemptionFee": "341326176856", + "reserves": [ + "15991555402603684800264737", + "77612209059019723098050056", + "31187506578902639668673113" + ], + "mAssetSupply": "124498558151700525065861111" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "90550359952187077951488", + "67668980963667378962432", + "96982911531100187656192" + ], + "expectedQty": "256813788996093604226217", + "swapFee": "154180781866776228272", + "reserves": [ + "15901005042651497722313249", + "77544540078056055719087624", + "31090523667371539481016921" + ], + "mAssetSupply": "124241744362704431461634894" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "3104506949971565084672", + "expectedQty": "3112916576185881735418", + "reserves": [ + "15901005042651497722313249", + "77544540078056055719087624", + "31093628174321511046101593" + ] + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "6488804428778861232128", + "expectedQty": "6467386713953630844433", + "swapFee": "3893282657267316739", + "reserves": [ + "15901005042651497722313249", + "77544540078056055719087624", + "31087160787607557415257160" + ], + "mAssetSupply": "124238372368134495749454923" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "554899816089027237380096", + "expectedQty": "542194296503966797864215", + "swapFee": "332939889653416342428", + "reserves": [ + "15358810746147530924449034", + "77544540078056055719087624", + "31087160787607557415257160" + ], + "mAssetSupply": "123683805491935121928417255" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "223530832425787424768", + "expectedQty": "221364876485927776921", + "reserves": [ + "15358810746147530924449034", + "77544763608888481506512392", + "31087160787607557415257160" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "535203233092210442371072", + "794159002474862239285248", + "1137786903470586315407360" + ], + "expectedQty": "2474766689013819137023206", + "reserves": [ + "15894013979239741366820106", + "78338922611363343745797640", + "32224947691078143730664520" + ], + "mAssetSupply": "126158793545825426993217382" + }, + { + "type": "mintMulti", + "inputQtys": [ + "8980652915584992256", + "7259453183113610240", + "9122359147312846848" + ], + "expectedQty": "25518882023446208344", + "reserves": [ + "15894022959892656951812362", + "78338929870816526859407880", + "32224956813437291043511368" + ], + "mAssetSupply": "126158819064707450439425726" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "11362854139654121193472", + "expectedQty": "11619993912888878348847", + "reserves": [ + "15905385814032311073005834", + "78338929870816526859407880", + "32224956813437291043511368" + ] + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "2961003715836764231827456", + "expectedQty": "2950302429826548960538532", + "swapFee": "1776602229502058539096", + "reserves": [ + "15905385814032311073005834", + "78338929870816526859407880", + "29274654383610742082972836" + ], + "mAssetSupply": "123211211945013077144486213" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "10398107233621666430976", + "expectedQty": "10495201705865378627783", + "swapFee": "6238864340172999858", + "reserves": [ + "15905385814032311073005834", + "78328434669110661480780097", + "29274654383610742082972836" + ], + "mAssetSupply": "123200820076643795651055095" + }, + { + "type": "mintMulti", + "inputQtys": [ + "18711574728608692830208", + "23284035311063699292160", + "8777252918377118171136" + ], + "expectedQty": "50990887079742380115205", + "reserves": [ + "15924097388760919765836042", + "78351718704421725180072257", + "29283431636529119201143972" + ], + "mAssetSupply": "123251810963723538031170300" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "599237833016603372945408", + "expectedQty": "601418920339014734473411", + "reserves": [ + "15924097388760919765836042", + "78351718704421725180072257", + "29882669469545722574089380" + ] + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "1277810148310590135730176", + "expectedQty": "1265235185727421458706010", + "reserves": [ + "15924097388760919765836042", + "79629528852732315315802433", + "29882669469545722574089380" + ] + }, + { + "type": "redeemMasset", + "inputQty": "45376584180511868033433", + "expectedQtys": [ + "5773443359564495145332", + "28870495033805468146172", + "10834265541278126462856" + ], + "redemptionFee": "13612975254153560410", + "reserves": [ + "15918323945401355270690710", + "79600658357698509847656261", + "29871835204004444447626524" + ], + "mAssetSupply": "125073102098584716509876698" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "106145226997218272083968", + "expectedQty": "107147085855116806713960", + "swapFee": "63687136198330963250", + "reserves": [ + "15918323945401355270690710", + "79493511271843393040942301", + "29871835204004444447626524" + ], + "mAssetSupply": "124967020558723696568755980" + }, + { + "type": "mintMulti", + "inputQtys": [ + "409776481040679888224256", + "11834792894780256813056", + "560502861619598362411008" + ], + "expectedQty": "993113737907812014572484", + "reserves": [ + "16328100426442035158914966", + "79505346064738173297755357", + "30432338065624042810037532" + ], + "mAssetSupply": "125960134296631508583328464" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "10006081196423439712256", + "expectedQty": "10097212100457610823624", + "swapFee": "6003648717854063827", + "reserves": [ + "16328100426442035158914966", + "79495248852637715686931733", + "30432338065624042810037532" + ], + "mAssetSupply": "125950134219083802997680035" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "6140675974375821312", + "6298888547050004480", + "4117447886178476544" + ], + "expectedQty": "16643899400280813568", + "swapFee": "9992335041193204", + "reserves": [ + "16328094285766060783093654", + "79495242553749168636927253", + "30432333948176156631560988" + ], + "mAssetSupply": "125950117575184402716866467" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "197720455921585979392", + "52844647983020605440", + "171463712178123898880" + ], + "expectedQty": "426402747540551669525", + "swapFee": "255995245671734042", + "reserves": [ + "16327896565310139197114262", + "79495189709101185616321813", + "30432162484463978507662108" + ], + "mAssetSupply": "125949691172436862165196942" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "274913916409831799914496", + "expectedQty": "273787701583678991785698", + "swapFee": "164948349845899079948", + "reserves": [ + "16327896565310139197114262", + "79495189709101185616321813", + "30158374782880299515876410" + ], + "mAssetSupply": "125674942204376876264362394" + }, + { + "type": "redeemMasset", + "inputQty": "5100647521482741016166", + "expectedQtys": [ + "662485765523049833020", + "3225426581996089519463", + "1223641632285658577674" + ], + "redemptionFee": "1530194256444822304", + "reserves": [ + "16327234079544616147281242", + "79491964282519189526802350", + "30157151141248013857298736" + ], + "mAssetSupply": "125669843087049649968168532" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "2111618347160107745280", + "3319146394735743598592", + "2089976802952732475392" + ], + "expectedQty": "7541912900979962265233", + "swapFee": "4527864459263535480", + "reserves": [ + "16325122461197456039535962", + "79488645136124453783203758", + "30155061164445061124823344" + ], + "mAssetSupply": "125662301174148670005903299" + }, + { + "type": "redeemMasset", + "inputQty": "5485967321398802", + "expectedQtys": [ + "712482739667347", + "3469149330649333", + "1316067346162150" + ], + "redemptionFee": "1645790196419", + "reserves": [ + "16325122460484973299868615", + "79488645132655304452554425", + "30155061163128993778661194" + ], + "mAssetSupply": "125662301168664348474700916" + }, + { + "type": "redeemMasset", + "inputQty": "45680126751539124502528", + "expectedQtys": [ + "5932645958231794370571", + "28886643295511281298696", + "10958527396207671927161" + ], + "redemptionFee": "13704038025461737350", + "reserves": [ + "16319189814526741505498044", + "79459758489359793171255729", + "30144102635732786106734033" + ], + "mAssetSupply": "125616634745950834811935738" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "618235736419298569093120", + "expectedQty": "604241272765954941760657", + "swapFee": "370941441851579141455", + "reserves": [ + "15714948541760786563737387", + "79459758489359793171255729", + "30144102635732786106734033" + ], + "mAssetSupply": "124998769950973387821984073" + }, + { + "type": "redeemMasset", + "inputQty": "482323848960382441881", + "expectedQtys": [ + "60619960992482888588", + "306513727823979019293", + "116280006967606516159" + ], + "redemptionFee": "144697154688114732", + "reserves": [ + "15714887921799794080848799", + "79459451975631969192236436", + "30143986355725818500217874" + ], + "mAssetSupply": "124998287771821582127656924" + }, + { + "type": "redeemMasset", + "inputQty": "268793998074134643553075", + "expectedQtys": [ + "33782865419963833065957", + "170816870333073233765557", + "64801622470628589802495" + ], + "redemptionFee": "80638199422240393065", + "reserves": [ + "15681105056379830247782842", + "79288635105298895958470879", + "30079184733255189910415379" + ], + "mAssetSupply": "124729574411946869724496914" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "1220615735206114230272", + "expectedQty": "1249236658702119575753", + "reserves": [ + "15682325672115036362013114", + "79288635105298895958470879", + "30079184733255189910415379" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "142631178063026996641792", + "25068276456688357212160", + "95291235037653688647680" + ], + "expectedQty": "266447495641385395085877", + "swapFee": "159964476070473521164", + "reserves": [ + "15539694494052009365371322", + "79263566828842207601258719", + "29983893498217536221767699" + ], + "mAssetSupply": "124464376152964186448986790" + }, + { + "type": "mintMulti", + "inputQtys": [ + "10384956784148937179136", + "2957399549362579177472", + "11487988336236578209792" + ], + "expectedQty": "25088680994935870941164", + "reserves": [ + "15550079450836158302550458", + "79266524228391570180436191", + "29995381486553772799977491" + ], + "mAssetSupply": "124489464833959122319927954" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "29320343100093", + "outputIndex": 1, + "expectedQty": "30306623208056", + "swapFee": "18011548997", + "reserves": [ + "15550079450865478645650551", + "79266524228361263557228135", + "29995381486553772799977491" + ], + "mAssetSupply": "124489464833959140331476951", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "11690969582641650597888", + "expectedQty": "11969428349857006711217", + "reserves": [ + "15561770420448120296248439", + "79266524228361263557228135", + "29995381486553772799977491" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "923363957952673277280256", + "696083636790445285048320", + "158335348663101301981184" + ], + "expectedQty": "1792362538021795052362857", + "reserves": [ + "16485134378400793573528695", + "79962607865151708842276455", + "30153716835216874101958675" + ], + "mAssetSupply": "126293796800330792390551025" + }, + { + "type": "redeemMasset", + "inputQty": "418301247801079365632", + "expectedQtys": [ + "54584498444275693943", + "264766955757082390072", + "99843014433510177808" + ], + "redemptionFee": "125490374340323809", + "reserves": [ + "16485079793902349297834752", + "79962343098195951759886383", + "30153616992202440591780867" + ], + "mAssetSupply": "126293378624573365651509202" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "461966671167638011904", + "expectedQty": "466196691882354699324", + "swapFee": "277180002700582807", + "reserves": [ + "16485079793902349297834752", + "79961876901504069405187059", + "30153616992202440591780867" + ], + "mAssetSupply": "126292916935082200714080105" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "12168235018452687912960", + "outputIndex": 0, + "expectedQty": "11948952048220711858454", + "swapFee": "7327878089353370421", + "reserves": [ + "16473130841854128585976298", + "79961876901504069405187059", + "30165785227220893279693827" + ], + "mAssetSupply": "126292924262960290067450526", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemMasset", + "inputQty": "4236541786806993715", + "expectedQtys": [ + "552431348359907025", + "2681545353956216600", + "1011618590745882247" + ], + "redemptionFee": "1270962536042098", + "reserves": [ + "16473130289422780226069273", + "79961874219958715448970459", + "30165784215602302533811580" + ], + "mAssetSupply": "126292920027689465796498909" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "129405090466147168419840", + "expectedQty": "129877306713493855454933", + "reserves": [ + "16473130289422780226069273", + "79961874219958715448970459", + "30295189306068449702231420" + ] + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "2128382489944294686720", + "expectedQty": "2174201120461182840589", + "reserves": [ + "16475258671912724520755993", + "79961874219958715448970459", + "30295189306068449702231420" + ] + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "1147263101806339200", + "expectedQty": "1136194403954461324", + "reserves": [ + "16475258671912724520755993", + "79961875367221817255309659", + "30295189306068449702231420" + ] + }, + { + "type": "redeemMasset", + "inputQty": "1667849241591646822", + "expectedQtys": [ + "217283054337703523", + "1054572851106781909", + "399546459041863612" + ], + "redemptionFee": "500354772477494", + "reserves": [ + "16475258454629670183052470", + "79961874312648966148527750", + "30295188906521990660367808" + ], + "mAssetSupply": "126424971004368937970086427" + }, + { + "type": "redeemMasset", + "inputQty": "12806399727980620283904", + "expectedQtys": [ + "1668384395048611249927", + "8097423398209181551612", + "3067874203969640562097" + ], + "redemptionFee": "3841919918394186085", + "reserves": [ + "16473590070234621571802543", + "79953776889250756966976138", + "30292121032318021019805711" + ], + "mAssetSupply": "126412168446560875743988608" + }, + { + "type": "redeemMasset", + "inputQty": "104643882926875882605772", + "expectedQtys": [ + "13632732463522999996154", + "66165811163943807461867", + "25068268666731985754887" + ], + "redemptionFee": "31393164878062764781", + "reserves": [ + "16459957337771098571806389", + "79887611078086813159514271", + "30267052763651289034050824" + ], + "mAssetSupply": "126307555956798877924147617" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "45135272067360336", + "expectedQty": "44699810756445415", + "reserves": [ + "16459957337771098571806389", + "79887611123222085226874607", + "30267052763651289034050824" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "141019207770045138599936", + "18873685511965742465024", + "67873625560434176163840" + ], + "expectedQty": "230890873378043768235282", + "swapFee": "138617694643612428398", + "reserves": [ + "16318938130001053433206453", + "79868737437710119484409583", + "30199179138090854857886984" + ], + "mAssetSupply": "126076665128120644912357750" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "38149743829361899864064", + "outputIndex": 1, + "expectedQty": "38640316149608184735032", + "swapFee": "22972644002031862480", + "reserves": [ + "16318938130001053433206453", + "79830097121560511299674551", + "30237328881920216757751048" + ], + "mAssetSupply": "126076688100764646944220230", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "5924641143286982823116800", + "outputIndex": 0, + "expectedQty": "5642004891393775708145508", + "swapFee": "3518405590338090527205", + "reserves": [ + "10676933238607277725060945", + "85754738264847494122791351", + "30237328881920216757751048" + ], + "mAssetSupply": "126080206506354985034747435", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mintMulti", + "inputQtys": [ + "4062391331468504203264", + "2166441041271350362112", + "3165813216771406561280" + ], + "expectedQty": "9614169165800943770344", + "reserves": [ + "10680995629938746229264209", + "85756904705888765473153463", + "30240494695136988164312328" + ], + "mAssetSupply": "126089820675520785978517779" + }, + { + "type": "redeemMasset", + "inputQty": "6094078998786050569011", + "expectedQtys": [ + "516071032194131344126", + "4143495219236933585365", + "1461122525660091297103" + ], + "redemptionFee": "1828223699635815170", + "reserves": [ + "10680479558906552097920083", + "85752761210669528539568098", + "30239033572611328073015225" + ], + "mAssetSupply": "126083728424745699563763938" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "8430256234126372765696", + "expectedQty": "8298438604813632531975", + "reserves": [ + "10680479558906552097920083", + "85761191466903654912333794", + "30239033572611328073015225" + ] + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "132181896477704355840", + "expectedQty": "124707158243555600123", + "swapFee": "79309137886622613", + "reserves": [ + "10680354851748308542319960", + "85761191466903654912333794", + "30239033572611328073015225" + ], + "mAssetSupply": "126091894760763173378562686" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "592202777031522419474432", + "expectedQty": "582898079202669756927538", + "reserves": [ + "10680354851748308542319960", + "86353394243935177331808226", + "30239033572611328073015225" + ] + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "927038873196484567760896", + "expectedQty": "978304542275025567260528", + "reserves": [ + "11607393724944793110080856", + "86353394243935177331808226", + "30239033572611328073015225" + ] + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "3069446829285738886987776", + "outputIndex": 0, + "expectedQty": "2880514130718401853715447", + "swapFee": "1847522727194957624914", + "reserves": [ + "8726879594226391256365409", + "86353394243935177331808226", + "33308480401897066960003001" + ], + "mAssetSupply": "127654944904968063660375666", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "23963772338484948", + "expectedQty": "21960735640405481", + "swapFee": "14378263403090", + "reserves": [ + "8726879572265655615959928", + "86353394243935177331808226", + "33308480401897066960003001" + ], + "mAssetSupply": "127654944881018669585293808" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "305524442318798592", + "1707264107173334272", + "1268839686259720704" + ], + "expectedQty": "3279961819723699475", + "swapFee": "1969158586986411", + "reserves": [ + "8726879266741213297161336", + "86353392536671070158473954", + "33308479133057380700282297" + ], + "mAssetSupply": "127654941601056849861594333" + }, + { + "type": "mintMulti", + "inputQtys": [ + "401266012402654193385472", + "55384637534531559096320", + "316747089437803543527424" + ], + "expectedQty": "807632465483435772822356", + "reserves": [ + "9128145279143867490546808", + "86408777174205601717570274", + "33625226222495184243809721" + ], + "mAssetSupply": "128462574066540285634416689" + }, + { + "type": "redeemMasset", + "inputQty": "69545980205108564066304", + "expectedQtys": [ + "4940235455820012680918", + "46765218084927187048946", + "18198279027601067931390" + ], + "redemptionFee": "20863794061532569219", + "reserves": [ + "9123205043688047477865890", + "86362011956120674530521328", + "33607027943467583175878331" + ], + "mAssetSupply": "128393048950129238602919604" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "37221524521853", + "1285742849078123", + "819055613416323" + ], + "expectedQty": "2123817879341336", + "swapFee": "1275055761061", + "reserves": [ + "9123205043650825953344037", + "86362011954834931681443205", + "33607027942648527562462008" + ], + "mAssetSupply": "128393048948005420723578268" + }, + { + "type": "mintMulti", + "inputQtys": [ + "197270353239355603025920", + "328945483174941338632192", + "240875189675033578438656" + ], + "expectedQty": "777848818514418458199643", + "reserves": [ + "9320475396890181556369957", + "86690957438009873020075397", + "33847903132323561140900664" + ], + "mAssetSupply": "129170897766519839181777911" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "54016692404312155881472", + "expectedQty": "54921156381384751419391", + "swapFee": "32410015442587293528", + "reserves": [ + "9320475396890181556369957", + "86636036281628488268656006", + "33847903132323561140900664" + ], + "mAssetSupply": "129116913484130969613189967" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "1065814169597048795430912", + "expectedQty": "977707195460325814595701", + "swapFee": "639488501758229277258", + "reserves": [ + "8342768201429855741774256", + "86636036281628488268656006", + "33847903132323561140900664" + ], + "mAssetSupply": "128051738803035679047036313" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "93775630020467023151104", + "expectedQty": "95521132711899881285269", + "swapFee": "56265378012280213890", + "reserves": [ + "8342768201429855741774256", + "86540515148916588387370737", + "33847903132323561140900664" + ], + "mAssetSupply": "127958019438393224304099099" + }, + { + "type": "mintMulti", + "inputQtys": [ + "495746200962250045390848", + "200873918265675623694336", + "209192361181110993944576" + ], + "expectedQty": "949058154349615074144778", + "reserves": [ + "8838514402392105787165104", + "86741389067182264011065073", + "34057095493504672134845240" + ], + "mAssetSupply": "128907077592742839378243877" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "215512003915789795328", + "expectedQty": "234766711730445804222", + "reserves": [ + "8838729914396021576960432", + "86741389067182264011065073", + "34057095493504672134845240" + ] + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "1552942225886132043776", + "expectedQty": "1554392691647264802869", + "reserves": [ + "8838729914396021576960432", + "86741389067182264011065073", + "34058648435730558266889016" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "15916647331527466680320", + "14347351859815075807232", + "16193746578417827971072" + ], + "expectedQty": "47636251154406577944195", + "reserves": [ + "8854646561727549043640752", + "86755736419042079086872305", + "34074842182308976094860088" + ], + "mAssetSupply": "128956503003300623666795163" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "1085369804174807", + "outputIndex": 2, + "expectedQty": "1180223762343303", + "swapFee": "709220200874", + "reserves": [ + "8854646562812918847815559", + "86755736419042079086872305", + "34074842181128752332516785" + ], + "mAssetSupply": "128956503003301332886996037", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mintMulti", + "inputQtys": [ + "346603043245761750892544", + "225254653650335422218240", + "376074508478029058015232" + ], + "expectedQty": "974144562317892551682354", + "reserves": [ + "9201249606058680598708103", + "86980991072692414509090545", + "34450916689606781390532017" + ], + "mAssetSupply": "129930647565619225438678391" + }, + { + "type": "redeemMasset", + "inputQty": "278720590260309657", + "expectedQtys": [ + "19732129378651099", + "186531204218123819", + "73880176545241756" + ], + "redemptionFee": "83616177078092", + "reserves": [ + "9201249586326551220057004", + "86980990886161210290966726", + "34450916615726604845290261" + ], + "mAssetSupply": "129930647286982251355446826" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "162839298593041785290752", + "expectedQty": "162590023955439082823099", + "swapFee": "97703579155825071174", + "reserves": [ + "9201249586326551220057004", + "86980990886161210290966726", + "34288326591771165762467162" + ], + "mAssetSupply": "129767905691968365395227248" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "9993185265649903992832", + "expectedQty": "9820765815875792450687", + "reserves": [ + "9201249586326551220057004", + "86990984071426860194959558", + "34288326591771165762467162" + ] + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "323394826138240221184", + "expectedQty": "350260057661664452179", + "reserves": [ + "9201572981152689460278188", + "86990984071426860194959558", + "34288326591771165762467162" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "8756511848406011871232", + "5685682686519226138624", + "19124709770255566635008" + ], + "expectedQty": "34215683263873940902294", + "swapFee": "20541734999323958916", + "reserves": [ + "9192816469304283448406956", + "86985298388740340968820934", + "34269201882000910195832154" + ], + "mAssetSupply": "129743861034578028911227820" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "15374375619199082954752", + "22547290373684996341760", + "20781081288264088813568" + ], + "expectedQty": "59614712432828350191980", + "swapFee": "35790301640681418966", + "reserves": [ + "9177442093685084365452204", + "86962751098366655972479174", + "34248420800712646107018586" + ], + "mAssetSupply": "129684246322145200561035840" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "50798443262956336578560", + "outputIndex": 0, + "expectedQty": "46026191274325173864170", + "swapFee": "29951664924687456810", + "reserves": [ + "9131415902410759191588034", + "87013549541629612309057734", + "34248420800712646107018586" + ], + "mAssetSupply": "129684276273810125248492650", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemMasset", + "inputQty": "179950707689965056", + "expectedQtys": [ + "12667008211201385", + "120704319933408338", + "47509064545923761" + ], + "redemptionFee": "53985212306989", + "reserves": [ + "9131415889743750980386649", + "87013549420925292375649396", + "34248420753203581561094825" + ], + "mAssetSupply": "129684276093913402770834583" + }, + { + "type": "redeemMasset", + "inputQty": "58265084989964509039820", + "expectedQtys": [ + "4101369310899265072491", + "39082077252470236109294", + "15382655167609111326312" + ], + "redemptionFee": "17479525496989352711", + "reserves": [ + "9127314520432851715314158", + "86974467343672822139540102", + "34233038098035972449768513" + ], + "mAssetSupply": "129626028488448935251147474" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "579701089905952423936", + "outputIndex": 1, + "expectedQty": "590189209272347653318", + "swapFee": "348164270216724553", + "reserves": [ + "9127314520432851715314158", + "86973877154463549791886784", + "34233617799125878402192449" + ], + "mAssetSupply": "129626028836613205467872027", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemMasset", + "inputQty": "7597159851817977040076", + "expectedQtys": [ + "534775812785981089017", + "5095860972283068074167", + "2005771877604144281617" + ], + "redemptionFee": "2279147955545393112", + "reserves": [ + "9126779744620065734225141", + "86968781293491266723812617", + "34231612027248274257910832" + ], + "mAssetSupply": "129618433955909343036225063" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "1279789964228964638523392", + "312070044409571731046400", + "534243380797788223700992" + ], + "expectedQty": "2245347855195008817613118", + "swapFee": "1348017523631184000968", + "reserves": [ + "7846989780391101095701749", + "86656711249081694992766217", + "33697368646450486034209840" + ], + "mAssetSupply": "127373086100714334218611945" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "1957259677416618983424", + "expectedQty": "1758381619789477139414", + "swapFee": "1174355806449971390", + "reserves": [ + "7845231398771311618562335", + "86656711249081694992766217", + "33697368646450486034209840" + ], + "mAssetSupply": "127371130015392724049599911" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "8372848326264217386614784", + "expectedQty": "8831750305108134971706163", + "reserves": [ + "16218079725035529005177119", + "86656711249081694992766217", + "33697368646450486034209840" + ] + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "4929567380389572378624", + "expectedQty": "4799793577243802758275", + "swapFee": "2957740428233743427", + "reserves": [ + "16213279931458285202418844", + "86656711249081694992766217", + "33697368646450486034209840" + ], + "mAssetSupply": "136197953710860897682670877" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "264969249485867876352", + "261979143078200803328", + "61553872373373378560" + ], + "expectedQty": "592974071882802693551", + "swapFee": "355998041954854528", + "reserves": [ + "16213014962208799334542492", + "86656449269938616791962889", + "33697307092578112660831280" + ], + "mAssetSupply": "136197360736789014879977326" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "4909206454350509384925184", + "expectedQty": "4918443881826951449627193", + "reserves": [ + "16213014962208799334542492", + "86656449269938616791962889", + "38606513546928622045756464" + ] + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "383776018684646132809728", + "expectedQty": "387284336224903310457268", + "swapFee": "230265611210787679685", + "reserves": [ + "16213014962208799334542492", + "86269164933713713481505621", + "38606513546928622045756464" + ], + "mAssetSupply": "140732258865542530984474476" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "1990411640745292294258688", + "expectedQty": "1991494292739881708407495", + "reserves": [ + "16213014962208799334542492", + "86269164933713713481505621", + "40596925187673914340015152" + ] + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "116738322671690285056", + "expectedQty": "113537606067022294871", + "swapFee": "70042993603014171", + "reserves": [ + "16212901424602732312247621", + "86269164933713713481505621", + "40596925187673914340015152" + ], + "mAssetSupply": "142723636490002734605611086" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "297672263270942834688", + "outputIndex": 1, + "expectedQty": "308599197603130611555", + "swapFee": "183528090753144432", + "reserves": [ + "16213199096866003255082309", + "86268856334516110350894066", + "40596925187673914340015152" + ], + "mAssetSupply": "142723636673530825358755518", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "1747699755136283047886848", + "expectedQty": "1694409684726357256439893", + "swapFee": "1048619853081769828732", + "reserves": [ + "14518789412139645998642416", + "86268856334516110350894066", + "40596925187673914340015152" + ], + "mAssetSupply": "140976985538247624080697402" + }, + { + "type": "redeemMasset", + "inputQty": "118817489297807276769280", + "expectedQtys": [ + "12232979540440374807675", + "72686855946469814128938", + "34205424510831583013396" + ], + "redemptionFee": "35645246789342183030", + "reserves": [ + "14506556432599205623834741", + "86196169478569640536765128", + "40562719763163082757001756" + ], + "mAssetSupply": "140858203694196606146111152" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "290159767062734635008", + "expectedQty": "290099439595764826755", + "reserves": [ + "14506556432599205623834741", + "86196169478569640536765128", + "40563009922930145491636764" + ] + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "628377237363357515776", + "expectedQty": "628246495744053731424", + "reserves": [ + "14506556432599205623834741", + "86196169478569640536765128", + "40563638300167508849152540" + ] + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "1047909654837500800", + "expectedQty": "1084022412885688855", + "reserves": [ + "14506557480508860461335541", + "86196169478569640536765128", + "40563638300167508849152540" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "194419664339462659244032", + "206066926017133085196288", + "257771155889963378147328" + ], + "expectedQty": "662698300490561695470514", + "reserves": [ + "14700977144848323120579573", + "86402236404586773621961416", + "40821409456057472227299868" + ], + "mAssetSupply": "141521821424644920545828700" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "3991780959541847392256", + "expectedQty": "3990246689864550988024", + "swapFee": "2395068575725108435", + "reserves": [ + "14700977144848323120579573", + "86402236404586773621961416", + "40817419209367607676311844" + ], + "mAssetSupply": "141517832038753954423544879" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "355152409664581468160", + "outputIndex": 0, + "expectedQty": "343275207083811438492", + "swapFee": "213045601846047223", + "reserves": [ + "14700633869641239309141081", + "86402236404586773621961416", + "40817774361777272257780004" + ], + "mAssetSupply": "141517832251799556269592102", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mintMulti", + "inputQtys": [ + "269830186781402038272", + "81989177579725733888", + "520912764160433520640" + ], + "expectedQty": "880883742292790799086", + "reserves": [ + "14700903699828020711179353", + "86402318393764353347695304", + "40818295274541432691300644" + ], + "mAssetSupply": "141518713135541849060391188" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "29231953479379024084992", + "15957895267833631211520", + "20349555844062979817472" + ], + "expectedQty": "66358917038920748245280", + "swapFee": "39839253775617819638", + "reserves": [ + "14671671746348641687094361", + "86386360498496519716483784", + "40797945718697369711483172" + ], + "mAssetSupply": "141452354218502928312145908" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "9306687441382176768", + "expectedQty": "9398114977445841325", + "swapFee": "5584012464829306", + "reserves": [ + "14671671746348641687094361", + "86386351100381542270642459", + "40797945718697369711483172" + ], + "mAssetSupply": "141452344917399499394798446" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "411550995069235758104576", + "expectedQty": "415579878036337639882799", + "swapFee": "246930597041541454862", + "reserves": [ + "14671671746348641687094361", + "85970771222345204630759660", + "40797945718697369711483172" + ], + "mAssetSupply": "141041040852927305178148732" + }, + { + "type": "mintMulti", + "inputQtys": [ + "17162536288493737345024", + "26140177337919912017920", + "5928379401973981511680" + ], + "expectedQty": "49537769151304104868977", + "reserves": [ + "14688834282637135424439385", + "85996911399683124542777580", + "40803874098099343692994852" + ], + "mAssetSupply": "141090578622078609283017709" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "1573523926396994060288", + "outputIndex": 2, + "expectedQty": "1556863898721418234149", + "swapFee": "934439402578354436", + "reserves": [ + "14688834282637135424439385", + "85998484923609521536837868", + "40802317234200622274760703" + ], + "mAssetSupply": "141090579556518011861372145", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemBassets", + "inputQtys": [ + "343086702284790144", + "263426729931753440", + "573434149809014208" + ], + "expectedQty": "1188609180699327681", + "swapFee": "713593664618367", + "reserves": [ + "14688833939550433139649241", + "85998484660182791605084428", + "40802316660766472465746495" + ], + "mAssetSupply": "141090578367908831162044464" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "1234605002852426579968", + "484104213024072204288", + "1851698306212479893504" + ], + "expectedQty": "3606387140520800350308", + "swapFee": "2165131363130358425", + "reserves": [ + "14687599334547580713069273", + "85998000555969767532880140", + "40800464962460259985852991" + ], + "mAssetSupply": "141086971980768310361694156" + }, + { + "type": "mintMulti", + "inputQtys": [ + "2751602565258014713970688", + "1091108738296716233539584", + "3418822555722114568028160" + ], + "expectedQty": "7329600132210428073039526", + "reserves": [ + "17439201899805595427039961", + "87089109294266483766419724", + "44219287518182374553881151" + ], + "mAssetSupply": "148416572112978738434733682" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "12853911850406785024", + "outputIndex": 2, + "expectedQty": "12741661894669139522", + "swapFee": "7646236100027042", + "reserves": [ + "17439201899805595427039961", + "87089122148178334173204748", + "44219274776520479884741629" + ], + "mAssetSupply": "148416572120624974534760724", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mintMulti", + "inputQtys": [ + "1704913727059107535388672", + "377013229915603220824064", + "802167554070161225940992" + ], + "expectedQty": "2919668094863296820698068", + "reserves": [ + "19144115626864702962428633", + "87466135378093937394028812", + "45021442330590641110682621" + ], + "mAssetSupply": "151336240215488271355458792" + }, + { + "type": "redeemMasset", + "inputQty": "991478870999053631488", + "expectedQtys": [ + "125384982639556544189", + "572862182807840881977", + "294869341319027889131" + ], + "redemptionFee": "297443661299716089", + "reserves": [ + "19143990241882063405884444", + "87465562515911129553146835", + "45021147461249322082793490" + ], + "mAssetSupply": "151335249034060933601543393" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "90500637757275606351872", + "outputIndex": 1, + "expectedQty": "91136380853854723439585", + "swapFee": "54286830248205265423", + "reserves": [ + "19143990241882063405884444", + "87374426135057274829707250", + "45111648099006597689145362" + ], + "mAssetSupply": "151335303320891181806808816", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "3206543417690603424579584", + "expectedQty": "3180844421578327172001674", + "reserves": [ + "19143990241882063405884444", + "90580969552747878254286834", + "45111648099006597689145362" + ] + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "1234278921119332040704", + "expectedQty": "1224137644774981863507", + "reserves": [ + "19143990241882063405884444", + "90582203831668997586327538", + "45111648099006597689145362" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "2599008521633190964625408", + "1572110493123164399206400", + "921732702151414644736000" + ], + "expectedQty": "5132195688923505756887065", + "reserves": [ + "21742998763515254370509852", + "92154314324792161985533938", + "46033380801158012333881362" + ], + "mAssetSupply": "159649567569037789717561062" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "3266220625172738890268672", + "expectedQty": "3241439971824853013409376", + "reserves": [ + "21742998763515254370509852", + "95420534949964900875802610", + "46033380801158012333881362" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "1780991984833436057600", + "1471966063879345143808", + "1385316371383609458688" + ], + "expectedQty": "4661061699381593471937", + "swapFee": "2798316009234496781", + "reserves": [ + "21741217771530420934452252", + "95419062983901021530658802", + "46031995484786628724422674" + ], + "mAssetSupply": "162886346479163261137498501" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "2704168807480234229104640", + "expectedQty": "2704982341331368759550830", + "reserves": [ + "21741217771530420934452252", + "95419062983901021530658802", + "48736164292266862953527314" + ] + }, + { + "type": "redeemMasset", + "inputQty": "1079327205361228080742", + "expectedQtys": [ + "141667128461661526704", + "621756554553849584260", + "317567880515057209910" + ], + "redemptionFee": "323798161608368424", + "reserves": [ + "21741076104401959272925548", + "95418441227346467681074542", + "48735846724386347896317404" + ], + "mAssetSupply": "165590249817087430277337013" + }, + { + "type": "mintMulti", + "inputQtys": [ + "3787082764027548401664", + "4884455822274599059456", + "15297801169092126703616" + ], + "expectedQty": "24004945361686764083447", + "reserves": [ + "21744863187165986821327212", + "95423325683168742280133998", + "48751144525555440023021020" + ], + "mAssetSupply": "165614254762449117041420460" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "135352417642701905723392", + "outputIndex": 0, + "expectedQty": "131698682971169121196667", + "swapFee": "80596487011549227202", + "reserves": [ + "21613164504194817700130545", + "95558678100811444185857390", + "48751144525555440023021020" + ], + "mAssetSupply": "165614335358936128590647662", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mintMulti", + "inputQtys": [ + "635518009112082432", + "4505533591474152448", + "2481979377171830272" + ], + "expectedQty": "7601007060302796603", + "reserves": [ + "21613165139712826812212977", + "95558682606345035660009838", + "48751147007534817194851292" + ], + "mAssetSupply": "165614342959943188893444265" + }, + { + "type": "redeemMasset", + "inputQty": "203921631466614842982", + "expectedQtys": [ + "26604396697358266755", + "117626506043988515783", + "60009482463840543918" + ], + "redemptionFee": "61176489439984452", + "reserves": [ + "21613138535316129453946222", + "95558564979838991671494055", + "48751086998052353354307374" + ], + "mAssetSupply": "165614139099488211718585735" + }, + { + "type": "mintMulti", + "inputQtys": [ + "427650032598380990955520", + "108053025219540380811264", + "169972413516343626694656" + ], + "expectedQty": "713032950665533425095053", + "reserves": [ + "22040788567914510444901742", + "95666618005058532052305319", + "48921059411568696981002030" + ], + "mAssetSupply": "166327172050153745143680788" + }, + { + "type": "mintMulti", + "inputQtys": [ + "53186236117653480", + "62157369293529784", + "241564957585598848" + ], + "expectedQty": "357446862867612539", + "reserves": [ + "22040788621100746562555222", + "95666618067215901345835103", + "48921059653133654566600878" + ], + "mAssetSupply": "166327172407600608011293327" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "20800145431656992768", + "11229947696610136064", + "39834909483186601984" + ], + "expectedQty": "72172116449924528254", + "swapFee": "43329267430412964", + "reserves": [ + "22040767820955314905562454", + "95666606837268204735699039", + "48921019818224171379998894" + ], + "mAssetSupply": "166327100235484158086765073" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "811024948313032964964352", + "expectedQty": "816612830792941578500317", + "swapFee": "486614968987819778978", + "reserves": [ + "22040767820955314905562454", + "94849994006475263157198722", + "48921019818224171379998894" + ], + "mAssetSupply": "165516561902140112941579699" + }, + { + "type": "redeemMasset", + "inputQty": "1801503488201251513958", + "expectedQtys": [ + "239822575456347878142", + "1032049791977987690692", + "532302915309646385493" + ], + "redemptionFee": "540451046460375454", + "reserves": [ + "22040527998379858557684312", + "94848961956683285169508030", + "48920487515308861733613401" + ], + "mAssetSupply": "165514760939102958150441195" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "22978170277065901735936", + "outputIndex": 2, + "expectedQty": "22795257923820080564112", + "swapFee": "13684948987826833758", + "reserves": [ + "22040527998379858557684312", + "94871940126960351071243966", + "48897692257385041653049289" + ], + "mAssetSupply": "165514774624051945977274953", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "8162743404027300864", + "expectedQty": "8009638370601442537", + "swapFee": "4897646042416380", + "reserves": [ + "22040519988741487956241775", + "94871940126960351071243966", + "48897692257385041653049289" + ], + "mAssetSupply": "165514766466206187992390469" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "5229107176121178259456", + "expectedQty": "5264917022657308223772", + "swapFee": "3137464305672706955", + "reserves": [ + "22040519988741487956241775", + "94866675209937693763020194", + "48897692257385041653049289" + ], + "mAssetSupply": "165509540496494372486837968" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "5600568237869139968", + "expectedQty": "5559139563424904316", + "reserves": [ + "22040519988741487956241775", + "94866680810505931632160162", + "48897692257385041653049289" + ] + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "6989242152156293180162048", + "expectedQty": "6984299384069525303122523", + "reserves": [ + "22040519988741487956241775", + "94866680810505931632160162", + "55886934409541334833211337" + ] + }, + { + "type": "redeemMasset", + "inputQty": "21702348571672133632", + "expectedQtys": [ + "2772200636859707974", + "11932090218106866928", + "7029316696766086408" + ], + "redemptionFee": "6510704571501640", + "reserves": [ + "22040517216540851096533801", + "94866668878415713525293234", + "55886927380224638067124929" + ], + "mAssetSupply": "172493823743865594114232815" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "2087081361067607131684864", + "expectedQty": "2041280384601800121923241", + "swapFee": "1252248816640564279010", + "reserves": [ + "19999236831939050974610560", + "94866668878415713525293234", + "55886927380224638067124929" + ], + "mAssetSupply": "170407994631614627546826961" + }, + { + "type": "redeemMasset", + "inputQty": "170081489049766513868", + "expectedQtys": [ + "19954929565318590043", + "94656496719012198237", + "55763112806056516254" + ], + "redemptionFee": "51024446714929954", + "reserves": [ + "19999216877009485656020517", + "94866574221918994513094997", + "55886871617111832010608675" + ], + "mAssetSupply": "170407824601150024495243047" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "573834235728505740460032", + "expectedQty": "587266028897764890880437", + "reserves": [ + "20573051112737991396480549", + "94866574221918994513094997", + "55886871617111832010608675" + ] + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "611837746597915656192", + "expectedQty": "597871691176203260293", + "swapFee": "367102647958749393", + "reserves": [ + "20572453241046815193220256", + "94866574221918994513094997", + "55886871617111832010608675" + ], + "mAssetSupply": "170994479159403839429216685" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "22340106724945189404672", + "7685302561692116320256", + "24437171696670303322112" + ], + "expectedQty": "54873935913817030859654", + "swapFee": "32944128025105281684", + "reserves": [ + "20550113134321870003815584", + "94858888919357302396774741", + "55862434445415161707286563" + ], + "mAssetSupply": "170939605223490022398357031" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "441589875258955328", + "outputIndex": 2, + "expectedQty": "452119771157462963", + "swapFee": "270991806122186", + "reserves": [ + "20550113575911745262770912", + "94858888919357302396774741", + "55862433993295390549823600" + ], + "mAssetSupply": "170939605223761014204479217", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "794981483131987", + "expectedQty": "776802396492239", + "swapFee": "476988889879", + "reserves": [ + "20550113575134942866278673", + "94858888919357302396774741", + "55862433993295390549823600" + ], + "mAssetSupply": "170939605222966509710237109" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "1241864690862543951888384", + "outputIndex": 1, + "expectedQty": "1276683808667768008081648", + "swapFee": "761115107530924664658", + "reserves": [ + "21791978265997486818167057", + "93582205110689534388693093", + "55862433993295390549823600" + ], + "mAssetSupply": "170940366338074040634901767", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "65615668250556902670336", + "expectedQty": "64298320463419238756089", + "swapFee": "39369400950334141602", + "reserves": [ + "21727679945534067579410968", + "93582205110689534388693093", + "55862433993295390549823600" + ], + "mAssetSupply": "170874790039224434066373033" + }, + { + "type": "redeemMasset", + "inputQty": "29447584958981694344396", + "expectedQtys": [ + "3743300885405629738094", + "16122584285445430369148", + "9624124579900067699716" + ], + "redemptionFee": "8834275487694508303", + "reserves": [ + "21723936644648661949672874", + "93566082526404088958323945", + "55852809868715490482123884" + ], + "mAssetSupply": "170845351288540940066536940" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "169509279970166946398208", + "outputIndex": 1, + "expectedQty": "173954641287648432934595", + "swapFee": "103717110030036099675", + "reserves": [ + "21893445924618828896071082", + "93392127885116440525389350", + "55852809868715490482123884" + ], + "mAssetSupply": "170845455005650970102636615", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "44839183743914866638848", + "expectedQty": "45122131369254183102897", + "swapFee": "26903510246348919983", + "reserves": [ + "21893445924618828896071082", + "93347005753747186342286453", + "55852809868715490482123884" + ], + "mAssetSupply": "170800642725417301584917750" + }, + { + "type": "mintMulti", + "inputQtys": [ + "535605891280800690733056", + "2227034999810395236990976", + "677139000590403914170368" + ], + "expectedQty": "3433960160455148123840457", + "reserves": [ + "22429051815899629586804138", + "95574040753557581579277429", + "56529948869305894396294252" + ], + "mAssetSupply": "174234602885872449708758207" + }, + { + "type": "mintMulti", + "inputQtys": [ + "47664298057420070912", + "1104881666797260898304", + "72025500111564742656" + ], + "expectedQty": "1217784491002631152133", + "reserves": [ + "22429099480197687006875050", + "95575145635224378840175733", + "56530020894806005961036908" + ], + "mAssetSupply": "174235820670363452339910340" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "442497635317412817534976", + "expectedQty": "445291739016247682741170", + "swapFee": "265498581190447690520", + "reserves": [ + "22429099480197687006875050", + "95129853896208131157434563", + "56530020894806005961036908" + ], + "mAssetSupply": "173793588533627229970065884" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "158579834599945248178176", + "expectedQty": "159576240494791862979247", + "swapFee": "95147900759967148906", + "reserves": [ + "22429099480197687006875050", + "94970277655713339294455316", + "56530020894806005961036908" + ], + "mAssetSupply": "173635103846928044689036614" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "4716939385584363757371392", + "expectedQty": "4791382354888112638230686", + "reserves": [ + "27146038865782050764246442", + "94970277655713339294455316", + "56530020894806005961036908" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "172935781744880081960960", + "1098506220163770047528960", + "7819100540197655281664" + ], + "expectedQty": "1275252755081741242618118", + "reserves": [ + "27318974647526930846207402", + "96068783875877109341984276", + "56537839995346203616318572" + ], + "mAssetSupply": "179701738956897898569885418" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "39565104314407381368832", + "expectedQty": "39561854419956236455844", + "swapFee": "23739062588644428821", + "reserves": [ + "27318974647526930846207402", + "96068783875877109341984276", + "56498278140926247379862728" + ], + "mAssetSupply": "179662197591646079832945407" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "5733311847247459123200", + "expectedQty": "5732821437290032420687", + "swapFee": "3439987108348475473", + "reserves": [ + "27318974647526930846207402", + "96068783875877109341984276", + "56492545319488957347442041" + ], + "mAssetSupply": "179656467719785940722297680" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "407918507559033847676928", + "expectedQty": "402371948006329317371194", + "swapFee": "244751104535420308606", + "reserves": [ + "26916602699520601528836208", + "96068783875877109341984276", + "56492545319488957347442041" + ], + "mAssetSupply": "179248793963331442294929358" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "1073851564924047065088", + "440920252860991602688", + "596619152433594236928" + ], + "expectedQty": "2122867390924955682442", + "swapFee": "1274485125630351620", + "reserves": [ + "26915528847955677481771120", + "96068342955624248350381588", + "56491948700336523753205113" + ], + "mAssetSupply": "179246671095940517339246916" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "26567065442365853696", + "outputIndex": 0, + "expectedQty": "26048432434508465200", + "swapFee": "15847772794968411", + "reserves": [ + "26915502799523242973305920", + "96068369522689690716235284", + "56491948700336523753205113" + ], + "mAssetSupply": "179246671111788290134215327", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemMasset", + "inputQty": "140144831520152", + "expectedQtys": [ + "21037696048401", + "75088961664121", + "44155238517805" + ], + "redemptionFee": "42043449456", + "reserves": [ + "26915502799502205277257519", + "96068369522614601754571163", + "56491948700292368514687308" + ], + "mAssetSupply": "179246671111648187346144631" + }, + { + "type": "mintMulti", + "inputQtys": [ + "1038632313647749882970112", + "1009103725059759033810944", + "3667779392051913351495680" + ], + "expectedQty": "5720823020578459491203974", + "reserves": [ + "27954135113149955160227631", + "97077473247674360788382107", + "60159728092344281866182988" + ], + "mAssetSupply": "184967494132226646837348605" + }, + { + "type": "redeemMasset", + "inputQty": "8077639066149516738560", + "expectedQtys": [ + "1220407260666441957471", + "4238158423398421512601", + "2626422483344102499956" + ], + "redemptionFee": "2423291719844855021", + "reserves": [ + "27952914705889288718270160", + "97073235089250962366869506", + "60157101669860937763683032" + ], + "mAssetSupply": "184959418916452217165465066" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "212346241722409698721792", + "expectedQty": "212151943837703588891977", + "reserves": [ + "27952914705889288718270160", + "97073235089250962366869506", + "60369447911583347462404824" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "7293331204050131968", + "20087352350885867520", + "1122635393254505472" + ], + "expectedQty": "28487250021236865773", + "swapFee": "17102611579689933", + "reserves": [ + "27952907412558084668138192", + "97073215001898611481001986", + "60369446788947954207899352" + ], + "mAssetSupply": "185171542373039899517491270" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "629321368234027519049728", + "expectedQty": "625847322057063245126800", + "reserves": [ + "27952907412558084668138192", + "97702536370132639000051714", + "60369446788947954207899352" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "109085342017406839554048", + "65624147769868721061888", + "178179494367392555859968" + ], + "expectedQty": "353800222533840606450245", + "reserves": [ + "28061992754575491507692240", + "97768160517902507721113602", + "60547626283315346763759320" + ], + "mAssetSupply": "186151189917630803369068315" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "2219732978346889926672384", + "expectedQty": "2246610611526781546336724", + "reserves": [ + "30281725732922381434364624", + "97768160517902507721113602", + "60547626283315346763759320" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "717077350047111184384", + "1320802083836183552", + "780177189270356492288" + ], + "expectedQty": "1506086400223208474717", + "reserves": [ + "30282442810272428545549008", + "97768161838704591557297154", + "60548406460504617120251608" + ], + "mAssetSupply": "188399306615557808123879756" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "20238087426275064938496", + "expectedQty": "20238547987142720540185", + "swapFee": "12142852455765038963", + "reserves": [ + "30282442810272428545549008", + "97768161838704591557297154", + "60528167912517474399711423" + ], + "mAssetSupply": "188379080670983988823980223" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "1561680557486313457057792", + "expectedQty": "1560553640499068860083142", + "reserves": [ + "30282442810272428545549008", + "97768161838704591557297154", + "62089848470003787856769215" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "138137144308974588264448", + "306751727583460144971776", + "73979018387442079105024" + ], + "expectedQty": "518824088029576541541430", + "reserves": [ + "30420579954581403133813456", + "98074913566288051702268930", + "62163827488391229935874239" + ], + "mAssetSupply": "190458458399512634225604795" + }, + { + "type": "redeemMasset", + "inputQty": "514699962041697736589312", + "expectedQtys": [ + "82184714913901458010401", + "264960721448606642808625", + "167942769260747463170681" + ], + "redemptionFee": "154409988612509320976", + "reserves": [ + "30338395239667501675803055", + "97809952844839445059460305", + "61995884719130482472703558" + ], + "mAssetSupply": "189943912847459548998336459" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "140441551218084027564032", + "197125096518341493784576", + "153679925569854027857920" + ], + "expectedQty": "491718252202903478223604", + "swapFee": "295208076167442552465", + "reserves": [ + "30197953688449417648239023", + "97612827748321103565675729", + "61842204793560628444845638" + ], + "mAssetSupply": "189452194595256645520112855" + }, + { + "type": "redeemMasset", + "inputQty": "9966147608635474391859", + "expectedQtys": [ + "1588089160969669176507", + "5133390007747503338262", + "3252238086605364769419" + ], + "redemptionFee": "2989844282590642317", + "reserves": [ + "30196365599288447979062516", + "97607694358313356062337467", + "61838952555474023080076219" + ], + "mAssetSupply": "189442231437492292636363313" + }, + { + "type": "redeemMasset", + "inputQty": "2166818578309266276352", + "expectedQtys": [ + "345278961654050403195", + "1116090717827264144314", + "707094675282090638380" + ], + "redemptionFee": "650045573492779882", + "reserves": [ + "30196020320326793928659321", + "97606578267595528798193153", + "61838245460798740989437839" + ], + "mAssetSupply": "189440065268959556862866843" + }, + { + "type": "mintMulti", + "inputQtys": [ + "246030338037583085305856", + "259003978088997621596160", + "389917096542800101507072" + ], + "expectedQty": "896111731266502413549471", + "reserves": [ + "30442050658364377013965177", + "97865582245684526419789313", + "62228162557341541090944911" + ], + "mAssetSupply": "190336177000226059276416314" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "33712972039560", + "expectedQty": "33720193138511", + "swapFee": "20227783223", + "reserves": [ + "30442050658364377013965177", + "97865582245684526419789313", + "62228162557307820897806400" + ], + "mAssetSupply": "190336177000192366532159977" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "5778151802565911", + "expectedQty": "5749126277896281", + "reserves": [ + "30442050658364377013965177", + "97865582251462678222355224", + "62228162557307820897806400" + ] + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "196623013121176077598720", + "outputIndex": 1, + "expectedQty": "197330828790039289584169", + "swapFee": "117876340120817037022", + "reserves": [ + "30442050658364377013965177", + "97668251422672638932771055", + "62424785570428996975405120" + ], + "mAssetSupply": "190336294882281613627093280", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemBassets", + "inputQtys": [ + "19849171717447898628096", + "30777332255547413495808", + "49167428063882626727936" + ], + "expectedQty": "99821726641706954354052", + "swapFee": "59928993381052804295", + "reserves": [ + "30422201486646929115337081", + "97637474090417091519275247", + "62375618142365114348677184" + ], + "mAssetSupply": "190236473155639906672739228" + }, + { + "type": "redeemMasset", + "inputQty": "3013605192590535475", + "expectedQtys": [ + "481784584725236821", + "1546246741180772556", + "987818429145889852" + ], + "redemptionFee": "904081557777160", + "reserves": [ + "30422201004862344390100260", + "97637472544170350338502691", + "62375617154546685202787332" + ], + "mAssetSupply": "190236470142938795639980913" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "189988366693800738816", + "expectedQty": "192125872291069627940", + "reserves": [ + "30422390993229038190839076", + "97637472544170350338502691", + "62375617154546685202787332" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "41372696255796246216704", + "17748321118593346437120", + "36997089997793951481856" + ], + "expectedQty": "96463127449689626403215", + "reserves": [ + "30463763689484834437055780", + "97655220865288943684939811", + "62412614244544479154269188" + ], + "mAssetSupply": "190333125396260776336012068" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "4700912155914775035904", + "expectedQty": "4696949080872928738320", + "reserves": [ + "30463763689484834437055780", + "97655220865288943684939811", + "62417315156700393929305092" + ] + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "98376272496743636008960", + "expectedQty": "98292714039804001655903", + "reserves": [ + "30463763689484834437055780", + "97655220865288943684939811", + "62515691429197137565314052" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "12025029346403066839040", + "5802276817757090611200", + "5774375839882219094016" + ], + "expectedQty": "23702879118572823862561", + "reserves": [ + "30475788718831237503894820", + "97661023142106700775551011", + "62521465805037019784408068" + ], + "mAssetSupply": "190459817938500026090268852" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "4916450231357623582588928", + "expectedQty": "4916146007594788687494824", + "swapFee": "2949870138814574149553", + "reserves": [ + "30475788718831237503894820", + "97661023142106700775551011", + "57605319797442231096913244" + ], + "mAssetSupply": "185546317577281217081829477" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "82897403458503098368", + "expectedQty": "82864706908748610019", + "swapFee": "49738442075101859", + "reserves": [ + "30475788718831237503894820", + "97661023142106700775551011", + "57605236932735322348303225" + ], + "mAssetSupply": "185546234729616200653832968" + }, + { + "type": "mintMulti", + "inputQtys": [ + "101632452893787570176", + "594330911022600552448", + "183072533076222607360" + ], + "expectedQty": "876985963522167429457", + "reserves": [ + "30475890351284131291464996", + "97661617473017723376103459", + "57605420005268398570910585" + ], + "mAssetSupply": "185547111715579722821262425" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "41059984123974446481408", + "expectedQty": "40846124641861394108912", + "reserves": [ + "30475890351284131291464996", + "97702677457141697822584867", + "57605420005268398570910585" + ] + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "2937882320974612", + "outputIndex": 0, + "expectedQty": "2904571028151636", + "swapFee": "1762370392779", + "reserves": [ + "30475890348379560263313360", + "97702677457141697822584867", + "57605420008206280891885197" + ], + "mAssetSupply": "185587957840223346585764116", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "1061840851984352463028224", + "expectedQty": "1061545183728550739081868", + "reserves": [ + "30475890348379560263313360", + "97702677457141697822584867", + "58667260860190633354913421" + ] + }, + { + "type": "redeemMasset", + "inputQty": "80289610119764838", + "expectedQtys": [ + "13105651208746891", + "42015416064196471", + "25228882550009189" + ], + "redemptionFee": "24086883035929", + "reserves": [ + "30475890335273909054566469", + "97702677415126281758388396", + "58667260834961750804904232" + ], + "mAssetSupply": "186649502943686374088117075" + }, + { + "type": "redeemMasset", + "inputQty": "37416624163013781094", + "expectedQtys": [ + "6107505379061690994", + "19580055620916441478", + "11757182716648063670" + ], + "redemptionFee": "11224987248904134", + "reserves": [ + "30475884227768529992875475", + "97702657835070660841946918", + "58667249077779034156840562" + ], + "mAssetSupply": "186649465538287198323240115" + }, + { + "type": "mintMulti", + "inputQtys": [ + "5039624580308877180928", + "27727533246656291012608", + "8922591266571515068416" + ], + "expectedQty": "41597846668719115412011", + "reserves": [ + "30480923852348838870056403", + "97730385368317317132959526", + "58676171669045605671908978" + ], + "mAssetSupply": "186691063384955917438652126" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "2800268362403533312", + "expectedQty": "2785816406278650860", + "reserves": [ + "30480923852348838870056403", + "97730388168585679536492838", + "58676171669045605671908978" + ] + }, + { + "type": "redeemMasset", + "inputQty": "81590747141239027951206", + "expectedQtys": [ + "13317269611546028346959", + "42698900295366563849021", + "25635915816568152059818" + ], + "redemptionFee": "24477224142371708385", + "reserves": [ + "30467606582737292841709444", + "97687689268290312972643817", + "58650535753229037519849160" + ], + "mAssetSupply": "186609499900855227061060165" + }, + { + "type": "mintMulti", + "inputQtys": [ + "1183469610172524789760", + "25586345232553444638720", + "70463572685360176562176" + ], + "expectedQty": "97089042709175915965993", + "reserves": [ + "30468790052347465366499204", + "97713275613522866417282537", + "58720999325914397696411336" + ], + "mAssetSupply": "186706588943564402977026158" + }, + { + "type": "mintMulti", + "inputQtys": [ + "31666215985364642824192", + "436092585185985068793856", + "840386561613326685569024" + ], + "expectedQty": "1305900520396836596359426", + "reserves": [ + "30500456268332830009323396", + "98149368198708851486076393", + "59561385887527724381980360" + ], + "mAssetSupply": "188012489463961239573385584" + }, + { + "type": "redeemMasset", + "inputQty": "26475154290507461427", + "expectedQtys": [ + "4293661749019257954", + "13816848647039548643", + "8384676021039468767" + ], + "redemptionFee": "7942546287152238", + "reserves": [ + "30500451974671080990065442", + "98149354381860204446527750", + "59561377502851703342511593" + ], + "mAssetSupply": "188012462996749495353076395" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "1828334099421866254925824", + "expectedQty": "1827289431872562722706002", + "reserves": [ + "30500451974671080990065442", + "98149354381860204446527750", + "61389711602273569597437417" + ] + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "4950864577049646858240", + "expectedQty": "4951308141498671007873", + "swapFee": "2970518746229788114", + "reserves": [ + "30500451974671080990065442", + "98149354381860204446527750", + "61384760294132070926429544" + ], + "mAssetSupply": "189834804534563754658712271" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "1568146660928370690228224", + "outputIndex": 2, + "expectedQty": "1584416255288378564573845", + "swapFee": "950832490373263966443", + "reserves": [ + "32068598635599451680293666", + "98149354381860204446527750", + "59800344038843692361855699" + ], + "mAssetSupply": "189835755367054127922678714", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemBassets", + "inputQtys": [ + "816309931409262116864", + "64352640666869456896", + "131524764608444104704" + ], + "expectedQty": "1019862339411966186758", + "swapFee": "612284774511886844", + "reserves": [ + "32067782325668042418176802", + "98149290029219537577070854", + "59800212514079083917750995" + ], + "mAssetSupply": "189834735504714715956491956" + }, + { + "type": "redeemMasset", + "inputQty": "6370610819012205772", + "expectedQtys": [ + "1075830896144132159", + "3292776456310371820", + "2006216568556896910" + ], + "redemptionFee": "1911183245703661", + "reserves": [ + "32067781249837146274044643", + "98149286736443081266699034", + "59800210507862515360854085" + ], + "mAssetSupply": "189834729136015080189989845" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "970270741682956140544", + "1044615054226796969984", + "1517788439139422830592" + ], + "expectedQty": "3536649348055620141061", + "swapFee": "2123263566973556218", + "reserves": [ + "32066810979095463317904099", + "98148242121388854469729050", + "59798692719423375938023493" + ], + "mAssetSupply": "189831192486667024569848784" + }, + { + "type": "mintMulti", + "inputQtys": [ + "280494638161437508239360", + "75521854381155168550912", + "1126869062677609570107392" + ], + "expectedQty": "1484863861332849860561482", + "reserves": [ + "32347305617256900826143459", + "98223763975770009638279962", + "60925561782100985508130885" + ], + "mAssetSupply": "191316056347999874430410266" + }, + { + "type": "redeemMasset", + "inputQty": "1021763975234029250150", + "expectedQtys": [ + "172705818909543966511", + "524427468381265448407", + "325288268661495509346" + ], + "redemptionFee": "306529192570208775", + "reserves": [ + "32347132911437991282176948", + "98223239548301628372831555", + "60925236493832324012621539" + ], + "mAssetSupply": "191315034890553832971368891" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "1745997077768297024323584", + "outputIndex": 0, + "expectedQty": "1725763777489412748943405", + "swapFee": "1047047171931162125344", + "reserves": [ + "30621369133948578533233543", + "98223239548301628372831555", + "62671233571600621036945123" + ], + "mAssetSupply": "191316081937725764133494235", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemMasset", + "inputQty": "4507449122266057113", + "expectedQtys": [ + "721229782404219770", + "2313466957554168360", + "1476105132795576993" + ], + "redemptionFee": "1352234736679817", + "reserves": [ + "30621368412718796129013773", + "98223237234834670818663195", + "62671232095495488241368130" + ], + "mAssetSupply": "191316077431628876604116939" + }, + { + "type": "redeemMasset", + "inputQty": "2197567910862569603072", + "expectedQtys": [ + "351629354692104589935", + "1127910845104778101124", + "719662315624828639476" + ], + "redemptionFee": "659270373258770880", + "reserves": [ + "30621016783364104024423838", + "98222109323989566040562071", + "62670512433179863412728654" + ], + "mAssetSupply": "191313880522988387293284747" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "854977902892641410875392", + "expectedQty": "855131465068048715337049", + "swapFee": "512986741735584846525", + "reserves": [ + "30621016783364104024423838", + "98222109323989566040562071", + "61815380968111814697391605" + ], + "mAssetSupply": "190459415606837481467255880" + }, + { + "type": "mintMulti", + "inputQtys": [ + "4109922850682", + "32948306178056", + "41216997733985" + ], + "expectedQty": "78125016494288", + "reserves": [ + "30621016783368213947274520", + "98222109324022514346740127", + "61815380968153031695125590" + ], + "mAssetSupply": "190459415606915606483750168" + }, + { + "type": "redeemMasset", + "inputQty": "138498398325738946795929", + "expectedQtys": [ + "22260330252290473414119", + "71403788028910035532531", + "44937462552505048352577" + ], + "redemptionFee": "41549519497721684038", + "reserves": [ + "30598756453115923473860401", + "98150705535993604311207596", + "61770443505600526646773013" + ], + "mAssetSupply": "190320958758109365258638277" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "26199913140391451295744", + "expectedQty": "26491130497171031384492", + "reserves": [ + "30624956366256314925156145", + "98150705535993604311207596", + "61770443505600526646773013" + ] + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "485756033918996467154944", + "expectedQty": "487911330276095612445704", + "swapFee": "291453620351397880292", + "reserves": [ + "30624956366256314925156145", + "97662794205717508698761892", + "61770443505600526646773013" + ], + "mAssetSupply": "189861985308307891220748117" + }, + { + "type": "redeemMasset", + "inputQty": "129134746182470310297", + "expectedQtys": [ + "20823334049707620823", + "66405481975290949552", + "42000601213360992121" + ], + "redemptionFee": "38740423854741093", + "reserves": [ + "30624935542922265217535322", + "97662727800235533407812340", + "61770401504999313285780892" + ], + "mAssetSupply": "189861856212302132605178913" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "423945584826073284083712", + "111267899970545759813632", + "242374891724989704175616" + ], + "expectedQty": "781578744626188386209372", + "swapFee": "469228784046140716155", + "reserves": [ + "30200989958096191933451610", + "97551459900264987647998708", + "61528026613274323581605276" + ], + "mAssetSupply": "189080277467675944218969541" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "42750648160730952499200", + "outputIndex": 2, + "expectedQty": "42540885649199993698053", + "swapFee": "25520335174608796911", + "reserves": [ + "30200989958096191933451610", + "97594210548425718600497908", + "61485485727625123587907223" + ], + "mAssetSupply": "189080302988011118827766452", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemBassets", + "inputQtys": [ + "408982895398795790516224", + "677338807464028855599104", + "219653006576757843689472" + ], + "expectedQty": "1307020882960874391462028", + "swapFee": "784683339780392870599", + "reserves": [ + "29792007062697396142935386", + "96916871740961689744898804", + "61265832721048365744217751" + ], + "mAssetSupply": "187773282105050244436304424" + }, + { + "type": "mintMulti", + "inputQtys": [ + "749666413343038111744", + "525657855671598120960", + "679693999955742818304" + ], + "expectedQty": "1960406011089448736344", + "reserves": [ + "29792756729110739181047130", + "96917397398817361343019764", + "61266512415048321487036055" + ], + "mAssetSupply": "187775242511061333885040768" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "203327013891749472", + "27329619473630696", + "204571180771271776" + ], + "expectedQty": "437260303324571481", + "swapFee": "262513690208868", + "reserves": [ + "29792756525783725289297658", + "96917397371487741869389068", + "61266512210477140715764279" + ], + "mAssetSupply": "187775242073801030560469287" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "8419271097098", + "6456643680760", + "5417652376622" + ], + "expectedQty": "20353053516391", + "swapFee": "12219163607", + "reserves": [ + "29792756525775306018200560", + "96917397371481285225708308", + "61266512210471723063387657" + ], + "mAssetSupply": "187775242073780677506952896" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "3454221821930946166784", + "93221708014683294793728", + "11059989632795342274560" + ], + "expectedQty": "107291524631179861183014", + "swapFee": "64413562916457791384", + "reserves": [ + "29789302303953375072033776", + "96824175663466601930914580", + "61255452220838927721113097" + ], + "mAssetSupply": "187667950549149497645769882" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "10783757096427842437120", + "expectedQty": "10832452895628545199794", + "swapFee": "6470254257856705462", + "reserves": [ + "29789302303953375072033776", + "96813343210570973385714786", + "61255452220838927721113097" + ], + "mAssetSupply": "187657173262307327660038224" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "152019890593991938277376", + "outputIndex": 1, + "expectedQty": "152578308189361225226750", + "swapFee": "91136631160105786071", + "reserves": [ + "29789302303953375072033776", + "96660764902381612160488036", + "61407472111432919659390473" + ], + "mAssetSupply": "187657264398938487765824295", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "407642196680444603269120", + "outputIndex": 2, + "expectedQty": "405647976980092387863399", + "swapFee": "243340383606672356846", + "reserves": [ + "29789302303953375072033776", + "97068407099062056763757156", + "61001824134452827271527074" + ], + "mAssetSupply": "187657507739322094438181141", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "5237794713877257125888", + "expectedQty": "5261608405521409330748", + "swapFee": "3142676828326354275", + "reserves": [ + "29789302303953375072033776", + "97063145490656535354426408", + "61001824134452827271527074" + ], + "mAssetSupply": "187652273087285045507409528" + }, + { + "type": "redeemMasset", + "inputQty": "8708861399522799203123", + "expectedQtys": [ + "1382093973151569109335", + "4503307497066389374189", + "2830219137971897669731" + ], + "redemptionFee": "2612658419856839760", + "reserves": [ + "29787920209980223502924441", + "97058642183159468965052219", + "60998993915314855373857343" + ], + "mAssetSupply": "187643566838543942565046165" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "1145820687736451891200000", + "expectedQty": "1145934025421766363522942", + "swapFee": "687492412641871134720", + "reserves": [ + "29787920209980223502924441", + "97058642183159468965052219", + "59853059889893089010334401" + ], + "mAssetSupply": "186498433643220132544980885" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "17704856718112516096", + "expectedQty": "17905865913797798658", + "reserves": [ + "29787937914836941615440537", + "97058642183159468965052219", + "59853059889893089010334401" + ] + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "595915505854606756282368", + "expectedQty": "598639973832067896191585", + "swapFee": "357549303512764053769", + "reserves": [ + "29787937914836941615440537", + "96460002209327401068860634", + "59853059889893089010334401" + ], + "mAssetSupply": "185902893592534952350550944" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "9943798874059602657280", + "outputIndex": 0, + "expectedQty": "9820842450419392032622", + "swapFee": "5962396748636529929", + "reserves": [ + "29778117072386522223407915", + "96460002209327401068860634", + "59863003688767148612991681" + ], + "mAssetSupply": "185902899554931700987080873", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "274750637658343276544", + "outputIndex": 1, + "expectedQty": "275820265748315058518", + "swapFee": "164742796426103204", + "reserves": [ + "29778117072386522223407915", + "96459726389061652753802116", + "59863278439404806956268225" + ], + "mAssetSupply": "185902899719674497413184077", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mintMulti", + "inputQtys": [ + "28732414847423447302144", + "15807430823324537585664", + "18859425619252544012288" + ], + "expectedQty": "63629200842387352525932", + "reserves": [ + "29806849487233945670710059", + "96475533819884977291387780", + "59882137865024059500280513" + ], + "mAssetSupply": "185966528920516884765710009" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "187926248464638875271168", + "expectedQty": "185712111562816487650561", + "swapFee": "112755749078783325162", + "reserves": [ + "29621137375671129183059498", + "96475533819884977291387780", + "59882137865024059500280513" + ], + "mAssetSupply": "185778715427801324673764003" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "15379765187066767360", + "9671517259124656128", + "15479124736063729664" + ], + "expectedQty": "40645332722727725888", + "swapFee": "24401840738079483", + "reserves": [ + "29621121995905942116292138", + "96475524148367718166731652", + "59882122385899323436550849" + ], + "mAssetSupply": "185778674782468601946038115" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "17773895828106131800064", + "outputIndex": 1, + "expectedQty": "17843167013789693601147", + "swapFee": "10657139617460006934", + "reserves": [ + "29621121995905942116292138", + "96457680981353928473130505", + "59899896281727429568350913" + ], + "mAssetSupply": "185778685439608219406045049", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemBassets", + "inputQtys": [ + "215557517962764943360", + "249973287207252754432", + "249992260650545938432" + ], + "expectedQty": "716521493715260484938", + "swapFee": "430170998828453362", + "reserves": [ + "29620906438387979351348778", + "96457431008066721220376073", + "59899646289466779022412481" + ], + "mAssetSupply": "185777968918114504145560111" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "2722715711926011166720", + "3210644586189951598592", + "1928034111535253815296" + ], + "expectedQty": "7874565125898093248678", + "swapFee": "4727575620911402790", + "reserves": [ + "29618183722676053340182058", + "96454220363480531268777481", + "59897718255355243768597185" + ], + "mAssetSupply": "185770094352988606052311433" + }, + { + "type": "redeemMasset", + "inputQty": "109915046649040985495961", + "expectedQtys": [ + "17519006014714800886922", + "57052183973007226928204", + "35429197691817498882032" + ], + "redemptionFee": "32974513994712295648", + "reserves": [ + "29600664716661338539295136", + "96397168179507524041849277", + "59862289057663426269715153" + ], + "mAssetSupply": "185660212280853559779111120" + }, + { + "type": "mintMulti", + "inputQtys": [ + "161742990695848956919808", + "181347903492192684998656", + "113001994554265063915520" + ], + "expectedQty": "456920124777063730685593", + "reserves": [ + "29762407707357187496214944", + "96578516082999716726847933", + "59975291052217691333630673" + ], + "mAssetSupply": "186117132405630623509796713" + }, + { + "type": "redeemMasset", + "inputQty": "1255309297002281435136", + "expectedQtys": [ + "200679100872279611550", + "651200331696429788784", + "404395625557441323631" + ], + "redemptionFee": "376592789100684430", + "reserves": [ + "29762207028256315216603394", + "96577864882668020297059149", + "59974886656592133892307042" + ], + "mAssetSupply": "186115877472926410329046007" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "13832176573333162323607552", + "outputIndex": 2, + "expectedQty": "13727590013948736689420743", + "swapFee": "8252035868985638706610", + "reserves": [ + "29762207028256315216603394", + "110410041456001182620666701", + "46247296642643397202886299" + ], + "mAssetSupply": "186124129508795395967752617", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "17104516108827544780800", + "expectedQty": "17045748819778617849458", + "swapFee": "10262709665296526868", + "reserves": [ + "29762207028256315216603394", + "110410041456001182620666701", + "46230250893823618585036841" + ], + "mAssetSupply": "186107035255396233719498685" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "24003399741176809521152", + "16136621928491822088192", + "709234723251687784448" + ], + "expectedQty": "41033359844583748814788", + "swapFee": "24634796784821141974", + "reserves": [ + "29738203628515138407082242", + "110393904834072690798578509", + "46229541659100366897252393" + ], + "mAssetSupply": "186066001895551649970683897" + }, + { + "type": "redeemMasset", + "inputQty": "18712016542048888422", + "expectedQtys": [ + "2989771446867558120", + "11098603960887765239", + "4647750932797477254" + ], + "redemptionFee": "5613604962614666", + "reserves": [ + "29738200638743691539524122", + "110393893735468729910813270", + "46229537011349434099775139" + ], + "mAssetSupply": "186065983189148712884410141" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "11420301360139659264", + "expectedQty": "11562480841019734343", + "reserves": [ + "29738212059045051679183386", + "110393893735468729910813270", + "46229537011349434099775139" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "867978315450144915456", + "2377159486723296067584", + "4341471617353931292672" + ], + "expectedQty": "7592592680596110720405", + "reserves": [ + "29739080037360501824098842", + "110396270894955453206880854", + "46233878482966788031067811" + ], + "mAssetSupply": "186073587344310150014864889" + }, + { + "type": "redeemMasset", + "inputQty": "87575179608153182647091", + "expectedQtys": [ + "13992442405340705009318", + "51942207368939039586531", + "21753358914792161144042" + ], + "redemptionFee": "26272553882445954794", + "reserves": [ + "29725087594955161119089524", + "110344328687586514167294323", + "46212125124051995869923769" + ], + "mAssetSupply": "185986038437255879278172592" + }, + { + "type": "mintMulti", + "inputQtys": [ + "61403053983308226560", + "13414162987280181248", + "21377026784434257920" + ], + "expectedQty": "96922598312677339420", + "reserves": [ + "29725148998009144427316084", + "110344342101749501447475571", + "46212146501078780304181689" + ], + "mAssetSupply": "185986135359854191955512012" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "2019231136739810082816", + "24053064124879373074432", + "21623943737758655184896" + ], + "expectedQty": "47609171788723259479076", + "swapFee": "28582652664832855400", + "reserves": [ + "29723129766872404617233268", + "110320289037624622074401139", + "46190522557341021648996793" + ], + "mAssetSupply": "185938526188065468696032936" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "328880381493978547093504", + "expectedQty": "331069063838732628725666", + "swapFee": "197328228896387128256", + "reserves": [ + "29723129766872404617233268", + "109989219973785889445675473", + "46190522557341021648996793" + ], + "mAssetSupply": "185609843134800386536067688" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "20521179966214603014144", + "expectedQty": "20774941396973379408305", + "reserves": [ + "29743650946838619220247412", + "109989219973785889445675473", + "46190522557341021648996793" + ] + }, + { + "type": "redeemMasset", + "inputQty": "308293965159014439321", + "expectedQtys": [ + "49383217312335130856", + "182614486758459429541", + "76689866260750191852" + ], + "redemptionFee": "92488189547704331", + "reserves": [ + "29743601563621306885116556", + "109989037359299130986245932", + "46190445867474760898804941" + ], + "mAssetSupply": "185630309874720390448741003" + }, + { + "type": "mintMulti", + "inputQtys": [ + "164652253379801776128", + "84720396586393878528", + "153937521800161296384" + ], + "expectedQty": "405169652524457943899", + "reserves": [ + "29743766215874686686892684", + "109989122079695717380124460", + "46190599804996561060101325" + ], + "mAssetSupply": "185630715044372914906684902" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "1381960210844312070520832", + "outputIndex": 2, + "expectedQty": "1392980712637132600075707", + "swapFee": "838918707762291165498", + "reserves": [ + "31125726426718998757413516", + "109989122079695717380124460", + "44797619092359428460025618" + ], + "mAssetSupply": "185631553963080677197850400", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "1218773568508270215168", + "expectedQty": "1210189662746610669835", + "reserves": [ + "31125726426718998757413516", + "109990340853264225650339628", + "44797619092359428460025618" + ] + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "3289773845099635560939520", + "expectedQty": "3247236435353748826696070", + "swapFee": "1973864307059781336563", + "reserves": [ + "27878489991365249930717446", + "109990340853264225650339628", + "44797619092359428460025618" + ], + "mAssetSupply": "182344964171950848028917278" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "3821186666813355049615360", + "outputIndex": 0, + "expectedQty": "3723327733770653259039202", + "swapFee": "2274521705753093367081", + "reserves": [ + "24155162257594596671678244", + "113811527520077580699954988", + "44797619092359428460025618" + ], + "mAssetSupply": "182347238693656601122284359", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mintMulti", + "inputQtys": [ + "21559226133164261900288", + "48320339436667691597824", + "50060458194242424012800" + ], + "expectedQty": "120088904504037441170629", + "reserves": [ + "24176721483727760933578532", + "113859847859514248391552812", + "44847679550553670884038418" + ], + "mAssetSupply": "182467327598160638563454988" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "41180329423982376779776", + "expectedQty": "40801415227860377902270", + "reserves": [ + "24176721483727760933578532", + "113901028188938230768332588", + "44847679550553670884038418" + ] + }, + { + "type": "redeemMasset", + "inputQty": "246876089875663", + "expectedQtys": [ + "32693688230938", + "154026041425797", + "60646603969596" + ], + "redemptionFee": "74062826962", + "reserves": [ + "24176721483695067245347594", + "113901028188784204726906791", + "44847679550493024280068822" + ], + "mAssetSupply": "182508129013141696914308557" + }, + { + "type": "mintMulti", + "inputQtys": [ + "186524548958583552737280", + "770044190160172521357312", + "574710764963798336929792" + ], + "expectedQty": "1529751782289901847342577", + "reserves": [ + "24363246032653650798084874", + "114671072378944377248264103", + "45422390315456822616998614" + ], + "mAssetSupply": "184037880795431598761651134" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "6379903351077893832704", + "expectedQty": "6321422514456577617243", + "reserves": [ + "24363246032653650798084874", + "114677452282295455142096807", + "45422390315456822616998614" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "11107456975591264223232", + "15249000347759038955520", + "54798615940206696595456" + ], + "expectedQty": "81405016871833602655163", + "reserves": [ + "24374353489629242062308106", + "114692701282643214181052327", + "45477188931397029313594070" + ], + "mAssetSupply": "184125607234817888941923540" + }, + { + "type": "mintMulti", + "inputQtys": [ + "1111118290765519912960", + "848239227703824089088", + "349757808134607863808" + ], + "expectedQty": "2325025158392855417663", + "reserves": [ + "24375464607920007582221066", + "114693549521870918005141415", + "45477538689205163921457878" + ], + "mAssetSupply": "184127932259976281797341203" + }, + { + "type": "redeemMasset", + "inputQty": "161196184541370567884", + "expectedQtys": [ + "21333282101416352089", + "100379208623077271263", + "39801709536221941482" + ], + "redemptionFee": "48358855362411170", + "reserves": [ + "24375443274637906165868977", + "114693449142662294927870152", + "45477498887495627699516396" + ], + "mAssetSupply": "184127771112150595789184489" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "4037954318360453316608", + "outputIndex": 2, + "expectedQty": "3986716924418492539166", + "swapFee": "2400583013599394437", + "reserves": [ + "24375443274637906165868977", + "114697487096980655381186760", + "45473512170571209206977230" + ], + "mAssetSupply": "184127773512733609388578926", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "644655247260126994759680", + "expectedQty": "646503987565795557085884", + "reserves": [ + "24375443274637906165868977", + "114697487096980655381186760", + "46118167417831336201736910" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "314656140231012650057728", + "593915195371041180352512", + "661226527583299272966144" + ], + "expectedQty": "1572711082982030569756499", + "swapFee": "944193165688631520766", + "reserves": [ + "24060787134406893515811249", + "114103571901609614200834248", + "45456940890248036928770766" + ], + "mAssetSupply": "183201566417317374375908311" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "1277427933521779481378816", + "outputIndex": 1, + "expectedQty": "1313183516943233288819989", + "swapFee": "781509797866661519565", + "reserves": [ + "25338215067928672997190065", + "112790388384666380912014259", + "45456940890248036928770766" + ], + "mAssetSupply": "183202347927115241037427876", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "23835376006798159904768", + "expectedQty": "23903859206995557790998", + "reserves": [ + "25338215067928672997190065", + "112790388384666380912014259", + "45480776266254835088675534" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "104090332146269280", + "149085916056317280", + "626338115716945664" + ], + "expectedQty": "881917955352832320", + "reserves": [ + "25338215172019005143459345", + "112790388533752296968331539", + "45480776892592950805621198" + ], + "mAssetSupply": "183226252668240191948051194" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "180182686104813618331648", + "outputIndex": 1, + "expectedQty": "184915145491662283275874", + "swapFee": "110063153050739266495", + "reserves": [ + "25518397858123818761790993", + "112605473388260634685055665", + "45480776892592950805621198" + ], + "mAssetSupply": "183226362731393242687317689", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemBassets", + "inputQtys": [ + "99478804469519417344", + "45795140925041836032", + "93270752241084727296" + ], + "expectedQty": "240198560138921369000", + "swapFee": "144205659479040245", + "reserves": [ + "25518298379319349242373649", + "112605427593119709643219633", + "45480683621840709720893902" + ], + "mAssetSupply": "183226122532833103765948689" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "325570357757222420742144", + "expectedQty": "326487682905749684256043", + "reserves": [ + "25518298379319349242373649", + "112605427593119709643219633", + "45806253979597932141636046" + ] + }, + { + "type": "redeemMasset", + "inputQty": "22743312418993202790", + "expectedQtys": [ + "3160927652133523915", + "13948328551086773255", + "5673977656837178777" + ], + "redemptionFee": "6822993725697960", + "reserves": [ + "25518295218391697108849734", + "112605413644791158556446378", + "45806248305620275304457269" + ], + "mAssetSupply": "183552587479249428182699902" + }, + { + "type": "redeemMasset", + "inputQty": "169919157236889183846", + "expectedQtys": [ + "23615828373740624940", + "104210336146313325260", + "42391252596326601199" + ], + "redemptionFee": "50975747171066755", + "reserves": [ + "25518271602563323368224794", + "112605309434455012243121118", + "45806205914367678977856070" + ], + "mAssetSupply": "183552417611067938464582811" + }, + { + "type": "redeemMasset", + "inputQty": "12332038205066927144960", + "expectedQtys": [ + "1713940337776387495412", + "7563160432390633830519", + "3076583918373210624545" + ], + "redemptionFee": "3699611461520078143", + "reserves": [ + "25516557662225546980729382", + "112597746274022621609290599", + "45803129330449305767231525" + ], + "mAssetSupply": "183540089272474333057515994" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "163248321318990414610432", + "expectedQty": "161853307956854569257296", + "reserves": [ + "25516557662225546980729382", + "112760994595341612023901031", + "45803129330449305767231525" + ] + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "23075096880935900020736", + "outputIndex": 0, + "expectedQty": "22459975338540560831236", + "swapFee": "13726607551102064755", + "reserves": [ + "25494097686887006419898146", + "112784069692222547923921767", + "45803129330449305767231525" + ], + "mAssetSupply": "183701956307038738728838045", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mintMulti", + "inputQtys": [ + "272182241916442204176384", + "98744227217318820708352", + "1703943694762721669021696" + ], + "expectedQty": "2083246310653101468570784", + "reserves": [ + "25766279928803448624074530", + "112882813919439866744630119", + "47507073025212027436253221" + ], + "mAssetSupply": "185785202617691840197408829" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "3532054159218546493620224", + "expectedQty": "3519908563585671705110750", + "swapFee": "2119232495531127896172", + "reserves": [ + "25766279928803448624074530", + "112882813919439866744630119", + "43987164461626355731142471" + ], + "mAssetSupply": "182255267690968824831684777" + }, + { + "type": "redeemMasset", + "inputQty": "103531501911944660307148", + "expectedQtys": [ + "14632341808284803964551", + "64104710579652479879382", + "24979749787638219198925" + ], + "redemptionFee": "31059450573583398092", + "reserves": [ + "25751647586995163820109979", + "112818709208860214264750737", + "43962184711838717511943546" + ], + "mAssetSupply": "182151767248507453754775721" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "130711596173301504", + "29676802699976204", + "133377154532941872" + ], + "expectedQty": "296244346239532872", + "swapFee": "177853319735561", + "reserves": [ + "25751647456283567646808475", + "112818709179183411564774533", + "43962184578461562979001674" + ], + "mAssetSupply": "182151766952263107515242849" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "465513364835106356723712", + "expectedQty": "469300108421968163712525", + "swapFee": "279308018901063814034", + "reserves": [ + "25751647456283567646808475", + "112349409070761443401062008", + "43962184578461562979001674" + ], + "mAssetSupply": "181686532895446902222333171" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "713187224613034114678784", + "expectedQty": "718941186736324933043309", + "swapFee": "427912334767820468807", + "reserves": [ + "25751647456283567646808475", + "111630467884025118468018699", + "43962184578461562979001674" + ], + "mAssetSupply": "180973773583168635928123194" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "53802960990072970674176", + "expectedQty": "53979266855377056489716", + "reserves": [ + "25751647456283567646808475", + "111630467884025118468018699", + "44015987539451635949675850" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "990681731939963481620480", + "1007443267718702975418368", + "543549657109242421706752" + ], + "expectedQty": "2551398814480294880040041", + "reserves": [ + "26742329188223531128428955", + "112637911151743821443437067", + "44559537196560878371382602" + ], + "mAssetSupply": "183579151664504307864652951" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "1665911343932909553713152", + "expectedQty": "1691044607677739000067401", + "reserves": [ + "28408240532156440682142107", + "112637911151743821443437067", + "44559537196560878371382602" + ] + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "518755818704565567488", + "outputIndex": 1, + "expectedQty": "529959216605383115410", + "swapFee": "315651046773304021", + "reserves": [ + "28408759287975145247709595", + "112637381192527216060321657", + "44559537196560878371382602" + ], + "mAssetSupply": "185270196587833093638024373", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mintMulti", + "inputQtys": [ + "4788461689641669492736", + "111350930675944180940800", + "20632367201426081841152" + ], + "expectedQty": "136029899068432838494181", + "reserves": [ + "28413547749664786917202331", + "112748732123203160241262457", + "44580169563762304453223754" + ], + "mAssetSupply": "185406226486901526476518554" + }, + { + "type": "mintMulti", + "inputQtys": [ + "750552091645583294464", + "1346319088518844645376", + "2681751253103060451328" + ], + "expectedQty": "4787850271219500560684", + "reserves": [ + "28414298301756432500496795", + "112750078442291679085907833", + "44582851315015407513675082" + ], + "mAssetSupply": "185411014337172745977079238" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "833458642385284448124928", + "298363829058560640155648", + "566942886345813809692672" + ], + "expectedQty": "1710479628650606292049175", + "swapFee": "1026903919542089028646", + "reserves": [ + "27580839659371148052371867", + "112451714613233118445752185", + "44015908428669593703982410" + ], + "mAssetSupply": "183700534708522139685030063" + }, + { + "type": "mintMulti", + "inputQtys": [ + "695388355704720588800", + "2367540598707311869952", + "3849082714888692826112" + ], + "expectedQty": "6916724306713330049938", + "reserves": [ + "27581535047726852772960667", + "112454082153831825757622137", + "44019757511384482396808522" + ], + "mAssetSupply": "183707451432828853015080001" + }, + { + "type": "mintMulti", + "inputQtys": [ + "175069750329460383547392", + "161589724571454138220544", + "11386639757422115160064" + ], + "expectedQty": "349378518461899958753832", + "reserves": [ + "27756604798056313156508059", + "112615671878403279895842681", + "44031144151141904511968586" + ], + "mAssetSupply": "184056829951290752973833833" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "286256913009541382144", + "expectedQty": "283932735338324206947", + "reserves": [ + "27756604798056313156508059", + "112615958135316289437224825", + "44031144151141904511968586" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "19105052611834873380864", + "108030114511677663739904", + "13826905328905623699456" + ], + "expectedQty": "140416911929341940536018", + "reserves": [ + "27775709850668148029888923", + "112723988249827967100964729", + "44044971056470810135668042" + ], + "mAssetSupply": "184197530795955433238576798" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "83754635520230316572672", + "outputIndex": 0, + "expectedQty": "82771380025453014491340", + "swapFee": "50431468828287100508", + "reserves": [ + "27692938470642695015397583", + "112723988249827967100964729", + "44128725691991040452240714" + ], + "mAssetSupply": "184197581227424261525677306", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemMasset", + "inputQty": "241656156417890744218419", + "expectedQtys": [ + "36320571504960514355118", + "147842731817443991051771", + "57876867729939803855576" + ], + "redemptionFee": "72496846925367223265", + "reserves": [ + "27656617899137734501042465", + "112576145518010523109912958", + "44070848824261100648385138" + ], + "mAssetSupply": "183955997567853296148682152" + }, + { + "type": "mintMulti", + "inputQtys": [ + "354784570134107200", + "390348188668940288", + "719915704383562112" + ], + "expectedQty": "1469708993122683723", + "reserves": [ + "27656618253922304635149665", + "112576145908358711778853246", + "44070849544176805031947250" + ], + "mAssetSupply": "183955999037562289271365875" + }, + { + "type": "mintMulti", + "inputQtys": [ + "47777066136318200774656", + "53660941192909872431104", + "19494001717914053378048" + ], + "expectedQty": "121276273120975789603139", + "reserves": [ + "27704395320058622835924321", + "112629806849551621651284350", + "44090343545894719085325298" + ], + "mAssetSupply": "184077275310683265060969014" + }, + { + "type": "redeemMasset", + "inputQty": "3606057036760599", + "expectedQtys": [ + "542563759897147", + "2205745722828973", + "863466691586574" + ], + "redemptionFee": "1081817111028", + "reserves": [ + "27704395319516059076027174", + "112629806847345875928455377", + "44090343545031252393738724" + ], + "mAssetSupply": "184077275307078289841319443" + }, + { + "type": "mintMulti", + "inputQtys": [ + "127514798427339197775872", + "57747371324231282327552", + "165414600918198776758272" + ], + "expectedQty": "352680140402024735746529", + "reserves": [ + "27831910117943398273803046", + "112687554218670107210782929", + "44255758145949451170496996" + ], + "mAssetSupply": "184429955447480314577065972" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "83636281812230892158976", + "expectedQty": "84266909157130387863778", + "swapFee": "50181769087338535295", + "reserves": [ + "27831910117943398273803046", + "112603287309512976822919151", + "44255758145949451170496996" + ], + "mAssetSupply": "184346369347437171023442291" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "938679636253355060232192", + "614654428635673663635456", + "370204503401553790500864" + ], + "expectedQty": "1934061994129738767225390", + "swapFee": "1161133876803925615704", + "reserves": [ + "26893230481690043213570854", + "111988632880877303159283695", + "43885553642547897379996132" + ], + "mAssetSupply": "182412307353307432256216901" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "495762359884756090880", + "expectedQty": "491651918024704383866", + "reserves": [ + "26893230481690043213570854", + "111989128643237187915374575", + "43885553642547897379996132" + ] + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "9886349733818288128", + "outputIndex": 0, + "expectedQty": "9647297231925919333", + "swapFee": "5882628133963941", + "reserves": [ + "26893220834392811287651521", + "111989138529586921733662703", + "43885553642547897379996132" + ], + "mAssetSupply": "182412799011108085094564708", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mintMulti", + "inputQtys": [ + "6615453917171200032768", + "9742285497256462254080", + "15240392024013758529536" + ], + "expectedQty": "31673766934935318137237", + "reserves": [ + "26899836288309982487684289", + "111998880815084178195916783", + "43900794034571911138525668" + ], + "mAssetSupply": "182444472778043020412701945" + }, + { + "type": "redeemMasset", + "inputQty": "37756992477208569446", + "expectedQtys": [ + "5565267085598143660", + "23171281726160172142", + "9082569925468349124" + ], + "redemptionFee": "11327097743162570", + "reserves": [ + "26899830723042896889540629", + "111998857643802452035744641", + "43900784952001985670176544" + ], + "mAssetSupply": "182444435032377640947295069" + }, + { + "type": "redeemMasset", + "inputQty": "628820151147481", + "expectedQtys": [ + "92686198246704", + "385903853070929", + "151264775572050" + ], + "redemptionFee": "188646045344", + "reserves": [ + "26899830722950210691293925", + "111998857643416548182673712", + "43900784951850720894604494" + ], + "mAssetSupply": "182444435031749009442192932" + }, + { + "type": "redeemMasset", + "inputQty": "62348185575367459943219", + "expectedQtys": [ + "9189934956784739885283", + "38262776728146943414294", + "14998063088742551303200" + ], + "redemptionFee": "18704455672610237982", + "reserves": [ + "26890640787993425951408642", + "111960594866688401239259418", + "43885786888761978343301294" + ], + "mAssetSupply": "182382105550629314592487695" + }, + { + "type": "mintMulti", + "inputQtys": [ + "75529798466903809720320", + "520315696097986110029824", + "287137993886322640551936" + ], + "expectedQty": "880844032930976892185766", + "reserves": [ + "26966170586460329761128962", + "112480910562786387349289242", + "44172924882648300983853230" + ], + "mAssetSupply": "183262949583560291484673461" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "26253332467173948391424", + "outputIndex": 2, + "expectedQty": "26558919243997860775825", + "swapFee": "15999649735430003858", + "reserves": [ + "26992423918927503709520386", + "112480910562786387349289242", + "44146365963404303123077405" + ], + "mAssetSupply": "183262965583210026914677319", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "63248173768443117568", + "expectedQty": "64241348784143452456", + "reserves": [ + "26992487167101272152637954", + "112480910562786387349289242", + "44146365963404303123077405" + ] + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "1398699172133949541449728", + "expectedQty": "1387001746878454023254684", + "reserves": [ + "26992487167101272152637954", + "113879609734920336890738970", + "44146365963404303123077405" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "13533326109765917474816", + "10704834896708654596096", + "3317640670196840529920" + ], + "expectedQty": "27695017524148293720968", + "swapFee": "16626986706512883962", + "reserves": [ + "26978953840991506235163138", + "113868904900023628236142874", + "44143048322734106282547485" + ], + "mAssetSupply": "184622336553913116787663491" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "344671043852056626462720", + "279544481492419177611264", + "604826070931089175609344" + ], + "expectedQty": "1234479273072583491702083", + "swapFee": "741132243189463773285", + "reserves": [ + "26634282797139449608700418", + "113589360418531209058531610", + "43538222251803017106938141" + ], + "mAssetSupply": "183387857280840533295961408" + }, + { + "type": "redeemMasset", + "inputQty": "564326454942063705613926", + "expectedQtys": [ + "81935202714682040446663", + "349435625618686201306687", + "133936892283110165700999" + ], + "redemptionFee": "169297936482619111684", + "reserves": [ + "26552347594424767568253755", + "113239924792912522857224923", + "43404285359519906941237142" + ], + "mAssetSupply": "182823700123834952209459166" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "98821890662621496999936", + "outputIndex": 2, + "expectedQty": "100000044701961521714757", + "swapFee": "60262070686006113165", + "reserves": [ + "26651169485087389065253691", + "113239924792912522857224923", + "43304285314817945419522385" + ], + "mAssetSupply": "182823760385905638215572331", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "398187772448919219339264", + "outputIndex": 1, + "expectedQty": "407756034310649472090801", + "swapFee": "242737525770029158715", + "reserves": [ + "27049357257536308284592955", + "112832168758601873385134122", + "43304285314817945419522385" + ], + "mAssetSupply": "182824003123431408244731046", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "10319533648393713745920", + "expectedQty": "10358437578818527369909", + "reserves": [ + "27049357257536308284592955", + "112832168758601873385134122", + "43314604848466339133268305" + ] + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "67482571255700856", + "expectedQty": "66403011402926081", + "swapFee": "40489542753420", + "reserves": [ + "27049357191133296881666874", + "112832168758601873385134122", + "43314604848466339133268305" + ], + "mAssetSupply": "182834361493568145059153519" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "8210611269679799336960", + "25948765460399625601024", + "7345676942977157562368" + ], + "expectedQty": "41443140896457976683877", + "swapFee": "24880813025690200130", + "reserves": [ + "27041146579863617082329914", + "112806219993141473759533098", + "43307259171523361975705937" + ], + "mAssetSupply": "182792918352671687082469642" + }, + { + "type": "mintMulti", + "inputQtys": [ + "5303591781305014026240", + "3632177270885967200256", + "156590032959152291840" + ], + "expectedQty": "9145414721604352985590", + "reserves": [ + "27046450171644922096356154", + "112809852170412359726733354", + "43307415761556321127997777" + ], + "mAssetSupply": "182802063767393291435455232" + }, + { + "type": "mintMulti", + "inputQtys": [ + "79777187135875167813632", + "1005954184797061583470592", + "330783248515352833818624" + ], + "expectedQty": "1410539798966262469330775", + "reserves": [ + "27126227358780797264169786", + "113815806355209421310203946", + "43638199010071673961816401" + ], + "mAssetSupply": "184212603566359553904786007" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "10178984708168830020485120", + "expectedQty": "10087337612652249615620235", + "reserves": [ + "27126227358780797264169786", + "123994791063378251330689066", + "43638199010071673961816401" + ] + }, + { + "type": "redeemMasset", + "inputQty": "43182923968950285107", + "expectedQtys": [ + "6026962177902634045", + "27549423150949678639", + "9695626725636612071" + ], + "redemptionFee": "12954877190685085", + "reserves": [ + "27126221331818619361535741", + "123994763513955100381010427", + "43638189314444948325204330" + ], + "mAssetSupply": "194299898009042711760806220" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "1220799315207533568", + "3436338868057548288", + "3285358490931534336" + ], + "expectedQty": "7948954077646013134", + "swapFee": "4772235788060444", + "reserves": [ + "27126220111019304154002173", + "123994760077616232323462139", + "43638186029086457393669994" + ], + "mAssetSupply": "194299890060088634114793086" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "725571740468032703561728", + "expectedQty": "729102899831194126378474", + "reserves": [ + "27126220111019304154002173", + "123994760077616232323462139", + "44363757769554490097231722" + ] + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "408367890791516545744896", + "outputIndex": 1, + "expectedQty": "419571359212546855439275", + "swapFee": "249544588476053349671", + "reserves": [ + "27534588001810820699747069", + "123575188718403685468022864", + "44363757769554490097231722" + ], + "mAssetSupply": "195029242504508304294521231", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "1108954191845570088271872", + "expectedQty": "1118628932931362540134581", + "swapFee": "665372515107342052963", + "reserves": [ + "27534588001810820699747069", + "122456559785472322927888283", + "44363757769554490097231722" + ], + "mAssetSupply": "193920953685177841548302322" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "4886288498240724924366848", + "outputIndex": 0, + "expectedQty": "4726808620831010323851235", + "swapFee": "2904073051840557290781", + "reserves": [ + "22807779380979810375895834", + "127342848283713047852255131", + "44363757769554490097231722" + ], + "mAssetSupply": "193923857758229682105593103", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "590585228273132320587776", + "outputIndex": 2, + "expectedQty": "580537074413864109520684", + "swapFee": "350293827777531880623", + "reserves": [ + "22807779380979810375895834", + "127933433511986180172842907", + "43783220695140625987711038" + ], + "mAssetSupply": "193924208052057459637473726", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemMasset", + "inputQty": "90984975667220742930432", + "expectedQtys": [ + "10697698463047436984579", + "60005547764762795145638", + "20535962090560666473232" + ], + "redemptionFee": "27295492700166222879", + "reserves": [ + "22797081682516762938911255", + "127873427964221417377697269", + "43762684733050065321237806" + ], + "mAssetSupply": "193833250371882939060766173" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "525711701206476586483712", + "expectedQty": "510438298702517012065357", + "swapFee": "315427020723885951890", + "reserves": [ + "22286643383814245926845898", + "127873427964221417377697269", + "43762684733050065321237806" + ], + "mAssetSupply": "193307854097697186360234351" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "151777229129623078436864", + "expectedQty": "150902853541596273422356", + "swapFee": "91066337477773847062", + "reserves": [ + "22286643383814245926845898", + "127873427964221417377697269", + "43611781879508469047815450" + ], + "mAssetSupply": "193156167934905041055644549" + }, + { + "type": "redeemMasset", + "inputQty": "77891005525317479353548", + "expectedQtys": [ + "8984482881309880727125", + "51550007093187269871282", + "17581351348962299308953" + ], + "redemptionFee": "23367301657595243806", + "reserves": [ + "22277658900932936046118773", + "127821877957128230107825987", + "43594200528159506748506497" + ], + "mAssetSupply": "193078300296681381171534807" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "920904330622682398720", + "2030756571742988140544", + "697735475517271441408" + ], + "expectedQty": "3656646568843570151036", + "swapFee": "2195305124380770552", + "reserves": [ + "22276737996602313363720053", + "127819847200556487119685443", + "43593502792683989477065089" + ], + "mAssetSupply": "193074643650112537601383771" + }, + { + "type": "redeemMasset", + "inputQty": "1305194283195706218905", + "expectedQtys": [ + "150546689563047356962", + "863809362907319678297", + "294605858941152558204" + ], + "redemptionFee": "391558284958711865", + "reserves": [ + "22276587449912750316363091", + "127818983391193579800007146", + "43593208186825048324506885" + ], + "mAssetSupply": "193073338847387626853876731" + }, + { + "type": "redeemMasset", + "inputQty": "118534309486152", + "expectedQtys": [ + "13672254102345", + "78448892764985", + "26755328696859" + ], + "redemptionFee": "35560292845", + "reserves": [ + "22276587449899078062260746", + "127818983391115130907242161", + "43593208186798292995810026" + ], + "mAssetSupply": "193073338847269128104683424" + }, + { + "type": "redeemMasset", + "inputQty": "31385977825031880704", + "expectedQtys": [ + "3620192887060989797", + "20772004488774520126", + "7084380520892173634" + ], + "redemptionFee": "9415793347509564", + "reserves": [ + "22276583829706191001270949", + "127818962619110642132722035", + "43593201102417772103636392" + ], + "mAssetSupply": "193073307470707096420312284" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "218877360810857798303744", + "expectedQty": "217597415715542363797886", + "swapFee": "131326416486514678982", + "reserves": [ + "22276583829706191001270949", + "127818962619110642132722035", + "43375603686702229739838506" + ], + "mAssetSupply": "192854561436312725136687522" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "753456227398547", + "outputIndex": 2, + "expectedQty": "771460376992351", + "swapFee": "465623155035", + "reserves": [ + "22276583830459647228669496", + "127818962619110642132722035", + "43375603685930769362846155" + ], + "mAssetSupply": "192854561436313190759842557", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "19723012014795", + "expectedQty": "19828153763514", + "reserves": [ + "22276583830459647228669496", + "127818962619110642132722035", + "43375603685950492374860950" + ] + }, + { + "type": "redeemMasset", + "inputQty": "3622324971999934283776", + "expectedQtys": [ + "418288358809626135347", + "2400062078889838503769", + "814465548948518228568" + ], + "redemptionFee": "1086697491599980285", + "reserves": [ + "22276165542100837602534149", + "127816562557031752294218266", + "43374789220401543856632382" + ], + "mAssetSupply": "192850940198058510579302580" + }, + { + "type": "redeemMasset", + "inputQty": "43543286715932981644492", + "expectedQtys": [ + "5028165633501568866519", + "28850694524914176224185", + "9790537070045001143367" + ], + "redemptionFee": "13062986014779894493", + "reserves": [ + "22271137376467336033667630", + "127787711862506838117994081", + "43364998683331498855489015" + ], + "mAssetSupply": "192807409974328592377552581" + }, + { + "type": "mintMulti", + "inputQtys": [ + "812537892715553095680", + "701436778879565430784", + "650041790297936887808" + ], + "expectedQty": "2183517645085879648948", + "reserves": [ + "22271949914360051586763310", + "127788413299285717683424865", + "43365648725121796792376823" + ], + "mAssetSupply": "192809593491973678257201529" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "1730076614238324129792", + "expectedQty": "1678723626752210384545", + "swapFee": "1038045968542994477", + "reserves": [ + "22270271190733299376378765", + "127788413299285717683424865", + "43365648725121796792376823" + ], + "mAssetSupply": "192807864453405408476066214" + }, + { + "type": "mintMulti", + "inputQtys": [ + "216655364463731576668160", + "7475248839847687749632", + "223767376326692500930560" + ], + "expectedQty": "455424143295062405568232", + "reserves": [ + "22486926555197030953046925", + "127795888548125565371174497", + "43589416101448489293307383" + ], + "mAssetSupply": "193263288596700470881634446" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "9110901515576248631296", + "expectedQty": "8845268792154323594617", + "swapFee": "5466540909345749178", + "reserves": [ + "22478081286404876629452308", + "127795888548125565371174497", + "43589416101448489293307383" + ], + "mAssetSupply": "193254183161725803978752328" + }, + { + "type": "mintMulti", + "inputQtys": [ + "268370611838840274944", + "121405315861867200512", + "224051244932214521856" + ], + "expectedQty": "621473628273708550356", + "reserves": [ + "22478349657016715469727252", + "127796009953441427238375009", + "43589640152693421507829239" + ], + "mAssetSupply": "193254804635354077687302684" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "15371629922654967824384", + "expectedQty": "15823610981168588159373", + "reserves": [ + "22493721286939370437551636", + "127796009953441427238375009", + "43589640152693421507829239" + ] + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "364223913738560503545856", + "expectedQty": "362076843374829219462634", + "swapFee": "218534348243136302127", + "reserves": [ + "22493721286939370437551636", + "127796009953441427238375009", + "43227563309318592288366605" + ], + "mAssetSupply": "192906622866944928908218328" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "104894298189231070117888", + "expectedQty": "103658228063323979953610", + "reserves": [ + "22493721286939370437551636", + "127900904251630658308492897", + "43227563309318592288366605" + ] + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "43787934673104388751360", + "expectedQty": "45072980374807446082005", + "reserves": [ + "22537509221612474826302996", + "127900904251630658308492897", + "43227563309318592288366605" + ] + }, + { + "type": "redeemMasset", + "inputQty": "145709621997411724007833", + "expectedQtys": [ + "17005209648718660234848", + "96504971763869980424782", + "32616460383887445544242" + ], + "redemptionFee": "43712886599223517202", + "reserves": [ + "22520504011963756166068148", + "127804399279866788328068115", + "43194946848934704842822363" + ], + "mAssetSupply": "192909688166272247833763312" + }, + { + "type": "mintMulti", + "inputQtys": [ + "631518422111023831973888", + "69023749480050551947264", + "182467563471804007710720" + ], + "expectedQty": "901184062919635343136859", + "reserves": [ + "23152022434074779998042036", + "127873423029346838880015379", + "43377414412406508850533083" + ], + "mAssetSupply": "193810872229191883176900171" + }, + { + "type": "mintMulti", + "inputQtys": [ + "28955287208675711647744", + "7890764683106651734016", + "15985552312614107742208" + ], + "expectedQty": "53628495790017114768835", + "reserves": [ + "23180977721283455709689780", + "127881313794029945531749395", + "43393399964719122958275291" + ], + "mAssetSupply": "193864500724981900291669006" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "1154153367516068608", + "expectedQty": "1122441834050709992", + "swapFee": "692492020509641", + "reserves": [ + "23180976598841621658979788", + "127881313794029945531749395", + "43393399964719122958275291" + ], + "mAssetSupply": "193864499571521024796110039" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "10708035109592379392", + "outputIndex": 0, + "expectedQty": "10469971419758435569", + "swapFee": "6459463242647726", + "reserves": [ + "23180966128870201900544219", + "127881313794029945531749395", + "43393410672754232550654683" + ], + "mAssetSupply": "193864499577980488038757765", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mintMulti", + "inputQtys": [ + "24835346585765629919232", + "9900680764337265049600", + "30952960155955824164864" + ], + "expectedQty": "66427942036149338354791", + "reserves": [ + "23205801475455967530463451", + "127891214474794282796798995", + "43424363632910188374819547" + ], + "mAssetSupply": "193930927520016637377112556" + }, + { + "type": "mintMulti", + "inputQtys": [ + "8969001094346624204800", + "157060866527355696316416", + "93829988459986081021952" + ], + "expectedQty": "258813100888429495618329", + "reserves": [ + "23214770476550314154668251", + "128048275341321638493115411", + "43518193621370174455841499" + ], + "mAssetSupply": "194189740620905066872730885" + }, + { + "type": "mintMulti", + "inputQtys": [ + "632656568443337048064", + "12291743216637807951872", + "1875764668519292076032" + ], + "expectedQty": "14686949950114459296540", + "reserves": [ + "23215403133118757491716315", + "128060567084538276301067283", + "43520069386038693747917531" + ], + "mAssetSupply": "194204427570855181332027425" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "3045360977369794871296", + "expectedQty": "3078789657777918146462", + "swapFee": "1827216586421876922", + "reserves": [ + "23215403133118757491716315", + "128057488294880498382920821", + "43520069386038693747917531" + ], + "mAssetSupply": "194201384037094397959033051" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "2156926180048198881509376", + "expectedQty": "2167435793646701015833013", + "reserves": [ + "23215403133118757491716315", + "128057488294880498382920821", + "45676995566086892629426907" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "651410670522364985344", + "635415304556305842176", + "658962295691690901504" + ], + "expectedQty": "1959713874409784781211", + "swapFee": "1176534245192986660", + "reserves": [ + "23214751722448235126730971", + "128056852879575942077078645", + "45676336603791200938525403" + ], + "mAssetSupply": "196366860116866689190084853" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "469333323521261748355072", + "outputIndex": 1, + "expectedQty": "476339255412573165323837", + "swapFee": "282813141809827485996", + "reserves": [ + "23214751722448235126730971", + "127580513624163368911754808", + "46145669927312462686880475" + ], + "mAssetSupply": "196367142930008499017570849", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "720259434786536", + "expectedQty": "723248709687458", + "reserves": [ + "23214751722448235126730971", + "127580513624163368911754808", + "46145669928032722121667011" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "4305244908179972", + "109019175968229536", + "78439527953269008" + ], + "expectedQty": "191006247773485575", + "reserves": [ + "23214751726753480034910943", + "127580513733182544879984344", + "46145670006472250074936019" + ], + "mAssetSupply": "196367143121737995500743882" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "134237437144554771841024", + "expectedQty": "134790945195197275365619", + "reserves": [ + "23214751726753480034910943", + "127580513733182544879984344", + "46279907443616804846777043" + ] + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "3445799027543663651586048", + "expectedQty": "3427187186025931071569545", + "swapFee": "2067479416526198190951", + "reserves": [ + "23214751726753480034910943", + "127580513733182544879984344", + "42852720257590873775207498" + ], + "mAssetSupply": "193058202518806055322714404" + }, + { + "type": "redeemMasset", + "inputQty": "181473564531150657945", + "expectedQtys": [ + "21815182320604655000", + "119888948217281025823", + "40269218312417774378" + ], + "redemptionFee": "54442069359345197", + "reserves": [ + "23214729911571159430255943", + "127580393844234327598958521", + "42852679988372561357433120" + ], + "mAssetSupply": "193058021099683593531401656" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "123951529033258156032", + "expectedQty": "124646761458716243563", + "reserves": [ + "23214729911571159430255943", + "127580393844234327598958521", + "42852803939901594615589152" + ] + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "745460937576685240320", + "expectedQty": "753673870027740620191", + "swapFee": "447276562546011144", + "reserves": [ + "23214729911571159430255943", + "127579640170364299858338330", + "42852803939901594615589152" + ], + "mAssetSupply": "193057400732784038108416043" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "115537929999755207770112", + "149945078232321999503360", + "37892226147708265562112" + ], + "expectedQty": "305039026420373269596957", + "swapFee": "183133295829721794835", + "reserves": [ + "23099191981571404222485831", + "127429695092131977858834970", + "42814911713753886350027040" + ], + "mAssetSupply": "192752361706363664838819086" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "1672707271523796019838976", + "expectedQty": "1623382619179335471584780", + "swapFee": "1003624362914277611903", + "reserves": [ + "21475809362392068750901051", + "127429695092131977858834970", + "42814911713753886350027040" + ], + "mAssetSupply": "191080658059202783096592013" + }, + { + "type": "redeemMasset", + "inputQty": "181049751604051353", + "expectedQtys": [ + "20342317914603137", + "120703966289834852", + "40555144202948761" + ], + "redemptionFee": "54314925481215", + "reserves": [ + "21475809342049750836297914", + "127429694971428011569000118", + "42814911673198742147078279" + ], + "mAssetSupply": "191080657878207346418021875" + }, + { + "type": "mintMulti", + "inputQtys": [ + "4506472648480592", + "1605596161804983", + "5963031605151298" + ], + "expectedQty": "12232734892102795", + "reserves": [ + "21475809346556223484778506", + "127429694973033607730805101", + "42814911679161773752229577" + ], + "mAssetSupply": "191080657890440081310124670" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "116410333307274746920960", + "expectedQty": "114980662131820463511925", + "reserves": [ + "21475809346556223484778506", + "127546105306340882477726061", + "42814911679161773752229577" + ] + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "1762565012828305611554816", + "expectedQty": "1701988089411260948053219", + "swapFee": "1057539007696983366932", + "reserves": [ + "19773821257144962536725287", + "127546105306340882477726061", + "42814911679161773752229577" + ], + "mAssetSupply": "189434131078751293145448711" + }, + { + "type": "redeemMasset", + "inputQty": "219176781004261070523596", + "expectedQtys": [ + "22871603326573219525309", + "147527576409232752011876", + "49522328722083488508414" + ], + "redemptionFee": "65753034301278321157", + "reserves": [ + "19750949653818389317199978", + "127398577729931649725714185", + "42765389350439690263721163" + ], + "mAssetSupply": "189215020050781333353246272" + }, + { + "type": "mintMulti", + "inputQtys": [ + "426521861881482170073088", + "374529180289610064855040", + "457942348016166333579264" + ], + "expectedQty": "1272465632146446232336569", + "reserves": [ + "20177471515699871487273066", + "127773106910221259790569225", + "43223331698455856597300427" + ], + "mAssetSupply": "190487485682927779585582841" + }, + { + "type": "redeemMasset", + "inputQty": "121392951680805888", + "expectedQtys": [ + "12854744736221937", + "81402205038767399", + "27536894065263557" + ], + "redemptionFee": "36417885504241", + "reserves": [ + "20177471502845126751051129", + "127773106828819054751801826", + "43223331670918962532036870" + ], + "mAssetSupply": "190487485561571245790281194" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "11641309384455762214912", + "17900392511974722764800", + "37976960834748893102080" + ], + "expectedQty": "67913810965707694857590", + "swapFee": "40772750229562354327", + "reserves": [ + "20165830193460670988836217", + "127755206436307080029037026", + "43185354710084213638934790" + ], + "mAssetSupply": "190419571750605538095423604" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "9557144779344758964224", + "expectedQty": "9907649251287046098890", + "reserves": [ + "20175387338240015747800441", + "127755206436307080029037026", + "43185354710084213638934790" + ] + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "171848447361338539245568", + "expectedQty": "178093750909941850234891", + "reserves": [ + "20347235785601354287046009", + "127755206436307080029037026", + "43185354710084213638934790" + ] + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "3175283095428183483219968", + "outputIndex": 0, + "expectedQty": "2998668649293939275087475", + "swapFee": "1880259148724377034264", + "reserves": [ + "17348567136307415011958534", + "130930489531735263512256994", + "43185354710084213638934790" + ], + "mAssetSupply": "190609453409915491368791649", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemMasset", + "inputQty": "134148381025119233900544", + "expectedQtys": [ + "12206026344241474228971", + "92119481218951676658657", + "30384156405258989255248" + ], + "redemptionFee": "40244514307535770170", + "reserves": [ + "17336361109963173537729563", + "130838370050516311835598337", + "43154970553678954649679542" + ], + "mAssetSupply": "190475345273404679670661275" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "25264264535197318381568", + "12876775401380330340352", + "21504369991293524246528" + ], + "expectedQty": "60888987856083342314303", + "swapFee": "36555325909195522702", + "reserves": [ + "17311096845427976219347995", + "130825493275114931505257985", + "43133466183687661125433014" + ], + "mAssetSupply": "190414456285548596328346972" + }, + { + "type": "mintMulti", + "inputQtys": [ + "116095410191791783936", + "1305667563185233985536", + "926531223371983224832" + ], + "expectedQty": "2339590666325060479177", + "reserves": [ + "17311212940838168011131931", + "130826798942678116739243521", + "43134392714911033108657846" + ], + "mAssetSupply": "190416795876214921388826149" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "393151738108923393081344", + "outputIndex": 0, + "expectedQty": "375031599915312785381415", + "swapFee": "237195529413321795808", + "reserves": [ + "16936181340922855225750516", + "130826798942678116739243521", + "43527544453019956501739190" + ], + "mAssetSupply": "190417033071744334710621957", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemBassets", + "inputQtys": [ + "17888376562760759296", + "85660053063892402176", + "28674467739660984320" + ], + "expectedQty": "132023597112775957148", + "swapFee": "79261715296843680", + "reserves": [ + "16936163452546292464991220", + "130826713282625052846841345", + "43527515778552216840754870" + ], + "mAssetSupply": "190416901048147221934664809" + }, + { + "type": "redeemMasset", + "inputQty": "19054704387360875033395", + "expectedQtys": [ + "1694265436481960608606", + "13087685360639453094311", + "4354419802699564332394" + ], + "redemptionFee": "5716411316208262510", + "reserves": [ + "16934469187109810504382614", + "130813625597264413393747034", + "43523161358749517276422476" + ], + "mAssetSupply": "190397852060171177267893924" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "134066363601089950908416", + "81908983894598360236032", + "4402288488743993081856" + ], + "expectedQty": "226506618427798236202050", + "swapFee": "135985562394115410967", + "reserves": [ + "16800402823508720553474198", + "130731716613369815033511002", + "43518759070260773283340620" + ], + "mAssetSupply": "190171345441743379031691874" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "13020263511468898304", + "150908404071741620224", + "138280051403618156544" + ], + "expectedQty": "301312859690451588808", + "swapFee": "180896253566410799", + "reserves": [ + "16800389803245209084575894", + "130731565704965743291890778", + "43518620790209369665184076" + ], + "mAssetSupply": "190171044128883688580103066" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "12938741257495505797120", + "expectedQty": "13136481616358614544190", + "swapFee": "7763244754497303478", + "reserves": [ + "16800389803245209084575894", + "130718429223349384677346588", + "43518620790209369665184076" + ], + "mAssetSupply": "190158113150870947571609424" + }, + { + "type": "redeemMasset", + "inputQty": "1042376893864357478", + "expectedQtys": [ + "92065934749181302", + "716335425328506404", + "238481520308050132" + ], + "redemptionFee": "312713068159307", + "reserves": [ + "16800389711179274335394592", + "130718428507013959348840184", + "43518620551727849357133944" + ], + "mAssetSupply": "190158112108806766775411253" + }, + { + "type": "redeemMasset", + "inputQty": "155693823655335231383142", + "expectedQtys": [ + "13751357588484595409049", + "106994890279752394108074", + "35620609000883584949283" + ], + "redemptionFee": "46708147096600569414", + "reserves": [ + "16786638353590789739985543", + "130611433616734206954732110", + "43482999942726965772184661" + ], + "mAssetSupply": "190002464993298528144597525" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "8041074765684402028544", + "1910583356775594459136", + "5216112066740075102208" + ], + "expectedQty": "15612071363106713617754", + "swapFee": "9372866537786700190", + "reserves": [ + "16778597278825105337956999", + "130609523033377431360272974", + "43477783830660225697082453" + ], + "mAssetSupply": "189986852921935421430979771" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "1104600685690955520", + "outputIndex": 1, + "expectedQty": "1127513161601211972", + "swapFee": "666320396723622", + "reserves": [ + "16778597278825105337956999", + "130609521905864269759061002", + "43477784935260911388037973" + ], + "mAssetSupply": "189986852922601741827703393", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "24337066901646350483456", + "expectedQty": "23956144316970431764393", + "reserves": [ + "16778597278825105337956999", + "130633858972765916109544458", + "43477784935260911388037973" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "10062148034432126156800", + "24694825815336609120256", + "38060780319966842847232" + ], + "expectedQty": "73194980314521613037480", + "swapFee": "43943354201233708047", + "reserves": [ + "16768535130790673211800199", + "130609164146950579500424202", + "43439724154940944545190741" + ], + "mAssetSupply": "189937614086604190646430306" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "3270957770554330841088", + "expectedQty": "3321018559037013503414", + "swapFee": "1962574662332598504", + "reserves": [ + "16768535130790673211800199", + "130605843128391542486920788", + "43439724154940944545190741" + ], + "mAssetSupply": "189934345091408298648187722" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "455361609261295633170432", + "expectedQty": "452588339368342170281291", + "swapFee": "273216965556777379902", + "reserves": [ + "16768535130790673211800199", + "130605843128391542486920788", + "42987135815572602374909450" + ], + "mAssetSupply": "189479256699112559792397192" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "697795561898187", + "667799631906555", + "634763698350781" + ], + "expectedQty": "2032192717236449", + "swapFee": "1220047658937", + "reserves": [ + "16768535130092877649902012", + "130605843127723742855014233", + "42987135814937838676558669" + ], + "mAssetSupply": "189479256697080367075160743" + }, + { + "type": "mintMulti", + "inputQtys": [ + "28167475004376608669696", + "29691865062842057097216", + "18700437889153891303424" + ], + "expectedQty": "77760585176991946721630", + "reserves": [ + "16796702605097254258571708", + "130635534992786584912111449", + "43005836252826992567862093" + ], + "mAssetSupply": "189557017282257359021882373" + }, + { + "type": "redeemMasset", + "inputQty": "564065327996150568137523", + "expectedQtys": [ + "49966998683172815241525", + "388615894346981501710129", + "127934191247848786433192" + ], + "redemptionFee": "169219598398845170441", + "reserves": [ + "16746735606414081443330183", + "130246919098439603410401320", + "42877902061579143781428901" + ], + "mAssetSupply": "188993121173859607298915291" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "15709747364549098", + "13539761573193562", + "12687451170366474" + ], + "expectedQty": "42665844962505645", + "swapFee": "25614875903045", + "reserves": [ + "16746735590704334078781085", + "130246919084899841837207758", + "42877902048891692611062427" + ], + "mAssetSupply": "188993121131193762336409646" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "12593977955725506248704", + "16040471986942683119616", + "20595746431442150752256" + ], + "expectedQty": "49792317060689788255284", + "swapFee": "29893326232153164852", + "reserves": [ + "16734141612748608572532381", + "130230878612912899154088142", + "42857306302460250460310171" + ], + "mAssetSupply": "188943328814133072548154362" + }, + { + "type": "mintMulti", + "inputQtys": [ + "180806865884852449705984", + "74939344448645383585792", + "988917896634756010868736" + ], + "expectedQty": "1258753923405868579929872", + "reserves": [ + "16914948478633461022238365", + "130305817957361544537673934", + "43846224199095006471178907" + ], + "mAssetSupply": "190202082737538941128084234" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "33472082983494430490624", + "expectedQty": "32955803301010649192158", + "reserves": [ + "16914948478633461022238365", + "130339290040345038968164558", + "43846224199095006471178907" + ] + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "95611963163429415419904", + "expectedQty": "100786826119654741427535", + "reserves": [ + "17010560441796890437658269", + "130339290040345038968164558", + "43846224199095006471178907" + ] + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "510488963383155440484352", + "expectedQty": "502631560054495187903105", + "reserves": [ + "17010560441796890437658269", + "130849779003728194408648910", + "43846224199095006471178907" + ] + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "22612019434752250478592", + "expectedQty": "22952657536341336875340", + "swapFee": "13567211660851350287", + "reserves": [ + "17010560441796890437658269", + "130826826346191853071773570", + "43846224199095006471178907" + ], + "mAssetSupply": "190815858474791010307478727" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "282638809159600770646016", + "expectedQty": "278271088666803924836919", + "reserves": [ + "17010560441796890437658269", + "131109465155351453842419586", + "43846224199095006471178907" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "48599103748670104797184", + "103393346674960449536", + "84472621287903042994176" + ], + "expectedQty": "136254935438498318035510", + "reserves": [ + "17059159545545560542455453", + "131109568548698128802869122", + "43930696820382909514173083" + ], + "mAssetSupply": "191230384498896312550351156" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "37658857792932799315968", + "outputIndex": 1, + "expectedQty": "38424703365820785308684", + "swapFee": "22713115474431003240", + "reserves": [ + "17059159545545560542455453", + "131071143845332308017560438", + "43968355678175842313489051" + ], + "mAssetSupply": "191230407212011786981354396", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "132215884134188924928", + "expectedQty": "132902890737864939210", + "reserves": [ + "17059159545545560542455453", + "131071143845332308017560438", + "43968487894059976502413979" + ] + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "825176237936812752896", + "expectedQty": "820418002707453739822", + "swapFee": "495105742762087651", + "reserves": [ + "17059159545545560542455453", + "131071143845332308017560438", + "43967667476057269048674157" + ], + "mAssetSupply": "191229715433770330795628361" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "23546271189538726477824", + "expectedQty": "23410338034306586376148", + "swapFee": "14127762713723235886", + "reserves": [ + "17059159545545560542455453", + "131071143845332308017560438", + "43944257138022962462298009" + ], + "mAssetSupply": "191206183290343505792386423" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "36786099786775152033792", + "12133945836838085197824", + "29344649927296597098496" + ], + "expectedQty": "80224904876674198189258", + "swapFee": "48163841230742964692", + "reserves": [ + "17022373445758785390421661", + "131059009899495469932362614", + "43914912488095665865199513" + ], + "mAssetSupply": "191125958385466831594197165" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "214602824772625427857408", + "expectedQty": "217834953799720591012386", + "swapFee": "128761694863575256714", + "reserves": [ + "17022373445758785390421661", + "130841174945695749341350228", + "43914912488095665865199513" + ], + "mAssetSupply": "190911484322389069741596471" + }, + { + "type": "redeemMasset", + "inputQty": "2131987122160345088", + "expectedQtys": [ + "190038821705471747", + "1460718906001603086", + "490268777801719657" + ], + "redemptionFee": "639596136648103", + "reserves": [ + "17022373255719963684949914", + "130841173484976843339747142", + "43914911997826888063479856" + ], + "mAssetSupply": "190911482191041543717899486" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "144410083111010685681664", + "50737507932495000109056", + "219456929328401095852032" + ], + "expectedQty": "422850441021671391931238", + "swapFee": "253862582162300215287", + "reserves": [ + "16877963172608952999268250", + "130790435977044348339638086", + "43695455068498486967627824" + ], + "mAssetSupply": "190488631750019872325968248" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "23575818618205274112", + "outputIndex": 2, + "expectedQty": "23073103474960719324", + "swapFee": "13925405137240026", + "reserves": [ + "16877963172608952999268250", + "130790459552862966544912198", + "43695431995395012006908500" + ], + "mAssetSupply": "190488631763945277463208274", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemMasset", + "inputQty": "54426490374305343078", + "expectedQtys": [ + "4820931880070614517", + "37358293155347446764", + "12480931435015993992" + ], + "redemptionFee": "16327947112291602", + "reserves": [ + "16877958351677072928653733", + "130790422194569811197465434", + "43695419514463576990914508" + ], + "mAssetSupply": "190488577353782850270156798" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "1033106158596256660717568", + "expectedQty": "1048711813016990538331831", + "swapFee": "619863695157753996430", + "reserves": [ + "16877958351677072928653733", + "129741710381552820659133603", + "43695419514463576990914508" + ], + "mAssetSupply": "189456091058881751363435660" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "467691885288760541184", + "expectedQty": "470076293780093527344", + "reserves": [ + "16877958351677072928653733", + "129741710381552820659133603", + "43695887206348865751455692" + ] + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "259743071861471853936640", + "expectedQty": "261048524273525776828283", + "reserves": [ + "16877958351677072928653733", + "129741710381552820659133603", + "43955630278210337605392332" + ] + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "7434474892927306", + "expectedQty": "7837367435609102", + "reserves": [ + "16877958359111547821581039", + "129741710381552820659133603", + "43955630278210337605392332" + ] + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "1832712473787664695296", + "expectedQty": "1737446636766292871162", + "swapFee": "1099627484272598817", + "reserves": [ + "16876220912474781528709877", + "129741710381552820659133603", + "43955630278210337605392332" + ], + "mAssetSupply": "189715778054440121277303910" + }, + { + "type": "redeemMasset", + "inputQty": "125511323526187686297", + "expectedQtys": [ + "11161545958452371011", + "85808195487739818573", + "29071247053914055270" + ], + "redemptionFee": "37653397057856305", + "reserves": [ + "16876209750928823076338866", + "129741624573357332919315030", + "43955601206963283691337062" + ], + "mAssetSupply": "189715652580769992147473918" + }, + { + "type": "mintMulti", + "inputQtys": [ + "72768936271122565955584", + "96347598706346693754880", + "96849447738903703322624" + ], + "expectedQty": "268899685313652068863732", + "reserves": [ + "16948978687199945642294450", + "129837972172063679613069910", + "44052450654702187394659686" + ], + "mAssetSupply": "189984552266083644216337650" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "4262336333431598219264", + "3449458867651572400128", + "3547045005622617571328" + ], + "expectedQty": "11453059119461454470313", + "swapFee": "6875961048305856195", + "reserves": [ + "16944716350866514044075186", + "129834522713196028040669782", + "44048903609696564777088358" + ], + "mAssetSupply": "189973099206964182761867337" + }, + { + "type": "redeemMasset", + "inputQty": "3785824307042748622438", + "expectedQtys": [ + "337576606314548617594", + "2586593758929967356805", + "877552570638199271919" + ], + "redemptionFee": "1135747292112824586", + "reserves": [ + "16944378774260199495457592", + "129831936119437098073312977", + "44048026057125926577816439" + ], + "mAssetSupply": "189969314518404432126069485" + }, + { + "type": "mintMulti", + "inputQtys": [ + "18884726722042949271552", + "65395469436160437125120", + "104245128312598424453120" + ], + "expectedQty": "189053985845805097951822", + "reserves": [ + "16963263500982242444729144", + "129897331588873258510438097", + "44152271185438525002269559" + ], + "mAssetSupply": "190158368504250237224021307" + }, + { + "type": "redeemMasset", + "inputQty": "2685482823499478220", + "expectedQtys": [ + "239489257058580806", + "1833905099352494124", + "623346717631155091" + ], + "redemptionFee": "805644847049843", + "reserves": [ + "16963263261492985386148338", + "129897329754968159157943973", + "44152270562091807371114468" + ], + "mAssetSupply": "190158365819573058571592930" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "7792960695966155243782144", + "outputIndex": 1, + "expectedQty": "7919295282712398311681512", + "swapFee": "4689974440590344602935", + "reserves": [ + "16963263261492985386148338", + "121978034472255760846262461", + "51945231258057962614896612" + ], + "mAssetSupply": "190163055794013648916195865", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "1160334597488766265327616", + "expectedQty": "1213648253193246407484856", + "reserves": [ + "18123597858981751651475954", + "121978034472255760846262461", + "51945231258057962614896612" + ] + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "1391535306798910647828480", + "outputIndex": 2, + "expectedQty": "1372011962174108969450430", + "swapFee": "824643321840064499014", + "reserves": [ + "18123597858981751651475954", + "123369569779054671494090941", + "50573219295883853645446182" + ], + "mAssetSupply": "191377528690528735388179735", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "4249550672657297642094592", + "expectedQty": "4399492325903801791651035", + "reserves": [ + "22373148531639049293570546", + "123369569779054671494090941", + "50573219295883853645446182" + ] + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "81440591644605523427328", + "expectedQty": "80595891979108620339746", + "reserves": [ + "22373148531639049293570546", + "123451010370699277017518269", + "50573219295883853645446182" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "141115791485888469401600", + "70397520975608774918144", + "48135017565717406941184" + ], + "expectedQty": "263021198019530632675579", + "reserves": [ + "22514264323124937762972146", + "123521407891674885792436413", + "50621354313449571052387366" + ], + "mAssetSupply": "196120638106431176432846095" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "512634988014290971131904", + "expectedQty": "526764687156031636956991", + "reserves": [ + "23026899311139228734104050", + "123521407891674885792436413", + "50621354313449571052387366" + ] + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "744679201255462144", + "expectedQty": "724712173048588417", + "swapFee": "446807520753277", + "reserves": [ + "23026898586427055685515633", + "123521407891674885792436413", + "50621354313449571052387366" + ], + "mAssetSupply": "196647402049354814335094219" + }, + { + "type": "redeemMasset", + "inputQty": "407968850033505415987", + "expectedQtys": [ + "47757758104451739511", + "256183241380542936041", + "104988623854298555830" + ], + "redemptionFee": "122390655010051624", + "reserves": [ + "23026850828668951233776122", + "123521151708433505249500372", + "50621249324825716753831536" + ], + "mAssetSupply": "196646994202895435839729856" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "21049802760821440845447168", + "outputIndex": 0, + "hardLimitError": true + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "194229400929649834328064", + "expectedQty": "188979544759704870628888", + "swapFee": "116537640557789900596", + "reserves": [ + "22837871283909246363147234", + "123521151708433505249500372", + "50621249324825716753831536" + ], + "mAssetSupply": "196452881339606343795302388" + }, + { + "type": "mintMulti", + "inputQtys": [ + "301062567254430646272", + "2629467456953400688640", + "2279497146003404881920" + ], + "expectedQty": "5196237897091145824160", + "reserves": [ + "22838172346476500793793506", + "123523781175890458650189012", + "50623528821971720158713456" + ], + "mAssetSupply": "196458077577503434941126548" + }, + { + "type": "mintMulti", + "inputQtys": [ + "78551295158253678231552", + "273531420485628115025920", + "196389764378115870556160" + ], + "expectedQty": "548245194076121694537462", + "reserves": [ + "22916723641634754472025058", + "123797312596376086765214932", + "50819918586349836029269616" + ], + "mAssetSupply": "197006322771579556635664010" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "1859792831051344640", + "expectedQty": "1854846805395750866", + "swapFee": "1115875698630806", + "reserves": [ + "22916723641634754472025058", + "123797312596376086765214932", + "50819916731503030633518750" + ], + "mAssetSupply": "197006320912902601282950176" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "27458130664459001856", + "expectedQty": "27723607995798872290", + "swapFee": "16474878398675401", + "reserves": [ + "22916723641634754472025058", + "123797284872768090966342642", + "50819916731503030633518750" + ], + "mAssetSupply": "197006293471246815222623721" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "156552528000716009111552", + "expectedQty": "160802393612501218318387", + "reserves": [ + "23073276169635470481136610", + "123797284872768090966342642", + "50819916731503030633518750" + ] + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "12740277298652956852224", + "expectedQty": "13083536017956053682680", + "reserves": [ + "23086016446934123437988834", + "123797284872768090966342642", + "50819916731503030633518750" + ] + }, + { + "type": "redeemMasset", + "inputQty": "348792617842739939115008", + "expectedQtys": [ + "40824673488542643356019", + "218919697355151000061741", + "89868536308439748963013" + ], + "redemptionFee": "104637785352821981734", + "reserves": [ + "23045191773445580794632815", + "123578365175412939966280901", + "50730048195194590884555737" + ], + "mAssetSupply": "196831491420819885377491514" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "2873627974777717800304640", + "expectedQty": "2844122530852077792466276", + "reserves": [ + "23045191773445580794632815", + "126451993150190657766585541", + "50730048195194590884555737" + ] + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "68231492077568347078656", + "expectedQty": "67519374903776044354056", + "reserves": [ + "23045191773445580794632815", + "126520224642268226113664197", + "50730048195194590884555737" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "19851246512940494848", + "28114974061146607616", + "7654957283426799616" + ], + "expectedQty": "55903796411270091232", + "swapFee": "33562415295939618", + "reserves": [ + "23045171922199067854137967", + "126520196527294164967056581", + "50730040540237307457756121" + ], + "mAssetSupply": "199743077422779327944220614" + }, + { + "type": "redeemMasset", + "inputQty": "11160644665867", + "expectedQtys": [ + "1287262711240", + "7067195322228", + "2833690707435" + ], + "redemptionFee": "3348193399", + "reserves": [ + "23045171922197780591426727", + "126520196527287097771734353", + "50730040540234473767048686" + ], + "mAssetSupply": "199743077422768170647748146" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "2294197207657377590935552", + "expectedQty": "2223521554616948164020480", + "swapFee": "1376518324594426554561", + "reserves": [ + "20821650367580832427406247", + "126520196527287097771734353", + "50730040540234473767048686" + ], + "mAssetSupply": "197450256733435387483367155" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "382718168689832825454592", + "533621193921388288671744", + "500538751384883646431232" + ], + "expectedQty": "1425194863559199623631771", + "swapFee": "855630296313307758834", + "reserves": [ + "20438932198890999601951655", + "125986575333365709483062609", + "50229501788849590120617454" + ], + "mAssetSupply": "196025061869876187859735384" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "747514818472566562226176", + "357672899337682732187648", + "1937106698810594860990464" + ], + "expectedQty": "3070107675458910301375914", + "swapFee": "1843170507579894117295", + "reserves": [ + "19691417380418433039725479", + "125628902434028026750874961", + "48292395090038995259626990" + ], + "mAssetSupply": "192954954194417277558359470" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "14896322500870474301440", + "expectedQty": "15071218766316761674490", + "swapFee": "8937793500522284580", + "reserves": [ + "19691417380418433039725479", + "125613831215261709989200471", + "48292395090038995259626990" + ], + "mAssetSupply": "192940066809709907606342610" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "3449242533760689242112", + "6054220201331240468480", + "5284392636693539192832" + ], + "expectedQty": "14858669552384577637180", + "swapFee": "8920554063869068023", + "reserves": [ + "19687968137884672350483367", + "125607776995060378748731991", + "48287110697402301720434158" + ], + "mAssetSupply": "192925208140157523028705430" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "248752765486679818240", + "outputIndex": 1, + "expectedQty": "261192626980141019267", + "swapFee": "154896854467689879", + "reserves": [ + "19688216890650159030301607", + "125607515802433398607712724", + "48287110697402301720434158" + ], + "mAssetSupply": "192925208295054377496395309", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mintMulti", + "inputQtys": [ + "80523627497467733344256", + "138799863796589924450304", + "44845462385618092032" + ], + "expectedQty": "220713343382701384766370", + "reserves": [ + "19768740518147626763645863", + "125746315666229988532163028", + "48287155542864687338526190" + ], + "mAssetSupply": "193145921638437078881161679" + }, + { + "type": "redeemMasset", + "inputQty": "28192523515523447652352", + "expectedQtys": [ + "2884676404239956628974", + "18349040971502018681849", + "7046114955805916560311" + ], + "redemptionFee": "8457757054657034295", + "reserves": [ + "19765855841743386807016889", + "125727966625258486513481179", + "48280109427908881421965879" + ], + "mAssetSupply": "193117737572678610090543622" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "5374039156667631796224", + "expectedQty": "5575988224400555008909", + "reserves": [ + "19771229880900054438813113", + "125727966625258486513481179", + "48280109427908881421965879" + ] + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "172927718080573698211840", + "expectedQty": "172349836472689822110144", + "swapFee": "103756630848344218927", + "reserves": [ + "19771229880900054438813113", + "125727966625258486513481179", + "48107759591436191599855735" + ], + "mAssetSupply": "192950489599453285291559618" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "601739688607594984767488", + "outputIndex": 0, + "expectedQty": "571715999122323028773504", + "swapFee": "356627860396305016511", + "reserves": [ + "19199513881777731410039609", + "126329706313866081498248667", + "48107759591436191599855735" + ], + "mAssetSupply": "192950846227313681596576129", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "615569945180152396775424", + "expectedQty": "623023415161539283298426", + "swapFee": "369341967108091438065", + "reserves": [ + "19199513881777731410039609", + "125706682898704542214950241", + "48107759591436191599855735" + ], + "mAssetSupply": "192335645624100637291238770" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "1317335151737440305152", + "expectedQty": "1333227664737237105578", + "swapFee": "790401091042464183", + "reserves": [ + "19199513881777731410039609", + "125705349671039804977844663", + "48107759591436191599855735" + ], + "mAssetSupply": "192334329079349990893397801" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "525110721417530243547136", + "expectedQty": "518520963978170774042047", + "reserves": [ + "19199513881777731410039609", + "126230460392457335221391799", + "48107759591436191599855735" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "3828773534935542784", + "3667985176692135424", + "1298570140267583232" + ], + "expectedQty": "8906414860840395213", + "swapFee": "5347057150794713", + "reserves": [ + "19199510053004196474496825", + "126230456724472158529256375", + "48107758292866051332272503" + ], + "mAssetSupply": "192852841136913300827044635" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "144662979664033171374080", + "expectedQty": "138958731803955397000599", + "swapFee": "86797787798419902824", + "reserves": [ + "19060551321200241077496226", + "126230456724472158529256375", + "48107758292866051332272503" + ], + "mAssetSupply": "192708264955037066075573379" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "3767730539324791324672", + "2425885780836030611456", + "844635097885465378816" + ], + "expectedQty": "7163299491820419206026", + "swapFee": "4300560031110918074", + "reserves": [ + "19056783590660916286171554", + "126228030838691322498644919", + "48106913657768165866893687" + ], + "mAssetSupply": "192701101655545245656367353" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "1535011391239085564624896", + "expectedQty": "1592842061880202693695221", + "reserves": [ + "20591794981900001850796450", + "126228030838691322498644919", + "48106913657768165866893687" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "142395575716171284480", + "366880022260726235136", + "647866109540431691776" + ], + "expectedQty": "1159676218310937062886", + "swapFee": "696223465065601598", + "reserves": [ + "20591652586324285679511970", + "126227663958669061772409783", + "48106265791658625435201911" + ], + "mAssetSupply": "194292784041207137412999688" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "24893216723573307080704", + "expectedQty": "25759320150718190590430", + "reserves": [ + "20616545803047858986592674", + "126227663958669061772409783", + "48106265791658625435201911" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "2234493118328200474132480", + "120925954407521193033728", + "458597294891167219974144" + ], + "expectedQty": "2884083676094829859137065", + "reserves": [ + "22851038921376059460725154", + "126348589913076582965443511", + "48564863086549792655176055" + ], + "mAssetSupply": "197202627037452685462727183" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "6518916471669208907776", + "expectedQty": "6703167384713496455947", + "reserves": [ + "22857557837847728669632930", + "126348589913076582965443511", + "48564863086549792655176055" + ] + }, + { + "type": "redeemMasset", + "inputQty": "61007194112337164", + "expectedQtys": [ + "7068920744567137", + "39074522948574646", + "15019153426843082" + ], + "redemptionFee": "18302158233701", + "reserves": [ + "22857557830778807925065793", + "126348589874002060016868865", + "48564863071530639228332973" + ], + "mAssetSupply": "197209330143848507005079667" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "2309911178741170023956480", + "outputIndex": 1, + "expectedQty": "2338894430356067282552484", + "swapFee": "1389649389844459603960", + "reserves": [ + "22857557830778807925065793", + "124009695443645992734316381", + "50874774250271809252289453" + ], + "mAssetSupply": "197210719793238351464683627", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mintMulti", + "inputQtys": [ + "7498569197300446396416", + "14916951989473018642432", + "14400311648058785923072" + ], + "expectedQty": "36899913842365337276365", + "reserves": [ + "22865056399976108371462209", + "124024612395635465752958813", + "50889174561919868038212525" + ], + "mAssetSupply": "197247619707080716801959992" + }, + { + "type": "mintMulti", + "inputQtys": [ + "11953080784808140800", + "24052091047745671168", + "9481633476971802624" + ], + "expectedQty": "45590230092714394049", + "reserves": [ + "22865068353056893179603009", + "124024636447726513498629981", + "50889184043553345010015149" + ], + "mAssetSupply": "197247665297310809516354041" + }, + { + "type": "redeemMasset", + "inputQty": "278159588807231198042521", + "expectedQtys": [ + "32234754009120761942647", + "174847657799746161413577", + "71742638335454873616304" + ], + "redemptionFee": "83447876642169359412", + "reserves": [ + "22832833599047772417660362", + "123849788789926767337216404", + "50817441405217890136398845" + ], + "mAssetSupply": "196969589156380220487670932" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "191214260330344218624", + "2559894310380626247680", + "3618287198983879655424" + ], + "expectedQty": "6355985028411342339939", + "swapFee": "3815880545374029821", + "reserves": [ + "22832642384787442073441738", + "123847228895616386710968724", + "50813823118018906256743421" + ], + "mAssetSupply": "196963233171351809145330993" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "4429036386926118400", + "expectedQty": "4472039208317254361", + "swapFee": "2657421832155671", + "reserves": [ + "22832642384787442073441738", + "123847224423577178393714363", + "50813823118018906256743421" + ], + "mAssetSupply": "196963228744972844051368264" + }, + { + "type": "redeemMasset", + "inputQty": "253612299395363714682060", + "expectedQtys": [ + "29390774012404550049836", + "159419384044751773015112", + "65408881144787166943787" + ], + "redemptionFee": "76083689818609114404", + "reserves": [ + "22803251610775037523391902", + "123687805039532426620699251", + "50748414236874119089799634" + ], + "mAssetSupply": "196709692529267298945800608" + }, + { + "type": "mintMulti", + "inputQtys": [ + "4627586597759786418176", + "161500548438174629625856", + "674294475223789364838400" + ], + "expectedQty": "840233104180030226525875", + "reserves": [ + "22807879197372797309810078", + "123849305587970601250325107", + "51422708712097908454638034" + ], + "mAssetSupply": "197549925633447329172326483" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "77874452660694080815104", + "151300975193540830167040", + "298455204338878939922432" + ], + "expectedQty": "528820798434770687051248", + "swapFee": "317482968842167712858", + "reserves": [ + "22730004744712103228994974", + "123698004612777060420158067", + "51124253507759029514715602" + ], + "mAssetSupply": "197021104835012558485275235" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "7035777124156391745912832", + "expectedQty": "7009752869007740652433052", + "swapFee": "4221466274493835047547", + "reserves": [ + "22730004744712103228994974", + "123698004612777060420158067", + "44114500638751288862282550" + ], + "mAssetSupply": "189989549177130660574409950" + }, + { + "type": "redeemMasset", + "inputQty": "991835641395608576", + "expectedQtys": [ + "118625817071832811", + "645568579160095557", + "230229546441480273" + ], + "redemptionFee": "297550692418682", + "reserves": [ + "22730004626086286157162163", + "123698003967208481260062510", + "44114500408521742420802277" + ], + "mAssetSupply": "189989548185592569871220056" + }, + { + "type": "mintMulti", + "inputQtys": [ + "24116002100695804149760", + "27785479014054363136000", + "13195791438577240375296" + ], + "expectedQty": "65501051594935634700211", + "reserves": [ + "22754120628186981961311923", + "123725789446222535623198510", + "44127696199960319661177573" + ], + "mAssetSupply": "190055049237187505505920267" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "1243160615908666194788352", + "expectedQty": "1274907852058787182687320", + "reserves": [ + "23997281244095648156100275", + "123725789446222535623198510", + "44127696199960319661177573" + ] + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "271964305953238560", + "outputIndex": 1, + "expectedQty": "281326947203372763", + "swapFee": "167121637593365", + "reserves": [ + "23997281516059954109338835", + "123725789164895588419825747", + "44127696199960319661177573" + ], + "mAssetSupply": "191329957089413414326200952", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mintMulti", + "inputQtys": [ + "643042238879134392516608", + "683037785086497369620480", + "520531587766341139955712" + ], + "expectedQty": "1857059322774662119470339", + "reserves": [ + "24640323754939088501855443", + "124408826949982085789446227", + "44648227787726660801133285" + ], + "mAssetSupply": "193187016412188076445671291" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "232125315218077777920", + "36600084372492824576", + "380146737641576988672" + ], + "expectedQty": "655567260423211153547", + "swapFee": "393576502155219824", + "reserves": [ + "24640091629623870424077523", + "124408790349897713296621651", + "44647847640989019224144613" + ], + "mAssetSupply": "193186360844927653234517744" + }, + { + "type": "redeemMasset", + "inputQty": "55404002879060275573555", + "expectedQtys": [ + "7064422942213866544836", + "35668548882515194099158", + "12800734832343917823754" + ], + "redemptionFee": "16621200863718082672", + "reserves": [ + "24633027206681656557532687", + "124373121801015198102522493", + "44635046906156675306320859" + ], + "mAssetSupply": "193130973463249456677026861" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "537466897219950221459456", + "886986723752043782078464", + "546521941852230741131264" + ], + "expectedQty": "1976867797497741312766897", + "swapFee": "1186832778165544114128", + "reserves": [ + "24095560309461706336073231", + "123486135077263154320444029", + "44088524964304444565189595" + ], + "mAssetSupply": "191154105665751715364259964" + }, + { + "type": "redeemMasset", + "inputQty": "112812560514452689204019", + "expectedQtys": [ + "14216102560390927568687", + "72855394873524659610802", + "26011721021602161177868" + ], + "redemptionFee": "33843768154335806761", + "reserves": [ + "24081344206901315408504544", + "123413279682389629660833227", + "44062513243282842404011727" + ], + "mAssetSupply": "191041326949005417010862706" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "278085790712579257008128", + "expectedQty": "275174068559605859923412", + "reserves": [ + "24081344206901315408504544", + "123691365473102208917841355", + "44062513243282842404011727" + ] + }, + { + "type": "redeemMasset", + "inputQty": "156567397198455662182", + "expectedQtys": [ + "19701501216319734941", + "101194749195860717527", + "36048554881245329375" + ], + "redemptionFee": "46970219159536698", + "reserves": [ + "24081324505400099088769603", + "123691264278353013057123828", + "44062477194727961158682352" + ], + "mAssetSupply": "191316344497138043574660634" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "1101955015177994588127232", + "expectedQty": "1106738128331598116930417", + "reserves": [ + "24081324505400099088769603", + "123691264278353013057123828", + "45164432209905955746809584" + ] + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "543521269508089522946048", + "outputIndex": 0, + "expectedQty": "524535699252317978427756", + "swapFee": "322728973720647500158", + "reserves": [ + "23556788806147781110341847", + "124234785547861102580069876", + "45164432209905955746809584" + ], + "mAssetSupply": "192423405354443362339091209", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "26165856452340512456704", + "expectedQty": "26042152206846094632273", + "swapFee": "15699513871404307474", + "reserves": [ + "23556788806147781110341847", + "124234785547861102580069876", + "45138390057699109652177311" + ], + "mAssetSupply": "192397255197504893230941979" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "36732246149292240", + "expectedQty": "35800882160596935", + "swapFee": "22039347689575", + "reserves": [ + "23556788770346898949744912", + "124234785547861102580069876", + "45138390057699109652177311" + ], + "mAssetSupply": "192397255160794686429339314" + }, + { + "type": "mintMulti", + "inputQtys": [ + "1885271271359793", + "2659865781568191", + "2117888242043203" + ], + "expectedQty": "6691476229082036", + "reserves": [ + "23556788772232170221104705", + "124234785550520968361638067", + "45138390059816997894220514" + ], + "mAssetSupply": "192397255167486162658421350" + }, + { + "type": "mintMulti", + "inputQtys": [ + "34783243995196", + "39474574606074", + "59718119271909" + ], + "expectedQty": "134688460620653", + "reserves": [ + "23556788772266953465099901", + "124234785550560442936244141", + "45138390059876716013492423" + ], + "mAssetSupply": "192397255167620851119042003" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "6289098769085096787968", + "expectedQty": "6222351450297809201109", + "reserves": [ + "23556788772266953465099901", + "124241074649329528033032109", + "45138390059876716013492423" + ] + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "102820006238722507931648", + "expectedQty": "105420071476023627391679", + "reserves": [ + "23659608778505675973031549", + "124241074649329528033032109", + "45138390059876716013492423" + ] + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "42817550794643", + "expectedQty": "42995774189132", + "reserves": [ + "23659608778505675973031549", + "124241074649329528033032109", + "45138390059919533564287066" + ] + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "734394212717635699736576", + "expectedQty": "730803149119203368893280", + "swapFee": "440636527630581419841", + "reserves": [ + "23659608778505675973031549", + "124241074649329528033032109", + "44407586910800330195393786" + ], + "mAssetSupply": "191774944014400163211507188" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "11632523008896446", + "outputIndex": 0, + "expectedQty": "11391360403937239", + "swapFee": "7010653163301", + "reserves": [ + "23659608767114315569094310", + "124241074649329528033032109", + "44407586922432853204290232" + ], + "mAssetSupply": "191774944014407173864670489", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "5466650315957078023208960", + "expectedQty": "5406488478333905303675761", + "reserves": [ + "23659608767114315569094310", + "129707724965286606056241069", + "44407586922432853204290232" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "975891376160242009112576", + "211568264272284510846976", + "423291921270578054430720" + ], + "expectedQty": "1638308415214514688347315", + "swapFee": "983575194245255966588", + "reserves": [ + "22683717390954073559981734", + "129496156701014321545394093", + "43984295001162275149859512" + ], + "mAssetSupply": "195543124077526564479998935" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "137964971556981507620864", + "165730027284334062338048", + "205711749916844795887616" + ], + "expectedQty": "512658414357127420216308", + "swapFee": "307779716444142937892", + "reserves": [ + "22545752419397092052360870", + "129330426673729987483056045", + "43778583251245430353971896" + ], + "mAssetSupply": "195030465663169437059782627" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "27608055425964269568", + "expectedQty": "27922949073556900504", + "swapFee": "16564833255578561", + "reserves": [ + "22545752419397092052360870", + "129330398750780913926155541", + "43778583251245430353971896" + ], + "mAssetSupply": "195030438071678844351091620" + }, + { + "type": "mintMulti", + "inputQtys": [ + "186480788404985976061952", + "121632651421857035059200", + "122436597774593854275584" + ], + "expectedQty": "435312487240093024716192", + "reserves": [ + "22732233207802078028422822", + "129452031402202770961214741", + "43901019849020024208247480" + ], + "mAssetSupply": "195465750558918937375807812" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "2203475889073234716393472", + "expectedQty": "2214170899848379758798466", + "reserves": [ + "22732233207802078028422822", + "129452031402202770961214741", + "46104495738093258924640952" + ] + }, + { + "type": "redeemMasset", + "inputQty": "18235840092921913147392", + "expectedQtys": [ + "2096404147995418276981", + "11938280463569572932511", + "4251832858788491570771" + ], + "redemptionFee": "5470752027876573944", + "reserves": [ + "22730136803654082610145841", + "129440093121739201388282230", + "46100243905234470433070181" + ], + "mAssetSupply": "197661691089426423098032830" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "6675015015855353535397888", + "expectedQty": "6405066732648079389350072", + "swapFee": "4005009009513212121238", + "reserves": [ + "16325070071006003220795769", + "129440093121739201388282230", + "46100243905234470433070181" + ], + "mAssetSupply": "190990681082580582774756180" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "1608121161123660562432", + "136935085967713009664", + "1437458709639214399488" + ], + "expectedQty": "3278863044994023649785", + "swapFee": "1968498926352225525", + "reserves": [ + "16323461949844879560233337", + "129439956186653233675272566", + "46098806446524831218670693" + ], + "mAssetSupply": "190987402219535588751106395" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "711308309145766592512", + "expectedQty": "671976015043467183563", + "swapFee": "426784985487459955", + "reserves": [ + "16322789973829836093049774", + "129439956186653233675272566", + "46098806446524831218670693" + ], + "mAssetSupply": "190986691338011428471973838" + }, + { + "type": "redeemMasset", + "inputQty": "141139202294488626102272", + "expectedQtys": [ + "12058926223209590133086", + "95627456120731768313060", + "34056806882152732935672" + ], + "redemptionFee": "42341760688346587830", + "reserves": [ + "16310731047606626502916688", + "129344328730532501906959506", + "46064749639642678485735021" + ], + "mAssetSupply": "190845594477477628192459396" + }, + { + "type": "mintMulti", + "inputQtys": [ + "358327061125055224217600", + "304917108185949754359808", + "188381221337510296158208" + ], + "expectedQty": "868030361074708126953267", + "reserves": [ + "16669058108731681727134288", + "129649245838718451661319314", + "46253130860980188781893229" + ], + "mAssetSupply": "191713624838552336319412663" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "93418188332357582848", + "51296368747429289984", + "14763616991859445760" + ], + "expectedQty": "163963067248508446663", + "swapFee": "98436902490599427", + "reserves": [ + "16668964690543349369551440", + "129649194542349704232029330", + "46253116097363196922447469" + ], + "mAssetSupply": "191713460875485087810966000" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "15780983155492266541318144", + "expectedQty": "15522115077370192425170554", + "reserves": [ + "16668964690543349369551440", + "145430177697841970773347474", + "46253116097363196922447469" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "43297856535420880", + "38814520454563232", + "32066853851961932" + ], + "expectedQty": "116711863230847056", + "reserves": [ + "16668964733841205904972320", + "145430177736656491227910706", + "46253116129430050774409401" + ], + "mAssetSupply": "207235576069567143466983610" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "673828044908436914176", + "expectedQty": "720697676702120212209", + "reserves": [ + "16669638561886114341886496", + "145430177736656491227910706", + "46253116129430050774409401" + ] + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "10994011191464914944", + "outputIndex": 2, + "expectedQty": "10722942220530527334", + "swapFee": "6479517167871273", + "reserves": [ + "16669638561886114341886496", + "145430188730667682692825650", + "46253105406487830243882067" + ], + "mAssetSupply": "207236296773723362755067092", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mintMulti", + "inputQtys": [ + "129632644253107388416", + "53856334996977754112", + "55708724567966187520" + ], + "expectedQty": "247622320465794559813", + "reserves": [ + "16669768194530367449274912", + "145430242587002679670579762", + "46253161115212398210069587" + ], + "mAssetSupply": "207236544396043828549626905" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "1886966814041582241579008", + "expectedQty": "1898177734903155254557692", + "reserves": [ + "16669768194530367449274912", + "145430242587002679670579762", + "48140127929253980451648595" + ] + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "194874379901818770554880", + "expectedQty": "193701918057882209040451", + "swapFee": "116924627941091262332", + "reserves": [ + "16669768194530367449274912", + "145430242587002679670579762", + "47946426011196098242608144" + ], + "mAssetSupply": "208939964675673106124892049" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "496229948269569966080", + "outputIndex": 2, + "expectedQty": "527555287786623070779", + "swapFee": "318466455011129418", + "reserves": [ + "16670264424478637019240992", + "145430242587002679670579762", + "47945898455908311619537365" + ], + "mAssetSupply": "208939964994139561136021467", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "220189216922474", + "expectedQty": "221401173900910", + "reserves": [ + "16670264424478637019240992", + "145430242587002679670579762", + "47945898456128500836459839" + ] + }, + { + "type": "redeemMasset", + "inputQty": "24214540358072732876", + "expectedQtys": [ + "1931376277678457992", + "16849194076196841174", + "5554895143365004333" + ], + "redemptionFee": "7264362107421819", + "reserves": [ + "16670262493102359340783000", + "145430225737808603473738588", + "47945892901233357471455506" + ], + "mAssetSupply": "208939940787084966344611320" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "2281594143733344987250688", + "expectedQty": "2112112556038437790873505", + "swapFee": "1368956486240006992350", + "reserves": [ + "14558149937063921549909495", + "145430225737808603473738588", + "47945892901233357471455506" + ], + "mAssetSupply": "206659715599837861364352982" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "16745900237045430272", + "expectedQty": "16835922363556844241", + "reserves": [ + "14558149937063921549909495", + "145430225737808603473738588", + "47945909647133594516885778" + ] + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "298896129990788418371584", + "expectedQty": "273378118897140910500045", + "swapFee": "179337677994473051022", + "reserves": [ + "14284771818166780639409450", + "145430225737808603473738588", + "47945909647133594516885778" + ], + "mAssetSupply": "206361015643447430975876661" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "76034405327281537024", + "expectedQty": "83214355943398349410", + "reserves": [ + "14284847852572107920946474", + "145430225737808603473738588", + "47945909647133594516885778" + ] + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "497385467553494111092736", + "expectedQty": "542798946591730003828076", + "reserves": [ + "14782233320125602032039210", + "145430225737808603473738588", + "47945909647133594516885778" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "7345587902620", + "17014689699397", + "13157954783255" + ], + "expectedQty": "37907951264259", + "reserves": [ + "14782233320132947619941830", + "145430225737825618163437985", + "47945909647146752471669033" + ], + "mAssetSupply": "206903897804433012329318406" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "10413330915722528", + "16613421995496938", + "10891103928107362" + ], + "expectedQty": "38573955905023520", + "swapFee": "23158268504116", + "reserves": [ + "14782233309719616704219302", + "145430225721212196167941047", + "47945909636255648543561671" + ], + "mAssetSupply": "206903897765859056424294886" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "22243760455590984286208", + "1769170735086597849481216", + "769312406197923714433024" + ], + "expectedQty": "2532716104428254896013809", + "swapFee": "1520541987849662735249", + "reserves": [ + "14759989549264025719933094", + "143661054986125598318459831", + "47176597230057724829128647" + ], + "mAssetSupply": "204371181661430801528281077" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "42144821121683048890368", + "outputIndex": 0, + "expectedQty": "38974115810027410480873", + "swapFee": "25426007801123583447", + "reserves": [ + "14721015433453998309452221", + "143661054986125598318459831", + "47218742051179407878019015" + ], + "mAssetSupply": "204371207087438602651864524", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "1021735042320763243724800", + "expectedQty": "1015228757630195039255222", + "swapFee": "613041025392457946234", + "reserves": [ + "14721015433453998309452221", + "143661054986125598318459831", + "46203513293549212838763793" + ], + "mAssetSupply": "203350085086143231866085958" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "271309683578506649272320", + "236744902644891729788928", + "265657562740111230107648" + ], + "expectedQty": "794660334911341393106890", + "swapFee": "477082450417055068905", + "reserves": [ + "14449705749875491660179901", + "143424310083480706588670903", + "45937855730809101608656145" + ], + "mAssetSupply": "202555424751231890472979068" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "465379503410490310656", + "outputIndex": 0, + "expectedQty": "429452078725417525129", + "swapFee": "280971957099851223", + "reserves": [ + "14449276297796766242654772", + "143424310083480706588670903", + "45938321110312512098966801" + ], + "mAssetSupply": "202555425032203847572830291", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mintMulti", + "inputQtys": [ + "265946616063508594294784", + "132579077081539008266240", + "84992735651154171527168" + ], + "expectedQty": "504915540349661204383872", + "reserves": [ + "14715222913860274836949556", + "143556889160562245596937143", + "46023313845963666270493969" + ], + "mAssetSupply": "203060340572553508777214163" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "738165512006200696242176", + "expectedQty": "732980008085845585350371", + "swapFee": "442899307203720417745", + "reserves": [ + "14715222913860274836949556", + "143556889160562245596937143", + "45290333837877820685143598" + ], + "mAssetSupply": "202322617959854511801389732" + }, + { + "type": "redeemMasset", + "inputQty": "1574294650908655694643", + "expectedQtys": [ + "114466425576788243937", + "1116696910765450325246", + "352303370322600706490" + ], + "redemptionFee": "472288395272596708", + "reserves": [ + "14715108447434698048705619", + "143555772463651480146611897", + "45289981534507498084437108" + ], + "mAssetSupply": "202321044137491998418291797" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "97502915131379875315712", + "expectedQty": "95586226407451561585310", + "reserves": [ + "14715108447434698048705619", + "143653275378782860021927609", + "45289981534507498084437108" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "2340921719547943424", + "5601987319444964352", + "1049141173789568000" + ], + "expectedQty": "9092298111932511145", + "reserves": [ + "14715110788356417596649043", + "143653280980770179466891961", + "45289982583648671874005108" + ], + "mAssetSupply": "202416639456197561912388252" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "110035510351834629799936", + "609291315437495274962944", + "687692681080793070567424" + ], + "expectedQty": "1409328481630236722829043", + "swapFee": "846104751829239577443", + "reserves": [ + "14605075278004582966849107", + "143043989665332684191929017", + "44602289902567878803437684" + ], + "mAssetSupply": "201007310974567325189559209" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "4666605286659602", + "7136412485070409", + "3120256466028914" + ], + "expectedQty": "15211834721922760", + "swapFee": "9132580381382", + "reserves": [ + "14605075273337977680189505", + "143043989658196271706858608", + "44602289899447622337408770" + ], + "mAssetSupply": "201007310959355490467636449" + }, + { + "type": "redeemMasset", + "inputQty": "26921720366248047411", + "expectedQtys": [ + "1955529838367716435", + "19152711282934355870", + "5971972559232317409" + ], + "redemptionFee": "8076516109874414", + "reserves": [ + "14605073317808139312473070", + "143043970505484988772502738", + "44602283927475063105091361" + ], + "mAssetSupply": "201007284045711640329463452" + }, + { + "type": "redeemMasset", + "inputQty": "8713736716838534276710", + "expectedQtys": [ + "632945143239108503913", + "6199146312445398485884", + "1932944694967394817234" + ], + "redemptionFee": "2614121015051560283", + "reserves": [ + "14604440372664900203969157", + "143037771359172543374016854", + "44600350982780095710274127" + ], + "mAssetSupply": "200998572923115816846747025" + }, + { + "type": "mintMulti", + "inputQtys": [ + "65669629145635627204608", + "57029201989070246379520", + "31268014722668677824512" + ], + "expectedQty": "158777524819006920383505", + "reserves": [ + "14670110001810535831173765", + "143094800561161613620396374", + "44631618997502764388098639" + ], + "mAssetSupply": "201157350447934823767130530" + }, + { + "type": "mintMulti", + "inputQtys": [ + "11323733866909794304000", + "4723699552134717505536", + "19884836397991296237568" + ], + "expectedQty": "36960896426768646860779", + "reserves": [ + "14681433735677445625477765", + "143099524260713748337901910", + "44651503833900755684336207" + ], + "mAssetSupply": "201194311344361592413991309" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "26599145524374756392960", + "210083551806253141327872", + "170018800337186950479872" + ], + "expectedQty": "406062621743758995382727", + "swapFee": "243783843352266757284", + "reserves": [ + "14654834590153070869084805", + "142889440708907495196574038", + "44481485033563568733856335" + ], + "mAssetSupply": "200788248722617833418608582" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "2295986012536320672399360", + "686011651658339183493120", + "2234984093387586090827776" + ], + "expectedQty": "5454159609519209036266177", + "swapFee": "3274460441976711448628", + "reserves": [ + "12358848577616750196685445", + "142203429057249156013080918", + "42246500940175982643028559" + ], + "mAssetSupply": "195334089113098624382342405" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "20195733379281988878336", + "10436949002954374905856", + "1216453160781728186368" + ], + "expectedQty": "34043660227589190956401", + "swapFee": "20438459212080763031", + "reserves": [ + "12338652844237468207807109", + "142192992108246201638175062", + "42245284487015200914842191" + ], + "mAssetSupply": "195300045452871035191386004" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "235113962910419217547264", + "expectedQty": "237176345048480475195423", + "reserves": [ + "12338652844237468207807109", + "142192992108246201638175062", + "42480398449925620132389455" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "248818528717340409856", + "199832434000671768576", + "127631227758755151872" + ], + "expectedQty": "602671201647902700472", + "swapFee": "361819812876467500", + "reserves": [ + "12338404025708750867397253", + "142192792275812200966406486", + "42480270818697861377237583" + ], + "mAssetSupply": "195536619126717867763880955" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "15549627328894867603456", + "expectedQty": "15912790103808409000434", + "swapFee": "9329776397336920562", + "reserves": [ + "12338404025708750867397253", + "142176879485708392557406052", + "42480270818697861377237583" + ], + "mAssetSupply": "195521078829165370233198061" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "4098658150672325983338496", + "outputIndex": 2, + "expectedQty": "3951562348820029947700424", + "swapFee": "2400479979760540121118", + "reserves": [ + "12338404025708750867397253", + "146275537636380718540744548", + "38528708469877831429537159" + ], + "mAssetSupply": "195523479309145130773319179", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "4741969501530142720", + "expectedQty": "4620508957295730680", + "reserves": [ + "12338404025708750867397253", + "146275542378350220070887268", + "38528708469877831429537159" + ] + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "540302775639268931928064", + "expectedQty": "476383222641443751577243", + "swapFee": "324181665383561359156", + "reserves": [ + "11862020803067307115820010", + "146275542378350220070887268", + "38528708469877831429537159" + ], + "mAssetSupply": "194983505335680202698480951" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "401713509969295966208", + "expectedQty": "457438314638082449949", + "reserves": [ + "11862422516577276411786218", + "146275542378350220070887268", + "38528708469877831429537159" + ] + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "18918776114720324714496", + "expectedQty": "16601441361750974634091", + "swapFee": "11351265668832194828", + "reserves": [ + "11845821075215525437152127", + "146275542378350220070887268", + "38528708469877831429537159" + ], + "mAssetSupply": "194965055349145789288411232" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "116671692867448921391104", + "expectedQty": "119779193590945030866601", + "swapFee": "70003015720469352834", + "reserves": [ + "11845821075215525437152127", + "146155763184759275040020667", + "38528708469877831429537159" + ], + "mAssetSupply": "194848453659294060836372962" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "4908962755270225942282240", + "expectedQty": "4965186458905800650095054", + "reserves": [ + "11845821075215525437152127", + "146155763184759275040020667", + "43437671225148057371819399" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "604149595463930", + "353811518799418", + "403897635900169" + ], + "expectedQty": "1439777433147868", + "reserves": [ + "11845821075819675032616057", + "146155763185113086558820085", + "43437671225551955007719568" + ], + "mAssetSupply": "199813640119639638919615884" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "697199669845070868119552", + "expectedQty": "608633575833648509189847", + "swapFee": "418319801907042520871", + "reserves": [ + "11237187499986026523426210", + "146155763185113086558820085", + "43437671225551955007719568" + ], + "mAssetSupply": "199116858769596475094017203" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "370947007322180", + "235037894529166", + "338989724414956" + ], + "expectedQty": "998447288960625", + "swapFee": "599428030194", + "reserves": [ + "11237187499615079516104030", + "146155763184878048664290919", + "43437671225212965283304612" + ], + "mAssetSupply": "199116858768598027805056578" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "240012337699769861275648", + "expectedQty": "242154828020420705107185", + "reserves": [ + "11237187499615079516104030", + "146155763184878048664290919", + "43677683562912735144580260" + ] + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "8078223131387890761728", + "expectedQty": "9308628742729366018712", + "reserves": [ + "11245265722746467406865758", + "146155763184878048664290919", + "43677683562912735144580260" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "2433843185937107910656", + "9521000395000860639232", + "8706353445093039407104" + ], + "expectedQty": "20860433395609048960484", + "swapFee": "12523774301946597334", + "reserves": [ + "11242831879560530298955102", + "146146242184483047803651687", + "43668977209467642105173156" + ], + "mAssetSupply": "199347461791965568827221991" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "232626479906768679862272", + "781965904322548838957056", + "672974477185349308121088" + ], + "expectedQty": "1709048445586275551693344", + "swapFee": "1026044694168266290790", + "reserves": [ + "11010205399653761619092830", + "145364276280160498964694631", + "42996002732282292797052068" + ], + "mAssetSupply": "197638413346379293275528647" + }, + { + "type": "redeemMasset", + "inputQty": "534059388197851972711219", + "expectedQtys": [ + "29742899819285373683093", + "392686144332938407459583", + "116149132143911477528445" + ], + "redemptionFee": "160217816459355591813", + "reserves": [ + "10980462499834476245409737", + "144971590135827560557235048", + "42879853600138381319523623" + ], + "mAssetSupply": "197104514175997900658409241" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "351564440438391156244480", + "7362221064356540666871808", + "2851727583078051687170048" + ], + "expectedQty": "10452505927374680764177448", + "swapFee": "6275268717655401699526", + "reserves": [ + "10628898059396085089165257", + "137609369071471019890363240", + "40028126017060329632353575" + ], + "mAssetSupply": "186652008248623219894231793" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "6659110037819550072832", + "7038408404407339188224", + "3845502052127690194944" + ], + "expectedQty": "18403745862843865713885", + "swapFee": "11048876843812606992", + "reserves": [ + "10622238949358265539092425", + "137602330663066612551175016", + "40024280515008201942158631" + ], + "mAssetSupply": "186633604502760376028517908" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "17606246755575353311232", + "outputIndex": 0, + "expectedQty": "14876467109388848270718", + "swapFee": "10285733268786652968", + "reserves": [ + "10607362482248876690821707", + "137619936909822187904486248", + "40024280515008201942158631" + ], + "mAssetSupply": "186633614788493644815170876", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "973279192571090698240", + "expectedQty": "982952823224968939082", + "reserves": [ + "10607362482248876690821707", + "137619936909822187904486248", + "40025253794200773032856871" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "1588654100601764839424", + "10811034291073573715968", + "6295010649307998060544" + ], + "expectedQty": "18713638735527152728736", + "swapFee": "11234924195833791912", + "reserves": [ + "10605773828148274925982283", + "137609125875531114330770280", + "40018958783551465034796327" + ], + "mAssetSupply": "186615884102581342631381222" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "13004871034514995937280", + "5482675591018800218112", + "4878689043779072032768" + ], + "expectedQty": "25247721092137697857746", + "swapFee": "15157727291657613282", + "reserves": [ + "10592768957113759930045003", + "137603643199940095530552168", + "40014080094507685962763559" + ], + "mAssetSupply": "186590636381489204933523476" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "1140081897575476449247232", + "expectedQty": "1109829854758197567299936", + "reserves": [ + "10592768957113759930045003", + "138743725097515571979799400", + "40014080094507685962763559" + ] + }, + { + "type": "redeemMasset", + "inputQty": "2994911013166300056780", + "expectedQtys": [ + "168965393242793501057", + "2213102935217733955003", + "638265103844888656569" + ], + "redemptionFee": "898473303949890017", + "reserves": [ + "10592599991720517136543946", + "138741511994580354245844397", + "40013441829403841074106990" + ], + "mAssetSupply": "187697472223707540150656649" + }, + { + "type": "redeemMasset", + "inputQty": "749168158259433267", + "expectedQtys": [ + "42266194858142726", + "553601173032098931", + "159660133548745831" + ], + "redemptionFee": "224750447477829", + "reserves": [ + "10592599949454322278401220", + "138741511440979181213745466", + "40013441669743707525361159" + ], + "mAssetSupply": "187697471474764132338701211" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "37466990137332350320640", + "expectedQty": "37852940296869164271888", + "reserves": [ + "10592599949454322278401220", + "138741511440979181213745466", + "40050908659881039875681799" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "1053814698577302656", + "10884751550732838912", + "38592043119203680256" + ], + "expectedQty": "50800118124214544115", + "swapFee": "30498369896466606", + "reserves": [ + "10592598895639623701098564", + "138741500556227630480906554", + "40050870067837920672001543" + ], + "mAssetSupply": "187735273614942877288428984" + }, + { + "type": "redeemMasset", + "inputQty": "9499573722863609446", + "expectedQtys": [ + "535834234220369746", + "7018338600145978628", + "2026002070322288120" + ], + "redemptionFee": "2849872116859082", + "reserves": [ + "10592598359805389480728818", + "138741493537889030334927926", + "40050868041835850349713423" + ], + "mAssetSupply": "187735264118219026541678620" + }, + { + "type": "redeemMasset", + "inputQty": "11066203577768661811", + "expectedQtys": [ + "624201768711882445", + "8175773565502169487", + "2360121834225710244" + ], + "redemptionFee": "3319861073330598", + "reserves": [ + "10592597735603620768846373", + "138741485362115464832758439", + "40050865681714016124003179" + ], + "mAssetSupply": "187735253055335309846347407" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "1900744007768848203776", + "expectedQty": "1880270874002371563102", + "swapFee": "1140446404661308922", + "reserves": [ + "10592597735603620768846373", + "138741485362115464832758439", + "40048985410840013752440077" + ], + "mAssetSupply": "187733353451773945659452553" + }, + { + "type": "redeemMasset", + "inputQty": "6299516831427280896", + "expectedQtys": [ + "355334989883897876", + "4654165628504811056", + "1343467030565025543" + ], + "redemptionFee": "1889855049428184", + "reserves": [ + "10592597380268630884948497", + "138741480707949836327947383", + "40048984067372983187414534" + ], + "mAssetSupply": "187733347154146969281599841" + }, + { + "type": "redeemMasset", + "inputQty": "1151659248188237004", + "expectedQtys": [ + "64961303899230410", + "850860952053836591", + "245608714412411199" + ], + "redemptionFee": "345497774456471", + "reserves": [ + "10592597315307326985718087", + "138741479857088884274110792", + "40048983821764268775003335" + ], + "mAssetSupply": "187733346002833218867819308" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "1809171773460974481178624", + "expectedQty": "1787902223121539115166945", + "swapFee": "1085503064076584688707", + "reserves": [ + "10592597315307326985718087", + "138741479857088884274110792", + "38261081598642729659836390" + ], + "mAssetSupply": "185925259732436320971329391" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "1367141399468841921150976", + "outputIndex": 1, + "expectedQty": "1419876879664735123350942", + "swapFee": "829741337938686175635", + "reserves": [ + "10592597315307326985718087", + "137321602977424149150759850", + "39628222998111571580987366" + ], + "mAssetSupply": "185926089473774259657505026", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "274763697309089926217728", + "expectedQty": "267489991076425099103874", + "reserves": [ + "10592597315307326985718087", + "137596366674733239076977578", + "39628222998111571580987366" + ] + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "568130485728319", + "expectedQty": "561966880633176", + "swapFee": "340878291436", + "reserves": [ + "10592597315307326985718087", + "137596366674733239076977578", + "39628222997549604700354190" + ], + "mAssetSupply": "186193579464282895149172017" + }, + { + "type": "redeemMasset", + "inputQty": "182124405819066233651", + "expectedQtys": [ + "10357992722049265528", + "134548885620123140308", + "38750538057667591853" + ], + "redemptionFee": "54637321745719870", + "reserves": [ + "10592586957314604936452559", + "137596232125847618953837270", + "39628184247011547032762337" + ], + "mAssetSupply": "186193397394514397828658236" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "265550462100892155904", + "expectedQty": "272617989836521222965", + "swapFee": "159330277260535293", + "reserves": [ + "10592586957314604936452559", + "137595959507857782432614305", + "39628184247011547032762337" + ], + "mAssetSupply": "186193132003382574197037625" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "2128388850285427409551360", + "outputIndex": 2, + "expectedQty": "2371604881102675752013134", + "swapFee": "1439732235983282398976", + "reserves": [ + "12720975807600032346003919", + "137595959507857782432614305", + "37256579365908871280749203" + ], + "mAssetSupply": "186194571735618557479436601", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "36284414013794616", + "expectedQty": "36736671370174484", + "reserves": [ + "12720975807600032346003919", + "137595959507857782432614305", + "37256579402193285294543819" + ] + }, + { + "type": "redeemMasset", + "inputQty": "30220116725792627", + "expectedQtys": [ + "2064045376303421", + "22325669690414081", + "6045076385259344" + ], + "redemptionFee": "9066035017737", + "reserves": [ + "12720975805535986969700498", + "137595959485532112742200224", + "37256579396148208909284475" + ], + "mAssetSupply": "186194571742144178158836195" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "171377299392000675545088", + "expectedQty": "167382007042748263711312", + "reserves": [ + "12720975805535986969700498", + "137767336784924113417745312", + "37256579396148208909284475" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "59189284077529286574080", + "35610399390954711678976", + "51181622456219582070784" + ], + "expectedQty": "152170636682066350712937", + "swapFee": "91357196327036032046", + "reserves": [ + "12661786521458457683126418", + "137731726385533158706066336", + "37205397773691989327213691" + ], + "mAssetSupply": "186209783112504860071834570" + }, + { + "type": "redeemMasset", + "inputQty": "5859906754038880586956", + "expectedQtys": [ + "398339056353291664269", + "4333031979756005043682", + "1170479617177610618256" + ], + "redemptionFee": "1757972026211664176", + "reserves": [ + "12661388182402104391462149", + "137727393353553402701022654", + "37204227294074811716595435" + ], + "mAssetSupply": "186203924963722847402911790" + }, + { + "type": "redeemMasset", + "inputQty": "527670150267622195", + "expectedQtys": [ + "35869449557116554", + "390178842742911893", + "105398802644019124" + ], + "redemptionFee": "158301045080286", + "reserves": [ + "12661388146532654834345595", + "137727392963374559958110761", + "37204227188676009072576311" + ], + "mAssetSupply": "186203924436210998180369881" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "1679055873906485", + "expectedQty": "1514134888462752", + "swapFee": "1007433524343", + "reserves": [ + "12661388145018519945882843", + "137727392963374559958110761", + "37204227188676009072576311" + ], + "mAssetSupply": "186203924434532949739987739" + }, + { + "type": "mintMulti", + "inputQtys": [ + "62527561151743684247552", + "61749574621747975553024", + "78574485977984990707712" + ], + "expectedQty": "209132034231608943021562", + "reserves": [ + "12723915706170263630130395", + "137789142537996307933663785", + "37282801674653994063284023" + ], + "mAssetSupply": "186413056468764558683009301" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "54420853605259", + "expectedQty": "55101019103770", + "reserves": [ + "12723915706170263630130395", + "137789142537996307933663785", + "37282801674708414916889282" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "9223653704116725612544", + "6060970513969569595392", + "1707627863089975918592" + ], + "expectedQty": "17862458131439016946410", + "swapFee": "10723909224398048997", + "reserves": [ + "12714692052466146904517851", + "137783081567482338364068393", + "37281094046845324940970690" + ], + "mAssetSupply": "186395194010688220685166661" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "23416337453579751424", + "outputIndex": 2, + "expectedQty": "25596520847432268936", + "swapFee": "15559233084654334", + "reserves": [ + "12714715468803600484269275", + "137783081567482338364068393", + "37281068450324477508701754" + ], + "mAssetSupply": "186395194026247453769820995", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mintMulti", + "inputQtys": [ + "3199485039720062875860992", + "3126617591229349441306624", + "3235418870857564111765504" + ], + "expectedQty": "9812041672760521975392455", + "reserves": [ + "15914200508523663360130267", + "140909699158711687805375017", + "40516487321182041620467258" + ], + "mAssetSupply": "196207235699007975745213450" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "14339880516612903665664", + "outputIndex": 0, + "expectedQty": "13117664495767024267823", + "swapFee": "8441045564329663719", + "reserves": [ + "15901082844027896335862444", + "140924039039228300709040681", + "40516487321182041620467258" + ], + "mAssetSupply": "196207244140053540074877169", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "959513594705472582057984", + "expectedQty": "968425382293750617751782", + "reserves": [ + "15901082844027896335862444", + "140924039039228300709040681", + "41476000915887514202525242" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "188551479410463327911936", + "119646851815502057046016", + "353325796428990832967680" + ], + "expectedQty": "676154912237498066335294", + "swapFee": "405936509248047668402", + "reserves": [ + "15712531364617433007950508", + "140804392187412798651994665", + "41122675119458523369557562" + ], + "mAssetSupply": "196499514610109792626293657" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "104707872873455058944", + "92147040989020422144", + "196757176359032881152" + ], + "expectedQty": "401357561058435126830", + "swapFee": "240959112102322469", + "reserves": [ + "15712426656744559552891564", + "140804300040371809631572521", + "41122478362282164336676410" + ], + "mAssetSupply": "196499113252548734191166827" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "2029694896357080039424", + "expectedQty": "2010049228596290608843", + "swapFee": "1217816937814248023", + "reserves": [ + "15712426656744559552891564", + "140804300040371809631572521", + "41120468313053568046067567" + ], + "mAssetSupply": "196497084775469314925375426" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "72019876506965580447744", + "expectedQty": "72678087200518571030627", + "reserves": [ + "15712426656744559552891564", + "140804300040371809631572521", + "41192488189560533626515311" + ] + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "3897970247062121", + "expectedQty": "3970888979032726", + "swapFee": "2338782148237", + "reserves": [ + "15712426656744559552891564", + "140804300036400920652539795", + "41192488189560533626515311" + ], + "mAssetSupply": "196569762858774202031492169" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "367398515606676176896", + "1042550524026967949312", + "805985332945484513280" + ], + "expectedQty": "2230498690038525750269", + "swapFee": "1339102675628492545", + "reserves": [ + "15712059258228952876714668", + "140803257485876893684590483", + "41191682204227588142002031" + ], + "mAssetSupply": "196567532360084163505741900" + }, + { + "type": "redeemMasset", + "inputQty": "10239206797322779033", + "expectedQtys": [ + "818195956975182198", + "7332244240585035948", + "2145031869253815840" + ], + "redemptionFee": "3071762039196833", + "reserves": [ + "15712058440032995901532470", + "140803250153632653099554535", + "41191680059195718888186191" + ], + "mAssetSupply": "196567522123949128222159700" + }, + { + "type": "redeemMasset", + "inputQty": "82102593227887017040281", + "expectedQtys": [ + "6560665407578200509031", + "58793252079806912755587", + "17199836130690116719741" + ], + "redemptionFee": "24630777968366105112", + "reserves": [ + "15705497774625417701023439", + "140744456901552846186798948", + "41174480223065028771466450" + ], + "mAssetSupply": "196485444161499209571224531" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "121128655704917069004800", + "outputIndex": 1, + "expectedQty": "124507473585207965344558", + "swapFee": "73335736469623852616", + "reserves": [ + "15705497774625417701023439", + "140619949427967638221454390", + "41295608878769945840471250" + ], + "mAssetSupply": "196485517497235679195077147", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemMasset", + "inputQty": "131023112817401400184012", + "expectedQtys": [ + "10469809164663248967095", + "93741953065255981614205", + "27529031585221850880340" + ], + "redemptionFee": "39306933845220420055", + "reserves": [ + "15695027965460754452056344", + "140526207474902382239840185", + "41268079847184723989590910" + ], + "mAssetSupply": "196354533691352123015313190" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "87709214396574307713024", + "39214347028967213498368", + "95215479223134594269184" + ], + "expectedQty": "228717715986361969678884", + "swapFee": "137313017402258536929", + "reserves": [ + "15607318751064180144343320", + "140486993127873415026341817", + "41172864367961589395321726" + ], + "mAssetSupply": "196125815975365761045634306" + }, + { + "type": "mintMulti", + "inputQtys": [ + "7180409429646638055424", + "9119054794102968156160", + "5552864265265614946304" + ], + "expectedQty": "22261034329460202750743", + "reserves": [ + "15614499160493826782398744", + "140496112182667517994497977", + "41178417232226855010268030" + ], + "mAssetSupply": "196148077009695221248385049" + }, + { + "type": "redeemMasset", + "inputQty": "118436878196689", + "expectedQtys": [ + "9425418610255", + "84808014450158", + "24856629478293" + ], + "redemptionFee": "35531063459", + "reserves": [ + "15614499160484401363788489", + "140496112182582709980047819", + "41178417232201998380789737" + ], + "mAssetSupply": "196148077009576819901251819" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "254767703098878528061440", + "expectedQty": "236816814313738097062789", + "swapFee": "152860621859327116836", + "reserves": [ + "15377682346170663266725700", + "140496112182582709980047819", + "41178417232201998380789737" + ], + "mAssetSupply": "195893462167099800700307215" + }, + { + "type": "redeemMasset", + "inputQty": "68551595046189110237593", + "expectedQtys": [ + "5379701761811695355252", + "49150916582988801979177", + "14405786174134281865250" + ], + "redemptionFee": "20565478513856733071", + "reserves": [ + "15372302644408851571370448", + "140446961265999721178068642", + "41164011446027864098924487" + ], + "mAssetSupply": "195824931137532125446802693" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "255814742805672435384320", + "4067435727624745296855040", + "1944253196653929628172288" + ], + "expectedQty": "6226738959994573924660779", + "swapFee": "3738286347805427611363", + "reserves": [ + "15116487901603179135986128", + "136379525538374975881213602", + "39219758249373934470752199" + ], + "mAssetSupply": "189598192177537551522141914" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "337016232370974883840", + "expectedQty": "343421727830246822680", + "swapFee": "202209739422584930", + "reserves": [ + "15116487901603179135986128", + "136379182116647145634390922", + "39219758249373934470752199" + ], + "mAssetSupply": "189597855363514919969843004" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "181990303426066", + "expectedQty": "180133296250621", + "swapFee": "109194182055", + "reserves": [ + "15116487901603179135986128", + "136379182116647145634390922", + "39219758249193801174501578" + ], + "mAssetSupply": "189597855363333038860598993" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "12310138864061896458240", + "6030717855719580762112", + "11540059284885429288960" + ], + "expectedQty": "30794464920450425955295", + "swapFee": "18487771615239399212", + "reserves": [ + "15104177762739117239527888", + "136373151398791426053628810", + "39208218189908915745212618" + ], + "mAssetSupply": "189567060898412588434643698" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "155792070548035569975296", + "expectedQty": "167296041179681627586161", + "reserves": [ + "15259969833287152809503184", + "136373151398791426053628810", + "39208218189908915745212618" + ] + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "349606429769685864022016", + "outputIndex": 1, + "expectedQty": "381490599670730963925351", + "swapFee": "224754882267556235815", + "reserves": [ + "15609576263056838673525200", + "135991660799120695089703459", + "39208218189908915745212618" + ], + "mAssetSupply": "189734581694474537618465674", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "3802240122700173824", + "expectedQty": "3872122664114309501", + "swapFee": "2281344073620104", + "reserves": [ + "15609576263056838673525200", + "135991656926998030975393958", + "39208218189908915745212618" + ], + "mAssetSupply": "189734577894515758991911954" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "9134512898493272064", + "7187686380105228288", + "9892049580668119040" + ], + "expectedQty": "26809557481944042292", + "swapFee": "16095391724200945", + "reserves": [ + "15609567128543940180253136", + "135991649739311650870165670", + "39208208297859335077093578" + ], + "mAssetSupply": "189734551084958277047869662" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "39562132623804527017984", + "expectedQty": "40289097164665211038563", + "swapFee": "23737279574282716210", + "reserves": [ + "15609567128543940180253136", + "135951360642146985659127107", + "39208208297859335077093578" + ], + "mAssetSupply": "189695012689614046803567888" + }, + { + "type": "mintMulti", + "inputQtys": [ + "34814310772322057846784", + "2218074909463907504488448", + "233739836729629555556352" + ], + "expectedQty": "2449667363434416122907432", + "reserves": [ + "15644381439316262238099920", + "138169435551610893163615555", + "39441948134588964632649930" + ], + "mAssetSupply": "192144680053048462926475320" + }, + { + "type": "redeemMasset", + "inputQty": "7900921518984072396", + "expectedQtys": [ + "643098463210035061", + "5679774046069438239", + "1621352453579184285" + ], + "redemptionFee": "2370276455695221", + "reserves": [ + "15644380796217799028064859", + "138169429871836847094177316", + "39441946513236511053465645" + ], + "mAssetSupply": "192144672154497220398098145" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "245750143499327864832", + "expectedQty": "248189550206030840363", + "reserves": [ + "15644380796217799028064859", + "138169429871836847094177316", + "39442192263380010381330477" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "457557798069166342144", + "61844213577227083776", + "511836196647960510464" + ], + "expectedQty": "1067827131415925284849", + "reserves": [ + "15644838354015868194407003", + "138169491716050424321261092", + "39442704099576658341840941" + ], + "mAssetSupply": "192145988171178842354223357" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "3790458355291685888", + "497496765272755798016", + "310990519634561400832" + ], + "expectedQty": "806201863252592964668", + "swapFee": "484011524866475664", + "reserves": [ + "15644834563557512902721115", + "138168994219285151565463076", + "39442393109057023780440109" + ], + "mAssetSupply": "192145181969315589761258689" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "45692075679696396288", + "outputIndex": 0, + "expectedQty": "43043627554936462220", + "swapFee": "27687366532483977", + "reserves": [ + "15644791519929957966258895", + "138168994219285151565463076", + "39442438801132703476836397" + ], + "mAssetSupply": "192145181997002956293742666", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "2064033243579897872384", + "expectedQty": "2042519171357575306379", + "swapFee": "1238419946147938723", + "reserves": [ + "15644791519929957966258895", + "138168994219285151565463076", + "39440396281961345901530018" + ], + "mAssetSupply": "192143119202179322543809005" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "12817470725231090860032", + "expectedQty": "12574404760349289873480", + "reserves": [ + "15644791519929957966258895", + "138181811690010382656323108", + "39440396281961345901530018" + ] + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "68609388260773372887040", + "expectedQty": "67891955595271944295353", + "swapFee": "41165632956464023732", + "reserves": [ + "15644791519929957966258895", + "138181811690010382656323108", + "39372504326366073957234665" + ], + "mAssetSupply": "192087125384311854924819177" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "16134569476967794", + "11800678227395736", + "14064050989212562" + ], + "expectedQty": "43068513830504428", + "swapFee": "25856622271665", + "reserves": [ + "15644791503795388489291101", + "138181811678209704428927372", + "39372504312302022968022103" + ], + "mAssetSupply": "192087125341243341094314749" + }, + { + "type": "mintMulti", + "inputQtys": [ + "40909662451401266036736", + "67147014564159663636480", + "96922204433912218779648" + ], + "expectedQty": "207587366733457844868454", + "reserves": [ + "15685701166246789755327837", + "138248958692773864092563852", + "39469426516735935186801751" + ], + "mAssetSupply": "192294712707976798939183203" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "48199428019488060080128", + "738346956712148336640", + "31285077454499514155008" + ], + "expectedQty": "83958879126908496171589", + "swapFee": "50405570818636279470", + "reserves": [ + "15637501738227301695247709", + "138248220345817151944227212", + "39438141439281435672646743" + ], + "mAssetSupply": "192210753828849890443011614" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "16660073958937037111296", + "expectedQty": "16972287655049329955725", + "swapFee": "9996044375362222266", + "reserves": [ + "15637501738227301695247709", + "138231248058162102614271487", + "39438141439281435672646743" + ], + "mAssetSupply": "192194103750935328768122584" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "3367111446117867847680", + "44810993320240005120", + "581626554037149827072" + ], + "expectedQty": "4239470744596803126054", + "swapFee": "2545209572501582825", + "reserves": [ + "15634134626781183827400029", + "138231203247168782374266367", + "39437559812727398522819671" + ], + "mAssetSupply": "192189864280190731964996530" + }, + { + "type": "redeemMasset", + "inputQty": "562823271970737786506444", + "expectedQtys": [ + "45770441961549121499818", + "404685223489229129086797", + "115457272538863711402565" + ], + "redemptionFee": "168846981591221335951", + "reserves": [ + "15588364184819634705900211", + "137826518023679553245179570", + "39322102540188534811417106" + ], + "mAssetSupply": "191627209855201585399826037" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "30232265462433860", + "outputIndex": 1, + "expectedQty": "33003663854870473", + "swapFee": "19437886256944", + "reserves": [ + "15588364215051900168334071", + "137826517990675889390309097", + "39322102540188534811417106" + ], + "mAssetSupply": "191627209855221023286082981", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "30759005433323111579648", + "expectedQty": "32956613014016591903044", + "reserves": [ + "15619123220485223279913719", + "137826517990675889390309097", + "39322102540188534811417106" + ] + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "17185020322041986809856", + "outputIndex": 2, + "expectedQty": "18216761778484513192781", + "swapFee": "11045446676186918156", + "reserves": [ + "15636308240807265266723575", + "137826517990675889390309097", + "39303885778410050298224325" + ], + "mAssetSupply": "191660177513681716064904181", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "159886547074208250200064", + "expectedQty": "162872935807638042254173", + "swapFee": "95931928244524950120", + "reserves": [ + "15636308240807265266723575", + "137663645054868251348054924", + "39303885778410050298224325" + ], + "mAssetSupply": "191500386898535752339654237" + }, + { + "type": "mintMulti", + "inputQtys": [ + "6857147946755273261056", + "120126033917393642717184", + "46939014976515854041088" + ], + "expectedQty": "172602652736846531127433", + "reserves": [ + "15643165388754020539984631", + "137783771088785644990772108", + "39350824793386566152265413" + ], + "mAssetSupply": "191672989551272598870781670" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "12167451859986406", + "13367460290820856", + "8725296513123029" + ], + "expectedQty": "34958203372726659", + "swapFee": "20987514532355", + "reserves": [ + "15643165376586568679998225", + "137783771075418184699951252", + "39350824784661269639142384" + ], + "mAssetSupply": "191672989516314395498055011" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "391889616939093957017600", + "expectedQty": "395704624077011561217411", + "reserves": [ + "15643165376586568679998225", + "137783771075418184699951252", + "39742714401600363596159984" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "1846909526579118564442112", + "2017269611586233433063424", + "1791264309386513165058048" + ], + "expectedQty": "5754463015830680869407405", + "reserves": [ + "17490074903165687244440337", + "139801040687004418133014676", + "41533978710986876761218032" + ], + "mAssetSupply": "197823157156222087928679827" + }, + { + "type": "mintMulti", + "inputQtys": [ + "375439863456507691008", + "946462027499588419584", + "1542232718783893733376" + ], + "expectedQty": "2883112701174924050051", + "reserves": [ + "17490450343029143752131345", + "139801987149031917721434260", + "41535520943705660654951408" + ], + "mAssetSupply": "197826040268923262852729878" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "5276062355561548611584", + "outputIndex": 2, + "expectedQty": "5533807256716508885708", + "swapFee": "3350578399056296050", + "reserves": [ + "17495726405384705300742929", + "139801987149031917721434260", + "41529987136448944146065700" + ], + "mAssetSupply": "197826043619501661909025928", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mintMulti", + "inputQtys": [ + "2418943931680689594826752", + "159594860161093146247168", + "937579599137949194649600" + ], + "expectedQty": "3645400644196631609912634", + "reserves": [ + "19914670337065394895569681", + "139961582009193010867681428", + "42467566735586893340715300" + ], + "mAssetSupply": "201471444263698293518938562" + }, + { + "type": "mintMulti", + "inputQtys": [ + "48489601179444944", + "18530103455510264", + "47548169908580616" + ], + "expectedQty": "116849977620022402", + "reserves": [ + "19914670385554996075014625", + "139961582027723114323191692", + "42467566783135063249295916" + ], + "mAssetSupply": "201471444380548271138960964" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "673217714758667993088", + "670245750803905380352", + "747533724159701024768" + ], + "expectedQty": "2117159902851311704986", + "swapFee": "1271058576856901163", + "reserves": [ + "19913997167840237407021537", + "139960911781972310417811340", + "42466819249410903548271148" + ], + "mAssetSupply": "201469327220645419827255978" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "87095137076392373518336", + "expectedQty": "85784938033122768661717", + "reserves": [ + "19913997167840237407021537", + "140048006919048702791329676", + "42466819249410903548271148" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "363571061222742016", + "704927796759735040", + "534903454757550784" + ], + "expectedQty": "1613427381335369893", + "swapFee": "968637611368042", + "reserves": [ + "19913996804269176184279521", + "140048006214120906031594636", + "42466818714507448790720364" + ], + "mAssetSupply": "201555110545251161260547802" + }, + { + "type": "redeemMasset", + "inputQty": "21258631605210727422361", + "expectedQtys": [ + "2099759799728475617232", + "14766858525230480184029", + "4477761025851088331064" + ], + "redemptionFee": "6377589481563218226", + "reserves": [ + "19911897044469447708662289", + "140033239355595675551410607", + "42462340953481597702389300" + ], + "mAssetSupply": "201533858291235432096343667" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "21997109530049189511168", + "expectedQty": "22989320790952265143768", + "reserves": [ + "19933894153999496898173457", + "140033239355595675551410607", + "42462340953481597702389300" + ] + }, + { + "type": "redeemMasset", + "inputQty": "458562578191382092552601", + "expectedQtys": [ + "45338055856445534920671", + "318494458664976220061531", + "96577215223053803427990" + ], + "redemptionFee": "137568773457414627765", + "reserves": [ + "19888556098143051363252786", + "139714744896930699331349076", + "42365763738258543898961310" + ], + "mAssetSupply": "201098422602608459683562599" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "9963247080229697536", + "expectedQty": "9879393046776122822", + "swapFee": "5977948248137818", + "reserves": [ + "19888556098143051363252786", + "139714744896930699331349076", + "42365753858865497122838488" + ], + "mAssetSupply": "201098412645339327702002881" + }, + { + "type": "mintMulti", + "inputQtys": [ + "15944683774333979459584", + "15336888732593493639168", + "17855959033776443490304" + ], + "expectedQty": "49765598673422715276291", + "reserves": [ + "19904500781917385342712370", + "139730081785663292824988244", + "42383609817899273566328792" + ], + "mAssetSupply": "201148178244012750417279172" + }, + { + "type": "redeemMasset", + "inputQty": "33727668453508834918", + "expectedQtys": [ + "3336500530320671008", + "23422315238529017019", + "7104570879908454784" + ], + "redemptionFee": "10118300536052650", + "reserves": [ + "19904497445416855022041362", + "139730058363348054295971225", + "42383602713328393657874008" + ], + "mAssetSupply": "201148144526462597444496904" + }, + { + "type": "redeemMasset", + "inputQty": "155463752608234910357913", + "expectedQtys": [ + "15379209913012954515942", + "107962429326357523964617", + "32747690555136834240049" + ], + "redemptionFee": "46639125782470473107", + "reserves": [ + "19889118235503842067525420", + "139622095934021696772006608", + "42350855022773256823633959" + ], + "mAssetSupply": "200992727412980145004612098" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "846442091861552267264", + "594153557433285607424", + "957660947337615507456" + ], + "expectedQty": "2434956213045463304081", + "swapFee": "1461850838330276148", + "reserves": [ + "19888271793411980515258156", + "139621501780464263486399184", + "42349897361825919208126503" + ], + "mAssetSupply": "200990292456767099541308017" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "17334424739507048", + "outputIndex": 1, + "expectedQty": "18379694119743475", + "swapFee": "10868648267004", + "reserves": [ + "19888271810746405254765204", + "139621501762084569366655709", + "42349897361825919208126503" + ], + "mAssetSupply": "200990292456777968189575021", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "43290451235249797988352", + "expectedQty": "43630732041538858087230", + "reserves": [ + "19888271810746405254765204", + "139621501762084569366655709", + "42393187813061169006114855" + ] + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "11599274653420831637504", + "expectedQty": "12120893796270330694632", + "reserves": [ + "19899871085399826086402708", + "139621501762084569366655709", + "42393187813061169006114855" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "45936892457474760638464", + "7987282541884234268672", + "14810892200077820952576" + ], + "expectedQty": "70791336919704434132158", + "reserves": [ + "19945807977857300847041172", + "139629489044626453600924381", + "42407998705261246827067431" + ], + "mAssetSupply": "201116835419535481812489041" + }, + { + "type": "mintMulti", + "inputQtys": [ + "3699814150728468", + "1662512102176088", + "2615161770128343" + ], + "expectedQty": "8138614270421733", + "reserves": [ + "19945807981557114997769640", + "139629489046288965703100469", + "42407998707876408597195774" + ], + "mAssetSupply": "201116835427674096082910774" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "718241399118683439104", + "expectedQty": "687070283625890591689", + "swapFee": "430944839471210063", + "reserves": [ + "19945120911273489107177951", + "139629489046288965703100469", + "42407998707876408597195774" + ], + "mAssetSupply": "201116117617219816870681733" + }, + { + "type": "mintMulti", + "inputQtys": [ + "3167106887249284300800", + "232072781045273755648", + "1069725560468040450048" + ], + "expectedQty": "4615495799843025133597", + "reserves": [ + "19948288018160738391478751", + "139629721119070010976856117", + "42409068433436876637645822" + ], + "mAssetSupply": "201120733113019659895815330" + }, + { + "type": "redeemMasset", + "inputQty": "87687486637300505169100", + "expectedQtys": [ + "8694730013116585291378", + "60859494600831077971566", + "18484563677886816773850" + ], + "redemptionFee": "26306245991190151550", + "reserves": [ + "19939593288147621806187373", + "139568861624469179898884551", + "42390583869758989820871972" + ], + "mAssetSupply": "201033071932628350580797780" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "165171589218646557196288", + "expectedQty": "163780088525381322847985", + "swapFee": "99102953531187934317", + "reserves": [ + "19939593288147621806187373", + "139568861624469179898884551", + "42226803781233608498023987" + ], + "mAssetSupply": "200867999446363235211535809" + }, + { + "type": "redeemMasset", + "inputQty": "2262779541788259516416", + "expectedQtys": [ + "224552284172641391508", + "1571772614628960891564", + "475542560239794236965" + ], + "redemptionFee": "678833862536477854", + "reserves": [ + "19939368735863449164795865", + "139567289851854550937992987", + "42226328238673368703787022" + ], + "mAssetSupply": "200865737345655309488497247" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "722554030011328888832", + "expectedQty": "716428512285051938422", + "swapFee": "433532418006797333", + "reserves": [ + "19939368735863449164795865", + "139567289851854550937992987", + "42225611810161083651848600" + ], + "mAssetSupply": "200865015225157716166405748" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "64576584841863396065280", + "51198630623654203883520", + "29326175205235617693696" + ], + "expectedQty": "147461954847084522338424", + "swapFee": "88530291082900453675", + "reserves": [ + "19874792151021585768730585", + "139516091221230896734109467", + "42196285634955848034154904" + ], + "mAssetSupply": "200717553270310631644067324" + }, + { + "type": "mintMulti", + "inputQtys": [ + "820383850736323264512", + "1536294521696905330688", + "1126792245711154184192" + ], + "expectedQty": "3506223456184712545230", + "reserves": [ + "19875612534872322091995097", + "139517627515752593639440155", + "42197412427201559188339096" + ], + "mAssetSupply": "200721059493766816356612554" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "5846321321486023917568", + "expectedQty": "5591210405315558839297", + "swapFee": "3507792792891614350", + "reserves": [ + "19870021324467006533155800", + "139517627515752593639440155", + "42197412427201559188339096" + ], + "mAssetSupply": "200715216680238123224309336" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "77849704861309459234816", + "23793296843164409135104", + "55006300123550516772864" + ], + "expectedQty": "160246450328322853409266", + "swapFee": "96205593553125587397", + "reserves": [ + "19792171619605697073920984", + "139493834218909429230305051", + "42142406127078008671566232" + ], + "mAssetSupply": "200554970229909800370900070" + }, + { + "type": "redeemMasset", + "inputQty": "378025335339768034099", + "expectedQtys": [ + "37295000579318060294", + "262852542307793921227", + "79410238104763513380" + ], + "redemptionFee": "113407600601930410", + "reserves": [ + "19792134324605117755860690", + "139493571366367121436383824", + "42142326716839903908052852" + ], + "mAssetSupply": "200554592317982061204796381" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "29536908837207765155840", + "expectedQty": "29285036201022869842227", + "swapFee": "17722145302324659093", + "reserves": [ + "19792134324605117755860690", + "139493571366367121436383824", + "42113041680638881038210625" + ], + "mAssetSupply": "200525073131290155764299634" + }, + { + "type": "mintMulti", + "inputQtys": [ + "20208138929435544911872", + "13432109605735473610752", + "26640264326124312461312" + ], + "expectedQty": "61206362253633584304079", + "reserves": [ + "19812342463534553300772562", + "139507003475972856909994576", + "42139681944965005350671937" + ], + "mAssetSupply": "200586279493543789348603713" + }, + { + "type": "mintMulti", + "inputQtys": [ + "31056207912584156807168", + "46607770742393923436544", + "63107037505084851224576" + ], + "expectedQty": "141975314549501190133724", + "reserves": [ + "19843398671447137457579730", + "139553611246715250833431120", + "42202788982470090201896513" + ], + "mAssetSupply": "200728254808093290538737437" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "287306044252214488203264", + "expectedQty": "289565277965915737139815", + "reserves": [ + "19843398671447137457579730", + "139553611246715250833431120", + "42490095026722304690099777" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "4102093644171334144", + "4391317534831944192", + "1450229200194794496" + ], + "expectedQty": "10074212466161532016", + "swapFee": "6048156373521031", + "reserves": [ + "19843394569353493286245586", + "139553606855397716001486928", + "42490093576493104495305281" + ], + "mAssetSupply": "201017810011846740114345236" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "679529108930236300394496", + "expectedQty": "673737360693824834166277", + "swapFee": "407717465358141780236", + "reserves": [ + "19843394569353493286245586", + "139553606855397716001486928", + "41816356215799279661139004" + ], + "mAssetSupply": "200338688620381861955730976" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "2499075189434189975912448", + "outputIndex": 2, + "expectedQty": "2435773418068309484237169", + "swapFee": "1476436341635409030878", + "reserves": [ + "19843394569353493286245586", + "142052682044831905977399376", + "39380582797730970176901835" + ], + "mAssetSupply": "200340165056723497364761854", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "2141208376209049934364672", + "expectedQty": "2231760764898357045421612", + "reserves": [ + "21984602945562543220610258", + "142052682044831905977399376", + "39380582797730970176901835" + ] + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "6552577027803498315513856", + "expectedQty": "6606456210099149387134060", + "reserves": [ + "21984602945562543220610258", + "142052682044831905977399376", + "45933159825534468492415691" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "182726950487079456", + "39450308403093448", + "127656632702999472" + ], + "expectedQty": "357060513858309886", + "reserves": [ + "21984603128289493707689714", + "142052682084282214380492824", + "45933159953191101195415163" + ], + "mAssetSupply": "209178382388781517655627412" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "1159665716784919696375808", + "2022935248272726895362048", + "712203037450847515574272" + ], + "expectedQty": "3917461338708386633982386", + "swapFee": "2351887935986623954762", + "reserves": [ + "20824937411504574011313906", + "140029746836009487485130776", + "45220956915740253679840891" + ], + "mAssetSupply": "205260921050073131021645026" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "770162499512742707200", + "expectedQty": "759394321931677820987", + "reserves": [ + "20824937411504574011313906", + "140030516998509000227837976", + "45220956915740253679840891" + ] + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "49275085130490200457216", + "expectedQty": "49943643451195977555176", + "swapFee": "29565051078294120274", + "reserves": [ + "20824937411504574011313906", + "139980573355057804250282800", + "45220956915740253679840891" + ], + "mAssetSupply": "205212434924315650793129071" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "173710702628633312", + "expectedQty": "166726831048537039", + "swapFee": "104226421577179", + "reserves": [ + "20824937244777742962776867", + "139980573355057804250282800", + "45220956915740253679840891" + ], + "mAssetSupply": "205212434750709174586072938" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "103005079727528409563136", + "expectedQty": "107234175745091926332831", + "reserves": [ + "20927942324505271372340003", + "139980573355057804250282800", + "45220956915740253679840891" + ] + }, + { + "type": "redeemMasset", + "inputQty": "53356949418617241", + "expectedQtys": [ + "5436966514378215", + "36366197794025323", + "11748160649846969" + ], + "redemptionFee": "16007084825585", + "reserves": [ + "20927942319068304857961788", + "139980573318691606456257477", + "45220956903992093029993922" + ], + "mAssetSupply": "205319668873113324178614113" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "24964575443639940", + "expectedQty": "25984436543704949", + "reserves": [ + "20927942344032880301601728", + "139980573318691606456257477", + "45220956903992093029993922" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "56318785339540930560", + "85649077803219304448", + "105560179389472997376" + ], + "expectedQty": "249297716771646429224", + "reserves": [ + "20927998662818219842532288", + "139980658967769409675561925", + "45221062464171482502991298" + ], + "mAssetSupply": "205319918196814532368748286" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "177672451855620050518016", + "outputIndex": 1, + "expectedQty": "181182227269384467256303", + "swapFee": "107265636108239739863", + "reserves": [ + "20927998662818219842532288", + "139799476740500025208305622", + "45398734916027102553509314" + ], + "mAssetSupply": "205320025462450640608488149", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "2149806250796176113664", + "expectedQty": "2135416671973211012847", + "swapFee": "1289883750477705668", + "reserves": [ + "20927998662818219842532288", + "139799476740500025208305622", + "45396599499355129342496467" + ], + "mAssetSupply": "205317876946083594910080153" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "901321165453359972352", + "expectedQty": "938052850563211085720", + "reserves": [ + "20928899983983673202504640", + "139799476740500025208305622", + "45396599499355129342496467" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "35265096200508189704192", + "23035990938192976019456", + "18670975667584901316608" + ], + "expectedQty": "78202432018462455971632", + "reserves": [ + "20964165080184181392208832", + "139822512731438218184325078", + "45415270475022714243813075" + ], + "mAssetSupply": "205397017430952620577137505" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "357368108372997296881664", + "expectedQty": "362156525307077292156843", + "swapFee": "214420865023798378128", + "reserves": [ + "20964165080184181392208832", + "139460356206131140892168235", + "45415270475022714243813075" + ], + "mAssetSupply": "205039863743444647078633969" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "52865636509016513314816", + "outputIndex": 0, + "expectedQty": "51083935328871985196254", + "swapFee": "31911499433272126214", + "reserves": [ + "20913081144855309407012578", + "139460356206131140892168235", + "45468136111531730757127891" + ], + "mAssetSupply": "205039895654944080350760183", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "2159939889702496519585792", + "expectedQty": "2188531666699850788552104", + "swapFee": "1295963933821497911751", + "reserves": [ + "20913081144855309407012578", + "137271824539431290103616131", + "45468136111531730757127891" + ], + "mAssetSupply": "202881251729175405329086142" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "116019729568114816319488", + "91897019553257923543040", + "36036877080817475518464" + ], + "expectedQty": "247505767245632928513664", + "swapFee": "148592615916929915057", + "reserves": [ + "20797061415287194590693090", + "137179927519878032180073091", + "45432099234450913281609427" + ], + "mAssetSupply": "202633745961929772400572478" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "115723573611480842502144", + "expectedQty": "117243333784214624345061", + "swapFee": "69434144166888505501", + "reserves": [ + "20797061415287194590693090", + "137062684186093817555728030", + "45432099234450913281609427" + ], + "mAssetSupply": "202518091822462458446575835" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "8648813813357605814272", + "outputIndex": 1, + "expectedQty": "9109997190837103089187", + "swapFee": "5395220727581345794", + "reserves": [ + "20805710229100552196507362", + "137053574188902980452638843", + "45432099234450913281609427" + ], + "mAssetSupply": "202518097217683186027921629", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "8517089931875980410880", + "expectedQty": "8464033899058181497987", + "swapFee": "5110253959125588246", + "reserves": [ + "20805710229100552196507362", + "137053574188902980452638843", + "45423635200551855100111440" + ], + "mAssetSupply": "202509585238005269173098995" + }, + { + "type": "mintMulti", + "inputQtys": [ + "266832858450813026304", + "85005433165819772928", + "244345768545535393792" + ], + "expectedQty": "607000533222938313698", + "reserves": [ + "20805977061959003009533666", + "137053659194336146272411771", + "45423879546320400635505232" + ], + "mAssetSupply": "202510192238538492111412693" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "601597884134167281664", + "expectedQty": "597848997495227477364", + "swapFee": "360958730480500368", + "reserves": [ + "20805977061959003009533666", + "137053659194336146272411771", + "45423281697322905408027868" + ], + "mAssetSupply": "202509591001613088424631397" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "4172055625876657668096", + "99378673055811298656256", + "7197326368518803816448" + ], + "expectedQty": "109608949224589715307758", + "swapFee": "65804852446221562121", + "reserves": [ + "20801805006333126351865570", + "136954280521280334973755515", + "45416084370954386604211420" + ], + "mAssetSupply": "202399982052388498709323639" + }, + { + "type": "mintMulti", + "inputQtys": [ + "147732578305418592", + "625437572067871", + "62451818404587976" + ], + "expectedQty": "217007670790484683", + "reserves": [ + "20801805154065704657284162", + "136954280521905772545823386", + "45416084433406205008799396" + ], + "mAssetSupply": "202399982269396169499808322" + }, + { + "type": "redeemMasset", + "inputQty": "154953998806082", + "expectedQtys": [ + "15920732096957", + "104818422899935", + "34759354190747" + ], + "redemptionFee": "46486199641", + "reserves": [ + "20801805154049783925187205", + "136954280521800954122923451", + "45416084433371445654608649" + ], + "mAssetSupply": "202399982269241261987201881" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "132956216525049410093056", + "expectedQty": "132124885165145502798730", + "swapFee": "79773729915029646055", + "reserves": [ + "20801805154049783925187205", + "136954280521800954122923451", + "45283959548206300151809919" + ], + "mAssetSupply": "202267105826446127606754880" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "41168385661450930094080", + "expectedQty": "40610332924939117849523", + "reserves": [ + "20801805154049783925187205", + "136995448907462405053017531", + "45283959548206300151809919" + ] + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "1744289237582166622208", + "expectedQty": "1767202616540663405767", + "swapFee": "1046573542549299973", + "reserves": [ + "20801805154049783925187205", + "136993681704845864389611764", + "45283959548206300151809919" + ], + "mAssetSupply": "202305972916707027107282168" + }, + { + "type": "redeemMasset", + "inputQty": "11662519917740664501043", + "expectedQtys": [ + "1198821186529372405924", + "7895032514351636459295", + "2609743227296785027606" + ], + "redemptionFee": "3498755975322199350", + "reserves": [ + "20800606332863254552781281", + "136985786672331512753152469", + "45281349804979003366782313" + ], + "mAssetSupply": "202294313895545261764980475" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "49641732429554668011520", + "33605793612005457788928", + "43477577919417800458240" + ], + "expectedQty": "128490122891175741902188", + "swapFee": "77140357949475130219", + "reserves": [ + "20750964600433699884769761", + "136952180878719507295363541", + "45237872227059585566324073" + ], + "mAssetSupply": "202165823772654086023078287" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "2695646092055787799052288", + "expectedQty": "2676709762417303314266065", + "swapFee": "1617387655233472679431", + "reserves": [ + "20750964600433699884769761", + "136952180878719507295363541", + "42561162464642282252058008" + ], + "mAssetSupply": "199471795068253531696705430" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "21336811968996732", + "expectedQty": "21170769767708428", + "swapFee": "12802087181398", + "reserves": [ + "20750964600433699884769761", + "136952180878719507295363541", + "42561162443471512484349580" + ], + "mAssetSupply": "199471795046929521814890096" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "4002303158247439", + "outputIndex": 2, + "expectedQty": "3915352727923468", + "swapFee": "2367636487439", + "reserves": [ + "20750964600433699884769761", + "136952180882721810453610980", + "42561162439556159756426112" + ], + "mAssetSupply": "199471795046931889451377535", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "2514494552453660513665024", + "outputIndex": 2, + "expectedQty": "2456261105188491687145559", + "swapFee": "1487217939196708193699", + "reserves": [ + "20750964600433699884769761", + "139466675435175470967276004", + "40104901334367668069280553" + ], + "mAssetSupply": "199473282264871086159571234", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mintMulti", + "inputQtys": [ + "1162751915929921", + "466023075460851", + "1150343651225088" + ], + "expectedQty": "2830894612629150", + "reserves": [ + "20750964601596451800699682", + "139466675435641494042736855", + "40104901335518011720505641" + ], + "mAssetSupply": "199473282267701980772200384" + }, + { + "type": "mintMulti", + "inputQtys": [ + "3947817598975056805888", + "452283602977789690511360", + "322131940040223605391360" + ], + "expectedQty": "774780481558719129873421", + "reserves": [ + "20754912419195426857505570", + "139918959038619283733248215", + "40427033275558235325897001" + ], + "mAssetSupply": "200248062749260699902073805" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "1161133780729637240832", + "146496767349291696128", + "537625075558896631808" + ], + "expectedQty": "1896199326100024004332", + "swapFee": "1138402637242359818", + "reserves": [ + "20753751285414697220264738", + "139918812541851934441552087", + "40426495650482676429265193" + ], + "mAssetSupply": "200246166549934599878069473" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "4046508551130233769558016", + "expectedQty": "4186311535696173497770489", + "reserves": [ + "24800259836544930989822754", + "139918812541851934441552087", + "40426495650482676429265193" + ] + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "619044182427147", + "expectedQty": "626722788576956", + "swapFee": "371426509456", + "reserves": [ + "24800259836544930989822754", + "139918812541225211652975131", + "40426495650482676429265193" + ], + "mAssetSupply": "204432478085012100619922271" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "1299419125428141072318464", + "expectedQty": "1315420994795943080117220", + "swapFee": "779651475256884643391", + "reserves": [ + "24800259836544930989822754", + "138603391546429268572857911", + "40426495650482676429265193" + ], + "mAssetSupply": "203133838611059216432247198" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "860540405341204173029376", + "expectedQty": "871010219740802933460450", + "swapFee": "516324243204722503817", + "reserves": [ + "24800259836544930989822754", + "137732381326688465639397461", + "40426495650482676429265193" + ], + "mAssetSupply": "202273814529961216981721639" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "2434653166649773253459968", + "expectedQty": "2360381240285848692583114", + "swapFee": "1460791899989863952075", + "reserves": [ + "22439878596259082297239640", + "137732381326688465639397461", + "40426495650482676429265193" + ], + "mAssetSupply": "199840622155211433592213746" + }, + { + "type": "redeemMasset", + "inputQty": "5494000747504758633267", + "expectedQtys": [ + "616730087404878783664", + "3785390514022277564565", + "1111068230117410163887" + ], + "redemptionFee": "1648200224251427589", + "reserves": [ + "22439261866171677418455976", + "137728595936174443361832896", + "40425384582252559019101306" + ], + "mAssetSupply": "199835129802664153085008068" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "1203359519746274768191488", + "830785092008266541563904", + "300772977971568433954816" + ], + "expectedQty": "2369273138182323418128903", + "swapFee": "1422417333309379678684", + "reserves": [ + "21235902346425402650264488", + "136897810844166176820268992", + "40124611604280990585146490" + ], + "mAssetSupply": "197465856664481829666879165" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "48802959433463989534720", + "14732872479011063726080", + "28361672554431400378368" + ], + "expectedQty": "93788581622708902199938", + "swapFee": "56306933133505444586", + "reserves": [ + "21187099386991938660729768", + "136883077971687165756542912", + "40096249931726559184768122" + ], + "mAssetSupply": "197372068082859120764679227" + }, + { + "type": "redeemMasset", + "inputQty": "371727945066000769089536", + "expectedQtys": [ + "39891531980377030791426", + "257726439223319194543541", + "75494092288380548987244" + ], + "redemptionFee": "111518383519800230726", + "reserves": [ + "21147207855011561629938342", + "136625351532463846561999371", + "40020755839438178635780878" + ], + "mAssetSupply": "197000451656176639795820417" + }, + { + "type": "redeemMasset", + "inputQty": "207588289626400532883046", + "expectedQtys": [ + "22277084637564769492295", + "143925124328148454017155", + "42159029750265409818785" + ], + "redemptionFee": "62276486887920159864", + "reserves": [ + "21124930770373996860446047", + "136481426408135698107982216", + "39978596809687913225962093" + ], + "mAssetSupply": "196792925643037127183097235" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "786728706798182072320", + "8969009528888674484224", + "725392353035755978752" + ], + "expectedQty": "10389414452146427932956", + "swapFee": "6237391105951427616", + "reserves": [ + "21124144041667198678373727", + "136472457398606809433497992", + "39977871417334877469983341" + ], + "mAssetSupply": "196782536228584980755164279" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "2805471402133625965117440", + "expectedQty": "2764833330733445797121360", + "reserves": [ + "21124144041667198678373727", + "139277928800740435398615432", + "39977871417334877469983341" + ] + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "915248757400965611520", + "outputIndex": 1, + "expectedQty": "965140069589358040819", + "swapFee": "570916008441425059", + "reserves": [ + "21125059290424599643985247", + "139276963660670846040574613", + "39977871417334877469983341" + ], + "mAssetSupply": "199547370130234434993710698", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemMasset", + "inputQty": "1155613559041082", + "expectedQtys": [ + "122302194281727", + "806335169734534", + "231449357364363" + ], + "redemptionFee": "346684067712", + "reserves": [ + "21125059290302297449703520", + "139276963659864510870840079", + "39977871417103428112618978" + ], + "mAssetSupply": "199547370129079168118737328" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "16681565500809595060224", + "expectedQty": "16515677240992356297186", + "swapFee": "10008939300485757036", + "reserves": [ + "21125059290302297449703520", + "139276963659864510870840079", + "39961355739862435756321792" + ], + "mAssetSupply": "199530698572517659009434140" + }, + { + "type": "redeemMasset", + "inputQty": "16971114747755888430284", + "expectedQtys": [ + "1796256180584793116369", + "11842670041733892159899", + "3397899681409524788442" + ], + "redemptionFee": "5091334424326766529", + "reserves": [ + "21123263034121712656587151", + "139265120989822776978680180", + "39957957840181026231533350" + ], + "mAssetSupply": "199513732549104327447770385" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "77181464644725533310976", + "expectedQty": "74184245603727218456031", + "swapFee": "46308878786835319986", + "reserves": [ + "21049078788517985438131120", + "139265120989822776978680180", + "39957957840181026231533350" + ], + "mAssetSupply": "199436597393338388749779395" + }, + { + "type": "redeemMasset", + "inputQty": "18242908887865104531456", + "expectedQtys": [ + "1924828404625079778989", + "12735068520004948116648", + "3653946712553829795620" + ], + "redemptionFee": "5472872666359531359", + "reserves": [ + "21047153960113360358352131", + "139252385921302772030563532", + "39954303893468472401737730" + ], + "mAssetSupply": "199418359957323190004779298" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "11141926687942379569152", + "expectedQty": "10707558966334321706971", + "swapFee": "6685156012765427741", + "reserves": [ + "21036446401147026036645160", + "139252385921302772030563532", + "39954303893468472401737730" + ], + "mAssetSupply": "199407224715791260390637887" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "462149015202161533911040", + "expectedQty": "457471663827574188356090", + "swapFee": "277289409121296920346", + "reserves": [ + "21036446401147026036645160", + "139252385921302772030563532", + "39496832229640898213381640" + ], + "mAssetSupply": "198945352989998220153647193" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "543253161910972973056", + "1911243508084270170112", + "1234694668775030259712" + ], + "expectedQty": "3694615398754470899335", + "swapFee": "2218100099312269901", + "reserves": [ + "21035903147985115063672104", + "139250474677794687760393420", + "39495597534972123183121928" + ], + "mAssetSupply": "198941658374599465682747858" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "586240031245827768320", + "expectedQty": "594720647899643223526", + "swapFee": "351744018747496660", + "reserves": [ + "21035903147985115063672104", + "139249879957146788117169894", + "39495597534972123183121928" + ], + "mAssetSupply": "198941072486312238602476198" + }, + { + "type": "mintMulti", + "inputQtys": [ + "468995690731966828642304", + "1146577657779113743613952", + "1352041629351274776363008" + ], + "expectedQty": "2982010179496498433610971", + "reserves": [ + "21504898838717081892314408", + "140396457614925901860783846", + "40847639164323397959484936" + ], + "mAssetSupply": "201923082665808737036087169" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "541191502531904235634688", + "expectedQty": "548779565325984890484653", + "swapFee": "324714901519142541380", + "reserves": [ + "21504898838717081892314408", + "139847678049599916970299193", + "40847639164323397959484936" + ], + "mAssetSupply": "201382215878178351942993861" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "8597279302632243986432", + "outputIndex": 0, + "expectedQty": "8154290890365855668037", + "swapFee": "5084195449235890514", + "reserves": [ + "21496744547826716036646371", + "139856275328902549214285625", + "40847639164323397959484936" + ], + "mAssetSupply": "201382220962373801178884375", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "254119734324172364447744", + "expectedQty": "257668739507325886451270", + "swapFee": "152471840594503418668", + "reserves": [ + "21496744547826716036646371", + "139598606589395223327834355", + "40847639164323397959484936" + ], + "mAssetSupply": "201128253699890223317855299" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "294598735135797", + "35397601289758", + "559499332567296" + ], + "expectedQty": "905265758789323", + "swapFee": "543485546601", + "reserves": [ + "21496744547532117301510574", + "139598606589359825726544597", + "40847639163763898626917640" + ], + "mAssetSupply": "201128253698984957559065976" + }, + { + "type": "redeemMasset", + "inputQty": "63916061679042985092710", + "expectedQtys": [ + "6829349079315882645952", + "44349395010802867771048", + "12976978272149772173651" + ], + "redemptionFee": "19174818503712895527", + "reserves": [ + "21489915198452801418864622", + "139554257194349022858773549", + "40834662185491748854743989" + ], + "mAssetSupply": "201064356812124418286868793" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "1022407072639582", + "expectedQty": "983997468269710", + "swapFee": "613444243583", + "reserves": [ + "21489915197468803950594912", + "139554257194349022858773549", + "40834662185491748854743989" + ], + "mAssetSupply": "201064356811102624658472794" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "149201702917633000603648", + "expectedQty": "147059575530032516172891", + "reserves": [ + "21489915197468803950594912", + "139703458897266655859377197", + "40834662185491748854743989" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "10580504765692888743936", + "228218602037175853776896", + "269131012947870968971264" + ], + "expectedQty": "507468845413637564521911", + "swapFee": "304664105711609504415", + "reserves": [ + "21479334692703111061850976", + "139475240295229480005600301", + "40565531172543877885772725" + ], + "mAssetSupply": "200703947541219019610123774" + }, + { + "type": "mintMulti", + "inputQtys": [ + "111613634313113158287360", + "40849183802755056140288", + "187600402894326595584000" + ], + "expectedQty": "345426905658431618098274", + "reserves": [ + "21590948327016224220138336", + "139516089479032235061740589", + "40753131575438204481356725" + ], + "mAssetSupply": "201049374446877451228222048" + }, + { + "type": "mintMulti", + "inputQtys": [ + "3019837019902766481408", + "540703003975913308160", + "6222849067818741137408" + ], + "expectedQty": "9945938283010009547395", + "reserves": [ + "21593968164036126986619744", + "139516630182036210975048749", + "40759354424506023222494133" + ], + "mAssetSupply": "201059320385160461237769443" + }, + { + "type": "mintMulti", + "inputQtys": [ + "37194306331431890059264", + "8396861583460794368000", + "31739955618475885461504" + ], + "expectedQty": "78905173350930954657314", + "reserves": [ + "21631162470367558876679008", + "139525027043619671769416749", + "40791094380124499107955637" + ], + "mAssetSupply": "201138225558511392192426757" + }, + { + "type": "redeemMasset", + "inputQty": "1809606042863456460", + "expectedQtys": [ + "194553467135259138", + "1254906101355529717", + "366880367653211721" + ], + "redemptionFee": "542881812859036", + "reserves": [ + "21631162275814091741419870", + "139525025788713570413887032", + "40791094013244131454743916" + ], + "mAssetSupply": "201138223749448231141829333" + }, + { + "type": "redeemMasset", + "inputQty": "17918429026787747", + "expectedQtys": [ + "1926437252200126", + "12425879102857661", + "3632790603812048" + ], + "redemptionFee": "5375528708036", + "reserves": [ + "21631162273887654489219744", + "139525025776287691311029371", + "40791094009611340850931868" + ], + "mAssetSupply": "201138223731535177643749622" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "7382435031000891260928", + "3188632502645569355776", + "7603269224839051739136" + ], + "expectedQty": "18476206758380888540785", + "swapFee": "11092379482718164022", + "reserves": [ + "21623779838856653597958816", + "139521837143785045741673595", + "40783490740386501799192732" + ], + "mAssetSupply": "201119747524776796755208837" + }, + { + "type": "redeemMasset", + "inputQty": "19019418235922271541657", + "expectedQtys": [ + "2044296177491414508087", + "13190291451131445461462", + "3855641097284541977048" + ], + "redemptionFee": "5705825470776681462", + "reserves": [ + "21621735542679162183450729", + "139508646852333914296212133", + "40779635099289217257215684" + ], + "mAssetSupply": "201100733812366345260348642" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "90542488808725905408", + "33416010838095716352", + "117508192136510324736" + ], + "expectedQty": "245467301052609918721", + "swapFee": "147368801912713579", + "reserves": [ + "21621645000190353457545321", + "139508613436323076200495781", + "40779517591097080746890948" + ], + "mAssetSupply": "201100488345065292650429921" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "612520010106753777664", + "expectedQty": "606754705719995019336", + "swapFee": "367512006064052266", + "reserves": [ + "21621645000190353457545321", + "139508613436323076200495781", + "40778910836391360751871612" + ], + "mAssetSupply": "201099876192567191960704523" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "5249121222832353102004224", + "expectedQty": "5287239420793859694895098", + "reserves": [ + "21621645000190353457545321", + "139508613436323076200495781", + "46028032059223713853875836" + ] + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "31251584223240794112", + "outputIndex": 1, + "expectedQty": "31838307375430332046", + "swapFee": "18859620214614050", + "reserves": [ + "21621645000190353457545321", + "139508581598015700770163735", + "46028063310807937094669948" + ], + "mAssetSupply": "206387115632220671870213671", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "3048075203025232048685056", + "expectedQty": "3149352774332807861597954", + "reserves": [ + "24669720203215585506230377", + "139508581598015700770163735", + "46028063310807937094669948" + ] + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "190424447931540641415168", + "expectedQty": "191549363279228204065916", + "reserves": [ + "24669720203215585506230377", + "139508581598015700770163735", + "46218487758739477736085116" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "89097160120341215838208", + "44881731170069733441536", + "2642337529985510146048" + ], + "expectedQty": "138698097927947353768755", + "swapFee": "83268820048797690875", + "reserves": [ + "24580623043095244290392169", + "139463699866845631036722199", + "46215845421209492225939068" + ], + "mAssetSupply": "209589319671904760582108786" + }, + { + "type": "mintMulti", + "inputQtys": [ + "5719501725498001906991104", + "1890769609534997620850688", + "83047586600921178570752" + ], + "expectedQty": "7809180646545070019310143", + "reserves": [ + "30300124768593246197383273", + "141354469476380628657572887", + "46298893007810413404509820" + ], + "mAssetSupply": "217398500318449830601418929" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "172067310181396709376", + "expectedQty": "173162922818739547353", + "reserves": [ + "30300124768593246197383273", + "141354469476380628657572887", + "46299065075120594801219196" + ] + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "13231258498775310663680", + "expectedQty": "13096846085219655488496", + "reserves": [ + "30300124768593246197383273", + "141367700734879403968236567", + "46299065075120594801219196" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "50244706372747863785472", + "48737221825181727588352", + "36656799824084761313280" + ], + "expectedQty": "136347986693468556666358", + "reserves": [ + "30350369474965994061168745", + "141416437956704585695824919", + "46335721874944679562532476" + ], + "mAssetSupply": "217548118314151337553121136" + }, + { + "type": "redeemMasset", + "inputQty": "378347397951074336768", + "expectedQtys": [ + "52767812986250273498", + "245869697152654295966", + "80560294611791583863" + ], + "redemptionFee": "113504219385322301", + "reserves": [ + "30350316707153007810895247", + "141416192087007433041528953", + "46335641314650067770948613" + ], + "mAssetSupply": "217547740080257605864106669" + }, + { + "type": "mintMulti", + "inputQtys": [ + "2743812874828049920", + "28832256436287700", + "688980669107332992" + ], + "expectedQty": "3518653518344866623", + "reserves": [ + "30350319450965882638945167", + "141416192115839689477816653", + "46335642003630736878281605" + ], + "mAssetSupply": "217547743598911124208973292" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "703050576509776", + "expectedQty": "689329351082281", + "swapFee": "421830345905", + "reserves": [ + "30350319450276553287862886", + "141416192115839689477816653", + "46335642003630736878281605" + ], + "mAssetSupply": "217547743598208495462809421" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "3333708180711126597632", + "expectedQty": "3299885262345883992666", + "reserves": [ + "30350319450276553287862886", + "141419525824020400604414285", + "46335642003630736878281605" + ] + }, + { + "type": "redeemMasset", + "inputQty": "405419710375089413921177", + "expectedQtys": [ + "56542713558350594180538", + "263464895429708177487560", + "86323405512942564304278" + ], + "redemptionFee": "121625913112526824176", + "reserves": [ + "30293776736718202693682348", + "141156060928590692426926725", + "46249318598117794313977327" + ], + "mAssetSupply": "217145745399008864459705086" + }, + { + "type": "redeemMasset", + "inputQty": "42045749185890825011", + "expectedQtys": [ + "5863998941651242565", + "27323730516889822354", + "8952530338771958128" + ], + "redemptionFee": "12613724755767247", + "reserves": [ + "30293770872719261042439783", + "141156033604860175537104371", + "46249309645587455542019199" + ], + "mAssetSupply": "217145703365873403324647322" + }, + { + "type": "redeemMasset", + "inputQty": "2276574090100238336", + "expectedQtys": [ + "317507199025441618", + "1479447938116568322", + "484736245749279632" + ], + "redemptionFee": "682972227030071", + "reserves": [ + "30293770555212062016998165", + "141156032125412237420536049", + "46249309160851209792739567" + ], + "mAssetSupply": "217145701089982285451439057" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "84507104858388021248", + "314715907644127182848", + "2436193939363895181312" + ], + "expectedQty": "2849355391603819328386", + "swapFee": "1710639618733531716", + "reserves": [ + "30293686048107203628976917", + "141155717409504593293353201", + "46246872966911845897558255" + ], + "mAssetSupply": "217142851734590681632110671" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "2578585869538487957454848", + "expectedQty": "2552077000639264000143731", + "reserves": [ + "30293686048107203628976917", + "143734303279043081250808049", + "46246872966911845897558255" + ] + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "93244063395004010201088", + "expectedQty": "94168409854752546312445", + "swapFee": "55946438037002406120", + "reserves": [ + "30293686048107203628976917", + "143640134869188328704495604", + "46246872966911845897558255" + ], + "mAssetSupply": "219601740618272978624459434" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "289334961068681052815360", + "expectedQty": "286320030313902274296262", + "reserves": [ + "30293686048107203628976917", + "143929469830257009757310964", + "46246872966911845897558255" + ] + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "3800073117305281024", + "expectedQty": "3723057367001846614", + "swapFee": "2280043870383168", + "reserves": [ + "30293682325049836627130303", + "143929469830257009757310964", + "46246872966911845897558255" + ], + "mAssetSupply": "219888056850793807463857840" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "18013841108953869582336", + "expectedQty": "17648539296616058066659", + "swapFee": "10808304665372321749", + "reserves": [ + "30276033785753220569063644", + "143929469830257009757310964", + "46246872966911845897558255" + ], + "mAssetSupply": "219870053817989518966597253" + }, + { + "type": "redeemMasset", + "inputQty": "13730873591024535679795", + "expectedQtys": [ + "1890169537030137030153", + "8985691497083317838341", + "2887248411847568844075" + ], + "redemptionFee": "4119262077307360703", + "reserves": [ + "30274143616216190432033491", + "143920484138759926439472623", + "46243985718499998328714180" + ], + "mAssetSupply": "219856327063660571738278161" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "573783151972293541888", + "expectedQty": "562140300985993334746", + "swapFee": "344269891183376125", + "reserves": [ + "30273581475915204438698745", + "143920484138759926439472623", + "46243985718499998328714180" + ], + "mAssetSupply": "219855753624778490628112398" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "97019009814484664320", + "12559687029004838912", + "110543973745326784512" + ], + "expectedQty": "222686990830351633761", + "swapFee": "133692409944177486", + "reserves": [ + "30273484456905389954034425", + "143920471579072897434633711", + "46243875174526253001929668" + ], + "mAssetSupply": "219855530937787660276478637" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "86333189904747773034496", + "expectedQty": "85701800095724882175717", + "swapFee": "51799913942848663820", + "reserves": [ + "30273484456905389954034425", + "143920471579072897434633711", + "46158173374430528119753951" + ], + "mAssetSupply": "219769249547796855352107961" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "2654813997604558340096", + "3435625393498632486912", + "5462593320890668154880" + ], + "expectedQty": "11607530960971724185892", + "swapFee": "6968699796460911058", + "reserves": [ + "30270829642907785395694329", + "143917035953679398802146799", + "46152710781109637451599071" + ], + "mAssetSupply": "219757642016835883627922069" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "347662016526764319178752", + "1054727524995417692438528", + "1400715604265670778290176" + ], + "expectedQty": "2808846045838531859218499", + "swapFee": "1686319419154611882660", + "reserves": [ + "29923167626381021076515577", + "142862308428683981109708271", + "44751995176843966673308895" + ], + "mAssetSupply": "216948795970997351768703570" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "22196550374822504300544", + "46031305753270677405696", + "55406474377932249759744" + ], + "expectedQty": "123998177749375181571393", + "swapFee": "74443572793301089596", + "reserves": [ + "29900971076006198572215033", + "142816277122930710432302575", + "44696588702466034423549151" + ], + "mAssetSupply": "216824797793247976587132177" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "6915966837017033048064", + "5811358346168283168768", + "9646486328182034137088" + ], + "expectedQty": "22522557970178230040425", + "swapFee": "13521647770769399664", + "reserves": [ + "29894055109169181539166969", + "142810465764584542149133807", + "44686942216137852389412063" + ], + "mAssetSupply": "216802275235277798357091752" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "495194693033840408002560", + "expectedQty": "491242046264481141192558", + "swapFee": "297116815820304244801", + "reserves": [ + "29894055109169181539166969", + "142810465764584542149133807", + "44195700169873371248219505" + ], + "mAssetSupply": "216307377659059778253333993" + }, + { + "type": "mintMulti", + "inputQtys": [ + "2520490396856703488", + "1396132133518319104", + "1527188866114779392" + ], + "expectedQty": "5491411018132569924", + "reserves": [ + "29894057629659578395870457", + "142810467160716675667452911", + "44195701697062237362998897" + ], + "mAssetSupply": "216307383150470796385903917" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "12498061624005874", + "expectedQty": "12396756260894621", + "swapFee": "7498836974403", + "reserves": [ + "29894057629659578395870457", + "142810467160716675667452911", + "44195701684665481102104276" + ], + "mAssetSupply": "216307383137980233598872446" + }, + { + "type": "mintMulti", + "inputQtys": [ + "202621829096461408", + "163651078675898400", + "142941382035120432" + ], + "expectedQty": "512641720243089146", + "reserves": [ + "29894057832281407492331865", + "142810467324367754343351311", + "44195701827606863137224708" + ], + "mAssetSupply": "216307383650621953841961592" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "3284390123603216896", + "9112409678202035200", + "14008465674530922496" + ], + "expectedQty": "26479974993357713551", + "swapFee": "15897523510120700", + "reserves": [ + "29894054547891283889114969", + "142810458211958076141316111", + "44195687819141188606302212" + ], + "mAssetSupply": "216307357170646960484248041" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "1884343494105971883507712", + "expectedQty": "1903441434405991549327522", + "swapFee": "1130606096463583130104", + "reserves": [ + "29894054547891283889114969", + "140907016777552084591988589", + "44195687819141188606302212" + ], + "mAssetSupply": "214424144282637452183870433" + }, + { + "type": "mintMulti", + "inputQtys": [ + "2851669303748364108562432", + "171393424556855425761280", + "2813164621125551193587712" + ], + "expectedQty": "5904459339801582466477192", + "reserves": [ + "32745723851639647997677401", + "141078410202108940017749869", + "47008852440266739799889924" + ], + "mAssetSupply": "220328603622439034650347625" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "508865744135671360", + "outputIndex": 2, + "expectedQty": "513699111222552227", + "swapFee": "310301513547289", + "reserves": [ + "32745724360505392133348761", + "141078410202108940017749869", + "47008851926567628577337697" + ], + "mAssetSupply": "220328603622749336163894914", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemBassets", + "inputQtys": [ + "31298554934543405056", + "11060144954870583296", + "32166536213074640896" + ], + "expectedQty": "75129708896075922083", + "swapFee": "45104888270607918", + "reserves": [ + "32745693061950457589943705", + "141078399141963985147166573", + "47008819760031415502696801" + ], + "mAssetSupply": "220328528493040440087972831" + }, + { + "type": "redeemMasset", + "inputQty": "49489926838375854899", + "expectedQtys": [ + "7353091269671153383", + "31679352246642248429", + "10555896359288813805" + ], + "redemptionFee": "14846978051512756", + "reserves": [ + "32745685708859187918790322", + "141078367462611738504918144", + "47008809204135056213882996" + ], + "mAssetSupply": "220328479017960579763630688" + }, + { + "type": "mintMulti", + "inputQtys": [ + "718063608578582463381504", + "191223092657711313059840", + "483068064494201954369536" + ], + "expectedQty": "1404979992898670570333281", + "reserves": [ + "33463749317437770382171826", + "141269590555269449817977984", + "47491877268629258168252532" + ], + "mAssetSupply": "221733459010859250333963969" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "191904098653204186660864", + "expectedQty": "190135843847885302269026", + "reserves": [ + "33463749317437770382171826", + "141461494653922654004638848", + "47491877268629258168252532" + ] + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "485337807580408433344512", + "expectedQty": "488221779657211495675498", + "reserves": [ + "33463749317437770382171826", + "141461494653922654004638848", + "47977215076209666601597044" + ] + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "6697709785187804889743360", + "outputIndex": 2, + "expectedQty": "6575668200366697841767786", + "swapFee": "3980525243218424438065", + "reserves": [ + "33463749317437770382171826", + "148159204439110458894382208", + "41401546875842968759829258" + ], + "mAssetSupply": "222415797159607565556346558", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemMasset", + "inputQty": "12582096957283715619225", + "expectedQtys": [ + "1892481696894238667698", + "8378875300781651385634", + "2341389452281518718617" + ], + "redemptionFee": "3774629087185114685", + "reserves": [ + "33461856835740876143504128", + "148150825563809677242996574", + "41399205486390687241110641" + ], + "mAssetSupply": "222403218837279369025842018" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "313471614358438530777088", + "511967834869085981638656", + "339103240536714729488384" + ], + "expectedQty": "1167835017230873313947740", + "swapFee": "701121683348533108233", + "reserves": [ + "33148385221382437612727040", + "147638857728940591261357918", + "41060102245853972511622257" + ], + "mAssetSupply": "221235383820048495711894278" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "12346377941787", + "13601503485225", + "8484144586600" + ], + "expectedQty": "34584410023505", + "swapFee": "20763103876", + "reserves": [ + "33148385221370091234785253", + "147638857728926989757872693", + "41060102245845488367035657" + ], + "mAssetSupply": "221235383820013911301870773" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "542216614866707584", + "expectedQty": "551579443380557753", + "reserves": [ + "33148385763586706101492837", + "147638857728926989757872693", + "41060102245845488367035657" + ] + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "263653674964187055390720", + "outputIndex": 0, + "expectedQty": "261621252369002357775342", + "swapFee": "159803815219278659229", + "reserves": [ + "32886764511217703743717495", + "147638857728926989757872693", + "41323755920809675422426377" + ], + "mAssetSupply": "221235544175408573961087755", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mintMulti", + "inputQtys": [ + "401816036057483652890624", + "99598994957557687123968", + "159525532314853919686656" + ], + "expectedQty": "668439921329809408191882", + "reserves": [ + "33288580547275187396608119", + "147738456723884547444996661", + "41483281453124529342113033" + ], + "mAssetSupply": "221903984096738383369279637" + }, + { + "type": "mintMulti", + "inputQtys": [ + "1981156108126083", + "793894537529333", + "4043088361519915" + ], + "expectedQty": "6884044171423376", + "reserves": [ + "33288580549256343504734202", + "147738456724678441982525994", + "41483281457167617703632948" + ], + "mAssetSupply": "221903984103622427540703013" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "7231354359016216068096", + "110556251715920388423680", + "121899992936440443961344" + ], + "expectedQty": "239844054347357124025201", + "swapFee": "143992828305397512922", + "reserves": [ + "33281349194897327288666106", + "147627900472962521594102314", + "41361381464231177259671604" + ], + "mAssetSupply": "221664140049275070416677812" + }, + { + "type": "redeemMasset", + "inputQty": "24847220462352628029849", + "expectedQtys": [ + "3729520416970307444481", + "16543237646531137578590", + "4634971849897183557051" + ], + "redemptionFee": "7454166138705788408", + "reserves": [ + "33277619674480356981221625", + "147611357235315990456523724", + "41356746492381280076114553" + ], + "mAssetSupply": "221639300282978856494436371" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "6227496259693149421568", + "expectedQty": "6291647997704575343196", + "swapFee": "3736497755815889652", + "reserves": [ + "33277619674480356981221625", + "147605065587318285881180528", + "41356746492381280076114553" + ], + "mAssetSupply": "221633076523216919160904455" + }, + { + "type": "redeemMasset", + "inputQty": "222988583708110041907", + "expectedQtys": [ + "33471101145989371416", + "148463265349542261343", + "41597201315966739903" + ], + "redemptionFee": "66896575112433012", + "reserves": [ + "33277586203379210991850209", + "147604917124052936338919185", + "41356704895179964109374650" + ], + "mAssetSupply": "221632853601529786163295560" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "114538898380548938399744", + "expectedQty": "115688878034261502438016", + "reserves": [ + "33277586203379210991850209", + "147604917124052936338919185", + "41471243793560513047774394" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "174526754764256062734336", + "1469299547668994003566592", + "2828066001849014168846336" + ], + "expectedQty": "4485572146957901139237413", + "reserves": [ + "33452112958143467054584545", + "149074216671721930342485777", + "44299309795409527216620730" + ], + "mAssetSupply": "226234114626521948804970989" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "19153117907316808", + "outputIndex": 1, + "expectedQty": "19678654207658948", + "swapFee": "11691261804556", + "reserves": [ + "33452112977296584961901353", + "149074216652043276134826829", + "44299309795409527216620730" + ], + "mAssetSupply": "226234114626533640066775545", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "483481795696451643244544", + "expectedQty": "479016282675592184150434", + "swapFee": "290089077417870985946", + "reserves": [ + "33452112977296584961901353", + "149074216652043276134826829", + "43820293512733935032470296" + ], + "mAssetSupply": "225750922919914606294516947" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "4164024744102655950848", + "4570794008252706717696", + "73080941944410464256" + ], + "expectedQty": "8832809306891508974616", + "swapFee": "5302867304517615954", + "reserves": [ + "33447948952552482305950505", + "149069645858035023428109133", + "43820220431791990622006040" + ], + "mAssetSupply": "225742090110607714785542331" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "1218568211811155664961536", + "outputIndex": 0, + "expectedQty": "1206385235790381068863034", + "swapFee": "737367720434186344472", + "reserves": [ + "32241563716762101237087471", + "149069645858035023428109133", + "45038788643603146286967576" + ], + "mAssetSupply": "225742827478328148971886803", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemBassets", + "inputQtys": [ + "16939458739435401216", + "41914591935313641472", + "3270231098027941888" + ], + "expectedQty": "62025207739943097349", + "swapFee": "37237467124240402", + "reserves": [ + "32241546777303361801686255", + "149069603943443088114467661", + "45038785373372048259025688" + ], + "mAssetSupply": "225742765453120409028789454" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "343479944412947340591104", + "145865295414559114264576", + "104999343017280244023296" + ], + "expectedQty": "600183733395442848072765", + "swapFee": "360326435898804991838", + "reserves": [ + "31898066832890414461095151", + "148923738648028529000203085", + "44933786030354768015002392" + ], + "mAssetSupply": "225142581719724966180716689" + }, + { + "type": "redeemMasset", + "inputQty": "1312225689558201344", + "expectedQtys": [ + "185859579236021226", + "867729807840197456", + "261814441885611707" + ], + "redemptionFee": "393667706867460", + "reserves": [ + "31898066647030835225073925", + "148923737780298721160005629", + "44933785768540326129390685" + ], + "mAssetSupply": "225142580407892944329382805" + }, + { + "type": "mintMulti", + "inputQtys": [ + "3630919434897918189895680", + "3791698231539076492689408", + "440910644166808681054208" + ], + "expectedQty": "7891510633505291528482453", + "reserves": [ + "35528986081928753414969605", + "152715436011837797652695037", + "45374696412707134810444893" + ], + "mAssetSupply": "233034091041398235857865258" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "4725024764148281344", + "expectedQty": "4681806650952194022", + "swapFee": "2835014858488968", + "reserves": [ + "35528986081928753414969605", + "152715436011837797652695037", + "45374691730900483858250871" + ], + "mAssetSupply": "233034086319208486568072882" + }, + { + "type": "redeemMasset", + "inputQty": "1973288614519883012505", + "expectedQtys": [ + "300762485629605220564", + "1292777509130533909605", + "384109049388382432766" + ], + "redemptionFee": "591986584355964903", + "reserves": [ + "35528685319443123809749041", + "152714143234328667118785432", + "45374307621851095475818105" + ], + "mAssetSupply": "233032113622580551041025280" + }, + { + "type": "mintMulti", + "inputQtys": [ + "5064891482465062912", + "81843433951028903936", + "47437500933420761088" + ], + "expectedQty": "134007884205764634925", + "reserves": [ + "35528690384334606274811953", + "152714225077762618147689368", + "45374355059352028896579193" + ], + "mAssetSupply": "233032247630464756805660205" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "29670364878658317844480", + "expectedQty": "29184709906988165673204", + "swapFee": "17802218927194990706", + "reserves": [ + "35499505674427618109138749", + "152714225077762618147689368", + "45374355059352028896579193" + ], + "mAssetSupply": "233002595067805025682806431" + }, + { + "type": "redeemMasset", + "inputQty": "1089638418584034292531", + "expectedQtys": [ + "165963905787306768668", + "713954991250621428672", + "212129860547741997205" + ], + "redemptionFee": "326891525575210287", + "reserves": [ + "35499339710521830802370081", + "152713511122771367526260696", + "45374142929491481154581988" + ], + "mAssetSupply": "233001505756277967223724187" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "109789758845225873178624", + "expectedQty": "111545328547229014082483", + "reserves": [ + "35609129469367056675548705", + "152713511122771367526260696", + "45374142929491481154581988" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "15599796462476290048", + "2248240502440044544", + "10856171859618107392" + ], + "expectedQty": "29023751945099407314", + "swapFee": "17424705990654036", + "reserves": [ + "35609113869570594199258657", + "152713508874530865086216152", + "45374132073319621536474596" + ], + "mAssetSupply": "233113022061073251138399356" + }, + { + "type": "redeemMasset", + "inputQty": "35214464500307", + "expectedQtys": [ + "5377561829882", + "23062251401123", + "6852240176357" + ], + "redemptionFee": "10564339350", + "reserves": [ + "35609113869565216637428775", + "152713508874507802834815029", + "45374132073312769296298239" + ], + "mAssetSupply": "233113022061038047238238399" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "329359898178792489746432", + "expectedQty": "326318740827987012854769", + "swapFee": "197615938907275493847", + "reserves": [ + "35609113869565216637428775", + "152713508874507802834815029", + "45047813332484782283443470" + ], + "mAssetSupply": "232783859778798162023985814" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "705445734850722688", + "expectedQty": "716680405857498511", + "reserves": [ + "35609114575010951488151463", + "152713508874507802834815029", + "45047813332484782283443470" + ] + }, + { + "type": "redeemMasset", + "inputQty": "221249591613865390715699", + "expectedQtys": [ + "33834555755158376890779", + "145103122957356452291991", + "42802882633749241326319" + ], + "redemptionFee": "66374877484159617214", + "reserves": [ + "35575280019255793111260684", + "152568405751550446382523038", + "45005010449851033042117151" + ], + "mAssetSupply": "232562677278742186650385840" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "63836832654056895807488", + "outputIndex": 1, + "expectedQty": "65018045550651968628785", + "swapFee": "38638528381409861054", + "reserves": [ + "35575280019255793111260684", + "152503387705999794413894253", + "45068847282505089937924639" + ], + "mAssetSupply": "232562715917270568060246894", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "2126967263491468151488512", + "expectedQty": "2090117487579737806561817", + "swapFee": "1276180358094880890893", + "reserves": [ + "33485162531676055304698867", + "152503387705999794413894253", + "45068847282505089937924639" + ], + "mAssetSupply": "230437024834137194789649275" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "706150984504975061680128", + "outputIndex": 1, + "expectedQty": "719279397655993050342611", + "swapFee": "427296735061335826205", + "reserves": [ + "33485162531676055304698867", + "151784108308343801363551642", + "45774998267010064999604767" + ], + "mAssetSupply": "230437452130872256125475480", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "66209575138690336817152", + "outputIndex": 2, + "expectedQty": "64942416563281327440317", + "swapFee": "39310308443038842788", + "reserves": [ + "33485162531676055304698867", + "151850317883482491700368794", + "45710055850446783672164450" + ], + "mAssetSupply": "230437491441180699164318268", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "110274409480489582592", + "outputIndex": 1, + "expectedQty": "112294545465916707996", + "swapFee": "66711282041121955", + "reserves": [ + "33485162531676055304698867", + "151850205588937025783660798", + "45710166124856264161747042" + ], + "mAssetSupply": "230437491507891981205440223", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemBassets", + "inputQtys": [ + "55080598151288842092544", + "22559630831724038979584", + "1308569753357267501056" + ], + "expectedQty": "79718873044353359877077", + "swapFee": "47860039850522329323", + "reserves": [ + "33430081933524766462606323", + "151827645958105301744681214", + "45708857555102906894245986" + ], + "mAssetSupply": "230357772634847627845563146" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "3083286945818539982848", + "expectedQty": "3114079331634916986910", + "swapFee": "1849972167491123989", + "reserves": [ + "33430081933524766462606323", + "151824531878773666827694304", + "45708857555102906894245986" + ], + "mAssetSupply": "230354691197873976796704287" + }, + { + "type": "redeemMasset", + "inputQty": "919412376359640494820556", + "expectedQtys": [ + "133389123109646309301009", + "605793943733445081011794", + "182382575063466273554216" + ], + "redemptionFee": "275823712907892148446", + "reserves": [ + "33296692810415120153305314", + "151218737935040221746682510", + "45526474980039440620691770" + ], + "mAssetSupply": "229435554645227244194032177" + }, + { + "type": "mintMulti", + "inputQtys": [ + "219021143284866239954944", + "702845554516888888803328", + "785714175109342599053312" + ], + "expectedQty": "1710581153509108659105457", + "reserves": [ + "33515713953699986393260258", + "151921583489557110635485838", + "46312189155148783219745082" + ], + "mAssetSupply": "231146135798736352853137634" + }, + { + "type": "mintMulti", + "inputQtys": [ + "38054389902865080320", + "735925676014033305600", + "662179191829059993600" + ], + "expectedQty": "1434482032746217105310", + "reserves": [ + "33515752008089889258340578", + "151922319415233124668791438", + "46312851334340612279738682" + ], + "mAssetSupply": "231147570280769099070242944" + }, + { + "type": "redeemMasset", + "inputQty": "68877717712788035993", + "expectedQtys": [ + "9984080543827821096", + "45256471437093365435", + "13796236403252131281" + ], + "redemptionFee": "20663315313836410", + "reserves": [ + "33515742024009345430519482", + "151922274158761687575426003", + "46312837538104209027607401" + ], + "mAssetSupply": "231147501423714701596043361" + }, + { + "type": "redeemMasset", + "inputQty": "1243525371715464775231078", + "expectedQtys": [ + "180253612950295843525107", + "817064971592303287288166", + "249078665369937285222677" + ], + "redemptionFee": "373057611514639432569", + "reserves": [ + "33335488411059049586994375", + "151105209187169384288137837", + "46063758872734271742384724" + ], + "mAssetSupply": "229904349109610751460244852" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "17522668632852203044864", + "expectedQty": "17662207813006838848773", + "reserves": [ + "33335488411059049586994375", + "151105209187169384288137837", + "46081281541367123945429588" + ] + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "15102507165728956416", + "expectedQty": "15251744514638527834", + "swapFee": "9061504299437373", + "reserves": [ + "33335488411059049586994375", + "151105193935424869649610003", + "46081281541367123945429588" + ], + "mAssetSupply": "229921996223978096869574582" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "14098460530547", + "expectedQty": "13952131697912", + "reserves": [ + "33335488411059049586994375", + "151105193935438968110140550", + "46081281541367123945429588" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "321150857007751413891072", + "980002670504463323627520", + "689862011345939418054656" + ], + "expectedQty": "1992087609170041782686799", + "reserves": [ + "33656639268066801000885447", + "152085196605943431433768070", + "46771143552713063363484244" + ], + "mAssetSupply": "231914083833162090783959293" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "2027034272384259", + "expectedQty": "2046895041117614", + "swapFee": "1216220563430", + "reserves": [ + "33656639268066801000885447", + "152085196603896536392650456", + "46771143552713063363484244" + ], + "mAssetSupply": "231914083831136272732138464" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "1671950049750961881088", + "outputIndex": 2, + "expectedQty": "1640988698767678299526", + "swapFee": "992840251210631377", + "reserves": [ + "33656639268066801000885447", + "152086868553946287354531544", + "46769502564014295685184718" + ], + "mAssetSupply": "231914084823976523942769841", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemMasset", + "inputQty": "31145016561405290086", + "expectedQtys": [ + "4518579012673329293", + "20418453752246605757", + "6279049165774450499" + ], + "redemptionFee": "9343504968421587", + "reserves": [ + "33656634749487788327556154", + "152086848135492535107925787", + "46769496284965129910734219" + ], + "mAssetSupply": "231914053688303467505901342" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "7762308786838905410289664", + "expectedQty": "7809918965524306956056849", + "reserves": [ + "33656634749487788327556154", + "152086848135492535107925787", + "54531805071804035321023883" + ] + }, + { + "type": "redeemMasset", + "inputQty": "627452365129799801241", + "expectedQtys": [ + "88066284992862432328", + "397951958395671441275", + "142688463132868680109" + ], + "redemptionFee": "188235709538939940", + "reserves": [ + "33656546683202795465123826", + "152086450183534139436484512", + "54531662383340902452343774" + ], + "mAssetSupply": "239723345389698354201096890" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "36296486381299311837184", + "expectedQty": "36617568627979345281195", + "swapFee": "21777891828779587102", + "reserves": [ + "33656546683202795465123826", + "152049832614906160091203317", + "54531662383340902452343774" + ], + "mAssetSupply": "239687070681208883668846808" + }, + { + "type": "redeemMasset", + "inputQty": "10909765154272026624", + "expectedQtys": [ + "1531475451171461474", + "6918730795416808040", + "2481356837875963105" + ], + "redemptionFee": "3272929546281607", + "reserves": [ + "33656545151727344293662352", + "152049825696175364674395277", + "54531659901984064576380669" + ], + "mAssetSupply": "239687059774716658943101791" + }, + { + "type": "mintMulti", + "inputQtys": [ + "715411486637414285312", + "395349293444871290880", + "1806125181421494468608" + ], + "expectedQty": "2934772008761940782519", + "reserves": [ + "33657260563213981707947664", + "152050221045468809545686157", + "54533466027165486070849277" + ], + "mAssetSupply": "239689994546725420883884310" + }, + { + "type": "redeemMasset", + "inputQty": "17605740523374913126", + "expectedQtys": [ + "2471455802837960628", + "11165062005561339987", + "4004397529875344888" + ], + "redemptionFee": "5281722157012473", + "reserves": [ + "33657258091758178869987036", + "152050209880406803984346170", + "54533462022767956195504389" + ], + "mAssetSupply": "239689976946266619665983657" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "507348519996923024769024", + "expectedQty": "516486969190352145988118", + "reserves": [ + "34164606611755101894756060", + "152050209880406803984346170", + "54533462022767956195504389" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "164009141374022909952", + "400173578070272573440", + "373674528393523429376" + ], + "expectedQty": "938833912594111788788", + "swapFee": "563638530674871996", + "reserves": [ + "34164442602613727871846108", + "152049809706828733711772730", + "54533088348239562672075013" + ], + "mAssetSupply": "240205525081544377700182987" + }, + { + "type": "redeemMasset", + "inputQty": "12953610017676044376473", + "expectedQtys": [ + "1841839815864185775104", + "8197159742075955218559", + "2939934204989568392306" + ], + "redemptionFee": "3886083005302813312", + "reserves": [ + "34162600762797863686071004", + "152041612547086657756554171", + "54530148414034573103682707" + ], + "mAssetSupply": "240192575357609706958619826" + }, + { + "type": "mintMulti", + "inputQtys": [ + "18012322708838689013760", + "3245550347011368681472", + "10399248056327325351936" + ], + "expectedQty": "31995450751964042895134", + "reserves": [ + "34180613085506702375084764", + "152044858097433669125235643", + "54540547662090900429034643" + ], + "mAssetSupply": "240224570808361671001514960" + }, + { + "type": "mintMulti", + "inputQtys": [ + "6378557722360066793799680", + "128515296928876558548992", + "441664774601298556223488" + ], + "expectedQty": "7043709460706115920959784", + "reserves": [ + "40559170807866769168884444", + "152173373394362545683784635", + "54982212436692198985258131" + ], + "mAssetSupply": "247268280269067786922474744" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "917310684916642611200", + "expectedQty": "921878199002216219334", + "reserves": [ + "40559170807866769168884444", + "152173373394362545683784635", + "54983129747377115627869331" + ] + }, + { + "type": "redeemMasset", + "inputQty": "791202512729580236", + "expectedQtys": [ + "129740745808484064", + "486772450302366550", + "175880130639301546" + ], + "redemptionFee": "237360753818874", + "reserves": [ + "40559170678126023360400380", + "152173372907590095381418085", + "54983129571496984988567785" + ], + "mAssetSupply": "247269201356301637162932716" + }, + { + "type": "mintMulti", + "inputQtys": [ + "15394298972658288558080", + "13593341778411263098880", + "14996945507901440524288" + ], + "expectedQty": "44138439875175282665279", + "reserves": [ + "40574564977098681648958460", + "152186966249368506644516965", + "54998126517004886429092073" + ], + "mAssetSupply": "247313339796176812445597995" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "40027181783946056", + "expectedQty": "39707720163951808", + "reserves": [ + "40574564977098681648958460", + "152186966289395688428463021", + "54998126517004886429092073" + ] + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "822552348297371133673472", + "expectedQty": "826546029417843942693123", + "reserves": [ + "40574564977098681648958460", + "152186966289395688428463021", + "55820678865302257562765545" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "273570697691820883968", + "315467843858157404160", + "162682191099954200576" + ], + "expectedQty": "753344677320471294232", + "swapFee": "452278173296260532", + "reserves": [ + "40574291406400989828074492", + "152186650821551830271058861", + "55820516183111157608564969" + ], + "mAssetSupply": "248139132520625056080948694" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "74038672768611532144640", + "173220409480635308048384", + "182540321621091268165632" + ], + "expectedQty": "430202458947520979817779", + "swapFee": "258276441233252539414", + "reserves": [ + "40500252733632378295929852", + "152013430412071194963010477", + "55637975861490066340399337" + ], + "mAssetSupply": "247708930061677535101130915" + }, + { + "type": "mintMulti", + "inputQtys": [ + "89987919021077673541632", + "167641875131331606740992", + "241597011359096958353408" + ], + "expectedQty": "500148202322234023876130", + "reserves": [ + "40590240652653455969471484", + "152181072287202526569751469", + "55879572872849163298752745" + ], + "mAssetSupply": "248209078263999769125007045" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "94746180541827174629376", + "outputIndex": 2, + "expectedQty": "93497940673380664907839", + "swapFee": "56398551931957517802", + "reserves": [ + "40590240652653455969471484", + "152275818467744353744380845", + "55786074932175782633844906" + ], + "mAssetSupply": "248209134662551701082524847", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "96914229501428664107008", + "outputIndex": 0, + "expectedQty": "94923059446293947681019", + "swapFee": "57688190658086757742", + "reserves": [ + "40495317593207162021790465", + "152372732697245782408487853", + "55786074932175782633844906" + ], + "mAssetSupply": "248209192350742359169282589", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mintMulti", + "inputQtys": [ + "12033979257340978790400", + "490392041489676080513024", + "218946803774102920232960" + ], + "expectedQty": "718665830631636017414703", + "reserves": [ + "40507351572464503000580865", + "152863124738735458489000877", + "56005021735949885554077866" + ], + "mAssetSupply": "248927858181373995186697292" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "462455578268397952", + "expectedQty": "456516390775520476", + "swapFee": "277473346961038", + "reserves": [ + "40507351115948112225060389", + "152863124738735458489000877", + "56005021735949885554077866" + ], + "mAssetSupply": "248927857719195890265260378" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "8037731880574947328", + "767989062124311040", + "4973531726456035328" + ], + "expectedQty": "13896401521789331641", + "swapFee": "8342846621046226", + "reserves": [ + "40507343078216231650113061", + "152863123970746396364689837", + "56005016762418159098042538" + ], + "mAssetSupply": "248927843822794368475928737" + }, + { + "type": "redeemMasset", + "inputQty": "3056147715259272213299", + "expectedQtys": [ + "497169312889783912576", + "1876174750932800593896", + "687380943459755418872" + ], + "redemptionFee": "916844314577781663", + "reserves": [ + "40506845908903341866200485", + "152861247795995463564095941", + "56004329381474699342623666" + ], + "mAssetSupply": "248924788591923423781497101" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "165528739287188013056", + "expectedQty": "163402890103370462871", + "swapFee": "99317243572312807", + "reserves": [ + "40506682506013238495737614", + "152861247795995463564095941", + "56004329381474699342623666" + ], + "mAssetSupply": "248924623162501380165796852" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "347107560060647505920", + "outputIndex": 2, + "expectedQty": "349544900213807562914", + "swapFee": "210847431483681414", + "reserves": [ + "40507029613573299143243534", + "152861247795995463564095941", + "56003979836574485535060752" + ], + "mAssetSupply": "248924623373348811649478266", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "11723821697220594", + "expectedQty": "11661518050109310", + "swapFee": "7034293018332", + "reserves": [ + "40507029613573299143243534", + "152861247795995463564095941", + "56003979824912967484951442" + ], + "mAssetSupply": "248924623361632024245276004" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "277420233011809551908864", + "102526780939378905579520", + "125291915775622435045376" + ], + "expectedQty": "508479624153288105222778", + "swapFee": "305270937054205386365", + "reserves": [ + "40229609380561489591334670", + "152758721015056084658516421", + "55878687909137345049906066" + ], + "mAssetSupply": "248416143737478736140053226" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "13015138229559802", + "expectedQty": "13112224452834410", + "swapFee": "7809082937735", + "reserves": [ + "40229609380561489591334670", + "152758721001943860205682011", + "55878687909137345049906066" + ], + "mAssetSupply": "248416143724471406993431159" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "96062549079535840", + "expectedQty": "94813031311165263", + "swapFee": "57637529447721", + "reserves": [ + "40229609285748458280169407", + "152758721001943860205682011", + "55878687909137345049906066" + ], + "mAssetSupply": "248416143628466495443343040" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "198201726512961748992", + "expectedQty": "199143257461920326142", + "reserves": [ + "40229609285748458280169407", + "152758721001943860205682011", + "55878886110863858011655058" + ] + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "8229433832965337513984", + "outputIndex": 0, + "expectedQty": "8160938264937742306091", + "swapFee": "4961109974072517603", + "reserves": [ + "40221448347483520537863316", + "152758721001943860205682011", + "55887115544696823349169042" + ], + "mAssetSupply": "248416347732833931436186785", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemBassets", + "inputQtys": [ + "5822494387424028786688", + "2993801166868682637312", + "5624668271793268588544" + ], + "expectedQty": "14516955730374063166012", + "swapFee": "8715402679832337301", + "reserves": [ + "40215625853096096509076628", + "152755727200776991523044699", + "55881490876425030080580498" + ], + "mAssetSupply": "248401830777103557373020773" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "348871786796080036839424", + "98908144637712506290176", + "154225290462007618699264" + ], + "expectedQty": "606371791976783760879248", + "swapFee": "364041500086121929685", + "reserves": [ + "39866754066300016472237204", + "152656819056139279016754523", + "55727265585963022461881234" + ], + "mAssetSupply": "247795458985126773612141525" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "314203223178870521856", + "965751385562059904", + "74153570135792467968" + ], + "expectedQty": "393690830319366825910", + "swapFee": "236356311978807379", + "reserves": [ + "39866439863076837601715348", + "152656818090387893454694619", + "55727191432392886669413266" + ], + "mAssetSupply": "247795065294296454245315615" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "145925413977594078953472", + "145981476206880556580864", + "148926531054629300469760" + ], + "expectedQty": "442238739580939354918022", + "swapFee": "265502545275729050381", + "reserves": [ + "39720514449099243522761876", + "152510836614181012898113755", + "55578264901338257368943506" + ], + "mAssetSupply": "247352826554715514890397593" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "294592037711672026071040", + "expectedQty": "293000312550203953264252", + "swapFee": "176755222627003215642", + "reserves": [ + "39720514449099243522761876", + "152510836614181012898113755", + "55285264588788053415679254" + ], + "mAssetSupply": "247058411272226469867542195" + }, + { + "type": "mintMulti", + "inputQtys": [ + "142546411590641759813632", + "41465817755235366469632", + "138927513123185749917696" + ], + "expectedQty": "325105358237545888816152", + "reserves": [ + "39863060860689885282575508", + "152552302431936248264583387", + "55424192101911239165596950" + ], + "mAssetSupply": "247383516630464015756358347" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "43672388726331814182912", + "expectedQty": "44229437595448438569858", + "reserves": [ + "39906733249416217096758420", + "152552302431936248264583387", + "55424192101911239165596950" + ] + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "12431246165999223832576", + "expectedQty": "12589558996303002754664", + "reserves": [ + "39919164495582216320590996", + "152552302431936248264583387", + "55424192101911239165596950" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "1048948622667547311865856", + "933476215857469051633664", + "5217378334248552991031296" + ], + "expectedQty": "7227666127231092231488004", + "reserves": [ + "40968113118249763632456852", + "153485778647793717316217051", + "60641570436159792156628246" + ], + "mAssetSupply": "254668001754286859429170873" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "1386860313401952", + "expectedQty": "1391870647843347", + "reserves": [ + "40968113118249763632456852", + "153485778647793717316217051", + "60641570437546652470030198" + ] + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "12834349931782094192640", + "outputIndex": 2, + "expectedQty": "12939718282641736872675", + "swapFee": "7796575548598923080", + "reserves": [ + "40980947468181545726649492", + "153485778647793717316217051", + "60628630719264010733157523" + ], + "mAssetSupply": "254668009552254278675937300", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mintMulti", + "inputQtys": [ + "278196693442137325568", + "163462174988904497152", + "100312130670450917376" + ], + "expectedQty": "544566918914248948629", + "reserves": [ + "40981225664874987863975060", + "153485942109968706220714203", + "60628731031394681184074899" + ], + "mAssetSupply": "254668554119173192924885929" + }, + { + "type": "mintMulti", + "inputQtys": [ + "205672155798869147648", + "54556413198225178624", + "203734831222720987136" + ], + "expectedQty": "466850926534053809780", + "reserves": [ + "40981431337030786733122708", + "153485996666381904445892827", + "60628934766225903905062035" + ], + "mAssetSupply": "254669020970099726978695709" + }, + { + "type": "redeemMasset", + "inputQty": "726629971672791712687718", + "expectedQtys": [ + "116894480048065425649086", + "437799881302919303510064", + "172936561124015140055846" + ], + "redemptionFee": "217988991501837513806", + "reserves": [ + "40864536856982721307473622", + "153048196785078985142382763", + "60455998205101888765006189" + ], + "mAssetSupply": "253942608987418437103521797" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "26111549877785186009088", + "expectedQty": "26436581385256687724249", + "reserves": [ + "40890648406860506493482710", + "153048196785078985142382763", + "60455998205101888765006189" + ] + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "385697321886427381760000", + "expectedQty": "387075399092731145705303", + "reserves": [ + "40890648406860506493482710", + "153048196785078985142382763", + "60841695526988316146766189" + ] + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "939814003827016166539264", + "expectedQty": "932728638193070123188113", + "reserves": [ + "40890648406860506493482710", + "153988010788906001308922027", + "60841695526988316146766189" + ] + }, + { + "type": "redeemMasset", + "inputQty": "8684684168391641", + "expectedQtys": [ + "1390643699057216", + "5236954298284465", + "2069155756169631" + ], + "redemptionFee": "2605405250517", + "reserves": [ + "40890648405469862794425494", + "153988010783669047010637562", + "60841695524919160390596558" + ], + "mAssetSupply": "255288849597407416296998338" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "3583096285867682851454976", + "outputIndex": 0, + "expectedQty": "3502442938346542138044898", + "swapFee": "2133300845696173633628", + "reserves": [ + "37388205467123320656380596", + "157571107069536729862092538", + "60841695524919160390596558" + ], + "mAssetSupply": "255290982898253112470631966", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mintMulti", + "inputQtys": [ + "440516631189472518602752", + "238237798351900342484992", + "814394866368360417853440" + ], + "expectedQty": "1501056687411531475291584", + "reserves": [ + "37828722098312793174983348", + "157809344867888630204577530", + "61656090391287520808449998" + ], + "mAssetSupply": "256792039585664643945923550" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "1285142105329767186169856", + "outputIndex": 1, + "expectedQty": "1299288878966925476499454", + "swapFee": "773667585476030733812", + "reserves": [ + "37828722098312793174983348", + "156510055988921704728078076", + "62941232496617287994619854" + ], + "mAssetSupply": "256792813253250119976657362", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mintMulti", + "inputQtys": [ + "182919319136896293011456", + "2200645770288439081566208", + "3377485997732556766707712" + ], + "expectedQty": "5755713322385181185502756", + "reserves": [ + "38011641417449689467994804", + "158710701759210143809644284", + "66318718494349844761327566" + ], + "mAssetSupply": "262548526575635301162160118" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "23729787874936308629504", + "expectedQty": "24110451425102308532303", + "reserves": [ + "38035371205324625776624308", + "158710701759210143809644284", + "66318718494349844761327566" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "322234221772255352848384", + "1468206070458768840196096", + "4560368222611983348793344" + ], + "expectedQty": "6354330166924091922040461", + "reserves": [ + "38357605427096881129472692", + "160178907829668912649840380", + "70879086716961828110120910" + ], + "mAssetSupply": "268926967193984495392732882" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "1043835682957278969856", + "expectedQty": "1045718537421849657148", + "reserves": [ + "38357605427096881129472692", + "160178907829668912649840380", + "70880130552644785389090766" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "39688103962708463845376", + "38297356729343608356864", + "23111384614517956673536" + ], + "expectedQty": "101489917561516369855569", + "reserves": [ + "38397293531059589593318068", + "160217205186398256258197244", + "70903241937259303345764302" + ], + "mAssetSupply": "269029502830083433612245599" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "148756480846969513705472", + "83376890859646464557056", + "76978462129408660471808" + ], + "expectedQty": "311040302672057809087445", + "swapFee": "186736223337237027669", + "reserves": [ + "38248537050212620079612596", + "160133828295538609793640188", + "70826263475129894685292494" + ], + "mAssetSupply": "268718462527411375803158154" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "3317105007763480490541056", + "expectedQty": "3367030757008916571166265", + "reserves": [ + "41565642057976100570153652", + "160133828295538609793640188", + "70826263475129894685292494" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "4812262614809173819392", + "5819539673992537309184", + "10492339846888615313408" + ], + "expectedQty": "21169825809023374905961", + "reserves": [ + "41570454320590909743973044", + "160139647835212602330949372", + "70836755814976783300605902" + ], + "mAssetSupply": "272106663110229315749230380" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "7744324049048969932701696", + "outputIndex": 1, + "expectedQty": "7802258191762865313083032", + "swapFee": "4653279381057798967949", + "reserves": [ + "41570454320590909743973044", + "152337389643449737017866340", + "78581079864025753233307598" + ], + "mAssetSupply": "272111316389610373548198329", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "660006227541225256255488", + "expectedQty": "650873418016923479966760", + "swapFee": "396003736524735153753", + "reserves": [ + "40919580902573986264006284", + "152337389643449737017866340", + "78581079864025753233307598" + ], + "mAssetSupply": "271451706165805673027096594" + }, + { + "type": "redeemMasset", + "inputQty": "287383201129030693683", + "expectedQtys": [ + "43308153905707019560", + "161229684438365711784", + "83168043898851582614" + ], + "redemptionFee": "86214960338709208", + "reserves": [ + "40919537594420080556986724", + "152337228413765298652154556", + "78580996695981854381724984" + ], + "mAssetSupply": "271451418868819504335112119" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "821963212112184265932800", + "outputIndex": 2, + "expectedQty": "815689061588056438941305", + "swapFee": "489984444336811165710", + "reserves": [ + "40919537594420080556986724", + "153159191625877482918087356", + "77765307634393797942783679" + ], + "mAssetSupply": "271451908853263841146277829", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "14485008730249431613440", + "expectedQty": "14467357155781933880444", + "swapFee": "8691005238149658968", + "reserves": [ + "40919537594420080556986724", + "153159191625877482918087356", + "77750840277238016008903235" + ], + "mAssetSupply": "271437432535538829864323357" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "75601940804973280", + "28128469647121852", + "24247870360125536" + ], + "expectedQty": "128845505853224678", + "swapFee": "77353715741379", + "reserves": [ + "40919537518818139752013444", + "153159191597749013270965504", + "77750840252990145648777699" + ], + "mAssetSupply": "271437432406693324011098679" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "863916829631371500584960", + "993464890618381439336448", + "2486516299998612160512" + ], + "expectedQty": "1865387244252147173686081", + "swapFee": "1119904289124763162108", + "reserves": [ + "40055620689186768251428484", + "152165726707130631831629056", + "77748353736690147036617187" + ], + "mAssetSupply": "269572045162441176837412598" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "7970854863432404959232", + "5393671540907609948160", + "148435067782687096832" + ], + "expectedQty": "13590501497814826542368", + "swapFee": "8159196416538819216", + "reserves": [ + "40047649834323335846469252", + "152160333035589724221680896", + "77748205301622364349520355" + ], + "mAssetSupply": "269558454660943362010870230" + }, + { + "type": "mintMulti", + "inputQtys": [ + "30399308942350680588288", + "155317989462597160665088", + "267860000314834041176064" + ], + "expectedQty": "453115082356187286027557", + "reserves": [ + "40078049143265686527057540", + "152315651025052321382345984", + "78016065301937198390696419" + ], + "mAssetSupply": "270011569743299549296897787" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "953918517659742962188288", + "expectedQty": "947594228669951448663152", + "reserves": [ + "40078049143265686527057540", + "153269569542712064344534272", + "78016065301937198390696419" + ] + }, + { + "type": "redeemMasset", + "inputQty": "978388318128080263577", + "expectedQtys": [ + "144671731902232115538", + "553264805739169053217", + "281618480058313889071" + ], + "redemptionFee": "293516495438424079", + "reserves": [ + "40077904471533784294942002", + "153269016277906325175481055", + "78015783683457140076807348" + ], + "mAssetSupply": "270958185877167868103721441" + }, + { + "type": "mintMulti", + "inputQtys": [ + "1046976448907159330095104", + "1085187925768857070862336", + "241547690488072964669440" + ], + "expectedQty": "2381406328913015243492921", + "reserves": [ + "41124880920440943625037106", + "154354204203675182246343391", + "78257331373945213041476788" + ], + "mAssetSupply": "273339592206080883347214362" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "237835786286970810925056", + "expectedQty": "234443487493289009280202", + "swapFee": "142701471772182486555", + "reserves": [ + "40890437432947654615756904", + "154354204203675182246343391", + "78257331373945213041476788" + ], + "mAssetSupply": "273101899121265684718775861" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "1710224506872228741120", + "1734956180121184894976", + "7462872356955976892416" + ], + "expectedQty": "10924979116217824472464", + "swapFee": "6558922823424749533", + "reserves": [ + "40888727208440782387015784", + "154352469247495061061448415", + "78249868501588257064584372" + ], + "mAssetSupply": "273090974142149466894303397" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "20765048866840523046912", + "22939540102542159511552", + "4607278537500325314560" + ], + "expectedQty": "48453086839388043380462", + "swapFee": "29089305687045053060", + "reserves": [ + "40867962159573941863968872", + "154329529707392518901936863", + "78245261223050756739269812" + ], + "mAssetSupply": "273042521055310078850922935" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "518339741610139837267968", + "expectedQty": "521459418191734090780418", + "swapFee": "311003844966083902360", + "reserves": [ + "40867962159573941863968872", + "153808070289200784811156445", + "78245261223050756739269812" + ], + "mAssetSupply": "272524492317544905097557327" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "7538116693432296345174016", + "expectedQty": "7625289931896495157858304", + "reserves": [ + "48406078853006238209142888", + "153808070289200784811156445", + "78245261223050756739269812" + ] + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "87882369863009404190720", + "expectedQty": "88723994775827124128661", + "reserves": [ + "48493961222869247613333608", + "153808070289200784811156445", + "78245261223050756739269812" + ] + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "5400654920604778496", + "expectedQty": "5391269679464015541", + "swapFee": "3240392952362867", + "reserves": [ + "48493961222869247613333608", + "153808070289200784811156445", + "78245255831781077275254271" + ], + "mAssetSupply": "280238500846802699727128663" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "2186422043084570885095424", + "expectedQty": "2163353888610608282676616", + "swapFee": "1311853225850742531057", + "reserves": [ + "46330607334258639330656992", + "153808070289200784811156445", + "78245255831781077275254271" + ], + "mAssetSupply": "278053390656943979584564296" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "93168777157822143004672", + "expectedQty": "92136081606498223638033", + "swapFee": "55901266294693285802", + "reserves": [ + "46238471252652141107018959", + "153808070289200784811156445", + "78245255831781077275254271" + ], + "mAssetSupply": "277960277781052452134845426" + }, + { + "type": "redeemMasset", + "inputQty": "20600386828755002982", + "expectedQtys": [ + "3425829915908799746", + "11395711714295148758", + "5797227523846347439" + ], + "redemptionFee": "6180116048626500", + "reserves": [ + "46238467826822225198219213", + "153808058893489070516007687", + "78245250034553553428906832" + ], + "mAssetSupply": "277960257186845739428468944" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "1662857445683308527616", + "2039393522441457500160", + "1339902841840861970432" + ], + "expectedQty": "5049210758098599734973", + "swapFee": "3031345262016369662", + "reserves": [ + "46236804969376541889691597", + "153806019499966629058507527", + "78243910131711712566936400" + ], + "mAssetSupply": "277955207976087640828733971" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "82134940830281913860096", + "126873504287313807540224", + "10167071819195708604416" + ], + "expectedQty": "219316638773069720962472", + "swapFee": "131668984654634613345", + "reserves": [ + "46154670028546259975831501", + "153679145995679315250967303", + "78233743059892516858331984" + ], + "mAssetSupply": "277735891337314571107771499" + }, + { + "type": "redeemMasset", + "inputQty": "73037706970614335746867", + "expectedQtys": [ + "12133901525164980707307", + "40401710657441754973958", + "20567377767984763451298" + ], + "redemptionFee": "21911312091184300724", + "reserves": [ + "46142536127021094995124194", + "153638744285021873495993345", + "78213175682124532094880686" + ], + "mAssetSupply": "277662875541656047956325356" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "31168260989961656860672", + "expectedQty": "30985743223569461835038", + "reserves": [ + "46142536127021094995124194", + "153669912546011835152854017", + "78213175682124532094880686" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "58298692402066212519936", + "69484166810299898265600", + "7851447673726672306176" + ], + "expectedQty": "135855753698531494166603", + "reserves": [ + "46200834819423161207644130", + "153739396712822135051119617", + "78221027129798258767186862" + ], + "mAssetSupply": "277829717038578148912326997" + }, + { + "type": "mintMulti", + "inputQtys": [ + "2390327550105628329377792", + "6875058450702978697396224", + "4561535040134605053100032" + ], + "expectedQty": "13816522145050772462345765", + "reserves": [ + "48591162369528789537021922", + "160614455163525113748515841", + "82782562169932863820286894" + ], + "mAssetSupply": "291646239183628921374672762" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "2241633106276520960", + "expectedQty": "2265279918563124386", + "reserves": [ + "48591164611161895813542882", + "160614455163525113748515841", + "82782562169932863820286894" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "1212057619155557120", + "1031315592779040256", + "2455553883160796672" + ], + "expectedQty": "4707923366443959700", + "swapFee": "2826449889800255", + "reserves": [ + "48591163399104276657985762", + "160614454132209520969475585", + "82782559714378980659490222" + ], + "mAssetSupply": "291646236740985473493837448" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "10526810593830330368", + "expectedQty": "10536097202444255707", + "reserves": [ + "48591163399104276657985762", + "160614454132209520969475585", + "82782570241189574489820590" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "539859892277449", + "487063410268115", + "337821337985178" + ], + "expectedQty": "1367924792242971", + "swapFee": "821247623920", + "reserves": [ + "48591163398564416765708313", + "160614454131722457559207470", + "82782570240851753151835412" + ], + "mAssetSupply": "291646247275714751145850184" + }, + { + "type": "mintMulti", + "inputQtys": [ + "1230162322445245775609856", + "1754959332195865183911936", + "1228059707654076345876480" + ], + "expectedQty": "4217001369690017782673244", + "reserves": [ + "49821325721009662541318169", + "162369413463918322743119406", + "84010629948505829497711892" + ], + "mAssetSupply": "295863248645404768928523428" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "381106694548756", + "678498385530112", + "387062066960892" + ], + "expectedQty": "1447057953628884", + "swapFee": "868756025792", + "reserves": [ + "49821325720628555846769413", + "162369413463239824357589294", + "84010629948118767430751000" + ], + "mAssetSupply": "295863248643957710974894544" + }, + { + "type": "redeemMasset", + "inputQty": "80657143560338349542604", + "expectedQtys": [ + "13578030747925584764367", + "44251269042679708740185", + "22895796129243654168742" + ], + "redemptionFee": "24197143068101504862", + "reserves": [ + "49807747689880630262005046", + "162325162194197144648849109", + "83987734151989523776582258" + ], + "mAssetSupply": "295782615697540440726856802" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "2053233734561899216896", + "expectedQty": "2050174456647285049141", + "swapFee": "1231940240737139530", + "reserves": [ + "49807747689880630262005046", + "162325162194197144648849109", + "83985683977532876491533117" + ], + "mAssetSupply": "295780563695746119564779436" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "528193709134009856", + "expectedQty": "525189684578216199", + "reserves": [ + "49807747689880630262005046", + "162325162722390853782858965", + "83985683977532876491533117" + ] + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "43134144288509100032", + "expectedQty": "43576073300109221675", + "reserves": [ + "49807790824024918771105078", + "162325162722390853782858965", + "83985683977532876491533117" + ] + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "4416598758416454804045824", + "expectedQty": "4364500883034184357989525", + "swapFee": "2649959255049872882427", + "reserves": [ + "45443289940990734413115553", + "162325162722390853782858965", + "83985683977532876491533117" + ], + "mAssetSupply": "291366658997847699321053913" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "160236993342586386120704", + "expectedQty": "162234484350822790911673", + "reserves": [ + "45603526934333320799236257", + "162325162722390853782858965", + "83985683977532876491533117" + ] + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "8194762459458519219306496", + "outputIndex": 0, + "expectedQty": "8062156840948654086002876", + "swapFee": "4917635647701620386434", + "reserves": [ + "37541370093384666713233381", + "162325162722390853782858965", + "92180446436991395710839613" + ], + "mAssetSupply": "291533811117846223732352020", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mintMulti", + "inputQtys": [ + "926931485124465262592", + "1139671096302742798336", + "406649235901097508864" + ], + "expectedQty": "2482869787946119488051", + "reserves": [ + "37542297024869791178495973", + "162326302393487156525657301", + "92180853086227296808348477" + ], + "mAssetSupply": "291536293987634169851840071" + }, + { + "type": "mintMulti", + "inputQtys": [ + "189353641677054717984768", + "232355147227821663846400", + "8647777315657666789376" + ], + "expectedQty": "432387051131203776166805", + "reserves": [ + "37731650666546845896480741", + "162558657540714978189503701", + "92189500863542954475137853" + ], + "mAssetSupply": "291968681038765373628006876" + }, + { + "type": "redeemMasset", + "inputQty": "618274014093659602944", + "expectedQtys": [ + "79876719938856656926", + "344131574755845117249", + "195162279192545326530" + ], + "redemptionFee": "185482204228097880", + "reserves": [ + "37731570789826907039823815", + "162558313409140222344386452", + "92189305701263761929811323" + ], + "mAssetSupply": "291968062950233484196501812" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "3649721590735344156803072", + "745352300441043451510784", + "1708279499698638969372672" + ], + "expectedQty": "6173831411440255904780248", + "swapFee": "3706522760520465822361", + "reserves": [ + "34081849199091562883020743", + "161812961108699178892875668", + "90481026201565122960438651" + ], + "mAssetSupply": "285794231538793228291721564" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "117823135900224653885440", + "expectedQty": "118682907247988223206932", + "swapFee": "70693881540134792331", + "reserves": [ + "34081849199091562883020743", + "161694278201451190669668736", + "90481026201565122960438651" + ], + "mAssetSupply": "285676479096774543772628455" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "929011614206654632951808", + "expectedQty": "950228232166945436823029", + "reserves": [ + "35010860813298217515972551", + "161694278201451190669668736", + "90481026201565122960438651" + ] + }, + { + "type": "redeemMasset", + "inputQty": "880824445544257132953", + "expectedQtys": [ + "107558611074929950328", + "496749053810911599136", + "277971271793984768725" + ], + "redemptionFee": "264247333663277139", + "reserves": [ + "35010753254687142586022223", + "161693781452397379758069600", + "90480748230293328975669926" + ], + "mAssetSupply": "286625826768743278615595670" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "21371695000381771776", + "expectedQty": "21208551837075080952", + "reserves": [ + "35010753254687142586022223", + "161693802824092380139841376", + "90480748230293328975669926" + ] + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "2482330974688715229626368", + "expectedQty": "2422930233837870718635849", + "swapFee": "1489398584813229137775", + "reserves": [ + "32587823020849271867386374", + "161693802824092380139841376", + "90480748230293328975669926" + ], + "mAssetSupply": "284145006401191213690188029" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "4216399825197393952899072", + "outputIndex": 1, + "expectedQty": "4340566939216759302393628", + "swapFee": "2587309932616517378649", + "reserves": [ + "36804222846046665820285446", + "157353235884875620837447748", + "90480748230293328975669926" + ], + "mAssetSupply": "284147593711123830207566678", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "286166914852001952038912", + "expectedQty": "288008423966369056561923", + "swapFee": "171700148911201171223", + "reserves": [ + "36804222846046665820285446", + "157065227460909251780885825", + "90480748230293328975669926" + ], + "mAssetSupply": "283861598496420739456698989" + }, + { + "type": "redeemMasset", + "inputQty": "541350404860112578333900", + "expectedQtys": [ + "70168010923248697879249", + "299448099807477394716021", + "172503415076156165710063" + ], + "redemptionFee": "162405121458033773500", + "reserves": [ + "36734054835123417122406197", + "156765779361101774386169804", + "90308244815217172809959863" + ], + "mAssetSupply": "283320410496682084912138589" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "26614372547576293490688", + "3689749062494391369728", + "10388730092202919723008" + ], + "expectedQty": "41166851435503785693475", + "swapFee": "24714939825197389849", + "reserves": [ + "36707440462575840828915509", + "156762089612039279994800076", + "90297856085124969890236855" + ], + "mAssetSupply": "283279243645246581126445114" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "155873776002448188506112", + "expectedQty": "155948860478141490535950", + "swapFee": "93524265601468913103", + "reserves": [ + "36707440462575840828915509", + "156762089612039279994800076", + "90141907224646828399700905" + ], + "mAssetSupply": "283123463393509734406852105" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "148420860829036072402944", + "expectedQty": "147382510347671313411053", + "reserves": [ + "36707440462575840828915509", + "156910510472868316067203020", + "90141907224646828399700905" + ] + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "139420739734923045240832", + "expectedQty": "139270804835459492541422", + "reserves": [ + "36707440462575840828915509", + "156910510472868316067203020", + "90281327964381751444941737" + ] + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "9760332574547203063808", + "expectedQty": "9570274869398349464160", + "swapFee": "5856199544728321838", + "reserves": [ + "36697870187706442479451349", + "156910510472868316067203020", + "90281327964381751444941737" + ], + "mAssetSupply": "283400362232317862738062610" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "29997705867818392616960", + "expectedQty": "30012184808804015441089", + "swapFee": "17998623520691035570", + "reserves": [ + "36697870187706442479451349", + "156910510472868316067203020", + "90251315779572947429500648" + ], + "mAssetSupply": "283370382525073565036481220" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "9086346491345632256", + "37938056774361767936", + "4955305553112695808" + ], + "expectedQty": "51883736186074332900", + "swapFee": "31148931070286771", + "reserves": [ + "36697861101359951133819093", + "156910472534811541705435084", + "90251310824267394316804840" + ], + "mAssetSupply": "283370330641337378962148320" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "235135437242381925089280", + "3202252522204440167448576", + "291592041817779977846784" + ], + "expectedQty": "3710956330922217261557572", + "swapFee": "2227910544880258512041", + "reserves": [ + "36462725664117569208729813", + "153708220012607101537986508", + "89959718782449614338958056" + ], + "mAssetSupply": "279659374310415161700590748" + }, + { + "type": "mintMulti", + "inputQtys": [ + "412093594008854790144", + "249735160319513296896", + "145277074841547587584" + ], + "expectedQty": "812999866966844626764", + "reserves": [ + "36463137757711578063519957", + "153708469747767421051283404", + "89959864059524455886545640" + ], + "mAssetSupply": "279660187310282128545217512" + }, + { + "type": "redeemMasset", + "inputQty": "4898116943418479974809", + "expectedQtys": [ + "638443156191171845892", + "2691324076692372214440", + "1575132121715027238075" + ], + "redemptionFee": "1469435083025543992", + "reserves": [ + "36462499314555386891674065", + "153705778423690728679068964", + "89958288927402740859307565" + ], + "mAssetSupply": "279655290662773793090786695" + }, + { + "type": "redeemMasset", + "inputQty": "286088490951260713779", + "expectedQtys": [ + "37290093565103196387", + "157194459147467743553", + "92000084309095571195" + ], + "redemptionFee": "85826547285378214", + "reserves": [ + "36462462024461821788477678", + "153705621229231581211325411", + "89958196927318431763736370" + ], + "mAssetSupply": "279655004660109389115451130" + }, + { + "type": "redeemMasset", + "inputQty": "28946695914865045798912", + "expectedQtys": [ + "3773045869397813661819", + "15905079555327610459856", + "9308652912888528846413" + ], + "redemptionFee": "8684008774459513739", + "reserves": [ + "36458688978592423974815859", + "153689716149676253600865555", + "89948888274405543234889957" + ], + "mAssetSupply": "279626066648203298529165957" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "299536647007178233741312", + "expectedQty": "299706655467573038374935", + "swapFee": "179721988204306940244", + "reserves": [ + "36458688978592423974815859", + "153689716149676253600865555", + "89649181618937970196515022" + ], + "mAssetSupply": "279326709723184324602364889" + }, + { + "type": "mintMulti", + "inputQtys": [ + "2801744828980525006848", + "5392855892383011700736", + "6862384555024520839168" + ], + "expectedQty": "15064858945455049908477", + "reserves": [ + "36461490723421404499822707", + "153695109005568636612566291", + "89656044003492994717354190" + ], + "mAssetSupply": "279341774582129779652273366" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "457608152995144543502336", + "expectedQty": "457070399691815308824756", + "reserves": [ + "36461490723421404499822707", + "153695109005568636612566291", + "90113652156488139260856526" + ] + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "15514313686652842672128", + "outputIndex": 2, + "expectedQty": "15417316487840298294492", + "swapFee": "9244863241885182042", + "reserves": [ + "36461490723421404499822707", + "153710623319255289455238419", + "90098234840000298962562034" + ], + "mAssetSupply": "279798854226684836846280164", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemBassets", + "inputQtys": [ + "84661473001376814465024", + "18774245442928232103936", + "76398867937258547183616" + ], + "expectedQty": "181216855149441651626457", + "swapFee": "108795390323859306559", + "reserves": [ + "36376829250420027685357683", + "153691849073812361223134483", + "90021835972063040415378418" + ], + "mAssetSupply": "279617637371535395194653707" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "61319610874799554560", + "expectedQty": "60142101070088804179", + "swapFee": "36791766524879732", + "reserves": [ + "36376769108318957596553504", + "153691849073812361223134483", + "90021835972063040415378418" + ], + "mAssetSupply": "279617576088716286919978879" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "43872891732036300046336", + "expectedQty": "43571695006306998536401", + "reserves": [ + "36376769108318957596553504", + "153735721965544397523180819", + "90021835972063040415378418" + ] + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "93463888344848854417408", + "expectedQty": "91663954983387370739424", + "swapFee": "56078333006909312650", + "reserves": [ + "36285105153335570225814080", + "153735721965544397523180819", + "90021835972063040415378418" + ], + "mAssetSupply": "279567739973710751973410522" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "1708413439609998095155200", + "expectedQty": "1696561047973652901976159", + "reserves": [ + "36285105153335570225814080", + "155444135405154395618336019", + "90021835972063040415378418" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "116743187010807954145280", + "50797966525115148533760", + "126141914393364335165440" + ], + "expectedQty": "295452200318514356692355", + "swapFee": "177377746839212141300", + "reserves": [ + "36168361966324762271668800", + "155393337438629280469802259", + "89895694057669676080212978" + ], + "mAssetSupply": "280968848821365890518694326" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "1955926807322756435148800", + "161960943135440941088768", + "279813686624651438981120" + ], + "expectedQty": "2436487578503236726758457", + "swapFee": "1462770209227478523168", + "reserves": [ + "34212435159002005836520000", + "155231376495493839528713491", + "89615880371045024641231858" + ], + "mAssetSupply": "278532361242862653791935869" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "54811443596327649280", + "expectedQty": "54405440886246276775", + "reserves": [ + "34212435159002005836520000", + "155231431306937435856362771", + "89615880371045024641231858" + ] + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "20774166639426658304", + "expectedQty": "20620286897292376404", + "reserves": [ + "34212435159002005836520000", + "155231452081104075283021075", + "89615880371045024641231858" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "17054582919810387017728", + "28317179726817210138624", + "132010536486454624256" + ], + "expectedQty": "45665097674929302077599", + "reserves": [ + "34229489741921816223537728", + "155259769260830892493159699", + "89616012381581511095856114" + ], + "mAssetSupply": "278578101366265366632666647" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "37310846490084900864", + "30758899447319494656", + "31191903838671581184" + ], + "expectedQty": "99803189120533683048", + "swapFee": "59917864190834710", + "reserves": [ + "34229452431075326138636864", + "155259738501931445173665043", + "89615981189677672424274930" + ], + "mAssetSupply": "278578001563076246098983599" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "104530921041349023105024", + "expectedQty": "104387799035445877171914", + "reserves": [ + "34229452431075326138636864", + "155259738501931445173665043", + "89720512110719021447379954" + ] + }, + { + "type": "redeemMasset", + "inputQty": "15241682299314413083033", + "expectedQtys": [ + "1871513754765746276368", + "8488909857754603735473", + "4905517341767255857610" + ], + "redemptionFee": "4572504689794323924", + "reserves": [ + "34227580917320560392360496", + "155251249592073690569929570", + "89715606593377254191522344" + ], + "mAssetSupply": "278667152252317067357396404" + }, + { + "type": "mintMulti", + "inputQtys": [ + "13629468341648689152", + "1590847655125361664", + "13074275337620340736" + ], + "expectedQty": "28561590611107113353", + "reserves": [ + "34227594546788902041049648", + "155251251182921345695291234", + "89715619667652591811863080" + ], + "mAssetSupply": "278667180813907678464509757" + }, + { + "type": "redeemMasset", + "inputQty": "21667828025309358194688", + "expectedQtys": [ + "2660575740941819399301", + "12067973753852267737136", + "6973765011298835259229" + ], + "redemptionFee": "6500348407592807458", + "reserves": [ + "34224933971047960221650347", + "155239183209167493427554098", + "89708645902641292976603851" + ], + "mAssetSupply": "278645519486230776699122527" + }, + { + "type": "mintMulti", + "inputQtys": [ + "3558996069993356984320", + "3240477481020193505280", + "630350560401955356672" + ], + "expectedQty": "7482454194469592420896", + "reserves": [ + "34228492967117953578634667", + "155242423686648513621059378", + "89709276253201694931960523" + ], + "mAssetSupply": "278653001940425246291543423" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "23559196035749966249984", + "expectedQty": "23577432312867488668417", + "swapFee": "14135517621449979749", + "reserves": [ + "34228492967117953578634667", + "155242423686648513621059378", + "89685698820888827443292106" + ], + "mAssetSupply": "278629456879907117775273188" + }, + { + "type": "mintMulti", + "inputQtys": [ + "510633434612459827625984", + "127360261574717788389376", + "484385979261992216559616" + ], + "expectedQty": "1131754033640357029857408", + "reserves": [ + "34739126401730413406260651", + "155369783948223231409448754", + "90170084800150819659851722" + ], + "mAssetSupply": "279761210913547474805130596" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "277951149462651502592", + "expectedQty": "277574626342906215763", + "reserves": [ + "34739126401730413406260651", + "155369783948223231409448754", + "90170362751300282311354314" + ] + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "8192602985588225024", + "expectedQty": "8366324771385174665", + "reserves": [ + "34739134594333398994485675", + "155369783948223231409448754", + "90170362751300282311354314" + ] + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "1188290989092287562121216", + "expectedQty": "1196249052159862298628773", + "swapFee": "712974593455372537272", + "reserves": [ + "34739134594333398994485675", + "154173534896063369110819981", + "90170362751300282311354314" + ], + "mAssetSupply": "278573918839999756906937080" + }, + { + "type": "redeemMasset", + "inputQty": "1997283141312247863705", + "expectedQtys": [ + "248993419741197985006", + "1105041796108000119119", + "646297820683561502637" + ], + "redemptionFee": "599184942393674359", + "reserves": [ + "34738885600913657796500669", + "154172429854267261110700862", + "90169716453479598749851677" + ], + "mAssetSupply": "278571922156043387052747734" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "114444905629463412736", + "expectedQty": "112028241766219075749", + "swapFee": "68666943377678047", + "reserves": [ + "34738773572671891577424920", + "154172429854267261110700862", + "90169716453479598749851677" + ], + "mAssetSupply": "278571807779804700967013045" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "41743921165218776875008", + "expectedQty": "42617762550212885732328", + "reserves": [ + "34780517493837110354299928", + "154172429854267261110700862", + "90169716453479598749851677" + ] + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "24247542596618193731584", + "expectedQty": "24213837316187488864204", + "reserves": [ + "34780517493837110354299928", + "154172429854267261110700862", + "90193963996076216943583261" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "6030173143516407922688", + "4228159048446157783040", + "1284100693474001551360" + ], + "expectedQty": "11636281605098298727201", + "reserves": [ + "34786547666980626762222616", + "154176658013315707268483902", + "90195248096769690945134621" + ], + "mAssetSupply": "278650275661276199640336778" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "77107016178620990226432", + "expectedQty": "78715253595596629486318", + "reserves": [ + "34863654683159247752449048", + "154176658013315707268483902", + "90195248096769690945134621" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "36918463817302063185920", + "498129608747939092496384", + "146678962710302714494976" + ], + "expectedQty": "678711218047965905022904", + "reserves": [ + "34900573146976549815634968", + "154674787622063646360980286", + "90341927059479993659629597" + ], + "mAssetSupply": "279407702132919762174846000" + }, + { + "type": "redeemMasset", + "inputQty": "140891701275201920355532", + "expectedQtys": [ + "17593380312332259148199", + "77971566595889303132581", + "45541369026030002768558" + ], + "redemptionFee": "42267510382560576106", + "reserves": [ + "34882979766664217556486769", + "154596816055467757057847705", + "90296385690453963656861039" + ], + "mAssetSupply": "279266852699154942815066574" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "17596844948706887204864", + "outputIndex": 1, + "expectedQty": "17689490399652643818477", + "swapFee": "10543575964761548470", + "reserves": [ + "34882979766664217556486769", + "154579126565068104414029228", + "90313982535402670544065903" + ], + "mAssetSupply": "279266863242730907576615044", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "4399033584891563868160", + "expectedQty": "4490887120573611884556", + "reserves": [ + "34887378800249109120354929", + "154579126565068104414029228", + "90313982535402670544065903" + ] + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "1595791177143984062464", + "outputIndex": 1, + "expectedQty": "1604188645995940099898", + "swapFee": "956155959718672897", + "reserves": [ + "34887378800249109120354929", + "154577522376422108473929330", + "90315578326579814528128367" + ], + "mAssetSupply": "279271355086007440907172497", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "24598826465042787991552", + "expectedQty": "25112021051912140271138", + "reserves": [ + "34911977626714151908346481", + "154577522376422108473929330", + "90315578326579814528128367" + ] + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "2328115342691695591424", + "outputIndex": 2, + "expectedQty": "2313154465854886939131", + "swapFee": "1386817500799197258", + "reserves": [ + "34911977626714151908346481", + "154579850491764800169520754", + "90313265172113959641189236" + ], + "mAssetSupply": "279296468493876853846640893", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemBassets", + "inputQtys": [ + "90842798735792189472768", + "80458842818160118202368", + "74638874300258988326912" + ], + "expectedQty": "247155855877875987525288", + "swapFee": "148382543052557126791", + "reserves": [ + "34821134827978359718873713", + "154499391648946640051318386", + "90238626297813700652862324" + ], + "mAssetSupply": "279049312637998977859115605" + }, + { + "type": "mintMulti", + "inputQtys": [ + "11742643517206583836672", + "46478113368788304920576", + "38637159776794221477888" + ], + "expectedQty": "96715206101163544069550", + "reserves": [ + "34832877471495566302710385", + "154545869762315428356238962", + "90277263457590494874340212" + ], + "mAssetSupply": "279146027844100141403185155" + }, + { + "type": "redeemMasset", + "inputQty": "85385485188625773415628", + "expectedQtys": [ + "10651521355113624795137", + "47258473936440876557786", + "27605821551395871289588" + ], + "redemptionFee": "25615645556587732024", + "reserves": [ + "34822225950140452677915248", + "154498611288378987479681176", + "90249657636039099003050624" + ], + "mAssetSupply": "279060667974557072217501551" + }, + { + "type": "mintMulti", + "inputQtys": [ + "18880239386807423205376", + "53886001315435383881728", + "63385737329831590232064" + ], + "expectedQty": "136071016167741323824093", + "reserves": [ + "34841106189527260101120624", + "154552497289694422863562904", + "90313043373368930593282688" + ], + "mAssetSupply": "279196738990724813541325644" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "250136816556949781872640", + "920716430440075500716032", + "624465633067231648677888" + ], + "expectedQty": "1793053738319530876340661", + "swapFee": "1076478129869640309990", + "reserves": [ + "34590969372970310319247984", + "153631780859254347362846872", + "89688577740301698944604800" + ], + "mAssetSupply": "277403685252405282664984983" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "856253648127457662861312", + "684961538345832326103040", + "513799510311047383744512" + ], + "expectedQty": "2067619039198277784820417", + "swapFee": "1241316213246914819784", + "reserves": [ + "33734715724842852656386672", + "152946819320908515036743832", + "89174778229990651560860288" + ], + "mAssetSupply": "275336066213207004880164566" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "5013479344087742021632", + "expectedQty": "5047682460121302744176", + "swapFee": "3008087606452645212", + "reserves": [ + "33734715724842852656386672", + "152941771638448393733999656", + "89174778229990651560860288" + ], + "mAssetSupply": "275331055741950523590788146" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "912844617166832332177408", + "expectedQty": "911470014014087481123891", + "reserves": [ + "33734715724842852656386672", + "152941771638448393733999656", + "90087622847157483893037696" + ] + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "2324548459657715077087232", + "expectedQty": "2372270501195688905438745", + "reserves": [ + "36059264184500567733473904", + "152941771638448393733999656", + "90087622847157483893037696" + ] + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "1864131912910877491200", + "expectedQty": "1851318139107555119729", + "reserves": [ + "36059264184500567733473904", + "152943635770361304611490856", + "90087622847157483893037696" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "9613361390283959304192", + "11575957119237990907904", + "26956172044698642284544" + ], + "expectedQty": "48216173489870322426155", + "swapFee": "28947072337324588208", + "reserves": [ + "36049650823110283774169712", + "152932059813242066620582952", + "90060666675112785250753152" + ], + "mAssetSupply": "278568431401809537210044356" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "2142071581731214327808", + "2545634575490388852736", + "2795833980270663958528" + ], + "expectedQty": "7503591571790581116496", + "swapFee": "4504857857789022083", + "reserves": [ + "36047508751528552559841904", + "152929514178666576231730216", + "90057870841132514586794624" + ], + "mAssetSupply": "278560927810237746628927860" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "16663720789246656512", + "25799973066826702848", + "15797824766360985600" + ], + "expectedQty": "58383807312911524074", + "swapFee": "35051315176853026", + "reserves": [ + "36047492087807763313185392", + "152929488378693509405027368", + "90057855043307748225809024" + ], + "mAssetSupply": "278560869426430433717403786" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "97116062513422155776", + "748234709748775256064", + "1101021471885784907776" + ], + "expectedQty": "1941697397241390035053", + "swapFee": "1165717869066273785", + "reserves": [ + "36047394971745249891029616", + "152928740143983760629771304", + "90056754021835862440901248" + ], + "mAssetSupply": "278558927729033192327368733" + }, + { + "type": "redeemMasset", + "inputQty": "18956960912480940851", + "expectedQtys": [ + "2452422036257329509", + "10404241765601811625", + "6126855165264200541" + ], + "redemptionFee": "5687088273744282", + "reserves": [ + "36047392519323213633700107", + "152928729739741995027959679", + "90056747894980697176700707" + ], + "mAssetSupply": "278558908777759368120172164" + }, + { + "type": "mintMulti", + "inputQtys": [ + "127287216759945648", + "85722428617665808", + "139858474401698256" + ], + "expectedQty": "354543632525744939", + "reserves": [ + "36047392646610430393645755", + "152928729825464423645625487", + "90056748034839171578398963" + ], + "mAssetSupply": "278558909132303000645917103" + }, + { + "type": "redeemMasset", + "inputQty": "1763492964954180209868", + "expectedQtys": [ + "228139364625576728766", + "967866486139839852697", + "569957707574885464225" + ], + "redemptionFee": "529047889486254062", + "reserves": [ + "36047164507245804816916989", + "152927761958978283805772790", + "90056178077131596692934738" + ], + "mAssetSupply": "278557146168385935951961297" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "7228050482155226077855744", + "expectedQty": "7176688762788672454223373", + "reserves": [ + "36047164507245804816916989", + "160155812441133509883628534", + "90056178077131596692934738" + ] + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "6083890042681546752", + "expectedQty": "6125176063021491032", + "swapFee": "3650334025608928", + "reserves": [ + "36047164507245804816916989", + "160155806315957446862137502", + "90056178077131596692934738" + ], + "mAssetSupply": "285733828850934899750246846" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "23008001610953850355712", + "14990406532440648581120", + "38223067913057898332160" + ], + "expectedQty": "76546084129344860659881", + "swapFee": "45955223611773980784", + "reserves": [ + "36024156505634850966561277", + "160140815909425006213556382", + "90017955009218538794602578" + ], + "mAssetSupply": "285657282766805554889586965" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "63419903932699697152", + "expectedQty": "63850595514565848945", + "swapFee": "38051942359619818", + "reserves": [ + "36024156505634850966561277", + "160140752058829491647707437", + "90017955009218538794602578" + ], + "mAssetSupply": "285657219384953564549509631" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "81814665758058452353024", + "expectedQty": "83496220629486775741419", + "reserves": [ + "36105971171392909418914301", + "160140752058829491647707437", + "90017955009218538794602578" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "218234947609678560", + "430124482039386944", + "412529983761786048" + ], + "expectedQty": "1061795372085617650", + "swapFee": "637459699070813", + "reserves": [ + "36105970953157961809235741", + "160140751628705009608320493", + "90017954596688555032816530" + ], + "mAssetSupply": "285740714543787679239633400" + }, + { + "type": "redeemMasset", + "inputQty": "29557765416658930132582", + "expectedQtys": [ + "3733775418500182507653", + "16560407770424594979405", + "9308898700794642130082" + ], + "redemptionFee": "8867329624997679039", + "reserves": [ + "36102237177739461626728088", + "160124191220934585013341088", + "90008645697987760390686448" + ], + "mAssetSupply": "285711165645700645307179857" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "281282962512432", + "expectedQty": "275465613704068", + "swapFee": "168769777507", + "reserves": [ + "36102237177463996013024020", + "160124191220934585013341088", + "90008645697987760390686448" + ], + "mAssetSupply": "285711165645419531114444932" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "4754293844731224437817344", + "outputIndex": 1, + "expectedQty": "4779004079172437202199924", + "swapFee": "2848977742483162656414", + "reserves": [ + "36102237177463996013024020", + "155345187141762147811141164", + "94762939542718984828503792" + ], + "mAssetSupply": "285714014623162014277101346", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemMasset", + "inputQty": "69028350994237580", + "expectedQtys": [ + "8719664240059169", + "37520053578033528", + "22887806402461272" + ], + "redemptionFee": "20708505298271", + "reserves": [ + "36102237168744331772964851", + "155345187104242094233107636", + "94762939519831178426042520" + ], + "mAssetSupply": "285714014554154371788162037" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "493919863227484028796928", + "expectedQty": "483745012030413847042180", + "swapFee": "296351917936490417278", + "reserves": [ + "35618492156713917925922671", + "155345187104242094233107636", + "94762939519831178426042520" + ], + "mAssetSupply": "285220391042844824249782387" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "359678926305691290304512", + "746149317894978486140928", + "1185809081870946882551808" + ], + "expectedQty": "2291895160796075288150028", + "swapFee": "1375962674082094429547", + "reserves": [ + "35258813230408226635618159", + "154599037786347115746966708", + "93577130437960231543490712" + ], + "mAssetSupply": "282928495882048748961632359" + }, + { + "type": "redeemMasset", + "inputQty": "1922103241367630643", + "expectedQtys": [ + "239462439659769595", + "1049969053565418617", + "635534945677325013" + ], + "redemptionFee": "576630972410289", + "reserves": [ + "35258812990945786975848564", + "154599036736378062181548091", + "93577129802425285866165699" + ], + "mAssetSupply": "282928493960522138566412005" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "1206954954114634352689152", + "outputIndex": 0, + "expectedQty": "1172138575259333701834742", + "swapFee": "719057598521244899798", + "reserves": [ + "34086674415686453274013822", + "155805991690492696534237243", + "93577129802425285866165699" + ], + "mAssetSupply": "282929213018120659811311803", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "14088188637231847424", + "outputIndex": 2, + "expectedQty": "14001135114879772344", + "swapFee": "8390827591718512", + "reserves": [ + "34086674415686453274013822", + "155806005778681333766084667", + "93577115801290170986393355" + ], + "mAssetSupply": "282929213026511487403030315", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "1129135734700752371712", + "outputIndex": 1, + "expectedQty": "1162474438941374929039", + "swapFee": "692777586754277769", + "reserves": [ + "34087803551421154026385534", + "155804843304242392391155628", + "93577115801290170986393355" + ], + "mAssetSupply": "282929213719289074157308084", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "202288066414153027289088", + "outputIndex": 2, + "expectedQty": "201033530762257910624355", + "swapFee": "120480609222047073037", + "reserves": [ + "34087803551421154026385534", + "156007131370656545418444716", + "93376082270527913075769000" + ], + "mAssetSupply": "282929334199898296204381121", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemMasset", + "inputQty": "42768463066858338962636", + "expectedQtys": [ + "5151270745575579374017", + "23575440134139266629369", + "14110779540577802061262" + ], + "redemptionFee": "12830538920057501688", + "reserves": [ + "34082652280675578447011517", + "155983555930522406151815347", + "93361971490987335273707738" + ], + "mAssetSupply": "282886578567370357922920173" + }, + { + "type": "redeemMasset", + "inputQty": "1608710083074994492722380", + "expectedQtys": [ + "193761959042158619969223", + "886776038629968206989196", + "530768507895398246224835" + ], + "redemptionFee": "482613024922498347816", + "reserves": [ + "33888890321633419827042294", + "155096779891892437944826151", + "92831202983091937027482903" + ], + "mAssetSupply": "281278351097320285928545609" + }, + { + "type": "redeemMasset", + "inputQty": "660804789214225891328", + "expectedQtys": [ + "79590991471780444682", + "364258208767493016199", + "218022113289021618614" + ], + "redemptionFee": "198241436764267767", + "reserves": [ + "33888810730641948046597612", + "155096415633683670451809952", + "92830984960978648005864289" + ], + "mAssetSupply": "281277690490772508466922048" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "161440084306176835584", + "178923329472273022976", + "157204277143023091712" + ], + "expectedQty": "499623170697962978935", + "swapFee": "299953874743623961", + "reserves": [ + "33888649290557641869762028", + "155096236710354198178786976", + "92830827756701504982772577" + ], + "mAssetSupply": "281277190867601810503943113" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "14609671384074", + "expectedQty": "14709223662204", + "swapFee": "8765802830", + "reserves": [ + "33888649290557641869762028", + "155096236710339488955124772", + "92830827756701504982772577" + ], + "mAssetSupply": "281277190867587209598361869" + }, + { + "type": "mintMulti", + "inputQtys": [ + "138044040417180614656", + "48309450058676674560", + "150240950377381101568" + ], + "expectedQty": "339095308622627007020", + "reserves": [ + "33888787334598059050376684", + "155096285019789547631799332", + "92830977997651882363874145" + ], + "mAssetSupply": "281277529962895832225368889" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "197371657434592215040", + "195985952142494105600", + "381537434322114904064" + ], + "expectedQty": "777245044481323014699", + "swapFee": "466627002890528125", + "reserves": [ + "33888589962940624458161644", + "155096089033837405137693732", + "92830596460217560248970081" + ], + "mAssetSupply": "281276752717851350902354190" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "317902872679257407488", + "443543110806412066816", + "164270990344847884288" + ], + "expectedQty": "929346593805698660917", + "swapFee": "557942721916569138", + "reserves": [ + "33888272060067945200754156", + "155095645490726598725626916", + "92830432189227215401085793" + ], + "mAssetSupply": "281275823371257545203693273" + }, + { + "type": "redeemMasset", + "inputQty": "13840162291717363675955", + "expectedQtys": [ + "1666970426828355473151", + "7629183745474730401768", + "4566346283305497610904" + ], + "redemptionFee": "4152048687515209102", + "reserves": [ + "33886605089641116845281005", + "155088016306981123995225148", + "92825865842943909903474889" + ], + "mAssetSupply": "281261987361014515355226420" + }, + { + "type": "mintMulti", + "inputQtys": [ + "32386904249949136879616", + "39882453502630733807616", + "18180979084385128022016" + ], + "expectedQty": "90856252658120925415381", + "reserves": [ + "33918991993891065982160621", + "155127898760483754729032764", + "92844046822028295031496905" + ], + "mAssetSupply": "281352843613672636280641801" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "195856404507144679849984", + "466569685767233300594688", + "847330267022251733811200" + ], + "expectedQty": "1509280574546977453257728", + "swapFee": "906112011935347680562", + "reserves": [ + "33723135589383921302310637", + "154661329074716521428438076", + "91996716555006043297685705" + ], + "mAssetSupply": "279843563039125658827384073" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "216881266591669420032000", + "279434228716428584812544", + "305489174685156376576000" + ], + "expectedQty": "804138204075570174089020", + "swapFee": "482772585996940268614", + "reserves": [ + "33506254322792251882278637", + "154381894846000092843625532", + "91691227380320886921109705" + ], + "mAssetSupply": "279039424835050088653295053" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "5686194031050208107823104", + "expectedQty": "5642834281404031450858916", + "reserves": [ + "33506254322792251882278637", + "160068088877050300951448636", + "91691227380320886921109705" + ] + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "1612420628009849454592", + "expectedQty": "1613903082400895490288", + "swapFee": "967452376805909672", + "reserves": [ + "33506254322792251882278637", + "160068088877050300951448636", + "91689613477238486025619417" + ], + "mAssetSupply": "284680647663278487060609049" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "56196256672229548032", + "51137777197766893568", + "40700051428344586240" + ], + "expectedQty": "148925977270263204422", + "swapFee": "89409231901298701", + "reserves": [ + "33506198126535579652730605", + "160068037739273103184555068", + "91689572777187057681033177" + ], + "mAssetSupply": "284680498737301216797404627" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "3250803392210978304", + "102534607658445520896", + "82492325845424898048" + ], + "expectedQty": "187429425302983882994", + "swapFee": "112525170283960706", + "reserves": [ + "33506194875732187441752301", + "160067935204665444739034172", + "91689490284861212256135129" + ], + "mAssetSupply": "284680311307875913813521633" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "216138842344808635170816", + "expectedQty": "215808255633201765823987", + "reserves": [ + "33506194875732187441752301", + "160067935204665444739034172", + "91905629127206020891305945" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "378282323559802365542400", + "382249357212529144627200", + "293170941041651700727808" + ], + "expectedQty": "1059449893937718748362144", + "swapFee": "636051567303013056851", + "reserves": [ + "33127912552172385076209901", + "159685685847452915594406972", + "91612458186164369190578137" + ], + "mAssetSupply": "283836669669571396830983476" + }, + { + "type": "mintMulti", + "inputQtys": [ + "53368015719202256", + "63227222602206640", + "57070875766240320" + ], + "expectedQty": "174387916533387905", + "reserves": [ + "33127912605540400795412157", + "159685685910680138196613612", + "91612458243235244956818457" + ], + "mAssetSupply": "283836669843959313364371381" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "16138371165317645729792", + "expectedQty": "16011193922465352090692", + "reserves": [ + "33127912605540400795412157", + "159701824281845455842343404", + "91612458243235244956818457" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "165208615647452843737088", + "46648576702815445975040", + "85444813458948344512512" + ], + "expectedQty": "300838340078869246337250", + "reserves": [ + "33293121221187853639149245", + "159748472858548271288318444", + "91697903056694193301330969" + ], + "mAssetSupply": "284153519377960647962799323" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "178914315195321950404608", + "outputIndex": 1, + "expectedQty": "179935692293241145291590", + "swapFee": "107180291904720197699", + "reserves": [ + "33293121221187853639149245", + "159568537166255030143026854", + "91876817371889515251735577" + ], + "mAssetSupply": "284153626558252552682997022", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "994695685508262120128512", + "expectedQty": "993068140873751698327685", + "reserves": [ + "33293121221187853639149245", + "159568537166255030143026854", + "92871513057397777371864089" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "3467837521568310", + "1059595200710723", + "3441676997346567" + ], + "expectedQty": "8039799844940883", + "reserves": [ + "33293121224655691160717555", + "159568537167314625343737577", + "92871513060839454369210656" + ], + "mAssetSupply": "285146694707166104226265590" + }, + { + "type": "redeemMasset", + "inputQty": "61850697520930486432563", + "expectedQtys": [ + "7219389345111693017470", + "34601363725178456447370", + "20138562777925898064680" + ], + "redemptionFee": "18555209256279145929", + "reserves": [ + "33285901835310579467700085", + "159533935803589446887290207", + "92851374498061528471145976" + ], + "mAssetSupply": "285084862564854430018978956" + }, + { + "type": "mintMulti", + "inputQtys": [ + "198240868848257709637632", + "284500707408703098191872", + "69285748000665410469888" + ], + "expectedQty": "554522186059181022419135", + "reserves": [ + "33484142704158837177337717", + "159818436510998149985482079", + "92920660246062193881615864" + ], + "mAssetSupply": "285639384750913611041398091" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "1251060437511603717406720", + "expectedQty": "1252305507265139211589423", + "swapFee": "750636262506962230444", + "reserves": [ + "33484142704158837177337717", + "159818436510998149985482079", + "91668354738797054670026441" + ], + "mAssetSupply": "284389074949664514286221815" + }, + { + "type": "mintMulti", + "inputQtys": [ + "1529302123673902907392", + "65727153374026987995136", + "50215342544123150204928" + ], + "expectedQty": "116918786857334510994298", + "reserves": [ + "33485672006282511080245109", + "159884163664372176973477215", + "91718570081341177820231369" + ], + "mAssetSupply": "284505993736521848797216113" + }, + { + "type": "mintMulti", + "inputQtys": [ + "6845056170373319491584", + "10368251586994201690112", + "9135614046038690627584" + ], + "expectedQty": "26418774592995788821624", + "reserves": [ + "33492517062452884399736693", + "159894531915959171175167327", + "91727705695387216510858953" + ], + "mAssetSupply": "284532412511114844586037737" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "355564670980715655987200", + "expectedQty": "352784914000811262097906", + "reserves": [ + "33492517062452884399736693", + "160250096586939886831154527", + "91727705695387216510858953" + ] + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "25292171476411571240960", + "expectedQty": "25253750575217292669237", + "reserves": [ + "33492517062452884399736693", + "160250096586939886831154527", + "91752997866863628082099913" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "33777703562059569954816", + "40796494509757773643776", + "39759193167784348483584" + ], + "expectedQty": "114769793814178367146811", + "swapFee": "68903218219438683498", + "reserves": [ + "33458739358890824829781877", + "160209300092430129057510751", + "91713238673695843733616329" + ], + "mAssetSupply": "284795681381876694773658069" + }, + { + "type": "mintMulti", + "inputQtys": [ + "27452439563323484143616", + "47258944848120344739840", + "14363624989852988080128" + ], + "expectedQty": "89346599472745079770441", + "reserves": [ + "33486191798454148313925493", + "160256559037278249402250591", + "91727602298685696721696457" + ], + "mAssetSupply": "284885027981349439853428510" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "55089616419833528320", + "expectedQty": "56420580260273186515", + "reserves": [ + "33486246888070568147453813", + "160256559037278249402250591", + "91727602298685696721696457" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "3826601104089904442245120", + "3773908142992007641432064", + "4468451143015229139451904" + ], + "expectedQty": "12131938277194388251071617", + "swapFee": "7283533086168333951013", + "reserves": [ + "29659645783980663705208693", + "156482650894286241760818527", + "87259151155670467582244553" + ], + "mAssetSupply": "272753146124735311875543408" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "246115009583591421116416", + "outputIndex": 1, + "expectedQty": "247696565534203898921723", + "swapFee": "147416030197281711061", + "reserves": [ + "29659645783980663705208693", + "156234954328752037861896804", + "87505266165254059003360969" + ], + "mAssetSupply": "272753293540765509157254469", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mintMulti", + "inputQtys": [ + "3203364988715212514263040", + "317815176183894528491520", + "323728514056215840423936" + ], + "expectedQty": "3925797144724702003797853", + "reserves": [ + "32863010772695876219471733", + "156552769504935932390388324", + "87828994679310274843784905" + ], + "mAssetSupply": "276679090685490211161052322" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "3220479138916544806912", + "outputIndex": 0, + "expectedQty": "3139949619981015152251", + "swapFee": "1929777510273386386", + "reserves": [ + "32859870823075895204319482", + "156552769504935932390388324", + "87832215158449191388591817" + ], + "mAssetSupply": "276679092615267721434438708", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "10336162303325570596864", + "expectedQty": "10581073741725004403918", + "reserves": [ + "32870206985379220774916346", + "156552769504935932390388324", + "87832215158449191388591817" + ] + }, + { + "type": "redeemMasset", + "inputQty": "37245667702693153262796", + "expectedQtys": [ + "4423387069478423906397", + "21067512493218955741231", + "11819696936753216984156" + ], + "redemptionFee": "11173700310807945978", + "reserves": [ + "32865783598309742351009949", + "156531701992442713434647093", + "87820395461512438171607661" + ], + "mAssetSupply": "276652439195007064093525808" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "1238867179222207779831808", + "expectedQty": "1208392372011036766552214", + "swapFee": "743320307533324667899", + "reserves": [ + "31657391226298705584457735", + "156531701992442713434647093", + "87820395461512438171607661" + ], + "mAssetSupply": "275414315336092389638361899" + }, + { + "type": "mintMulti", + "inputQtys": [ + "250787330089087729664", + "220269068385267646464", + "9524027979647289344" + ], + "expectedQty": "485180381726900513893", + "reserves": [ + "31657642013628794672187399", + "156531922261511098702293557", + "87820404985540417818897005" + ], + "mAssetSupply": "275414800516474116538875792" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "63283142870032637952", + "expectedQty": "61669207779234092487", + "swapFee": "37969885722019582", + "reserves": [ + "31657580344421015438094912", + "156531922261511098702293557", + "87820404985540417818897005" + ], + "mAssetSupply": "275414737271301132228257422" + }, + { + "type": "mintMulti", + "inputQtys": [ + "15972326128306857443328", + "14248490295081186623488", + "23164369742085618663424" + ], + "expectedQty": "53643211229083099252292", + "reserves": [ + "31673552670549322295538240", + "156546170751806179888917045", + "87843569355282503437560429" + ], + "mAssetSupply": "275468380482530215327509714" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "361114344482968640", + "expectedQty": "358172902002262985", + "reserves": [ + "31673552670549322295538240", + "156546171112920524371885685", + "87843569355282503437560429" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "9240721622268988358656", + "340032476098370620882944", + "271576364842853834162176" + ], + "expectedQty": "617922229590565702070016", + "swapFee": "370975923308324415891", + "reserves": [ + "31664311948927053307179584", + "156206138636822153751002741", + "87571992990439649603398253" + ], + "mAssetSupply": "274850458611112551627702683" + }, + { + "type": "mintMulti", + "inputQtys": [ + "643999592634694326288384", + "72455510146189241614336", + "1135938158599207693320192" + ], + "expectedQty": "1866248330707724584831610", + "reserves": [ + "32308311541561747633467968", + "156278594146968342992617077", + "88707931149038857296718445" + ], + "mAssetSupply": "276716706941820276212534293" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "688685740080241626316800", + "expectedQty": "671411342276951221192331", + "swapFee": "413211444048144975790", + "reserves": [ + "31636900199284796412275637", + "156278594146968342992617077", + "88707931149038857296718445" + ], + "mAssetSupply": "276028434413184082731193283" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "1940048790136884992", + "1842539412046015488", + "1349989111712934400" + ], + "expectedQty": "5165280665391055649", + "swapFee": "3101029016644620", + "reserves": [ + "31636898259236006275390645", + "156278592304428930946601589", + "88707929799049745583784045" + ], + "mAssetSupply": "276028429247903417340137634" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "3586401752358666240", + "expectedQty": "3557335518245653524", + "reserves": [ + "31636898259236006275390645", + "156278595890830683305267829", + "88707929799049745583784045" + ] + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "78574336755974281363456", + "outputIndex": 0, + "expectedQty": "76436496995268216605126", + "swapFee": "47069999158687317988", + "reserves": [ + "31560461762240738058785519", + "156278595890830683305267829", + "88786504135805719865147501" + ], + "mAssetSupply": "276028479875238094273109146", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "132323139255324389670912", + "outputIndex": 2, + "expectedQty": "131377507399467397215343", + "swapFee": "78748756352735893830", + "reserves": [ + "31560461762240738058785519", + "156410919030086007694938741", + "88655126628406252467932158" + ], + "mAssetSupply": "276028558623994447009002976", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mintMulti", + "inputQtys": [ + "5320318403091307167744", + "7994469312645680857088", + "2064489844065792163840" + ], + "expectedQty": "15448254850990504160215", + "reserves": [ + "31565782080643829365953263", + "156418913499398653375795829", + "88657191118250318260095998" + ], + "mAssetSupply": "276044006878845437513163191" + }, + { + "type": "redeemMasset", + "inputQty": "2481562585207900569", + "expectedQtys": [ + "283682898717616265", + "1405742797134093039", + "796765589534031667" + ], + "redemptionFee": "744468775562370", + "reserves": [ + "31565781796960930648336998", + "156418912093655856241702790", + "88657190321484728726064331" + ], + "mAssetSupply": "276044004398027321080824992" + }, + { + "type": "redeemMasset", + "inputQty": "810931260662186980147", + "expectedQtys": [ + "92702610869718258438", + "459372165522569442510", + "260369062551348885984" + ], + "redemptionFee": "243279378198656094", + "reserves": [ + "31565689094350060930078560", + "156418452721490333672260280", + "88656929952422177377178347" + ], + "mAssetSupply": "276043193710046037092500939" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "3094140509669607", + "expectedQty": "3097169562654248", + "swapFee": "1856484305801", + "reserves": [ + "31565689094350060930078560", + "156418452721490333672260280", + "88656929949325007814524099" + ], + "mAssetSupply": "276043193706953753067137133" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "87876811097630687232", + "expectedQty": "90143779064115728495", + "reserves": [ + "31565776971161158560765792", + "156418452721490333672260280", + "88656929949325007814524099" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "76411621045704523776", + "24689209540237795328", + "71998298324638867456" + ], + "expectedQty": "174755929942190538822", + "swapFee": "104916507870036345", + "reserves": [ + "31565700559540112856242016", + "156418428032280793434464952", + "88656857951026683175656643" + ], + "mAssetSupply": "276043109094802874992326806" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "104912222554193045487616", + "expectedQty": "107609596684090364838689", + "reserves": [ + "31670612782094305901729632", + "156418428032280793434464952", + "88656857951026683175656643" + ] + }, + { + "type": "redeemMasset", + "inputQty": "1763840436704402432", + "expectedQtys": [ + "202227063440710633", + "998782043992030506", + "566102593614885909" + ], + "redemptionFee": "529152131011320", + "reserves": [ + "31670612579867242461018999", + "156418427033498749442434446", + "88656857384924089560770734" + ], + "mAssetSupply": "276150716928175680783774383" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "603201624213198864384", + "expectedQty": "602259197596238947587", + "reserves": [ + "31670612579867242461018999", + "156418427033498749442434446", + "88657460586548302759635118" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "32777957101661086285824", + "60207872300931832872960", + "348287783200599244800" + ], + "expectedQty": "93685857005349788733434", + "swapFee": "56245261360025888773", + "reserves": [ + "31637834622765581374733175", + "156358219161197817609561486", + "88657112298765102160390318" + ], + "mAssetSupply": "276057633330367927233988536" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "648113055983853010681856", + "expectedQty": "642840819898057607663054", + "reserves": [ + "31637834622765581374733175", + "157006332217181670620243342", + "88657112298765102160390318" + ] + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "361585852489676875628544", + "outputIndex": 0, + "expectedQty": "351600708621265915561828", + "swapFee": "216611605132773625365", + "reserves": [ + "31286233914144315459171347", + "157006332217181670620243342", + "89018698151254779036018862" + ], + "mAssetSupply": "276700690761871117615276955", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "37307968092262551781376", + "expectedQty": "37246760237887142448886", + "reserves": [ + "31286233914144315459171347", + "157006332217181670620243342", + "89056006119347041587800238" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "107515128335612178857984", + "329380670116189542809600", + "309085705641932691079168" + ], + "expectedQty": "745606786859256325491145", + "reserves": [ + "31393749042479927638029331", + "157335712887297860163052942", + "89365091824988974278879406" + ], + "mAssetSupply": "277483544308968261083216986" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "3644761122622417666048", + "5705147261887629492224", + "10484421637146666860544" + ], + "expectedQty": "19866444831787227561180", + "swapFee": "11927023112940100597", + "reserves": [ + "31390104281357305220363283", + "157330007740035972533560718", + "89354607403351827612018862" + ], + "mAssetSupply": "277463677864136473855655806" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "139115260192374850060288", + "81279008455020767084544", + "119967607662760500920320" + ], + "expectedQty": "343183780179578310524984", + "swapFee": "206033888440811473198", + "reserves": [ + "31250989021164930370302995", + "157248728731580951766476174", + "89234639795689067111098542" + ], + "mAssetSupply": "277120494083956895545130822" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "2343340786544447062016", + "expectedQty": "2361423320359146477094", + "swapFee": "1406004471926668237", + "reserves": [ + "31250989021164930370302995", + "157246367308260592619999080", + "89234639795689067111098542" + ], + "mAssetSupply": "277118152149174823024737043" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "1497503199038219485184", + "1412921058980600217600", + "369771331674188546048" + ], + "expectedQty": "3307790468117576189142", + "swapFee": "1985865800350756167", + "reserves": [ + "31249491517965892150817811", + "157244954387201612019781480", + "89234270024357392922552494" + ], + "mAssetSupply": "277114844358706705448547901" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "937299018768016532832256", + "outputIndex": 2, + "expectedQty": "930437637761995624007350", + "swapFee": "557719208846776077408", + "reserves": [ + "31249491517965892150817811", + "158182253405969628552613736", + "88303832386595397298545144" + ], + "mAssetSupply": "277115402077915552224625309", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemBassets", + "inputQtys": [ + "43996859190605045039104", + "230409853474978119286784", + "59101185482274499461120" + ], + "expectedQty": "332669716522496874797512", + "swapFee": "199721662911244871801", + "reserves": [ + "31205494658775287105778707", + "157951843552494650433326952", + "88244731201113122799084024" + ], + "mAssetSupply": "276782732361393055349827797" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "8644726230382746271744", + "31584794438537050062848", + "111491840253116087795712" + ], + "expectedQty": "151519051984026293525090", + "swapFee": "90966010796893912462", + "reserves": [ + "31196849932544904359506963", + "157920258758056113383264104", + "88133239360860006711288312" + ], + "mAssetSupply": "276631213309409029056302707" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "1302342292982471589888", + "6017141648295400046592", + "3345200779254143909888" + ], + "expectedQty": "10644152017508537982532", + "swapFee": "6390325405748571932", + "reserves": [ + "31195547590251921887917075", + "157914241616407817983217512", + "88129894160080752567378424" + ], + "mAssetSupply": "276620569157391520518320175" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "1612334654234876207693824", + "expectedQty": "1598769885746732859211769", + "reserves": [ + "31195547590251921887917075", + "159526576270642694190911336", + "88129894160080752567378424" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "560034019186595189489664", + "545122446239750206521344", + "575484230969364978860032" + ], + "expectedQty": "1690561147399142477104421", + "swapFee": "1014945655832985277429", + "reserves": [ + "30635513571065326698427411", + "158981453824402943984389992", + "87554409929111387588518392" + ], + "mAssetSupply": "276528777895739110900427523" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "9882167381016793088", + "expectedQty": "9961943811530340881", + "swapFee": "5929300428610075", + "reserves": [ + "30635513571065326698427411", + "158981443862459132454049111", + "87554409929111387588518392" + ], + "mAssetSupply": "276528768019501030312244510" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "649933467222548005519360", + "518423451836854183133184", + "223408157161224004435968" + ], + "expectedQty": "1405412951199169654177066", + "swapFee": "843754023133381821599", + "reserves": [ + "29985580103842778692908051", + "158463020410622278270915927", + "87331001771950163584082424" + ], + "mAssetSupply": "275123355068301860658067444" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "230394834788308192", + "281558871293104224", + "186865022603910848" + ], + "expectedQty": "702735354586512174", + "swapFee": "421894349361524", + "reserves": [ + "29985579873447943904599859", + "158463020129063406977811703", + "87331001585085140980171576" + ], + "mAssetSupply": "275123354365566506071555270" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "6277856459654427574272", + "expectedQty": "6284020818220661436077", + "swapFee": "3766713875792656544", + "reserves": [ + "29985579873447943904599859", + "158463020129063406977811703", + "87324717564266920318735499" + ], + "mAssetSupply": "275117080275820727436637542" + }, + { + "type": "mintMulti", + "inputQtys": [ + "4840145613039142436864", + "34826236452794785595392", + "48099882030276364206080" + ], + "expectedQty": "87525592277300206231912", + "reserves": [ + "29990420019060983047036723", + "158497846365516201763407095", + "87372817446297196682941579" + ], + "mAssetSupply": "275204605868098027642869454" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "100295018700968044789760", + "133322140968489632923648", + "120379394440811576819712" + ], + "expectedQty": "355551151614442788208139", + "swapFee": "213458766228402714553", + "reserves": [ + "29890125000360015002246963", + "158364524224547712130483447", + "87252438051856385106121867" + ], + "mAssetSupply": "274849054716483584854661315" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "548153217253872001613824", + "expectedQty": "563829194737194493556678", + "reserves": [ + "30438278217613887003860787", + "158364524224547712130483447", + "87252438051856385106121867" + ] + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "8923783544879897600", + "expectedQty": "8674848674368769180", + "swapFee": "5354270126927938", + "reserves": [ + "30438269542765212635091607", + "158364524224547712130483447", + "87252438051856385106121867" + ], + "mAssetSupply": "275412874992791504595248331" + }, + { + "type": "redeemMasset", + "inputQty": "7580032162666081484", + "expectedQtys": [ + "837483887408908151", + "4357269298404000123", + "2400678885601827105" + ], + "redemptionFee": "2274009648799824", + "reserves": [ + "30438268705281325226183456", + "158364519867278413726483324", + "87252435651177499504294762" + ], + "mAssetSupply": "275412867415033351577966671" + }, + { + "type": "mintMulti", + "inputQtys": [ + "1306968542166984660353024", + "424255615707535623847936", + "432102659885318004539392" + ], + "expectedQty": "2194408606884125105150890", + "reserves": [ + "31745237247448309886536480", + "158788775482985949350331260", + "87684538311062817508834154" + ], + "mAssetSupply": "277607276021917476683117561" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "120804153588075433295872", + "690613529861931688525824", + "486378970023832076681216" + ], + "expectedQty": "1294549022023421558573896", + "swapFee": "777195730652444401785", + "reserves": [ + "31624433093860234453240608", + "158098161953124017661805436", + "87198159341038985432152938" + ], + "mAssetSupply": "276312726999894055124543665" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "3790678564251367374848", + "2421364506104196759552", + "2766067784764036218880" + ], + "expectedQty": "9052585440669908990982", + "swapFee": "5434812151692961171", + "reserves": [ + "31620642415295983085865760", + "158095740588617913465045884", + "87195393273254221395934058" + ], + "mAssetSupply": "276303674414453385215552683" + }, + { + "type": "redeemMasset", + "inputQty": "171739723858864275403571", + "expectedQtys": [ + "19648277396342313227616", + "98236744385772243726269", + "54181039468297052777089" + ], + "redemptionFee": "51521917157659282621", + "reserves": [ + "31600994137899640772638144", + "157997503844232141221319615", + "87141212233785924343156969" + ], + "mAssetSupply": "276131986212511678599431733" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "662907058983185558798336", + "expectedQty": "657393503756359900676797", + "reserves": [ + "31600994137899640772638144", + "158660410903215326780117951", + "87141212233785924343156969" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "202547147800841420800", + "11216451242076399616", + "92503767963311292416" + ], + "expectedQty": "311337172273477092300", + "reserves": [ + "31601196685047441614058944", + "158660422119666568856517567", + "87141304737553887654449385" + ], + "mAssetSupply": "276789691053440311977200830" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "117134934099229251993600", + "expectedQty": "117217672674956761408105", + "swapFee": "70280960459537551196", + "reserves": [ + "31601196685047441614058944", + "158660422119666568856517567", + "87024087064878930893041280" + ], + "mAssetSupply": "276672626400301542262758426" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "150935059977187272687616", + "outputIndex": 0, + "expectedQty": "146798328188186086615068", + "swapFee": "90442631435023760074", + "reserves": [ + "31454398356859255527443876", + "158660422119666568856517567", + "87175022124856118165728896" + ], + "mAssetSupply": "276672716842932977286518500", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "159985253951823183872", + "expectedQty": "159771319729161943149", + "reserves": [ + "31454398356859255527443876", + "158660422119666568856517567", + "87175182110110069988912768" + ] + }, + { + "type": "redeemMasset", + "inputQty": "15973516915281009573888", + "expectedQtys": [ + "1815453105308622825033", + "9157401542347816821128", + "5031488864358830173736" + ], + "redemptionFee": "4792055074584302872", + "reserves": [ + "31452582903753946904618843", + "158651264718124221039696439", + "87170150621245711158739032" + ], + "mAssetSupply": "276656907889392500023190633" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "2441736914251075813376", + "2933540657616824303616", + "1141116419954727321600" + ], + "expectedQty": "6554618533742051184402", + "swapFee": "3935132199564969692", + "reserves": [ + "31450141166839695828805467", + "158648331177466604215392823", + "87169009504825756431417432" + ], + "mAssetSupply": "276650353270858757972006231" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "4498801846693906087936", + "outputIndex": 0, + "expectedQty": "4374808797060587983379", + "swapFee": "2695669977210094432", + "reserves": [ + "31445766358042635240822088", + "158648331177466604215392823", + "87173508306672450337505368" + ], + "mAssetSupply": "276650355966528735182100663", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemBassets", + "inputQtys": [ + "130925052896741559369728", + "197803285183751136477184", + "139897369308330813554688" + ], + "expectedQty": "470238320534795800167584", + "swapFee": "282312379748726716130", + "reserves": [ + "31314841305145893681452360", + "158450527892282853078915639", + "87033610937364119523950680" + ], + "mAssetSupply": "276180117645993939381933079" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "42318514310075637760", + "expectedQty": "41962879854577176402", + "reserves": [ + "31314841305145893681452360", + "158450570210797163154553399", + "87033610937364119523950680" + ] + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "524083364142053720064", + "expectedQty": "537974559885051337049", + "reserves": [ + "31315365388510035735172424", + "158450570210797163154553399", + "87033610937364119523950680" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "408249142441088890437632", + "640500108823447855955968", + "215375128551449052577792" + ], + "expectedQty": "1269198775056627367248527", + "reserves": [ + "31723614530951124625610056", + "159091070319620611010509367", + "87248986065915568576528472" + ], + "mAssetSupply": "277449896358490306377695057" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "85366214326166375890944", + "expectedQty": "84654295792213032445515", + "reserves": [ + "31723614530951124625610056", + "159176436533946777386400311", + "87248986065915568576528472" + ] + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "72003494000796328", + "expectedQty": "71910705535596093", + "reserves": [ + "31723614530951124625610056", + "159176436533946777386400311", + "87248986137919062577324800" + ] + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "492229610550075974483968", + "expectedQty": "492554391959595439042240", + "swapFee": "295337766330045584690", + "reserves": [ + "31723614530951124625610056", + "159176436533946777386400311", + "86756431745959467138282560" + ], + "mAssetSupply": "277042616453409479016837387" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "147557176120977318215680", + "expectedQty": "148711298991853816847732", + "swapFee": "88534305672586390929", + "reserves": [ + "31723614530951124625610056", + "159027725234954923569552579", + "86756431745959467138282560" + ], + "mAssetSupply": "276895147811594174285012636" + }, + { + "type": "mintMulti", + "inputQtys": [ + "472573751483198380965888", + "636117973742528631930880", + "561013941059338222174208" + ], + "expectedQty": "1675863567755657288331689", + "reserves": [ + "32196188282434323006575944", + "159663843208697452201483459", + "87317445687018805360456768" + ], + "mAssetSupply": "278571011379349831573344325" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "190224902576061353558016", + "outputIndex": 0, + "expectedQty": "185143612743165878959447", + "swapFee": "113995159495005030674", + "reserves": [ + "32011044669691157127616497", + "159663843208697452201483459", + "87507670589594866714014784" + ], + "mAssetSupply": "278571125374509326578374999", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemBassets", + "inputQtys": [ + "60009698008857", + "167552482800009", + "45282366009856" + ], + "expectedQty": "272941087472421", + "swapFee": "163862970265", + "reserves": [ + "32011044669631147429607640", + "159663843208529899718683450", + "87507670589549584348004928" + ], + "mAssetSupply": "278571125374236385490902578" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "985112786652226438299648", + "outputIndex": 1, + "expectedQty": "991374593893270555752123", + "swapFee": "590287607036173832229", + "reserves": [ + "32011044669631147429607640", + "158672468614636629162931327", + "88492783376201810786304576" + ], + "mAssetSupply": "278571715661843421664734807", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemBassets", + "inputQtys": [ + "490889469809477113872384", + "431525818874893936099328", + "315615385481071793537024" + ], + "expectedQty": "1246752517689640356112067", + "swapFee": "748500610980372437129", + "reserves": [ + "31520155199821670315735256", + "158240942795761735226831999", + "88177167990720738992767552" + ], + "mAssetSupply": "277324963144153781308622740" + }, + { + "type": "redeemMasset", + "inputQty": "17108356529327358083072", + "expectedQtys": [ + "1943915432243842059896", + "9759057617687002645775", + "5438074671335677615838" + ], + "redemptionFee": "5132506958798207424", + "reserves": [ + "31518211284389426473675360", + "158231183738144048224186224", + "88171729916049403315151714" + ], + "mAssetSupply": "277307859920131412748747092" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "470735590267674452557824", + "expectedQty": "470034206562289997821236", + "reserves": [ + "31518211284389426473675360", + "158231183738144048224186224", + "88642465506317077767709538" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "132968950118868647936", + "19126614688479023104", + "130502186833893982208" + ], + "expectedQty": "285743072285666781568", + "reserves": [ + "31518344253339545342323296", + "158231202864758736703209328", + "88642596008503911661691746" + ], + "mAssetSupply": "277778179869765988413349896" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "6721877914399365304156160", + "outputIndex": 0, + "expectedQty": "6481990262043605260877091", + "swapFee": "4025502002089006751640", + "reserves": [ + "25036353991295940081446205", + "158231202864758736703209328", + "95364473922903276965847906" + ], + "mAssetSupply": "277782205371768077420101536", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemMasset", + "inputQty": "11936329113669317427", + "expectedQtys": [ + "1075491887604136714", + "6797170830307617508", + "4096591624538289274" + ], + "redemptionFee": "3580898734100795", + "reserves": [ + "25036352915804052477309491", + "158231196067587906395591820", + "95364469826311652427558632" + ], + "mAssetSupply": "277782193439019862484884904" + }, + { + "type": "redeemMasset", + "inputQty": "869207376084431326412", + "expectedQtys": [ + "78317669756100702646", + "494972195048089582709", + "298315137170323160218" + ], + "redemptionFee": "260762212825329397", + "reserves": [ + "25036274598134296376606845", + "158230701095392858306009111", + "95364171511174482104398414" + ], + "mAssetSupply": "277781324492405990878887889" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "56496010611701506048", + "90147045277809917952", + "189685593717005778944" + ], + "expectedQty": "337200027841088909835", + "swapFee": "202441481593609511", + "reserves": [ + "25036218102123684675100797", + "158230610948347580496091159", + "95363981825580765098619470" + ], + "mAssetSupply": "277780987292378149789978054" + }, + { + "type": "redeemMasset", + "inputQty": "1653533221247064", + "expectedQtys": [ + "148987154607445", + "941609008230860", + "567498183882027" + ], + "redemptionFee": "496059966374", + "reserves": [ + "25036218101974697520493352", + "158230610947405971487860299", + "95363981825013266914737443" + ], + "mAssetSupply": "277780987290725112628697364" + }, + { + "type": "mintMulti", + "inputQtys": [ + "6949137754340725760", + "893984303378443648", + "3638311893163934720" + ], + "expectedQty": "11760584434562717788", + "reserves": [ + "25036225051112451861219112", + "158230611841390274866303947", + "95363985463325160078672163" + ], + "mAssetSupply": "277780999051309547191415152" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "821431666396573440", + "expectedQty": "786865754373425931", + "swapFee": "492858999837944", + "reserves": [ + "25036224264246697487793181", + "158230611841390274866303947", + "95363985463325160078672163" + ], + "mAssetSupply": "277780998230370739794679656" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "2219508810566707183616", + "680393917701552078848", + "1364158499574824828928" + ], + "expectedQty": "4348526549290906972075", + "swapFee": "2610682338977930941", + "reserves": [ + "25034004755436130780609565", + "158229931447472573314225099", + "95362621304825585253843235" + ], + "mAssetSupply": "277776649703821448887707581" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "8808544388372146159616", + "expectedQty": "9189902863261748391638", + "reserves": [ + "25042813299824502926769181", + "158229931447472573314225099", + "95362621304825585253843235" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "85586440254755344220160", + "27944748387622423887872", + "28834291013032786001920" + ], + "expectedQty": "145675192624035372126967", + "reserves": [ + "25128399740079258270989341", + "158257876195860195738112971", + "95391455595838618039845155" + ], + "mAssetSupply": "277931514799308746008226186" + }, + { + "type": "redeemMasset", + "inputQty": "1518270103882022309068", + "expectedQtys": [ + "137228959450225146528", + "864263697640936613974", + "520943248565895398226" + ], + "redemptionFee": "455481031164606692", + "reserves": [ + "25128262511119808045842813", + "158257011932162554801498997", + "95390934652590052144446929" + ], + "mAssetSupply": "277929996984685895150523810" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "93326656351108876730368", + "expectedQty": "93595536279483010628510", + "swapFee": "55995993810665326038", + "reserves": [ + "25128262511119808045842813", + "158257011932162554801498997", + "95297339116310569133818419" + ], + "mAssetSupply": "277836726324328596939119480" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "17832222393550161920", + "13445419841605408768", + "16735837186619901952" + ], + "expectedQty": "48586388279439347991", + "swapFee": "29169334568404651", + "reserves": [ + "25128244678897414495680893", + "158256998486742713196090229", + "95297322380473382513916467" + ], + "mAssetSupply": "277836677737940317499771489" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "142616637687249070194688", + "155291305928036769071104", + "242832687513624922554368" + ], + "expectedQty": "544484191040382443631451", + "swapFee": "326886646612196784249", + "reserves": [ + "24985628041210165425486205", + "158101707180814676427019125", + "95054489692959757591362099" + ], + "mAssetSupply": "277292193546899935056140038" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "29493719089958136840192", + "expectedQty": "29578793494023425543860", + "swapFee": "17696231453974882104", + "reserves": [ + "24985628041210165425486205", + "158101707180814676427019125", + "95024910899465734165818239" + ], + "mAssetSupply": "277262717524041430894181950" + }, + { + "type": "redeemMasset", + "inputQty": "68878719327413782917939", + "expectedQtys": [ + "6205168091170326128206", + "39264479041305264472793", + "23599388576790361265305" + ], + "redemptionFee": "20663615798224134875", + "reserves": [ + "24979422873118995099357999", + "158062442701773371162546332", + "95001311510888943804552934" + ], + "mAssetSupply": "277193859468329815335398886" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "15811193217612477628416", + "50667431986393815973888", + "42659067621087459147776" + ], + "expectedQty": "109161396033793373636948", + "swapFee": "65536159315865543508", + "reserves": [ + "24963611679901382621729583", + "158011775269786977346572444", + "94958652443267856345405158" + ], + "mAssetSupply": "277084698072296021961761938" + }, + { + "type": "redeemMasset", + "inputQty": "8179575032202572595", + "expectedQtys": [ + "736707868425190567", + "4663128061666150341", + "2802350370092150754" + ], + "redemptionFee": "2453872509660771", + "reserves": [ + "24963610943193514196539016", + "158011770606658915680422103", + "94958649640917486253254404" + ], + "mAssetSupply": "277084689895174862268850114" + }, + { + "type": "redeemMasset", + "inputQty": "159603351936811547597209", + "expectedQtys": [ + "14374957713080854031818", + "90988940895149990002700", + "54680654020192234425316" + ], + "redemptionFee": "47881005581043464279", + "reserves": [ + "24949235985480433342507198", + "157920781665763765690419403", + "94903968986897294018829088" + ], + "mAssetSupply": "276925134424243631764717184" + }, + { + "type": "redeemMasset", + "inputQty": "3464155561276830698700", + "expectedQtys": [ + "312005287486715465612", + "1974894899083405467637", + "1186831538433461391259" + ], + "redemptionFee": "1039246668383049209", + "reserves": [ + "24948923980192946627041586", + "157918806770864682284951766", + "94902782155358860557437829" + ], + "mAssetSupply": "276921671307929023317067693" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "4172323875298184058109952", + "expectedQty": "4156832482769813797650629", + "reserves": [ + "24948923980192946627041586", + "157918806770864682284951766", + "99075106030657044615547781" + ] + }, + { + "type": "redeemMasset", + "inputQty": "177828862129469687804723", + "expectedQtys": [ + "15779605026025809551835", + "99879914620921599038177", + "62662664021765372572920" + ], + "redemptionFee": "53348658638840906341", + "reserves": [ + "24933144375166920817489751", + "157818926856243760685913589", + "99012443366635279242974861" + ], + "mAssetSupply": "280900728277228006267819940" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "111414926552281726976", + "expectedQty": "110299705538579196219", + "reserves": [ + "24933144375166920817489751", + "157819038271170312967640565", + "99012443366635279242974861" + ] + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "10127710554320747364352", + "expectedQty": "10087726029100140781048", + "reserves": [ + "24933144375166920817489751", + "157819038271170312967640565", + "99022571077189599990339213" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "5831480830317539885056", + "67940472968634729234432", + "16731682658543644704768" + ], + "expectedQty": "90016450649507160380042", + "swapFee": "54042295767164594985", + "reserves": [ + "24927312894336603277604695", + "157751097798201678238406133", + "99005839394531056345634445" + ], + "mAssetSupply": "280820909852313137827417165" + }, + { + "type": "mintMulti", + "inputQtys": [ + "2190485884537303182868480", + "2013819831128538616954880", + "1634651793513400267440128" + ], + "expectedQty": "5904026526163543529195163", + "reserves": [ + "27117798778873906460473175", + "159764917629330216855361013", + "100640491188044456613074573" + ], + "mAssetSupply": "286724936378476681356612328" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "38022756375258864", + "expectedQty": "36588135634482440", + "swapFee": "22813653825155", + "reserves": [ + "27117798742285770825990735", + "159764917629330216855361013", + "100640491188044456613074573" + ], + "mAssetSupply": "286724936340476738635178619" + }, + { + "type": "mintMulti", + "inputQtys": [ + "2836927415744402432", + "1659248503555760640", + "1686069373845340416" + ], + "expectedQty": "6270276477801800257", + "reserves": [ + "27117801579213186570393167", + "159764919288578720411121653", + "100640492874113830458414989" + ], + "mAssetSupply": "286724942610753216436978876" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "1337593368405778366464", + "outputIndex": 0, + "expectedQty": "1275143325306210571367", + "swapFee": "795086742736396054", + "reserves": [ + "27116526435887880359821800", + "159766256881947126189488117", + "100640492874113830458414989" + ], + "mAssetSupply": "286724943405839959173374930", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemBassets", + "inputQtys": [ + "1374823766226139235745792", + "2532546831412938386964480", + "2312931260297977595428864" + ], + "expectedQty": "6242765827963841895194309", + "swapFee": "3747908241723339140600", + "reserves": [ + "25741702669661741124076008", + "157233710050534187802523637", + "98327561613815852862986125" + ], + "mAssetSupply": "280482177577876117278180621" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "35164381962740393050112", + "expectedQty": "34824304086256726240945", + "reserves": [ + "25741702669661741124076008", + "157268874432496928195573749", + "98327561613815852862986125" + ] + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "24821762072354748", + "outputIndex": 1, + "expectedQty": "26083676909838525", + "swapFee": "15508134538624", + "reserves": [ + "25741702694483503196430756", + "157268874406413251285735224", + "98327561613815852862986125" + ], + "mAssetSupply": "280517001881977882138960190", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "66111641829383524581376", + "expectedQty": "63445284565613566251518", + "swapFee": "39666985097630114748", + "reserves": [ + "25678257409917889630179238", + "157268874406413251285735224", + "98327561613815852862986125" + ], + "mAssetSupply": "280450929907133596244493562" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "540743615556720394240", + "expectedQty": "542430187130784969279", + "swapFee": "324446169334032236", + "reserves": [ + "25678257409917889630179238", + "157268874406413251285735224", + "98327019183628722078016846" + ], + "mAssetSupply": "280450389487964208858131558" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "5672278438181680418127872", + "expectedQty": "5688149072050308407829471", + "swapFee": "3403367062909008250876", + "reserves": [ + "25678257409917889630179238", + "157268874406413251285735224", + "92638870111578413670187375" + ], + "mAssetSupply": "274781514416845437448254562" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "1737200640950377176367104", + "expectedQty": "1753351186866504305795202", + "swapFee": "1042320384570226305820", + "reserves": [ + "25678257409917889630179238", + "155515523219546746979940022", + "92638870111578413670187375" + ], + "mAssetSupply": "273045356096279630498193278" + }, + { + "type": "redeemMasset", + "inputQty": "137357165004897987120332", + "expectedQtys": [ + "12913731852875677345377", + "78209581505371693899412", + "46588579149932593495640" + ], + "redemptionFee": "41207149501469396136", + "reserves": [ + "25665343678065013952833861", + "155437313638041375286040610", + "92592281532428481076691735" + ], + "mAssetSupply": "272908040138424233980469082" + }, + { + "type": "mintMulti", + "inputQtys": [ + "478005947208570880", + "435516412665230208", + "481566996622493120" + ], + "expectedQty": "1408250517170475592", + "reserves": [ + "25665344156070961161404741", + "155437314073557787951270818", + "92592282013995477699184855" + ], + "mAssetSupply": "272908041546674751150944674" + }, + { + "type": "redeemMasset", + "inputQty": "83728749785074699442585", + "expectedQtys": [ + "7871818245672259080583", + "47674181867266857069840", + "28398980763084442794806" + ], + "redemptionFee": "25118624935522409832", + "reserves": [ + "25657472337825288902324158", + "155389639891690521094200978", + "92563883033232393256390049" + ], + "mAssetSupply": "272824337915514611973911921" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "28943187263100981248", + "expectedQty": "28852910527406904560", + "reserves": [ + "25657472337825288902324158", + "155389639891690521094200978", + "92563911976419656357371297" + ] + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "15501763684015328460800", + "expectedQty": "15644737513309947727306", + "swapFee": "9301058210409197076", + "reserves": [ + "25657472337825288902324158", + "155373995154177211146473672", + "92563911976419656357371297" + ], + "mAssetSupply": "272808874305799334461552757" + }, + { + "type": "redeemMasset", + "inputQty": "66879397243601259855872", + "expectedQtys": [ + "6288070731672078658618", + "38078679712794780602348", + "22685337746614875191700" + ], + "redemptionFee": "20063819173080377956", + "reserves": [ + "25651184267093616823665540", + "155335916474464416365871324", + "92541226638673041482179597" + ], + "mAssetSupply": "272742014972374906282074841" + }, + { + "type": "mintMulti", + "inputQtys": [ + "1691490636556460837830656", + "459497483677169700831232", + "346871821515957272051712" + ], + "expectedQty": "2555450733968480846183616", + "reserves": [ + "27342674903650077661496196", + "155795413958141586066702556", + "92888098460188998754231309" + ], + "mAssetSupply": "275297465706343387128258457" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "91391636142779138048", + "4783029655673032933376", + "3910103723428428644352" + ], + "expectedQty": "8732992142711135194471", + "swapFee": "5242941050256835217", + "reserves": [ + "27342583512013934882358148", + "155790630928485913033769180", + "92884188356465570325586957" + ], + "mAssetSupply": "275288732714200675993063986" + }, + { + "type": "redeemMasset", + "inputQty": "1987399347562902192128", + "expectedQtys": [ + "197335829574504850998", + "1124366078307860693676", + "670360149238422713104" + ], + "redemptionFee": "596219804268870657", + "reserves": [ + "27342386176184360377507150", + "155789506562407605173075504", + "92883517996316331902873853" + ], + "mAssetSupply": "275286745911072917359742515" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "1637944388884312883200", + "expectedQty": "1641542336454635985099", + "swapFee": "982766633330587729", + "reserves": [ + "27342386176184360377507150", + "155789506562407605173075504", + "92881876453979877266888754" + ], + "mAssetSupply": "275285108949450666377447044" + }, + { + "type": "redeemMasset", + "inputQty": "29846782166005822259", + "expectedQtys": [ + "2963608974490378770", + "16885840789635472102", + "10067356991186157290" + ], + "redemptionFee": "8954034649801746", + "reserves": [ + "27342383212575385887128380", + "155789489676566815537603402", + "92881866386622886080731464" + ], + "mAssetSupply": "275285079111622535021426531" + }, + { + "type": "mintMulti", + "inputQtys": [ + "15764244562134209396736", + "26390813554641645600768", + "18517603407071291637760" + ], + "expectedQty": "60931302984679258364915", + "reserves": [ + "27358147457137520096525116", + "155815880490121457183204170", + "92900383990029957372369224" + ], + "mAssetSupply": "275346010414607214279791446" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "6197246470142664704", + "expectedQty": "6414178204868464756", + "reserves": [ + "27358153654383990239189820", + "155815880490121457183204170", + "92900383990029957372369224" + ] + }, + { + "type": "redeemMasset", + "inputQty": "123300152848409808810803", + "expectedQtys": [ + "12247326424825594939910", + "69753535806621678794995", + "41588381368536377031159" + ], + "redemptionFee": "36990045854522942643", + "reserves": [ + "27345906327959164644249910", + "155746126954314835504409175", + "92858795608661420995338065" + ], + "mAssetSupply": "275222753665982863862388042" + }, + { + "type": "mintMulti", + "inputQtys": [ + "27849522682189976698880", + "492402572932924038971392", + "301132362927198707908608" + ], + "expectedQty": "817005568711859258316946", + "reserves": [ + "27373755850641354620948790", + "156238529527247759543380567", + "93159927971588619703246673" + ], + "mAssetSupply": "276039759234694723120704988" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "156634917731430629376", + "expectedQty": "151224497398792751008", + "swapFee": "93980950638858377", + "reserves": [ + "27373604626143955828197782", + "156238529527247759543380567", + "93159927971588619703246673" + ], + "mAssetSupply": "276039602693757942328933989" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "744957705208394489528320", + "expectedQty": "746570195037523988861977", + "swapFee": "446974623125036693716", + "reserves": [ + "27373604626143955828197782", + "156238529527247759543380567", + "92413357776551095714384696" + ], + "mAssetSupply": "275295091963172672876099385" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "622158874606743081451520", + "expectedQty": "627545044018169657567820", + "swapFee": "373295324764045848870", + "reserves": [ + "27373604626143955828197782", + "155610984483229589885812747", + "92413357776551095714384696" + ], + "mAssetSupply": "274673306383890693840496735" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "11734937482044342", + "outputIndex": 1, + "expectedQty": "11803842777058419", + "swapFee": "7021691879826", + "reserves": [ + "27373604626143955828197782", + "155610984471425747108754328", + "92413357788286033196429038" + ], + "mAssetSupply": "274673306383897715532376561", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemMasset", + "inputQty": "5009336280623692015206", + "expectedQtys": [ + "499074538813619989335", + "2837093666328377336646", + "1684876893208195238402" + ], + "redemptionFee": "1502800884187107604", + "reserves": [ + "27373105551605142208208447", + "155608147377759418731417682", + "92411672911392825001190636" + ], + "mAssetSupply": "274668298550417976027468959" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "3843794254279844953063424", + "expectedQty": "3832450353739594484452769", + "reserves": [ + "27373105551605142208208447", + "155608147377759418731417682", + "96255467165672669954254060" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "117546269955457952", + "1193575137280098816", + "1428621869088088832" + ], + "expectedQty": "2728628626901349504", + "reserves": [ + "27373105669151412163666399", + "155608148571334556011516498", + "96255468594294539042342892" + ], + "mAssetSupply": "278500751632786197413271232" + }, + { + "type": "mintMulti", + "inputQtys": [ + "334903273159270370115584", + "404730571468744704393216", + "34950971176762805846016" + ], + "expectedQty": "782629137137354216191744", + "reserves": [ + "27708008942310682533781983", + "156012879142803300715909714", + "96290419565471301848188908" + ], + "mAssetSupply": "279283380769923551629462976" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "181410146553056857161728", + "outputIndex": 1, + "expectedQty": "189262005812395752756776", + "swapFee": "112615537700451792719", + "reserves": [ + "27889419088863739390943711", + "155823617136990904963152938", + "96290419565471301848188908" + ], + "mAssetSupply": "279283493385461252081255695", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "219215039510738632704", + "expectedQty": "226744177117792099664", + "reserves": [ + "27889638303903250129576415", + "155823617136990904963152938", + "96290419565471301848188908" + ] + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "305515640424183132848128", + "expectedQty": "315895301637310167897417", + "reserves": [ + "28195153944327433262424543", + "155823617136990904963152938", + "96290419565471301848188908" + ] + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "719587308372088108089344", + "expectedQty": "717405531961310370912882", + "reserves": [ + "28195153944327433262424543", + "155823617136990904963152938", + "97010006873843389956278252" + ] + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "18395977071491620536320", + "expectedQty": "18339492775457436151444", + "reserves": [ + "28195153944327433262424543", + "155823617136990904963152938", + "97028402850914881576814572" + ] + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "269079110121119398494208", + "expectedQty": "268248897999090634891532", + "reserves": [ + "28195153944327433262424543", + "155823617136990904963152938", + "97297481961036000975308780" + ] + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "328087242871868227584", + "expectedQty": "330786290964318486392", + "swapFee": "196852345723120936", + "reserves": [ + "28195153944327433262424543", + "155823286350699940644666546", + "97297481961036000975308780" + ], + "mAssetSupply": "280603281463621012338101986" + }, + { + "type": "mintMulti", + "inputQtys": [ + "240851683184066275835904", + "1848882275879680257032192", + "651439295646109276307456" + ], + "expectedQty": "2731095331289630254092587", + "reserves": [ + "28436005627511499538260447", + "157672168626579620901698738", + "97948921256682110251616236" + ], + "mAssetSupply": "283334376794910642592194573" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "682962927076203879727104", + "expectedQty": "684627813363008777387630", + "swapFee": "409777756245722327836", + "reserves": [ + "28436005627511499538260447", + "157672168626579620901698738", + "97264293443319101474228606" + ], + "mAssetSupply": "282651823645590684434795305" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "2160151116065072742400", + "2774324527873822031872", + "5175204755846177226752" + ], + "expectedQty": "10142723994165660782752", + "swapFee": "6089287969280965048", + "reserves": [ + "28433845476395434465518047", + "157669394302051747079666866", + "97259118238563255297001854" + ], + "mAssetSupply": "282641680921596518774012553" + }, + { + "type": "redeemMasset", + "inputQty": "107490564588894001561", + "expectedQtys": [ + "10810341852968161761", + "59944760323417380639", + "36977211448586876838" + ], + "redemptionFee": "32247169376668200", + "reserves": [ + "28433834666053581497356286", + "157669334357291423662286227", + "97259081261351806710125016" + ], + "mAssetSupply": "282641573463279099256679192" + }, + { + "type": "mintMulti", + "inputQtys": [ + "1734856654963571463028736", + "785929766974649605816320", + "2288543632666975182782464" + ], + "expectedQty": "4851701485435601908970017", + "reserves": [ + "30168691321017152960385022", + "158455264124266073268102547", + "99547624894018781892907480" + ], + "mAssetSupply": "287493274948714701165649209" + }, + { + "type": "redeemMasset", + "inputQty": "24079699854524048159539", + "expectedQtys": [ + "2526094205973426631893", + "13267825254701903121442", + "8335352560951542288551" + ], + "redemptionFee": "7223909956357214447", + "reserves": [ + "30166165226811179533753129", + "158441996299011371364981105", + "99539289541457830350618929" + ], + "mAssetSupply": "287469202472770133474704117" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "357647765444830836031488", + "expectedQty": "356610235525936931997435", + "reserves": [ + "30166165226811179533753129", + "158441996299011371364981105", + "99896937306902661186650417" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "70212875899286082027520", + "11791600110529526366208", + "36537493605540559847424" + ], + "expectedQty": "120497677518764573391904", + "swapFee": "72342011718289717865", + "reserves": [ + "30095952350911893451725609", + "158430204698900841838614897", + "99860399813297120626802993" + ], + "mAssetSupply": "287705315030777305833309648" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "140244726764320669696", + "outputIndex": 0, + "expectedQty": "134837584986195092280", + "swapFee": "83447374135645702", + "reserves": [ + "30095817513326907256633329", + "158430344943627606159284593", + "99860399813297120626802993" + ], + "mAssetSupply": "287705315114224679968955350", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "22618323308061652942848", + "outputIndex": 1, + "expectedQty": "23496430015312373272658", + "swapFee": "13989163882434776194", + "reserves": [ + "30118435836634968909576177", + "158406848513612293786011935", + "99860399813297120626802993" + ], + "mAssetSupply": "287705329103388562403731544", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "156183793693711694561280", + "expectedQty": "157396317285679630159003", + "swapFee": "93710276216227016736", + "reserves": [ + "30118435836634968909576177", + "158249452196326614155852932", + "99860399813297120626802993" + ], + "mAssetSupply": "287549239019971066936187000" + }, + { + "type": "redeemMasset", + "inputQty": "13271287013659482521", + "expectedQtys": [ + "1389641977945906719", + "7301510707653314145", + "4607483744100158120" + ], + "redemptionFee": "3981386104097844", + "reserves": [ + "30118434446992990963669458", + "158249444894815906502538787", + "99860395205813376526644873" + ], + "mAssetSupply": "287549225752665439380802323" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "6693320073470389", + "4969727890226080", + "7232763735341721" + ], + "expectedQty": "19039167595490503", + "swapFee": "11430358772557", + "reserves": [ + "30118434440299670890199069", + "158249444889846178612312707", + "99860395198580612791303152" + ], + "mAssetSupply": "287549225733626271785311820" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "50263663743428824", + "2309261038913002496", + "2050691189034958080" + ], + "expectedQty": "4386603390677412878", + "swapFee": "2633542159702269", + "reserves": [ + "30118434390036007146770245", + "158249442580585139699310211", + "99860393147889423756345072" + ], + "mAssetSupply": "287549221347022881107898942" + }, + { + "type": "mintMulti", + "inputQtys": [ + "1251112398498420481851392", + "1653331888222961181655040", + "730098016819108028350464" + ], + "expectedQty": "3656236418191095020964722", + "reserves": [ + "31369546788534427628621637", + "159902774468808100880965251", + "100590491164708531784695536" + ], + "mAssetSupply": "291205457765213976128863664" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "686201594306068045889536", + "expectedQty": "691341217532706942133357", + "swapFee": "411720956583640827533", + "reserves": [ + "31369546788534427628621637", + "159211433251275393938831894", + "100590491164708531784695536" + ], + "mAssetSupply": "290519667891864491723801661" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "27622365111417430867968", + "expectedQty": "26834982039880635545896", + "swapFee": "16573419066850458520", + "reserves": [ + "31342711806494546993075741", + "159211433251275393938831894", + "100590491164708531784695536" + ], + "mAssetSupply": "290492062100172141143392213" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "1529153910567991508992", + "expectedQty": "1540581467742728386227", + "swapFee": "917492346340794905", + "reserves": [ + "31342711806494546993075741", + "159209892669807651210445667", + "100590491164708531784695536" + ], + "mAssetSupply": "290490533863753919492678126" + }, + { + "type": "redeemMasset", + "inputQty": "492247223313348581706956", + "expectedQtys": [ + "53095480062128779142919", + "269706263265701693579552", + "170403264754163070023006" + ], + "redemptionFee": "147674166994004574512", + "reserves": [ + "31289616326432418213932822", + "158940186406541949516866115", + "100420087899954368714672530" + ], + "mAssetSupply": "289998434314607564915545682" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "5011551444313584045129728", + "expectedQty": "4996545992011786559035696", + "reserves": [ + "31289616326432418213932822", + "158940186406541949516866115", + "105431639344267952759802258" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "8221835309767265878016", + "2794631094521393840128", + "8571648010500861591552" + ], + "expectedQty": "19781821092473839066054", + "reserves": [ + "31297838161742185479810838", + "158942981037636470910706243", + "105440210992278453621393810" + ], + "mAssetSupply": "295014762127711825313647432" + }, + { + "type": "redeemMasset", + "inputQty": "500595108853469566468096", + "expectedQtys": [ + "53091731156370827978154", + "269621114878070285994506", + "178862300525150793001495" + ], + "redemptionFee": "150178532656040869940", + "reserves": [ + "31244746430585814651832684", + "158673359922758400624711737", + "105261348691753302828392315" + ], + "mAssetSupply": "294514317197391011788049276" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "7639225738276039032832", + "outputIndex": 1, + "expectedQty": "7922934171196245270654", + "swapFee": "4719131453054384858", + "reserves": [ + "31252385656324090690865516", + "158665436988587204379441083", + "105261348691753302828392315" + ], + "mAssetSupply": "294514321916522464842434134", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "1723829062046376154628096", + "expectedQty": "1772139322694705756481508", + "reserves": [ + "32976214718370466845493612", + "158665436988587204379441083", + "105261348691753302828392315" + ] + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "523785787385805155598336", + "expectedQty": "524998963131498141430911", + "swapFee": "314271472431483093359", + "reserves": [ + "32976214718370466845493612", + "158665436988587204379441083", + "104736349728621804686961404" + ], + "mAssetSupply": "295762989723303796926410665" + }, + { + "type": "redeemMasset", + "inputQty": "20096586552445769036595", + "expectedQtys": [ + "2240004880507838663922", + "10777809286411241660294", + "7114519861128622347702" + ], + "redemptionFee": "6028975965733730710", + "reserves": [ + "32973974713489959006829690", + "158654659179300793137780789", + "104729235208760676064613702" + ], + "mAssetSupply": "295742899165727316891104780" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "31917726893497204604928", + "expectedQty": "31990882702081120536065", + "swapFee": "19150636136098322762", + "reserves": [ + "32973974713489959006829690", + "158654659179300793137780789", + "104697244326058594944077637" + ], + "mAssetSupply": "295711000589469955784822614" + }, + { + "type": "mintMulti", + "inputQtys": [ + "156503531984101549539328", + "47191311971362149498880", + "266339448351640598347776" + ], + "expectedQty": "473041457148761939737087", + "reserves": [ + "33130478245474060556369018", + "158701850491272155287279669", + "104963583774410235542425413" + ], + "mAssetSupply": "296184042046618717724559701" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "11410466677254744064", + "expectedQty": "11377590137516830623", + "reserves": [ + "33130478245474060556369018", + "158701850491272155287279669", + "104963595184876912797169477" + ] + }, + { + "type": "redeemMasset", + "inputQty": "1952103109555973734", + "expectedQtys": [ + "218292330811556875", + "1045665462211661251", + "691591219224177345" + ], + "redemptionFee": "585630932866792", + "reserves": [ + "33130478027181729744812143", + "158701849445606693075618418", + "104963594493285693572992132" + ], + "mAssetSupply": "296184051472691376618283382" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "20105590246188804734976", + "expectedQty": "19956117957144136977730", + "reserves": [ + "33130478027181729744812143", + "158721955035852881880353394", + "104963594493285693572992132" + ] + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "14249823607992655872", + "expectedQty": "14208773055219319998", + "reserves": [ + "33130478027181729744812143", + "158721955035852881880353394", + "104963608743109301565648004" + ] + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "3494385872126205952", + "expectedQty": "3518448929589501445", + "swapFee": "2096631523275723", + "reserves": [ + "33130478027181729744812143", + "158721951517403952290851949", + "104963608743109301565648004" + ], + "mAssetSupply": "296204018307132335371650881" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "20751616340829839294464", + "expectedQty": "20799064227147236040890", + "swapFee": "12450969804497903576", + "reserves": [ + "33130478027181729744812143", + "158721951517403952290851949", + "104942809678882154329607114" + ], + "mAssetSupply": "296183279141761310030259993" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "160477216754844817162240", + "expectedQty": "159283164669330333180823", + "reserves": [ + "33130478027181729744812143", + "158882428734158797108014189", + "104942809678882154329607114" + ] + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "3942577979470091264", + "outputIndex": 2, + "expectedQty": "4055528026707730853", + "swapFee": "2427777457117501", + "reserves": [ + "33130481969759709214903407", + "158882428734158797108014189", + "104942805623354127621876261" + ], + "mAssetSupply": "296342562308858417820558317", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "6787630764035417971884032", + "expectedQty": "6801053837517836378352223", + "swapFee": "4072578458421250783130", + "reserves": [ + "33130481969759709214903407", + "158882428734158797108014189", + "98141751785836291243524038" + ], + "mAssetSupply": "289559004123281421099457415" + }, + { + "type": "redeemMasset", + "inputQty": "3726473237869354811392", + "expectedQtys": [ + "426244097763056812709", + "2044120503529332522839", + "1262654207114242709978" + ], + "redemptionFee": "1117941971360806443", + "reserves": [ + "33130055725661946158090698", + "158880384613655267775491350", + "98140489131629177000814060" + ], + "mAssetSupply": "289555278767985523105452466" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "23188594259642611138560", + "expectedQty": "23352706067651438347939", + "swapFee": "13913156555785566683", + "reserves": [ + "33130055725661946158090698", + "158857031907587616337143411", + "98140489131629177000814060" + ], + "mAssetSupply": "289532104086882436279880589" + }, + { + "type": "mintMulti", + "inputQtys": [ + "822989399370502057754624", + "1012255157649746094456832", + "190117348196591234711552" + ], + "expectedQty": "2037685785273166098279713", + "reserves": [ + "33953045125032448215845322", + "159869287065237362431600243", + "98330606479825768235525612" + ], + "mAssetSupply": "291569789872155602378160302" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "673126549693269120", + "101967135261151248", + "500655623750005440" + ], + "expectedQty": "1290273872778248422", + "swapFee": "774629101127625", + "reserves": [ + "33953044451905898522576202", + "159869286963270227170448995", + "98330605979170144485520172" + ], + "mAssetSupply": "291569788581881729599911880" + }, + { + "type": "mintMulti", + "inputQtys": [ + "152475920093857185792", + "114187562296428167168", + "4167443271508783104" + ], + "expectedQty": "273670923449713433750", + "reserves": [ + "33953196927825992379761994", + "159869401150832523598616163", + "98330610146613415994303276" + ], + "mAssetSupply": "291570062252805179313345630" + }, + { + "type": "mintMulti", + "inputQtys": [ + "949603964290479859695616", + "631361974118712835309568", + "148517349777435753709568" + ], + "expectedQty": "1747009790500937952240792", + "reserves": [ + "34902800892116472239457610", + "160500763124951236433925731", + "98479127496390851748012844" + ], + "mAssetSupply": "293317072043306117265586422" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "6509363907607", + "2645011697256", + "12600822298653" + ], + "expectedQty": "21861213732768", + "swapFee": "13124603001", + "reserves": [ + "34902800892109962875550003", + "160500763124948591422228475", + "98479127496378250925714191" + ], + "mAssetSupply": "293317072043284256051853654" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "62964984689560794431488", + "outputIndex": 1, + "expectedQty": "64854462589418026830772", + "swapFee": "38651284556000831319", + "reserves": [ + "34965765876799523669981491", + "160435908662359173395397703", + "98479127496378250925714191" + ], + "mAssetSupply": "293317110694568812052684973", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemBassets", + "inputQtys": [ + "954717410419744046055424", + "433896174616982360948736", + "796687394500367039332352" + ], + "expectedQty": "2202991466493197453874027", + "swapFee": "1322588432955691887456", + "reserves": [ + "34011048466379779623926067", + "160002012487742191034448967", + "97682440101877883886381839" + ], + "mAssetSupply": "291114119228075614598810946" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "78717408182267134607360", + "expectedQty": "78125921746901040857701", + "reserves": [ + "34011048466379779623926067", + "160080729895924458169056327", + "97682440101877883886381839" + ] + }, + { + "type": "redeemMasset", + "inputQty": "497385102285568196214784", + "expectedQtys": [ + "58076800207857268988229", + "273351660313668717561393", + "166801195888466645753020" + ], + "redemptionFee": "149215530685670458864", + "reserves": [ + "33952971666171922354937838", + "159807378235610789451494934", + "97515638905989417240628819" + ], + "mAssetSupply": "290695009263067633113912727" + }, + { + "type": "redeemMasset", + "inputQty": "96732254847243467410636", + "expectedQtys": [ + "11294869533895762331174", + "53161870644846115753095", + "32439764913273115422703" + ], + "redemptionFee": "29019676454173040223", + "reserves": [ + "33941676796638026592606664", + "159754216364965943335741839", + "97483199141076144125206116" + ], + "mAssetSupply": "290598306027896843819542314" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "65630726405609243017216", + "51089053020672730595328", + "46031780603490700623872" + ], + "expectedQty": "163861366702906782482588", + "swapFee": "98375845529061506393", + "reserves": [ + "33876046070232417349589448", + "159703127311945270605146511", + "97437167360472653424582244" + ], + "mAssetSupply": "290434444661193937037059726" + }, + { + "type": "mintMulti", + "inputQtys": [ + "33107079056022396993536", + "757926805985353158098944", + "24057090692534530736128" + ], + "expectedQty": "810124425297936580341740", + "reserves": [ + "33909153149288439746582984", + "160461054117930623763245455", + "97461224451165187955318372" + ], + "mAssetSupply": "291244569086491873617401466" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "1203085457717099208114176", + "expectedQty": "1231390916391969020074522", + "reserves": [ + "35112238607005538954697160", + "160461054117930623763245455", + "97461224451165187955318372" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "936183245777477", + "226454189996646", + "631538558889879" + ], + "expectedQty": "1812597425123475", + "reserves": [ + "35112238607941722200474637", + "160461054118157077953242101", + "97461224451796726514208251" + ], + "mAssetSupply": "292475960004696440062599463" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "1218092480546765537280", + "643966950577663377408", + "1047967487529201565696" + ], + "expectedQty": "2931017836579303554200", + "swapFee": "1759666501848691347", + "reserves": [ + "35111020515461175434937357", + "160460410151206500289864693", + "97460176484309197312642555" + ], + "mAssetSupply": "292473028986859860759045263" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "39609859695829802024960", + "expectedQty": "39877618504900659921161", + "swapFee": "23765915817497881214", + "reserves": [ + "35111020515461175434937357", + "160420532532701599629943532", + "97460176484309197312642555" + ], + "mAssetSupply": "292433442893079848454901517" + }, + { + "type": "mintMulti", + "inputQtys": [ + "127527236325111431168", + "20556767426185990144", + "105334373715998539776" + ], + "expectedQty": "255965809211347570313", + "reserves": [ + "35111148042697500546368525", + "160420553089469025815933676", + "97460281818682913311182331" + ], + "mAssetSupply": "292433698858889059802471830" + }, + { + "type": "mintMulti", + "inputQtys": [ + "599035111985424459890688", + "989092543464559079325696", + "848443935292850113085440" + ], + "expectedQty": "2441265205942475911581119", + "reserves": [ + "35710183154682925006259213", + "161409645632933584895259372", + "98308725753975763424267771" + ], + "mAssetSupply": "294874964064831535714052949" + }, + { + "type": "mintMulti", + "inputQtys": [ + "66765313231614746624", + "99655259126414786560", + "17312800101917454336" + ], + "expectedQty": "184466579566515591306", + "reserves": [ + "35710249919996156621005837", + "161409745288192711310045932", + "98308743066775865341722107" + ], + "mAssetSupply": "294875148531411102229644255" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "20148698901726059560960", + "expectedQty": "20283122187750997406787", + "swapFee": "12089219341035635736", + "reserves": [ + "35710249919996156621005837", + "161389462166004960312639145", + "98308743066775865341722107" + ], + "mAssetSupply": "294855011921728717205719031" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "225314159864098085404672", + "expectedQty": "220249703213355308615965", + "swapFee": "135188495918458851242", + "reserves": [ + "35490000216782801312389872", + "161389462166004960312639145", + "98308743066775865341722107" + ], + "mAssetSupply": "294629832950360537579165601" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "36479375758822563905536", + "expectedQty": "37300083058121511489283", + "reserves": [ + "35526479592541623876295408", + "161389462166004960312639145", + "98308743066775865341722107" + ] + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "1171192053531688799567872", + "expectedQty": "1168932828942766219962003", + "reserves": [ + "35526479592541623876295408", + "161389462166004960312639145", + "99479935120307554141289979" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "22101752013249927184384", + "24152048702347011948544", + "32065744922288022618112" + ], + "expectedQty": "78581649605761927611843", + "swapFee": "47177296141141841672", + "reserves": [ + "35504377840528373949111024", + "161365310117302613300690601", + "99447869375385266118671867" + ], + "mAssetSupply": "295757484212755663383005044" + }, + { + "type": "mintMulti", + "inputQtys": [ + "186495847337874685952", + "217981685574502285312", + "231950542947124510720" + ], + "expectedQty": "638615083787423971051", + "reserves": [ + "35504564336375711823796976", + "161365528098988187802975913", + "99448101325928213243182587" + ], + "mAssetSupply": "295758122827839450806976095" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "104762751742911969230848", + "outputIndex": 0, + "expectedQty": "101632075358497333839426", + "swapFee": "62402925734086013250", + "reserves": [ + "35402932261017214489957550", + "161470290850731099772206761", + "99448101325928213243182587" + ], + "mAssetSupply": "295758185230765184892989345", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "1869437530488471885447168", + "expectedQty": "1865550935224201718260826", + "reserves": [ + "35402932261017214489957550", + "161470290850731099772206761", + "101317538856416685128629755" + ] + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "7532958196598753280", + "expectedQty": "7706568114970187518", + "reserves": [ + "35402939793975411088710830", + "161470290850731099772206761", + "101317538856416685128629755" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "7157250770825004032", + "54702500648515846144", + "141435803813496668160" + ], + "expectedQty": "202760292830018762578", + "swapFee": "121729213225946825", + "reserves": [ + "35402932636724640263706798", + "161470236148230451256360617", + "101317397420612871631961595" + ], + "mAssetSupply": "297623541112264671562675111" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "2753812736016102400", + "expectedQty": "2772140324245765241", + "swapFee": "1652287641609661", + "reserves": [ + "35402932636724640263706798", + "161470233376090127010595376", + "101317397420612871631961595" + ], + "mAssetSupply": "297623538360104223188182372" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "3560279044074277682806784", + "3829989033061585636032512", + "282012438065659135393792" + ], + "expectedQty": "7732594666580214563612386", + "swapFee": "4642342205271291513075", + "reserves": [ + "31842653592650362580900014", + "157640244343028541374562864", + "101035384982547212496567803" + ], + "mAssetSupply": "289890943693524008624569986" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "4576341699959376576512", + "expectedQty": "4609409415565759873835", + "swapFee": "2745805019975625945", + "reserves": [ + "31842653592650362580900014", + "157635634933612975614689029", + "101035384982547212496567803" + ], + "mAssetSupply": "289886370097629069223619419" + }, + { + "type": "mintMulti", + "inputQtys": [ + "950347871936050233344", + "1819540132874697048064", + "2000511898251796938752" + ], + "expectedQty": "4776898395699820724513", + "reserves": [ + "31843603940522298631133358", + "157637454473745850311737093", + "101037385494445464293506555" + ], + "mAssetSupply": "289891146996024769044343932" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "2454675393564694282240", + "expectedQty": "2472411377716308573114", + "swapFee": "1472805236138816569", + "reserves": [ + "31843603940522298631133358", + "157634982062368134003163979", + "101037385494445464293506555" + ], + "mAssetSupply": "289888693793436440488878261" + }, + { + "type": "redeemMasset", + "inputQty": "15618616158386656169164", + "expectedQtys": [ + "1715154236035438216870", + "8490505903057857348069", + "5442056748740648309382" + ], + "redemptionFee": "4685584847515996850", + "reserves": [ + "31841888786286263192916488", + "157626491556465076145815910", + "101031943437696723645197173" + ], + "mAssetSupply": "289873079862862901348705947" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "6134877870511199994511360", + "expectedQty": "6116235114990371175829979", + "reserves": [ + "31841888786286263192916488", + "157626491556465076145815910", + "107166821308207923639708533" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "3545049989394381406208", + "3861699002806937583616", + "1370135496973047037952" + ], + "expectedQty": "8844160682842591065803", + "reserves": [ + "31845433836275657574322696", + "157630353255467883083399526", + "107168191443704896686746485" + ], + "mAssetSupply": "295998159138536115115601729" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "61738833538253785661440", + "20385860792835230400512", + "11440160940784086941696" + ], + "expectedQty": "95137463734357984629346", + "swapFee": "57116748289588543903", + "reserves": [ + "31783695002737403788661256", + "157609967394675047852999014", + "107156751282764112599804789" + ], + "mAssetSupply": "295903021674801757130972383" + }, + { + "type": "redeemMasset", + "inputQty": "421025603653248113390387", + "expectedQtys": [ + "45209862252599607348794", + "224188059787771090875155", + "152422239280631172451955" + ], + "redemptionFee": "126307681095974434017", + "reserves": [ + "31738485140484804181312462", + "157385779334887276762123859", + "107004329043483481427352834" + ], + "mAssetSupply": "295482122378829604992016013" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "245983386946123054710784", + "expectedQty": "252977800371460432267051", + "reserves": [ + "31984468527430927236023246", + "157385779334887276762123859", + "107004329043483481427352834" + ] + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "60389063274533068800", + "expectedQty": "58696674132508193949", + "swapFee": "36233437964719841", + "reserves": [ + "31984409830756794727829297", + "157385779334887276762123859", + "107004329043483481427352834" + ], + "mAssetSupply": "295735039826371228855934105" + }, + { + "type": "mintMulti", + "inputQtys": [ + "12473394229634620456960", + "1443804111989653372928", + "10242311730527012388864" + ], + "expectedQty": "24466875790140134109846", + "reserves": [ + "31996883224986429348286257", + "157387223138999266415496787", + "107014571355214008439741698" + ], + "mAssetSupply": "295759506702161368990043951" + }, + { + "type": "redeemMasset", + "inputQty": "348270236304912783769", + "expectedQtys": [ + "37666478205147670428", + "185274995956620812252", + "125976708145019591537" + ], + "redemptionFee": "104481070891473835", + "reserves": [ + "31996845558508224200615829", + "157387037864003309794684535", + "107014445378505863420150161" + ], + "mAssetSupply": "295759158536406134968734017" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "1083175489797698816", + "865186931234312320", + "584546705066582272" + ], + "expectedQty": "2554989083305367179", + "swapFee": "1533913798262177", + "reserves": [ + "31996844475332734402917013", + "157387036998816378560372215", + "107014444793959158353567889" + ], + "mAssetSupply": "295759155981417051663366838" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "630727536846775123968", + "expectedQty": "635156088228771315153", + "swapFee": "378436522108065074", + "reserves": [ + "31996844475332734402917013", + "157386401842728149789057062", + "107014444793959158353567889" + ], + "mAssetSupply": "295758525632316726996307944" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "1559289803115434713546752", + "expectedQty": "1547409698328518256157952", + "reserves": [ + "31996844475332734402917013", + "158945691645843584502603814", + "107014444793959158353567889" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "338644617017127168114688", + "1579024636336382050041856", + "366222422259466881728512" + ], + "expectedQty": "2280249658937457697803838", + "reserves": [ + "32335489092349861571031701", + "160524716282179966552645670", + "107380667216218625235296401" + ], + "mAssetSupply": "299586184989582702950269734" + }, + { + "type": "redeemMasset", + "inputQty": "90391217425419707665612", + "expectedQtys": [ + "9753344841111268262950", + "48419026814474942983866", + "32389201648914402735923" + ], + "redemptionFee": "27117365227625912299", + "reserves": [ + "32325735747508750302768751", + "160476297255365491609661804", + "107348278014569710832560478" + ], + "mAssetSupply": "299495820889522510868516421" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "1637542968330742661120", + "expectedQty": "1632345886505346580562", + "reserves": [ + "32325735747508750302768751", + "160476297255365491609661804", + "107349915557538041575221598" + ] + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "140182572709291684265984", + "expectedQty": "141182211857748770076556", + "swapFee": "84109543625575010559", + "reserves": [ + "32325735747508750302768751", + "160335115043507742839585248", + "107349915557538041575221598" + ], + "mAssetSupply": "299357354772243350105841558" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "5107600780125734881460224", + "expectedQty": "5067572715006576015344395", + "reserves": [ + "32325735747508750302768751", + "165442715823633477721045472", + "107349915557538041575221598" + ] + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "195984448166699663360", + "expectedQty": "197446924910310638999", + "swapFee": "117590668900019798", + "reserves": [ + "32325735747508750302768751", + "165442518376708567410406473", + "107349915557538041575221598" + ], + "mAssetSupply": "304424731620392428321542391" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "32844352463284809728", + "expectedQty": "33089443607820010531", + "swapFee": "19706611477970885", + "reserves": [ + "32325735747508750302768751", + "165442485287264959590395942", + "107349915557538041575221598" + ], + "mAssetSupply": "304424698795746576514703548" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "1022586827578104428363776", + "1313392764669011685277696", + "2885844306454504913502208" + ], + "expectedQty": "5233293318758512417934117", + "swapFee": "3141861107919859366380", + "reserves": [ + "31303148919930645874404975", + "164129092522595947905118246", + "104464071251083536661719390" + ], + "mAssetSupply": "299191405476988064096769431" + }, + { + "type": "redeemMasset", + "inputQty": "41501693418016623034368", + "expectedQtys": [ + "4340846446829245850339", + "22759984623923824174955", + "14486162196380970878825" + ], + "redemptionFee": "12450508025404986910", + "reserves": [ + "31298808073483816628554636", + "164106332537972024080943291", + "104449585088887155690840565" + ], + "mAssetSupply": "299149916234078072878721973" + }, + { + "type": "redeemMasset", + "inputQty": "95163457836446914288025", + "expectedQtys": [ + "9953568729270108386174", + "52188685779667271184688", + "33216796035334241428954" + ], + "redemptionFee": "28549037350934074286", + "reserves": [ + "31288854504754546520168462", + "164054143852192356809758603", + "104416368292851821449411611" + ], + "mAssetSupply": "299054781325278976898508234" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "2438247815261844339163136", + "expectedQty": "2430659347172824174947951", + "reserves": [ + "31288854504754546520168462", + "164054143852192356809758603", + "106854616108113665788574747" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "2634781709147518976", + "152092007477127520", + "229504805758403008" + ], + "expectedQty": "3096571656555195427", + "reserves": [ + "31288857139536255667687438", + "164054144004284364286886123", + "106854616337618471546977755" + ], + "mAssetSupply": "301485443769023457628651612" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "677037056273813929459712", + "291119540144457499279360", + "936009161380133792120832" + ], + "expectedQty": "1920216580647952169246290", + "swapFee": "1152821641373595458823", + "reserves": [ + "30611820083262441738227726", + "163763024464139906787606763", + "105918607176238337754856923" + ], + "mAssetSupply": "299565227188375505459405322" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "39581509870460124266496", + "44951736009667876225024", + "12813449743031968202752" + ], + "expectedQty": "98209098705948314885942", + "swapFee": "58960835725003991326", + "reserves": [ + "30572238573391981613961230", + "163718072728130238911381739", + "105905793726495305786654171" + ], + "mAssetSupply": "299467018089669557144519380" + }, + { + "type": "mintMulti", + "inputQtys": [ + "63624453153957156487168", + "42206846992639827378176", + "25233450104174158020608" + ], + "expectedQty": "132686336466529065279888", + "reserves": [ + "30635863026545938770448398", + "163760279575122878738759915", + "105931027176599479944674779" + ], + "mAssetSupply": "299599704426136086209799268" + }, + { + "type": "mintMulti", + "inputQtys": [ + "32636665798211576", + "18193636806893148", + "3872028748774113" + ], + "expectedQty": "55590984628216333", + "reserves": [ + "30635863059182604568659974", + "163760279593316515545653063", + "105931027180471508693448892" + ], + "mAssetSupply": "299599704481727070838015601" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "74490838908461400457216", + "expectedQty": "74689626040023125996412", + "swapFee": "44694503345076840274", + "reserves": [ + "30635863059182604568659974", + "163760279593316515545653063", + "105856337554431485567452480" + ], + "mAssetSupply": "299525258337321954514398659" + }, + { + "type": "redeemMasset", + "inputQty": "10584654142138", + "expectedQtys": [ + "1082288470835", + "5785241376828", + "3739639829268" + ], + "redemptionFee": "3175396242", + "reserves": [ + "30635863059181522280189139", + "163760279593310730304276235", + "105856337554427745927623212" + ], + "mAssetSupply": "299525258337311373035652763" + }, + { + "type": "mintMulti", + "inputQtys": [ + "6194490701693829079105536", + "752893421755498433085440", + "2214919938948088209604608" + ], + "expectedQty": "9317972673368542116847273", + "reserves": [ + "36830353760875351359294675", + "164513173015066228737361675", + "108071257493375834137227820" + ], + "mAssetSupply": "308843231010679915152500036" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "4776934930422730395222016", + "expectedQty": "4764234254438825362928819", + "reserves": [ + "36830353760875351359294675", + "164513173015066228737361675", + "112848192423798564532449836" + ] + }, + { + "type": "redeemMasset", + "inputQty": "583872795255918", + "expectedQtys": [ + "68549995485510", + "306197907864510", + "210037164764272" + ], + "redemptionFee": "175161838576", + "reserves": [ + "36830353760806801363809165", + "164513173014760030829497165", + "112848192423588527367685564" + ], + "mAssetSupply": "313607465264535042882011513" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "141157935916260448534528", + "82593498322765751517184", + "138130291632101969100800" + ], + "expectedQty": "364230985514621526841068", + "swapFee": "218669793184683726340", + "reserves": [ + "36689195824890540915274637", + "164430579516437265077979981", + "112710062131956425398584764" + ], + "mAssetSupply": "313243234279020421355170445" + }, + { + "type": "mintMulti", + "inputQtys": [ + "1416979979738535539245056", + "1396007178393259717165056", + "1465595677118933550235648" + ], + "expectedQty": "4297443275264634858348321", + "reserves": [ + "38106175804629076454519693", + "165826586694830524795145037", + "114175657809075358948820412" + ], + "mAssetSupply": "317540677554285056213518766" + }, + { + "type": "mintMulti", + "inputQtys": [ + "160695360174492246605824", + "28412311098032769728512", + "388496608380698994147328" + ], + "expectedQty": "579907996245475057093688", + "reserves": [ + "38266871164803568701125517", + "165854999005928557564873549", + "114564154417456057942967740" + ], + "mAssetSupply": "318120585550530531270612454" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "59204022243408318824448", + "outputIndex": 1, + "expectedQty": "59397641495295023106393", + "swapFee": "35424588809363254441", + "reserves": [ + "38266871164803568701125517", + "165795601364433262541767156", + "114623358439699466261792188" + ], + "mAssetSupply": "318120620975119340633866895", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "1833791343496574663655424", + "expectedQty": "1791177496035513216244716", + "swapFee": "1100274806097944798193", + "reserves": [ + "36475693668768055484880801", + "165795601364433262541767156", + "114623358439699466261792188" + ], + "mAssetSupply": "316287929906428863915009664" + }, + { + "type": "redeemMasset", + "inputQty": "705894975481004617315123", + "expectedQtys": [ + "81382443183703909438638", + "369913488984642118481451", + "255740961102857855063842" + ], + "redemptionFee": "211768492644301385194", + "reserves": [ + "36394311225584351575442163", + "165425687875448620423285705", + "114367617478596608406728346" + ], + "mAssetSupply": "315582246699440503599079735" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "3092465615825738433298432", + "outputIndex": 0, + "expectedQty": "2999972788897065133056095", + "swapFee": "1849698662286063922119", + "reserves": [ + "33394338436687286442386068", + "165425687875448620423285705", + "117460083094422346840026778" + ], + "mAssetSupply": "315584096398102789663001854", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "709959225641468800", + "expectedQty": "712170437811393789", + "swapFee": "425975535384881", + "reserves": [ + "33394338436687286442386068", + "165425687875448620423285705", + "117460082382251909028632989" + ], + "mAssetSupply": "315584095688569539556917935" + }, + { + "type": "redeemMasset", + "inputQty": "47374310104878171553792", + "expectedQtys": [ + "5011529910189660004641", + "24825638761291477848209", + "17627380677956363131910" + ], + "redemptionFee": "14212293031463451466", + "reserves": [ + "33389326906777096782381427", + "165400862236687328945437496", + "117442455001573952665501079" + ], + "mAssetSupply": "315536735590757692848815609" + }, + { + "type": "mintMulti", + "inputQtys": [ + "36037114841946761723904", + "38263111898992371302400", + "63341530098058037035008" + ], + "expectedQty": "138179566303899659325764", + "reserves": [ + "33425364021619043544105331", + "165439125348586321316739896", + "117505796531672010702536087" + ], + "mAssetSupply": "315674915157061592508141373" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "22572584776207934947328", + "expectedQty": "22402997226364675186421", + "reserves": [ + "33425364021619043544105331", + "165461697933362529251687224", + "117505796531672010702536087" + ] + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "5463716059576565304918016", + "expectedQty": "5442375660797506960538351", + "reserves": [ + "33425364021619043544105331", + "165461697933362529251687224", + "122969512591248576007454103" + ] + }, + { + "type": "redeemMasset", + "inputQty": "53732409928378182", + "expectedQtys": [ + "5590982954104288", + "27676393654359175", + "20568824570691443" + ], + "redemptionFee": "16119722978513", + "reserves": [ + "33425364016028060590001043", + "165461697905686135597328049", + "122969512570679751436762660" + ], + "mAssetSupply": "321139693761369173938466476" + }, + { + "type": "mintMulti", + "inputQtys": [ + "29363433659116491374592", + "40833049894266140098560", + "102501274308828718956544" + ], + "expectedQty": "172864942728865150175137", + "reserves": [ + "33454727449687177081375635", + "165502530955580401737426609", + "123072013844988580155719204" + ], + "mAssetSupply": "321312558704098039088641613" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "11216696331879866957824", + "expectedQty": "11170601404715630310882", + "reserves": [ + "33454727449687177081375635", + "165502530955580401737426609", + "123083230541320460022677028" + ] + }, + { + "type": "redeemMasset", + "inputQty": "374301304862858956", + "expectedQtys": [ + "38958814280117220", + "192731576608557875", + "143333306985317962" + ], + "redemptionFee": "112290391458857", + "reserves": [ + "33454727410728362801258415", + "165502530762848825128868734", + "123083230397987153037359066" + ], + "mAssetSupply": "321323728931313740247552396" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "204733787784417407664128", + "expectedQty": "205453810357739873770729", + "swapFee": "122840272670650444598", + "reserves": [ + "33454727410728362801258415", + "165502530762848825128868734", + "122877776587629413163588337" + ], + "mAssetSupply": "321119117983801993490332866" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "45075834727214222409728", + "19680971047750189711360", + "3694524456122479804416" + ], + "expectedQty": "69657309490550691102967", + "swapFee": "41819477380758869983", + "reserves": [ + "33409651576001148578848687", + "165482849791801074939157374", + "122874082063173290683783921" + ], + "mAssetSupply": "321049460674311442799229899" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "42445396967879711129600", + "expectedQty": "42271173659074858913825", + "reserves": [ + "33409651576001148578848687", + "165482849791801074939157374", + "122916527460141170394913521" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "263717623931414819897344", + "39325670698571660263424", + "3922110674956829881008128" + ], + "expectedQty": "4217208103129151357837454", + "swapFee": "2531843968258445882231", + "reserves": [ + "33145933952069733758951343", + "165443524121102503278893950", + "118994416785184340513905393" + ], + "mAssetSupply": "316874523744841366300306270" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "11863788341579401216", + "472163757245076602880", + "375781963604904116224" + ], + "expectedQty": "855151155719912812152", + "swapFee": "513398732671550617", + "reserves": [ + "33145922088281392179550127", + "165443051957345258202291070", + "118994041003220735609789169" + ], + "mAssetSupply": "316873668593685646387494118" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "74579686131753091072", + "64706670518980198400", + "13829048357279565824" + ], + "expectedQty": "154821881696897687351", + "swapFee": "92948898357152904", + "reserves": [ + "33145847508595260426459055", + "165442987250674739222092670", + "118994027174172378330223345" + ], + "mAssetSupply": "316873513771803949489806767" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "56184964882763698143232", + "expectedQty": "56578282293600781343028", + "swapFee": "33710978929658218885", + "reserves": [ + "33145847508595260426459055", + "165386408968381138440749642", + "118994027174172378330223345" + ], + "mAssetSupply": "316817362517900115449882420" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "733280794689118848", + "outputIndex": 2, + "expectedQty": "730131969912577861", + "swapFee": "436648550101680", + "reserves": [ + "33145847508595260426459055", + "165386409701661933129868490", + "118994026444040408417645484" + ], + "mAssetSupply": "316817362518336763999984100", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "2734678795787823300476928", + "expectedQty": "2743349883813521786045235", + "swapFee": "1640807277472693980286", + "reserves": [ + "33145847508595260426459055", + "165386409701661933129868490", + "116250676560226886631600249" + ], + "mAssetSupply": "314084324529826413393487458" + }, + { + "type": "mintMulti", + "inputQtys": [ + "406053218545176598806528", + "169129928689228525338624", + "403030669336124302819328" + ], + "expectedQty": "987390963179589341574979", + "reserves": [ + "33551900727140437025265583", + "165555539630351161655207114", + "116653707229563010934419577" + ], + "mAssetSupply": "315071715493006002735062437" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "907306234093146734592", + "expectedQty": "913620350299309193577", + "swapFee": "544383740455888040", + "reserves": [ + "33551900727140437025265583", + "165554626010000862346013537", + "116653707229563010934419577" + ], + "mAssetSupply": "315070808731155650044215885" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "924706729031402", + "outputIndex": 2, + "expectedQty": "954446231013887", + "swapFee": "570941984169", + "reserves": [ + "33551900728065143754296985", + "165554626010000862346013537", + "116653707228608564703405690" + ], + "mAssetSupply": "315070808731156220986200054", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "24906151090559398182912", + "expectedQty": "24188024817078969661442", + "swapFee": "14943690654335638909", + "reserves": [ + "33527712703248064784635543", + "165554626010000862346013537", + "116653707228608564703405690" + ], + "mAssetSupply": "315045917523756315923656051" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "2620490365484489244672", + "835321500832367509504", + "11680232189837933805568" + ], + "expectedQty": "15163777172739454828054", + "swapFee": "9103728540768133777", + "reserves": [ + "33525092212882580295390871", + "165553790688500029978504033", + "116642026996418726769600122" + ], + "mAssetSupply": "315030753746583576468827997" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "14594139190258040832000", + "expectedQty": "14172850941479655084061", + "swapFee": "8756483514154824499", + "reserves": [ + "33510919361941100640306810", + "165553790688500029978504033", + "116642026996418726769600122" + ], + "mAssetSupply": "315016168363876832582820496" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "8660364506006144235339776", + "476412580246274764177408", + "758535230173927752859648" + ], + "expectedQty": "10225746173932446880089425", + "swapFee": "6139131183069309713881", + "reserves": [ + "24850554855934956404967034", + "165077378108253755214326625", + "115883491766244799016740474" + ], + "mAssetSupply": "304790422189944385702731071" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "697125584466951222067200", + "874785547881647330820096", + "566835888719833675595776" + ], + "expectedQty": "2163851022338921950920268", + "swapFee": "1299090067443819462229", + "reserves": [ + "24153429271468005182899834", + "164202592560372107883506529", + "115316655877524965341144698" + ], + "mAssetSupply": "302626571167605463751810803" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "16296728714177142587392", + "outputIndex": 1, + "expectedQty": "17358995248225468857401", + "swapFee": "10312942837542441411", + "reserves": [ + "24169726000182182325487226", + "164185233565123882414649128", + "115316655877524965341144698" + ], + "mAssetSupply": "302626581480548301294252214", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "151014602924455329792", + "expectedQty": "159269140023767974688", + "reserves": [ + "24169877014785106780817018", + "164185233565123882414649128", + "115316655877524965341144698" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "80216179515320631296", + "6094698447101757440", + "32704656268392828928" + ], + "expectedQty": "123151222174570895402", + "swapFee": "73935094361359352", + "reserves": [ + "24169796798605591460185722", + "164185227470425435312891688", + "115316623172868696948315770" + ], + "mAssetSupply": "302626617598466150491331500" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "4990683799818809344", + "4545778978137122816", + "6839459003343613952" + ], + "expectedQty": "16562531928088096239", + "swapFee": "9943485248001658", + "reserves": [ + "24169791807921791641376378", + "164185222924646457175768872", + "115316616333409693604701818" + ], + "mAssetSupply": "302626601035934222403235261" + }, + { + "type": "mintMulti", + "inputQtys": [ + "195572196223115648", + "263623865471309984", + "28944547039015180" + ], + "expectedQty": "495916970736211233", + "reserves": [ + "24169792003493987864492026", + "164185223188270322647078856", + "115316616362354240643716998" + ], + "mAssetSupply": "302626601531851193139446494" + }, + { + "type": "mintMulti", + "inputQtys": [ + "2519686403718907", + "540193667629018", + "5336768562812330" + ], + "expectedQty": "8498489875477708", + "reserves": [ + "24169792006013674268210933", + "164185223188810516314707874", + "115316616367691009206529328" + ], + "mAssetSupply": "302626601540349683014924202" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "2405819032676882771345408", + "expectedQty": "2525568943587590388176162", + "reserves": [ + "26575611038690557039556341", + "164185223188810516314707874", + "115316616367691009206529328" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "816371064190745175916544", + "2154755442905511295451136", + "1912912035901752167366656" + ], + "expectedQty": "4890778370846523456782452", + "reserves": [ + "27391982102881302215472885", + "166339978631716027610159010", + "117229528403592761373895984" + ], + "mAssetSupply": "310042948854783796859882816" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "2714022111030409963765760", + "expectedQty": "2700396214091207900190738", + "reserves": [ + "27391982102881302215472885", + "166339978631716027610159010", + "119943550514623171337661744" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "1245538995414422337355776", + "4988586008599949912047616", + "3730787861559956373241856" + ], + "expectedQty": "9955465913847026313345618", + "swapFee": "5976865667708841092662", + "reserves": [ + "26146443107466879878117109", + "161351392623116077698111394", + "116212762653063214964419888" + ], + "mAssetSupply": "302787879155027978446727936" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "3433445746985603946250240", + "expectedQty": "3414942071420345194786421", + "reserves": [ + "26146443107466879878117109", + "161351392623116077698111394", + "119646208400048818910670128" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "7389552999563733762048", + "6361733125473585594368", + "1775312715330183495680" + ], + "expectedQty": "15804285558042796550136", + "swapFee": "9488264293401718961", + "reserves": [ + "26139053554467316144355061", + "161345030889990604112517026", + "119644433087333488727174448" + ], + "mAssetSupply": "306187016940890280844964221" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "5780050754495892684800", + "expectedQty": "6051395781898059186129", + "reserves": [ + "26144833605221812037039861", + "161345030889990604112517026", + "119644433087333488727174448" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "2629227948272089", + "745872862157131", + "3526871633077522" + ], + "expectedQty": "6998878644680903", + "reserves": [ + "26144833607851039985311950", + "161345030890736476974674157", + "119644433090860360360251970" + ], + "mAssetSupply": "306193068343671057548831253" + }, + { + "type": "mintMulti", + "inputQtys": [ + "22441523644353245184", + "10414148877330526208", + "15302595724505092096" + ], + "expectedQty": "49029612666178007811", + "reserves": [ + "26144856049374684338557134", + "161345041304885354305200365", + "119644448393456084865344066" + ], + "mAssetSupply": "306193117373283723726839064" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "428202213506446880931840", + "outputIndex": 2, + "expectedQty": "426295154036032663276351", + "swapFee": "254519799367984019295", + "reserves": [ + "26144856049374684338557134", + "161773243518391801186132205", + "119218153239420052202067715" + ], + "mAssetSupply": "306193371893083091710858359", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "62703579503591151370240", + "outputIndex": 1, + "expectedQty": "62910822026968281580874", + "swapFee": "37415342996888637870", + "reserves": [ + "26144856049374684338557134", + "161710332696364832904551331", + "119280856818923643353437955" + ], + "mAssetSupply": "306193409308426088599496229", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "556613988178295835852800", + "expectedQty": "553538757954275751633546", + "reserves": [ + "26144856049374684338557134", + "161710332696364832904551331", + "119837470807101939189290755" + ] + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "30705932487422120", + "expectedQty": "30535547436729649", + "reserves": [ + "26144856049374684338557134", + "161710332696364832904551331", + "119837470837807871676712875" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "41481051238923583488", + "152357157205190672384", + "59143982982272294912" + ], + "expectedQty": "253183453073912668678", + "swapFee": "152001272607912348", + "reserves": [ + "26144814568323445414973646", + "161710180339207627713878947", + "119837411693824889404417963" + ], + "mAssetSupply": "306746694913462837875190746" + }, + { + "type": "redeemMasset", + "inputQty": "810955847423315", + "expectedQtys": [ + "69099129406702", + "427390014507064", + "316722874310559" + ], + "redemptionFee": "243286754226", + "reserves": [ + "26144814568254346285566944", + "161710180338780237699371883", + "119837411693508166530107404" + ], + "mAssetSupply": "306746694912652125314521657" + }, + { + "type": "redeemMasset", + "inputQty": "43210142749908864", + "expectedQtys": [ + "3681807406710170", + "22772612831405969", + "16875938011427786" + ], + "redemptionFee": "12963042824972", + "reserves": [ + "26144814564572538878856774", + "161710180316007624867965914", + "119837411676632228518679618" + ], + "mAssetSupply": "306746694869454945607437765" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "3323011600467863514644480", + "expectedQty": "3351960722755096349429738", + "swapFee": "1993806960280718108786", + "reserves": [ + "26144814564572538878856774", + "158358219593252528518536176", + "119837411676632228518679618" + ], + "mAssetSupply": "303425677075947362810902071" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "11311361112372647297024", + "outputIndex": 2, + "expectedQty": "11889882709487407746517", + "swapFee": "7098183077040738019", + "reserves": [ + "26156125925684911526153798", + "158358219593252528518536176", + "119825521793922741110933101" + ], + "mAssetSupply": "303425684174130439851640090", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mintMulti", + "inputQtys": [ + "15028778485295469297664", + "10534888317630258610176", + "14265427009330929991680" + ], + "expectedQty": "40342058463266636747310", + "reserves": [ + "26171154704170206995451462", + "158368754481570158777146352", + "119839787220932072040924781" + ], + "mAssetSupply": "303466026232593706488387400" + }, + { + "type": "redeemMasset", + "inputQty": "1029012448515139015226163", + "expectedQtys": [ + "88716240113076322593252", + "536846027919320315364293", + "406238679888972792686329" + ], + "redemptionFee": "308703734554541704567", + "reserves": [ + "26082438464057130672858210", + "157831908453650838461782059", + "119433548541043099248238452" + ], + "mAssetSupply": "302437322487813122014865804" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "727470398841925819957248", + "1566603168588647253409792", + "2157654816696786967592960" + ], + "expectedQty": "4459010706091027560070538", + "swapFee": "2677012631233356549972", + "reserves": [ + "25354968065215204852900962", + "156265305285062191208372267", + "117275893724346312280645492" + ], + "mAssetSupply": "297978311781722094454795266" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "123959988618594499952640", + "expectedQty": "123258525246536392303623", + "reserves": [ + "25354968065215204852900962", + "156265305285062191208372267", + "117399853712964906780598132" + ] + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "6052403170994065244160", + "expectedQty": "6338321827519501762218", + "reserves": [ + "25361020468386198918145122", + "156265305285062191208372267", + "117399853712964906780598132" + ] + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "31060384238167826366464", + "outputIndex": 0, + "expectedQty": "29472117784086575881479", + "swapFee": "18530677834806305054", + "reserves": [ + "25331548350602112342263643", + "156265305285062191208372267", + "117430914097203074606964596" + ], + "mAssetSupply": "298107927159473985155166161", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "2238446660632739", + "expectedQty": "2225746258618836", + "reserves": [ + "25331548350602112342263643", + "156265305285062191208372267", + "117430914099441521267597335" + ] + }, + { + "type": "redeemMasset", + "inputQty": "20068832535718595972300", + "expectedQtys": [ + "1704825813177745266097", + "10516732829232781995159", + "7903158972002899848631" + ], + "redemptionFee": "6020649760715578791", + "reserves": [ + "25329843524788934596997546", + "156254788552232958426377108", + "117423010940469518367748704" + ], + "mAssetSupply": "298087864349813773533391488" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "257441489322992327458816", + "outputIndex": 2, + "expectedQty": "256342564537071488298434", + "swapFee": "153027186619952507265", + "reserves": [ + "25329843524788934596997546", + "156512230041555950753835924", + "117166668375932446879450270" + ], + "mAssetSupply": "298088017377000393485898753", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemBassets", + "inputQtys": [ + "1628536812237642679713792", + "843199504699718516080640", + "874220667074538194862080" + ], + "expectedQty": "3414583625563024002471763", + "swapFee": "2049980163435875927039", + "reserves": [ + "23701306712551291917283754", + "155669030536856232237755284", + "116292447708857908684588190" + ], + "mAssetSupply": "294673433751437369483426990" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "25999567224853488", + "outputIndex": 0, + "expectedQty": "24422813075838328", + "swapFee": "15444783685580", + "reserves": [ + "23701306688128478841445426", + "155669030562855799462608772", + "116292447708857908684588190" + ], + "mAssetSupply": "294673433751452814267112570", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemBassets", + "inputQtys": [ + "135098768962114306048", + "146342116768139182080", + "43634121916018065408" + ], + "expectedQty": "330563905852073573641", + "swapFee": "198457417962021356", + "reserves": [ + "23701171589359516727139378", + "155668884220739031323426692", + "116292404074735992666522782" + ], + "mAssetSupply": "294673103187546962193538929" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "19138487437925924", + "38977379099837648", + "28081224964832076" + ], + "expectedQty": "86660170197556587", + "swapFee": "52027318509639", + "reserves": [ + "23701171570221029289213454", + "155668884181761652223589044", + "116292404046654767701690706" + ], + "mAssetSupply": "294673103100886791995982342" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "23936105581437591552", + "outputIndex": 1, + "expectedQty": "24014733505530616900", + "swapFee": "14274276907957297", + "reserves": [ + "23701171570221029289213454", + "155668860167028146692972144", + "116292427982760349139282258" + ], + "mAssetSupply": "294673103115161068903939639", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemMasset", + "inputQty": "86251636166569059942", + "expectedQtys": [ + "6935317563576059065", + "45551038556031505232", + "34028905107504794682" + ], + "redemptionFee": "25875490849970717", + "reserves": [ + "23701164634903465713154389", + "155668814615989590661466912", + "116292393953855241634487576" + ], + "mAssetSupply": "294673016889400393184850414" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "1854109591069742373797888", + "outputIndex": 0, + "expectedQty": "1740328528792326487307517", + "swapFee": "1105601638895334685078", + "reserves": [ + "21960836106111139225846872", + "155668814615989590661466912", + "118146503544924984008285464" + ], + "mAssetSupply": "294674122491039288519535492", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemMasset", + "inputQty": "411905530005191812710", + "expectedQtys": [ + "30688395785310798682", + "217533894032216883465", + "165099663961716657156" + ], + "redemptionFee": "123571659001557543", + "reserves": [ + "21960805417715353915048190", + "155668597082095558444583447", + "118146338445261022291628308" + ], + "mAssetSupply": "294673710709080942329280325" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "51237834460109241057280", + "expectedQty": "51761119678896375780875", + "swapFee": "30742700676065544634", + "reserves": [ + "21960805417715353915048190", + "155616835962416662068802572", + "118146338445261022291628308" + ], + "mAssetSupply": "294622503617321509153767679" + }, + { + "type": "mintMulti", + "inputQtys": [ + "1336014614420646973669376", + "1639639616636668191178752", + "1285083388199520367017984" + ], + "expectedQty": "4314875403749827406742187", + "reserves": [ + "23296820032136000888717566", + "157256475579053330259981324", + "119431421833460542658646292" + ], + "mAssetSupply": "298937379021071336560509866" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "6895680762887489", + "outputIndex": 1, + "expectedQty": "7359129027844623", + "swapFee": "4373153937944", + "reserves": [ + "23296820039031681651605055", + "157256475571694201232136701", + "119431421833460542658646292" + ], + "mAssetSupply": "298937379021075709714447810", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "38183160941522492325888", + "expectedQty": "40355296625779272049680", + "reserves": [ + "23335003199973204143930943", + "157256475571694201232136701", + "119431421833460542658646292" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "916775220873707913216", + "299379284493222281216", + "290771079290988462080" + ], + "expectedQty": "1554069737240073722365", + "reserves": [ + "23335919975194077851844159", + "157256774950978694454417917", + "119431712604539833647108372" + ], + "mAssetSupply": "298979288387438729060219855" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "738647720772402400985088", + "outputIndex": 0, + "expectedQty": "692700041183764825330064", + "swapFee": "440307505442950911720", + "reserves": [ + "22643219934010313026514095", + "157256774950978694454417917", + "120170360325312236048093460" + ], + "mAssetSupply": "298979728694944172011131575", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "67254789539236", + "expectedQty": "71325790257100", + "reserves": [ + "22643219934077567816053331", + "157256774950978694454417917", + "120170360325312236048093460" + ] + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "7699867802682083162193920", + "outputIndex": 0, + "expectedQty": "6970310500114721287693849", + "swapFee": "4570088366388534076069", + "reserves": [ + "15672909433962846528359482", + "164956642753660777616611837", + "120170360325312236048093460" + ], + "mAssetSupply": "298984298783381886335464744", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mintMulti", + "inputQtys": [ + "20916055089104327540736", + "22485087061517614972928", + "36753529158119731494912" + ], + "expectedQty": "82172531021098776425372", + "reserves": [ + "15693825489051950855900218", + "164979127840722295231584765", + "120207113854470355779588372" + ], + "mAssetSupply": "299066471314402985111890116" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "31820301868020111769600", + "outputIndex": 1, + "expectedQty": "36563723681204629646158", + "swapFee": "21600074534077048773", + "reserves": [ + "15725645790919970967669818", + "164942564117041090601938607", + "120207113854470355779588372" + ], + "mAssetSupply": "299066492914477519188938889", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemBassets", + "inputQtys": [ + "8885823965088731627520", + "7282813262249343320064", + "8871985024437395128320" + ], + "expectedQty": "25998389277610941251486", + "swapFee": "15608398605730002752", + "reserves": [ + "15716759966954882236042298", + "164935281303778841258618543", + "120198241869445918384460052" + ], + "mAssetSupply": "299040494525199908247687403" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "5318260364694597402624", + "expectedQty": "5370059780865009161472", + "swapFee": "3190956218816758441", + "reserves": [ + "15716759966954882236042298", + "164935281303778841258618543", + "120192871809665053375298580" + ], + "mAssetSupply": "299035179455791432467043220" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "13129776336389042864128", + "expectedQty": "14850851244759313619426", + "reserves": [ + "15729889743291271278906426", + "164935281303778841258618543", + "120192871809665053375298580" + ] + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "5189928474133981560832", + "expectedQty": "4585991733215748493500", + "swapFee": "3113957084480388936", + "reserves": [ + "15725303751558055530412926", + "164935281303778841258618543", + "120192871809665053375298580" + ], + "mAssetSupply": "299044843492519142279490750" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "373632649011436068012032", + "expectedQty": "377260143150057392359532", + "swapFee": "224179589406861640807", + "reserves": [ + "15725303751558055530412926", + "164935281303778841258618543", + "119815611666514995982939048" + ], + "mAssetSupply": "298671435023097113073119525" + }, + { + "type": "mintMulti", + "inputQtys": [ + "32525949200629827108864", + "34964394166904751652864", + "99178605798403004694528" + ], + "expectedQty": "169346780271759182485838", + "reserves": [ + "15757829700758685357521790", + "164970245697945746010271407", + "119914790272313398987633576" + ], + "mAssetSupply": "298840781803368872255605363" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "111857441627337652174848", + "81032076011155035783168", + "114835611256769398964224" + ], + "expectedQty": "319926835597820777183505", + "swapFee": "192071344165191581258", + "reserves": [ + "15645972259131347705346942", + "164889213621934590974488239", + "119799954661056629588669352" + ], + "mAssetSupply": "298520854967771051478421858" + }, + { + "type": "mintMulti", + "inputQtys": [ + "48190373329741316882432", + "99457550228761453002752", + "46982125865769193439232" + ], + "expectedQty": "198897210379163972681727", + "reserves": [ + "15694162632461089022229374", + "164988671172163352427490991", + "119846936786922398782108584" + ], + "mAssetSupply": "298719752178150215451103585" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "785513975665684631257088", + "1643147999396510342053888", + "457418854768906065674240" + ], + "expectedQty": "2962001231918457396000710", + "swapFee": "1778267699770936999800", + "reserves": [ + "14908648656795404390972286", + "163345523172766842085437103", + "119389517932153492716434344" + ], + "mAssetSupply": "295757750946231758055102875" + }, + { + "type": "mintMulti", + "inputQtys": [ + "116809821723723759616", + "50069443874440339456", + "74091273508332388352" + ], + "expectedQty": "256029814394488282679", + "reserves": [ + "14908765466617128114731902", + "163345573242210716525776559", + "119389592023427001048822696" + ], + "mAssetSupply": "295758006976046152543385554" + }, + { + "type": "redeemMasset", + "inputQty": "1606661859630408898969", + "expectedQtys": [ + "80965378049336502415", + "887084589254194566455", + "648371823607885603421" + ], + "redemptionFee": "481998557889122669", + "reserves": [ + "14908684501239078778229487", + "163344686157621462331210104", + "119388943651603393163219275" + ], + "mAssetSupply": "295756400796185080023609254" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "72848647814993903616", + "81702634120276426752", + "66802433119569649664" + ], + "expectedQty": "229680134670347364987", + "swapFee": "137890815291383248", + "reserves": [ + "14908611652591263784325871", + "163344604454987342054783352", + "119388876849170273593569611" + ], + "mAssetSupply": "295756171116050409676244267" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "94323225620436058112", + "expectedQty": "82478148213311384738", + "swapFee": "56593935372261634", + "reserves": [ + "14908529174443050472941133", + "163344604454987342054783352", + "119388876849170273593569611" + ], + "mAssetSupply": "295756076849418724612447789" + }, + { + "type": "redeemMasset", + "inputQty": "328880846903189760", + "expectedQtys": [ + "16573315464138652", + "181584757780009969", + "132720639023360778" + ], + "redemptionFee": "98664254070956", + "reserves": [ + "14908529157869735008802481", + "163344604273402584274773383", + "119388876716449634570208833" + ], + "mAssetSupply": "295756076520636541963328985" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "44480040916816788193280", + "hardLimitError": true + }, + { + "type": "redeemBassets", + "inputQtys": [ + "66395300897630638309376", + "83330026972762278461440", + "106476478831342378811392" + ], + "hardLimitError": true + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "5067038673395691317886976", + "hardLimitError": true + }, + { + "type": "mintMulti", + "inputQtys": [ + "948240132011665859280896", + "1014067298020965547507712", + "180878029734470211338240" + ], + "expectedQty": "2253028755371572451547718", + "reserves": [ + "15856769289881400868083377", + "164358671571423549822281095", + "119569754746184104781547073" + ], + "mAssetSupply": "298009105276008114414876703" + } + ] +} \ No newline at end of file diff --git a/test-utils/validator-data/full/mintMultiTestData.json b/test-utils/validator-data/full/mintMultiTestData.json new file mode 100644 index 00000000..f5beae81 --- /dev/null +++ b/test-utils/validator-data/full/mintMultiTestData.json @@ -0,0 +1,5942 @@ +[ + { + "reserve0": "5503000000000000000000000", + "reserve1": "500500000000000000000000", + "reserve2": "3996499999999999360000000", + "A": 120, + "mAssetSupply": "9936488013915504712820075", + "hardMin": 50000000000000000, + "hardMax": 750000000000000000, + "swapFeeRate": 600000000000000, + "mints": [ + { + "bAssetQtys": [ + "3333333333333", + "3333333333333", + "3333333333333" + ], + "expectedQty": "10385912127727" + }, + { + "bAssetQtys": [ + "333333333333333", + "333333333333333", + "333333333333333" + ], + "expectedQty": "1038591212748137" + }, + { + "bAssetQtys": [ + "33333333333333332", + "33333333333333332", + "33333333333333332" + ], + "expectedQty": "103859121028758490" + }, + { + "bAssetQtys": [ + "333333333333333312", + "333333333333333312", + "333333333333333312" + ], + "expectedQty": "1038591187918937221" + }, + { + "bAssetQtys": [ + "3333333333333333504", + "3333333333333333504", + "3333333333333333504" + ], + "expectedQty": "10385909642338954743" + }, + { + "bAssetQtys": [ + "33333333333333336064", + "33333333333333336064", + "33333333333333336064" + ], + "expectedQty": "103858872752693091205" + }, + { + "bAssetQtys": [ + "233066666666666672259072", + "233066666666666672259072", + "233066666666666672259072" + ], + "expectedQty": "717819511157338147988270" + }, + { + "bAssetQtys": [ + "466133333333333344518144", + "466133333333333344518144", + "466133333333333344518144" + ], + "expectedQty": "1426858395787741341108746" + }, + { + "bAssetQtys": [ + "699200000000000050331648", + "699200000000000050331648", + "699200000000000050331648" + ], + "expectedQty": "2132169018987193819175100" + }, + { + "bAssetQtys": [ + "932266666666666689036288", + "932266666666666689036288", + "932266666666666689036288" + ], + "expectedQty": "2835548601135555974061802" + }, + { + "bAssetQtys": [ + "1165333333333333193523200", + "1165333333333333193523200", + "1165333333333333193523200" + ], + "expectedQty": "3537797483589527161733747" + }, + { + "bAssetQtys": [ + "1398400000000000100663296", + "1398400000000000100663296", + "1398400000000000100663296" + ], + "expectedQty": "4239326362763222019077212" + }, + { + "bAssetQtys": [ + "1631466666666666739367936", + "1631466666666666739367936", + "1631466666666666739367936" + ], + "expectedQty": "4940367822219734927726353" + }, + { + "bAssetQtys": [ + "1864533333333333378072576", + "1864533333333333378072576", + "1864533333333333378072576" + ], + "expectedQty": "5641063534359531162361781" + }, + { + "bAssetQtys": [ + "2097600000000000016777216", + "2097600000000000016777216", + "2097600000000000016777216" + ], + "expectedQty": "6341504785730401684633876" + }, + { + "bAssetQtys": [ + "2330666666666666387046400", + "2330666666666666387046400", + "2330666666666666387046400" + ], + "expectedQty": "7041753089676310563468007" + }, + { + "bAssetQtys": [ + "3333333333333", + "3333333333333", + "3333333333333" + ], + "expectedQty": "10385912127727" + }, + { + "bAssetQtys": [ + "333333333333333", + "333333333333333", + "333333333333333" + ], + "expectedQty": "1038591212748137" + }, + { + "bAssetQtys": [ + "33333333333333332", + "33333333333333332", + "33333333333333332" + ], + "expectedQty": "103859121028758490" + }, + { + "bAssetQtys": [ + "333333333333333312", + "333333333333333312", + "333333333333333312" + ], + "expectedQty": "1038591187918937221" + }, + { + "bAssetQtys": [ + "3333333333333333504", + "3333333333333333504", + "3333333333333333504" + ], + "expectedQty": "10385909642338954743" + }, + { + "bAssetQtys": [ + "33333333333333336064", + "33333333333333336064", + "33333333333333336064" + ], + "expectedQty": "103858872752693091205" + }, + { + "bAssetQtys": [ + "233066666666666672259072", + "233066666666666672259072", + "233066666666666672259072" + ], + "expectedQty": "717819511157338147988270" + }, + { + "bAssetQtys": [ + "466133333333333344518144", + "466133333333333344518144", + "466133333333333344518144" + ], + "expectedQty": "1426858395787741341108746" + }, + { + "bAssetQtys": [ + "699200000000000050331648", + "699200000000000050331648", + "699200000000000050331648" + ], + "expectedQty": "2132169018987193819175100" + }, + { + "bAssetQtys": [ + "932266666666666689036288", + "932266666666666689036288", + "932266666666666689036288" + ], + "expectedQty": "2835548601135555974061802" + }, + { + "bAssetQtys": [ + "1165333333333333193523200", + "1165333333333333193523200", + "1165333333333333193523200" + ], + "expectedQty": "3537797483589527161733747" + }, + { + "bAssetQtys": [ + "1398400000000000100663296", + "1398400000000000100663296", + "1398400000000000100663296" + ], + "expectedQty": "4239326362763222019077212" + }, + { + "bAssetQtys": [ + "1631466666666666739367936", + "1631466666666666739367936", + "1631466666666666739367936" + ], + "expectedQty": "4940367822219734927726353" + }, + { + "bAssetQtys": [ + "1864533333333333378072576", + "1864533333333333378072576", + "1864533333333333378072576" + ], + "expectedQty": "5641063534359531162361781" + }, + { + "bAssetQtys": [ + "2097600000000000016777216", + "2097600000000000016777216", + "2097600000000000016777216" + ], + "expectedQty": "6341504785730401684633876" + }, + { + "bAssetQtys": [ + "2330666666666666387046400", + "2330666666666666387046400", + "2330666666666666387046400" + ], + "expectedQty": "7041753089676310563468007" + }, + { + "bAssetQtys": [ + "3333333333333", + "3333333333333", + "3333333333333" + ], + "expectedQty": "10385912127727" + }, + { + "bAssetQtys": [ + "333333333333333", + "333333333333333", + "333333333333333" + ], + "expectedQty": "1038591212748137" + }, + { + "bAssetQtys": [ + "33333333333333332", + "33333333333333332", + "33333333333333332" + ], + "expectedQty": "103859121028758490" + }, + { + "bAssetQtys": [ + "333333333333333312", + "333333333333333312", + "333333333333333312" + ], + "expectedQty": "1038591187918937221" + }, + { + "bAssetQtys": [ + "3333333333333333504", + "3333333333333333504", + "3333333333333333504" + ], + "expectedQty": "10385909642338954743" + }, + { + "bAssetQtys": [ + "33333333333333336064", + "33333333333333336064", + "33333333333333336064" + ], + "expectedQty": "103858872752693091205" + }, + { + "bAssetQtys": [ + "233066666666666672259072", + "233066666666666672259072", + "233066666666666672259072" + ], + "expectedQty": "717819511157338147988270" + }, + { + "bAssetQtys": [ + "466133333333333344518144", + "466133333333333344518144", + "466133333333333344518144" + ], + "expectedQty": "1426858395787741341108746" + }, + { + "bAssetQtys": [ + "699200000000000050331648", + "699200000000000050331648", + "699200000000000050331648" + ], + "expectedQty": "2132169018987193819175100" + }, + { + "bAssetQtys": [ + "932266666666666689036288", + "932266666666666689036288", + "932266666666666689036288" + ], + "expectedQty": "2835548601135555974061802" + }, + { + "bAssetQtys": [ + "1165333333333333193523200", + "1165333333333333193523200", + "1165333333333333193523200" + ], + "expectedQty": "3537797483589527161733747" + }, + { + "bAssetQtys": [ + "1398400000000000100663296", + "1398400000000000100663296", + "1398400000000000100663296" + ], + "expectedQty": "4239326362763222019077212" + }, + { + "bAssetQtys": [ + "1631466666666666739367936", + "1631466666666666739367936", + "1631466666666666739367936" + ], + "expectedQty": "4940367822219734927726353" + }, + { + "bAssetQtys": [ + "1864533333333333378072576", + "1864533333333333378072576", + "1864533333333333378072576" + ], + "expectedQty": "5641063534359531162361781" + }, + { + "bAssetQtys": [ + "2097600000000000016777216", + "2097600000000000016777216", + "2097600000000000016777216" + ], + "expectedQty": "6341504785730401684633876" + }, + { + "bAssetQtys": [ + "2330666666666666387046400", + "2330666666666666387046400", + "2330666666666666387046400" + ], + "expectedQty": "7041753089676310563468007" + } + ] + }, + { + "reserve0": "2007000000000000000000000", + "reserve1": "500500000000000000000000", + "reserve2": "7492500000000000000000000", + "A": 120, + "mAssetSupply": "9896372713490403790662354", + "hardMin": 50000000000000000, + "hardMax": 750000000000000000, + "swapFeeRate": 600000000000000, + "mints": [ + { + "bAssetQtys": [ + "3333333333333", + "3333333333333", + "3333333333333" + ], + "expectedQty": "10616212599789" + }, + { + "bAssetQtys": [ + "333333333333333", + "333333333333333", + "333333333333333" + ], + "expectedQty": "1061621259940193" + }, + { + "bAssetQtys": [ + "33333333333333332", + "33333333333333332", + "33333333333333332" + ], + "expectedQty": "106162125606333410" + }, + { + "bAssetQtys": [ + "333333333333333312", + "333333333333333312", + "333333333333333312" + ], + "expectedQty": "1061621220819182343" + }, + { + "bAssetQtys": [ + "3333333333333333504", + "3333333333333333504", + "3333333333333333504" + ], + "expectedQty": "10616208683798909905" + }, + { + "bAssetQtys": [ + "33333333333333336064", + "33333333333333336064", + "33333333333333336064" + ], + "expectedQty": "106161734420953940818" + }, + { + "bAssetQtys": [ + "233066666666666672259072", + "233066666666666672259072", + "233066666666666672259072" + ], + "expectedQty": "729045507934045981147445" + }, + { + "bAssetQtys": [ + "466133333333333344518144", + "466133333333333344518144", + "466133333333333344518144" + ], + "expectedQty": "1444093165885337491540905" + }, + { + "bAssetQtys": [ + "699200000000000050331648", + "699200000000000050331648", + "699200000000000050331648" + ], + "expectedQty": "2153151422959607051690973" + }, + { + "bAssetQtys": [ + "932266666666666689036288", + "932266666666666689036288", + "932266666666666689036288" + ], + "expectedQty": "2859096981577989191295531" + }, + { + "bAssetQtys": [ + "1165333333333333193523200", + "1165333333333333193523200", + "1165333333333333193523200" + ], + "expectedQty": "3563217561037023690548355" + }, + { + "bAssetQtys": [ + "1398400000000000100663296", + "1398400000000000100663296", + "1398400000000000100663296" + ], + "expectedQty": "4266175833285971337758877" + }, + { + "bAssetQtys": [ + "1631466666666666739367936", + "1631466666666666739367936", + "1631466666666666739367936" + ], + "expectedQty": "4968347620679184766532063" + }, + { + "bAssetQtys": [ + "1864533333333333378072576", + "1864533333333333378072576", + "1864533333333333378072576" + ], + "expectedQty": "5669961970717048793425226" + }, + { + "bAssetQtys": [ + "2097600000000000016777216", + "2097600000000000016777216", + "2097600000000000016777216" + ], + "expectedQty": "6371166461806356373525737" + }, + { + "bAssetQtys": [ + "2330666666666666387046400", + "2330666666666666387046400", + "2330666666666666387046400" + ], + "expectedQty": "7072060493137874105294090" + }, + { + "bAssetQtys": [ + "3333333333333", + "3333333333333", + "3333333333333" + ], + "expectedQty": "10616212599789" + }, + { + "bAssetQtys": [ + "333333333333333", + "333333333333333", + "333333333333333" + ], + "expectedQty": "1061621259940193" + }, + { + "bAssetQtys": [ + "33333333333333332", + "33333333333333332", + "33333333333333332" + ], + "expectedQty": "106162125606333410" + }, + { + "bAssetQtys": [ + "333333333333333312", + "333333333333333312", + "333333333333333312" + ], + "expectedQty": "1061621220819182343" + }, + { + "bAssetQtys": [ + "3333333333333333504", + "3333333333333333504", + "3333333333333333504" + ], + "expectedQty": "10616208683798909905" + }, + { + "bAssetQtys": [ + "33333333333333336064", + "33333333333333336064", + "33333333333333336064" + ], + "expectedQty": "106161734420953940818" + }, + { + "bAssetQtys": [ + "233066666666666672259072", + "233066666666666672259072", + "233066666666666672259072" + ], + "expectedQty": "729045507934045981147445" + }, + { + "bAssetQtys": [ + "466133333333333344518144", + "466133333333333344518144", + "466133333333333344518144" + ], + "expectedQty": "1444093165885337491540905" + }, + { + "bAssetQtys": [ + "699200000000000050331648", + "699200000000000050331648", + "699200000000000050331648" + ], + "expectedQty": "2153151422959607051690973" + }, + { + "bAssetQtys": [ + "932266666666666689036288", + "932266666666666689036288", + "932266666666666689036288" + ], + "expectedQty": "2859096981577989191295531" + }, + { + "bAssetQtys": [ + "1165333333333333193523200", + "1165333333333333193523200", + "1165333333333333193523200" + ], + "expectedQty": "3563217561037023690548355" + }, + { + "bAssetQtys": [ + "1398400000000000100663296", + "1398400000000000100663296", + "1398400000000000100663296" + ], + "expectedQty": "4266175833285971337758877" + }, + { + "bAssetQtys": [ + "1631466666666666739367936", + "1631466666666666739367936", + "1631466666666666739367936" + ], + "expectedQty": "4968347620679184766532063" + }, + { + "bAssetQtys": [ + "1864533333333333378072576", + "1864533333333333378072576", + "1864533333333333378072576" + ], + "expectedQty": "5669961970717048793425226" + }, + { + "bAssetQtys": [ + "2097600000000000016777216", + "2097600000000000016777216", + "2097600000000000016777216" + ], + "expectedQty": "6371166461806356373525737" + }, + { + "bAssetQtys": [ + "2330666666666666387046400", + "2330666666666666387046400", + "2330666666666666387046400" + ], + "expectedQty": "7072060493137874105294090" + }, + { + "bAssetQtys": [ + "3333333333333", + "3333333333333", + "3333333333333" + ], + "expectedQty": "10616212599789" + }, + { + "bAssetQtys": [ + "333333333333333", + "333333333333333", + "333333333333333" + ], + "expectedQty": "1061621259940193" + }, + { + "bAssetQtys": [ + "33333333333333332", + "33333333333333332", + "33333333333333332" + ], + "expectedQty": "106162125606333410" + }, + { + "bAssetQtys": [ + "333333333333333312", + "333333333333333312", + "333333333333333312" + ], + "expectedQty": "1061621220819182343" + }, + { + "bAssetQtys": [ + "3333333333333333504", + "3333333333333333504", + "3333333333333333504" + ], + "expectedQty": "10616208683798909905" + }, + { + "bAssetQtys": [ + "33333333333333336064", + "33333333333333336064", + "33333333333333336064" + ], + "expectedQty": "106161734420953940818" + }, + { + "bAssetQtys": [ + "233066666666666672259072", + "233066666666666672259072", + "233066666666666672259072" + ], + "expectedQty": "729045507934045981147445" + }, + { + "bAssetQtys": [ + "466133333333333344518144", + "466133333333333344518144", + "466133333333333344518144" + ], + "expectedQty": "1444093165885337491540905" + }, + { + "bAssetQtys": [ + "699200000000000050331648", + "699200000000000050331648", + "699200000000000050331648" + ], + "expectedQty": "2153151422959607051690973" + }, + { + "bAssetQtys": [ + "932266666666666689036288", + "932266666666666689036288", + "932266666666666689036288" + ], + "expectedQty": "2859096981577989191295531" + }, + { + "bAssetQtys": [ + "1165333333333333193523200", + "1165333333333333193523200", + "1165333333333333193523200" + ], + "expectedQty": "3563217561037023690548355" + }, + { + "bAssetQtys": [ + "1398400000000000100663296", + "1398400000000000100663296", + "1398400000000000100663296" + ], + "expectedQty": "4266175833285971337758877" + }, + { + "bAssetQtys": [ + "1631466666666666739367936", + "1631466666666666739367936", + "1631466666666666739367936" + ], + "expectedQty": "4968347620679184766532063" + }, + { + "bAssetQtys": [ + "1864533333333333378072576", + "1864533333333333378072576", + "1864533333333333378072576" + ], + "expectedQty": "5669961970717048793425226" + }, + { + "bAssetQtys": [ + "2097600000000000016777216", + "2097600000000000016777216", + "2097600000000000016777216" + ], + "expectedQty": "6371166461806356373525737" + }, + { + "bAssetQtys": [ + "2330666666666666387046400", + "2330666666666666387046400", + "2330666666666666387046400" + ], + "expectedQty": "7072060493137874105294090" + } + ] + }, + { + "reserve0": "5503000000000000000000000", + "reserve1": "3996499999999999360000000", + "reserve2": "500500000000000000000000", + "A": 120, + "mAssetSupply": "9936488013915504712820075", + "hardMin": 50000000000000000, + "hardMax": 750000000000000000, + "swapFeeRate": 600000000000000, + "mints": [ + { + "bAssetQtys": [ + "3333333333333", + "3333333333333", + "3333333333333" + ], + "expectedQty": "10385912127727" + }, + { + "bAssetQtys": [ + "333333333333333", + "333333333333333", + "333333333333333" + ], + "expectedQty": "1038591212748137" + }, + { + "bAssetQtys": [ + "33333333333333332", + "33333333333333332", + "33333333333333332" + ], + "expectedQty": "103859121028758490" + }, + { + "bAssetQtys": [ + "333333333333333312", + "333333333333333312", + "333333333333333312" + ], + "expectedQty": "1038591187918937221" + }, + { + "bAssetQtys": [ + "3333333333333333504", + "3333333333333333504", + "3333333333333333504" + ], + "expectedQty": "10385909642338954743" + }, + { + "bAssetQtys": [ + "33333333333333336064", + "33333333333333336064", + "33333333333333336064" + ], + "expectedQty": "103858872752693091205" + }, + { + "bAssetQtys": [ + "233066666666666672259072", + "233066666666666672259072", + "233066666666666672259072" + ], + "expectedQty": "717819511157338147988270" + }, + { + "bAssetQtys": [ + "466133333333333344518144", + "466133333333333344518144", + "466133333333333344518144" + ], + "expectedQty": "1426858395787741341108746" + }, + { + "bAssetQtys": [ + "699200000000000050331648", + "699200000000000050331648", + "699200000000000050331648" + ], + "expectedQty": "2132169018987193819175100" + }, + { + "bAssetQtys": [ + "932266666666666689036288", + "932266666666666689036288", + "932266666666666689036288" + ], + "expectedQty": "2835548601135555974061802" + }, + { + "bAssetQtys": [ + "1165333333333333193523200", + "1165333333333333193523200", + "1165333333333333193523200" + ], + "expectedQty": "3537797483589527161733747" + }, + { + "bAssetQtys": [ + "1398400000000000100663296", + "1398400000000000100663296", + "1398400000000000100663296" + ], + "expectedQty": "4239326362763222019077212" + }, + { + "bAssetQtys": [ + "1631466666666666739367936", + "1631466666666666739367936", + "1631466666666666739367936" + ], + "expectedQty": "4940367822219734927726353" + }, + { + "bAssetQtys": [ + "1864533333333333378072576", + "1864533333333333378072576", + "1864533333333333378072576" + ], + "expectedQty": "5641063534359531162361781" + }, + { + "bAssetQtys": [ + "2097600000000000016777216", + "2097600000000000016777216", + "2097600000000000016777216" + ], + "expectedQty": "6341504785730401684633876" + }, + { + "bAssetQtys": [ + "2330666666666666387046400", + "2330666666666666387046400", + "2330666666666666387046400" + ], + "expectedQty": "7041753089676310563468007" + }, + { + "bAssetQtys": [ + "3333333333333", + "3333333333333", + "3333333333333" + ], + "expectedQty": "10385912127727" + }, + { + "bAssetQtys": [ + "333333333333333", + "333333333333333", + "333333333333333" + ], + "expectedQty": "1038591212748137" + }, + { + "bAssetQtys": [ + "33333333333333332", + "33333333333333332", + "33333333333333332" + ], + "expectedQty": "103859121028758490" + }, + { + "bAssetQtys": [ + "333333333333333312", + "333333333333333312", + "333333333333333312" + ], + "expectedQty": "1038591187918937221" + }, + { + "bAssetQtys": [ + "3333333333333333504", + "3333333333333333504", + "3333333333333333504" + ], + "expectedQty": "10385909642338954743" + }, + { + "bAssetQtys": [ + "33333333333333336064", + "33333333333333336064", + "33333333333333336064" + ], + "expectedQty": "103858872752693091205" + }, + { + "bAssetQtys": [ + "233066666666666672259072", + "233066666666666672259072", + "233066666666666672259072" + ], + "expectedQty": "717819511157338147988270" + }, + { + "bAssetQtys": [ + "466133333333333344518144", + "466133333333333344518144", + "466133333333333344518144" + ], + "expectedQty": "1426858395787741341108746" + }, + { + "bAssetQtys": [ + "699200000000000050331648", + "699200000000000050331648", + "699200000000000050331648" + ], + "expectedQty": "2132169018987193819175100" + }, + { + "bAssetQtys": [ + "932266666666666689036288", + "932266666666666689036288", + "932266666666666689036288" + ], + "expectedQty": "2835548601135555974061802" + }, + { + "bAssetQtys": [ + "1165333333333333193523200", + "1165333333333333193523200", + "1165333333333333193523200" + ], + "expectedQty": "3537797483589527161733747" + }, + { + "bAssetQtys": [ + "1398400000000000100663296", + "1398400000000000100663296", + "1398400000000000100663296" + ], + "expectedQty": "4239326362763222019077212" + }, + { + "bAssetQtys": [ + "1631466666666666739367936", + "1631466666666666739367936", + "1631466666666666739367936" + ], + "expectedQty": "4940367822219734927726353" + }, + { + "bAssetQtys": [ + "1864533333333333378072576", + "1864533333333333378072576", + "1864533333333333378072576" + ], + "expectedQty": "5641063534359531162361781" + }, + { + "bAssetQtys": [ + "2097600000000000016777216", + "2097600000000000016777216", + "2097600000000000016777216" + ], + "expectedQty": "6341504785730401684633876" + }, + { + "bAssetQtys": [ + "2330666666666666387046400", + "2330666666666666387046400", + "2330666666666666387046400" + ], + "expectedQty": "7041753089676310563468007" + }, + { + "bAssetQtys": [ + "3333333333333", + "3333333333333", + "3333333333333" + ], + "expectedQty": "10385912127727" + }, + { + "bAssetQtys": [ + "333333333333333", + "333333333333333", + "333333333333333" + ], + "expectedQty": "1038591212748137" + }, + { + "bAssetQtys": [ + "33333333333333332", + "33333333333333332", + "33333333333333332" + ], + "expectedQty": "103859121028758490" + }, + { + "bAssetQtys": [ + "333333333333333312", + "333333333333333312", + "333333333333333312" + ], + "expectedQty": "1038591187918937221" + }, + { + "bAssetQtys": [ + "3333333333333333504", + "3333333333333333504", + "3333333333333333504" + ], + "expectedQty": "10385909642338954743" + }, + { + "bAssetQtys": [ + "33333333333333336064", + "33333333333333336064", + "33333333333333336064" + ], + "expectedQty": "103858872752693091205" + }, + { + "bAssetQtys": [ + "233066666666666672259072", + "233066666666666672259072", + "233066666666666672259072" + ], + "expectedQty": "717819511157338147988270" + }, + { + "bAssetQtys": [ + "466133333333333344518144", + "466133333333333344518144", + "466133333333333344518144" + ], + "expectedQty": "1426858395787741341108746" + }, + { + "bAssetQtys": [ + "699200000000000050331648", + "699200000000000050331648", + "699200000000000050331648" + ], + "expectedQty": "2132169018987193819175100" + }, + { + "bAssetQtys": [ + "932266666666666689036288", + "932266666666666689036288", + "932266666666666689036288" + ], + "expectedQty": "2835548601135555974061802" + }, + { + "bAssetQtys": [ + "1165333333333333193523200", + "1165333333333333193523200", + "1165333333333333193523200" + ], + "expectedQty": "3537797483589527161733747" + }, + { + "bAssetQtys": [ + "1398400000000000100663296", + "1398400000000000100663296", + "1398400000000000100663296" + ], + "expectedQty": "4239326362763222019077212" + }, + { + "bAssetQtys": [ + "1631466666666666739367936", + "1631466666666666739367936", + "1631466666666666739367936" + ], + "expectedQty": "4940367822219734927726353" + }, + { + "bAssetQtys": [ + "1864533333333333378072576", + "1864533333333333378072576", + "1864533333333333378072576" + ], + "expectedQty": "5641063534359531162361781" + }, + { + "bAssetQtys": [ + "2097600000000000016777216", + "2097600000000000016777216", + "2097600000000000016777216" + ], + "expectedQty": "6341504785730401684633876" + }, + { + "bAssetQtys": [ + "2330666666666666387046400", + "2330666666666666387046400", + "2330666666666666387046400" + ], + "expectedQty": "7041753089676310563468007" + } + ] + }, + { + "reserve0": "2007000000000000960000000", + "reserve1": "3996499999999999360000000", + "reserve2": "3996499999999999360000000", + "A": 120, + "mAssetSupply": "9995726520619110731126433", + "hardMin": 50000000000000000, + "hardMax": 750000000000000000, + "swapFeeRate": 600000000000000, + "mints": [ + { + "bAssetQtys": [ + "3333333333333", + "3333333333333", + "3333333333333" + ], + "expectedQty": "10006162027981" + }, + { + "bAssetQtys": [ + "333333333333333", + "333333333333333", + "333333333333333" + ], + "expectedQty": "1000616202798095" + }, + { + "bAssetQtys": [ + "33333333333333332", + "33333333333333332", + "33333333333333332" + ], + "expectedQty": "100061620278871720" + }, + { + "bAssetQtys": [ + "333333333333333312", + "333333333333333312", + "333333333333333312" + ], + "expectedQty": "1000616202703457733" + }, + { + "bAssetQtys": [ + "3333333333333333504", + "3333333333333333504", + "3333333333333333504" + ], + "expectedQty": "10006162018508647736" + }, + { + "bAssetQtys": [ + "33333333333333336064", + "33333333333333336064", + "33333333333333336064" + ], + "expectedQty": "100061619332506863358" + }, + { + "bAssetQtys": [ + "233066666666666672259072", + "233066666666666672259072", + "233066666666666672259072" + ], + "expectedQty": "699589172569064088513914" + }, + { + "bAssetQtys": [ + "466133333333333344518144", + "466133333333333344518144", + "466133333333333344518144" + ], + "expectedQty": "1399110113009977714491450" + }, + { + "bAssetQtys": [ + "699200000000000050331648", + "699200000000000050331648", + "699200000000000050331648" + ], + "expectedQty": "2098579763704496996113493" + }, + { + "bAssetQtys": [ + "932266666666666689036288", + "932266666666666689036288", + "932266666666666689036288" + ], + "expectedQty": "2798009813075099253271636" + }, + { + "bAssetQtys": [ + "1165333333333333193523200", + "1165333333333333193523200", + "1165333333333333193523200" + ], + "expectedQty": "3497408599942144636779437" + }, + { + "bAssetQtys": [ + "1398400000000000100663296", + "1398400000000000100663296", + "1398400000000000100663296" + ], + "expectedQty": "4196782242397675221053972" + }, + { + "bAssetQtys": [ + "1631466666666666739367936", + "1631466666666666739367936", + "1631466666666666739367936" + ], + "expectedQty": "4896135336985582089078779" + }, + { + "bAssetQtys": [ + "1864533333333333378072576", + "1864533333333333378072576", + "1864533333333333378072576" + ], + "expectedQty": "5595471408100876355649496" + }, + { + "bAssetQtys": [ + "2097600000000000016777216", + "2097600000000000016777216", + "2097600000000000016777216" + ], + "expectedQty": "6294793206161822055345982" + }, + { + "bAssetQtys": [ + "2330666666666666387046400", + "2330666666666666387046400", + "2330666666666666387046400" + ], + "expectedQty": "6994102910962511597493255" + }, + { + "bAssetQtys": [ + "3333333333333", + "3333333333333", + "3333333333333" + ], + "expectedQty": "10006162027981" + }, + { + "bAssetQtys": [ + "333333333333333", + "333333333333333", + "333333333333333" + ], + "expectedQty": "1000616202798095" + }, + { + "bAssetQtys": [ + "33333333333333332", + "33333333333333332", + "33333333333333332" + ], + "expectedQty": "100061620278871720" + }, + { + "bAssetQtys": [ + "333333333333333312", + "333333333333333312", + "333333333333333312" + ], + "expectedQty": "1000616202703457733" + }, + { + "bAssetQtys": [ + "3333333333333333504", + "3333333333333333504", + "3333333333333333504" + ], + "expectedQty": "10006162018508647736" + }, + { + "bAssetQtys": [ + "33333333333333336064", + "33333333333333336064", + "33333333333333336064" + ], + "expectedQty": "100061619332506863358" + }, + { + "bAssetQtys": [ + "233066666666666672259072", + "233066666666666672259072", + "233066666666666672259072" + ], + "expectedQty": "699589172569064088513914" + }, + { + "bAssetQtys": [ + "466133333333333344518144", + "466133333333333344518144", + "466133333333333344518144" + ], + "expectedQty": "1399110113009977714491450" + }, + { + "bAssetQtys": [ + "699200000000000050331648", + "699200000000000050331648", + "699200000000000050331648" + ], + "expectedQty": "2098579763704496996113493" + }, + { + "bAssetQtys": [ + "932266666666666689036288", + "932266666666666689036288", + "932266666666666689036288" + ], + "expectedQty": "2798009813075099253271636" + }, + { + "bAssetQtys": [ + "1165333333333333193523200", + "1165333333333333193523200", + "1165333333333333193523200" + ], + "expectedQty": "3497408599942144636779437" + }, + { + "bAssetQtys": [ + "1398400000000000100663296", + "1398400000000000100663296", + "1398400000000000100663296" + ], + "expectedQty": "4196782242397675221053972" + }, + { + "bAssetQtys": [ + "1631466666666666739367936", + "1631466666666666739367936", + "1631466666666666739367936" + ], + "expectedQty": "4896135336985582089078779" + }, + { + "bAssetQtys": [ + "1864533333333333378072576", + "1864533333333333378072576", + "1864533333333333378072576" + ], + "expectedQty": "5595471408100876355649496" + }, + { + "bAssetQtys": [ + "2097600000000000016777216", + "2097600000000000016777216", + "2097600000000000016777216" + ], + "expectedQty": "6294793206161822055345982" + }, + { + "bAssetQtys": [ + "2330666666666666387046400", + "2330666666666666387046400", + "2330666666666666387046400" + ], + "expectedQty": "6994102910962511597493255" + }, + { + "bAssetQtys": [ + "3333333333333", + "3333333333333", + "3333333333333" + ], + "expectedQty": "10006162027981" + }, + { + "bAssetQtys": [ + "333333333333333", + "333333333333333", + "333333333333333" + ], + "expectedQty": "1000616202798095" + }, + { + "bAssetQtys": [ + "33333333333333332", + "33333333333333332", + "33333333333333332" + ], + "expectedQty": "100061620278871720" + }, + { + "bAssetQtys": [ + "333333333333333312", + "333333333333333312", + "333333333333333312" + ], + "expectedQty": "1000616202703457733" + }, + { + "bAssetQtys": [ + "3333333333333333504", + "3333333333333333504", + "3333333333333333504" + ], + "expectedQty": "10006162018508647736" + }, + { + "bAssetQtys": [ + "33333333333333336064", + "33333333333333336064", + "33333333333333336064" + ], + "expectedQty": "100061619332506863358" + }, + { + "bAssetQtys": [ + "233066666666666672259072", + "233066666666666672259072", + "233066666666666672259072" + ], + "expectedQty": "699589172569064088513914" + }, + { + "bAssetQtys": [ + "466133333333333344518144", + "466133333333333344518144", + "466133333333333344518144" + ], + "expectedQty": "1399110113009977714491450" + }, + { + "bAssetQtys": [ + "699200000000000050331648", + "699200000000000050331648", + "699200000000000050331648" + ], + "expectedQty": "2098579763704496996113493" + }, + { + "bAssetQtys": [ + "932266666666666689036288", + "932266666666666689036288", + "932266666666666689036288" + ], + "expectedQty": "2798009813075099253271636" + }, + { + "bAssetQtys": [ + "1165333333333333193523200", + "1165333333333333193523200", + "1165333333333333193523200" + ], + "expectedQty": "3497408599942144636779437" + }, + { + "bAssetQtys": [ + "1398400000000000100663296", + "1398400000000000100663296", + "1398400000000000100663296" + ], + "expectedQty": "4196782242397675221053972" + }, + { + "bAssetQtys": [ + "1631466666666666739367936", + "1631466666666666739367936", + "1631466666666666739367936" + ], + "expectedQty": "4896135336985582089078779" + }, + { + "bAssetQtys": [ + "1864533333333333378072576", + "1864533333333333378072576", + "1864533333333333378072576" + ], + "expectedQty": "5595471408100876355649496" + }, + { + "bAssetQtys": [ + "2097600000000000016777216", + "2097600000000000016777216", + "2097600000000000016777216" + ], + "expectedQty": "6294793206161822055345982" + }, + { + "bAssetQtys": [ + "2330666666666666387046400", + "2330666666666666387046400", + "2330666666666666387046400" + ], + "expectedQty": "6994102910962511597493255" + } + ] + }, + { + "reserve0": "2007000000000000000000000", + "reserve1": "7492500000000000000000000", + "reserve2": "500500000000000000000000", + "A": 120, + "mAssetSupply": "9896372713490403790662354", + "hardMin": 50000000000000000, + "hardMax": 750000000000000000, + "swapFeeRate": 600000000000000, + "mints": [ + { + "bAssetQtys": [ + "3333333333333", + "3333333333333", + "3333333333333" + ], + "expectedQty": "10616212599789" + }, + { + "bAssetQtys": [ + "333333333333333", + "333333333333333", + "333333333333333" + ], + "expectedQty": "1061621259940193" + }, + { + "bAssetQtys": [ + "33333333333333332", + "33333333333333332", + "33333333333333332" + ], + "expectedQty": "106162125606333410" + }, + { + "bAssetQtys": [ + "333333333333333312", + "333333333333333312", + "333333333333333312" + ], + "expectedQty": "1061621220819182343" + }, + { + "bAssetQtys": [ + "3333333333333333504", + "3333333333333333504", + "3333333333333333504" + ], + "expectedQty": "10616208683798909905" + }, + { + "bAssetQtys": [ + "33333333333333336064", + "33333333333333336064", + "33333333333333336064" + ], + "expectedQty": "106161734420953940818" + }, + { + "bAssetQtys": [ + "233066666666666672259072", + "233066666666666672259072", + "233066666666666672259072" + ], + "expectedQty": "729045507934045981147445" + }, + { + "bAssetQtys": [ + "466133333333333344518144", + "466133333333333344518144", + "466133333333333344518144" + ], + "expectedQty": "1444093165885337491540905" + }, + { + "bAssetQtys": [ + "699200000000000050331648", + "699200000000000050331648", + "699200000000000050331648" + ], + "expectedQty": "2153151422959607051690973" + }, + { + "bAssetQtys": [ + "932266666666666689036288", + "932266666666666689036288", + "932266666666666689036288" + ], + "expectedQty": "2859096981577989191295531" + }, + { + "bAssetQtys": [ + "1165333333333333193523200", + "1165333333333333193523200", + "1165333333333333193523200" + ], + "expectedQty": "3563217561037023690548355" + }, + { + "bAssetQtys": [ + "1398400000000000100663296", + "1398400000000000100663296", + "1398400000000000100663296" + ], + "expectedQty": "4266175833285971337758877" + }, + { + "bAssetQtys": [ + "1631466666666666739367936", + "1631466666666666739367936", + "1631466666666666739367936" + ], + "expectedQty": "4968347620679184766532063" + }, + { + "bAssetQtys": [ + "1864533333333333378072576", + "1864533333333333378072576", + "1864533333333333378072576" + ], + "expectedQty": "5669961970717048793425226" + }, + { + "bAssetQtys": [ + "2097600000000000016777216", + "2097600000000000016777216", + "2097600000000000016777216" + ], + "expectedQty": "6371166461806356373525737" + }, + { + "bAssetQtys": [ + "2330666666666666387046400", + "2330666666666666387046400", + "2330666666666666387046400" + ], + "expectedQty": "7072060493137874105294090" + }, + { + "bAssetQtys": [ + "3333333333333", + "3333333333333", + "3333333333333" + ], + "expectedQty": "10616212599789" + }, + { + "bAssetQtys": [ + "333333333333333", + "333333333333333", + "333333333333333" + ], + "expectedQty": "1061621259940193" + }, + { + "bAssetQtys": [ + "33333333333333332", + "33333333333333332", + "33333333333333332" + ], + "expectedQty": "106162125606333410" + }, + { + "bAssetQtys": [ + "333333333333333312", + "333333333333333312", + "333333333333333312" + ], + "expectedQty": "1061621220819182343" + }, + { + "bAssetQtys": [ + "3333333333333333504", + "3333333333333333504", + "3333333333333333504" + ], + "expectedQty": "10616208683798909905" + }, + { + "bAssetQtys": [ + "33333333333333336064", + "33333333333333336064", + "33333333333333336064" + ], + "expectedQty": "106161734420953940818" + }, + { + "bAssetQtys": [ + "233066666666666672259072", + "233066666666666672259072", + "233066666666666672259072" + ], + "expectedQty": "729045507934045981147445" + }, + { + "bAssetQtys": [ + "466133333333333344518144", + "466133333333333344518144", + "466133333333333344518144" + ], + "expectedQty": "1444093165885337491540905" + }, + { + "bAssetQtys": [ + "699200000000000050331648", + "699200000000000050331648", + "699200000000000050331648" + ], + "expectedQty": "2153151422959607051690973" + }, + { + "bAssetQtys": [ + "932266666666666689036288", + "932266666666666689036288", + "932266666666666689036288" + ], + "expectedQty": "2859096981577989191295531" + }, + { + "bAssetQtys": [ + "1165333333333333193523200", + "1165333333333333193523200", + "1165333333333333193523200" + ], + "expectedQty": "3563217561037023690548355" + }, + { + "bAssetQtys": [ + "1398400000000000100663296", + "1398400000000000100663296", + "1398400000000000100663296" + ], + "expectedQty": "4266175833285971337758877" + }, + { + "bAssetQtys": [ + "1631466666666666739367936", + "1631466666666666739367936", + "1631466666666666739367936" + ], + "expectedQty": "4968347620679184766532063" + }, + { + "bAssetQtys": [ + "1864533333333333378072576", + "1864533333333333378072576", + "1864533333333333378072576" + ], + "expectedQty": "5669961970717048793425226" + }, + { + "bAssetQtys": [ + "2097600000000000016777216", + "2097600000000000016777216", + "2097600000000000016777216" + ], + "expectedQty": "6371166461806356373525737" + }, + { + "bAssetQtys": [ + "2330666666666666387046400", + "2330666666666666387046400", + "2330666666666666387046400" + ], + "expectedQty": "7072060493137874105294090" + }, + { + "bAssetQtys": [ + "3333333333333", + "3333333333333", + "3333333333333" + ], + "expectedQty": "10616212599789" + }, + { + "bAssetQtys": [ + "333333333333333", + "333333333333333", + "333333333333333" + ], + "expectedQty": "1061621259940193" + }, + { + "bAssetQtys": [ + "33333333333333332", + "33333333333333332", + "33333333333333332" + ], + "expectedQty": "106162125606333410" + }, + { + "bAssetQtys": [ + "333333333333333312", + "333333333333333312", + "333333333333333312" + ], + "expectedQty": "1061621220819182343" + }, + { + "bAssetQtys": [ + "3333333333333333504", + "3333333333333333504", + "3333333333333333504" + ], + "expectedQty": "10616208683798909905" + }, + { + "bAssetQtys": [ + "33333333333333336064", + "33333333333333336064", + "33333333333333336064" + ], + "expectedQty": "106161734420953940818" + }, + { + "bAssetQtys": [ + "233066666666666672259072", + "233066666666666672259072", + "233066666666666672259072" + ], + "expectedQty": "729045507934045981147445" + }, + { + "bAssetQtys": [ + "466133333333333344518144", + "466133333333333344518144", + "466133333333333344518144" + ], + "expectedQty": "1444093165885337491540905" + }, + { + "bAssetQtys": [ + "699200000000000050331648", + "699200000000000050331648", + "699200000000000050331648" + ], + "expectedQty": "2153151422959607051690973" + }, + { + "bAssetQtys": [ + "932266666666666689036288", + "932266666666666689036288", + "932266666666666689036288" + ], + "expectedQty": "2859096981577989191295531" + }, + { + "bAssetQtys": [ + "1165333333333333193523200", + "1165333333333333193523200", + "1165333333333333193523200" + ], + "expectedQty": "3563217561037023690548355" + }, + { + "bAssetQtys": [ + "1398400000000000100663296", + "1398400000000000100663296", + "1398400000000000100663296" + ], + "expectedQty": "4266175833285971337758877" + }, + { + "bAssetQtys": [ + "1631466666666666739367936", + "1631466666666666739367936", + "1631466666666666739367936" + ], + "expectedQty": "4968347620679184766532063" + }, + { + "bAssetQtys": [ + "1864533333333333378072576", + "1864533333333333378072576", + "1864533333333333378072576" + ], + "expectedQty": "5669961970717048793425226" + }, + { + "bAssetQtys": [ + "2097600000000000016777216", + "2097600000000000016777216", + "2097600000000000016777216" + ], + "expectedQty": "6371166461806356373525737" + }, + { + "bAssetQtys": [ + "2330666666666666387046400", + "2330666666666666387046400", + "2330666666666666387046400" + ], + "expectedQty": "7072060493137874105294090" + } + ] + }, + { + "reserve0": "500500000000000000000000", + "reserve1": "5503000000000000000000000", + "reserve2": "3996499999999999360000000", + "A": 120, + "mAssetSupply": "9936488013915504712820075", + "hardMin": 50000000000000000, + "hardMax": 750000000000000000, + "swapFeeRate": 600000000000000, + "mints": [ + { + "bAssetQtys": [ + "3333333333333", + "3333333333333", + "3333333333333" + ], + "expectedQty": "10385912127727" + }, + { + "bAssetQtys": [ + "333333333333333", + "333333333333333", + "333333333333333" + ], + "expectedQty": "1038591212748137" + }, + { + "bAssetQtys": [ + "33333333333333332", + "33333333333333332", + "33333333333333332" + ], + "expectedQty": "103859121028758490" + }, + { + "bAssetQtys": [ + "333333333333333312", + "333333333333333312", + "333333333333333312" + ], + "expectedQty": "1038591187918937221" + }, + { + "bAssetQtys": [ + "3333333333333333504", + "3333333333333333504", + "3333333333333333504" + ], + "expectedQty": "10385909642338954743" + }, + { + "bAssetQtys": [ + "33333333333333336064", + "33333333333333336064", + "33333333333333336064" + ], + "expectedQty": "103858872752693091205" + }, + { + "bAssetQtys": [ + "233066666666666672259072", + "233066666666666672259072", + "233066666666666672259072" + ], + "expectedQty": "717819511157338147988270" + }, + { + "bAssetQtys": [ + "466133333333333344518144", + "466133333333333344518144", + "466133333333333344518144" + ], + "expectedQty": "1426858395787741341108746" + }, + { + "bAssetQtys": [ + "699200000000000050331648", + "699200000000000050331648", + "699200000000000050331648" + ], + "expectedQty": "2132169018987193819175100" + }, + { + "bAssetQtys": [ + "932266666666666689036288", + "932266666666666689036288", + "932266666666666689036288" + ], + "expectedQty": "2835548601135555974061802" + }, + { + "bAssetQtys": [ + "1165333333333333193523200", + "1165333333333333193523200", + "1165333333333333193523200" + ], + "expectedQty": "3537797483589527161733747" + }, + { + "bAssetQtys": [ + "1398400000000000100663296", + "1398400000000000100663296", + "1398400000000000100663296" + ], + "expectedQty": "4239326362763222019077212" + }, + { + "bAssetQtys": [ + "1631466666666666739367936", + "1631466666666666739367936", + "1631466666666666739367936" + ], + "expectedQty": "4940367822219734927726353" + }, + { + "bAssetQtys": [ + "1864533333333333378072576", + "1864533333333333378072576", + "1864533333333333378072576" + ], + "expectedQty": "5641063534359531162361781" + }, + { + "bAssetQtys": [ + "2097600000000000016777216", + "2097600000000000016777216", + "2097600000000000016777216" + ], + "expectedQty": "6341504785730401684633876" + }, + { + "bAssetQtys": [ + "2330666666666666387046400", + "2330666666666666387046400", + "2330666666666666387046400" + ], + "expectedQty": "7041753089676310563468007" + }, + { + "bAssetQtys": [ + "3333333333333", + "3333333333333", + "3333333333333" + ], + "expectedQty": "10385912127727" + }, + { + "bAssetQtys": [ + "333333333333333", + "333333333333333", + "333333333333333" + ], + "expectedQty": "1038591212748137" + }, + { + "bAssetQtys": [ + "33333333333333332", + "33333333333333332", + "33333333333333332" + ], + "expectedQty": "103859121028758490" + }, + { + "bAssetQtys": [ + "333333333333333312", + "333333333333333312", + "333333333333333312" + ], + "expectedQty": "1038591187918937221" + }, + { + "bAssetQtys": [ + "3333333333333333504", + "3333333333333333504", + "3333333333333333504" + ], + "expectedQty": "10385909642338954743" + }, + { + "bAssetQtys": [ + "33333333333333336064", + "33333333333333336064", + "33333333333333336064" + ], + "expectedQty": "103858872752693091205" + }, + { + "bAssetQtys": [ + "233066666666666672259072", + "233066666666666672259072", + "233066666666666672259072" + ], + "expectedQty": "717819511157338147988270" + }, + { + "bAssetQtys": [ + "466133333333333344518144", + "466133333333333344518144", + "466133333333333344518144" + ], + "expectedQty": "1426858395787741341108746" + }, + { + "bAssetQtys": [ + "699200000000000050331648", + "699200000000000050331648", + "699200000000000050331648" + ], + "expectedQty": "2132169018987193819175100" + }, + { + "bAssetQtys": [ + "932266666666666689036288", + "932266666666666689036288", + "932266666666666689036288" + ], + "expectedQty": "2835548601135555974061802" + }, + { + "bAssetQtys": [ + "1165333333333333193523200", + "1165333333333333193523200", + "1165333333333333193523200" + ], + "expectedQty": "3537797483589527161733747" + }, + { + "bAssetQtys": [ + "1398400000000000100663296", + "1398400000000000100663296", + "1398400000000000100663296" + ], + "expectedQty": "4239326362763222019077212" + }, + { + "bAssetQtys": [ + "1631466666666666739367936", + "1631466666666666739367936", + "1631466666666666739367936" + ], + "expectedQty": "4940367822219734927726353" + }, + { + "bAssetQtys": [ + "1864533333333333378072576", + "1864533333333333378072576", + "1864533333333333378072576" + ], + "expectedQty": "5641063534359531162361781" + }, + { + "bAssetQtys": [ + "2097600000000000016777216", + "2097600000000000016777216", + "2097600000000000016777216" + ], + "expectedQty": "6341504785730401684633876" + }, + { + "bAssetQtys": [ + "2330666666666666387046400", + "2330666666666666387046400", + "2330666666666666387046400" + ], + "expectedQty": "7041753089676310563468007" + }, + { + "bAssetQtys": [ + "3333333333333", + "3333333333333", + "3333333333333" + ], + "expectedQty": "10385912127727" + }, + { + "bAssetQtys": [ + "333333333333333", + "333333333333333", + "333333333333333" + ], + "expectedQty": "1038591212748137" + }, + { + "bAssetQtys": [ + "33333333333333332", + "33333333333333332", + "33333333333333332" + ], + "expectedQty": "103859121028758490" + }, + { + "bAssetQtys": [ + "333333333333333312", + "333333333333333312", + "333333333333333312" + ], + "expectedQty": "1038591187918937221" + }, + { + "bAssetQtys": [ + "3333333333333333504", + "3333333333333333504", + "3333333333333333504" + ], + "expectedQty": "10385909642338954743" + }, + { + "bAssetQtys": [ + "33333333333333336064", + "33333333333333336064", + "33333333333333336064" + ], + "expectedQty": "103858872752693091205" + }, + { + "bAssetQtys": [ + "233066666666666672259072", + "233066666666666672259072", + "233066666666666672259072" + ], + "expectedQty": "717819511157338147988270" + }, + { + "bAssetQtys": [ + "466133333333333344518144", + "466133333333333344518144", + "466133333333333344518144" + ], + "expectedQty": "1426858395787741341108746" + }, + { + "bAssetQtys": [ + "699200000000000050331648", + "699200000000000050331648", + "699200000000000050331648" + ], + "expectedQty": "2132169018987193819175100" + }, + { + "bAssetQtys": [ + "932266666666666689036288", + "932266666666666689036288", + "932266666666666689036288" + ], + "expectedQty": "2835548601135555974061802" + }, + { + "bAssetQtys": [ + "1165333333333333193523200", + "1165333333333333193523200", + "1165333333333333193523200" + ], + "expectedQty": "3537797483589527161733747" + }, + { + "bAssetQtys": [ + "1398400000000000100663296", + "1398400000000000100663296", + "1398400000000000100663296" + ], + "expectedQty": "4239326362763222019077212" + }, + { + "bAssetQtys": [ + "1631466666666666739367936", + "1631466666666666739367936", + "1631466666666666739367936" + ], + "expectedQty": "4940367822219734927726353" + }, + { + "bAssetQtys": [ + "1864533333333333378072576", + "1864533333333333378072576", + "1864533333333333378072576" + ], + "expectedQty": "5641063534359531162361781" + }, + { + "bAssetQtys": [ + "2097600000000000016777216", + "2097600000000000016777216", + "2097600000000000016777216" + ], + "expectedQty": "6341504785730401684633876" + }, + { + "bAssetQtys": [ + "2330666666666666387046400", + "2330666666666666387046400", + "2330666666666666387046400" + ], + "expectedQty": "7041753089676310563468007" + } + ] + }, + { + "reserve0": "500500000000000000000000", + "reserve1": "2007000000000000000000000", + "reserve2": "7492500000000000000000000", + "A": 120, + "mAssetSupply": "9896372713490403790662354", + "hardMin": 50000000000000000, + "hardMax": 750000000000000000, + "swapFeeRate": 600000000000000, + "mints": [ + { + "bAssetQtys": [ + "3333333333333", + "3333333333333", + "3333333333333" + ], + "expectedQty": "10616212599789" + }, + { + "bAssetQtys": [ + "333333333333333", + "333333333333333", + "333333333333333" + ], + "expectedQty": "1061621259940193" + }, + { + "bAssetQtys": [ + "33333333333333332", + "33333333333333332", + "33333333333333332" + ], + "expectedQty": "106162125606333410" + }, + { + "bAssetQtys": [ + "333333333333333312", + "333333333333333312", + "333333333333333312" + ], + "expectedQty": "1061621220819182343" + }, + { + "bAssetQtys": [ + "3333333333333333504", + "3333333333333333504", + "3333333333333333504" + ], + "expectedQty": "10616208683798909905" + }, + { + "bAssetQtys": [ + "33333333333333336064", + "33333333333333336064", + "33333333333333336064" + ], + "expectedQty": "106161734420953940818" + }, + { + "bAssetQtys": [ + "233066666666666672259072", + "233066666666666672259072", + "233066666666666672259072" + ], + "expectedQty": "729045507934045981147445" + }, + { + "bAssetQtys": [ + "466133333333333344518144", + "466133333333333344518144", + "466133333333333344518144" + ], + "expectedQty": "1444093165885337491540905" + }, + { + "bAssetQtys": [ + "699200000000000050331648", + "699200000000000050331648", + "699200000000000050331648" + ], + "expectedQty": "2153151422959607051690973" + }, + { + "bAssetQtys": [ + "932266666666666689036288", + "932266666666666689036288", + "932266666666666689036288" + ], + "expectedQty": "2859096981577989191295531" + }, + { + "bAssetQtys": [ + "1165333333333333193523200", + "1165333333333333193523200", + "1165333333333333193523200" + ], + "expectedQty": "3563217561037023690548355" + }, + { + "bAssetQtys": [ + "1398400000000000100663296", + "1398400000000000100663296", + "1398400000000000100663296" + ], + "expectedQty": "4266175833285971337758877" + }, + { + "bAssetQtys": [ + "1631466666666666739367936", + "1631466666666666739367936", + "1631466666666666739367936" + ], + "expectedQty": "4968347620679184766532063" + }, + { + "bAssetQtys": [ + "1864533333333333378072576", + "1864533333333333378072576", + "1864533333333333378072576" + ], + "expectedQty": "5669961970717048793425226" + }, + { + "bAssetQtys": [ + "2097600000000000016777216", + "2097600000000000016777216", + "2097600000000000016777216" + ], + "expectedQty": "6371166461806356373525737" + }, + { + "bAssetQtys": [ + "2330666666666666387046400", + "2330666666666666387046400", + "2330666666666666387046400" + ], + "expectedQty": "7072060493137874105294090" + }, + { + "bAssetQtys": [ + "3333333333333", + "3333333333333", + "3333333333333" + ], + "expectedQty": "10616212599789" + }, + { + "bAssetQtys": [ + "333333333333333", + "333333333333333", + "333333333333333" + ], + "expectedQty": "1061621259940193" + }, + { + "bAssetQtys": [ + "33333333333333332", + "33333333333333332", + "33333333333333332" + ], + "expectedQty": "106162125606333410" + }, + { + "bAssetQtys": [ + "333333333333333312", + "333333333333333312", + "333333333333333312" + ], + "expectedQty": "1061621220819182343" + }, + { + "bAssetQtys": [ + "3333333333333333504", + "3333333333333333504", + "3333333333333333504" + ], + "expectedQty": "10616208683798909905" + }, + { + "bAssetQtys": [ + "33333333333333336064", + "33333333333333336064", + "33333333333333336064" + ], + "expectedQty": "106161734420953940818" + }, + { + "bAssetQtys": [ + "233066666666666672259072", + "233066666666666672259072", + "233066666666666672259072" + ], + "expectedQty": "729045507934045981147445" + }, + { + "bAssetQtys": [ + "466133333333333344518144", + "466133333333333344518144", + "466133333333333344518144" + ], + "expectedQty": "1444093165885337491540905" + }, + { + "bAssetQtys": [ + "699200000000000050331648", + "699200000000000050331648", + "699200000000000050331648" + ], + "expectedQty": "2153151422959607051690973" + }, + { + "bAssetQtys": [ + "932266666666666689036288", + "932266666666666689036288", + "932266666666666689036288" + ], + "expectedQty": "2859096981577989191295531" + }, + { + "bAssetQtys": [ + "1165333333333333193523200", + "1165333333333333193523200", + "1165333333333333193523200" + ], + "expectedQty": "3563217561037023690548355" + }, + { + "bAssetQtys": [ + "1398400000000000100663296", + "1398400000000000100663296", + "1398400000000000100663296" + ], + "expectedQty": "4266175833285971337758877" + }, + { + "bAssetQtys": [ + "1631466666666666739367936", + "1631466666666666739367936", + "1631466666666666739367936" + ], + "expectedQty": "4968347620679184766532063" + }, + { + "bAssetQtys": [ + "1864533333333333378072576", + "1864533333333333378072576", + "1864533333333333378072576" + ], + "expectedQty": "5669961970717048793425226" + }, + { + "bAssetQtys": [ + "2097600000000000016777216", + "2097600000000000016777216", + "2097600000000000016777216" + ], + "expectedQty": "6371166461806356373525737" + }, + { + "bAssetQtys": [ + "2330666666666666387046400", + "2330666666666666387046400", + "2330666666666666387046400" + ], + "expectedQty": "7072060493137874105294090" + }, + { + "bAssetQtys": [ + "3333333333333", + "3333333333333", + "3333333333333" + ], + "expectedQty": "10616212599789" + }, + { + "bAssetQtys": [ + "333333333333333", + "333333333333333", + "333333333333333" + ], + "expectedQty": "1061621259940193" + }, + { + "bAssetQtys": [ + "33333333333333332", + "33333333333333332", + "33333333333333332" + ], + "expectedQty": "106162125606333410" + }, + { + "bAssetQtys": [ + "333333333333333312", + "333333333333333312", + "333333333333333312" + ], + "expectedQty": "1061621220819182343" + }, + { + "bAssetQtys": [ + "3333333333333333504", + "3333333333333333504", + "3333333333333333504" + ], + "expectedQty": "10616208683798909905" + }, + { + "bAssetQtys": [ + "33333333333333336064", + "33333333333333336064", + "33333333333333336064" + ], + "expectedQty": "106161734420953940818" + }, + { + "bAssetQtys": [ + "233066666666666672259072", + "233066666666666672259072", + "233066666666666672259072" + ], + "expectedQty": "729045507934045981147445" + }, + { + "bAssetQtys": [ + "466133333333333344518144", + "466133333333333344518144", + "466133333333333344518144" + ], + "expectedQty": "1444093165885337491540905" + }, + { + "bAssetQtys": [ + "699200000000000050331648", + "699200000000000050331648", + "699200000000000050331648" + ], + "expectedQty": "2153151422959607051690973" + }, + { + "bAssetQtys": [ + "932266666666666689036288", + "932266666666666689036288", + "932266666666666689036288" + ], + "expectedQty": "2859096981577989191295531" + }, + { + "bAssetQtys": [ + "1165333333333333193523200", + "1165333333333333193523200", + "1165333333333333193523200" + ], + "expectedQty": "3563217561037023690548355" + }, + { + "bAssetQtys": [ + "1398400000000000100663296", + "1398400000000000100663296", + "1398400000000000100663296" + ], + "expectedQty": "4266175833285971337758877" + }, + { + "bAssetQtys": [ + "1631466666666666739367936", + "1631466666666666739367936", + "1631466666666666739367936" + ], + "expectedQty": "4968347620679184766532063" + }, + { + "bAssetQtys": [ + "1864533333333333378072576", + "1864533333333333378072576", + "1864533333333333378072576" + ], + "expectedQty": "5669961970717048793425226" + }, + { + "bAssetQtys": [ + "2097600000000000016777216", + "2097600000000000016777216", + "2097600000000000016777216" + ], + "expectedQty": "6371166461806356373525737" + }, + { + "bAssetQtys": [ + "2330666666666666387046400", + "2330666666666666387046400", + "2330666666666666387046400" + ], + "expectedQty": "7072060493137874105294090" + } + ] + }, + { + "reserve0": "3996499999999999360000000", + "reserve1": "5503000000000000000000000", + "reserve2": "500500000000000000000000", + "A": 120, + "mAssetSupply": "9936488013915504712820075", + "hardMin": 50000000000000000, + "hardMax": 750000000000000000, + "swapFeeRate": 600000000000000, + "mints": [ + { + "bAssetQtys": [ + "3333333333333", + "3333333333333", + "3333333333333" + ], + "expectedQty": "10385912127727" + }, + { + "bAssetQtys": [ + "333333333333333", + "333333333333333", + "333333333333333" + ], + "expectedQty": "1038591212748137" + }, + { + "bAssetQtys": [ + "33333333333333332", + "33333333333333332", + "33333333333333332" + ], + "expectedQty": "103859121028758490" + }, + { + "bAssetQtys": [ + "333333333333333312", + "333333333333333312", + "333333333333333312" + ], + "expectedQty": "1038591187918937221" + }, + { + "bAssetQtys": [ + "3333333333333333504", + "3333333333333333504", + "3333333333333333504" + ], + "expectedQty": "10385909642338954743" + }, + { + "bAssetQtys": [ + "33333333333333336064", + "33333333333333336064", + "33333333333333336064" + ], + "expectedQty": "103858872752693091205" + }, + { + "bAssetQtys": [ + "233066666666666672259072", + "233066666666666672259072", + "233066666666666672259072" + ], + "expectedQty": "717819511157338147988270" + }, + { + "bAssetQtys": [ + "466133333333333344518144", + "466133333333333344518144", + "466133333333333344518144" + ], + "expectedQty": "1426858395787741341108746" + }, + { + "bAssetQtys": [ + "699200000000000050331648", + "699200000000000050331648", + "699200000000000050331648" + ], + "expectedQty": "2132169018987193819175100" + }, + { + "bAssetQtys": [ + "932266666666666689036288", + "932266666666666689036288", + "932266666666666689036288" + ], + "expectedQty": "2835548601135555974061802" + }, + { + "bAssetQtys": [ + "1165333333333333193523200", + "1165333333333333193523200", + "1165333333333333193523200" + ], + "expectedQty": "3537797483589527161733747" + }, + { + "bAssetQtys": [ + "1398400000000000100663296", + "1398400000000000100663296", + "1398400000000000100663296" + ], + "expectedQty": "4239326362763222019077212" + }, + { + "bAssetQtys": [ + "1631466666666666739367936", + "1631466666666666739367936", + "1631466666666666739367936" + ], + "expectedQty": "4940367822219734927726353" + }, + { + "bAssetQtys": [ + "1864533333333333378072576", + "1864533333333333378072576", + "1864533333333333378072576" + ], + "expectedQty": "5641063534359531162361781" + }, + { + "bAssetQtys": [ + "2097600000000000016777216", + "2097600000000000016777216", + "2097600000000000016777216" + ], + "expectedQty": "6341504785730401684633876" + }, + { + "bAssetQtys": [ + "2330666666666666387046400", + "2330666666666666387046400", + "2330666666666666387046400" + ], + "expectedQty": "7041753089676310563468007" + }, + { + "bAssetQtys": [ + "3333333333333", + "3333333333333", + "3333333333333" + ], + "expectedQty": "10385912127727" + }, + { + "bAssetQtys": [ + "333333333333333", + "333333333333333", + "333333333333333" + ], + "expectedQty": "1038591212748137" + }, + { + "bAssetQtys": [ + "33333333333333332", + "33333333333333332", + "33333333333333332" + ], + "expectedQty": "103859121028758490" + }, + { + "bAssetQtys": [ + "333333333333333312", + "333333333333333312", + "333333333333333312" + ], + "expectedQty": "1038591187918937221" + }, + { + "bAssetQtys": [ + "3333333333333333504", + "3333333333333333504", + "3333333333333333504" + ], + "expectedQty": "10385909642338954743" + }, + { + "bAssetQtys": [ + "33333333333333336064", + "33333333333333336064", + "33333333333333336064" + ], + "expectedQty": "103858872752693091205" + }, + { + "bAssetQtys": [ + "233066666666666672259072", + "233066666666666672259072", + "233066666666666672259072" + ], + "expectedQty": "717819511157338147988270" + }, + { + "bAssetQtys": [ + "466133333333333344518144", + "466133333333333344518144", + "466133333333333344518144" + ], + "expectedQty": "1426858395787741341108746" + }, + { + "bAssetQtys": [ + "699200000000000050331648", + "699200000000000050331648", + "699200000000000050331648" + ], + "expectedQty": "2132169018987193819175100" + }, + { + "bAssetQtys": [ + "932266666666666689036288", + "932266666666666689036288", + "932266666666666689036288" + ], + "expectedQty": "2835548601135555974061802" + }, + { + "bAssetQtys": [ + "1165333333333333193523200", + "1165333333333333193523200", + "1165333333333333193523200" + ], + "expectedQty": "3537797483589527161733747" + }, + { + "bAssetQtys": [ + "1398400000000000100663296", + "1398400000000000100663296", + "1398400000000000100663296" + ], + "expectedQty": "4239326362763222019077212" + }, + { + "bAssetQtys": [ + "1631466666666666739367936", + "1631466666666666739367936", + "1631466666666666739367936" + ], + "expectedQty": "4940367822219734927726353" + }, + { + "bAssetQtys": [ + "1864533333333333378072576", + "1864533333333333378072576", + "1864533333333333378072576" + ], + "expectedQty": "5641063534359531162361781" + }, + { + "bAssetQtys": [ + "2097600000000000016777216", + "2097600000000000016777216", + "2097600000000000016777216" + ], + "expectedQty": "6341504785730401684633876" + }, + { + "bAssetQtys": [ + "2330666666666666387046400", + "2330666666666666387046400", + "2330666666666666387046400" + ], + "expectedQty": "7041753089676310563468007" + }, + { + "bAssetQtys": [ + "3333333333333", + "3333333333333", + "3333333333333" + ], + "expectedQty": "10385912127727" + }, + { + "bAssetQtys": [ + "333333333333333", + "333333333333333", + "333333333333333" + ], + "expectedQty": "1038591212748137" + }, + { + "bAssetQtys": [ + "33333333333333332", + "33333333333333332", + "33333333333333332" + ], + "expectedQty": "103859121028758490" + }, + { + "bAssetQtys": [ + "333333333333333312", + "333333333333333312", + "333333333333333312" + ], + "expectedQty": "1038591187918937221" + }, + { + "bAssetQtys": [ + "3333333333333333504", + "3333333333333333504", + "3333333333333333504" + ], + "expectedQty": "10385909642338954743" + }, + { + "bAssetQtys": [ + "33333333333333336064", + "33333333333333336064", + "33333333333333336064" + ], + "expectedQty": "103858872752693091205" + }, + { + "bAssetQtys": [ + "233066666666666672259072", + "233066666666666672259072", + "233066666666666672259072" + ], + "expectedQty": "717819511157338147988270" + }, + { + "bAssetQtys": [ + "466133333333333344518144", + "466133333333333344518144", + "466133333333333344518144" + ], + "expectedQty": "1426858395787741341108746" + }, + { + "bAssetQtys": [ + "699200000000000050331648", + "699200000000000050331648", + "699200000000000050331648" + ], + "expectedQty": "2132169018987193819175100" + }, + { + "bAssetQtys": [ + "932266666666666689036288", + "932266666666666689036288", + "932266666666666689036288" + ], + "expectedQty": "2835548601135555974061802" + }, + { + "bAssetQtys": [ + "1165333333333333193523200", + "1165333333333333193523200", + "1165333333333333193523200" + ], + "expectedQty": "3537797483589527161733747" + }, + { + "bAssetQtys": [ + "1398400000000000100663296", + "1398400000000000100663296", + "1398400000000000100663296" + ], + "expectedQty": "4239326362763222019077212" + }, + { + "bAssetQtys": [ + "1631466666666666739367936", + "1631466666666666739367936", + "1631466666666666739367936" + ], + "expectedQty": "4940367822219734927726353" + }, + { + "bAssetQtys": [ + "1864533333333333378072576", + "1864533333333333378072576", + "1864533333333333378072576" + ], + "expectedQty": "5641063534359531162361781" + }, + { + "bAssetQtys": [ + "2097600000000000016777216", + "2097600000000000016777216", + "2097600000000000016777216" + ], + "expectedQty": "6341504785730401684633876" + }, + { + "bAssetQtys": [ + "2330666666666666387046400", + "2330666666666666387046400", + "2330666666666666387046400" + ], + "expectedQty": "7041753089676310563468007" + } + ] + }, + { + "reserve0": "3996499999999999360000000", + "reserve1": "2007000000000000960000000", + "reserve2": "3996499999999999360000000", + "A": 120, + "mAssetSupply": "9995726520619110731126433", + "hardMin": 50000000000000000, + "hardMax": 750000000000000000, + "swapFeeRate": 600000000000000, + "mints": [ + { + "bAssetQtys": [ + "3333333333333", + "3333333333333", + "3333333333333" + ], + "expectedQty": "10006162027981" + }, + { + "bAssetQtys": [ + "333333333333333", + "333333333333333", + "333333333333333" + ], + "expectedQty": "1000616202798095" + }, + { + "bAssetQtys": [ + "33333333333333332", + "33333333333333332", + "33333333333333332" + ], + "expectedQty": "100061620278871720" + }, + { + "bAssetQtys": [ + "333333333333333312", + "333333333333333312", + "333333333333333312" + ], + "expectedQty": "1000616202703457733" + }, + { + "bAssetQtys": [ + "3333333333333333504", + "3333333333333333504", + "3333333333333333504" + ], + "expectedQty": "10006162018508647736" + }, + { + "bAssetQtys": [ + "33333333333333336064", + "33333333333333336064", + "33333333333333336064" + ], + "expectedQty": "100061619332506863358" + }, + { + "bAssetQtys": [ + "233066666666666672259072", + "233066666666666672259072", + "233066666666666672259072" + ], + "expectedQty": "699589172569064088513914" + }, + { + "bAssetQtys": [ + "466133333333333344518144", + "466133333333333344518144", + "466133333333333344518144" + ], + "expectedQty": "1399110113009977714491450" + }, + { + "bAssetQtys": [ + "699200000000000050331648", + "699200000000000050331648", + "699200000000000050331648" + ], + "expectedQty": "2098579763704496996113493" + }, + { + "bAssetQtys": [ + "932266666666666689036288", + "932266666666666689036288", + "932266666666666689036288" + ], + "expectedQty": "2798009813075099253271636" + }, + { + "bAssetQtys": [ + "1165333333333333193523200", + "1165333333333333193523200", + "1165333333333333193523200" + ], + "expectedQty": "3497408599942144636779437" + }, + { + "bAssetQtys": [ + "1398400000000000100663296", + "1398400000000000100663296", + "1398400000000000100663296" + ], + "expectedQty": "4196782242397675221053972" + }, + { + "bAssetQtys": [ + "1631466666666666739367936", + "1631466666666666739367936", + "1631466666666666739367936" + ], + "expectedQty": "4896135336985582089078779" + }, + { + "bAssetQtys": [ + "1864533333333333378072576", + "1864533333333333378072576", + "1864533333333333378072576" + ], + "expectedQty": "5595471408100876355649496" + }, + { + "bAssetQtys": [ + "2097600000000000016777216", + "2097600000000000016777216", + "2097600000000000016777216" + ], + "expectedQty": "6294793206161822055345982" + }, + { + "bAssetQtys": [ + "2330666666666666387046400", + "2330666666666666387046400", + "2330666666666666387046400" + ], + "expectedQty": "6994102910962511597493255" + }, + { + "bAssetQtys": [ + "3333333333333", + "3333333333333", + "3333333333333" + ], + "expectedQty": "10006162027981" + }, + { + "bAssetQtys": [ + "333333333333333", + "333333333333333", + "333333333333333" + ], + "expectedQty": "1000616202798095" + }, + { + "bAssetQtys": [ + "33333333333333332", + "33333333333333332", + "33333333333333332" + ], + "expectedQty": "100061620278871720" + }, + { + "bAssetQtys": [ + "333333333333333312", + "333333333333333312", + "333333333333333312" + ], + "expectedQty": "1000616202703457733" + }, + { + "bAssetQtys": [ + "3333333333333333504", + "3333333333333333504", + "3333333333333333504" + ], + "expectedQty": "10006162018508647736" + }, + { + "bAssetQtys": [ + "33333333333333336064", + "33333333333333336064", + "33333333333333336064" + ], + "expectedQty": "100061619332506863358" + }, + { + "bAssetQtys": [ + "233066666666666672259072", + "233066666666666672259072", + "233066666666666672259072" + ], + "expectedQty": "699589172569064088513914" + }, + { + "bAssetQtys": [ + "466133333333333344518144", + "466133333333333344518144", + "466133333333333344518144" + ], + "expectedQty": "1399110113009977714491450" + }, + { + "bAssetQtys": [ + "699200000000000050331648", + "699200000000000050331648", + "699200000000000050331648" + ], + "expectedQty": "2098579763704496996113493" + }, + { + "bAssetQtys": [ + "932266666666666689036288", + "932266666666666689036288", + "932266666666666689036288" + ], + "expectedQty": "2798009813075099253271636" + }, + { + "bAssetQtys": [ + "1165333333333333193523200", + "1165333333333333193523200", + "1165333333333333193523200" + ], + "expectedQty": "3497408599942144636779437" + }, + { + "bAssetQtys": [ + "1398400000000000100663296", + "1398400000000000100663296", + "1398400000000000100663296" + ], + "expectedQty": "4196782242397675221053972" + }, + { + "bAssetQtys": [ + "1631466666666666739367936", + "1631466666666666739367936", + "1631466666666666739367936" + ], + "expectedQty": "4896135336985582089078779" + }, + { + "bAssetQtys": [ + "1864533333333333378072576", + "1864533333333333378072576", + "1864533333333333378072576" + ], + "expectedQty": "5595471408100876355649496" + }, + { + "bAssetQtys": [ + "2097600000000000016777216", + "2097600000000000016777216", + "2097600000000000016777216" + ], + "expectedQty": "6294793206161822055345982" + }, + { + "bAssetQtys": [ + "2330666666666666387046400", + "2330666666666666387046400", + "2330666666666666387046400" + ], + "expectedQty": "6994102910962511597493255" + }, + { + "bAssetQtys": [ + "3333333333333", + "3333333333333", + "3333333333333" + ], + "expectedQty": "10006162027981" + }, + { + "bAssetQtys": [ + "333333333333333", + "333333333333333", + "333333333333333" + ], + "expectedQty": "1000616202798095" + }, + { + "bAssetQtys": [ + "33333333333333332", + "33333333333333332", + "33333333333333332" + ], + "expectedQty": "100061620278871720" + }, + { + "bAssetQtys": [ + "333333333333333312", + "333333333333333312", + "333333333333333312" + ], + "expectedQty": "1000616202703457733" + }, + { + "bAssetQtys": [ + "3333333333333333504", + "3333333333333333504", + "3333333333333333504" + ], + "expectedQty": "10006162018508647736" + }, + { + "bAssetQtys": [ + "33333333333333336064", + "33333333333333336064", + "33333333333333336064" + ], + "expectedQty": "100061619332506863358" + }, + { + "bAssetQtys": [ + "233066666666666672259072", + "233066666666666672259072", + "233066666666666672259072" + ], + "expectedQty": "699589172569064088513914" + }, + { + "bAssetQtys": [ + "466133333333333344518144", + "466133333333333344518144", + "466133333333333344518144" + ], + "expectedQty": "1399110113009977714491450" + }, + { + "bAssetQtys": [ + "699200000000000050331648", + "699200000000000050331648", + "699200000000000050331648" + ], + "expectedQty": "2098579763704496996113493" + }, + { + "bAssetQtys": [ + "932266666666666689036288", + "932266666666666689036288", + "932266666666666689036288" + ], + "expectedQty": "2798009813075099253271636" + }, + { + "bAssetQtys": [ + "1165333333333333193523200", + "1165333333333333193523200", + "1165333333333333193523200" + ], + "expectedQty": "3497408599942144636779437" + }, + { + "bAssetQtys": [ + "1398400000000000100663296", + "1398400000000000100663296", + "1398400000000000100663296" + ], + "expectedQty": "4196782242397675221053972" + }, + { + "bAssetQtys": [ + "1631466666666666739367936", + "1631466666666666739367936", + "1631466666666666739367936" + ], + "expectedQty": "4896135336985582089078779" + }, + { + "bAssetQtys": [ + "1864533333333333378072576", + "1864533333333333378072576", + "1864533333333333378072576" + ], + "expectedQty": "5595471408100876355649496" + }, + { + "bAssetQtys": [ + "2097600000000000016777216", + "2097600000000000016777216", + "2097600000000000016777216" + ], + "expectedQty": "6294793206161822055345982" + }, + { + "bAssetQtys": [ + "2330666666666666387046400", + "2330666666666666387046400", + "2330666666666666387046400" + ], + "expectedQty": "6994102910962511597493255" + } + ] + }, + { + "reserve0": "7492500000000000000000000", + "reserve1": "2007000000000000000000000", + "reserve2": "500500000000000000000000", + "A": 120, + "mAssetSupply": "9896372713490403790662354", + "hardMin": 50000000000000000, + "hardMax": 750000000000000000, + "swapFeeRate": 600000000000000, + "mints": [ + { + "bAssetQtys": [ + "3333333333333", + "3333333333333", + "3333333333333" + ], + "expectedQty": "10616212599789" + }, + { + "bAssetQtys": [ + "333333333333333", + "333333333333333", + "333333333333333" + ], + "expectedQty": "1061621259940193" + }, + { + "bAssetQtys": [ + "33333333333333332", + "33333333333333332", + "33333333333333332" + ], + "expectedQty": "106162125606333410" + }, + { + "bAssetQtys": [ + "333333333333333312", + "333333333333333312", + "333333333333333312" + ], + "expectedQty": "1061621220819182343" + }, + { + "bAssetQtys": [ + "3333333333333333504", + "3333333333333333504", + "3333333333333333504" + ], + "expectedQty": "10616208683798909905" + }, + { + "bAssetQtys": [ + "33333333333333336064", + "33333333333333336064", + "33333333333333336064" + ], + "expectedQty": "106161734420953940818" + }, + { + "bAssetQtys": [ + "233066666666666672259072", + "233066666666666672259072", + "233066666666666672259072" + ], + "expectedQty": "729045507934045981147445" + }, + { + "bAssetQtys": [ + "466133333333333344518144", + "466133333333333344518144", + "466133333333333344518144" + ], + "expectedQty": "1444093165885337491540905" + }, + { + "bAssetQtys": [ + "699200000000000050331648", + "699200000000000050331648", + "699200000000000050331648" + ], + "expectedQty": "2153151422959607051690973" + }, + { + "bAssetQtys": [ + "932266666666666689036288", + "932266666666666689036288", + "932266666666666689036288" + ], + "expectedQty": "2859096981577989191295531" + }, + { + "bAssetQtys": [ + "1165333333333333193523200", + "1165333333333333193523200", + "1165333333333333193523200" + ], + "expectedQty": "3563217561037023690548355" + }, + { + "bAssetQtys": [ + "1398400000000000100663296", + "1398400000000000100663296", + "1398400000000000100663296" + ], + "expectedQty": "4266175833285971337758877" + }, + { + "bAssetQtys": [ + "1631466666666666739367936", + "1631466666666666739367936", + "1631466666666666739367936" + ], + "expectedQty": "4968347620679184766532063" + }, + { + "bAssetQtys": [ + "1864533333333333378072576", + "1864533333333333378072576", + "1864533333333333378072576" + ], + "expectedQty": "5669961970717048793425226" + }, + { + "bAssetQtys": [ + "2097600000000000016777216", + "2097600000000000016777216", + "2097600000000000016777216" + ], + "expectedQty": "6371166461806356373525737" + }, + { + "bAssetQtys": [ + "2330666666666666387046400", + "2330666666666666387046400", + "2330666666666666387046400" + ], + "expectedQty": "7072060493137874105294090" + }, + { + "bAssetQtys": [ + "3333333333333", + "3333333333333", + "3333333333333" + ], + "expectedQty": "10616212599789" + }, + { + "bAssetQtys": [ + "333333333333333", + "333333333333333", + "333333333333333" + ], + "expectedQty": "1061621259940193" + }, + { + "bAssetQtys": [ + "33333333333333332", + "33333333333333332", + "33333333333333332" + ], + "expectedQty": "106162125606333410" + }, + { + "bAssetQtys": [ + "333333333333333312", + "333333333333333312", + "333333333333333312" + ], + "expectedQty": "1061621220819182343" + }, + { + "bAssetQtys": [ + "3333333333333333504", + "3333333333333333504", + "3333333333333333504" + ], + "expectedQty": "10616208683798909905" + }, + { + "bAssetQtys": [ + "33333333333333336064", + "33333333333333336064", + "33333333333333336064" + ], + "expectedQty": "106161734420953940818" + }, + { + "bAssetQtys": [ + "233066666666666672259072", + "233066666666666672259072", + "233066666666666672259072" + ], + "expectedQty": "729045507934045981147445" + }, + { + "bAssetQtys": [ + "466133333333333344518144", + "466133333333333344518144", + "466133333333333344518144" + ], + "expectedQty": "1444093165885337491540905" + }, + { + "bAssetQtys": [ + "699200000000000050331648", + "699200000000000050331648", + "699200000000000050331648" + ], + "expectedQty": "2153151422959607051690973" + }, + { + "bAssetQtys": [ + "932266666666666689036288", + "932266666666666689036288", + "932266666666666689036288" + ], + "expectedQty": "2859096981577989191295531" + }, + { + "bAssetQtys": [ + "1165333333333333193523200", + "1165333333333333193523200", + "1165333333333333193523200" + ], + "expectedQty": "3563217561037023690548355" + }, + { + "bAssetQtys": [ + "1398400000000000100663296", + "1398400000000000100663296", + "1398400000000000100663296" + ], + "expectedQty": "4266175833285971337758877" + }, + { + "bAssetQtys": [ + "1631466666666666739367936", + "1631466666666666739367936", + "1631466666666666739367936" + ], + "expectedQty": "4968347620679184766532063" + }, + { + "bAssetQtys": [ + "1864533333333333378072576", + "1864533333333333378072576", + "1864533333333333378072576" + ], + "expectedQty": "5669961970717048793425226" + }, + { + "bAssetQtys": [ + "2097600000000000016777216", + "2097600000000000016777216", + "2097600000000000016777216" + ], + "expectedQty": "6371166461806356373525737" + }, + { + "bAssetQtys": [ + "2330666666666666387046400", + "2330666666666666387046400", + "2330666666666666387046400" + ], + "expectedQty": "7072060493137874105294090" + }, + { + "bAssetQtys": [ + "3333333333333", + "3333333333333", + "3333333333333" + ], + "expectedQty": "10616212599789" + }, + { + "bAssetQtys": [ + "333333333333333", + "333333333333333", + "333333333333333" + ], + "expectedQty": "1061621259940193" + }, + { + "bAssetQtys": [ + "33333333333333332", + "33333333333333332", + "33333333333333332" + ], + "expectedQty": "106162125606333410" + }, + { + "bAssetQtys": [ + "333333333333333312", + "333333333333333312", + "333333333333333312" + ], + "expectedQty": "1061621220819182343" + }, + { + "bAssetQtys": [ + "3333333333333333504", + "3333333333333333504", + "3333333333333333504" + ], + "expectedQty": "10616208683798909905" + }, + { + "bAssetQtys": [ + "33333333333333336064", + "33333333333333336064", + "33333333333333336064" + ], + "expectedQty": "106161734420953940818" + }, + { + "bAssetQtys": [ + "233066666666666672259072", + "233066666666666672259072", + "233066666666666672259072" + ], + "expectedQty": "729045507934045981147445" + }, + { + "bAssetQtys": [ + "466133333333333344518144", + "466133333333333344518144", + "466133333333333344518144" + ], + "expectedQty": "1444093165885337491540905" + }, + { + "bAssetQtys": [ + "699200000000000050331648", + "699200000000000050331648", + "699200000000000050331648" + ], + "expectedQty": "2153151422959607051690973" + }, + { + "bAssetQtys": [ + "932266666666666689036288", + "932266666666666689036288", + "932266666666666689036288" + ], + "expectedQty": "2859096981577989191295531" + }, + { + "bAssetQtys": [ + "1165333333333333193523200", + "1165333333333333193523200", + "1165333333333333193523200" + ], + "expectedQty": "3563217561037023690548355" + }, + { + "bAssetQtys": [ + "1398400000000000100663296", + "1398400000000000100663296", + "1398400000000000100663296" + ], + "expectedQty": "4266175833285971337758877" + }, + { + "bAssetQtys": [ + "1631466666666666739367936", + "1631466666666666739367936", + "1631466666666666739367936" + ], + "expectedQty": "4968347620679184766532063" + }, + { + "bAssetQtys": [ + "1864533333333333378072576", + "1864533333333333378072576", + "1864533333333333378072576" + ], + "expectedQty": "5669961970717048793425226" + }, + { + "bAssetQtys": [ + "2097600000000000016777216", + "2097600000000000016777216", + "2097600000000000016777216" + ], + "expectedQty": "6371166461806356373525737" + }, + { + "bAssetQtys": [ + "2330666666666666387046400", + "2330666666666666387046400", + "2330666666666666387046400" + ], + "expectedQty": "7072060493137874105294090" + } + ] + }, + { + "reserve0": "500500000000000000000000", + "reserve1": "3996499999999999360000000", + "reserve2": "5503000000000000000000000", + "A": 120, + "mAssetSupply": "9936488013915504712820075", + "hardMin": 50000000000000000, + "hardMax": 750000000000000000, + "swapFeeRate": 600000000000000, + "mints": [ + { + "bAssetQtys": [ + "3333333333333", + "3333333333333", + "3333333333333" + ], + "expectedQty": "10385912127727" + }, + { + "bAssetQtys": [ + "333333333333333", + "333333333333333", + "333333333333333" + ], + "expectedQty": "1038591212748137" + }, + { + "bAssetQtys": [ + "33333333333333332", + "33333333333333332", + "33333333333333332" + ], + "expectedQty": "103859121028758490" + }, + { + "bAssetQtys": [ + "333333333333333312", + "333333333333333312", + "333333333333333312" + ], + "expectedQty": "1038591187918937221" + }, + { + "bAssetQtys": [ + "3333333333333333504", + "3333333333333333504", + "3333333333333333504" + ], + "expectedQty": "10385909642338954743" + }, + { + "bAssetQtys": [ + "33333333333333336064", + "33333333333333336064", + "33333333333333336064" + ], + "expectedQty": "103858872752693091205" + }, + { + "bAssetQtys": [ + "233066666666666672259072", + "233066666666666672259072", + "233066666666666672259072" + ], + "expectedQty": "717819511157338147988270" + }, + { + "bAssetQtys": [ + "466133333333333344518144", + "466133333333333344518144", + "466133333333333344518144" + ], + "expectedQty": "1426858395787741341108746" + }, + { + "bAssetQtys": [ + "699200000000000050331648", + "699200000000000050331648", + "699200000000000050331648" + ], + "expectedQty": "2132169018987193819175100" + }, + { + "bAssetQtys": [ + "932266666666666689036288", + "932266666666666689036288", + "932266666666666689036288" + ], + "expectedQty": "2835548601135555974061802" + }, + { + "bAssetQtys": [ + "1165333333333333193523200", + "1165333333333333193523200", + "1165333333333333193523200" + ], + "expectedQty": "3537797483589527161733747" + }, + { + "bAssetQtys": [ + "1398400000000000100663296", + "1398400000000000100663296", + "1398400000000000100663296" + ], + "expectedQty": "4239326362763222019077212" + }, + { + "bAssetQtys": [ + "1631466666666666739367936", + "1631466666666666739367936", + "1631466666666666739367936" + ], + "expectedQty": "4940367822219734927726353" + }, + { + "bAssetQtys": [ + "1864533333333333378072576", + "1864533333333333378072576", + "1864533333333333378072576" + ], + "expectedQty": "5641063534359531162361781" + }, + { + "bAssetQtys": [ + "2097600000000000016777216", + "2097600000000000016777216", + "2097600000000000016777216" + ], + "expectedQty": "6341504785730401684633876" + }, + { + "bAssetQtys": [ + "2330666666666666387046400", + "2330666666666666387046400", + "2330666666666666387046400" + ], + "expectedQty": "7041753089676310563468007" + }, + { + "bAssetQtys": [ + "3333333333333", + "3333333333333", + "3333333333333" + ], + "expectedQty": "10385912127727" + }, + { + "bAssetQtys": [ + "333333333333333", + "333333333333333", + "333333333333333" + ], + "expectedQty": "1038591212748137" + }, + { + "bAssetQtys": [ + "33333333333333332", + "33333333333333332", + "33333333333333332" + ], + "expectedQty": "103859121028758490" + }, + { + "bAssetQtys": [ + "333333333333333312", + "333333333333333312", + "333333333333333312" + ], + "expectedQty": "1038591187918937221" + }, + { + "bAssetQtys": [ + "3333333333333333504", + "3333333333333333504", + "3333333333333333504" + ], + "expectedQty": "10385909642338954743" + }, + { + "bAssetQtys": [ + "33333333333333336064", + "33333333333333336064", + "33333333333333336064" + ], + "expectedQty": "103858872752693091205" + }, + { + "bAssetQtys": [ + "233066666666666672259072", + "233066666666666672259072", + "233066666666666672259072" + ], + "expectedQty": "717819511157338147988270" + }, + { + "bAssetQtys": [ + "466133333333333344518144", + "466133333333333344518144", + "466133333333333344518144" + ], + "expectedQty": "1426858395787741341108746" + }, + { + "bAssetQtys": [ + "699200000000000050331648", + "699200000000000050331648", + "699200000000000050331648" + ], + "expectedQty": "2132169018987193819175100" + }, + { + "bAssetQtys": [ + "932266666666666689036288", + "932266666666666689036288", + "932266666666666689036288" + ], + "expectedQty": "2835548601135555974061802" + }, + { + "bAssetQtys": [ + "1165333333333333193523200", + "1165333333333333193523200", + "1165333333333333193523200" + ], + "expectedQty": "3537797483589527161733747" + }, + { + "bAssetQtys": [ + "1398400000000000100663296", + "1398400000000000100663296", + "1398400000000000100663296" + ], + "expectedQty": "4239326362763222019077212" + }, + { + "bAssetQtys": [ + "1631466666666666739367936", + "1631466666666666739367936", + "1631466666666666739367936" + ], + "expectedQty": "4940367822219734927726353" + }, + { + "bAssetQtys": [ + "1864533333333333378072576", + "1864533333333333378072576", + "1864533333333333378072576" + ], + "expectedQty": "5641063534359531162361781" + }, + { + "bAssetQtys": [ + "2097600000000000016777216", + "2097600000000000016777216", + "2097600000000000016777216" + ], + "expectedQty": "6341504785730401684633876" + }, + { + "bAssetQtys": [ + "2330666666666666387046400", + "2330666666666666387046400", + "2330666666666666387046400" + ], + "expectedQty": "7041753089676310563468007" + }, + { + "bAssetQtys": [ + "3333333333333", + "3333333333333", + "3333333333333" + ], + "expectedQty": "10385912127727" + }, + { + "bAssetQtys": [ + "333333333333333", + "333333333333333", + "333333333333333" + ], + "expectedQty": "1038591212748137" + }, + { + "bAssetQtys": [ + "33333333333333332", + "33333333333333332", + "33333333333333332" + ], + "expectedQty": "103859121028758490" + }, + { + "bAssetQtys": [ + "333333333333333312", + "333333333333333312", + "333333333333333312" + ], + "expectedQty": "1038591187918937221" + }, + { + "bAssetQtys": [ + "3333333333333333504", + "3333333333333333504", + "3333333333333333504" + ], + "expectedQty": "10385909642338954743" + }, + { + "bAssetQtys": [ + "33333333333333336064", + "33333333333333336064", + "33333333333333336064" + ], + "expectedQty": "103858872752693091205" + }, + { + "bAssetQtys": [ + "233066666666666672259072", + "233066666666666672259072", + "233066666666666672259072" + ], + "expectedQty": "717819511157338147988270" + }, + { + "bAssetQtys": [ + "466133333333333344518144", + "466133333333333344518144", + "466133333333333344518144" + ], + "expectedQty": "1426858395787741341108746" + }, + { + "bAssetQtys": [ + "699200000000000050331648", + "699200000000000050331648", + "699200000000000050331648" + ], + "expectedQty": "2132169018987193819175100" + }, + { + "bAssetQtys": [ + "932266666666666689036288", + "932266666666666689036288", + "932266666666666689036288" + ], + "expectedQty": "2835548601135555974061802" + }, + { + "bAssetQtys": [ + "1165333333333333193523200", + "1165333333333333193523200", + "1165333333333333193523200" + ], + "expectedQty": "3537797483589527161733747" + }, + { + "bAssetQtys": [ + "1398400000000000100663296", + "1398400000000000100663296", + "1398400000000000100663296" + ], + "expectedQty": "4239326362763222019077212" + }, + { + "bAssetQtys": [ + "1631466666666666739367936", + "1631466666666666739367936", + "1631466666666666739367936" + ], + "expectedQty": "4940367822219734927726353" + }, + { + "bAssetQtys": [ + "1864533333333333378072576", + "1864533333333333378072576", + "1864533333333333378072576" + ], + "expectedQty": "5641063534359531162361781" + }, + { + "bAssetQtys": [ + "2097600000000000016777216", + "2097600000000000016777216", + "2097600000000000016777216" + ], + "expectedQty": "6341504785730401684633876" + }, + { + "bAssetQtys": [ + "2330666666666666387046400", + "2330666666666666387046400", + "2330666666666666387046400" + ], + "expectedQty": "7041753089676310563468007" + } + ] + }, + { + "reserve0": "500500000000000000000000", + "reserve1": "7492500000000000000000000", + "reserve2": "2007000000000000000000000", + "A": 120, + "mAssetSupply": "9896372713490403790662354", + "hardMin": 50000000000000000, + "hardMax": 750000000000000000, + "swapFeeRate": 600000000000000, + "mints": [ + { + "bAssetQtys": [ + "3333333333333", + "3333333333333", + "3333333333333" + ], + "expectedQty": "10616212599789" + }, + { + "bAssetQtys": [ + "333333333333333", + "333333333333333", + "333333333333333" + ], + "expectedQty": "1061621259940193" + }, + { + "bAssetQtys": [ + "33333333333333332", + "33333333333333332", + "33333333333333332" + ], + "expectedQty": "106162125606333410" + }, + { + "bAssetQtys": [ + "333333333333333312", + "333333333333333312", + "333333333333333312" + ], + "expectedQty": "1061621220819182343" + }, + { + "bAssetQtys": [ + "3333333333333333504", + "3333333333333333504", + "3333333333333333504" + ], + "expectedQty": "10616208683798909905" + }, + { + "bAssetQtys": [ + "33333333333333336064", + "33333333333333336064", + "33333333333333336064" + ], + "expectedQty": "106161734420953940818" + }, + { + "bAssetQtys": [ + "233066666666666672259072", + "233066666666666672259072", + "233066666666666672259072" + ], + "expectedQty": "729045507934045981147445" + }, + { + "bAssetQtys": [ + "466133333333333344518144", + "466133333333333344518144", + "466133333333333344518144" + ], + "expectedQty": "1444093165885337491540905" + }, + { + "bAssetQtys": [ + "699200000000000050331648", + "699200000000000050331648", + "699200000000000050331648" + ], + "expectedQty": "2153151422959607051690973" + }, + { + "bAssetQtys": [ + "932266666666666689036288", + "932266666666666689036288", + "932266666666666689036288" + ], + "expectedQty": "2859096981577989191295531" + }, + { + "bAssetQtys": [ + "1165333333333333193523200", + "1165333333333333193523200", + "1165333333333333193523200" + ], + "expectedQty": "3563217561037023690548355" + }, + { + "bAssetQtys": [ + "1398400000000000100663296", + "1398400000000000100663296", + "1398400000000000100663296" + ], + "expectedQty": "4266175833285971337758877" + }, + { + "bAssetQtys": [ + "1631466666666666739367936", + "1631466666666666739367936", + "1631466666666666739367936" + ], + "expectedQty": "4968347620679184766532063" + }, + { + "bAssetQtys": [ + "1864533333333333378072576", + "1864533333333333378072576", + "1864533333333333378072576" + ], + "expectedQty": "5669961970717048793425226" + }, + { + "bAssetQtys": [ + "2097600000000000016777216", + "2097600000000000016777216", + "2097600000000000016777216" + ], + "expectedQty": "6371166461806356373525737" + }, + { + "bAssetQtys": [ + "2330666666666666387046400", + "2330666666666666387046400", + "2330666666666666387046400" + ], + "expectedQty": "7072060493137874105294090" + }, + { + "bAssetQtys": [ + "3333333333333", + "3333333333333", + "3333333333333" + ], + "expectedQty": "10616212599789" + }, + { + "bAssetQtys": [ + "333333333333333", + "333333333333333", + "333333333333333" + ], + "expectedQty": "1061621259940193" + }, + { + "bAssetQtys": [ + "33333333333333332", + "33333333333333332", + "33333333333333332" + ], + "expectedQty": "106162125606333410" + }, + { + "bAssetQtys": [ + "333333333333333312", + "333333333333333312", + "333333333333333312" + ], + "expectedQty": "1061621220819182343" + }, + { + "bAssetQtys": [ + "3333333333333333504", + "3333333333333333504", + "3333333333333333504" + ], + "expectedQty": "10616208683798909905" + }, + { + "bAssetQtys": [ + "33333333333333336064", + "33333333333333336064", + "33333333333333336064" + ], + "expectedQty": "106161734420953940818" + }, + { + "bAssetQtys": [ + "233066666666666672259072", + "233066666666666672259072", + "233066666666666672259072" + ], + "expectedQty": "729045507934045981147445" + }, + { + "bAssetQtys": [ + "466133333333333344518144", + "466133333333333344518144", + "466133333333333344518144" + ], + "expectedQty": "1444093165885337491540905" + }, + { + "bAssetQtys": [ + "699200000000000050331648", + "699200000000000050331648", + "699200000000000050331648" + ], + "expectedQty": "2153151422959607051690973" + }, + { + "bAssetQtys": [ + "932266666666666689036288", + "932266666666666689036288", + "932266666666666689036288" + ], + "expectedQty": "2859096981577989191295531" + }, + { + "bAssetQtys": [ + "1165333333333333193523200", + "1165333333333333193523200", + "1165333333333333193523200" + ], + "expectedQty": "3563217561037023690548355" + }, + { + "bAssetQtys": [ + "1398400000000000100663296", + "1398400000000000100663296", + "1398400000000000100663296" + ], + "expectedQty": "4266175833285971337758877" + }, + { + "bAssetQtys": [ + "1631466666666666739367936", + "1631466666666666739367936", + "1631466666666666739367936" + ], + "expectedQty": "4968347620679184766532063" + }, + { + "bAssetQtys": [ + "1864533333333333378072576", + "1864533333333333378072576", + "1864533333333333378072576" + ], + "expectedQty": "5669961970717048793425226" + }, + { + "bAssetQtys": [ + "2097600000000000016777216", + "2097600000000000016777216", + "2097600000000000016777216" + ], + "expectedQty": "6371166461806356373525737" + }, + { + "bAssetQtys": [ + "2330666666666666387046400", + "2330666666666666387046400", + "2330666666666666387046400" + ], + "expectedQty": "7072060493137874105294090" + }, + { + "bAssetQtys": [ + "3333333333333", + "3333333333333", + "3333333333333" + ], + "expectedQty": "10616212599789" + }, + { + "bAssetQtys": [ + "333333333333333", + "333333333333333", + "333333333333333" + ], + "expectedQty": "1061621259940193" + }, + { + "bAssetQtys": [ + "33333333333333332", + "33333333333333332", + "33333333333333332" + ], + "expectedQty": "106162125606333410" + }, + { + "bAssetQtys": [ + "333333333333333312", + "333333333333333312", + "333333333333333312" + ], + "expectedQty": "1061621220819182343" + }, + { + "bAssetQtys": [ + "3333333333333333504", + "3333333333333333504", + "3333333333333333504" + ], + "expectedQty": "10616208683798909905" + }, + { + "bAssetQtys": [ + "33333333333333336064", + "33333333333333336064", + "33333333333333336064" + ], + "expectedQty": "106161734420953940818" + }, + { + "bAssetQtys": [ + "233066666666666672259072", + "233066666666666672259072", + "233066666666666672259072" + ], + "expectedQty": "729045507934045981147445" + }, + { + "bAssetQtys": [ + "466133333333333344518144", + "466133333333333344518144", + "466133333333333344518144" + ], + "expectedQty": "1444093165885337491540905" + }, + { + "bAssetQtys": [ + "699200000000000050331648", + "699200000000000050331648", + "699200000000000050331648" + ], + "expectedQty": "2153151422959607051690973" + }, + { + "bAssetQtys": [ + "932266666666666689036288", + "932266666666666689036288", + "932266666666666689036288" + ], + "expectedQty": "2859096981577989191295531" + }, + { + "bAssetQtys": [ + "1165333333333333193523200", + "1165333333333333193523200", + "1165333333333333193523200" + ], + "expectedQty": "3563217561037023690548355" + }, + { + "bAssetQtys": [ + "1398400000000000100663296", + "1398400000000000100663296", + "1398400000000000100663296" + ], + "expectedQty": "4266175833285971337758877" + }, + { + "bAssetQtys": [ + "1631466666666666739367936", + "1631466666666666739367936", + "1631466666666666739367936" + ], + "expectedQty": "4968347620679184766532063" + }, + { + "bAssetQtys": [ + "1864533333333333378072576", + "1864533333333333378072576", + "1864533333333333378072576" + ], + "expectedQty": "5669961970717048793425226" + }, + { + "bAssetQtys": [ + "2097600000000000016777216", + "2097600000000000016777216", + "2097600000000000016777216" + ], + "expectedQty": "6371166461806356373525737" + }, + { + "bAssetQtys": [ + "2330666666666666387046400", + "2330666666666666387046400", + "2330666666666666387046400" + ], + "expectedQty": "7072060493137874105294090" + } + ] + }, + { + "reserve0": "3996499999999999360000000", + "reserve1": "500500000000000000000000", + "reserve2": "5503000000000000000000000", + "A": 120, + "mAssetSupply": "9936488013915504712820075", + "hardMin": 50000000000000000, + "hardMax": 750000000000000000, + "swapFeeRate": 600000000000000, + "mints": [ + { + "bAssetQtys": [ + "3333333333333", + "3333333333333", + "3333333333333" + ], + "expectedQty": "10385912127727" + }, + { + "bAssetQtys": [ + "333333333333333", + "333333333333333", + "333333333333333" + ], + "expectedQty": "1038591212748137" + }, + { + "bAssetQtys": [ + "33333333333333332", + "33333333333333332", + "33333333333333332" + ], + "expectedQty": "103859121028758490" + }, + { + "bAssetQtys": [ + "333333333333333312", + "333333333333333312", + "333333333333333312" + ], + "expectedQty": "1038591187918937221" + }, + { + "bAssetQtys": [ + "3333333333333333504", + "3333333333333333504", + "3333333333333333504" + ], + "expectedQty": "10385909642338954743" + }, + { + "bAssetQtys": [ + "33333333333333336064", + "33333333333333336064", + "33333333333333336064" + ], + "expectedQty": "103858872752693091205" + }, + { + "bAssetQtys": [ + "233066666666666672259072", + "233066666666666672259072", + "233066666666666672259072" + ], + "expectedQty": "717819511157338147988270" + }, + { + "bAssetQtys": [ + "466133333333333344518144", + "466133333333333344518144", + "466133333333333344518144" + ], + "expectedQty": "1426858395787741341108746" + }, + { + "bAssetQtys": [ + "699200000000000050331648", + "699200000000000050331648", + "699200000000000050331648" + ], + "expectedQty": "2132169018987193819175100" + }, + { + "bAssetQtys": [ + "932266666666666689036288", + "932266666666666689036288", + "932266666666666689036288" + ], + "expectedQty": "2835548601135555974061802" + }, + { + "bAssetQtys": [ + "1165333333333333193523200", + "1165333333333333193523200", + "1165333333333333193523200" + ], + "expectedQty": "3537797483589527161733747" + }, + { + "bAssetQtys": [ + "1398400000000000100663296", + "1398400000000000100663296", + "1398400000000000100663296" + ], + "expectedQty": "4239326362763222019077212" + }, + { + "bAssetQtys": [ + "1631466666666666739367936", + "1631466666666666739367936", + "1631466666666666739367936" + ], + "expectedQty": "4940367822219734927726353" + }, + { + "bAssetQtys": [ + "1864533333333333378072576", + "1864533333333333378072576", + "1864533333333333378072576" + ], + "expectedQty": "5641063534359531162361781" + }, + { + "bAssetQtys": [ + "2097600000000000016777216", + "2097600000000000016777216", + "2097600000000000016777216" + ], + "expectedQty": "6341504785730401684633876" + }, + { + "bAssetQtys": [ + "2330666666666666387046400", + "2330666666666666387046400", + "2330666666666666387046400" + ], + "expectedQty": "7041753089676310563468007" + }, + { + "bAssetQtys": [ + "3333333333333", + "3333333333333", + "3333333333333" + ], + "expectedQty": "10385912127727" + }, + { + "bAssetQtys": [ + "333333333333333", + "333333333333333", + "333333333333333" + ], + "expectedQty": "1038591212748137" + }, + { + "bAssetQtys": [ + "33333333333333332", + "33333333333333332", + "33333333333333332" + ], + "expectedQty": "103859121028758490" + }, + { + "bAssetQtys": [ + "333333333333333312", + "333333333333333312", + "333333333333333312" + ], + "expectedQty": "1038591187918937221" + }, + { + "bAssetQtys": [ + "3333333333333333504", + "3333333333333333504", + "3333333333333333504" + ], + "expectedQty": "10385909642338954743" + }, + { + "bAssetQtys": [ + "33333333333333336064", + "33333333333333336064", + "33333333333333336064" + ], + "expectedQty": "103858872752693091205" + }, + { + "bAssetQtys": [ + "233066666666666672259072", + "233066666666666672259072", + "233066666666666672259072" + ], + "expectedQty": "717819511157338147988270" + }, + { + "bAssetQtys": [ + "466133333333333344518144", + "466133333333333344518144", + "466133333333333344518144" + ], + "expectedQty": "1426858395787741341108746" + }, + { + "bAssetQtys": [ + "699200000000000050331648", + "699200000000000050331648", + "699200000000000050331648" + ], + "expectedQty": "2132169018987193819175100" + }, + { + "bAssetQtys": [ + "932266666666666689036288", + "932266666666666689036288", + "932266666666666689036288" + ], + "expectedQty": "2835548601135555974061802" + }, + { + "bAssetQtys": [ + "1165333333333333193523200", + "1165333333333333193523200", + "1165333333333333193523200" + ], + "expectedQty": "3537797483589527161733747" + }, + { + "bAssetQtys": [ + "1398400000000000100663296", + "1398400000000000100663296", + "1398400000000000100663296" + ], + "expectedQty": "4239326362763222019077212" + }, + { + "bAssetQtys": [ + "1631466666666666739367936", + "1631466666666666739367936", + "1631466666666666739367936" + ], + "expectedQty": "4940367822219734927726353" + }, + { + "bAssetQtys": [ + "1864533333333333378072576", + "1864533333333333378072576", + "1864533333333333378072576" + ], + "expectedQty": "5641063534359531162361781" + }, + { + "bAssetQtys": [ + "2097600000000000016777216", + "2097600000000000016777216", + "2097600000000000016777216" + ], + "expectedQty": "6341504785730401684633876" + }, + { + "bAssetQtys": [ + "2330666666666666387046400", + "2330666666666666387046400", + "2330666666666666387046400" + ], + "expectedQty": "7041753089676310563468007" + }, + { + "bAssetQtys": [ + "3333333333333", + "3333333333333", + "3333333333333" + ], + "expectedQty": "10385912127727" + }, + { + "bAssetQtys": [ + "333333333333333", + "333333333333333", + "333333333333333" + ], + "expectedQty": "1038591212748137" + }, + { + "bAssetQtys": [ + "33333333333333332", + "33333333333333332", + "33333333333333332" + ], + "expectedQty": "103859121028758490" + }, + { + "bAssetQtys": [ + "333333333333333312", + "333333333333333312", + "333333333333333312" + ], + "expectedQty": "1038591187918937221" + }, + { + "bAssetQtys": [ + "3333333333333333504", + "3333333333333333504", + "3333333333333333504" + ], + "expectedQty": "10385909642338954743" + }, + { + "bAssetQtys": [ + "33333333333333336064", + "33333333333333336064", + "33333333333333336064" + ], + "expectedQty": "103858872752693091205" + }, + { + "bAssetQtys": [ + "233066666666666672259072", + "233066666666666672259072", + "233066666666666672259072" + ], + "expectedQty": "717819511157338147988270" + }, + { + "bAssetQtys": [ + "466133333333333344518144", + "466133333333333344518144", + "466133333333333344518144" + ], + "expectedQty": "1426858395787741341108746" + }, + { + "bAssetQtys": [ + "699200000000000050331648", + "699200000000000050331648", + "699200000000000050331648" + ], + "expectedQty": "2132169018987193819175100" + }, + { + "bAssetQtys": [ + "932266666666666689036288", + "932266666666666689036288", + "932266666666666689036288" + ], + "expectedQty": "2835548601135555974061802" + }, + { + "bAssetQtys": [ + "1165333333333333193523200", + "1165333333333333193523200", + "1165333333333333193523200" + ], + "expectedQty": "3537797483589527161733747" + }, + { + "bAssetQtys": [ + "1398400000000000100663296", + "1398400000000000100663296", + "1398400000000000100663296" + ], + "expectedQty": "4239326362763222019077212" + }, + { + "bAssetQtys": [ + "1631466666666666739367936", + "1631466666666666739367936", + "1631466666666666739367936" + ], + "expectedQty": "4940367822219734927726353" + }, + { + "bAssetQtys": [ + "1864533333333333378072576", + "1864533333333333378072576", + "1864533333333333378072576" + ], + "expectedQty": "5641063534359531162361781" + }, + { + "bAssetQtys": [ + "2097600000000000016777216", + "2097600000000000016777216", + "2097600000000000016777216" + ], + "expectedQty": "6341504785730401684633876" + }, + { + "bAssetQtys": [ + "2330666666666666387046400", + "2330666666666666387046400", + "2330666666666666387046400" + ], + "expectedQty": "7041753089676310563468007" + } + ] + }, + { + "reserve0": "3996499999999999360000000", + "reserve1": "3996499999999999360000000", + "reserve2": "2007000000000000960000000", + "A": 120, + "mAssetSupply": "9995726520619110731126433", + "hardMin": 50000000000000000, + "hardMax": 750000000000000000, + "swapFeeRate": 600000000000000, + "mints": [ + { + "bAssetQtys": [ + "3333333333333", + "3333333333333", + "3333333333333" + ], + "expectedQty": "10006162027981" + }, + { + "bAssetQtys": [ + "333333333333333", + "333333333333333", + "333333333333333" + ], + "expectedQty": "1000616202798095" + }, + { + "bAssetQtys": [ + "33333333333333332", + "33333333333333332", + "33333333333333332" + ], + "expectedQty": "100061620278871720" + }, + { + "bAssetQtys": [ + "333333333333333312", + "333333333333333312", + "333333333333333312" + ], + "expectedQty": "1000616202703457733" + }, + { + "bAssetQtys": [ + "3333333333333333504", + "3333333333333333504", + "3333333333333333504" + ], + "expectedQty": "10006162018508647736" + }, + { + "bAssetQtys": [ + "33333333333333336064", + "33333333333333336064", + "33333333333333336064" + ], + "expectedQty": "100061619332506863358" + }, + { + "bAssetQtys": [ + "233066666666666672259072", + "233066666666666672259072", + "233066666666666672259072" + ], + "expectedQty": "699589172569064088513914" + }, + { + "bAssetQtys": [ + "466133333333333344518144", + "466133333333333344518144", + "466133333333333344518144" + ], + "expectedQty": "1399110113009977714491450" + }, + { + "bAssetQtys": [ + "699200000000000050331648", + "699200000000000050331648", + "699200000000000050331648" + ], + "expectedQty": "2098579763704496996113493" + }, + { + "bAssetQtys": [ + "932266666666666689036288", + "932266666666666689036288", + "932266666666666689036288" + ], + "expectedQty": "2798009813075099253271636" + }, + { + "bAssetQtys": [ + "1165333333333333193523200", + "1165333333333333193523200", + "1165333333333333193523200" + ], + "expectedQty": "3497408599942144636779437" + }, + { + "bAssetQtys": [ + "1398400000000000100663296", + "1398400000000000100663296", + "1398400000000000100663296" + ], + "expectedQty": "4196782242397675221053972" + }, + { + "bAssetQtys": [ + "1631466666666666739367936", + "1631466666666666739367936", + "1631466666666666739367936" + ], + "expectedQty": "4896135336985582089078779" + }, + { + "bAssetQtys": [ + "1864533333333333378072576", + "1864533333333333378072576", + "1864533333333333378072576" + ], + "expectedQty": "5595471408100876355649496" + }, + { + "bAssetQtys": [ + "2097600000000000016777216", + "2097600000000000016777216", + "2097600000000000016777216" + ], + "expectedQty": "6294793206161822055345982" + }, + { + "bAssetQtys": [ + "2330666666666666387046400", + "2330666666666666387046400", + "2330666666666666387046400" + ], + "expectedQty": "6994102910962511597493255" + }, + { + "bAssetQtys": [ + "3333333333333", + "3333333333333", + "3333333333333" + ], + "expectedQty": "10006162027981" + }, + { + "bAssetQtys": [ + "333333333333333", + "333333333333333", + "333333333333333" + ], + "expectedQty": "1000616202798095" + }, + { + "bAssetQtys": [ + "33333333333333332", + "33333333333333332", + "33333333333333332" + ], + "expectedQty": "100061620278871720" + }, + { + "bAssetQtys": [ + "333333333333333312", + "333333333333333312", + "333333333333333312" + ], + "expectedQty": "1000616202703457733" + }, + { + "bAssetQtys": [ + "3333333333333333504", + "3333333333333333504", + "3333333333333333504" + ], + "expectedQty": "10006162018508647736" + }, + { + "bAssetQtys": [ + "33333333333333336064", + "33333333333333336064", + "33333333333333336064" + ], + "expectedQty": "100061619332506863358" + }, + { + "bAssetQtys": [ + "233066666666666672259072", + "233066666666666672259072", + "233066666666666672259072" + ], + "expectedQty": "699589172569064088513914" + }, + { + "bAssetQtys": [ + "466133333333333344518144", + "466133333333333344518144", + "466133333333333344518144" + ], + "expectedQty": "1399110113009977714491450" + }, + { + "bAssetQtys": [ + "699200000000000050331648", + "699200000000000050331648", + "699200000000000050331648" + ], + "expectedQty": "2098579763704496996113493" + }, + { + "bAssetQtys": [ + "932266666666666689036288", + "932266666666666689036288", + "932266666666666689036288" + ], + "expectedQty": "2798009813075099253271636" + }, + { + "bAssetQtys": [ + "1165333333333333193523200", + "1165333333333333193523200", + "1165333333333333193523200" + ], + "expectedQty": "3497408599942144636779437" + }, + { + "bAssetQtys": [ + "1398400000000000100663296", + "1398400000000000100663296", + "1398400000000000100663296" + ], + "expectedQty": "4196782242397675221053972" + }, + { + "bAssetQtys": [ + "1631466666666666739367936", + "1631466666666666739367936", + "1631466666666666739367936" + ], + "expectedQty": "4896135336985582089078779" + }, + { + "bAssetQtys": [ + "1864533333333333378072576", + "1864533333333333378072576", + "1864533333333333378072576" + ], + "expectedQty": "5595471408100876355649496" + }, + { + "bAssetQtys": [ + "2097600000000000016777216", + "2097600000000000016777216", + "2097600000000000016777216" + ], + "expectedQty": "6294793206161822055345982" + }, + { + "bAssetQtys": [ + "2330666666666666387046400", + "2330666666666666387046400", + "2330666666666666387046400" + ], + "expectedQty": "6994102910962511597493255" + }, + { + "bAssetQtys": [ + "3333333333333", + "3333333333333", + "3333333333333" + ], + "expectedQty": "10006162027981" + }, + { + "bAssetQtys": [ + "333333333333333", + "333333333333333", + "333333333333333" + ], + "expectedQty": "1000616202798095" + }, + { + "bAssetQtys": [ + "33333333333333332", + "33333333333333332", + "33333333333333332" + ], + "expectedQty": "100061620278871720" + }, + { + "bAssetQtys": [ + "333333333333333312", + "333333333333333312", + "333333333333333312" + ], + "expectedQty": "1000616202703457733" + }, + { + "bAssetQtys": [ + "3333333333333333504", + "3333333333333333504", + "3333333333333333504" + ], + "expectedQty": "10006162018508647736" + }, + { + "bAssetQtys": [ + "33333333333333336064", + "33333333333333336064", + "33333333333333336064" + ], + "expectedQty": "100061619332506863358" + }, + { + "bAssetQtys": [ + "233066666666666672259072", + "233066666666666672259072", + "233066666666666672259072" + ], + "expectedQty": "699589172569064088513914" + }, + { + "bAssetQtys": [ + "466133333333333344518144", + "466133333333333344518144", + "466133333333333344518144" + ], + "expectedQty": "1399110113009977714491450" + }, + { + "bAssetQtys": [ + "699200000000000050331648", + "699200000000000050331648", + "699200000000000050331648" + ], + "expectedQty": "2098579763704496996113493" + }, + { + "bAssetQtys": [ + "932266666666666689036288", + "932266666666666689036288", + "932266666666666689036288" + ], + "expectedQty": "2798009813075099253271636" + }, + { + "bAssetQtys": [ + "1165333333333333193523200", + "1165333333333333193523200", + "1165333333333333193523200" + ], + "expectedQty": "3497408599942144636779437" + }, + { + "bAssetQtys": [ + "1398400000000000100663296", + "1398400000000000100663296", + "1398400000000000100663296" + ], + "expectedQty": "4196782242397675221053972" + }, + { + "bAssetQtys": [ + "1631466666666666739367936", + "1631466666666666739367936", + "1631466666666666739367936" + ], + "expectedQty": "4896135336985582089078779" + }, + { + "bAssetQtys": [ + "1864533333333333378072576", + "1864533333333333378072576", + "1864533333333333378072576" + ], + "expectedQty": "5595471408100876355649496" + }, + { + "bAssetQtys": [ + "2097600000000000016777216", + "2097600000000000016777216", + "2097600000000000016777216" + ], + "expectedQty": "6294793206161822055345982" + }, + { + "bAssetQtys": [ + "2330666666666666387046400", + "2330666666666666387046400", + "2330666666666666387046400" + ], + "expectedQty": "6994102910962511597493255" + } + ] + }, + { + "reserve0": "7492500000000000000000000", + "reserve1": "500500000000000000000000", + "reserve2": "2007000000000000000000000", + "A": 120, + "mAssetSupply": "9896372713490403790662354", + "hardMin": 50000000000000000, + "hardMax": 750000000000000000, + "swapFeeRate": 600000000000000, + "mints": [ + { + "bAssetQtys": [ + "3333333333333", + "3333333333333", + "3333333333333" + ], + "expectedQty": "10616212599789" + }, + { + "bAssetQtys": [ + "333333333333333", + "333333333333333", + "333333333333333" + ], + "expectedQty": "1061621259940193" + }, + { + "bAssetQtys": [ + "33333333333333332", + "33333333333333332", + "33333333333333332" + ], + "expectedQty": "106162125606333410" + }, + { + "bAssetQtys": [ + "333333333333333312", + "333333333333333312", + "333333333333333312" + ], + "expectedQty": "1061621220819182343" + }, + { + "bAssetQtys": [ + "3333333333333333504", + "3333333333333333504", + "3333333333333333504" + ], + "expectedQty": "10616208683798909905" + }, + { + "bAssetQtys": [ + "33333333333333336064", + "33333333333333336064", + "33333333333333336064" + ], + "expectedQty": "106161734420953940818" + }, + { + "bAssetQtys": [ + "233066666666666672259072", + "233066666666666672259072", + "233066666666666672259072" + ], + "expectedQty": "729045507934045981147445" + }, + { + "bAssetQtys": [ + "466133333333333344518144", + "466133333333333344518144", + "466133333333333344518144" + ], + "expectedQty": "1444093165885337491540905" + }, + { + "bAssetQtys": [ + "699200000000000050331648", + "699200000000000050331648", + "699200000000000050331648" + ], + "expectedQty": "2153151422959607051690973" + }, + { + "bAssetQtys": [ + "932266666666666689036288", + "932266666666666689036288", + "932266666666666689036288" + ], + "expectedQty": "2859096981577989191295531" + }, + { + "bAssetQtys": [ + "1165333333333333193523200", + "1165333333333333193523200", + "1165333333333333193523200" + ], + "expectedQty": "3563217561037023690548355" + }, + { + "bAssetQtys": [ + "1398400000000000100663296", + "1398400000000000100663296", + "1398400000000000100663296" + ], + "expectedQty": "4266175833285971337758877" + }, + { + "bAssetQtys": [ + "1631466666666666739367936", + "1631466666666666739367936", + "1631466666666666739367936" + ], + "expectedQty": "4968347620679184766532063" + }, + { + "bAssetQtys": [ + "1864533333333333378072576", + "1864533333333333378072576", + "1864533333333333378072576" + ], + "expectedQty": "5669961970717048793425226" + }, + { + "bAssetQtys": [ + "2097600000000000016777216", + "2097600000000000016777216", + "2097600000000000016777216" + ], + "expectedQty": "6371166461806356373525737" + }, + { + "bAssetQtys": [ + "2330666666666666387046400", + "2330666666666666387046400", + "2330666666666666387046400" + ], + "expectedQty": "7072060493137874105294090" + }, + { + "bAssetQtys": [ + "3333333333333", + "3333333333333", + "3333333333333" + ], + "expectedQty": "10616212599789" + }, + { + "bAssetQtys": [ + "333333333333333", + "333333333333333", + "333333333333333" + ], + "expectedQty": "1061621259940193" + }, + { + "bAssetQtys": [ + "33333333333333332", + "33333333333333332", + "33333333333333332" + ], + "expectedQty": "106162125606333410" + }, + { + "bAssetQtys": [ + "333333333333333312", + "333333333333333312", + "333333333333333312" + ], + "expectedQty": "1061621220819182343" + }, + { + "bAssetQtys": [ + "3333333333333333504", + "3333333333333333504", + "3333333333333333504" + ], + "expectedQty": "10616208683798909905" + }, + { + "bAssetQtys": [ + "33333333333333336064", + "33333333333333336064", + "33333333333333336064" + ], + "expectedQty": "106161734420953940818" + }, + { + "bAssetQtys": [ + "233066666666666672259072", + "233066666666666672259072", + "233066666666666672259072" + ], + "expectedQty": "729045507934045981147445" + }, + { + "bAssetQtys": [ + "466133333333333344518144", + "466133333333333344518144", + "466133333333333344518144" + ], + "expectedQty": "1444093165885337491540905" + }, + { + "bAssetQtys": [ + "699200000000000050331648", + "699200000000000050331648", + "699200000000000050331648" + ], + "expectedQty": "2153151422959607051690973" + }, + { + "bAssetQtys": [ + "932266666666666689036288", + "932266666666666689036288", + "932266666666666689036288" + ], + "expectedQty": "2859096981577989191295531" + }, + { + "bAssetQtys": [ + "1165333333333333193523200", + "1165333333333333193523200", + "1165333333333333193523200" + ], + "expectedQty": "3563217561037023690548355" + }, + { + "bAssetQtys": [ + "1398400000000000100663296", + "1398400000000000100663296", + "1398400000000000100663296" + ], + "expectedQty": "4266175833285971337758877" + }, + { + "bAssetQtys": [ + "1631466666666666739367936", + "1631466666666666739367936", + "1631466666666666739367936" + ], + "expectedQty": "4968347620679184766532063" + }, + { + "bAssetQtys": [ + "1864533333333333378072576", + "1864533333333333378072576", + "1864533333333333378072576" + ], + "expectedQty": "5669961970717048793425226" + }, + { + "bAssetQtys": [ + "2097600000000000016777216", + "2097600000000000016777216", + "2097600000000000016777216" + ], + "expectedQty": "6371166461806356373525737" + }, + { + "bAssetQtys": [ + "2330666666666666387046400", + "2330666666666666387046400", + "2330666666666666387046400" + ], + "expectedQty": "7072060493137874105294090" + }, + { + "bAssetQtys": [ + "3333333333333", + "3333333333333", + "3333333333333" + ], + "expectedQty": "10616212599789" + }, + { + "bAssetQtys": [ + "333333333333333", + "333333333333333", + "333333333333333" + ], + "expectedQty": "1061621259940193" + }, + { + "bAssetQtys": [ + "33333333333333332", + "33333333333333332", + "33333333333333332" + ], + "expectedQty": "106162125606333410" + }, + { + "bAssetQtys": [ + "333333333333333312", + "333333333333333312", + "333333333333333312" + ], + "expectedQty": "1061621220819182343" + }, + { + "bAssetQtys": [ + "3333333333333333504", + "3333333333333333504", + "3333333333333333504" + ], + "expectedQty": "10616208683798909905" + }, + { + "bAssetQtys": [ + "33333333333333336064", + "33333333333333336064", + "33333333333333336064" + ], + "expectedQty": "106161734420953940818" + }, + { + "bAssetQtys": [ + "233066666666666672259072", + "233066666666666672259072", + "233066666666666672259072" + ], + "expectedQty": "729045507934045981147445" + }, + { + "bAssetQtys": [ + "466133333333333344518144", + "466133333333333344518144", + "466133333333333344518144" + ], + "expectedQty": "1444093165885337491540905" + }, + { + "bAssetQtys": [ + "699200000000000050331648", + "699200000000000050331648", + "699200000000000050331648" + ], + "expectedQty": "2153151422959607051690973" + }, + { + "bAssetQtys": [ + "932266666666666689036288", + "932266666666666689036288", + "932266666666666689036288" + ], + "expectedQty": "2859096981577989191295531" + }, + { + "bAssetQtys": [ + "1165333333333333193523200", + "1165333333333333193523200", + "1165333333333333193523200" + ], + "expectedQty": "3563217561037023690548355" + }, + { + "bAssetQtys": [ + "1398400000000000100663296", + "1398400000000000100663296", + "1398400000000000100663296" + ], + "expectedQty": "4266175833285971337758877" + }, + { + "bAssetQtys": [ + "1631466666666666739367936", + "1631466666666666739367936", + "1631466666666666739367936" + ], + "expectedQty": "4968347620679184766532063" + }, + { + "bAssetQtys": [ + "1864533333333333378072576", + "1864533333333333378072576", + "1864533333333333378072576" + ], + "expectedQty": "5669961970717048793425226" + }, + { + "bAssetQtys": [ + "2097600000000000016777216", + "2097600000000000016777216", + "2097600000000000016777216" + ], + "expectedQty": "6371166461806356373525737" + }, + { + "bAssetQtys": [ + "2330666666666666387046400", + "2330666666666666387046400", + "2330666666666666387046400" + ], + "expectedQty": "7072060493137874105294090" + } + ] + } +] \ No newline at end of file diff --git a/test-utils/validator-data/full/mintTestData.json b/test-utils/validator-data/full/mintTestData.json new file mode 100644 index 00000000..b5c6c892 --- /dev/null +++ b/test-utils/validator-data/full/mintTestData.json @@ -0,0 +1,4262 @@ +[ + { + "reserve0": "5503000000000000000000000", + "reserve1": "500500000000000000000000", + "reserve2": "3996499999999999360000000", + "A": 120, + "mAssetSupply": "9936488013915504712820075", + "hardMin": 50000000000000000, + "hardMax": 750000000000000000, + "swapFeeRate": 600000000000000, + "mints": [ + { + "bAssetIndex": 0, + "bAssetQty": "10000000000000", + "expectedQty": "9832251954605", + "priceReceived": 1.0170609994708724 + }, + { + "bAssetIndex": 0, + "bAssetQty": "1000000000000000", + "expectedQty": "983225195458701", + "priceReceived": 1.0170609994727333 + }, + { + "bAssetIndex": 0, + "bAssetQty": "100000000000000000", + "expectedQty": "98322519528556775", + "priceReceived": 1.0170609996518245 + }, + { + "bAssetIndex": 0, + "bAssetQty": "1000000000000000000", + "expectedQty": "983225193711637753", + "priceReceived": 1.0170610012799184 + }, + { + "bAssetIndex": 0, + "bAssetQty": "10000000000000000000", + "expectedQty": "9832251779723363751", + "priceReceived": 1.0170610175608579 + }, + { + "bAssetIndex": 0, + "bAssetQty": "100000000000000000000", + "expectedQty": "98322502057917477303", + "priceReceived": 1.0170611803704344 + }, + { + "bAssetIndex": 0, + "bAssetQty": "699200000000000050331648", + "hardLimitError": true + }, + { + "bAssetIndex": 0, + "bAssetQty": "1398400000000000100663296", + "hardLimitError": true + }, + { + "bAssetIndex": 0, + "bAssetQty": "2097600000000000016777216", + "hardLimitError": true + }, + { + "bAssetIndex": 0, + "bAssetQty": "2796800000000000201326592", + "hardLimitError": true + }, + { + "bAssetIndex": 0, + "bAssetQty": "3496000000000000117440512", + "hardLimitError": true + }, + { + "bAssetIndex": 0, + "bAssetQty": "4195200000000000033554432", + "hardLimitError": true + }, + { + "bAssetIndex": 0, + "bAssetQty": "4894399999999999949668352", + "hardLimitError": true + }, + { + "bAssetIndex": 0, + "bAssetQty": "5593600000000000402653184", + "hardLimitError": true + }, + { + "bAssetIndex": 0, + "bAssetQty": "6292799999999999781896192", + "hardLimitError": true + }, + { + "bAssetIndex": 0, + "bAssetQty": "6992000000000000234881024", + "hardLimitError": true + }, + { + "bAssetIndex": 1, + "bAssetQty": "10000000000000", + "expectedQty": "11432866386092", + "priceReceived": 0.8746712908466182 + }, + { + "bAssetIndex": 1, + "bAssetQty": "1000000000000000", + "expectedQty": "1143286638334208", + "priceReceived": 0.8746712910570007 + }, + { + "bAssetIndex": 1, + "bAssetQty": "100000000000000000", + "expectedQty": "114328661083569904", + "priceReceived": 0.8746713120947319 + }, + { + "bAssetIndex": 1, + "bAssetQty": "1000000000000000000", + "expectedQty": "1143286360849746210", + "priceReceived": 0.874671503346503 + }, + { + "bAssetIndex": 1, + "bAssetQty": "10000000000000000000", + "expectedQty": "11432838610381658208", + "priceReceived": 0.8746734158321311 + }, + { + "bAssetIndex": 1, + "bAssetQty": "100000000000000000000", + "expectedQty": "114325886771621960149", + "priceReceived": 0.8746925374806894 + }, + { + "bAssetIndex": 1, + "bAssetQty": "699200000000000050331648", + "expectedQty": "741678171179218686429800", + "priceReceived": 0.9427269497338971 + }, + { + "bAssetIndex": 1, + "bAssetQty": "1398400000000000100663296", + "expectedQty": "1452105731306633575856596", + "priceReceived": 0.9630152748875194 + }, + { + "bAssetIndex": 1, + "bAssetQty": "2097600000000000016777216", + "expectedQty": "2156200194980878262700900", + "priceReceived": 0.9728224702338467 + }, + { + "bAssetIndex": 1, + "bAssetQty": "2796800000000000201326592", + "expectedQty": "2857835872184337931168178", + "priceReceived": 0.9786426250792051 + }, + { + "bAssetIndex": 1, + "bAssetQty": "3496000000000000117440512", + "expectedQty": "3558180045961155437097768", + "priceReceived": 0.9825247612099519 + }, + { + "bAssetIndex": 1, + "bAssetQty": "4195200000000000033554432", + "expectedQty": "4257701656529446269530387", + "priceReceived": 0.9853203297056767 + }, + { + "bAssetIndex": 1, + "bAssetQty": "4894399999999999949668352", + "expectedQty": "4956622542256418842610799", + "priceReceived": 0.9874465844986265 + }, + { + "bAssetIndex": 1, + "bAssetQty": "5593600000000000402653184", + "expectedQty": "5655058851205474401832123", + "priceReceived": 0.9891320580700282 + }, + { + "bAssetIndex": 1, + "bAssetQty": "6292799999999999781896192", + "expectedQty": "6353075328572007239119684", + "priceReceived": 0.9905124171437212 + }, + { + "bAssetIndex": 1, + "bAssetQty": "6992000000000000234881024", + "expectedQty": "7050709272680501025142512", + "priceReceived": 0.9916732813097283 + }, + { + "bAssetIndex": 2, + "bAssetQty": "10000000000000", + "expectedQty": "9892618042466", + "priceReceived": 1.0108547562508774 + }, + { + "bAssetIndex": 2, + "bAssetQty": "1000000000000000", + "expectedQty": "989261804244580", + "priceReceived": 1.0108547562529415 + }, + { + "bAssetIndex": 2, + "bAssetQty": "100000000000000000", + "expectedQty": "98926180404884481", + "priceReceived": 1.010854756452949 + }, + { + "bAssetIndex": 2, + "bAssetQty": "1000000000000000000", + "expectedQty": "989261802269436564", + "priceReceived": 1.010854758271197 + }, + { + "bAssetIndex": 2, + "bAssetQty": "10000000000000000000", + "expectedQty": "9892617844753675832", + "priceReceived": 1.0108547764536635 + }, + { + "bAssetIndex": 2, + "bAssetQty": "100000000000000000000", + "expectedQty": "98926160653601652020", + "priceReceived": 1.010854958276997 + }, + { + "bAssetIndex": 2, + "bAssetQty": "699200000000000050331648", + "hardLimitError": true + }, + { + "bAssetIndex": 2, + "bAssetQty": "1398400000000000100663296", + "hardLimitError": true + }, + { + "bAssetIndex": 2, + "bAssetQty": "2097600000000000016777216", + "hardLimitError": true + }, + { + "bAssetIndex": 2, + "bAssetQty": "2796800000000000201326592", + "hardLimitError": true + }, + { + "bAssetIndex": 2, + "bAssetQty": "3496000000000000117440512", + "hardLimitError": true + }, + { + "bAssetIndex": 2, + "bAssetQty": "4195200000000000033554432", + "hardLimitError": true + }, + { + "bAssetIndex": 2, + "bAssetQty": "4894399999999999949668352", + "hardLimitError": true + }, + { + "bAssetIndex": 2, + "bAssetQty": "5593600000000000402653184", + "hardLimitError": true + }, + { + "bAssetIndex": 2, + "bAssetQty": "6292799999999999781896192", + "hardLimitError": true + }, + { + "bAssetIndex": 2, + "bAssetQty": "6992000000000000234881024", + "hardLimitError": true + } + ] + }, + { + "reserve0": "2007000000000000000000000", + "reserve1": "500500000000000000000000", + "reserve2": "7492500000000000000000000", + "A": 120, + "mAssetSupply": "9896372713490403790662354", + "hardMin": 50000000000000000, + "hardMax": 750000000000000000, + "swapFeeRate": 600000000000000, + "mints": [ + { + "bAssetIndex": 0, + "bAssetQty": "10000000000000", + "expectedQty": "10143890658606", + "priceReceived": 0.9858150424281314 + }, + { + "bAssetIndex": 0, + "bAssetQty": "1000000000000000", + "expectedQty": "1014389065847321", + "priceReceived": 0.9858150424410363 + }, + { + "bAssetIndex": 0, + "bAssetQty": "100000000000000000", + "expectedQty": "101438906452467690", + "priceReceived": 0.9858150437264234 + }, + { + "bAssetIndex": 0, + "bAssetQty": "1000000000000000000", + "expectedQty": "1014389052500646933", + "priceReceived": 0.9858150554117522 + }, + { + "bAssetIndex": 0, + "bAssetQty": "10000000000000000000", + "expectedQty": "10143889322608810609", + "priceReceived": 0.9858151722645367 + }, + { + "bAssetIndex": 0, + "bAssetQty": "100000000000000000000", + "expectedQty": "101438772991659315644", + "priceReceived": 0.9858163407420394 + }, + { + "bAssetIndex": 0, + "bAssetQty": "699200000000000050331648", + "hardLimitError": true + }, + { + "bAssetIndex": 0, + "bAssetQty": "1398400000000000100663296", + "hardLimitError": true + }, + { + "bAssetIndex": 0, + "bAssetQty": "2097600000000000016777216", + "hardLimitError": true + }, + { + "bAssetIndex": 0, + "bAssetQty": "2796800000000000201326592", + "hardLimitError": true + }, + { + "bAssetIndex": 0, + "bAssetQty": "3496000000000000117440512", + "hardLimitError": true + }, + { + "bAssetIndex": 0, + "bAssetQty": "4195200000000000033554432", + "hardLimitError": true + }, + { + "bAssetIndex": 0, + "bAssetQty": "4894399999999999949668352", + "hardLimitError": true + }, + { + "bAssetIndex": 0, + "bAssetQty": "5593600000000000402653184", + "hardLimitError": true + }, + { + "bAssetIndex": 0, + "bAssetQty": "6292799999999999781896192", + "hardLimitError": true + }, + { + "bAssetIndex": 0, + "bAssetQty": "6992000000000000234881024", + "hardLimitError": true + }, + { + "bAssetIndex": 1, + "bAssetQty": "10000000000000", + "expectedQty": "12016287095094", + "priceReceived": 0.8322038181064092 + }, + { + "bAssetIndex": 1, + "bAssetQty": "1000000000000000", + "expectedQty": "1201628709124981", + "priceReceived": 0.8322038183726437 + }, + { + "bAssetIndex": 1, + "bAssetQty": "100000000000000000", + "expectedQty": "120162867068477766", + "priceReceived": 0.8322038449949146 + }, + { + "bAssetIndex": 1, + "bAssetQty": "1000000000000000000", + "expectedQty": "1201628321229059126", + "priceReceived": 0.8322040870151696 + }, + { + "bAssetIndex": 1, + "bAssetQty": "10000000000000000000", + "expectedQty": "12016248267380638563", + "priceReceived": 0.8322065071796199 + }, + { + "bAssetIndex": 1, + "bAssetQty": "100000000000000000000", + "expectedQty": "120158988844584723142", + "priceReceived": 0.832230705014848 + }, + { + "bAssetIndex": 1, + "bAssetQty": "699200000000000050331648", + "expectedQty": "758915093464738136563169", + "priceReceived": 0.9213151853495023 + }, + { + "bAssetIndex": 1, + "bAssetQty": "1398400000000000100663296", + "expectedQty": "1473400530309341117742129", + "priceReceived": 0.9490969843117983 + }, + { + "bAssetIndex": 1, + "bAssetQty": "2097600000000000016777216", + "expectedQty": "2178783980315529571380871", + "priceReceived": 0.9627388575237401 + }, + { + "bAssetIndex": 1, + "bAssetQty": "2796800000000000201326592", + "expectedQty": "2880620127293826852497696", + "priceReceived": 0.9709020545612271 + }, + { + "bAssetIndex": 1, + "bAssetQty": "3496000000000000117440512", + "expectedQty": "3580589386958113473567706", + "priceReceived": 0.9763755689869884 + }, + { + "bAssetIndex": 1, + "bAssetQty": "4195200000000000033554432", + "expectedQty": "4279368449887122287928618", + "priceReceived": 0.9803315720829454 + }, + { + "bAssetIndex": 1, + "bAssetQty": "4894399999999999949668352", + "expectedQty": "4977278016127211467001887", + "priceReceived": 0.9833487267822547 + }, + { + "bAssetIndex": 1, + "bAssetQty": "5593600000000000402653184", + "expectedQty": "5674486299978109779032834", + "priceReceived": 0.9857456171885689 + }, + { + "bAssetIndex": 1, + "bAssetQty": "6292799999999999781896192", + "expectedQty": "6371087286239571166925768", + "priceReceived": 0.9877120995644404 + }, + { + "bAssetIndex": 1, + "bAssetQty": "6992000000000000234881024", + "expectedQty": "7067135305137869045136995", + "priceReceived": 0.9893683505559537 + }, + { + "bAssetIndex": 2, + "bAssetQty": "10000000000000", + "expectedQty": "9688460045641", + "priceReceived": 1.0321557763454026 + }, + { + "bAssetIndex": 2, + "bAssetQty": "1000000000000000", + "expectedQty": "968846004561237", + "priceReceived": 1.0321557763484526 + }, + { + "bAssetIndex": 2, + "bAssetQty": "100000000000000000", + "expectedQty": "96884600427629503", + "priceReceived": 1.0321557766520142 + }, + { + "bAssetIndex": 2, + "bAssetQty": "1000000000000000000", + "expectedQty": "968846001685919294", + "priceReceived": 1.0321557794116596 + }, + { + "bAssetIndex": 2, + "bAssetQty": "10000000000000000000", + "expectedQty": "9688459757821565729", + "priceReceived": 1.0321558070081187 + }, + { + "bAssetIndex": 2, + "bAssetQty": "100000000000000000000", + "expectedQty": "96884571674398445885", + "priceReceived": 1.0321560829733718 + }, + { + "bAssetIndex": 2, + "bAssetQty": "699200000000000050331648", + "hardLimitError": true + }, + { + "bAssetIndex": 2, + "bAssetQty": "1398400000000000100663296", + "hardLimitError": true + }, + { + "bAssetIndex": 2, + "bAssetQty": "2097600000000000016777216", + "hardLimitError": true + }, + { + "bAssetIndex": 2, + "bAssetQty": "2796800000000000201326592", + "hardLimitError": true + }, + { + "bAssetIndex": 2, + "bAssetQty": "3496000000000000117440512", + "hardLimitError": true + }, + { + "bAssetIndex": 2, + "bAssetQty": "4195200000000000033554432", + "hardLimitError": true + }, + { + "bAssetIndex": 2, + "bAssetQty": "4894399999999999949668352", + "hardLimitError": true + }, + { + "bAssetIndex": 2, + "bAssetQty": "5593600000000000402653184", + "hardLimitError": true + }, + { + "bAssetIndex": 2, + "bAssetQty": "6292799999999999781896192", + "hardLimitError": true + }, + { + "bAssetIndex": 2, + "bAssetQty": "6992000000000000234881024", + "hardLimitError": true + } + ] + }, + { + "reserve0": "5503000000000000000000000", + "reserve1": "3996499999999999360000000", + "reserve2": "500500000000000000000000", + "A": 120, + "mAssetSupply": "9936488013915504712820075", + "hardMin": 50000000000000000, + "hardMax": 750000000000000000, + "swapFeeRate": 600000000000000, + "mints": [ + { + "bAssetIndex": 0, + "bAssetQty": "10000000000000", + "expectedQty": "9832251954605", + "priceReceived": 1.0170609994708724 + }, + { + "bAssetIndex": 0, + "bAssetQty": "1000000000000000", + "expectedQty": "983225195458701", + "priceReceived": 1.0170609994727333 + }, + { + "bAssetIndex": 0, + "bAssetQty": "100000000000000000", + "expectedQty": "98322519528556775", + "priceReceived": 1.0170609996518245 + }, + { + "bAssetIndex": 0, + "bAssetQty": "1000000000000000000", + "expectedQty": "983225193711637753", + "priceReceived": 1.0170610012799184 + }, + { + "bAssetIndex": 0, + "bAssetQty": "10000000000000000000", + "expectedQty": "9832251779723363751", + "priceReceived": 1.0170610175608579 + }, + { + "bAssetIndex": 0, + "bAssetQty": "100000000000000000000", + "expectedQty": "98322502057917477303", + "priceReceived": 1.0170611803704344 + }, + { + "bAssetIndex": 0, + "bAssetQty": "699200000000000050331648", + "hardLimitError": true + }, + { + "bAssetIndex": 0, + "bAssetQty": "1398400000000000100663296", + "hardLimitError": true + }, + { + "bAssetIndex": 0, + "bAssetQty": "2097600000000000016777216", + "hardLimitError": true + }, + { + "bAssetIndex": 0, + "bAssetQty": "2796800000000000201326592", + "hardLimitError": true + }, + { + "bAssetIndex": 0, + "bAssetQty": "3496000000000000117440512", + "hardLimitError": true + }, + { + "bAssetIndex": 0, + "bAssetQty": "4195200000000000033554432", + "hardLimitError": true + }, + { + "bAssetIndex": 0, + "bAssetQty": "4894399999999999949668352", + "hardLimitError": true + }, + { + "bAssetIndex": 0, + "bAssetQty": "5593600000000000402653184", + "hardLimitError": true + }, + { + "bAssetIndex": 0, + "bAssetQty": "6292799999999999781896192", + "hardLimitError": true + }, + { + "bAssetIndex": 0, + "bAssetQty": "6992000000000000234881024", + "hardLimitError": true + }, + { + "bAssetIndex": 1, + "bAssetQty": "10000000000000", + "expectedQty": "9892618042466", + "priceReceived": 1.0108547562508774 + }, + { + "bAssetIndex": 1, + "bAssetQty": "1000000000000000", + "expectedQty": "989261804244580", + "priceReceived": 1.0108547562529415 + }, + { + "bAssetIndex": 1, + "bAssetQty": "100000000000000000", + "expectedQty": "98926180404884481", + "priceReceived": 1.010854756452949 + }, + { + "bAssetIndex": 1, + "bAssetQty": "1000000000000000000", + "expectedQty": "989261802269436564", + "priceReceived": 1.010854758271197 + }, + { + "bAssetIndex": 1, + "bAssetQty": "10000000000000000000", + "expectedQty": "9892617844753675832", + "priceReceived": 1.0108547764536635 + }, + { + "bAssetIndex": 1, + "bAssetQty": "100000000000000000000", + "expectedQty": "98926160653601652020", + "priceReceived": 1.010854958276997 + }, + { + "bAssetIndex": 1, + "bAssetQty": "699200000000000050331648", + "hardLimitError": true + }, + { + "bAssetIndex": 1, + "bAssetQty": "1398400000000000100663296", + "hardLimitError": true + }, + { + "bAssetIndex": 1, + "bAssetQty": "2097600000000000016777216", + "hardLimitError": true + }, + { + "bAssetIndex": 1, + "bAssetQty": "2796800000000000201326592", + "hardLimitError": true + }, + { + "bAssetIndex": 1, + "bAssetQty": "3496000000000000117440512", + "hardLimitError": true + }, + { + "bAssetIndex": 1, + "bAssetQty": "4195200000000000033554432", + "hardLimitError": true + }, + { + "bAssetIndex": 1, + "bAssetQty": "4894399999999999949668352", + "hardLimitError": true + }, + { + "bAssetIndex": 1, + "bAssetQty": "5593600000000000402653184", + "hardLimitError": true + }, + { + "bAssetIndex": 1, + "bAssetQty": "6292799999999999781896192", + "hardLimitError": true + }, + { + "bAssetIndex": 1, + "bAssetQty": "6992000000000000234881024", + "hardLimitError": true + }, + { + "bAssetIndex": 2, + "bAssetQty": "10000000000000", + "expectedQty": "11432866386092", + "priceReceived": 0.8746712908466182 + }, + { + "bAssetIndex": 2, + "bAssetQty": "1000000000000000", + "expectedQty": "1143286638334208", + "priceReceived": 0.8746712910570007 + }, + { + "bAssetIndex": 2, + "bAssetQty": "100000000000000000", + "expectedQty": "114328661083569904", + "priceReceived": 0.8746713120947319 + }, + { + "bAssetIndex": 2, + "bAssetQty": "1000000000000000000", + "expectedQty": "1143286360849746210", + "priceReceived": 0.874671503346503 + }, + { + "bAssetIndex": 2, + "bAssetQty": "10000000000000000000", + "expectedQty": "11432838610381658208", + "priceReceived": 0.8746734158321311 + }, + { + "bAssetIndex": 2, + "bAssetQty": "100000000000000000000", + "expectedQty": "114325886771621960149", + "priceReceived": 0.8746925374806894 + }, + { + "bAssetIndex": 2, + "bAssetQty": "699200000000000050331648", + "expectedQty": "741678171179218686429800", + "priceReceived": 0.9427269497338971 + }, + { + "bAssetIndex": 2, + "bAssetQty": "1398400000000000100663296", + "expectedQty": "1452105731306633575856596", + "priceReceived": 0.9630152748875194 + }, + { + "bAssetIndex": 2, + "bAssetQty": "2097600000000000016777216", + "expectedQty": "2156200194980878262700900", + "priceReceived": 0.9728224702338467 + }, + { + "bAssetIndex": 2, + "bAssetQty": "2796800000000000201326592", + "expectedQty": "2857835872184337931168178", + "priceReceived": 0.9786426250792051 + }, + { + "bAssetIndex": 2, + "bAssetQty": "3496000000000000117440512", + "expectedQty": "3558180045961155437097768", + "priceReceived": 0.9825247612099519 + }, + { + "bAssetIndex": 2, + "bAssetQty": "4195200000000000033554432", + "expectedQty": "4257701656529446269530387", + "priceReceived": 0.9853203297056767 + }, + { + "bAssetIndex": 2, + "bAssetQty": "4894399999999999949668352", + "expectedQty": "4956622542256418842610799", + "priceReceived": 0.9874465844986265 + }, + { + "bAssetIndex": 2, + "bAssetQty": "5593600000000000402653184", + "expectedQty": "5655058851205474401832123", + "priceReceived": 0.9891320580700282 + }, + { + "bAssetIndex": 2, + "bAssetQty": "6292799999999999781896192", + "expectedQty": "6353075328572007239119684", + "priceReceived": 0.9905124171437212 + }, + { + "bAssetIndex": 2, + "bAssetQty": "6992000000000000234881024", + "expectedQty": "7050709272680501025142512", + "priceReceived": 0.9916732813097283 + } + ] + }, + { + "reserve0": "2007000000000000960000000", + "reserve1": "3996499999999999360000000", + "reserve2": "3996499999999999360000000", + "A": 120, + "mAssetSupply": "9995726520619110731126433", + "hardMin": 50000000000000000, + "hardMax": 750000000000000000, + "swapFeeRate": 600000000000000, + "mints": [ + { + "bAssetIndex": 0, + "bAssetQty": "10000000000000", + "expectedQty": "10058614942598", + "priceReceived": 0.9941726626446582 + }, + { + "bAssetIndex": 0, + "bAssetQty": "1000000000000000", + "expectedQty": "1005861494256321", + "priceReceived": 0.9941726626480968 + }, + { + "bAssetIndex": 0, + "bAssetQty": "100000000000000000", + "expectedQty": "100586149391571656", + "priceReceived": 0.9941726629847432 + }, + { + "bAssetIndex": 0, + "bAssetQty": "1000000000000000000", + "expectedQty": "1005861490819319821", + "priceReceived": 0.9941726660451576 + }, + { + "bAssetIndex": 0, + "bAssetQty": "10000000000000000000", + "expectedQty": "10058614598554929567", + "priceReceived": 0.9941726966491637 + }, + { + "bAssetIndex": 0, + "bAssetQty": "100000000000000000000", + "expectedQty": "100586115023126883866", + "priceReceived": 0.9941730026754476 + }, + { + "bAssetIndex": 0, + "bAssetQty": "699200000000000050331648", + "expectedQty": "702016130027513514676957", + "priceReceived": 0.9959885109372015 + }, + { + "bAssetIndex": 0, + "bAssetQty": "1398400000000000100663296", + "expectedQty": "1402409205977358729703359", + "priceReceived": 0.9971412010415572 + }, + { + "bAssetIndex": 0, + "bAssetQty": "2097600000000000016777216", + "expectedQty": "2101865542055031215754228", + "priceReceived": 0.9979705923287269 + }, + { + "bAssetIndex": 0, + "bAssetQty": "2796800000000000201326592", + "expectedQty": "2800665664244178037349474", + "priceReceived": 0.9986197337677502 + }, + { + "bAssetIndex": 0, + "bAssetQty": "3496000000000000117440512", + "expectedQty": "3498941539257549736263678", + "priceReceived": 0.9991593059716642 + }, + { + "bAssetIndex": 0, + "bAssetQty": "4195200000000000033554432", + "expectedQty": "4196760179169993801281722", + "priceReceived": 0.9996282420001654 + }, + { + "bAssetIndex": 0, + "bAssetQty": "4894399999999999949668352", + "expectedQty": "4894156522336345491706039", + "priceReceived": 1.0000497486466857 + }, + { + "bAssetIndex": 0, + "bAssetQty": "5593600000000000402653184", + "expectedQty": "5591148198088038016553653", + "priceReceived": 1.0004385149212822 + }, + { + "bAssetIndex": 0, + "bAssetQty": "6292799999999999781896192", + "expectedQty": "6287742841543760775892450", + "priceReceived": 1.0008042883724229 + }, + { + "bAssetIndex": 0, + "bAssetQty": "6992000000000000234881024", + "expectedQty": "6983942004489696902085786", + "priceReceived": 1.0011537890069997 + }, + { + "bAssetIndex": 1, + "bAssetQty": "10000000000000", + "expectedQty": "9979935570674", + "priceReceived": 1.002010476839646 + }, + { + "bAssetIndex": 1, + "bAssetQty": "1000000000000000", + "expectedQty": "997993557066692", + "priceReceived": 1.0020104768403568 + }, + { + "bAssetIndex": 1, + "bAssetQty": "100000000000000000", + "expectedQty": "99799355699606328", + "priceReceived": 1.0020104769112699 + }, + { + "bAssetIndex": 1, + "bAssetQty": "1000000000000000000", + "expectedQty": "997993556353984498", + "priceReceived": 1.002010477555933 + }, + { + "bAssetIndex": 1, + "bAssetQty": "10000000000000000000", + "expectedQty": "9979935499332013774", + "priceReceived": 1.0020104840025599 + }, + { + "bAssetIndex": 1, + "bAssetQty": "100000000000000000000", + "expectedQty": "99799348572583949084", + "priceReceived": 1.0020105484683612 + }, + { + "bAssetIndex": 1, + "bAssetQty": "699200000000000050331648", + "expectedQty": "697463049145752630825887", + "priceReceived": 1.0024903840517068 + }, + { + "bAssetIndex": 1, + "bAssetQty": "1398400000000000100663296", + "expectedQty": "1394297537312687357246463", + "priceReceived": 1.0029423150923866 + }, + { + "bAssetIndex": 1, + "bAssetQty": "2097600000000000016777216", + "expectedQty": "2090534177142072198604999", + "priceReceived": 1.0033799126248142 + }, + { + "bAssetIndex": 1, + "bAssetQty": "2796800000000000201326592", + "expectedQty": "2786181338416885026428332", + "priceReceived": 1.0038111882513536 + }, + { + "bAssetIndex": 1, + "bAssetQty": "3496000000000000117440512", + "expectedQty": "3481235579829406229717057", + "priceReceived": 1.0042411436491516 + }, + { + "bAssetIndex": 1, + "bAssetQty": "4195200000000000033554432", + "expectedQty": "4175686799036286876935350", + "priceReceived": 1.0046730518601674 + }, + { + "bAssetIndex": 1, + "bAssetQty": "4894399999999999949668352", + "expectedQty": "4869520959749015472848888", + "priceReceived": 1.0051091350579722 + }, + { + "bAssetIndex": 1, + "bAssetQty": "5593600000000000402653184", + "expectedQty": "5562721630840957913206527", + "priceReceived": 1.005550946318767 + }, + { + "bAssetIndex": 1, + "bAssetQty": "6292799999999999781896192", + "expectedQty": "6255270901791376247372883", + "priceReceived": 1.005999595988381 + }, + { + "bAssetIndex": 1, + "bAssetQty": "6992000000000000234881024", + "expectedQty": "6947149951809925188879129", + "priceReceived": 1.0064558917687376 + }, + { + "bAssetIndex": 2, + "bAssetQty": "10000000000000", + "expectedQty": "9979935570674", + "priceReceived": 1.002010476839646 + }, + { + "bAssetIndex": 2, + "bAssetQty": "1000000000000000", + "expectedQty": "997993557066692", + "priceReceived": 1.0020104768403568 + }, + { + "bAssetIndex": 2, + "bAssetQty": "100000000000000000", + "expectedQty": "99799355699606328", + "priceReceived": 1.0020104769112699 + }, + { + "bAssetIndex": 2, + "bAssetQty": "1000000000000000000", + "expectedQty": "997993556353984498", + "priceReceived": 1.002010477555933 + }, + { + "bAssetIndex": 2, + "bAssetQty": "10000000000000000000", + "expectedQty": "9979935499332013774", + "priceReceived": 1.0020104840025599 + }, + { + "bAssetIndex": 2, + "bAssetQty": "100000000000000000000", + "expectedQty": "99799348572583949084", + "priceReceived": 1.0020105484683612 + }, + { + "bAssetIndex": 2, + "bAssetQty": "699200000000000050331648", + "expectedQty": "697463049145752630825887", + "priceReceived": 1.0024903840517068 + }, + { + "bAssetIndex": 2, + "bAssetQty": "1398400000000000100663296", + "expectedQty": "1394297537312687357246463", + "priceReceived": 1.0029423150923866 + }, + { + "bAssetIndex": 2, + "bAssetQty": "2097600000000000016777216", + "expectedQty": "2090534177142072198604999", + "priceReceived": 1.0033799126248142 + }, + { + "bAssetIndex": 2, + "bAssetQty": "2796800000000000201326592", + "expectedQty": "2786181338416885026428332", + "priceReceived": 1.0038111882513536 + }, + { + "bAssetIndex": 2, + "bAssetQty": "3496000000000000117440512", + "expectedQty": "3481235579829406229717057", + "priceReceived": 1.0042411436491516 + }, + { + "bAssetIndex": 2, + "bAssetQty": "4195200000000000033554432", + "expectedQty": "4175686799036286876935350", + "priceReceived": 1.0046730518601674 + }, + { + "bAssetIndex": 2, + "bAssetQty": "4894399999999999949668352", + "expectedQty": "4869520959749015472848888", + "priceReceived": 1.0051091350579722 + }, + { + "bAssetIndex": 2, + "bAssetQty": "5593600000000000402653184", + "expectedQty": "5562721630840957913206527", + "priceReceived": 1.005550946318767 + }, + { + "bAssetIndex": 2, + "bAssetQty": "6292799999999999781896192", + "expectedQty": "6255270901791376247372883", + "priceReceived": 1.005999595988381 + }, + { + "bAssetIndex": 2, + "bAssetQty": "6992000000000000234881024", + "expectedQty": "6947149951809925188879129", + "priceReceived": 1.0064558917687376 + } + ] + }, + { + "reserve0": "2007000000000000000000000", + "reserve1": "7492500000000000000000000", + "reserve2": "500500000000000000000000", + "A": 120, + "mAssetSupply": "9896372713490403790662354", + "hardMin": 50000000000000000, + "hardMax": 750000000000000000, + "swapFeeRate": 600000000000000, + "mints": [ + { + "bAssetIndex": 0, + "bAssetQty": "10000000000000", + "expectedQty": "10143890658606", + "priceReceived": 0.9858150424281314 + }, + { + "bAssetIndex": 0, + "bAssetQty": "1000000000000000", + "expectedQty": "1014389065847321", + "priceReceived": 0.9858150424410363 + }, + { + "bAssetIndex": 0, + "bAssetQty": "100000000000000000", + "expectedQty": "101438906452467690", + "priceReceived": 0.9858150437264234 + }, + { + "bAssetIndex": 0, + "bAssetQty": "1000000000000000000", + "expectedQty": "1014389052500646933", + "priceReceived": 0.9858150554117522 + }, + { + "bAssetIndex": 0, + "bAssetQty": "10000000000000000000", + "expectedQty": "10143889322608810609", + "priceReceived": 0.9858151722645367 + }, + { + "bAssetIndex": 0, + "bAssetQty": "100000000000000000000", + "expectedQty": "101438772991659315644", + "priceReceived": 0.9858163407420394 + }, + { + "bAssetIndex": 0, + "bAssetQty": "699200000000000050331648", + "hardLimitError": true + }, + { + "bAssetIndex": 0, + "bAssetQty": "1398400000000000100663296", + "hardLimitError": true + }, + { + "bAssetIndex": 0, + "bAssetQty": "2097600000000000016777216", + "hardLimitError": true + }, + { + "bAssetIndex": 0, + "bAssetQty": "2796800000000000201326592", + "hardLimitError": true + }, + { + "bAssetIndex": 0, + "bAssetQty": "3496000000000000117440512", + "hardLimitError": true + }, + { + "bAssetIndex": 0, + "bAssetQty": "4195200000000000033554432", + "hardLimitError": true + }, + { + "bAssetIndex": 0, + "bAssetQty": "4894399999999999949668352", + "hardLimitError": true + }, + { + "bAssetIndex": 0, + "bAssetQty": "5593600000000000402653184", + "hardLimitError": true + }, + { + "bAssetIndex": 0, + "bAssetQty": "6292799999999999781896192", + "hardLimitError": true + }, + { + "bAssetIndex": 0, + "bAssetQty": "6992000000000000234881024", + "hardLimitError": true + }, + { + "bAssetIndex": 1, + "bAssetQty": "10000000000000", + "expectedQty": "9688460045641", + "priceReceived": 1.0321557763454026 + }, + { + "bAssetIndex": 1, + "bAssetQty": "1000000000000000", + "expectedQty": "968846004561237", + "priceReceived": 1.0321557763484526 + }, + { + "bAssetIndex": 1, + "bAssetQty": "100000000000000000", + "expectedQty": "96884600427629503", + "priceReceived": 1.0321557766520142 + }, + { + "bAssetIndex": 1, + "bAssetQty": "1000000000000000000", + "expectedQty": "968846001685919294", + "priceReceived": 1.0321557794116596 + }, + { + "bAssetIndex": 1, + "bAssetQty": "10000000000000000000", + "expectedQty": "9688459757821565729", + "priceReceived": 1.0321558070081187 + }, + { + "bAssetIndex": 1, + "bAssetQty": "100000000000000000000", + "expectedQty": "96884571674398445885", + "priceReceived": 1.0321560829733718 + }, + { + "bAssetIndex": 1, + "bAssetQty": "699200000000000050331648", + "hardLimitError": true + }, + { + "bAssetIndex": 1, + "bAssetQty": "1398400000000000100663296", + "hardLimitError": true + }, + { + "bAssetIndex": 1, + "bAssetQty": "2097600000000000016777216", + "hardLimitError": true + }, + { + "bAssetIndex": 1, + "bAssetQty": "2796800000000000201326592", + "hardLimitError": true + }, + { + "bAssetIndex": 1, + "bAssetQty": "3496000000000000117440512", + "hardLimitError": true + }, + { + "bAssetIndex": 1, + "bAssetQty": "4195200000000000033554432", + "hardLimitError": true + }, + { + "bAssetIndex": 1, + "bAssetQty": "4894399999999999949668352", + "hardLimitError": true + }, + { + "bAssetIndex": 1, + "bAssetQty": "5593600000000000402653184", + "hardLimitError": true + }, + { + "bAssetIndex": 1, + "bAssetQty": "6292799999999999781896192", + "hardLimitError": true + }, + { + "bAssetIndex": 1, + "bAssetQty": "6992000000000000234881024", + "hardLimitError": true + }, + { + "bAssetIndex": 2, + "bAssetQty": "10000000000000", + "expectedQty": "12016287095094", + "priceReceived": 0.8322038181064092 + }, + { + "bAssetIndex": 2, + "bAssetQty": "1000000000000000", + "expectedQty": "1201628709124981", + "priceReceived": 0.8322038183726437 + }, + { + "bAssetIndex": 2, + "bAssetQty": "100000000000000000", + "expectedQty": "120162867068477766", + "priceReceived": 0.8322038449949146 + }, + { + "bAssetIndex": 2, + "bAssetQty": "1000000000000000000", + "expectedQty": "1201628321229059126", + "priceReceived": 0.8322040870151696 + }, + { + "bAssetIndex": 2, + "bAssetQty": "10000000000000000000", + "expectedQty": "12016248267380638563", + "priceReceived": 0.8322065071796199 + }, + { + "bAssetIndex": 2, + "bAssetQty": "100000000000000000000", + "expectedQty": "120158988844584723142", + "priceReceived": 0.832230705014848 + }, + { + "bAssetIndex": 2, + "bAssetQty": "699200000000000050331648", + "expectedQty": "758915093464738136563169", + "priceReceived": 0.9213151853495023 + }, + { + "bAssetIndex": 2, + "bAssetQty": "1398400000000000100663296", + "expectedQty": "1473400530309341117742129", + "priceReceived": 0.9490969843117983 + }, + { + "bAssetIndex": 2, + "bAssetQty": "2097600000000000016777216", + "expectedQty": "2178783980315529571380871", + "priceReceived": 0.9627388575237401 + }, + { + "bAssetIndex": 2, + "bAssetQty": "2796800000000000201326592", + "expectedQty": "2880620127293826852497696", + "priceReceived": 0.9709020545612271 + }, + { + "bAssetIndex": 2, + "bAssetQty": "3496000000000000117440512", + "expectedQty": "3580589386958113473567706", + "priceReceived": 0.9763755689869884 + }, + { + "bAssetIndex": 2, + "bAssetQty": "4195200000000000033554432", + "expectedQty": "4279368449887122287928618", + "priceReceived": 0.9803315720829454 + }, + { + "bAssetIndex": 2, + "bAssetQty": "4894399999999999949668352", + "expectedQty": "4977278016127211467001887", + "priceReceived": 0.9833487267822547 + }, + { + "bAssetIndex": 2, + "bAssetQty": "5593600000000000402653184", + "expectedQty": "5674486299978109779032834", + "priceReceived": 0.9857456171885689 + }, + { + "bAssetIndex": 2, + "bAssetQty": "6292799999999999781896192", + "expectedQty": "6371087286239571166925768", + "priceReceived": 0.9877120995644404 + }, + { + "bAssetIndex": 2, + "bAssetQty": "6992000000000000234881024", + "expectedQty": "7067135305137869045136995", + "priceReceived": 0.9893683505559537 + } + ] + }, + { + "reserve0": "500500000000000000000000", + "reserve1": "5503000000000000000000000", + "reserve2": "3996499999999999360000000", + "A": 120, + "mAssetSupply": "9936488013915504712820075", + "hardMin": 50000000000000000, + "hardMax": 750000000000000000, + "swapFeeRate": 600000000000000, + "mints": [ + { + "bAssetIndex": 0, + "bAssetQty": "10000000000000", + "expectedQty": "11432866386092", + "priceReceived": 0.8746712908466182 + }, + { + "bAssetIndex": 0, + "bAssetQty": "1000000000000000", + "expectedQty": "1143286638334208", + "priceReceived": 0.8746712910570007 + }, + { + "bAssetIndex": 0, + "bAssetQty": "100000000000000000", + "expectedQty": "114328661083569904", + "priceReceived": 0.8746713120947319 + }, + { + "bAssetIndex": 0, + "bAssetQty": "1000000000000000000", + "expectedQty": "1143286360849746210", + "priceReceived": 0.874671503346503 + }, + { + "bAssetIndex": 0, + "bAssetQty": "10000000000000000000", + "expectedQty": "11432838610381658208", + "priceReceived": 0.8746734158321311 + }, + { + "bAssetIndex": 0, + "bAssetQty": "100000000000000000000", + "expectedQty": "114325886771621960149", + "priceReceived": 0.8746925374806894 + }, + { + "bAssetIndex": 0, + "bAssetQty": "699200000000000050331648", + "expectedQty": "741678171179218686429800", + "priceReceived": 0.9427269497338971 + }, + { + "bAssetIndex": 0, + "bAssetQty": "1398400000000000100663296", + "expectedQty": "1452105731306633575856596", + "priceReceived": 0.9630152748875194 + }, + { + "bAssetIndex": 0, + "bAssetQty": "2097600000000000016777216", + "expectedQty": "2156200194980878262700900", + "priceReceived": 0.9728224702338467 + }, + { + "bAssetIndex": 0, + "bAssetQty": "2796800000000000201326592", + "expectedQty": "2857835872184337931168178", + "priceReceived": 0.9786426250792051 + }, + { + "bAssetIndex": 0, + "bAssetQty": "3496000000000000117440512", + "expectedQty": "3558180045961155437097768", + "priceReceived": 0.9825247612099519 + }, + { + "bAssetIndex": 0, + "bAssetQty": "4195200000000000033554432", + "expectedQty": "4257701656529446269530387", + "priceReceived": 0.9853203297056767 + }, + { + "bAssetIndex": 0, + "bAssetQty": "4894399999999999949668352", + "expectedQty": "4956622542256418842610799", + "priceReceived": 0.9874465844986265 + }, + { + "bAssetIndex": 0, + "bAssetQty": "5593600000000000402653184", + "expectedQty": "5655058851205474401832123", + "priceReceived": 0.9891320580700282 + }, + { + "bAssetIndex": 0, + "bAssetQty": "6292799999999999781896192", + "expectedQty": "6353075328572007239119684", + "priceReceived": 0.9905124171437212 + }, + { + "bAssetIndex": 0, + "bAssetQty": "6992000000000000234881024", + "expectedQty": "7050709272680501025142512", + "priceReceived": 0.9916732813097283 + }, + { + "bAssetIndex": 1, + "bAssetQty": "10000000000000", + "expectedQty": "9832251954605", + "priceReceived": 1.0170609994708724 + }, + { + "bAssetIndex": 1, + "bAssetQty": "1000000000000000", + "expectedQty": "983225195458701", + "priceReceived": 1.0170609994727333 + }, + { + "bAssetIndex": 1, + "bAssetQty": "100000000000000000", + "expectedQty": "98322519528556775", + "priceReceived": 1.0170609996518245 + }, + { + "bAssetIndex": 1, + "bAssetQty": "1000000000000000000", + "expectedQty": "983225193711637753", + "priceReceived": 1.0170610012799184 + }, + { + "bAssetIndex": 1, + "bAssetQty": "10000000000000000000", + "expectedQty": "9832251779723363751", + "priceReceived": 1.0170610175608579 + }, + { + "bAssetIndex": 1, + "bAssetQty": "100000000000000000000", + "expectedQty": "98322502057917477303", + "priceReceived": 1.0170611803704344 + }, + { + "bAssetIndex": 1, + "bAssetQty": "699200000000000050331648", + "hardLimitError": true + }, + { + "bAssetIndex": 1, + "bAssetQty": "1398400000000000100663296", + "hardLimitError": true + }, + { + "bAssetIndex": 1, + "bAssetQty": "2097600000000000016777216", + "hardLimitError": true + }, + { + "bAssetIndex": 1, + "bAssetQty": "2796800000000000201326592", + "hardLimitError": true + }, + { + "bAssetIndex": 1, + "bAssetQty": "3496000000000000117440512", + "hardLimitError": true + }, + { + "bAssetIndex": 1, + "bAssetQty": "4195200000000000033554432", + "hardLimitError": true + }, + { + "bAssetIndex": 1, + "bAssetQty": "4894399999999999949668352", + "hardLimitError": true + }, + { + "bAssetIndex": 1, + "bAssetQty": "5593600000000000402653184", + "hardLimitError": true + }, + { + "bAssetIndex": 1, + "bAssetQty": "6292799999999999781896192", + "hardLimitError": true + }, + { + "bAssetIndex": 1, + "bAssetQty": "6992000000000000234881024", + "hardLimitError": true + }, + { + "bAssetIndex": 2, + "bAssetQty": "10000000000000", + "expectedQty": "9892618042466", + "priceReceived": 1.0108547562508774 + }, + { + "bAssetIndex": 2, + "bAssetQty": "1000000000000000", + "expectedQty": "989261804244580", + "priceReceived": 1.0108547562529415 + }, + { + "bAssetIndex": 2, + "bAssetQty": "100000000000000000", + "expectedQty": "98926180404884481", + "priceReceived": 1.010854756452949 + }, + { + "bAssetIndex": 2, + "bAssetQty": "1000000000000000000", + "expectedQty": "989261802269436564", + "priceReceived": 1.010854758271197 + }, + { + "bAssetIndex": 2, + "bAssetQty": "10000000000000000000", + "expectedQty": "9892617844753675832", + "priceReceived": 1.0108547764536635 + }, + { + "bAssetIndex": 2, + "bAssetQty": "100000000000000000000", + "expectedQty": "98926160653601652020", + "priceReceived": 1.010854958276997 + }, + { + "bAssetIndex": 2, + "bAssetQty": "699200000000000050331648", + "hardLimitError": true + }, + { + "bAssetIndex": 2, + "bAssetQty": "1398400000000000100663296", + "hardLimitError": true + }, + { + "bAssetIndex": 2, + "bAssetQty": "2097600000000000016777216", + "hardLimitError": true + }, + { + "bAssetIndex": 2, + "bAssetQty": "2796800000000000201326592", + "hardLimitError": true + }, + { + "bAssetIndex": 2, + "bAssetQty": "3496000000000000117440512", + "hardLimitError": true + }, + { + "bAssetIndex": 2, + "bAssetQty": "4195200000000000033554432", + "hardLimitError": true + }, + { + "bAssetIndex": 2, + "bAssetQty": "4894399999999999949668352", + "hardLimitError": true + }, + { + "bAssetIndex": 2, + "bAssetQty": "5593600000000000402653184", + "hardLimitError": true + }, + { + "bAssetIndex": 2, + "bAssetQty": "6292799999999999781896192", + "hardLimitError": true + }, + { + "bAssetIndex": 2, + "bAssetQty": "6992000000000000234881024", + "hardLimitError": true + } + ] + }, + { + "reserve0": "500500000000000000000000", + "reserve1": "2007000000000000000000000", + "reserve2": "7492500000000000000000000", + "A": 120, + "mAssetSupply": "9896372713490403790662354", + "hardMin": 50000000000000000, + "hardMax": 750000000000000000, + "swapFeeRate": 600000000000000, + "mints": [ + { + "bAssetIndex": 0, + "bAssetQty": "10000000000000", + "expectedQty": "12016287095094", + "priceReceived": 0.8322038181064092 + }, + { + "bAssetIndex": 0, + "bAssetQty": "1000000000000000", + "expectedQty": "1201628709124981", + "priceReceived": 0.8322038183726437 + }, + { + "bAssetIndex": 0, + "bAssetQty": "100000000000000000", + "expectedQty": "120162867068477766", + "priceReceived": 0.8322038449949146 + }, + { + "bAssetIndex": 0, + "bAssetQty": "1000000000000000000", + "expectedQty": "1201628321229059126", + "priceReceived": 0.8322040870151696 + }, + { + "bAssetIndex": 0, + "bAssetQty": "10000000000000000000", + "expectedQty": "12016248267380638563", + "priceReceived": 0.8322065071796199 + }, + { + "bAssetIndex": 0, + "bAssetQty": "100000000000000000000", + "expectedQty": "120158988844584723142", + "priceReceived": 0.832230705014848 + }, + { + "bAssetIndex": 0, + "bAssetQty": "699200000000000050331648", + "expectedQty": "758915093464738136563169", + "priceReceived": 0.9213151853495023 + }, + { + "bAssetIndex": 0, + "bAssetQty": "1398400000000000100663296", + "expectedQty": "1473400530309341117742129", + "priceReceived": 0.9490969843117983 + }, + { + "bAssetIndex": 0, + "bAssetQty": "2097600000000000016777216", + "expectedQty": "2178783980315529571380871", + "priceReceived": 0.9627388575237401 + }, + { + "bAssetIndex": 0, + "bAssetQty": "2796800000000000201326592", + "expectedQty": "2880620127293826852497696", + "priceReceived": 0.9709020545612271 + }, + { + "bAssetIndex": 0, + "bAssetQty": "3496000000000000117440512", + "expectedQty": "3580589386958113473567706", + "priceReceived": 0.9763755689869884 + }, + { + "bAssetIndex": 0, + "bAssetQty": "4195200000000000033554432", + "expectedQty": "4279368449887122287928618", + "priceReceived": 0.9803315720829454 + }, + { + "bAssetIndex": 0, + "bAssetQty": "4894399999999999949668352", + "expectedQty": "4977278016127211467001887", + "priceReceived": 0.9833487267822547 + }, + { + "bAssetIndex": 0, + "bAssetQty": "5593600000000000402653184", + "expectedQty": "5674486299978109779032834", + "priceReceived": 0.9857456171885689 + }, + { + "bAssetIndex": 0, + "bAssetQty": "6292799999999999781896192", + "expectedQty": "6371087286239571166925768", + "priceReceived": 0.9877120995644404 + }, + { + "bAssetIndex": 0, + "bAssetQty": "6992000000000000234881024", + "expectedQty": "7067135305137869045136995", + "priceReceived": 0.9893683505559537 + }, + { + "bAssetIndex": 1, + "bAssetQty": "10000000000000", + "expectedQty": "10143890658606", + "priceReceived": 0.9858150424281314 + }, + { + "bAssetIndex": 1, + "bAssetQty": "1000000000000000", + "expectedQty": "1014389065847321", + "priceReceived": 0.9858150424410363 + }, + { + "bAssetIndex": 1, + "bAssetQty": "100000000000000000", + "expectedQty": "101438906452467690", + "priceReceived": 0.9858150437264234 + }, + { + "bAssetIndex": 1, + "bAssetQty": "1000000000000000000", + "expectedQty": "1014389052500646933", + "priceReceived": 0.9858150554117522 + }, + { + "bAssetIndex": 1, + "bAssetQty": "10000000000000000000", + "expectedQty": "10143889322608810609", + "priceReceived": 0.9858151722645367 + }, + { + "bAssetIndex": 1, + "bAssetQty": "100000000000000000000", + "expectedQty": "101438772991659315644", + "priceReceived": 0.9858163407420394 + }, + { + "bAssetIndex": 1, + "bAssetQty": "699200000000000050331648", + "hardLimitError": true + }, + { + "bAssetIndex": 1, + "bAssetQty": "1398400000000000100663296", + "hardLimitError": true + }, + { + "bAssetIndex": 1, + "bAssetQty": "2097600000000000016777216", + "hardLimitError": true + }, + { + "bAssetIndex": 1, + "bAssetQty": "2796800000000000201326592", + "hardLimitError": true + }, + { + "bAssetIndex": 1, + "bAssetQty": "3496000000000000117440512", + "hardLimitError": true + }, + { + "bAssetIndex": 1, + "bAssetQty": "4195200000000000033554432", + "hardLimitError": true + }, + { + "bAssetIndex": 1, + "bAssetQty": "4894399999999999949668352", + "hardLimitError": true + }, + { + "bAssetIndex": 1, + "bAssetQty": "5593600000000000402653184", + "hardLimitError": true + }, + { + "bAssetIndex": 1, + "bAssetQty": "6292799999999999781896192", + "hardLimitError": true + }, + { + "bAssetIndex": 1, + "bAssetQty": "6992000000000000234881024", + "hardLimitError": true + }, + { + "bAssetIndex": 2, + "bAssetQty": "10000000000000", + "expectedQty": "9688460045641", + "priceReceived": 1.0321557763454026 + }, + { + "bAssetIndex": 2, + "bAssetQty": "1000000000000000", + "expectedQty": "968846004561237", + "priceReceived": 1.0321557763484526 + }, + { + "bAssetIndex": 2, + "bAssetQty": "100000000000000000", + "expectedQty": "96884600427629503", + "priceReceived": 1.0321557766520142 + }, + { + "bAssetIndex": 2, + "bAssetQty": "1000000000000000000", + "expectedQty": "968846001685919294", + "priceReceived": 1.0321557794116596 + }, + { + "bAssetIndex": 2, + "bAssetQty": "10000000000000000000", + "expectedQty": "9688459757821565729", + "priceReceived": 1.0321558070081187 + }, + { + "bAssetIndex": 2, + "bAssetQty": "100000000000000000000", + "expectedQty": "96884571674398445885", + "priceReceived": 1.0321560829733718 + }, + { + "bAssetIndex": 2, + "bAssetQty": "699200000000000050331648", + "hardLimitError": true + }, + { + "bAssetIndex": 2, + "bAssetQty": "1398400000000000100663296", + "hardLimitError": true + }, + { + "bAssetIndex": 2, + "bAssetQty": "2097600000000000016777216", + "hardLimitError": true + }, + { + "bAssetIndex": 2, + "bAssetQty": "2796800000000000201326592", + "hardLimitError": true + }, + { + "bAssetIndex": 2, + "bAssetQty": "3496000000000000117440512", + "hardLimitError": true + }, + { + "bAssetIndex": 2, + "bAssetQty": "4195200000000000033554432", + "hardLimitError": true + }, + { + "bAssetIndex": 2, + "bAssetQty": "4894399999999999949668352", + "hardLimitError": true + }, + { + "bAssetIndex": 2, + "bAssetQty": "5593600000000000402653184", + "hardLimitError": true + }, + { + "bAssetIndex": 2, + "bAssetQty": "6292799999999999781896192", + "hardLimitError": true + }, + { + "bAssetIndex": 2, + "bAssetQty": "6992000000000000234881024", + "hardLimitError": true + } + ] + }, + { + "reserve0": "3996499999999999360000000", + "reserve1": "5503000000000000000000000", + "reserve2": "500500000000000000000000", + "A": 120, + "mAssetSupply": "9936488013915504712820075", + "hardMin": 50000000000000000, + "hardMax": 750000000000000000, + "swapFeeRate": 600000000000000, + "mints": [ + { + "bAssetIndex": 0, + "bAssetQty": "10000000000000", + "expectedQty": "9892618042466", + "priceReceived": 1.0108547562508774 + }, + { + "bAssetIndex": 0, + "bAssetQty": "1000000000000000", + "expectedQty": "989261804244580", + "priceReceived": 1.0108547562529415 + }, + { + "bAssetIndex": 0, + "bAssetQty": "100000000000000000", + "expectedQty": "98926180404884481", + "priceReceived": 1.010854756452949 + }, + { + "bAssetIndex": 0, + "bAssetQty": "1000000000000000000", + "expectedQty": "989261802269436564", + "priceReceived": 1.010854758271197 + }, + { + "bAssetIndex": 0, + "bAssetQty": "10000000000000000000", + "expectedQty": "9892617844753675832", + "priceReceived": 1.0108547764536635 + }, + { + "bAssetIndex": 0, + "bAssetQty": "100000000000000000000", + "expectedQty": "98926160653601652020", + "priceReceived": 1.010854958276997 + }, + { + "bAssetIndex": 0, + "bAssetQty": "699200000000000050331648", + "hardLimitError": true + }, + { + "bAssetIndex": 0, + "bAssetQty": "1398400000000000100663296", + "hardLimitError": true + }, + { + "bAssetIndex": 0, + "bAssetQty": "2097600000000000016777216", + "hardLimitError": true + }, + { + "bAssetIndex": 0, + "bAssetQty": "2796800000000000201326592", + "hardLimitError": true + }, + { + "bAssetIndex": 0, + "bAssetQty": "3496000000000000117440512", + "hardLimitError": true + }, + { + "bAssetIndex": 0, + "bAssetQty": "4195200000000000033554432", + "hardLimitError": true + }, + { + "bAssetIndex": 0, + "bAssetQty": "4894399999999999949668352", + "hardLimitError": true + }, + { + "bAssetIndex": 0, + "bAssetQty": "5593600000000000402653184", + "hardLimitError": true + }, + { + "bAssetIndex": 0, + "bAssetQty": "6292799999999999781896192", + "hardLimitError": true + }, + { + "bAssetIndex": 0, + "bAssetQty": "6992000000000000234881024", + "hardLimitError": true + }, + { + "bAssetIndex": 1, + "bAssetQty": "10000000000000", + "expectedQty": "9832251954605", + "priceReceived": 1.0170609994708724 + }, + { + "bAssetIndex": 1, + "bAssetQty": "1000000000000000", + "expectedQty": "983225195458701", + "priceReceived": 1.0170609994727333 + }, + { + "bAssetIndex": 1, + "bAssetQty": "100000000000000000", + "expectedQty": "98322519528556775", + "priceReceived": 1.0170609996518245 + }, + { + "bAssetIndex": 1, + "bAssetQty": "1000000000000000000", + "expectedQty": "983225193711637753", + "priceReceived": 1.0170610012799184 + }, + { + "bAssetIndex": 1, + "bAssetQty": "10000000000000000000", + "expectedQty": "9832251779723363751", + "priceReceived": 1.0170610175608579 + }, + { + "bAssetIndex": 1, + "bAssetQty": "100000000000000000000", + "expectedQty": "98322502057917477303", + "priceReceived": 1.0170611803704344 + }, + { + "bAssetIndex": 1, + "bAssetQty": "699200000000000050331648", + "hardLimitError": true + }, + { + "bAssetIndex": 1, + "bAssetQty": "1398400000000000100663296", + "hardLimitError": true + }, + { + "bAssetIndex": 1, + "bAssetQty": "2097600000000000016777216", + "hardLimitError": true + }, + { + "bAssetIndex": 1, + "bAssetQty": "2796800000000000201326592", + "hardLimitError": true + }, + { + "bAssetIndex": 1, + "bAssetQty": "3496000000000000117440512", + "hardLimitError": true + }, + { + "bAssetIndex": 1, + "bAssetQty": "4195200000000000033554432", + "hardLimitError": true + }, + { + "bAssetIndex": 1, + "bAssetQty": "4894399999999999949668352", + "hardLimitError": true + }, + { + "bAssetIndex": 1, + "bAssetQty": "5593600000000000402653184", + "hardLimitError": true + }, + { + "bAssetIndex": 1, + "bAssetQty": "6292799999999999781896192", + "hardLimitError": true + }, + { + "bAssetIndex": 1, + "bAssetQty": "6992000000000000234881024", + "hardLimitError": true + }, + { + "bAssetIndex": 2, + "bAssetQty": "10000000000000", + "expectedQty": "11432866386092", + "priceReceived": 0.8746712908466182 + }, + { + "bAssetIndex": 2, + "bAssetQty": "1000000000000000", + "expectedQty": "1143286638334208", + "priceReceived": 0.8746712910570007 + }, + { + "bAssetIndex": 2, + "bAssetQty": "100000000000000000", + "expectedQty": "114328661083569904", + "priceReceived": 0.8746713120947319 + }, + { + "bAssetIndex": 2, + "bAssetQty": "1000000000000000000", + "expectedQty": "1143286360849746210", + "priceReceived": 0.874671503346503 + }, + { + "bAssetIndex": 2, + "bAssetQty": "10000000000000000000", + "expectedQty": "11432838610381658208", + "priceReceived": 0.8746734158321311 + }, + { + "bAssetIndex": 2, + "bAssetQty": "100000000000000000000", + "expectedQty": "114325886771621960149", + "priceReceived": 0.8746925374806894 + }, + { + "bAssetIndex": 2, + "bAssetQty": "699200000000000050331648", + "expectedQty": "741678171179218686429800", + "priceReceived": 0.9427269497338971 + }, + { + "bAssetIndex": 2, + "bAssetQty": "1398400000000000100663296", + "expectedQty": "1452105731306633575856596", + "priceReceived": 0.9630152748875194 + }, + { + "bAssetIndex": 2, + "bAssetQty": "2097600000000000016777216", + "expectedQty": "2156200194980878262700900", + "priceReceived": 0.9728224702338467 + }, + { + "bAssetIndex": 2, + "bAssetQty": "2796800000000000201326592", + "expectedQty": "2857835872184337931168178", + "priceReceived": 0.9786426250792051 + }, + { + "bAssetIndex": 2, + "bAssetQty": "3496000000000000117440512", + "expectedQty": "3558180045961155437097768", + "priceReceived": 0.9825247612099519 + }, + { + "bAssetIndex": 2, + "bAssetQty": "4195200000000000033554432", + "expectedQty": "4257701656529446269530387", + "priceReceived": 0.9853203297056767 + }, + { + "bAssetIndex": 2, + "bAssetQty": "4894399999999999949668352", + "expectedQty": "4956622542256418842610799", + "priceReceived": 0.9874465844986265 + }, + { + "bAssetIndex": 2, + "bAssetQty": "5593600000000000402653184", + "expectedQty": "5655058851205474401832123", + "priceReceived": 0.9891320580700282 + }, + { + "bAssetIndex": 2, + "bAssetQty": "6292799999999999781896192", + "expectedQty": "6353075328572007239119684", + "priceReceived": 0.9905124171437212 + }, + { + "bAssetIndex": 2, + "bAssetQty": "6992000000000000234881024", + "expectedQty": "7050709272680501025142512", + "priceReceived": 0.9916732813097283 + } + ] + }, + { + "reserve0": "3996499999999999360000000", + "reserve1": "2007000000000000960000000", + "reserve2": "3996499999999999360000000", + "A": 120, + "mAssetSupply": "9995726520619110731126433", + "hardMin": 50000000000000000, + "hardMax": 750000000000000000, + "swapFeeRate": 600000000000000, + "mints": [ + { + "bAssetIndex": 0, + "bAssetQty": "10000000000000", + "expectedQty": "9979935570674", + "priceReceived": 1.002010476839646 + }, + { + "bAssetIndex": 0, + "bAssetQty": "1000000000000000", + "expectedQty": "997993557066692", + "priceReceived": 1.0020104768403568 + }, + { + "bAssetIndex": 0, + "bAssetQty": "100000000000000000", + "expectedQty": "99799355699606328", + "priceReceived": 1.0020104769112699 + }, + { + "bAssetIndex": 0, + "bAssetQty": "1000000000000000000", + "expectedQty": "997993556353984498", + "priceReceived": 1.002010477555933 + }, + { + "bAssetIndex": 0, + "bAssetQty": "10000000000000000000", + "expectedQty": "9979935499332013774", + "priceReceived": 1.0020104840025599 + }, + { + "bAssetIndex": 0, + "bAssetQty": "100000000000000000000", + "expectedQty": "99799348572583949084", + "priceReceived": 1.0020105484683612 + }, + { + "bAssetIndex": 0, + "bAssetQty": "699200000000000050331648", + "expectedQty": "697463049145752630825887", + "priceReceived": 1.0024903840517068 + }, + { + "bAssetIndex": 0, + "bAssetQty": "1398400000000000100663296", + "expectedQty": "1394297537312687357246463", + "priceReceived": 1.0029423150923866 + }, + { + "bAssetIndex": 0, + "bAssetQty": "2097600000000000016777216", + "expectedQty": "2090534177142072198604999", + "priceReceived": 1.0033799126248142 + }, + { + "bAssetIndex": 0, + "bAssetQty": "2796800000000000201326592", + "expectedQty": "2786181338416885026428332", + "priceReceived": 1.0038111882513536 + }, + { + "bAssetIndex": 0, + "bAssetQty": "3496000000000000117440512", + "expectedQty": "3481235579829406229717057", + "priceReceived": 1.0042411436491516 + }, + { + "bAssetIndex": 0, + "bAssetQty": "4195200000000000033554432", + "expectedQty": "4175686799036286876935350", + "priceReceived": 1.0046730518601674 + }, + { + "bAssetIndex": 0, + "bAssetQty": "4894399999999999949668352", + "expectedQty": "4869520959749015472848888", + "priceReceived": 1.0051091350579722 + }, + { + "bAssetIndex": 0, + "bAssetQty": "5593600000000000402653184", + "expectedQty": "5562721630840957913206527", + "priceReceived": 1.005550946318767 + }, + { + "bAssetIndex": 0, + "bAssetQty": "6292799999999999781896192", + "expectedQty": "6255270901791376247372883", + "priceReceived": 1.005999595988381 + }, + { + "bAssetIndex": 0, + "bAssetQty": "6992000000000000234881024", + "expectedQty": "6947149951809925188879129", + "priceReceived": 1.0064558917687376 + }, + { + "bAssetIndex": 1, + "bAssetQty": "10000000000000", + "expectedQty": "10058614942598", + "priceReceived": 0.9941726626446582 + }, + { + "bAssetIndex": 1, + "bAssetQty": "1000000000000000", + "expectedQty": "1005861494256321", + "priceReceived": 0.9941726626480968 + }, + { + "bAssetIndex": 1, + "bAssetQty": "100000000000000000", + "expectedQty": "100586149391571656", + "priceReceived": 0.9941726629847432 + }, + { + "bAssetIndex": 1, + "bAssetQty": "1000000000000000000", + "expectedQty": "1005861490819319821", + "priceReceived": 0.9941726660451576 + }, + { + "bAssetIndex": 1, + "bAssetQty": "10000000000000000000", + "expectedQty": "10058614598554929567", + "priceReceived": 0.9941726966491637 + }, + { + "bAssetIndex": 1, + "bAssetQty": "100000000000000000000", + "expectedQty": "100586115023126883866", + "priceReceived": 0.9941730026754476 + }, + { + "bAssetIndex": 1, + "bAssetQty": "699200000000000050331648", + "expectedQty": "702016130027513514676957", + "priceReceived": 0.9959885109372015 + }, + { + "bAssetIndex": 1, + "bAssetQty": "1398400000000000100663296", + "expectedQty": "1402409205977358729703359", + "priceReceived": 0.9971412010415572 + }, + { + "bAssetIndex": 1, + "bAssetQty": "2097600000000000016777216", + "expectedQty": "2101865542055031215754228", + "priceReceived": 0.9979705923287269 + }, + { + "bAssetIndex": 1, + "bAssetQty": "2796800000000000201326592", + "expectedQty": "2800665664244178037349474", + "priceReceived": 0.9986197337677502 + }, + { + "bAssetIndex": 1, + "bAssetQty": "3496000000000000117440512", + "expectedQty": "3498941539257549736263678", + "priceReceived": 0.9991593059716642 + }, + { + "bAssetIndex": 1, + "bAssetQty": "4195200000000000033554432", + "expectedQty": "4196760179169993801281722", + "priceReceived": 0.9996282420001654 + }, + { + "bAssetIndex": 1, + "bAssetQty": "4894399999999999949668352", + "expectedQty": "4894156522336345491706039", + "priceReceived": 1.0000497486466857 + }, + { + "bAssetIndex": 1, + "bAssetQty": "5593600000000000402653184", + "expectedQty": "5591148198088038016553653", + "priceReceived": 1.0004385149212822 + }, + { + "bAssetIndex": 1, + "bAssetQty": "6292799999999999781896192", + "expectedQty": "6287742841543760775892450", + "priceReceived": 1.0008042883724229 + }, + { + "bAssetIndex": 1, + "bAssetQty": "6992000000000000234881024", + "expectedQty": "6983942004489696902085786", + "priceReceived": 1.0011537890069997 + }, + { + "bAssetIndex": 2, + "bAssetQty": "10000000000000", + "expectedQty": "9979935570674", + "priceReceived": 1.002010476839646 + }, + { + "bAssetIndex": 2, + "bAssetQty": "1000000000000000", + "expectedQty": "997993557066692", + "priceReceived": 1.0020104768403568 + }, + { + "bAssetIndex": 2, + "bAssetQty": "100000000000000000", + "expectedQty": "99799355699606328", + "priceReceived": 1.0020104769112699 + }, + { + "bAssetIndex": 2, + "bAssetQty": "1000000000000000000", + "expectedQty": "997993556353984498", + "priceReceived": 1.002010477555933 + }, + { + "bAssetIndex": 2, + "bAssetQty": "10000000000000000000", + "expectedQty": "9979935499332013774", + "priceReceived": 1.0020104840025599 + }, + { + "bAssetIndex": 2, + "bAssetQty": "100000000000000000000", + "expectedQty": "99799348572583949084", + "priceReceived": 1.0020105484683612 + }, + { + "bAssetIndex": 2, + "bAssetQty": "699200000000000050331648", + "expectedQty": "697463049145752630825887", + "priceReceived": 1.0024903840517068 + }, + { + "bAssetIndex": 2, + "bAssetQty": "1398400000000000100663296", + "expectedQty": "1394297537312687357246463", + "priceReceived": 1.0029423150923866 + }, + { + "bAssetIndex": 2, + "bAssetQty": "2097600000000000016777216", + "expectedQty": "2090534177142072198604999", + "priceReceived": 1.0033799126248142 + }, + { + "bAssetIndex": 2, + "bAssetQty": "2796800000000000201326592", + "expectedQty": "2786181338416885026428332", + "priceReceived": 1.0038111882513536 + }, + { + "bAssetIndex": 2, + "bAssetQty": "3496000000000000117440512", + "expectedQty": "3481235579829406229717057", + "priceReceived": 1.0042411436491516 + }, + { + "bAssetIndex": 2, + "bAssetQty": "4195200000000000033554432", + "expectedQty": "4175686799036286876935350", + "priceReceived": 1.0046730518601674 + }, + { + "bAssetIndex": 2, + "bAssetQty": "4894399999999999949668352", + "expectedQty": "4869520959749015472848888", + "priceReceived": 1.0051091350579722 + }, + { + "bAssetIndex": 2, + "bAssetQty": "5593600000000000402653184", + "expectedQty": "5562721630840957913206527", + "priceReceived": 1.005550946318767 + }, + { + "bAssetIndex": 2, + "bAssetQty": "6292799999999999781896192", + "expectedQty": "6255270901791376247372883", + "priceReceived": 1.005999595988381 + }, + { + "bAssetIndex": 2, + "bAssetQty": "6992000000000000234881024", + "expectedQty": "6947149951809925188879129", + "priceReceived": 1.0064558917687376 + } + ] + }, + { + "reserve0": "7492500000000000000000000", + "reserve1": "2007000000000000000000000", + "reserve2": "500500000000000000000000", + "A": 120, + "mAssetSupply": "9896372713490403790662354", + "hardMin": 50000000000000000, + "hardMax": 750000000000000000, + "swapFeeRate": 600000000000000, + "mints": [ + { + "bAssetIndex": 0, + "bAssetQty": "10000000000000", + "expectedQty": "9688460045641", + "priceReceived": 1.0321557763454026 + }, + { + "bAssetIndex": 0, + "bAssetQty": "1000000000000000", + "expectedQty": "968846004561237", + "priceReceived": 1.0321557763484526 + }, + { + "bAssetIndex": 0, + "bAssetQty": "100000000000000000", + "expectedQty": "96884600427629503", + "priceReceived": 1.0321557766520142 + }, + { + "bAssetIndex": 0, + "bAssetQty": "1000000000000000000", + "expectedQty": "968846001685919294", + "priceReceived": 1.0321557794116596 + }, + { + "bAssetIndex": 0, + "bAssetQty": "10000000000000000000", + "expectedQty": "9688459757821565729", + "priceReceived": 1.0321558070081187 + }, + { + "bAssetIndex": 0, + "bAssetQty": "100000000000000000000", + "expectedQty": "96884571674398445885", + "priceReceived": 1.0321560829733718 + }, + { + "bAssetIndex": 0, + "bAssetQty": "699200000000000050331648", + "hardLimitError": true + }, + { + "bAssetIndex": 0, + "bAssetQty": "1398400000000000100663296", + "hardLimitError": true + }, + { + "bAssetIndex": 0, + "bAssetQty": "2097600000000000016777216", + "hardLimitError": true + }, + { + "bAssetIndex": 0, + "bAssetQty": "2796800000000000201326592", + "hardLimitError": true + }, + { + "bAssetIndex": 0, + "bAssetQty": "3496000000000000117440512", + "hardLimitError": true + }, + { + "bAssetIndex": 0, + "bAssetQty": "4195200000000000033554432", + "hardLimitError": true + }, + { + "bAssetIndex": 0, + "bAssetQty": "4894399999999999949668352", + "hardLimitError": true + }, + { + "bAssetIndex": 0, + "bAssetQty": "5593600000000000402653184", + "hardLimitError": true + }, + { + "bAssetIndex": 0, + "bAssetQty": "6292799999999999781896192", + "hardLimitError": true + }, + { + "bAssetIndex": 0, + "bAssetQty": "6992000000000000234881024", + "hardLimitError": true + }, + { + "bAssetIndex": 1, + "bAssetQty": "10000000000000", + "expectedQty": "10143890658606", + "priceReceived": 0.9858150424281314 + }, + { + "bAssetIndex": 1, + "bAssetQty": "1000000000000000", + "expectedQty": "1014389065847321", + "priceReceived": 0.9858150424410363 + }, + { + "bAssetIndex": 1, + "bAssetQty": "100000000000000000", + "expectedQty": "101438906452467690", + "priceReceived": 0.9858150437264234 + }, + { + "bAssetIndex": 1, + "bAssetQty": "1000000000000000000", + "expectedQty": "1014389052500646933", + "priceReceived": 0.9858150554117522 + }, + { + "bAssetIndex": 1, + "bAssetQty": "10000000000000000000", + "expectedQty": "10143889322608810609", + "priceReceived": 0.9858151722645367 + }, + { + "bAssetIndex": 1, + "bAssetQty": "100000000000000000000", + "expectedQty": "101438772991659315644", + "priceReceived": 0.9858163407420394 + }, + { + "bAssetIndex": 1, + "bAssetQty": "699200000000000050331648", + "hardLimitError": true + }, + { + "bAssetIndex": 1, + "bAssetQty": "1398400000000000100663296", + "hardLimitError": true + }, + { + "bAssetIndex": 1, + "bAssetQty": "2097600000000000016777216", + "hardLimitError": true + }, + { + "bAssetIndex": 1, + "bAssetQty": "2796800000000000201326592", + "hardLimitError": true + }, + { + "bAssetIndex": 1, + "bAssetQty": "3496000000000000117440512", + "hardLimitError": true + }, + { + "bAssetIndex": 1, + "bAssetQty": "4195200000000000033554432", + "hardLimitError": true + }, + { + "bAssetIndex": 1, + "bAssetQty": "4894399999999999949668352", + "hardLimitError": true + }, + { + "bAssetIndex": 1, + "bAssetQty": "5593600000000000402653184", + "hardLimitError": true + }, + { + "bAssetIndex": 1, + "bAssetQty": "6292799999999999781896192", + "hardLimitError": true + }, + { + "bAssetIndex": 1, + "bAssetQty": "6992000000000000234881024", + "hardLimitError": true + }, + { + "bAssetIndex": 2, + "bAssetQty": "10000000000000", + "expectedQty": "12016287095094", + "priceReceived": 0.8322038181064092 + }, + { + "bAssetIndex": 2, + "bAssetQty": "1000000000000000", + "expectedQty": "1201628709124981", + "priceReceived": 0.8322038183726437 + }, + { + "bAssetIndex": 2, + "bAssetQty": "100000000000000000", + "expectedQty": "120162867068477766", + "priceReceived": 0.8322038449949146 + }, + { + "bAssetIndex": 2, + "bAssetQty": "1000000000000000000", + "expectedQty": "1201628321229059126", + "priceReceived": 0.8322040870151696 + }, + { + "bAssetIndex": 2, + "bAssetQty": "10000000000000000000", + "expectedQty": "12016248267380638563", + "priceReceived": 0.8322065071796199 + }, + { + "bAssetIndex": 2, + "bAssetQty": "100000000000000000000", + "expectedQty": "120158988844584723143", + "priceReceived": 0.832230705014848 + }, + { + "bAssetIndex": 2, + "bAssetQty": "699200000000000050331648", + "expectedQty": "758915093464738136563169", + "priceReceived": 0.9213151853495023 + }, + { + "bAssetIndex": 2, + "bAssetQty": "1398400000000000100663296", + "expectedQty": "1473400530309341117742129", + "priceReceived": 0.9490969843117983 + }, + { + "bAssetIndex": 2, + "bAssetQty": "2097600000000000016777216", + "expectedQty": "2178783980315529571380871", + "priceReceived": 0.9627388575237401 + }, + { + "bAssetIndex": 2, + "bAssetQty": "2796800000000000201326592", + "expectedQty": "2880620127293826852497696", + "priceReceived": 0.9709020545612271 + }, + { + "bAssetIndex": 2, + "bAssetQty": "3496000000000000117440512", + "expectedQty": "3580589386958113473567706", + "priceReceived": 0.9763755689869884 + }, + { + "bAssetIndex": 2, + "bAssetQty": "4195200000000000033554432", + "expectedQty": "4279368449887122287928618", + "priceReceived": 0.9803315720829454 + }, + { + "bAssetIndex": 2, + "bAssetQty": "4894399999999999949668352", + "expectedQty": "4977278016127211467001887", + "priceReceived": 0.9833487267822547 + }, + { + "bAssetIndex": 2, + "bAssetQty": "5593600000000000402653184", + "expectedQty": "5674486299978109779032834", + "priceReceived": 0.9857456171885689 + }, + { + "bAssetIndex": 2, + "bAssetQty": "6292799999999999781896192", + "expectedQty": "6371087286239571166925768", + "priceReceived": 0.9877120995644404 + }, + { + "bAssetIndex": 2, + "bAssetQty": "6992000000000000234881024", + "expectedQty": "7067135305137869045136995", + "priceReceived": 0.9893683505559537 + } + ] + }, + { + "reserve0": "500500000000000000000000", + "reserve1": "3996499999999999360000000", + "reserve2": "5503000000000000000000000", + "A": 120, + "mAssetSupply": "9936488013915504712820075", + "hardMin": 50000000000000000, + "hardMax": 750000000000000000, + "swapFeeRate": 600000000000000, + "mints": [ + { + "bAssetIndex": 0, + "bAssetQty": "10000000000000", + "expectedQty": "11432866386092", + "priceReceived": 0.8746712908466182 + }, + { + "bAssetIndex": 0, + "bAssetQty": "1000000000000000", + "expectedQty": "1143286638334208", + "priceReceived": 0.8746712910570007 + }, + { + "bAssetIndex": 0, + "bAssetQty": "100000000000000000", + "expectedQty": "114328661083569904", + "priceReceived": 0.8746713120947319 + }, + { + "bAssetIndex": 0, + "bAssetQty": "1000000000000000000", + "expectedQty": "1143286360849746210", + "priceReceived": 0.874671503346503 + }, + { + "bAssetIndex": 0, + "bAssetQty": "10000000000000000000", + "expectedQty": "11432838610381658208", + "priceReceived": 0.8746734158321311 + }, + { + "bAssetIndex": 0, + "bAssetQty": "100000000000000000000", + "expectedQty": "114325886771621960149", + "priceReceived": 0.8746925374806894 + }, + { + "bAssetIndex": 0, + "bAssetQty": "699200000000000050331648", + "expectedQty": "741678171179218686429800", + "priceReceived": 0.9427269497338971 + }, + { + "bAssetIndex": 0, + "bAssetQty": "1398400000000000100663296", + "expectedQty": "1452105731306633575856596", + "priceReceived": 0.9630152748875194 + }, + { + "bAssetIndex": 0, + "bAssetQty": "2097600000000000016777216", + "expectedQty": "2156200194980878262700900", + "priceReceived": 0.9728224702338467 + }, + { + "bAssetIndex": 0, + "bAssetQty": "2796800000000000201326592", + "expectedQty": "2857835872184337931168178", + "priceReceived": 0.9786426250792051 + }, + { + "bAssetIndex": 0, + "bAssetQty": "3496000000000000117440512", + "expectedQty": "3558180045961155437097768", + "priceReceived": 0.9825247612099519 + }, + { + "bAssetIndex": 0, + "bAssetQty": "4195200000000000033554432", + "expectedQty": "4257701656529446269530387", + "priceReceived": 0.9853203297056767 + }, + { + "bAssetIndex": 0, + "bAssetQty": "4894399999999999949668352", + "expectedQty": "4956622542256418842610799", + "priceReceived": 0.9874465844986265 + }, + { + "bAssetIndex": 0, + "bAssetQty": "5593600000000000402653184", + "expectedQty": "5655058851205474401832123", + "priceReceived": 0.9891320580700282 + }, + { + "bAssetIndex": 0, + "bAssetQty": "6292799999999999781896192", + "expectedQty": "6353075328572007239119684", + "priceReceived": 0.9905124171437212 + }, + { + "bAssetIndex": 0, + "bAssetQty": "6992000000000000234881024", + "expectedQty": "7050709272680501025142512", + "priceReceived": 0.9916732813097283 + }, + { + "bAssetIndex": 1, + "bAssetQty": "10000000000000", + "expectedQty": "9892618042466", + "priceReceived": 1.0108547562508774 + }, + { + "bAssetIndex": 1, + "bAssetQty": "1000000000000000", + "expectedQty": "989261804244580", + "priceReceived": 1.0108547562529415 + }, + { + "bAssetIndex": 1, + "bAssetQty": "100000000000000000", + "expectedQty": "98926180404884481", + "priceReceived": 1.010854756452949 + }, + { + "bAssetIndex": 1, + "bAssetQty": "1000000000000000000", + "expectedQty": "989261802269436564", + "priceReceived": 1.010854758271197 + }, + { + "bAssetIndex": 1, + "bAssetQty": "10000000000000000000", + "expectedQty": "9892617844753675832", + "priceReceived": 1.0108547764536635 + }, + { + "bAssetIndex": 1, + "bAssetQty": "100000000000000000000", + "expectedQty": "98926160653601652020", + "priceReceived": 1.010854958276997 + }, + { + "bAssetIndex": 1, + "bAssetQty": "699200000000000050331648", + "hardLimitError": true + }, + { + "bAssetIndex": 1, + "bAssetQty": "1398400000000000100663296", + "hardLimitError": true + }, + { + "bAssetIndex": 1, + "bAssetQty": "2097600000000000016777216", + "hardLimitError": true + }, + { + "bAssetIndex": 1, + "bAssetQty": "2796800000000000201326592", + "hardLimitError": true + }, + { + "bAssetIndex": 1, + "bAssetQty": "3496000000000000117440512", + "hardLimitError": true + }, + { + "bAssetIndex": 1, + "bAssetQty": "4195200000000000033554432", + "hardLimitError": true + }, + { + "bAssetIndex": 1, + "bAssetQty": "4894399999999999949668352", + "hardLimitError": true + }, + { + "bAssetIndex": 1, + "bAssetQty": "5593600000000000402653184", + "hardLimitError": true + }, + { + "bAssetIndex": 1, + "bAssetQty": "6292799999999999781896192", + "hardLimitError": true + }, + { + "bAssetIndex": 1, + "bAssetQty": "6992000000000000234881024", + "hardLimitError": true + }, + { + "bAssetIndex": 2, + "bAssetQty": "10000000000000", + "expectedQty": "9832251954605", + "priceReceived": 1.0170609994708724 + }, + { + "bAssetIndex": 2, + "bAssetQty": "1000000000000000", + "expectedQty": "983225195458701", + "priceReceived": 1.0170609994727333 + }, + { + "bAssetIndex": 2, + "bAssetQty": "100000000000000000", + "expectedQty": "98322519528556775", + "priceReceived": 1.0170609996518245 + }, + { + "bAssetIndex": 2, + "bAssetQty": "1000000000000000000", + "expectedQty": "983225193711637753", + "priceReceived": 1.0170610012799184 + }, + { + "bAssetIndex": 2, + "bAssetQty": "10000000000000000000", + "expectedQty": "9832251779723363751", + "priceReceived": 1.0170610175608579 + }, + { + "bAssetIndex": 2, + "bAssetQty": "100000000000000000000", + "expectedQty": "98322502057917477303", + "priceReceived": 1.0170611803704344 + }, + { + "bAssetIndex": 2, + "bAssetQty": "699200000000000050331648", + "hardLimitError": true + }, + { + "bAssetIndex": 2, + "bAssetQty": "1398400000000000100663296", + "hardLimitError": true + }, + { + "bAssetIndex": 2, + "bAssetQty": "2097600000000000016777216", + "hardLimitError": true + }, + { + "bAssetIndex": 2, + "bAssetQty": "2796800000000000201326592", + "hardLimitError": true + }, + { + "bAssetIndex": 2, + "bAssetQty": "3496000000000000117440512", + "hardLimitError": true + }, + { + "bAssetIndex": 2, + "bAssetQty": "4195200000000000033554432", + "hardLimitError": true + }, + { + "bAssetIndex": 2, + "bAssetQty": "4894399999999999949668352", + "hardLimitError": true + }, + { + "bAssetIndex": 2, + "bAssetQty": "5593600000000000402653184", + "hardLimitError": true + }, + { + "bAssetIndex": 2, + "bAssetQty": "6292799999999999781896192", + "hardLimitError": true + }, + { + "bAssetIndex": 2, + "bAssetQty": "6992000000000000234881024", + "hardLimitError": true + } + ] + }, + { + "reserve0": "500500000000000000000000", + "reserve1": "7492500000000000000000000", + "reserve2": "2007000000000000000000000", + "A": 120, + "mAssetSupply": "9896372713490403790662354", + "hardMin": 50000000000000000, + "hardMax": 750000000000000000, + "swapFeeRate": 600000000000000, + "mints": [ + { + "bAssetIndex": 0, + "bAssetQty": "10000000000000", + "expectedQty": "12016287095094", + "priceReceived": 0.8322038181064092 + }, + { + "bAssetIndex": 0, + "bAssetQty": "1000000000000000", + "expectedQty": "1201628709124981", + "priceReceived": 0.8322038183726437 + }, + { + "bAssetIndex": 0, + "bAssetQty": "100000000000000000", + "expectedQty": "120162867068477766", + "priceReceived": 0.8322038449949146 + }, + { + "bAssetIndex": 0, + "bAssetQty": "1000000000000000000", + "expectedQty": "1201628321229059126", + "priceReceived": 0.8322040870151696 + }, + { + "bAssetIndex": 0, + "bAssetQty": "10000000000000000000", + "expectedQty": "12016248267380638563", + "priceReceived": 0.8322065071796199 + }, + { + "bAssetIndex": 0, + "bAssetQty": "100000000000000000000", + "expectedQty": "120158988844584723142", + "priceReceived": 0.832230705014848 + }, + { + "bAssetIndex": 0, + "bAssetQty": "699200000000000050331648", + "expectedQty": "758915093464738136563169", + "priceReceived": 0.9213151853495023 + }, + { + "bAssetIndex": 0, + "bAssetQty": "1398400000000000100663296", + "expectedQty": "1473400530309341117742129", + "priceReceived": 0.9490969843117983 + }, + { + "bAssetIndex": 0, + "bAssetQty": "2097600000000000016777216", + "expectedQty": "2178783980315529571380871", + "priceReceived": 0.9627388575237401 + }, + { + "bAssetIndex": 0, + "bAssetQty": "2796800000000000201326592", + "expectedQty": "2880620127293826852497696", + "priceReceived": 0.9709020545612271 + }, + { + "bAssetIndex": 0, + "bAssetQty": "3496000000000000117440512", + "expectedQty": "3580589386958113473567706", + "priceReceived": 0.9763755689869884 + }, + { + "bAssetIndex": 0, + "bAssetQty": "4195200000000000033554432", + "expectedQty": "4279368449887122287928618", + "priceReceived": 0.9803315720829454 + }, + { + "bAssetIndex": 0, + "bAssetQty": "4894399999999999949668352", + "expectedQty": "4977278016127211467001887", + "priceReceived": 0.9833487267822547 + }, + { + "bAssetIndex": 0, + "bAssetQty": "5593600000000000402653184", + "expectedQty": "5674486299978109779032834", + "priceReceived": 0.9857456171885689 + }, + { + "bAssetIndex": 0, + "bAssetQty": "6292799999999999781896192", + "expectedQty": "6371087286239571166925768", + "priceReceived": 0.9877120995644404 + }, + { + "bAssetIndex": 0, + "bAssetQty": "6992000000000000234881024", + "expectedQty": "7067135305137869045136995", + "priceReceived": 0.9893683505559537 + }, + { + "bAssetIndex": 1, + "bAssetQty": "10000000000000", + "expectedQty": "9688460045641", + "priceReceived": 1.0321557763454026 + }, + { + "bAssetIndex": 1, + "bAssetQty": "1000000000000000", + "expectedQty": "968846004561237", + "priceReceived": 1.0321557763484526 + }, + { + "bAssetIndex": 1, + "bAssetQty": "100000000000000000", + "expectedQty": "96884600427629503", + "priceReceived": 1.0321557766520142 + }, + { + "bAssetIndex": 1, + "bAssetQty": "1000000000000000000", + "expectedQty": "968846001685919294", + "priceReceived": 1.0321557794116596 + }, + { + "bAssetIndex": 1, + "bAssetQty": "10000000000000000000", + "expectedQty": "9688459757821565729", + "priceReceived": 1.0321558070081187 + }, + { + "bAssetIndex": 1, + "bAssetQty": "100000000000000000000", + "expectedQty": "96884571674398445885", + "priceReceived": 1.0321560829733718 + }, + { + "bAssetIndex": 1, + "bAssetQty": "699200000000000050331648", + "hardLimitError": true + }, + { + "bAssetIndex": 1, + "bAssetQty": "1398400000000000100663296", + "hardLimitError": true + }, + { + "bAssetIndex": 1, + "bAssetQty": "2097600000000000016777216", + "hardLimitError": true + }, + { + "bAssetIndex": 1, + "bAssetQty": "2796800000000000201326592", + "hardLimitError": true + }, + { + "bAssetIndex": 1, + "bAssetQty": "3496000000000000117440512", + "hardLimitError": true + }, + { + "bAssetIndex": 1, + "bAssetQty": "4195200000000000033554432", + "hardLimitError": true + }, + { + "bAssetIndex": 1, + "bAssetQty": "4894399999999999949668352", + "hardLimitError": true + }, + { + "bAssetIndex": 1, + "bAssetQty": "5593600000000000402653184", + "hardLimitError": true + }, + { + "bAssetIndex": 1, + "bAssetQty": "6292799999999999781896192", + "hardLimitError": true + }, + { + "bAssetIndex": 1, + "bAssetQty": "6992000000000000234881024", + "hardLimitError": true + }, + { + "bAssetIndex": 2, + "bAssetQty": "10000000000000", + "expectedQty": "10143890658606", + "priceReceived": 0.9858150424281314 + }, + { + "bAssetIndex": 2, + "bAssetQty": "1000000000000000", + "expectedQty": "1014389065847321", + "priceReceived": 0.9858150424410363 + }, + { + "bAssetIndex": 2, + "bAssetQty": "100000000000000000", + "expectedQty": "101438906452467690", + "priceReceived": 0.9858150437264234 + }, + { + "bAssetIndex": 2, + "bAssetQty": "1000000000000000000", + "expectedQty": "1014389052500646933", + "priceReceived": 0.9858150554117522 + }, + { + "bAssetIndex": 2, + "bAssetQty": "10000000000000000000", + "expectedQty": "10143889322608810609", + "priceReceived": 0.9858151722645367 + }, + { + "bAssetIndex": 2, + "bAssetQty": "100000000000000000000", + "expectedQty": "101438772991659315644", + "priceReceived": 0.9858163407420394 + }, + { + "bAssetIndex": 2, + "bAssetQty": "699200000000000050331648", + "hardLimitError": true + }, + { + "bAssetIndex": 2, + "bAssetQty": "1398400000000000100663296", + "hardLimitError": true + }, + { + "bAssetIndex": 2, + "bAssetQty": "2097600000000000016777216", + "hardLimitError": true + }, + { + "bAssetIndex": 2, + "bAssetQty": "2796800000000000201326592", + "hardLimitError": true + }, + { + "bAssetIndex": 2, + "bAssetQty": "3496000000000000117440512", + "hardLimitError": true + }, + { + "bAssetIndex": 2, + "bAssetQty": "4195200000000000033554432", + "hardLimitError": true + }, + { + "bAssetIndex": 2, + "bAssetQty": "4894399999999999949668352", + "hardLimitError": true + }, + { + "bAssetIndex": 2, + "bAssetQty": "5593600000000000402653184", + "hardLimitError": true + }, + { + "bAssetIndex": 2, + "bAssetQty": "6292799999999999781896192", + "hardLimitError": true + }, + { + "bAssetIndex": 2, + "bAssetQty": "6992000000000000234881024", + "hardLimitError": true + } + ] + }, + { + "reserve0": "3996499999999999360000000", + "reserve1": "500500000000000000000000", + "reserve2": "5503000000000000000000000", + "A": 120, + "mAssetSupply": "9936488013915504712820075", + "hardMin": 50000000000000000, + "hardMax": 750000000000000000, + "swapFeeRate": 600000000000000, + "mints": [ + { + "bAssetIndex": 0, + "bAssetQty": "10000000000000", + "expectedQty": "9892618042466", + "priceReceived": 1.0108547562508774 + }, + { + "bAssetIndex": 0, + "bAssetQty": "1000000000000000", + "expectedQty": "989261804244580", + "priceReceived": 1.0108547562529415 + }, + { + "bAssetIndex": 0, + "bAssetQty": "100000000000000000", + "expectedQty": "98926180404884481", + "priceReceived": 1.010854756452949 + }, + { + "bAssetIndex": 0, + "bAssetQty": "1000000000000000000", + "expectedQty": "989261802269436564", + "priceReceived": 1.010854758271197 + }, + { + "bAssetIndex": 0, + "bAssetQty": "10000000000000000000", + "expectedQty": "9892617844753675832", + "priceReceived": 1.0108547764536635 + }, + { + "bAssetIndex": 0, + "bAssetQty": "100000000000000000000", + "expectedQty": "98926160653601652020", + "priceReceived": 1.010854958276997 + }, + { + "bAssetIndex": 0, + "bAssetQty": "699200000000000050331648", + "hardLimitError": true + }, + { + "bAssetIndex": 0, + "bAssetQty": "1398400000000000100663296", + "hardLimitError": true + }, + { + "bAssetIndex": 0, + "bAssetQty": "2097600000000000016777216", + "hardLimitError": true + }, + { + "bAssetIndex": 0, + "bAssetQty": "2796800000000000201326592", + "hardLimitError": true + }, + { + "bAssetIndex": 0, + "bAssetQty": "3496000000000000117440512", + "hardLimitError": true + }, + { + "bAssetIndex": 0, + "bAssetQty": "4195200000000000033554432", + "hardLimitError": true + }, + { + "bAssetIndex": 0, + "bAssetQty": "4894399999999999949668352", + "hardLimitError": true + }, + { + "bAssetIndex": 0, + "bAssetQty": "5593600000000000402653184", + "hardLimitError": true + }, + { + "bAssetIndex": 0, + "bAssetQty": "6292799999999999781896192", + "hardLimitError": true + }, + { + "bAssetIndex": 0, + "bAssetQty": "6992000000000000234881024", + "hardLimitError": true + }, + { + "bAssetIndex": 1, + "bAssetQty": "10000000000000", + "expectedQty": "11432866386092", + "priceReceived": 0.8746712908466182 + }, + { + "bAssetIndex": 1, + "bAssetQty": "1000000000000000", + "expectedQty": "1143286638334208", + "priceReceived": 0.8746712910570007 + }, + { + "bAssetIndex": 1, + "bAssetQty": "100000000000000000", + "expectedQty": "114328661083569904", + "priceReceived": 0.8746713120947319 + }, + { + "bAssetIndex": 1, + "bAssetQty": "1000000000000000000", + "expectedQty": "1143286360849746210", + "priceReceived": 0.874671503346503 + }, + { + "bAssetIndex": 1, + "bAssetQty": "10000000000000000000", + "expectedQty": "11432838610381658208", + "priceReceived": 0.8746734158321311 + }, + { + "bAssetIndex": 1, + "bAssetQty": "100000000000000000000", + "expectedQty": "114325886771621960149", + "priceReceived": 0.8746925374806894 + }, + { + "bAssetIndex": 1, + "bAssetQty": "699200000000000050331648", + "expectedQty": "741678171179218686429800", + "priceReceived": 0.9427269497338971 + }, + { + "bAssetIndex": 1, + "bAssetQty": "1398400000000000100663296", + "expectedQty": "1452105731306633575856596", + "priceReceived": 0.9630152748875194 + }, + { + "bAssetIndex": 1, + "bAssetQty": "2097600000000000016777216", + "expectedQty": "2156200194980878262700900", + "priceReceived": 0.9728224702338467 + }, + { + "bAssetIndex": 1, + "bAssetQty": "2796800000000000201326592", + "expectedQty": "2857835872184337931168178", + "priceReceived": 0.9786426250792051 + }, + { + "bAssetIndex": 1, + "bAssetQty": "3496000000000000117440512", + "expectedQty": "3558180045961155437097768", + "priceReceived": 0.9825247612099519 + }, + { + "bAssetIndex": 1, + "bAssetQty": "4195200000000000033554432", + "expectedQty": "4257701656529446269530387", + "priceReceived": 0.9853203297056767 + }, + { + "bAssetIndex": 1, + "bAssetQty": "4894399999999999949668352", + "expectedQty": "4956622542256418842610799", + "priceReceived": 0.9874465844986265 + }, + { + "bAssetIndex": 1, + "bAssetQty": "5593600000000000402653184", + "expectedQty": "5655058851205474401832123", + "priceReceived": 0.9891320580700282 + }, + { + "bAssetIndex": 1, + "bAssetQty": "6292799999999999781896192", + "expectedQty": "6353075328572007239119684", + "priceReceived": 0.9905124171437212 + }, + { + "bAssetIndex": 1, + "bAssetQty": "6992000000000000234881024", + "expectedQty": "7050709272680501025142512", + "priceReceived": 0.9916732813097283 + }, + { + "bAssetIndex": 2, + "bAssetQty": "10000000000000", + "expectedQty": "9832251954605", + "priceReceived": 1.0170609994708724 + }, + { + "bAssetIndex": 2, + "bAssetQty": "1000000000000000", + "expectedQty": "983225195458701", + "priceReceived": 1.0170609994727333 + }, + { + "bAssetIndex": 2, + "bAssetQty": "100000000000000000", + "expectedQty": "98322519528556775", + "priceReceived": 1.0170609996518245 + }, + { + "bAssetIndex": 2, + "bAssetQty": "1000000000000000000", + "expectedQty": "983225193711637753", + "priceReceived": 1.0170610012799184 + }, + { + "bAssetIndex": 2, + "bAssetQty": "10000000000000000000", + "expectedQty": "9832251779723363751", + "priceReceived": 1.0170610175608579 + }, + { + "bAssetIndex": 2, + "bAssetQty": "100000000000000000000", + "expectedQty": "98322502057917477303", + "priceReceived": 1.0170611803704344 + }, + { + "bAssetIndex": 2, + "bAssetQty": "699200000000000050331648", + "hardLimitError": true + }, + { + "bAssetIndex": 2, + "bAssetQty": "1398400000000000100663296", + "hardLimitError": true + }, + { + "bAssetIndex": 2, + "bAssetQty": "2097600000000000016777216", + "hardLimitError": true + }, + { + "bAssetIndex": 2, + "bAssetQty": "2796800000000000201326592", + "hardLimitError": true + }, + { + "bAssetIndex": 2, + "bAssetQty": "3496000000000000117440512", + "hardLimitError": true + }, + { + "bAssetIndex": 2, + "bAssetQty": "4195200000000000033554432", + "hardLimitError": true + }, + { + "bAssetIndex": 2, + "bAssetQty": "4894399999999999949668352", + "hardLimitError": true + }, + { + "bAssetIndex": 2, + "bAssetQty": "5593600000000000402653184", + "hardLimitError": true + }, + { + "bAssetIndex": 2, + "bAssetQty": "6292799999999999781896192", + "hardLimitError": true + }, + { + "bAssetIndex": 2, + "bAssetQty": "6992000000000000234881024", + "hardLimitError": true + } + ] + }, + { + "reserve0": "3996499999999999360000000", + "reserve1": "3996499999999999360000000", + "reserve2": "2007000000000000960000000", + "A": 120, + "mAssetSupply": "9995726520619110731126433", + "hardMin": 50000000000000000, + "hardMax": 750000000000000000, + "swapFeeRate": 600000000000000, + "mints": [ + { + "bAssetIndex": 0, + "bAssetQty": "10000000000000", + "expectedQty": "9979935570674", + "priceReceived": 1.002010476839646 + }, + { + "bAssetIndex": 0, + "bAssetQty": "1000000000000000", + "expectedQty": "997993557066692", + "priceReceived": 1.0020104768403568 + }, + { + "bAssetIndex": 0, + "bAssetQty": "100000000000000000", + "expectedQty": "99799355699606328", + "priceReceived": 1.0020104769112699 + }, + { + "bAssetIndex": 0, + "bAssetQty": "1000000000000000000", + "expectedQty": "997993556353984498", + "priceReceived": 1.002010477555933 + }, + { + "bAssetIndex": 0, + "bAssetQty": "10000000000000000000", + "expectedQty": "9979935499332013774", + "priceReceived": 1.0020104840025599 + }, + { + "bAssetIndex": 0, + "bAssetQty": "100000000000000000000", + "expectedQty": "99799348572583949084", + "priceReceived": 1.0020105484683612 + }, + { + "bAssetIndex": 0, + "bAssetQty": "699200000000000050331648", + "expectedQty": "697463049145752630825887", + "priceReceived": 1.0024903840517068 + }, + { + "bAssetIndex": 0, + "bAssetQty": "1398400000000000100663296", + "expectedQty": "1394297537312687357246463", + "priceReceived": 1.0029423150923866 + }, + { + "bAssetIndex": 0, + "bAssetQty": "2097600000000000016777216", + "expectedQty": "2090534177142072198604999", + "priceReceived": 1.0033799126248142 + }, + { + "bAssetIndex": 0, + "bAssetQty": "2796800000000000201326592", + "expectedQty": "2786181338416885026428332", + "priceReceived": 1.0038111882513536 + }, + { + "bAssetIndex": 0, + "bAssetQty": "3496000000000000117440512", + "expectedQty": "3481235579829406229717057", + "priceReceived": 1.0042411436491516 + }, + { + "bAssetIndex": 0, + "bAssetQty": "4195200000000000033554432", + "expectedQty": "4175686799036286876935350", + "priceReceived": 1.0046730518601674 + }, + { + "bAssetIndex": 0, + "bAssetQty": "4894399999999999949668352", + "expectedQty": "4869520959749015472848888", + "priceReceived": 1.0051091350579722 + }, + { + "bAssetIndex": 0, + "bAssetQty": "5593600000000000402653184", + "expectedQty": "5562721630840957913206527", + "priceReceived": 1.005550946318767 + }, + { + "bAssetIndex": 0, + "bAssetQty": "6292799999999999781896192", + "expectedQty": "6255270901791376247372883", + "priceReceived": 1.005999595988381 + }, + { + "bAssetIndex": 0, + "bAssetQty": "6992000000000000234881024", + "expectedQty": "6947149951809925188879129", + "priceReceived": 1.0064558917687376 + }, + { + "bAssetIndex": 1, + "bAssetQty": "10000000000000", + "expectedQty": "9979935570674", + "priceReceived": 1.002010476839646 + }, + { + "bAssetIndex": 1, + "bAssetQty": "1000000000000000", + "expectedQty": "997993557066692", + "priceReceived": 1.0020104768403568 + }, + { + "bAssetIndex": 1, + "bAssetQty": "100000000000000000", + "expectedQty": "99799355699606328", + "priceReceived": 1.0020104769112699 + }, + { + "bAssetIndex": 1, + "bAssetQty": "1000000000000000000", + "expectedQty": "997993556353984498", + "priceReceived": 1.002010477555933 + }, + { + "bAssetIndex": 1, + "bAssetQty": "10000000000000000000", + "expectedQty": "9979935499332013774", + "priceReceived": 1.0020104840025599 + }, + { + "bAssetIndex": 1, + "bAssetQty": "100000000000000000000", + "expectedQty": "99799348572583949084", + "priceReceived": 1.0020105484683612 + }, + { + "bAssetIndex": 1, + "bAssetQty": "699200000000000050331648", + "expectedQty": "697463049145752630825887", + "priceReceived": 1.0024903840517068 + }, + { + "bAssetIndex": 1, + "bAssetQty": "1398400000000000100663296", + "expectedQty": "1394297537312687357246463", + "priceReceived": 1.0029423150923866 + }, + { + "bAssetIndex": 1, + "bAssetQty": "2097600000000000016777216", + "expectedQty": "2090534177142072198604999", + "priceReceived": 1.0033799126248142 + }, + { + "bAssetIndex": 1, + "bAssetQty": "2796800000000000201326592", + "expectedQty": "2786181338416885026428332", + "priceReceived": 1.0038111882513536 + }, + { + "bAssetIndex": 1, + "bAssetQty": "3496000000000000117440512", + "expectedQty": "3481235579829406229717057", + "priceReceived": 1.0042411436491516 + }, + { + "bAssetIndex": 1, + "bAssetQty": "4195200000000000033554432", + "expectedQty": "4175686799036286876935350", + "priceReceived": 1.0046730518601674 + }, + { + "bAssetIndex": 1, + "bAssetQty": "4894399999999999949668352", + "expectedQty": "4869520959749015472848888", + "priceReceived": 1.0051091350579722 + }, + { + "bAssetIndex": 1, + "bAssetQty": "5593600000000000402653184", + "expectedQty": "5562721630840957913206527", + "priceReceived": 1.005550946318767 + }, + { + "bAssetIndex": 1, + "bAssetQty": "6292799999999999781896192", + "expectedQty": "6255270901791376247372883", + "priceReceived": 1.005999595988381 + }, + { + "bAssetIndex": 1, + "bAssetQty": "6992000000000000234881024", + "expectedQty": "6947149951809925188879129", + "priceReceived": 1.0064558917687376 + }, + { + "bAssetIndex": 2, + "bAssetQty": "10000000000000", + "expectedQty": "10058614942598", + "priceReceived": 0.9941726626446582 + }, + { + "bAssetIndex": 2, + "bAssetQty": "1000000000000000", + "expectedQty": "1005861494256321", + "priceReceived": 0.9941726626480968 + }, + { + "bAssetIndex": 2, + "bAssetQty": "100000000000000000", + "expectedQty": "100586149391571656", + "priceReceived": 0.9941726629847432 + }, + { + "bAssetIndex": 2, + "bAssetQty": "1000000000000000000", + "expectedQty": "1005861490819319821", + "priceReceived": 0.9941726660451576 + }, + { + "bAssetIndex": 2, + "bAssetQty": "10000000000000000000", + "expectedQty": "10058614598554929567", + "priceReceived": 0.9941726966491637 + }, + { + "bAssetIndex": 2, + "bAssetQty": "100000000000000000000", + "expectedQty": "100586115023126883866", + "priceReceived": 0.9941730026754476 + }, + { + "bAssetIndex": 2, + "bAssetQty": "699200000000000050331648", + "expectedQty": "702016130027513514676957", + "priceReceived": 0.9959885109372015 + }, + { + "bAssetIndex": 2, + "bAssetQty": "1398400000000000100663296", + "expectedQty": "1402409205977358729703359", + "priceReceived": 0.9971412010415572 + }, + { + "bAssetIndex": 2, + "bAssetQty": "2097600000000000016777216", + "expectedQty": "2101865542055031215754228", + "priceReceived": 0.9979705923287269 + }, + { + "bAssetIndex": 2, + "bAssetQty": "2796800000000000201326592", + "expectedQty": "2800665664244178037349474", + "priceReceived": 0.9986197337677502 + }, + { + "bAssetIndex": 2, + "bAssetQty": "3496000000000000117440512", + "expectedQty": "3498941539257549736263678", + "priceReceived": 0.9991593059716642 + }, + { + "bAssetIndex": 2, + "bAssetQty": "4195200000000000033554432", + "expectedQty": "4196760179169993801281722", + "priceReceived": 0.9996282420001654 + }, + { + "bAssetIndex": 2, + "bAssetQty": "4894399999999999949668352", + "expectedQty": "4894156522336345491706039", + "priceReceived": 1.0000497486466857 + }, + { + "bAssetIndex": 2, + "bAssetQty": "5593600000000000402653184", + "expectedQty": "5591148198088038016553653", + "priceReceived": 1.0004385149212822 + }, + { + "bAssetIndex": 2, + "bAssetQty": "6292799999999999781896192", + "expectedQty": "6287742841543760775892450", + "priceReceived": 1.0008042883724229 + }, + { + "bAssetIndex": 2, + "bAssetQty": "6992000000000000234881024", + "expectedQty": "6983942004489696902085786", + "priceReceived": 1.0011537890069997 + } + ] + }, + { + "reserve0": "7492500000000000000000000", + "reserve1": "500500000000000000000000", + "reserve2": "2007000000000000000000000", + "A": 120, + "mAssetSupply": "9896372713490403790662354", + "hardMin": 50000000000000000, + "hardMax": 750000000000000000, + "swapFeeRate": 600000000000000, + "mints": [ + { + "bAssetIndex": 0, + "bAssetQty": "10000000000000", + "expectedQty": "9688460045641", + "priceReceived": 1.0321557763454026 + }, + { + "bAssetIndex": 0, + "bAssetQty": "1000000000000000", + "expectedQty": "968846004561237", + "priceReceived": 1.0321557763484526 + }, + { + "bAssetIndex": 0, + "bAssetQty": "100000000000000000", + "expectedQty": "96884600427629503", + "priceReceived": 1.0321557766520142 + }, + { + "bAssetIndex": 0, + "bAssetQty": "1000000000000000000", + "expectedQty": "968846001685919294", + "priceReceived": 1.0321557794116596 + }, + { + "bAssetIndex": 0, + "bAssetQty": "10000000000000000000", + "expectedQty": "9688459757821565729", + "priceReceived": 1.0321558070081187 + }, + { + "bAssetIndex": 0, + "bAssetQty": "100000000000000000000", + "expectedQty": "96884571674398445885", + "priceReceived": 1.0321560829733718 + }, + { + "bAssetIndex": 0, + "bAssetQty": "699200000000000050331648", + "hardLimitError": true + }, + { + "bAssetIndex": 0, + "bAssetQty": "1398400000000000100663296", + "hardLimitError": true + }, + { + "bAssetIndex": 0, + "bAssetQty": "2097600000000000016777216", + "hardLimitError": true + }, + { + "bAssetIndex": 0, + "bAssetQty": "2796800000000000201326592", + "hardLimitError": true + }, + { + "bAssetIndex": 0, + "bAssetQty": "3496000000000000117440512", + "hardLimitError": true + }, + { + "bAssetIndex": 0, + "bAssetQty": "4195200000000000033554432", + "hardLimitError": true + }, + { + "bAssetIndex": 0, + "bAssetQty": "4894399999999999949668352", + "hardLimitError": true + }, + { + "bAssetIndex": 0, + "bAssetQty": "5593600000000000402653184", + "hardLimitError": true + }, + { + "bAssetIndex": 0, + "bAssetQty": "6292799999999999781896192", + "hardLimitError": true + }, + { + "bAssetIndex": 0, + "bAssetQty": "6992000000000000234881024", + "hardLimitError": true + }, + { + "bAssetIndex": 1, + "bAssetQty": "10000000000000", + "expectedQty": "12016287095094", + "priceReceived": 0.8322038181064092 + }, + { + "bAssetIndex": 1, + "bAssetQty": "1000000000000000", + "expectedQty": "1201628709124981", + "priceReceived": 0.8322038183726437 + }, + { + "bAssetIndex": 1, + "bAssetQty": "100000000000000000", + "expectedQty": "120162867068477766", + "priceReceived": 0.8322038449949146 + }, + { + "bAssetIndex": 1, + "bAssetQty": "1000000000000000000", + "expectedQty": "1201628321229059126", + "priceReceived": 0.8322040870151696 + }, + { + "bAssetIndex": 1, + "bAssetQty": "10000000000000000000", + "expectedQty": "12016248267380638563", + "priceReceived": 0.8322065071796199 + }, + { + "bAssetIndex": 1, + "bAssetQty": "100000000000000000000", + "expectedQty": "120158988844584723142", + "priceReceived": 0.832230705014848 + }, + { + "bAssetIndex": 1, + "bAssetQty": "699200000000000050331648", + "expectedQty": "758915093464738136563169", + "priceReceived": 0.9213151853495023 + }, + { + "bAssetIndex": 1, + "bAssetQty": "1398400000000000100663296", + "expectedQty": "1473400530309341117742129", + "priceReceived": 0.9490969843117983 + }, + { + "bAssetIndex": 1, + "bAssetQty": "2097600000000000016777216", + "expectedQty": "2178783980315529571380871", + "priceReceived": 0.9627388575237401 + }, + { + "bAssetIndex": 1, + "bAssetQty": "2796800000000000201326592", + "expectedQty": "2880620127293826852497696", + "priceReceived": 0.9709020545612271 + }, + { + "bAssetIndex": 1, + "bAssetQty": "3496000000000000117440512", + "expectedQty": "3580589386958113473567706", + "priceReceived": 0.9763755689869884 + }, + { + "bAssetIndex": 1, + "bAssetQty": "4195200000000000033554432", + "expectedQty": "4279368449887122287928618", + "priceReceived": 0.9803315720829454 + }, + { + "bAssetIndex": 1, + "bAssetQty": "4894399999999999949668352", + "expectedQty": "4977278016127211467001887", + "priceReceived": 0.9833487267822547 + }, + { + "bAssetIndex": 1, + "bAssetQty": "5593600000000000402653184", + "expectedQty": "5674486299978109779032834", + "priceReceived": 0.9857456171885689 + }, + { + "bAssetIndex": 1, + "bAssetQty": "6292799999999999781896192", + "expectedQty": "6371087286239571166925768", + "priceReceived": 0.9877120995644404 + }, + { + "bAssetIndex": 1, + "bAssetQty": "6992000000000000234881024", + "expectedQty": "7067135305137869045136995", + "priceReceived": 0.9893683505559537 + }, + { + "bAssetIndex": 2, + "bAssetQty": "10000000000000", + "expectedQty": "10143890658606", + "priceReceived": 0.9858150424281314 + }, + { + "bAssetIndex": 2, + "bAssetQty": "1000000000000000", + "expectedQty": "1014389065847321", + "priceReceived": 0.9858150424410363 + }, + { + "bAssetIndex": 2, + "bAssetQty": "100000000000000000", + "expectedQty": "101438906452467690", + "priceReceived": 0.9858150437264234 + }, + { + "bAssetIndex": 2, + "bAssetQty": "1000000000000000000", + "expectedQty": "1014389052500646933", + "priceReceived": 0.9858150554117522 + }, + { + "bAssetIndex": 2, + "bAssetQty": "10000000000000000000", + "expectedQty": "10143889322608810609", + "priceReceived": 0.9858151722645367 + }, + { + "bAssetIndex": 2, + "bAssetQty": "100000000000000000000", + "expectedQty": "101438772991659315644", + "priceReceived": 0.9858163407420394 + }, + { + "bAssetIndex": 2, + "bAssetQty": "699200000000000050331648", + "hardLimitError": true + }, + { + "bAssetIndex": 2, + "bAssetQty": "1398400000000000100663296", + "hardLimitError": true + }, + { + "bAssetIndex": 2, + "bAssetQty": "2097600000000000016777216", + "hardLimitError": true + }, + { + "bAssetIndex": 2, + "bAssetQty": "2796800000000000201326592", + "hardLimitError": true + }, + { + "bAssetIndex": 2, + "bAssetQty": "3496000000000000117440512", + "hardLimitError": true + }, + { + "bAssetIndex": 2, + "bAssetQty": "4195200000000000033554432", + "hardLimitError": true + }, + { + "bAssetIndex": 2, + "bAssetQty": "4894399999999999949668352", + "hardLimitError": true + }, + { + "bAssetIndex": 2, + "bAssetQty": "5593600000000000402653184", + "hardLimitError": true + }, + { + "bAssetIndex": 2, + "bAssetQty": "6292799999999999781896192", + "hardLimitError": true + }, + { + "bAssetIndex": 2, + "bAssetQty": "6992000000000000234881024", + "hardLimitError": true + } + ] + } +] \ No newline at end of file diff --git a/test-utils/validator-data/full/redeemExactTestData.json b/test-utils/validator-data/full/redeemExactTestData.json new file mode 100644 index 00000000..cb8727bb --- /dev/null +++ b/test-utils/validator-data/full/redeemExactTestData.json @@ -0,0 +1,6275 @@ +[ + { + "reserve0": "5503000000000000000000000", + "reserve1": "500500000000000000000000", + "reserve2": "3996499999999999360000000", + "A": 120, + "mAssetSupply": "9936488013915504712820075", + "hardMin": 50000000000000000, + "hardMax": 750000000000000000, + "swapFeeRate": 600000000000000, + "redeems": [ + { + "bAssetQtys": [ + "3333333333333", + "3333333333333", + "3333333333333" + ], + "mAssetQty": "10392147416180", + "swapFee": "6235288449" + }, + { + "bAssetQtys": [ + "333333333333333", + "333333333333333", + "333333333333333" + ], + "mAssetQty": "1039214741642829", + "swapFee": "623528844985" + }, + { + "bAssetQtys": [ + "33333333333333332", + "33333333333333332", + "33333333333333332" + ], + "mAssetQty": "103921474410486193", + "swapFee": "62352884646291" + }, + { + "bAssetQtys": [ + "333333333333333312", + "333333333333333312", + "333333333333333312" + ], + "mAssetQty": "1039214766486970714", + "swapFee": "623528859892182" + }, + { + "bAssetQtys": [ + "3333333333333333504", + "3333333333333333504", + "3333333333333333504" + ], + "mAssetQty": "10392149903094943109", + "swapFee": "6235289941856965" + }, + { + "bAssetQtys": [ + "33333333333333336064", + "33333333333333336064", + "33333333333333336064" + ], + "mAssetQty": "103921722867828995814", + "swapFee": "62353033720697397" + }, + { + "bAssetQtys": [ + "233066666666666672259072", + "233066666666666672259072", + "233066666666666672259072" + ], + "hardLimitError": true + }, + { + "bAssetQtys": [ + "466133333333333344518144", + "466133333333333344518144", + "466133333333333344518144" + ], + "hardLimitError": true + }, + { + "bAssetQtys": [ + "699200000000000050331648", + "699200000000000050331648", + "699200000000000050331648" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "932266666666666689036288", + "932266666666666689036288", + "932266666666666689036288" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "1165333333333333193523200", + "1165333333333333193523200", + "1165333333333333193523200" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "1398400000000000100663296", + "1398400000000000100663296", + "1398400000000000100663296" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "1631466666666666739367936", + "1631466666666666739367936", + "1631466666666666739367936" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "1864533333333333378072576", + "1864533333333333378072576", + "1864533333333333378072576" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "2097600000000000016777216", + "2097600000000000016777216", + "2097600000000000016777216" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "2330666666666666387046400", + "2330666666666666387046400", + "2330666666666666387046400" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "3333333333333", + "3333333333333", + "3333333333333" + ], + "mAssetQty": "10392147416180", + "swapFee": "6235288449" + }, + { + "bAssetQtys": [ + "333333333333333", + "333333333333333", + "333333333333333" + ], + "mAssetQty": "1039214741642829", + "swapFee": "623528844985" + }, + { + "bAssetQtys": [ + "33333333333333332", + "33333333333333332", + "33333333333333332" + ], + "mAssetQty": "103921474410486193", + "swapFee": "62352884646291" + }, + { + "bAssetQtys": [ + "333333333333333312", + "333333333333333312", + "333333333333333312" + ], + "mAssetQty": "1039214766486970714", + "swapFee": "623528859892182" + }, + { + "bAssetQtys": [ + "3333333333333333504", + "3333333333333333504", + "3333333333333333504" + ], + "mAssetQty": "10392149903094943109", + "swapFee": "6235289941856965" + }, + { + "bAssetQtys": [ + "33333333333333336064", + "33333333333333336064", + "33333333333333336064" + ], + "mAssetQty": "103921722867828995814", + "swapFee": "62353033720697397" + }, + { + "bAssetQtys": [ + "233066666666666672259072", + "233066666666666672259072", + "233066666666666672259072" + ], + "hardLimitError": true + }, + { + "bAssetQtys": [ + "466133333333333344518144", + "466133333333333344518144", + "466133333333333344518144" + ], + "hardLimitError": true + }, + { + "bAssetQtys": [ + "699200000000000050331648", + "699200000000000050331648", + "699200000000000050331648" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "932266666666666689036288", + "932266666666666689036288", + "932266666666666689036288" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "1165333333333333193523200", + "1165333333333333193523200", + "1165333333333333193523200" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "1398400000000000100663296", + "1398400000000000100663296", + "1398400000000000100663296" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "1631466666666666739367936", + "1631466666666666739367936", + "1631466666666666739367936" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "1864533333333333378072576", + "1864533333333333378072576", + "1864533333333333378072576" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "2097600000000000016777216", + "2097600000000000016777216", + "2097600000000000016777216" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "2330666666666666387046400", + "2330666666666666387046400", + "2330666666666666387046400" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "3333333333333", + "3333333333333", + "3333333333333" + ], + "mAssetQty": "10392147416180", + "swapFee": "6235288449" + }, + { + "bAssetQtys": [ + "333333333333333", + "333333333333333", + "333333333333333" + ], + "mAssetQty": "1039214741642829", + "swapFee": "623528844985" + }, + { + "bAssetQtys": [ + "33333333333333332", + "33333333333333332", + "33333333333333332" + ], + "mAssetQty": "103921474410486193", + "swapFee": "62352884646291" + }, + { + "bAssetQtys": [ + "333333333333333312", + "333333333333333312", + "333333333333333312" + ], + "mAssetQty": "1039214766486970714", + "swapFee": "623528859892182" + }, + { + "bAssetQtys": [ + "3333333333333333504", + "3333333333333333504", + "3333333333333333504" + ], + "mAssetQty": "10392149903094943109", + "swapFee": "6235289941856965" + }, + { + "bAssetQtys": [ + "33333333333333336064", + "33333333333333336064", + "33333333333333336064" + ], + "mAssetQty": "103921722867828995814", + "swapFee": "62353033720697397" + }, + { + "bAssetQtys": [ + "233066666666666672259072", + "233066666666666672259072", + "233066666666666672259072" + ], + "hardLimitError": true + }, + { + "bAssetQtys": [ + "466133333333333344518144", + "466133333333333344518144", + "466133333333333344518144" + ], + "hardLimitError": true + }, + { + "bAssetQtys": [ + "699200000000000050331648", + "699200000000000050331648", + "699200000000000050331648" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "932266666666666689036288", + "932266666666666689036288", + "932266666666666689036288" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "1165333333333333193523200", + "1165333333333333193523200", + "1165333333333333193523200" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "1398400000000000100663296", + "1398400000000000100663296", + "1398400000000000100663296" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "1631466666666666739367936", + "1631466666666666739367936", + "1631466666666666739367936" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "1864533333333333378072576", + "1864533333333333378072576", + "1864533333333333378072576" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "2097600000000000016777216", + "2097600000000000016777216", + "2097600000000000016777216" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "2330666666666666387046400", + "2330666666666666387046400", + "2330666666666666387046400" + ], + "insufficientLiquidityError": true + } + ] + }, + { + "reserve0": "2007000000000000000000000", + "reserve1": "500500000000000000000000", + "reserve2": "7492500000000000000000000", + "A": 120, + "mAssetSupply": "9896372713490403790662354", + "hardMin": 50000000000000000, + "hardMax": 750000000000000000, + "swapFeeRate": 600000000000000, + "redeems": [ + { + "bAssetQtys": [ + "3333333333333", + "3333333333333", + "3333333333333" + ], + "mAssetQty": "10622586151486", + "swapFee": "6373551690" + }, + { + "bAssetQtys": [ + "333333333333333", + "333333333333333", + "333333333333333" + ], + "mAssetQty": "1062258615187624", + "swapFee": "637355169112" + }, + { + "bAssetQtys": [ + "33333333333333332", + "33333333333333332", + "33333333333333332" + ], + "mAssetQty": "106225861906681338", + "swapFee": "63735517144008" + }, + { + "bAssetQtys": [ + "333333333333333312", + "333333333333333312", + "333333333333333312" + ], + "mAssetQty": "1062258654332173770", + "swapFee": "637355192599304" + }, + { + "bAssetQtys": [ + "3333333333333333504", + "3333333333333333504", + "3333333333333333504" + ], + "mAssetQty": "10622590069880050646", + "swapFee": "6373554041928030" + }, + { + "bAssetQtys": [ + "33333333333333336064", + "33333333333333336064", + "33333333333333336064" + ], + "mAssetQty": "106226253376904511525", + "swapFee": "63735752026142706" + }, + { + "bAssetQtys": [ + "233066666666666672259072", + "233066666666666672259072", + "233066666666666672259072" + ], + "hardLimitError": true + }, + { + "bAssetQtys": [ + "466133333333333344518144", + "466133333333333344518144", + "466133333333333344518144" + ], + "hardLimitError": true + }, + { + "bAssetQtys": [ + "699200000000000050331648", + "699200000000000050331648", + "699200000000000050331648" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "932266666666666689036288", + "932266666666666689036288", + "932266666666666689036288" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "1165333333333333193523200", + "1165333333333333193523200", + "1165333333333333193523200" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "1398400000000000100663296", + "1398400000000000100663296", + "1398400000000000100663296" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "1631466666666666739367936", + "1631466666666666739367936", + "1631466666666666739367936" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "1864533333333333378072576", + "1864533333333333378072576", + "1864533333333333378072576" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "2097600000000000016777216", + "2097600000000000016777216", + "2097600000000000016777216" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "2330666666666666387046400", + "2330666666666666387046400", + "2330666666666666387046400" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "3333333333333", + "3333333333333", + "3333333333333" + ], + "mAssetQty": "10622586151486", + "swapFee": "6373551690" + }, + { + "bAssetQtys": [ + "333333333333333", + "333333333333333", + "333333333333333" + ], + "mAssetQty": "1062258615187624", + "swapFee": "637355169112" + }, + { + "bAssetQtys": [ + "33333333333333332", + "33333333333333332", + "33333333333333332" + ], + "mAssetQty": "106225861906681338", + "swapFee": "63735517144008" + }, + { + "bAssetQtys": [ + "333333333333333312", + "333333333333333312", + "333333333333333312" + ], + "mAssetQty": "1062258654332173770", + "swapFee": "637355192599304" + }, + { + "bAssetQtys": [ + "3333333333333333504", + "3333333333333333504", + "3333333333333333504" + ], + "mAssetQty": "10622590069880050646", + "swapFee": "6373554041928030" + }, + { + "bAssetQtys": [ + "33333333333333336064", + "33333333333333336064", + "33333333333333336064" + ], + "mAssetQty": "106226253376904511525", + "swapFee": "63735752026142706" + }, + { + "bAssetQtys": [ + "233066666666666672259072", + "233066666666666672259072", + "233066666666666672259072" + ], + "hardLimitError": true + }, + { + "bAssetQtys": [ + "466133333333333344518144", + "466133333333333344518144", + "466133333333333344518144" + ], + "hardLimitError": true + }, + { + "bAssetQtys": [ + "699200000000000050331648", + "699200000000000050331648", + "699200000000000050331648" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "932266666666666689036288", + "932266666666666689036288", + "932266666666666689036288" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "1165333333333333193523200", + "1165333333333333193523200", + "1165333333333333193523200" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "1398400000000000100663296", + "1398400000000000100663296", + "1398400000000000100663296" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "1631466666666666739367936", + "1631466666666666739367936", + "1631466666666666739367936" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "1864533333333333378072576", + "1864533333333333378072576", + "1864533333333333378072576" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "2097600000000000016777216", + "2097600000000000016777216", + "2097600000000000016777216" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "2330666666666666387046400", + "2330666666666666387046400", + "2330666666666666387046400" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "3333333333333", + "3333333333333", + "3333333333333" + ], + "mAssetQty": "10622586151486", + "swapFee": "6373551690" + }, + { + "bAssetQtys": [ + "333333333333333", + "333333333333333", + "333333333333333" + ], + "mAssetQty": "1062258615187624", + "swapFee": "637355169112" + }, + { + "bAssetQtys": [ + "33333333333333332", + "33333333333333332", + "33333333333333332" + ], + "mAssetQty": "106225861906681338", + "swapFee": "63735517144008" + }, + { + "bAssetQtys": [ + "333333333333333312", + "333333333333333312", + "333333333333333312" + ], + "mAssetQty": "1062258654332173770", + "swapFee": "637355192599304" + }, + { + "bAssetQtys": [ + "3333333333333333504", + "3333333333333333504", + "3333333333333333504" + ], + "mAssetQty": "10622590069880050646", + "swapFee": "6373554041928030" + }, + { + "bAssetQtys": [ + "33333333333333336064", + "33333333333333336064", + "33333333333333336064" + ], + "mAssetQty": "106226253376904511525", + "swapFee": "63735752026142706" + }, + { + "bAssetQtys": [ + "233066666666666672259072", + "233066666666666672259072", + "233066666666666672259072" + ], + "hardLimitError": true + }, + { + "bAssetQtys": [ + "466133333333333344518144", + "466133333333333344518144", + "466133333333333344518144" + ], + "hardLimitError": true + }, + { + "bAssetQtys": [ + "699200000000000050331648", + "699200000000000050331648", + "699200000000000050331648" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "932266666666666689036288", + "932266666666666689036288", + "932266666666666689036288" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "1165333333333333193523200", + "1165333333333333193523200", + "1165333333333333193523200" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "1398400000000000100663296", + "1398400000000000100663296", + "1398400000000000100663296" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "1631466666666666739367936", + "1631466666666666739367936", + "1631466666666666739367936" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "1864533333333333378072576", + "1864533333333333378072576", + "1864533333333333378072576" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "2097600000000000016777216", + "2097600000000000016777216", + "2097600000000000016777216" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "2330666666666666387046400", + "2330666666666666387046400", + "2330666666666666387046400" + ], + "insufficientLiquidityError": true + } + ] + }, + { + "reserve0": "5503000000000000000000000", + "reserve1": "3996499999999999360000000", + "reserve2": "500500000000000000000000", + "A": 120, + "mAssetSupply": "9936488013915504712820075", + "hardMin": 50000000000000000, + "hardMax": 750000000000000000, + "swapFeeRate": 600000000000000, + "redeems": [ + { + "bAssetQtys": [ + "3333333333333", + "3333333333333", + "3333333333333" + ], + "mAssetQty": "10392147416180", + "swapFee": "6235288449" + }, + { + "bAssetQtys": [ + "333333333333333", + "333333333333333", + "333333333333333" + ], + "mAssetQty": "1039214741642829", + "swapFee": "623528844985" + }, + { + "bAssetQtys": [ + "33333333333333332", + "33333333333333332", + "33333333333333332" + ], + "mAssetQty": "103921474410486193", + "swapFee": "62352884646291" + }, + { + "bAssetQtys": [ + "333333333333333312", + "333333333333333312", + "333333333333333312" + ], + "mAssetQty": "1039214766486970714", + "swapFee": "623528859892182" + }, + { + "bAssetQtys": [ + "3333333333333333504", + "3333333333333333504", + "3333333333333333504" + ], + "mAssetQty": "10392149903094943109", + "swapFee": "6235289941856965" + }, + { + "bAssetQtys": [ + "33333333333333336064", + "33333333333333336064", + "33333333333333336064" + ], + "mAssetQty": "103921722867828995814", + "swapFee": "62353033720697397" + }, + { + "bAssetQtys": [ + "233066666666666672259072", + "233066666666666672259072", + "233066666666666672259072" + ], + "hardLimitError": true + }, + { + "bAssetQtys": [ + "466133333333333344518144", + "466133333333333344518144", + "466133333333333344518144" + ], + "hardLimitError": true + }, + { + "bAssetQtys": [ + "699200000000000050331648", + "699200000000000050331648", + "699200000000000050331648" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "932266666666666689036288", + "932266666666666689036288", + "932266666666666689036288" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "1165333333333333193523200", + "1165333333333333193523200", + "1165333333333333193523200" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "1398400000000000100663296", + "1398400000000000100663296", + "1398400000000000100663296" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "1631466666666666739367936", + "1631466666666666739367936", + "1631466666666666739367936" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "1864533333333333378072576", + "1864533333333333378072576", + "1864533333333333378072576" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "2097600000000000016777216", + "2097600000000000016777216", + "2097600000000000016777216" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "2330666666666666387046400", + "2330666666666666387046400", + "2330666666666666387046400" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "3333333333333", + "3333333333333", + "3333333333333" + ], + "mAssetQty": "10392147416180", + "swapFee": "6235288449" + }, + { + "bAssetQtys": [ + "333333333333333", + "333333333333333", + "333333333333333" + ], + "mAssetQty": "1039214741642829", + "swapFee": "623528844985" + }, + { + "bAssetQtys": [ + "33333333333333332", + "33333333333333332", + "33333333333333332" + ], + "mAssetQty": "103921474410486193", + "swapFee": "62352884646291" + }, + { + "bAssetQtys": [ + "333333333333333312", + "333333333333333312", + "333333333333333312" + ], + "mAssetQty": "1039214766486970714", + "swapFee": "623528859892182" + }, + { + "bAssetQtys": [ + "3333333333333333504", + "3333333333333333504", + "3333333333333333504" + ], + "mAssetQty": "10392149903094943109", + "swapFee": "6235289941856965" + }, + { + "bAssetQtys": [ + "33333333333333336064", + "33333333333333336064", + "33333333333333336064" + ], + "mAssetQty": "103921722867828995814", + "swapFee": "62353033720697397" + }, + { + "bAssetQtys": [ + "233066666666666672259072", + "233066666666666672259072", + "233066666666666672259072" + ], + "hardLimitError": true + }, + { + "bAssetQtys": [ + "466133333333333344518144", + "466133333333333344518144", + "466133333333333344518144" + ], + "hardLimitError": true + }, + { + "bAssetQtys": [ + "699200000000000050331648", + "699200000000000050331648", + "699200000000000050331648" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "932266666666666689036288", + "932266666666666689036288", + "932266666666666689036288" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "1165333333333333193523200", + "1165333333333333193523200", + "1165333333333333193523200" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "1398400000000000100663296", + "1398400000000000100663296", + "1398400000000000100663296" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "1631466666666666739367936", + "1631466666666666739367936", + "1631466666666666739367936" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "1864533333333333378072576", + "1864533333333333378072576", + "1864533333333333378072576" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "2097600000000000016777216", + "2097600000000000016777216", + "2097600000000000016777216" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "2330666666666666387046400", + "2330666666666666387046400", + "2330666666666666387046400" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "3333333333333", + "3333333333333", + "3333333333333" + ], + "mAssetQty": "10392147416180", + "swapFee": "6235288449" + }, + { + "bAssetQtys": [ + "333333333333333", + "333333333333333", + "333333333333333" + ], + "mAssetQty": "1039214741642829", + "swapFee": "623528844985" + }, + { + "bAssetQtys": [ + "33333333333333332", + "33333333333333332", + "33333333333333332" + ], + "mAssetQty": "103921474410486193", + "swapFee": "62352884646291" + }, + { + "bAssetQtys": [ + "333333333333333312", + "333333333333333312", + "333333333333333312" + ], + "mAssetQty": "1039214766486970714", + "swapFee": "623528859892182" + }, + { + "bAssetQtys": [ + "3333333333333333504", + "3333333333333333504", + "3333333333333333504" + ], + "mAssetQty": "10392149903094943109", + "swapFee": "6235289941856965" + }, + { + "bAssetQtys": [ + "33333333333333336064", + "33333333333333336064", + "33333333333333336064" + ], + "mAssetQty": "103921722867828995814", + "swapFee": "62353033720697397" + }, + { + "bAssetQtys": [ + "233066666666666672259072", + "233066666666666672259072", + "233066666666666672259072" + ], + "hardLimitError": true + }, + { + "bAssetQtys": [ + "466133333333333344518144", + "466133333333333344518144", + "466133333333333344518144" + ], + "hardLimitError": true + }, + { + "bAssetQtys": [ + "699200000000000050331648", + "699200000000000050331648", + "699200000000000050331648" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "932266666666666689036288", + "932266666666666689036288", + "932266666666666689036288" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "1165333333333333193523200", + "1165333333333333193523200", + "1165333333333333193523200" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "1398400000000000100663296", + "1398400000000000100663296", + "1398400000000000100663296" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "1631466666666666739367936", + "1631466666666666739367936", + "1631466666666666739367936" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "1864533333333333378072576", + "1864533333333333378072576", + "1864533333333333378072576" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "2097600000000000016777216", + "2097600000000000016777216", + "2097600000000000016777216" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "2330666666666666387046400", + "2330666666666666387046400", + "2330666666666666387046400" + ], + "insufficientLiquidityError": true + } + ] + }, + { + "reserve0": "2007000000000000960000000", + "reserve1": "3996499999999999360000000", + "reserve2": "3996499999999999360000000", + "A": 120, + "mAssetSupply": "9995726520619110731126433", + "hardMin": 50000000000000000, + "hardMax": 750000000000000000, + "swapFeeRate": 600000000000000, + "redeems": [ + { + "bAssetQtys": [ + "3333333333333", + "3333333333333", + "3333333333333" + ], + "mAssetQty": "10012169329578", + "swapFee": "6007301597" + }, + { + "bAssetQtys": [ + "333333333333333", + "333333333333333", + "333333333333333" + ], + "mAssetQty": "1001216932958058", + "swapFee": "600730159774" + }, + { + "bAssetQtys": [ + "33333333333333332", + "33333333333333332", + "33333333333333332" + ], + "mAssetQty": "100121693296744420", + "swapFee": "60073015978046" + }, + { + "bAssetQtys": [ + "333333333333333312", + "333333333333333312", + "333333333333333312" + ], + "mAssetQty": "1001216933052754844", + "swapFee": "600730159831652" + }, + { + "bAssetQtys": [ + "3333333333333333504", + "3333333333333333504", + "3333333333333333504" + ], + "mAssetQty": "10012169339058628903", + "swapFee": "6007301603435177" + }, + { + "bAssetQtys": [ + "33333333333333336064", + "33333333333333336064", + "33333333333333336064" + ], + "mAssetQty": "100121694243707687525", + "swapFee": "60073016546224612" + }, + { + "bAssetQtys": [ + "233066666666666672259072", + "233066666666666672259072", + "233066666666666672259072" + ], + "mAssetQty": "700103049377134224963752", + "swapFee": "420061829626280534978" + }, + { + "bAssetQtys": [ + "466133333333333344518144", + "466133333333333344518144", + "466133333333333344518144" + ], + "mAssetQty": "1400340642413086499054609", + "swapFee": "840204385447851899432" + }, + { + "bAssetQtys": [ + "699200000000000050331648", + "699200000000000050331648", + "699200000000000050331648" + ], + "mAssetQty": "2100781755590947292822968", + "swapFee": "1260469053354568375693" + }, + { + "bAssetQtys": [ + "932266666666666689036288", + "932266666666666689036288", + "932266666666666689036288" + ], + "mAssetQty": "2801553941266024692391575", + "swapFee": "1680932364759614815434" + }, + { + "bAssetQtys": [ + "1165333333333333193523200", + "1165333333333333193523200", + "1165333333333333193523200" + ], + "mAssetQty": "3502923377571130423392051", + "swapFee": "2101754026542678254035" + }, + { + "bAssetQtys": [ + "1398400000000000100663296", + "1398400000000000100663296", + "1398400000000000100663296" + ], + "mAssetQty": "4205556642026964606593822", + "swapFee": "2523333985216178763956" + }, + { + "bAssetQtys": [ + "1631466666666666739367936", + "1631466666666666739367936", + "1631466666666666739367936" + ], + "mAssetQty": "4911740252433022541656772", + "swapFee": "2947044151459813524994" + }, + { + "bAssetQtys": [ + "1864533333333333378072576", + "1864533333333333378072576", + "1864533333333333378072576" + ], + "hardLimitError": true + }, + { + "bAssetQtys": [ + "2097600000000000016777216", + "2097600000000000016777216", + "2097600000000000016777216" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "2330666666666666387046400", + "2330666666666666387046400", + "2330666666666666387046400" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "3333333333333", + "3333333333333", + "3333333333333" + ], + "mAssetQty": "10012169329578", + "swapFee": "6007301597" + }, + { + "bAssetQtys": [ + "333333333333333", + "333333333333333", + "333333333333333" + ], + "mAssetQty": "1001216932958058", + "swapFee": "600730159774" + }, + { + "bAssetQtys": [ + "33333333333333332", + "33333333333333332", + "33333333333333332" + ], + "mAssetQty": "100121693296744420", + "swapFee": "60073015978046" + }, + { + "bAssetQtys": [ + "333333333333333312", + "333333333333333312", + "333333333333333312" + ], + "mAssetQty": "1001216933052754844", + "swapFee": "600730159831652" + }, + { + "bAssetQtys": [ + "3333333333333333504", + "3333333333333333504", + "3333333333333333504" + ], + "mAssetQty": "10012169339058628903", + "swapFee": "6007301603435177" + }, + { + "bAssetQtys": [ + "33333333333333336064", + "33333333333333336064", + "33333333333333336064" + ], + "mAssetQty": "100121694243707687525", + "swapFee": "60073016546224612" + }, + { + "bAssetQtys": [ + "233066666666666672259072", + "233066666666666672259072", + "233066666666666672259072" + ], + "mAssetQty": "700103049377134224963752", + "swapFee": "420061829626280534978" + }, + { + "bAssetQtys": [ + "466133333333333344518144", + "466133333333333344518144", + "466133333333333344518144" + ], + "mAssetQty": "1400340642413086499054609", + "swapFee": "840204385447851899432" + }, + { + "bAssetQtys": [ + "699200000000000050331648", + "699200000000000050331648", + "699200000000000050331648" + ], + "mAssetQty": "2100781755590947292822968", + "swapFee": "1260469053354568375693" + }, + { + "bAssetQtys": [ + "932266666666666689036288", + "932266666666666689036288", + "932266666666666689036288" + ], + "mAssetQty": "2801553941266024692391575", + "swapFee": "1680932364759614815434" + }, + { + "bAssetQtys": [ + "1165333333333333193523200", + "1165333333333333193523200", + "1165333333333333193523200" + ], + "mAssetQty": "3502923377571130423392051", + "swapFee": "2101754026542678254035" + }, + { + "bAssetQtys": [ + "1398400000000000100663296", + "1398400000000000100663296", + "1398400000000000100663296" + ], + "mAssetQty": "4205556642026964606593822", + "swapFee": "2523333985216178763956" + }, + { + "bAssetQtys": [ + "1631466666666666739367936", + "1631466666666666739367936", + "1631466666666666739367936" + ], + "mAssetQty": "4911740252433022541656772", + "swapFee": "2947044151459813524994" + }, + { + "bAssetQtys": [ + "1864533333333333378072576", + "1864533333333333378072576", + "1864533333333333378072576" + ], + "hardLimitError": true + }, + { + "bAssetQtys": [ + "2097600000000000016777216", + "2097600000000000016777216", + "2097600000000000016777216" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "2330666666666666387046400", + "2330666666666666387046400", + "2330666666666666387046400" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "3333333333333", + "3333333333333", + "3333333333333" + ], + "mAssetQty": "10012169329578", + "swapFee": "6007301597" + }, + { + "bAssetQtys": [ + "333333333333333", + "333333333333333", + "333333333333333" + ], + "mAssetQty": "1001216932958058", + "swapFee": "600730159774" + }, + { + "bAssetQtys": [ + "33333333333333332", + "33333333333333332", + "33333333333333332" + ], + "mAssetQty": "100121693296744420", + "swapFee": "60073015978046" + }, + { + "bAssetQtys": [ + "333333333333333312", + "333333333333333312", + "333333333333333312" + ], + "mAssetQty": "1001216933052754844", + "swapFee": "600730159831652" + }, + { + "bAssetQtys": [ + "3333333333333333504", + "3333333333333333504", + "3333333333333333504" + ], + "mAssetQty": "10012169339058628903", + "swapFee": "6007301603435177" + }, + { + "bAssetQtys": [ + "33333333333333336064", + "33333333333333336064", + "33333333333333336064" + ], + "mAssetQty": "100121694243707687525", + "swapFee": "60073016546224612" + }, + { + "bAssetQtys": [ + "233066666666666672259072", + "233066666666666672259072", + "233066666666666672259072" + ], + "mAssetQty": "700103049377134224963752", + "swapFee": "420061829626280534978" + }, + { + "bAssetQtys": [ + "466133333333333344518144", + "466133333333333344518144", + "466133333333333344518144" + ], + "mAssetQty": "1400340642413086499054609", + "swapFee": "840204385447851899432" + }, + { + "bAssetQtys": [ + "699200000000000050331648", + "699200000000000050331648", + "699200000000000050331648" + ], + "mAssetQty": "2100781755590947292822968", + "swapFee": "1260469053354568375693" + }, + { + "bAssetQtys": [ + "932266666666666689036288", + "932266666666666689036288", + "932266666666666689036288" + ], + "mAssetQty": "2801553941266024692391575", + "swapFee": "1680932364759614815434" + }, + { + "bAssetQtys": [ + "1165333333333333193523200", + "1165333333333333193523200", + "1165333333333333193523200" + ], + "mAssetQty": "3502923377571130423392051", + "swapFee": "2101754026542678254035" + }, + { + "bAssetQtys": [ + "1398400000000000100663296", + "1398400000000000100663296", + "1398400000000000100663296" + ], + "mAssetQty": "4205556642026964606593822", + "swapFee": "2523333985216178763956" + }, + { + "bAssetQtys": [ + "1631466666666666739367936", + "1631466666666666739367936", + "1631466666666666739367936" + ], + "mAssetQty": "4911740252433022541656772", + "swapFee": "2947044151459813524994" + }, + { + "bAssetQtys": [ + "1864533333333333378072576", + "1864533333333333378072576", + "1864533333333333378072576" + ], + "hardLimitError": true + }, + { + "bAssetQtys": [ + "2097600000000000016777216", + "2097600000000000016777216", + "2097600000000000016777216" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "2330666666666666387046400", + "2330666666666666387046400", + "2330666666666666387046400" + ], + "insufficientLiquidityError": true + } + ] + }, + { + "reserve0": "2007000000000000000000000", + "reserve1": "7492500000000000000000000", + "reserve2": "500500000000000000000000", + "A": 120, + "mAssetSupply": "9896372713490403790662354", + "hardMin": 50000000000000000, + "hardMax": 750000000000000000, + "swapFeeRate": 600000000000000, + "redeems": [ + { + "bAssetQtys": [ + "3333333333333", + "3333333333333", + "3333333333333" + ], + "mAssetQty": "10622586151486", + "swapFee": "6373551690" + }, + { + "bAssetQtys": [ + "333333333333333", + "333333333333333", + "333333333333333" + ], + "mAssetQty": "1062258615187624", + "swapFee": "637355169112" + }, + { + "bAssetQtys": [ + "33333333333333332", + "33333333333333332", + "33333333333333332" + ], + "mAssetQty": "106225861906681338", + "swapFee": "63735517144008" + }, + { + "bAssetQtys": [ + "333333333333333312", + "333333333333333312", + "333333333333333312" + ], + "mAssetQty": "1062258654332173770", + "swapFee": "637355192599304" + }, + { + "bAssetQtys": [ + "3333333333333333504", + "3333333333333333504", + "3333333333333333504" + ], + "mAssetQty": "10622590069880050646", + "swapFee": "6373554041928030" + }, + { + "bAssetQtys": [ + "33333333333333336064", + "33333333333333336064", + "33333333333333336064" + ], + "mAssetQty": "106226253376904511525", + "swapFee": "63735752026142706" + }, + { + "bAssetQtys": [ + "233066666666666672259072", + "233066666666666672259072", + "233066666666666672259072" + ], + "hardLimitError": true + }, + { + "bAssetQtys": [ + "466133333333333344518144", + "466133333333333344518144", + "466133333333333344518144" + ], + "hardLimitError": true + }, + { + "bAssetQtys": [ + "699200000000000050331648", + "699200000000000050331648", + "699200000000000050331648" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "932266666666666689036288", + "932266666666666689036288", + "932266666666666689036288" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "1165333333333333193523200", + "1165333333333333193523200", + "1165333333333333193523200" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "1398400000000000100663296", + "1398400000000000100663296", + "1398400000000000100663296" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "1631466666666666739367936", + "1631466666666666739367936", + "1631466666666666739367936" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "1864533333333333378072576", + "1864533333333333378072576", + "1864533333333333378072576" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "2097600000000000016777216", + "2097600000000000016777216", + "2097600000000000016777216" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "2330666666666666387046400", + "2330666666666666387046400", + "2330666666666666387046400" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "3333333333333", + "3333333333333", + "3333333333333" + ], + "mAssetQty": "10622586151486", + "swapFee": "6373551690" + }, + { + "bAssetQtys": [ + "333333333333333", + "333333333333333", + "333333333333333" + ], + "mAssetQty": "1062258615187624", + "swapFee": "637355169112" + }, + { + "bAssetQtys": [ + "33333333333333332", + "33333333333333332", + "33333333333333332" + ], + "mAssetQty": "106225861906681338", + "swapFee": "63735517144008" + }, + { + "bAssetQtys": [ + "333333333333333312", + "333333333333333312", + "333333333333333312" + ], + "mAssetQty": "1062258654332173770", + "swapFee": "637355192599304" + }, + { + "bAssetQtys": [ + "3333333333333333504", + "3333333333333333504", + "3333333333333333504" + ], + "mAssetQty": "10622590069880050646", + "swapFee": "6373554041928030" + }, + { + "bAssetQtys": [ + "33333333333333336064", + "33333333333333336064", + "33333333333333336064" + ], + "mAssetQty": "106226253376904511525", + "swapFee": "63735752026142706" + }, + { + "bAssetQtys": [ + "233066666666666672259072", + "233066666666666672259072", + "233066666666666672259072" + ], + "hardLimitError": true + }, + { + "bAssetQtys": [ + "466133333333333344518144", + "466133333333333344518144", + "466133333333333344518144" + ], + "hardLimitError": true + }, + { + "bAssetQtys": [ + "699200000000000050331648", + "699200000000000050331648", + "699200000000000050331648" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "932266666666666689036288", + "932266666666666689036288", + "932266666666666689036288" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "1165333333333333193523200", + "1165333333333333193523200", + "1165333333333333193523200" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "1398400000000000100663296", + "1398400000000000100663296", + "1398400000000000100663296" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "1631466666666666739367936", + "1631466666666666739367936", + "1631466666666666739367936" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "1864533333333333378072576", + "1864533333333333378072576", + "1864533333333333378072576" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "2097600000000000016777216", + "2097600000000000016777216", + "2097600000000000016777216" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "2330666666666666387046400", + "2330666666666666387046400", + "2330666666666666387046400" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "3333333333333", + "3333333333333", + "3333333333333" + ], + "mAssetQty": "10622586151486", + "swapFee": "6373551690" + }, + { + "bAssetQtys": [ + "333333333333333", + "333333333333333", + "333333333333333" + ], + "mAssetQty": "1062258615187624", + "swapFee": "637355169112" + }, + { + "bAssetQtys": [ + "33333333333333332", + "33333333333333332", + "33333333333333332" + ], + "mAssetQty": "106225861906681338", + "swapFee": "63735517144008" + }, + { + "bAssetQtys": [ + "333333333333333312", + "333333333333333312", + "333333333333333312" + ], + "mAssetQty": "1062258654332173770", + "swapFee": "637355192599304" + }, + { + "bAssetQtys": [ + "3333333333333333504", + "3333333333333333504", + "3333333333333333504" + ], + "mAssetQty": "10622590069880050646", + "swapFee": "6373554041928030" + }, + { + "bAssetQtys": [ + "33333333333333336064", + "33333333333333336064", + "33333333333333336064" + ], + "mAssetQty": "106226253376904511525", + "swapFee": "63735752026142706" + }, + { + "bAssetQtys": [ + "233066666666666672259072", + "233066666666666672259072", + "233066666666666672259072" + ], + "hardLimitError": true + }, + { + "bAssetQtys": [ + "466133333333333344518144", + "466133333333333344518144", + "466133333333333344518144" + ], + "hardLimitError": true + }, + { + "bAssetQtys": [ + "699200000000000050331648", + "699200000000000050331648", + "699200000000000050331648" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "932266666666666689036288", + "932266666666666689036288", + "932266666666666689036288" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "1165333333333333193523200", + "1165333333333333193523200", + "1165333333333333193523200" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "1398400000000000100663296", + "1398400000000000100663296", + "1398400000000000100663296" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "1631466666666666739367936", + "1631466666666666739367936", + "1631466666666666739367936" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "1864533333333333378072576", + "1864533333333333378072576", + "1864533333333333378072576" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "2097600000000000016777216", + "2097600000000000016777216", + "2097600000000000016777216" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "2330666666666666387046400", + "2330666666666666387046400", + "2330666666666666387046400" + ], + "insufficientLiquidityError": true + } + ] + }, + { + "reserve0": "500500000000000000000000", + "reserve1": "5503000000000000000000000", + "reserve2": "3996499999999999360000000", + "A": 120, + "mAssetSupply": "9936488013915504712820075", + "hardMin": 50000000000000000, + "hardMax": 750000000000000000, + "swapFeeRate": 600000000000000, + "redeems": [ + { + "bAssetQtys": [ + "3333333333333", + "3333333333333", + "3333333333333" + ], + "mAssetQty": "10392147416180", + "swapFee": "6235288449" + }, + { + "bAssetQtys": [ + "333333333333333", + "333333333333333", + "333333333333333" + ], + "mAssetQty": "1039214741642829", + "swapFee": "623528844985" + }, + { + "bAssetQtys": [ + "33333333333333332", + "33333333333333332", + "33333333333333332" + ], + "mAssetQty": "103921474410486193", + "swapFee": "62352884646291" + }, + { + "bAssetQtys": [ + "333333333333333312", + "333333333333333312", + "333333333333333312" + ], + "mAssetQty": "1039214766486970714", + "swapFee": "623528859892182" + }, + { + "bAssetQtys": [ + "3333333333333333504", + "3333333333333333504", + "3333333333333333504" + ], + "mAssetQty": "10392149903094943109", + "swapFee": "6235289941856965" + }, + { + "bAssetQtys": [ + "33333333333333336064", + "33333333333333336064", + "33333333333333336064" + ], + "mAssetQty": "103921722867828995814", + "swapFee": "62353033720697397" + }, + { + "bAssetQtys": [ + "233066666666666672259072", + "233066666666666672259072", + "233066666666666672259072" + ], + "hardLimitError": true + }, + { + "bAssetQtys": [ + "466133333333333344518144", + "466133333333333344518144", + "466133333333333344518144" + ], + "hardLimitError": true + }, + { + "bAssetQtys": [ + "699200000000000050331648", + "699200000000000050331648", + "699200000000000050331648" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "932266666666666689036288", + "932266666666666689036288", + "932266666666666689036288" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "1165333333333333193523200", + "1165333333333333193523200", + "1165333333333333193523200" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "1398400000000000100663296", + "1398400000000000100663296", + "1398400000000000100663296" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "1631466666666666739367936", + "1631466666666666739367936", + "1631466666666666739367936" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "1864533333333333378072576", + "1864533333333333378072576", + "1864533333333333378072576" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "2097600000000000016777216", + "2097600000000000016777216", + "2097600000000000016777216" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "2330666666666666387046400", + "2330666666666666387046400", + "2330666666666666387046400" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "3333333333333", + "3333333333333", + "3333333333333" + ], + "mAssetQty": "10392147416180", + "swapFee": "6235288449" + }, + { + "bAssetQtys": [ + "333333333333333", + "333333333333333", + "333333333333333" + ], + "mAssetQty": "1039214741642829", + "swapFee": "623528844985" + }, + { + "bAssetQtys": [ + "33333333333333332", + "33333333333333332", + "33333333333333332" + ], + "mAssetQty": "103921474410486193", + "swapFee": "62352884646291" + }, + { + "bAssetQtys": [ + "333333333333333312", + "333333333333333312", + "333333333333333312" + ], + "mAssetQty": "1039214766486970714", + "swapFee": "623528859892182" + }, + { + "bAssetQtys": [ + "3333333333333333504", + "3333333333333333504", + "3333333333333333504" + ], + "mAssetQty": "10392149903094943109", + "swapFee": "6235289941856965" + }, + { + "bAssetQtys": [ + "33333333333333336064", + "33333333333333336064", + "33333333333333336064" + ], + "mAssetQty": "103921722867828995814", + "swapFee": "62353033720697397" + }, + { + "bAssetQtys": [ + "233066666666666672259072", + "233066666666666672259072", + "233066666666666672259072" + ], + "hardLimitError": true + }, + { + "bAssetQtys": [ + "466133333333333344518144", + "466133333333333344518144", + "466133333333333344518144" + ], + "hardLimitError": true + }, + { + "bAssetQtys": [ + "699200000000000050331648", + "699200000000000050331648", + "699200000000000050331648" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "932266666666666689036288", + "932266666666666689036288", + "932266666666666689036288" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "1165333333333333193523200", + "1165333333333333193523200", + "1165333333333333193523200" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "1398400000000000100663296", + "1398400000000000100663296", + "1398400000000000100663296" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "1631466666666666739367936", + "1631466666666666739367936", + "1631466666666666739367936" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "1864533333333333378072576", + "1864533333333333378072576", + "1864533333333333378072576" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "2097600000000000016777216", + "2097600000000000016777216", + "2097600000000000016777216" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "2330666666666666387046400", + "2330666666666666387046400", + "2330666666666666387046400" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "3333333333333", + "3333333333333", + "3333333333333" + ], + "mAssetQty": "10392147416180", + "swapFee": "6235288449" + }, + { + "bAssetQtys": [ + "333333333333333", + "333333333333333", + "333333333333333" + ], + "mAssetQty": "1039214741642829", + "swapFee": "623528844985" + }, + { + "bAssetQtys": [ + "33333333333333332", + "33333333333333332", + "33333333333333332" + ], + "mAssetQty": "103921474410486193", + "swapFee": "62352884646291" + }, + { + "bAssetQtys": [ + "333333333333333312", + "333333333333333312", + "333333333333333312" + ], + "mAssetQty": "1039214766486970714", + "swapFee": "623528859892182" + }, + { + "bAssetQtys": [ + "3333333333333333504", + "3333333333333333504", + "3333333333333333504" + ], + "mAssetQty": "10392149903094943109", + "swapFee": "6235289941856965" + }, + { + "bAssetQtys": [ + "33333333333333336064", + "33333333333333336064", + "33333333333333336064" + ], + "mAssetQty": "103921722867828995814", + "swapFee": "62353033720697397" + }, + { + "bAssetQtys": [ + "233066666666666672259072", + "233066666666666672259072", + "233066666666666672259072" + ], + "hardLimitError": true + }, + { + "bAssetQtys": [ + "466133333333333344518144", + "466133333333333344518144", + "466133333333333344518144" + ], + "hardLimitError": true + }, + { + "bAssetQtys": [ + "699200000000000050331648", + "699200000000000050331648", + "699200000000000050331648" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "932266666666666689036288", + "932266666666666689036288", + "932266666666666689036288" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "1165333333333333193523200", + "1165333333333333193523200", + "1165333333333333193523200" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "1398400000000000100663296", + "1398400000000000100663296", + "1398400000000000100663296" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "1631466666666666739367936", + "1631466666666666739367936", + "1631466666666666739367936" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "1864533333333333378072576", + "1864533333333333378072576", + "1864533333333333378072576" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "2097600000000000016777216", + "2097600000000000016777216", + "2097600000000000016777216" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "2330666666666666387046400", + "2330666666666666387046400", + "2330666666666666387046400" + ], + "insufficientLiquidityError": true + } + ] + }, + { + "reserve0": "500500000000000000000000", + "reserve1": "2007000000000000000000000", + "reserve2": "7492500000000000000000000", + "A": 120, + "mAssetSupply": "9896372713490403790662354", + "hardMin": 50000000000000000, + "hardMax": 750000000000000000, + "swapFeeRate": 600000000000000, + "redeems": [ + { + "bAssetQtys": [ + "3333333333333", + "3333333333333", + "3333333333333" + ], + "mAssetQty": "10622586151486", + "swapFee": "6373551690" + }, + { + "bAssetQtys": [ + "333333333333333", + "333333333333333", + "333333333333333" + ], + "mAssetQty": "1062258615187624", + "swapFee": "637355169112" + }, + { + "bAssetQtys": [ + "33333333333333332", + "33333333333333332", + "33333333333333332" + ], + "mAssetQty": "106225861906681338", + "swapFee": "63735517144008" + }, + { + "bAssetQtys": [ + "333333333333333312", + "333333333333333312", + "333333333333333312" + ], + "mAssetQty": "1062258654332173770", + "swapFee": "637355192599304" + }, + { + "bAssetQtys": [ + "3333333333333333504", + "3333333333333333504", + "3333333333333333504" + ], + "mAssetQty": "10622590069880050646", + "swapFee": "6373554041928030" + }, + { + "bAssetQtys": [ + "33333333333333336064", + "33333333333333336064", + "33333333333333336064" + ], + "mAssetQty": "106226253376904511525", + "swapFee": "63735752026142706" + }, + { + "bAssetQtys": [ + "233066666666666672259072", + "233066666666666672259072", + "233066666666666672259072" + ], + "hardLimitError": true + }, + { + "bAssetQtys": [ + "466133333333333344518144", + "466133333333333344518144", + "466133333333333344518144" + ], + "hardLimitError": true + }, + { + "bAssetQtys": [ + "699200000000000050331648", + "699200000000000050331648", + "699200000000000050331648" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "932266666666666689036288", + "932266666666666689036288", + "932266666666666689036288" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "1165333333333333193523200", + "1165333333333333193523200", + "1165333333333333193523200" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "1398400000000000100663296", + "1398400000000000100663296", + "1398400000000000100663296" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "1631466666666666739367936", + "1631466666666666739367936", + "1631466666666666739367936" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "1864533333333333378072576", + "1864533333333333378072576", + "1864533333333333378072576" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "2097600000000000016777216", + "2097600000000000016777216", + "2097600000000000016777216" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "2330666666666666387046400", + "2330666666666666387046400", + "2330666666666666387046400" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "3333333333333", + "3333333333333", + "3333333333333" + ], + "mAssetQty": "10622586151486", + "swapFee": "6373551690" + }, + { + "bAssetQtys": [ + "333333333333333", + "333333333333333", + "333333333333333" + ], + "mAssetQty": "1062258615187624", + "swapFee": "637355169112" + }, + { + "bAssetQtys": [ + "33333333333333332", + "33333333333333332", + "33333333333333332" + ], + "mAssetQty": "106225861906681338", + "swapFee": "63735517144008" + }, + { + "bAssetQtys": [ + "333333333333333312", + "333333333333333312", + "333333333333333312" + ], + "mAssetQty": "1062258654332173770", + "swapFee": "637355192599304" + }, + { + "bAssetQtys": [ + "3333333333333333504", + "3333333333333333504", + "3333333333333333504" + ], + "mAssetQty": "10622590069880050646", + "swapFee": "6373554041928030" + }, + { + "bAssetQtys": [ + "33333333333333336064", + "33333333333333336064", + "33333333333333336064" + ], + "mAssetQty": "106226253376904511525", + "swapFee": "63735752026142706" + }, + { + "bAssetQtys": [ + "233066666666666672259072", + "233066666666666672259072", + "233066666666666672259072" + ], + "hardLimitError": true + }, + { + "bAssetQtys": [ + "466133333333333344518144", + "466133333333333344518144", + "466133333333333344518144" + ], + "hardLimitError": true + }, + { + "bAssetQtys": [ + "699200000000000050331648", + "699200000000000050331648", + "699200000000000050331648" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "932266666666666689036288", + "932266666666666689036288", + "932266666666666689036288" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "1165333333333333193523200", + "1165333333333333193523200", + "1165333333333333193523200" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "1398400000000000100663296", + "1398400000000000100663296", + "1398400000000000100663296" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "1631466666666666739367936", + "1631466666666666739367936", + "1631466666666666739367936" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "1864533333333333378072576", + "1864533333333333378072576", + "1864533333333333378072576" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "2097600000000000016777216", + "2097600000000000016777216", + "2097600000000000016777216" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "2330666666666666387046400", + "2330666666666666387046400", + "2330666666666666387046400" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "3333333333333", + "3333333333333", + "3333333333333" + ], + "mAssetQty": "10622586151486", + "swapFee": "6373551690" + }, + { + "bAssetQtys": [ + "333333333333333", + "333333333333333", + "333333333333333" + ], + "mAssetQty": "1062258615187624", + "swapFee": "637355169112" + }, + { + "bAssetQtys": [ + "33333333333333332", + "33333333333333332", + "33333333333333332" + ], + "mAssetQty": "106225861906681338", + "swapFee": "63735517144008" + }, + { + "bAssetQtys": [ + "333333333333333312", + "333333333333333312", + "333333333333333312" + ], + "mAssetQty": "1062258654332173770", + "swapFee": "637355192599304" + }, + { + "bAssetQtys": [ + "3333333333333333504", + "3333333333333333504", + "3333333333333333504" + ], + "mAssetQty": "10622590069880050646", + "swapFee": "6373554041928030" + }, + { + "bAssetQtys": [ + "33333333333333336064", + "33333333333333336064", + "33333333333333336064" + ], + "mAssetQty": "106226253376904511525", + "swapFee": "63735752026142706" + }, + { + "bAssetQtys": [ + "233066666666666672259072", + "233066666666666672259072", + "233066666666666672259072" + ], + "hardLimitError": true + }, + { + "bAssetQtys": [ + "466133333333333344518144", + "466133333333333344518144", + "466133333333333344518144" + ], + "hardLimitError": true + }, + { + "bAssetQtys": [ + "699200000000000050331648", + "699200000000000050331648", + "699200000000000050331648" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "932266666666666689036288", + "932266666666666689036288", + "932266666666666689036288" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "1165333333333333193523200", + "1165333333333333193523200", + "1165333333333333193523200" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "1398400000000000100663296", + "1398400000000000100663296", + "1398400000000000100663296" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "1631466666666666739367936", + "1631466666666666739367936", + "1631466666666666739367936" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "1864533333333333378072576", + "1864533333333333378072576", + "1864533333333333378072576" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "2097600000000000016777216", + "2097600000000000016777216", + "2097600000000000016777216" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "2330666666666666387046400", + "2330666666666666387046400", + "2330666666666666387046400" + ], + "insufficientLiquidityError": true + } + ] + }, + { + "reserve0": "3996499999999999360000000", + "reserve1": "5503000000000000000000000", + "reserve2": "500500000000000000000000", + "A": 120, + "mAssetSupply": "9936488013915504712820075", + "hardMin": 50000000000000000, + "hardMax": 750000000000000000, + "swapFeeRate": 600000000000000, + "redeems": [ + { + "bAssetQtys": [ + "3333333333333", + "3333333333333", + "3333333333333" + ], + "mAssetQty": "10392147416180", + "swapFee": "6235288449" + }, + { + "bAssetQtys": [ + "333333333333333", + "333333333333333", + "333333333333333" + ], + "mAssetQty": "1039214741642829", + "swapFee": "623528844985" + }, + { + "bAssetQtys": [ + "33333333333333332", + "33333333333333332", + "33333333333333332" + ], + "mAssetQty": "103921474410486193", + "swapFee": "62352884646291" + }, + { + "bAssetQtys": [ + "333333333333333312", + "333333333333333312", + "333333333333333312" + ], + "mAssetQty": "1039214766486970714", + "swapFee": "623528859892182" + }, + { + "bAssetQtys": [ + "3333333333333333504", + "3333333333333333504", + "3333333333333333504" + ], + "mAssetQty": "10392149903094943109", + "swapFee": "6235289941856965" + }, + { + "bAssetQtys": [ + "33333333333333336064", + "33333333333333336064", + "33333333333333336064" + ], + "mAssetQty": "103921722867828995814", + "swapFee": "62353033720697397" + }, + { + "bAssetQtys": [ + "233066666666666672259072", + "233066666666666672259072", + "233066666666666672259072" + ], + "hardLimitError": true + }, + { + "bAssetQtys": [ + "466133333333333344518144", + "466133333333333344518144", + "466133333333333344518144" + ], + "hardLimitError": true + }, + { + "bAssetQtys": [ + "699200000000000050331648", + "699200000000000050331648", + "699200000000000050331648" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "932266666666666689036288", + "932266666666666689036288", + "932266666666666689036288" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "1165333333333333193523200", + "1165333333333333193523200", + "1165333333333333193523200" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "1398400000000000100663296", + "1398400000000000100663296", + "1398400000000000100663296" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "1631466666666666739367936", + "1631466666666666739367936", + "1631466666666666739367936" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "1864533333333333378072576", + "1864533333333333378072576", + "1864533333333333378072576" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "2097600000000000016777216", + "2097600000000000016777216", + "2097600000000000016777216" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "2330666666666666387046400", + "2330666666666666387046400", + "2330666666666666387046400" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "3333333333333", + "3333333333333", + "3333333333333" + ], + "mAssetQty": "10392147416180", + "swapFee": "6235288449" + }, + { + "bAssetQtys": [ + "333333333333333", + "333333333333333", + "333333333333333" + ], + "mAssetQty": "1039214741642829", + "swapFee": "623528844985" + }, + { + "bAssetQtys": [ + "33333333333333332", + "33333333333333332", + "33333333333333332" + ], + "mAssetQty": "103921474410486193", + "swapFee": "62352884646291" + }, + { + "bAssetQtys": [ + "333333333333333312", + "333333333333333312", + "333333333333333312" + ], + "mAssetQty": "1039214766486970714", + "swapFee": "623528859892182" + }, + { + "bAssetQtys": [ + "3333333333333333504", + "3333333333333333504", + "3333333333333333504" + ], + "mAssetQty": "10392149903094943109", + "swapFee": "6235289941856965" + }, + { + "bAssetQtys": [ + "33333333333333336064", + "33333333333333336064", + "33333333333333336064" + ], + "mAssetQty": "103921722867828995814", + "swapFee": "62353033720697397" + }, + { + "bAssetQtys": [ + "233066666666666672259072", + "233066666666666672259072", + "233066666666666672259072" + ], + "hardLimitError": true + }, + { + "bAssetQtys": [ + "466133333333333344518144", + "466133333333333344518144", + "466133333333333344518144" + ], + "hardLimitError": true + }, + { + "bAssetQtys": [ + "699200000000000050331648", + "699200000000000050331648", + "699200000000000050331648" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "932266666666666689036288", + "932266666666666689036288", + "932266666666666689036288" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "1165333333333333193523200", + "1165333333333333193523200", + "1165333333333333193523200" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "1398400000000000100663296", + "1398400000000000100663296", + "1398400000000000100663296" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "1631466666666666739367936", + "1631466666666666739367936", + "1631466666666666739367936" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "1864533333333333378072576", + "1864533333333333378072576", + "1864533333333333378072576" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "2097600000000000016777216", + "2097600000000000016777216", + "2097600000000000016777216" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "2330666666666666387046400", + "2330666666666666387046400", + "2330666666666666387046400" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "3333333333333", + "3333333333333", + "3333333333333" + ], + "mAssetQty": "10392147416180", + "swapFee": "6235288449" + }, + { + "bAssetQtys": [ + "333333333333333", + "333333333333333", + "333333333333333" + ], + "mAssetQty": "1039214741642829", + "swapFee": "623528844985" + }, + { + "bAssetQtys": [ + "33333333333333332", + "33333333333333332", + "33333333333333332" + ], + "mAssetQty": "103921474410486193", + "swapFee": "62352884646291" + }, + { + "bAssetQtys": [ + "333333333333333312", + "333333333333333312", + "333333333333333312" + ], + "mAssetQty": "1039214766486970714", + "swapFee": "623528859892182" + }, + { + "bAssetQtys": [ + "3333333333333333504", + "3333333333333333504", + "3333333333333333504" + ], + "mAssetQty": "10392149903094943109", + "swapFee": "6235289941856965" + }, + { + "bAssetQtys": [ + "33333333333333336064", + "33333333333333336064", + "33333333333333336064" + ], + "mAssetQty": "103921722867828995814", + "swapFee": "62353033720697397" + }, + { + "bAssetQtys": [ + "233066666666666672259072", + "233066666666666672259072", + "233066666666666672259072" + ], + "hardLimitError": true + }, + { + "bAssetQtys": [ + "466133333333333344518144", + "466133333333333344518144", + "466133333333333344518144" + ], + "hardLimitError": true + }, + { + "bAssetQtys": [ + "699200000000000050331648", + "699200000000000050331648", + "699200000000000050331648" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "932266666666666689036288", + "932266666666666689036288", + "932266666666666689036288" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "1165333333333333193523200", + "1165333333333333193523200", + "1165333333333333193523200" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "1398400000000000100663296", + "1398400000000000100663296", + "1398400000000000100663296" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "1631466666666666739367936", + "1631466666666666739367936", + "1631466666666666739367936" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "1864533333333333378072576", + "1864533333333333378072576", + "1864533333333333378072576" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "2097600000000000016777216", + "2097600000000000016777216", + "2097600000000000016777216" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "2330666666666666387046400", + "2330666666666666387046400", + "2330666666666666387046400" + ], + "insufficientLiquidityError": true + } + ] + }, + { + "reserve0": "3996499999999999360000000", + "reserve1": "2007000000000000960000000", + "reserve2": "3996499999999999360000000", + "A": 120, + "mAssetSupply": "9995726520619110731126433", + "hardMin": 50000000000000000, + "hardMax": 750000000000000000, + "swapFeeRate": 600000000000000, + "redeems": [ + { + "bAssetQtys": [ + "3333333333333", + "3333333333333", + "3333333333333" + ], + "mAssetQty": "10012169329578", + "swapFee": "6007301597" + }, + { + "bAssetQtys": [ + "333333333333333", + "333333333333333", + "333333333333333" + ], + "mAssetQty": "1001216932958058", + "swapFee": "600730159774" + }, + { + "bAssetQtys": [ + "33333333333333332", + "33333333333333332", + "33333333333333332" + ], + "mAssetQty": "100121693296744420", + "swapFee": "60073015978046" + }, + { + "bAssetQtys": [ + "333333333333333312", + "333333333333333312", + "333333333333333312" + ], + "mAssetQty": "1001216933052754844", + "swapFee": "600730159831652" + }, + { + "bAssetQtys": [ + "3333333333333333504", + "3333333333333333504", + "3333333333333333504" + ], + "mAssetQty": "10012169339058628903", + "swapFee": "6007301603435177" + }, + { + "bAssetQtys": [ + "33333333333333336064", + "33333333333333336064", + "33333333333333336064" + ], + "mAssetQty": "100121694243707687525", + "swapFee": "60073016546224612" + }, + { + "bAssetQtys": [ + "233066666666666672259072", + "233066666666666672259072", + "233066666666666672259072" + ], + "mAssetQty": "700103049377134224963752", + "swapFee": "420061829626280534978" + }, + { + "bAssetQtys": [ + "466133333333333344518144", + "466133333333333344518144", + "466133333333333344518144" + ], + "mAssetQty": "1400340642413086499054609", + "swapFee": "840204385447851899432" + }, + { + "bAssetQtys": [ + "699200000000000050331648", + "699200000000000050331648", + "699200000000000050331648" + ], + "mAssetQty": "2100781755590947292822968", + "swapFee": "1260469053354568375693" + }, + { + "bAssetQtys": [ + "932266666666666689036288", + "932266666666666689036288", + "932266666666666689036288" + ], + "mAssetQty": "2801553941266024692391575", + "swapFee": "1680932364759614815434" + }, + { + "bAssetQtys": [ + "1165333333333333193523200", + "1165333333333333193523200", + "1165333333333333193523200" + ], + "mAssetQty": "3502923377571130423392051", + "swapFee": "2101754026542678254035" + }, + { + "bAssetQtys": [ + "1398400000000000100663296", + "1398400000000000100663296", + "1398400000000000100663296" + ], + "mAssetQty": "4205556642026964606593822", + "swapFee": "2523333985216178763956" + }, + { + "bAssetQtys": [ + "1631466666666666739367936", + "1631466666666666739367936", + "1631466666666666739367936" + ], + "mAssetQty": "4911740252433022541656772", + "swapFee": "2947044151459813524994" + }, + { + "bAssetQtys": [ + "1864533333333333378072576", + "1864533333333333378072576", + "1864533333333333378072576" + ], + "hardLimitError": true + }, + { + "bAssetQtys": [ + "2097600000000000016777216", + "2097600000000000016777216", + "2097600000000000016777216" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "2330666666666666387046400", + "2330666666666666387046400", + "2330666666666666387046400" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "3333333333333", + "3333333333333", + "3333333333333" + ], + "mAssetQty": "10012169329578", + "swapFee": "6007301597" + }, + { + "bAssetQtys": [ + "333333333333333", + "333333333333333", + "333333333333333" + ], + "mAssetQty": "1001216932958058", + "swapFee": "600730159774" + }, + { + "bAssetQtys": [ + "33333333333333332", + "33333333333333332", + "33333333333333332" + ], + "mAssetQty": "100121693296744420", + "swapFee": "60073015978046" + }, + { + "bAssetQtys": [ + "333333333333333312", + "333333333333333312", + "333333333333333312" + ], + "mAssetQty": "1001216933052754844", + "swapFee": "600730159831652" + }, + { + "bAssetQtys": [ + "3333333333333333504", + "3333333333333333504", + "3333333333333333504" + ], + "mAssetQty": "10012169339058628903", + "swapFee": "6007301603435177" + }, + { + "bAssetQtys": [ + "33333333333333336064", + "33333333333333336064", + "33333333333333336064" + ], + "mAssetQty": "100121694243707687525", + "swapFee": "60073016546224612" + }, + { + "bAssetQtys": [ + "233066666666666672259072", + "233066666666666672259072", + "233066666666666672259072" + ], + "mAssetQty": "700103049377134224963752", + "swapFee": "420061829626280534978" + }, + { + "bAssetQtys": [ + "466133333333333344518144", + "466133333333333344518144", + "466133333333333344518144" + ], + "mAssetQty": "1400340642413086499054609", + "swapFee": "840204385447851899432" + }, + { + "bAssetQtys": [ + "699200000000000050331648", + "699200000000000050331648", + "699200000000000050331648" + ], + "mAssetQty": "2100781755590947292822968", + "swapFee": "1260469053354568375693" + }, + { + "bAssetQtys": [ + "932266666666666689036288", + "932266666666666689036288", + "932266666666666689036288" + ], + "mAssetQty": "2801553941266024692391575", + "swapFee": "1680932364759614815434" + }, + { + "bAssetQtys": [ + "1165333333333333193523200", + "1165333333333333193523200", + "1165333333333333193523200" + ], + "mAssetQty": "3502923377571130423392051", + "swapFee": "2101754026542678254035" + }, + { + "bAssetQtys": [ + "1398400000000000100663296", + "1398400000000000100663296", + "1398400000000000100663296" + ], + "mAssetQty": "4205556642026964606593822", + "swapFee": "2523333985216178763956" + }, + { + "bAssetQtys": [ + "1631466666666666739367936", + "1631466666666666739367936", + "1631466666666666739367936" + ], + "mAssetQty": "4911740252433022541656772", + "swapFee": "2947044151459813524994" + }, + { + "bAssetQtys": [ + "1864533333333333378072576", + "1864533333333333378072576", + "1864533333333333378072576" + ], + "hardLimitError": true + }, + { + "bAssetQtys": [ + "2097600000000000016777216", + "2097600000000000016777216", + "2097600000000000016777216" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "2330666666666666387046400", + "2330666666666666387046400", + "2330666666666666387046400" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "3333333333333", + "3333333333333", + "3333333333333" + ], + "mAssetQty": "10012169329578", + "swapFee": "6007301597" + }, + { + "bAssetQtys": [ + "333333333333333", + "333333333333333", + "333333333333333" + ], + "mAssetQty": "1001216932958058", + "swapFee": "600730159774" + }, + { + "bAssetQtys": [ + "33333333333333332", + "33333333333333332", + "33333333333333332" + ], + "mAssetQty": "100121693296744420", + "swapFee": "60073015978046" + }, + { + "bAssetQtys": [ + "333333333333333312", + "333333333333333312", + "333333333333333312" + ], + "mAssetQty": "1001216933052754844", + "swapFee": "600730159831652" + }, + { + "bAssetQtys": [ + "3333333333333333504", + "3333333333333333504", + "3333333333333333504" + ], + "mAssetQty": "10012169339058628903", + "swapFee": "6007301603435177" + }, + { + "bAssetQtys": [ + "33333333333333336064", + "33333333333333336064", + "33333333333333336064" + ], + "mAssetQty": "100121694243707687525", + "swapFee": "60073016546224612" + }, + { + "bAssetQtys": [ + "233066666666666672259072", + "233066666666666672259072", + "233066666666666672259072" + ], + "mAssetQty": "700103049377134224963752", + "swapFee": "420061829626280534978" + }, + { + "bAssetQtys": [ + "466133333333333344518144", + "466133333333333344518144", + "466133333333333344518144" + ], + "mAssetQty": "1400340642413086499054609", + "swapFee": "840204385447851899432" + }, + { + "bAssetQtys": [ + "699200000000000050331648", + "699200000000000050331648", + "699200000000000050331648" + ], + "mAssetQty": "2100781755590947292822968", + "swapFee": "1260469053354568375693" + }, + { + "bAssetQtys": [ + "932266666666666689036288", + "932266666666666689036288", + "932266666666666689036288" + ], + "mAssetQty": "2801553941266024692391575", + "swapFee": "1680932364759614815434" + }, + { + "bAssetQtys": [ + "1165333333333333193523200", + "1165333333333333193523200", + "1165333333333333193523200" + ], + "mAssetQty": "3502923377571130423392051", + "swapFee": "2101754026542678254035" + }, + { + "bAssetQtys": [ + "1398400000000000100663296", + "1398400000000000100663296", + "1398400000000000100663296" + ], + "mAssetQty": "4205556642026964606593822", + "swapFee": "2523333985216178763956" + }, + { + "bAssetQtys": [ + "1631466666666666739367936", + "1631466666666666739367936", + "1631466666666666739367936" + ], + "mAssetQty": "4911740252433022541656772", + "swapFee": "2947044151459813524994" + }, + { + "bAssetQtys": [ + "1864533333333333378072576", + "1864533333333333378072576", + "1864533333333333378072576" + ], + "hardLimitError": true + }, + { + "bAssetQtys": [ + "2097600000000000016777216", + "2097600000000000016777216", + "2097600000000000016777216" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "2330666666666666387046400", + "2330666666666666387046400", + "2330666666666666387046400" + ], + "insufficientLiquidityError": true + } + ] + }, + { + "reserve0": "7492500000000000000000000", + "reserve1": "2007000000000000000000000", + "reserve2": "500500000000000000000000", + "A": 120, + "mAssetSupply": "9896372713490403790662354", + "hardMin": 50000000000000000, + "hardMax": 750000000000000000, + "swapFeeRate": 600000000000000, + "redeems": [ + { + "bAssetQtys": [ + "3333333333333", + "3333333333333", + "3333333333333" + ], + "mAssetQty": "10622586151486", + "swapFee": "6373551690" + }, + { + "bAssetQtys": [ + "333333333333333", + "333333333333333", + "333333333333333" + ], + "mAssetQty": "1062258615187624", + "swapFee": "637355169112" + }, + { + "bAssetQtys": [ + "33333333333333332", + "33333333333333332", + "33333333333333332" + ], + "mAssetQty": "106225861906681338", + "swapFee": "63735517144008" + }, + { + "bAssetQtys": [ + "333333333333333312", + "333333333333333312", + "333333333333333312" + ], + "mAssetQty": "1062258654332173770", + "swapFee": "637355192599304" + }, + { + "bAssetQtys": [ + "3333333333333333504", + "3333333333333333504", + "3333333333333333504" + ], + "mAssetQty": "10622590069880050646", + "swapFee": "6373554041928030" + }, + { + "bAssetQtys": [ + "33333333333333336064", + "33333333333333336064", + "33333333333333336064" + ], + "mAssetQty": "106226253376904511525", + "swapFee": "63735752026142706" + }, + { + "bAssetQtys": [ + "233066666666666672259072", + "233066666666666672259072", + "233066666666666672259072" + ], + "hardLimitError": true + }, + { + "bAssetQtys": [ + "466133333333333344518144", + "466133333333333344518144", + "466133333333333344518144" + ], + "hardLimitError": true + }, + { + "bAssetQtys": [ + "699200000000000050331648", + "699200000000000050331648", + "699200000000000050331648" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "932266666666666689036288", + "932266666666666689036288", + "932266666666666689036288" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "1165333333333333193523200", + "1165333333333333193523200", + "1165333333333333193523200" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "1398400000000000100663296", + "1398400000000000100663296", + "1398400000000000100663296" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "1631466666666666739367936", + "1631466666666666739367936", + "1631466666666666739367936" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "1864533333333333378072576", + "1864533333333333378072576", + "1864533333333333378072576" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "2097600000000000016777216", + "2097600000000000016777216", + "2097600000000000016777216" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "2330666666666666387046400", + "2330666666666666387046400", + "2330666666666666387046400" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "3333333333333", + "3333333333333", + "3333333333333" + ], + "mAssetQty": "10622586151486", + "swapFee": "6373551690" + }, + { + "bAssetQtys": [ + "333333333333333", + "333333333333333", + "333333333333333" + ], + "mAssetQty": "1062258615187624", + "swapFee": "637355169112" + }, + { + "bAssetQtys": [ + "33333333333333332", + "33333333333333332", + "33333333333333332" + ], + "mAssetQty": "106225861906681338", + "swapFee": "63735517144008" + }, + { + "bAssetQtys": [ + "333333333333333312", + "333333333333333312", + "333333333333333312" + ], + "mAssetQty": "1062258654332173770", + "swapFee": "637355192599304" + }, + { + "bAssetQtys": [ + "3333333333333333504", + "3333333333333333504", + "3333333333333333504" + ], + "mAssetQty": "10622590069880050646", + "swapFee": "6373554041928030" + }, + { + "bAssetQtys": [ + "33333333333333336064", + "33333333333333336064", + "33333333333333336064" + ], + "mAssetQty": "106226253376904511525", + "swapFee": "63735752026142706" + }, + { + "bAssetQtys": [ + "233066666666666672259072", + "233066666666666672259072", + "233066666666666672259072" + ], + "hardLimitError": true + }, + { + "bAssetQtys": [ + "466133333333333344518144", + "466133333333333344518144", + "466133333333333344518144" + ], + "hardLimitError": true + }, + { + "bAssetQtys": [ + "699200000000000050331648", + "699200000000000050331648", + "699200000000000050331648" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "932266666666666689036288", + "932266666666666689036288", + "932266666666666689036288" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "1165333333333333193523200", + "1165333333333333193523200", + "1165333333333333193523200" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "1398400000000000100663296", + "1398400000000000100663296", + "1398400000000000100663296" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "1631466666666666739367936", + "1631466666666666739367936", + "1631466666666666739367936" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "1864533333333333378072576", + "1864533333333333378072576", + "1864533333333333378072576" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "2097600000000000016777216", + "2097600000000000016777216", + "2097600000000000016777216" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "2330666666666666387046400", + "2330666666666666387046400", + "2330666666666666387046400" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "3333333333333", + "3333333333333", + "3333333333333" + ], + "mAssetQty": "10622586151486", + "swapFee": "6373551690" + }, + { + "bAssetQtys": [ + "333333333333333", + "333333333333333", + "333333333333333" + ], + "mAssetQty": "1062258615187624", + "swapFee": "637355169112" + }, + { + "bAssetQtys": [ + "33333333333333332", + "33333333333333332", + "33333333333333332" + ], + "mAssetQty": "106225861906681338", + "swapFee": "63735517144008" + }, + { + "bAssetQtys": [ + "333333333333333312", + "333333333333333312", + "333333333333333312" + ], + "mAssetQty": "1062258654332173770", + "swapFee": "637355192599304" + }, + { + "bAssetQtys": [ + "3333333333333333504", + "3333333333333333504", + "3333333333333333504" + ], + "mAssetQty": "10622590069880050646", + "swapFee": "6373554041928030" + }, + { + "bAssetQtys": [ + "33333333333333336064", + "33333333333333336064", + "33333333333333336064" + ], + "mAssetQty": "106226253376904511525", + "swapFee": "63735752026142706" + }, + { + "bAssetQtys": [ + "233066666666666672259072", + "233066666666666672259072", + "233066666666666672259072" + ], + "hardLimitError": true + }, + { + "bAssetQtys": [ + "466133333333333344518144", + "466133333333333344518144", + "466133333333333344518144" + ], + "hardLimitError": true + }, + { + "bAssetQtys": [ + "699200000000000050331648", + "699200000000000050331648", + "699200000000000050331648" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "932266666666666689036288", + "932266666666666689036288", + "932266666666666689036288" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "1165333333333333193523200", + "1165333333333333193523200", + "1165333333333333193523200" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "1398400000000000100663296", + "1398400000000000100663296", + "1398400000000000100663296" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "1631466666666666739367936", + "1631466666666666739367936", + "1631466666666666739367936" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "1864533333333333378072576", + "1864533333333333378072576", + "1864533333333333378072576" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "2097600000000000016777216", + "2097600000000000016777216", + "2097600000000000016777216" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "2330666666666666387046400", + "2330666666666666387046400", + "2330666666666666387046400" + ], + "insufficientLiquidityError": true + } + ] + }, + { + "reserve0": "500500000000000000000000", + "reserve1": "3996499999999999360000000", + "reserve2": "5503000000000000000000000", + "A": 120, + "mAssetSupply": "9936488013915504712820075", + "hardMin": 50000000000000000, + "hardMax": 750000000000000000, + "swapFeeRate": 600000000000000, + "redeems": [ + { + "bAssetQtys": [ + "3333333333333", + "3333333333333", + "3333333333333" + ], + "mAssetQty": "10392147416180", + "swapFee": "6235288449" + }, + { + "bAssetQtys": [ + "333333333333333", + "333333333333333", + "333333333333333" + ], + "mAssetQty": "1039214741642829", + "swapFee": "623528844985" + }, + { + "bAssetQtys": [ + "33333333333333332", + "33333333333333332", + "33333333333333332" + ], + "mAssetQty": "103921474410486193", + "swapFee": "62352884646291" + }, + { + "bAssetQtys": [ + "333333333333333312", + "333333333333333312", + "333333333333333312" + ], + "mAssetQty": "1039214766486970714", + "swapFee": "623528859892182" + }, + { + "bAssetQtys": [ + "3333333333333333504", + "3333333333333333504", + "3333333333333333504" + ], + "mAssetQty": "10392149903094943109", + "swapFee": "6235289941856965" + }, + { + "bAssetQtys": [ + "33333333333333336064", + "33333333333333336064", + "33333333333333336064" + ], + "mAssetQty": "103921722867828995814", + "swapFee": "62353033720697397" + }, + { + "bAssetQtys": [ + "233066666666666672259072", + "233066666666666672259072", + "233066666666666672259072" + ], + "hardLimitError": true + }, + { + "bAssetQtys": [ + "466133333333333344518144", + "466133333333333344518144", + "466133333333333344518144" + ], + "hardLimitError": true + }, + { + "bAssetQtys": [ + "699200000000000050331648", + "699200000000000050331648", + "699200000000000050331648" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "932266666666666689036288", + "932266666666666689036288", + "932266666666666689036288" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "1165333333333333193523200", + "1165333333333333193523200", + "1165333333333333193523200" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "1398400000000000100663296", + "1398400000000000100663296", + "1398400000000000100663296" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "1631466666666666739367936", + "1631466666666666739367936", + "1631466666666666739367936" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "1864533333333333378072576", + "1864533333333333378072576", + "1864533333333333378072576" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "2097600000000000016777216", + "2097600000000000016777216", + "2097600000000000016777216" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "2330666666666666387046400", + "2330666666666666387046400", + "2330666666666666387046400" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "3333333333333", + "3333333333333", + "3333333333333" + ], + "mAssetQty": "10392147416180", + "swapFee": "6235288449" + }, + { + "bAssetQtys": [ + "333333333333333", + "333333333333333", + "333333333333333" + ], + "mAssetQty": "1039214741642829", + "swapFee": "623528844985" + }, + { + "bAssetQtys": [ + "33333333333333332", + "33333333333333332", + "33333333333333332" + ], + "mAssetQty": "103921474410486193", + "swapFee": "62352884646291" + }, + { + "bAssetQtys": [ + "333333333333333312", + "333333333333333312", + "333333333333333312" + ], + "mAssetQty": "1039214766486970714", + "swapFee": "623528859892182" + }, + { + "bAssetQtys": [ + "3333333333333333504", + "3333333333333333504", + "3333333333333333504" + ], + "mAssetQty": "10392149903094943109", + "swapFee": "6235289941856965" + }, + { + "bAssetQtys": [ + "33333333333333336064", + "33333333333333336064", + "33333333333333336064" + ], + "mAssetQty": "103921722867828995814", + "swapFee": "62353033720697397" + }, + { + "bAssetQtys": [ + "233066666666666672259072", + "233066666666666672259072", + "233066666666666672259072" + ], + "hardLimitError": true + }, + { + "bAssetQtys": [ + "466133333333333344518144", + "466133333333333344518144", + "466133333333333344518144" + ], + "hardLimitError": true + }, + { + "bAssetQtys": [ + "699200000000000050331648", + "699200000000000050331648", + "699200000000000050331648" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "932266666666666689036288", + "932266666666666689036288", + "932266666666666689036288" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "1165333333333333193523200", + "1165333333333333193523200", + "1165333333333333193523200" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "1398400000000000100663296", + "1398400000000000100663296", + "1398400000000000100663296" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "1631466666666666739367936", + "1631466666666666739367936", + "1631466666666666739367936" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "1864533333333333378072576", + "1864533333333333378072576", + "1864533333333333378072576" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "2097600000000000016777216", + "2097600000000000016777216", + "2097600000000000016777216" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "2330666666666666387046400", + "2330666666666666387046400", + "2330666666666666387046400" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "3333333333333", + "3333333333333", + "3333333333333" + ], + "mAssetQty": "10392147416180", + "swapFee": "6235288449" + }, + { + "bAssetQtys": [ + "333333333333333", + "333333333333333", + "333333333333333" + ], + "mAssetQty": "1039214741642829", + "swapFee": "623528844985" + }, + { + "bAssetQtys": [ + "33333333333333332", + "33333333333333332", + "33333333333333332" + ], + "mAssetQty": "103921474410486193", + "swapFee": "62352884646291" + }, + { + "bAssetQtys": [ + "333333333333333312", + "333333333333333312", + "333333333333333312" + ], + "mAssetQty": "1039214766486970714", + "swapFee": "623528859892182" + }, + { + "bAssetQtys": [ + "3333333333333333504", + "3333333333333333504", + "3333333333333333504" + ], + "mAssetQty": "10392149903094943109", + "swapFee": "6235289941856965" + }, + { + "bAssetQtys": [ + "33333333333333336064", + "33333333333333336064", + "33333333333333336064" + ], + "mAssetQty": "103921722867828995814", + "swapFee": "62353033720697397" + }, + { + "bAssetQtys": [ + "233066666666666672259072", + "233066666666666672259072", + "233066666666666672259072" + ], + "hardLimitError": true + }, + { + "bAssetQtys": [ + "466133333333333344518144", + "466133333333333344518144", + "466133333333333344518144" + ], + "hardLimitError": true + }, + { + "bAssetQtys": [ + "699200000000000050331648", + "699200000000000050331648", + "699200000000000050331648" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "932266666666666689036288", + "932266666666666689036288", + "932266666666666689036288" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "1165333333333333193523200", + "1165333333333333193523200", + "1165333333333333193523200" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "1398400000000000100663296", + "1398400000000000100663296", + "1398400000000000100663296" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "1631466666666666739367936", + "1631466666666666739367936", + "1631466666666666739367936" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "1864533333333333378072576", + "1864533333333333378072576", + "1864533333333333378072576" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "2097600000000000016777216", + "2097600000000000016777216", + "2097600000000000016777216" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "2330666666666666387046400", + "2330666666666666387046400", + "2330666666666666387046400" + ], + "insufficientLiquidityError": true + } + ] + }, + { + "reserve0": "500500000000000000000000", + "reserve1": "7492500000000000000000000", + "reserve2": "2007000000000000000000000", + "A": 120, + "mAssetSupply": "9896372713490403790662354", + "hardMin": 50000000000000000, + "hardMax": 750000000000000000, + "swapFeeRate": 600000000000000, + "redeems": [ + { + "bAssetQtys": [ + "3333333333333", + "3333333333333", + "3333333333333" + ], + "mAssetQty": "10622586151486", + "swapFee": "6373551690" + }, + { + "bAssetQtys": [ + "333333333333333", + "333333333333333", + "333333333333333" + ], + "mAssetQty": "1062258615187624", + "swapFee": "637355169112" + }, + { + "bAssetQtys": [ + "33333333333333332", + "33333333333333332", + "33333333333333332" + ], + "mAssetQty": "106225861906681338", + "swapFee": "63735517144008" + }, + { + "bAssetQtys": [ + "333333333333333312", + "333333333333333312", + "333333333333333312" + ], + "mAssetQty": "1062258654332173770", + "swapFee": "637355192599304" + }, + { + "bAssetQtys": [ + "3333333333333333504", + "3333333333333333504", + "3333333333333333504" + ], + "mAssetQty": "10622590069880050646", + "swapFee": "6373554041928030" + }, + { + "bAssetQtys": [ + "33333333333333336064", + "33333333333333336064", + "33333333333333336064" + ], + "mAssetQty": "106226253376904511525", + "swapFee": "63735752026142706" + }, + { + "bAssetQtys": [ + "233066666666666672259072", + "233066666666666672259072", + "233066666666666672259072" + ], + "hardLimitError": true + }, + { + "bAssetQtys": [ + "466133333333333344518144", + "466133333333333344518144", + "466133333333333344518144" + ], + "hardLimitError": true + }, + { + "bAssetQtys": [ + "699200000000000050331648", + "699200000000000050331648", + "699200000000000050331648" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "932266666666666689036288", + "932266666666666689036288", + "932266666666666689036288" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "1165333333333333193523200", + "1165333333333333193523200", + "1165333333333333193523200" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "1398400000000000100663296", + "1398400000000000100663296", + "1398400000000000100663296" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "1631466666666666739367936", + "1631466666666666739367936", + "1631466666666666739367936" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "1864533333333333378072576", + "1864533333333333378072576", + "1864533333333333378072576" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "2097600000000000016777216", + "2097600000000000016777216", + "2097600000000000016777216" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "2330666666666666387046400", + "2330666666666666387046400", + "2330666666666666387046400" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "3333333333333", + "3333333333333", + "3333333333333" + ], + "mAssetQty": "10622586151486", + "swapFee": "6373551690" + }, + { + "bAssetQtys": [ + "333333333333333", + "333333333333333", + "333333333333333" + ], + "mAssetQty": "1062258615187624", + "swapFee": "637355169112" + }, + { + "bAssetQtys": [ + "33333333333333332", + "33333333333333332", + "33333333333333332" + ], + "mAssetQty": "106225861906681338", + "swapFee": "63735517144008" + }, + { + "bAssetQtys": [ + "333333333333333312", + "333333333333333312", + "333333333333333312" + ], + "mAssetQty": "1062258654332173770", + "swapFee": "637355192599304" + }, + { + "bAssetQtys": [ + "3333333333333333504", + "3333333333333333504", + "3333333333333333504" + ], + "mAssetQty": "10622590069880050646", + "swapFee": "6373554041928030" + }, + { + "bAssetQtys": [ + "33333333333333336064", + "33333333333333336064", + "33333333333333336064" + ], + "mAssetQty": "106226253376904511525", + "swapFee": "63735752026142706" + }, + { + "bAssetQtys": [ + "233066666666666672259072", + "233066666666666672259072", + "233066666666666672259072" + ], + "hardLimitError": true + }, + { + "bAssetQtys": [ + "466133333333333344518144", + "466133333333333344518144", + "466133333333333344518144" + ], + "hardLimitError": true + }, + { + "bAssetQtys": [ + "699200000000000050331648", + "699200000000000050331648", + "699200000000000050331648" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "932266666666666689036288", + "932266666666666689036288", + "932266666666666689036288" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "1165333333333333193523200", + "1165333333333333193523200", + "1165333333333333193523200" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "1398400000000000100663296", + "1398400000000000100663296", + "1398400000000000100663296" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "1631466666666666739367936", + "1631466666666666739367936", + "1631466666666666739367936" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "1864533333333333378072576", + "1864533333333333378072576", + "1864533333333333378072576" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "2097600000000000016777216", + "2097600000000000016777216", + "2097600000000000016777216" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "2330666666666666387046400", + "2330666666666666387046400", + "2330666666666666387046400" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "3333333333333", + "3333333333333", + "3333333333333" + ], + "mAssetQty": "10622586151486", + "swapFee": "6373551690" + }, + { + "bAssetQtys": [ + "333333333333333", + "333333333333333", + "333333333333333" + ], + "mAssetQty": "1062258615187624", + "swapFee": "637355169112" + }, + { + "bAssetQtys": [ + "33333333333333332", + "33333333333333332", + "33333333333333332" + ], + "mAssetQty": "106225861906681338", + "swapFee": "63735517144008" + }, + { + "bAssetQtys": [ + "333333333333333312", + "333333333333333312", + "333333333333333312" + ], + "mAssetQty": "1062258654332173770", + "swapFee": "637355192599304" + }, + { + "bAssetQtys": [ + "3333333333333333504", + "3333333333333333504", + "3333333333333333504" + ], + "mAssetQty": "10622590069880050646", + "swapFee": "6373554041928030" + }, + { + "bAssetQtys": [ + "33333333333333336064", + "33333333333333336064", + "33333333333333336064" + ], + "mAssetQty": "106226253376904511525", + "swapFee": "63735752026142706" + }, + { + "bAssetQtys": [ + "233066666666666672259072", + "233066666666666672259072", + "233066666666666672259072" + ], + "hardLimitError": true + }, + { + "bAssetQtys": [ + "466133333333333344518144", + "466133333333333344518144", + "466133333333333344518144" + ], + "hardLimitError": true + }, + { + "bAssetQtys": [ + "699200000000000050331648", + "699200000000000050331648", + "699200000000000050331648" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "932266666666666689036288", + "932266666666666689036288", + "932266666666666689036288" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "1165333333333333193523200", + "1165333333333333193523200", + "1165333333333333193523200" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "1398400000000000100663296", + "1398400000000000100663296", + "1398400000000000100663296" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "1631466666666666739367936", + "1631466666666666739367936", + "1631466666666666739367936" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "1864533333333333378072576", + "1864533333333333378072576", + "1864533333333333378072576" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "2097600000000000016777216", + "2097600000000000016777216", + "2097600000000000016777216" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "2330666666666666387046400", + "2330666666666666387046400", + "2330666666666666387046400" + ], + "insufficientLiquidityError": true + } + ] + }, + { + "reserve0": "3996499999999999360000000", + "reserve1": "500500000000000000000000", + "reserve2": "5503000000000000000000000", + "A": 120, + "mAssetSupply": "9936488013915504712820075", + "hardMin": 50000000000000000, + "hardMax": 750000000000000000, + "swapFeeRate": 600000000000000, + "redeems": [ + { + "bAssetQtys": [ + "3333333333333", + "3333333333333", + "3333333333333" + ], + "mAssetQty": "10392147416180", + "swapFee": "6235288449" + }, + { + "bAssetQtys": [ + "333333333333333", + "333333333333333", + "333333333333333" + ], + "mAssetQty": "1039214741642829", + "swapFee": "623528844985" + }, + { + "bAssetQtys": [ + "33333333333333332", + "33333333333333332", + "33333333333333332" + ], + "mAssetQty": "103921474410486193", + "swapFee": "62352884646291" + }, + { + "bAssetQtys": [ + "333333333333333312", + "333333333333333312", + "333333333333333312" + ], + "mAssetQty": "1039214766486970714", + "swapFee": "623528859892182" + }, + { + "bAssetQtys": [ + "3333333333333333504", + "3333333333333333504", + "3333333333333333504" + ], + "mAssetQty": "10392149903094943109", + "swapFee": "6235289941856965" + }, + { + "bAssetQtys": [ + "33333333333333336064", + "33333333333333336064", + "33333333333333336064" + ], + "mAssetQty": "103921722867828995814", + "swapFee": "62353033720697397" + }, + { + "bAssetQtys": [ + "233066666666666672259072", + "233066666666666672259072", + "233066666666666672259072" + ], + "hardLimitError": true + }, + { + "bAssetQtys": [ + "466133333333333344518144", + "466133333333333344518144", + "466133333333333344518144" + ], + "hardLimitError": true + }, + { + "bAssetQtys": [ + "699200000000000050331648", + "699200000000000050331648", + "699200000000000050331648" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "932266666666666689036288", + "932266666666666689036288", + "932266666666666689036288" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "1165333333333333193523200", + "1165333333333333193523200", + "1165333333333333193523200" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "1398400000000000100663296", + "1398400000000000100663296", + "1398400000000000100663296" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "1631466666666666739367936", + "1631466666666666739367936", + "1631466666666666739367936" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "1864533333333333378072576", + "1864533333333333378072576", + "1864533333333333378072576" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "2097600000000000016777216", + "2097600000000000016777216", + "2097600000000000016777216" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "2330666666666666387046400", + "2330666666666666387046400", + "2330666666666666387046400" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "3333333333333", + "3333333333333", + "3333333333333" + ], + "mAssetQty": "10392147416180", + "swapFee": "6235288449" + }, + { + "bAssetQtys": [ + "333333333333333", + "333333333333333", + "333333333333333" + ], + "mAssetQty": "1039214741642829", + "swapFee": "623528844985" + }, + { + "bAssetQtys": [ + "33333333333333332", + "33333333333333332", + "33333333333333332" + ], + "mAssetQty": "103921474410486193", + "swapFee": "62352884646291" + }, + { + "bAssetQtys": [ + "333333333333333312", + "333333333333333312", + "333333333333333312" + ], + "mAssetQty": "1039214766486970714", + "swapFee": "623528859892182" + }, + { + "bAssetQtys": [ + "3333333333333333504", + "3333333333333333504", + "3333333333333333504" + ], + "mAssetQty": "10392149903094943109", + "swapFee": "6235289941856965" + }, + { + "bAssetQtys": [ + "33333333333333336064", + "33333333333333336064", + "33333333333333336064" + ], + "mAssetQty": "103921722867828995814", + "swapFee": "62353033720697397" + }, + { + "bAssetQtys": [ + "233066666666666672259072", + "233066666666666672259072", + "233066666666666672259072" + ], + "hardLimitError": true + }, + { + "bAssetQtys": [ + "466133333333333344518144", + "466133333333333344518144", + "466133333333333344518144" + ], + "hardLimitError": true + }, + { + "bAssetQtys": [ + "699200000000000050331648", + "699200000000000050331648", + "699200000000000050331648" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "932266666666666689036288", + "932266666666666689036288", + "932266666666666689036288" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "1165333333333333193523200", + "1165333333333333193523200", + "1165333333333333193523200" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "1398400000000000100663296", + "1398400000000000100663296", + "1398400000000000100663296" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "1631466666666666739367936", + "1631466666666666739367936", + "1631466666666666739367936" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "1864533333333333378072576", + "1864533333333333378072576", + "1864533333333333378072576" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "2097600000000000016777216", + "2097600000000000016777216", + "2097600000000000016777216" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "2330666666666666387046400", + "2330666666666666387046400", + "2330666666666666387046400" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "3333333333333", + "3333333333333", + "3333333333333" + ], + "mAssetQty": "10392147416180", + "swapFee": "6235288449" + }, + { + "bAssetQtys": [ + "333333333333333", + "333333333333333", + "333333333333333" + ], + "mAssetQty": "1039214741642829", + "swapFee": "623528844985" + }, + { + "bAssetQtys": [ + "33333333333333332", + "33333333333333332", + "33333333333333332" + ], + "mAssetQty": "103921474410486193", + "swapFee": "62352884646291" + }, + { + "bAssetQtys": [ + "333333333333333312", + "333333333333333312", + "333333333333333312" + ], + "mAssetQty": "1039214766486970714", + "swapFee": "623528859892182" + }, + { + "bAssetQtys": [ + "3333333333333333504", + "3333333333333333504", + "3333333333333333504" + ], + "mAssetQty": "10392149903094943109", + "swapFee": "6235289941856965" + }, + { + "bAssetQtys": [ + "33333333333333336064", + "33333333333333336064", + "33333333333333336064" + ], + "mAssetQty": "103921722867828995814", + "swapFee": "62353033720697397" + }, + { + "bAssetQtys": [ + "233066666666666672259072", + "233066666666666672259072", + "233066666666666672259072" + ], + "hardLimitError": true + }, + { + "bAssetQtys": [ + "466133333333333344518144", + "466133333333333344518144", + "466133333333333344518144" + ], + "hardLimitError": true + }, + { + "bAssetQtys": [ + "699200000000000050331648", + "699200000000000050331648", + "699200000000000050331648" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "932266666666666689036288", + "932266666666666689036288", + "932266666666666689036288" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "1165333333333333193523200", + "1165333333333333193523200", + "1165333333333333193523200" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "1398400000000000100663296", + "1398400000000000100663296", + "1398400000000000100663296" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "1631466666666666739367936", + "1631466666666666739367936", + "1631466666666666739367936" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "1864533333333333378072576", + "1864533333333333378072576", + "1864533333333333378072576" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "2097600000000000016777216", + "2097600000000000016777216", + "2097600000000000016777216" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "2330666666666666387046400", + "2330666666666666387046400", + "2330666666666666387046400" + ], + "insufficientLiquidityError": true + } + ] + }, + { + "reserve0": "3996499999999999360000000", + "reserve1": "3996499999999999360000000", + "reserve2": "2007000000000000960000000", + "A": 120, + "mAssetSupply": "9995726520619110731126433", + "hardMin": 50000000000000000, + "hardMax": 750000000000000000, + "swapFeeRate": 600000000000000, + "redeems": [ + { + "bAssetQtys": [ + "3333333333333", + "3333333333333", + "3333333333333" + ], + "mAssetQty": "10012169329578", + "swapFee": "6007301597" + }, + { + "bAssetQtys": [ + "333333333333333", + "333333333333333", + "333333333333333" + ], + "mAssetQty": "1001216932958058", + "swapFee": "600730159774" + }, + { + "bAssetQtys": [ + "33333333333333332", + "33333333333333332", + "33333333333333332" + ], + "mAssetQty": "100121693296744420", + "swapFee": "60073015978046" + }, + { + "bAssetQtys": [ + "333333333333333312", + "333333333333333312", + "333333333333333312" + ], + "mAssetQty": "1001216933052754844", + "swapFee": "600730159831652" + }, + { + "bAssetQtys": [ + "3333333333333333504", + "3333333333333333504", + "3333333333333333504" + ], + "mAssetQty": "10012169339058628903", + "swapFee": "6007301603435177" + }, + { + "bAssetQtys": [ + "33333333333333336064", + "33333333333333336064", + "33333333333333336064" + ], + "mAssetQty": "100121694243707687525", + "swapFee": "60073016546224612" + }, + { + "bAssetQtys": [ + "233066666666666672259072", + "233066666666666672259072", + "233066666666666672259072" + ], + "mAssetQty": "700103049377134224963752", + "swapFee": "420061829626280534978" + }, + { + "bAssetQtys": [ + "466133333333333344518144", + "466133333333333344518144", + "466133333333333344518144" + ], + "mAssetQty": "1400340642413086499054609", + "swapFee": "840204385447851899432" + }, + { + "bAssetQtys": [ + "699200000000000050331648", + "699200000000000050331648", + "699200000000000050331648" + ], + "mAssetQty": "2100781755590947292822968", + "swapFee": "1260469053354568375693" + }, + { + "bAssetQtys": [ + "932266666666666689036288", + "932266666666666689036288", + "932266666666666689036288" + ], + "mAssetQty": "2801553941266024692391575", + "swapFee": "1680932364759614815434" + }, + { + "bAssetQtys": [ + "1165333333333333193523200", + "1165333333333333193523200", + "1165333333333333193523200" + ], + "mAssetQty": "3502923377571130423392051", + "swapFee": "2101754026542678254035" + }, + { + "bAssetQtys": [ + "1398400000000000100663296", + "1398400000000000100663296", + "1398400000000000100663296" + ], + "mAssetQty": "4205556642026964606593822", + "swapFee": "2523333985216178763956" + }, + { + "bAssetQtys": [ + "1631466666666666739367936", + "1631466666666666739367936", + "1631466666666666739367936" + ], + "mAssetQty": "4911740252433022541656772", + "swapFee": "2947044151459813524994" + }, + { + "bAssetQtys": [ + "1864533333333333378072576", + "1864533333333333378072576", + "1864533333333333378072576" + ], + "hardLimitError": true + }, + { + "bAssetQtys": [ + "2097600000000000016777216", + "2097600000000000016777216", + "2097600000000000016777216" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "2330666666666666387046400", + "2330666666666666387046400", + "2330666666666666387046400" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "3333333333333", + "3333333333333", + "3333333333333" + ], + "mAssetQty": "10012169329578", + "swapFee": "6007301597" + }, + { + "bAssetQtys": [ + "333333333333333", + "333333333333333", + "333333333333333" + ], + "mAssetQty": "1001216932958058", + "swapFee": "600730159774" + }, + { + "bAssetQtys": [ + "33333333333333332", + "33333333333333332", + "33333333333333332" + ], + "mAssetQty": "100121693296744420", + "swapFee": "60073015978046" + }, + { + "bAssetQtys": [ + "333333333333333312", + "333333333333333312", + "333333333333333312" + ], + "mAssetQty": "1001216933052754844", + "swapFee": "600730159831652" + }, + { + "bAssetQtys": [ + "3333333333333333504", + "3333333333333333504", + "3333333333333333504" + ], + "mAssetQty": "10012169339058628903", + "swapFee": "6007301603435177" + }, + { + "bAssetQtys": [ + "33333333333333336064", + "33333333333333336064", + "33333333333333336064" + ], + "mAssetQty": "100121694243707687525", + "swapFee": "60073016546224612" + }, + { + "bAssetQtys": [ + "233066666666666672259072", + "233066666666666672259072", + "233066666666666672259072" + ], + "mAssetQty": "700103049377134224963752", + "swapFee": "420061829626280534978" + }, + { + "bAssetQtys": [ + "466133333333333344518144", + "466133333333333344518144", + "466133333333333344518144" + ], + "mAssetQty": "1400340642413086499054609", + "swapFee": "840204385447851899432" + }, + { + "bAssetQtys": [ + "699200000000000050331648", + "699200000000000050331648", + "699200000000000050331648" + ], + "mAssetQty": "2100781755590947292822968", + "swapFee": "1260469053354568375693" + }, + { + "bAssetQtys": [ + "932266666666666689036288", + "932266666666666689036288", + "932266666666666689036288" + ], + "mAssetQty": "2801553941266024692391575", + "swapFee": "1680932364759614815434" + }, + { + "bAssetQtys": [ + "1165333333333333193523200", + "1165333333333333193523200", + "1165333333333333193523200" + ], + "mAssetQty": "3502923377571130423392051", + "swapFee": "2101754026542678254035" + }, + { + "bAssetQtys": [ + "1398400000000000100663296", + "1398400000000000100663296", + "1398400000000000100663296" + ], + "mAssetQty": "4205556642026964606593822", + "swapFee": "2523333985216178763956" + }, + { + "bAssetQtys": [ + "1631466666666666739367936", + "1631466666666666739367936", + "1631466666666666739367936" + ], + "mAssetQty": "4911740252433022541656772", + "swapFee": "2947044151459813524994" + }, + { + "bAssetQtys": [ + "1864533333333333378072576", + "1864533333333333378072576", + "1864533333333333378072576" + ], + "hardLimitError": true + }, + { + "bAssetQtys": [ + "2097600000000000016777216", + "2097600000000000016777216", + "2097600000000000016777216" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "2330666666666666387046400", + "2330666666666666387046400", + "2330666666666666387046400" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "3333333333333", + "3333333333333", + "3333333333333" + ], + "mAssetQty": "10012169329578", + "swapFee": "6007301597" + }, + { + "bAssetQtys": [ + "333333333333333", + "333333333333333", + "333333333333333" + ], + "mAssetQty": "1001216932958058", + "swapFee": "600730159774" + }, + { + "bAssetQtys": [ + "33333333333333332", + "33333333333333332", + "33333333333333332" + ], + "mAssetQty": "100121693296744420", + "swapFee": "60073015978046" + }, + { + "bAssetQtys": [ + "333333333333333312", + "333333333333333312", + "333333333333333312" + ], + "mAssetQty": "1001216933052754844", + "swapFee": "600730159831652" + }, + { + "bAssetQtys": [ + "3333333333333333504", + "3333333333333333504", + "3333333333333333504" + ], + "mAssetQty": "10012169339058628903", + "swapFee": "6007301603435177" + }, + { + "bAssetQtys": [ + "33333333333333336064", + "33333333333333336064", + "33333333333333336064" + ], + "mAssetQty": "100121694243707687525", + "swapFee": "60073016546224612" + }, + { + "bAssetQtys": [ + "233066666666666672259072", + "233066666666666672259072", + "233066666666666672259072" + ], + "mAssetQty": "700103049377134224963752", + "swapFee": "420061829626280534978" + }, + { + "bAssetQtys": [ + "466133333333333344518144", + "466133333333333344518144", + "466133333333333344518144" + ], + "mAssetQty": "1400340642413086499054609", + "swapFee": "840204385447851899432" + }, + { + "bAssetQtys": [ + "699200000000000050331648", + "699200000000000050331648", + "699200000000000050331648" + ], + "mAssetQty": "2100781755590947292822968", + "swapFee": "1260469053354568375693" + }, + { + "bAssetQtys": [ + "932266666666666689036288", + "932266666666666689036288", + "932266666666666689036288" + ], + "mAssetQty": "2801553941266024692391575", + "swapFee": "1680932364759614815434" + }, + { + "bAssetQtys": [ + "1165333333333333193523200", + "1165333333333333193523200", + "1165333333333333193523200" + ], + "mAssetQty": "3502923377571130423392051", + "swapFee": "2101754026542678254035" + }, + { + "bAssetQtys": [ + "1398400000000000100663296", + "1398400000000000100663296", + "1398400000000000100663296" + ], + "mAssetQty": "4205556642026964606593822", + "swapFee": "2523333985216178763956" + }, + { + "bAssetQtys": [ + "1631466666666666739367936", + "1631466666666666739367936", + "1631466666666666739367936" + ], + "mAssetQty": "4911740252433022541656772", + "swapFee": "2947044151459813524994" + }, + { + "bAssetQtys": [ + "1864533333333333378072576", + "1864533333333333378072576", + "1864533333333333378072576" + ], + "hardLimitError": true + }, + { + "bAssetQtys": [ + "2097600000000000016777216", + "2097600000000000016777216", + "2097600000000000016777216" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "2330666666666666387046400", + "2330666666666666387046400", + "2330666666666666387046400" + ], + "insufficientLiquidityError": true + } + ] + }, + { + "reserve0": "7492500000000000000000000", + "reserve1": "500500000000000000000000", + "reserve2": "2007000000000000000000000", + "A": 120, + "mAssetSupply": "9896372713490403790662354", + "hardMin": 50000000000000000, + "hardMax": 750000000000000000, + "swapFeeRate": 600000000000000, + "redeems": [ + { + "bAssetQtys": [ + "3333333333333", + "3333333333333", + "3333333333333" + ], + "mAssetQty": "10622586151486", + "swapFee": "6373551690" + }, + { + "bAssetQtys": [ + "333333333333333", + "333333333333333", + "333333333333333" + ], + "mAssetQty": "1062258615187624", + "swapFee": "637355169112" + }, + { + "bAssetQtys": [ + "33333333333333332", + "33333333333333332", + "33333333333333332" + ], + "mAssetQty": "106225861906681338", + "swapFee": "63735517144008" + }, + { + "bAssetQtys": [ + "333333333333333312", + "333333333333333312", + "333333333333333312" + ], + "mAssetQty": "1062258654332173770", + "swapFee": "637355192599304" + }, + { + "bAssetQtys": [ + "3333333333333333504", + "3333333333333333504", + "3333333333333333504" + ], + "mAssetQty": "10622590069880050646", + "swapFee": "6373554041928030" + }, + { + "bAssetQtys": [ + "33333333333333336064", + "33333333333333336064", + "33333333333333336064" + ], + "mAssetQty": "106226253376904511525", + "swapFee": "63735752026142706" + }, + { + "bAssetQtys": [ + "233066666666666672259072", + "233066666666666672259072", + "233066666666666672259072" + ], + "hardLimitError": true + }, + { + "bAssetQtys": [ + "466133333333333344518144", + "466133333333333344518144", + "466133333333333344518144" + ], + "hardLimitError": true + }, + { + "bAssetQtys": [ + "699200000000000050331648", + "699200000000000050331648", + "699200000000000050331648" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "932266666666666689036288", + "932266666666666689036288", + "932266666666666689036288" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "1165333333333333193523200", + "1165333333333333193523200", + "1165333333333333193523200" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "1398400000000000100663296", + "1398400000000000100663296", + "1398400000000000100663296" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "1631466666666666739367936", + "1631466666666666739367936", + "1631466666666666739367936" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "1864533333333333378072576", + "1864533333333333378072576", + "1864533333333333378072576" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "2097600000000000016777216", + "2097600000000000016777216", + "2097600000000000016777216" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "2330666666666666387046400", + "2330666666666666387046400", + "2330666666666666387046400" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "3333333333333", + "3333333333333", + "3333333333333" + ], + "mAssetQty": "10622586151486", + "swapFee": "6373551690" + }, + { + "bAssetQtys": [ + "333333333333333", + "333333333333333", + "333333333333333" + ], + "mAssetQty": "1062258615187624", + "swapFee": "637355169112" + }, + { + "bAssetQtys": [ + "33333333333333332", + "33333333333333332", + "33333333333333332" + ], + "mAssetQty": "106225861906681338", + "swapFee": "63735517144008" + }, + { + "bAssetQtys": [ + "333333333333333312", + "333333333333333312", + "333333333333333312" + ], + "mAssetQty": "1062258654332173770", + "swapFee": "637355192599304" + }, + { + "bAssetQtys": [ + "3333333333333333504", + "3333333333333333504", + "3333333333333333504" + ], + "mAssetQty": "10622590069880050646", + "swapFee": "6373554041928030" + }, + { + "bAssetQtys": [ + "33333333333333336064", + "33333333333333336064", + "33333333333333336064" + ], + "mAssetQty": "106226253376904511525", + "swapFee": "63735752026142706" + }, + { + "bAssetQtys": [ + "233066666666666672259072", + "233066666666666672259072", + "233066666666666672259072" + ], + "hardLimitError": true + }, + { + "bAssetQtys": [ + "466133333333333344518144", + "466133333333333344518144", + "466133333333333344518144" + ], + "hardLimitError": true + }, + { + "bAssetQtys": [ + "699200000000000050331648", + "699200000000000050331648", + "699200000000000050331648" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "932266666666666689036288", + "932266666666666689036288", + "932266666666666689036288" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "1165333333333333193523200", + "1165333333333333193523200", + "1165333333333333193523200" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "1398400000000000100663296", + "1398400000000000100663296", + "1398400000000000100663296" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "1631466666666666739367936", + "1631466666666666739367936", + "1631466666666666739367936" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "1864533333333333378072576", + "1864533333333333378072576", + "1864533333333333378072576" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "2097600000000000016777216", + "2097600000000000016777216", + "2097600000000000016777216" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "2330666666666666387046400", + "2330666666666666387046400", + "2330666666666666387046400" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "3333333333333", + "3333333333333", + "3333333333333" + ], + "mAssetQty": "10622586151486", + "swapFee": "6373551690" + }, + { + "bAssetQtys": [ + "333333333333333", + "333333333333333", + "333333333333333" + ], + "mAssetQty": "1062258615187624", + "swapFee": "637355169112" + }, + { + "bAssetQtys": [ + "33333333333333332", + "33333333333333332", + "33333333333333332" + ], + "mAssetQty": "106225861906681338", + "swapFee": "63735517144008" + }, + { + "bAssetQtys": [ + "333333333333333312", + "333333333333333312", + "333333333333333312" + ], + "mAssetQty": "1062258654332173770", + "swapFee": "637355192599304" + }, + { + "bAssetQtys": [ + "3333333333333333504", + "3333333333333333504", + "3333333333333333504" + ], + "mAssetQty": "10622590069880050646", + "swapFee": "6373554041928030" + }, + { + "bAssetQtys": [ + "33333333333333336064", + "33333333333333336064", + "33333333333333336064" + ], + "mAssetQty": "106226253376904511525", + "swapFee": "63735752026142706" + }, + { + "bAssetQtys": [ + "233066666666666672259072", + "233066666666666672259072", + "233066666666666672259072" + ], + "hardLimitError": true + }, + { + "bAssetQtys": [ + "466133333333333344518144", + "466133333333333344518144", + "466133333333333344518144" + ], + "hardLimitError": true + }, + { + "bAssetQtys": [ + "699200000000000050331648", + "699200000000000050331648", + "699200000000000050331648" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "932266666666666689036288", + "932266666666666689036288", + "932266666666666689036288" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "1165333333333333193523200", + "1165333333333333193523200", + "1165333333333333193523200" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "1398400000000000100663296", + "1398400000000000100663296", + "1398400000000000100663296" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "1631466666666666739367936", + "1631466666666666739367936", + "1631466666666666739367936" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "1864533333333333378072576", + "1864533333333333378072576", + "1864533333333333378072576" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "2097600000000000016777216", + "2097600000000000016777216", + "2097600000000000016777216" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "2330666666666666387046400", + "2330666666666666387046400", + "2330666666666666387046400" + ], + "insufficientLiquidityError": true + } + ] + } +] \ No newline at end of file diff --git a/test-utils/validator-data/full/redeemMassetTestData.json b/test-utils/validator-data/full/redeemMassetTestData.json new file mode 100644 index 00000000..fba1a059 --- /dev/null +++ b/test-utils/validator-data/full/redeemMassetTestData.json @@ -0,0 +1,6662 @@ +[ + { + "reserve0": "5503000000000000000000000", + "reserve1": "500500000000000000000000", + "reserve2": "3996499999999999360000000", + "A": 120, + "mAssetSupply": "9936488013915504712820075", + "hardMin": 50000000000000000, + "hardMax": 750000000000000000, + "redemptionFeeRate": 300000000000000, + "redeems": [ + { + "mAssetQty": "10000000000000", + "bAssetQtys": [ + "5536512591063", + "503547983249", + "4020838191928" + ], + "redemptionFee": "3000000000" + }, + { + "mAssetQty": "1000000000000000", + "bAssetQtys": [ + "553651259106401", + "50354798325049", + "402083819192937" + ], + "redemptionFee": "300000000000" + }, + { + "mAssetQty": "100000000000000000", + "bAssetQtys": [ + "55365125910640290", + "5035479832505080", + "40208381919293818" + ], + "redemptionFee": "30000000000000" + }, + { + "mAssetQty": "1000000000000000000", + "bAssetQtys": [ + "553651259106402914", + "50354798325050818", + "402083819192938196" + ], + "redemptionFee": "300000000000000" + }, + { + "mAssetQty": "10000000000000000000", + "bAssetQtys": [ + "5536512591064029155", + "503547983250508193", + "4020838191929381969" + ], + "redemptionFee": "3000000000000000" + }, + { + "mAssetQty": "100000000000000000000", + "bAssetQtys": [ + "55365125910640291565", + "5035479832505081941", + "40208381919293819699" + ], + "redemptionFee": "30000000000000000" + }, + { + "mAssetQty": "699200000000000050331648", + "bAssetQtys": [ + "387112960367196946497444", + "35208074988875535475552", + "281137006379702407582180" + ], + "redemptionFee": "209760000000000015099" + }, + { + "mAssetQty": "1398400000000000100663296", + "bAssetQtys": [ + "774225920734393892994889", + "70416149977751070951106", + "562274012759404815164362" + ], + "redemptionFee": "419520000000000030198" + }, + { + "mAssetQty": "2097600000000000016777216", + "bAssetQtys": [ + "1161338881101590765182520", + "105624224966626599668153", + "843411019139107168779767" + ], + "redemptionFee": "629280000000000005033" + }, + { + "mAssetQty": "2796800000000000201326592", + "bAssetQtys": [ + "1548451841468787785989780", + "140832299955502141902213", + "1124548025518809630328725" + ], + "redemptionFee": "839040000000000060397" + }, + { + "mAssetQty": "3496000000000000117440512", + "bAssetQtys": [ + "1935564801835984658177411", + "176040374944377670619260", + "1405685031898511983944130" + ], + "redemptionFee": "1048800000000000035232" + }, + { + "mAssetQty": "4195200000000000033554432", + "bAssetQtys": [ + "2322677762203181530365042", + "211248449933253199336307", + "1686822038278214337559535" + ], + "redemptionFee": "1258560000000000010066" + }, + { + "mAssetQty": "4894399999999999949668352", + "bAssetQtys": [ + "2709790722570378402552673", + "246456524922128728053354", + "1967959044657916691174940" + ], + "redemptionFee": "1468319999999999984900" + }, + { + "mAssetQty": "5593600000000000402653184", + "bAssetQtys": [ + "3096903682937575571979561", + "281664599911004283804427", + "2249096051037619260657451" + ], + "redemptionFee": "1678080000000000120795" + }, + { + "mAssetQty": "6292799999999999781896192", + "bAssetQtys": [ + "3484016643304772146927935", + "316872674899879785487448", + "2530233057417321398405750" + ], + "redemptionFee": "1887839999999999934568" + }, + { + "mAssetQty": "6992000000000000234881024", + "bAssetQtys": [ + "3871129603671969316354823", + "352080749888755341238521", + "2811370063797023967888261" + ], + "redemptionFee": "2097600000000000070464" + }, + { + "mAssetQty": "10000000000000", + "bAssetQtys": [ + "5536512591063", + "503547983249", + "4020838191928" + ], + "redemptionFee": "3000000000" + }, + { + "mAssetQty": "1000000000000000", + "bAssetQtys": [ + "553651259106401", + "50354798325049", + "402083819192937" + ], + "redemptionFee": "300000000000" + }, + { + "mAssetQty": "100000000000000000", + "bAssetQtys": [ + "55365125910640290", + "5035479832505080", + "40208381919293818" + ], + "redemptionFee": "30000000000000" + }, + { + "mAssetQty": "1000000000000000000", + "bAssetQtys": [ + "553651259106402914", + "50354798325050818", + "402083819192938196" + ], + "redemptionFee": "300000000000000" + }, + { + "mAssetQty": "10000000000000000000", + "bAssetQtys": [ + "5536512591064029155", + "503547983250508193", + "4020838191929381969" + ], + "redemptionFee": "3000000000000000" + }, + { + "mAssetQty": "100000000000000000000", + "bAssetQtys": [ + "55365125910640291565", + "5035479832505081941", + "40208381919293819699" + ], + "redemptionFee": "30000000000000000" + }, + { + "mAssetQty": "699200000000000050331648", + "bAssetQtys": [ + "387112960367196946497444", + "35208074988875535475552", + "281137006379702407582180" + ], + "redemptionFee": "209760000000000015099" + }, + { + "mAssetQty": "1398400000000000100663296", + "bAssetQtys": [ + "774225920734393892994889", + "70416149977751070951106", + "562274012759404815164362" + ], + "redemptionFee": "419520000000000030198" + }, + { + "mAssetQty": "2097600000000000016777216", + "bAssetQtys": [ + "1161338881101590765182520", + "105624224966626599668153", + "843411019139107168779767" + ], + "redemptionFee": "629280000000000005033" + }, + { + "mAssetQty": "2796800000000000201326592", + "bAssetQtys": [ + "1548451841468787785989780", + "140832299955502141902213", + "1124548025518809630328725" + ], + "redemptionFee": "839040000000000060397" + }, + { + "mAssetQty": "3496000000000000117440512", + "bAssetQtys": [ + "1935564801835984658177411", + "176040374944377670619260", + "1405685031898511983944130" + ], + "redemptionFee": "1048800000000000035232" + }, + { + "mAssetQty": "4195200000000000033554432", + "bAssetQtys": [ + "2322677762203181530365042", + "211248449933253199336307", + "1686822038278214337559535" + ], + "redemptionFee": "1258560000000000010066" + }, + { + "mAssetQty": "4894399999999999949668352", + "bAssetQtys": [ + "2709790722570378402552673", + "246456524922128728053354", + "1967959044657916691174940" + ], + "redemptionFee": "1468319999999999984900" + }, + { + "mAssetQty": "5593600000000000402653184", + "bAssetQtys": [ + "3096903682937575571979561", + "281664599911004283804427", + "2249096051037619260657451" + ], + "redemptionFee": "1678080000000000120795" + }, + { + "mAssetQty": "6292799999999999781896192", + "bAssetQtys": [ + "3484016643304772146927935", + "316872674899879785487448", + "2530233057417321398405750" + ], + "redemptionFee": "1887839999999999934568" + }, + { + "mAssetQty": "6992000000000000234881024", + "bAssetQtys": [ + "3871129603671969316354823", + "352080749888755341238521", + "2811370063797023967888261" + ], + "redemptionFee": "2097600000000000070464" + }, + { + "mAssetQty": "10000000000000", + "bAssetQtys": [ + "5536512591063", + "503547983249", + "4020838191928" + ], + "redemptionFee": "3000000000" + }, + { + "mAssetQty": "1000000000000000", + "bAssetQtys": [ + "553651259106401", + "50354798325049", + "402083819192937" + ], + "redemptionFee": "300000000000" + }, + { + "mAssetQty": "100000000000000000", + "bAssetQtys": [ + "55365125910640290", + "5035479832505080", + "40208381919293818" + ], + "redemptionFee": "30000000000000" + }, + { + "mAssetQty": "1000000000000000000", + "bAssetQtys": [ + "553651259106402914", + "50354798325050818", + "402083819192938196" + ], + "redemptionFee": "300000000000000" + }, + { + "mAssetQty": "10000000000000000000", + "bAssetQtys": [ + "5536512591064029155", + "503547983250508193", + "4020838191929381969" + ], + "redemptionFee": "3000000000000000" + }, + { + "mAssetQty": "100000000000000000000", + "bAssetQtys": [ + "55365125910640291565", + "5035479832505081941", + "40208381919293819699" + ], + "redemptionFee": "30000000000000000" + }, + { + "mAssetQty": "699200000000000050331648", + "bAssetQtys": [ + "387112960367196946497444", + "35208074988875535475552", + "281137006379702407582180" + ], + "redemptionFee": "209760000000000015099" + }, + { + "mAssetQty": "1398400000000000100663296", + "bAssetQtys": [ + "774225920734393892994889", + "70416149977751070951106", + "562274012759404815164362" + ], + "redemptionFee": "419520000000000030198" + }, + { + "mAssetQty": "2097600000000000016777216", + "bAssetQtys": [ + "1161338881101590765182520", + "105624224966626599668153", + "843411019139107168779767" + ], + "redemptionFee": "629280000000000005033" + }, + { + "mAssetQty": "2796800000000000201326592", + "bAssetQtys": [ + "1548451841468787785989780", + "140832299955502141902213", + "1124548025518809630328725" + ], + "redemptionFee": "839040000000000060397" + }, + { + "mAssetQty": "3496000000000000117440512", + "bAssetQtys": [ + "1935564801835984658177411", + "176040374944377670619260", + "1405685031898511983944130" + ], + "redemptionFee": "1048800000000000035232" + }, + { + "mAssetQty": "4195200000000000033554432", + "bAssetQtys": [ + "2322677762203181530365042", + "211248449933253199336307", + "1686822038278214337559535" + ], + "redemptionFee": "1258560000000000010066" + }, + { + "mAssetQty": "4894399999999999949668352", + "bAssetQtys": [ + "2709790722570378402552673", + "246456524922128728053354", + "1967959044657916691174940" + ], + "redemptionFee": "1468319999999999984900" + }, + { + "mAssetQty": "5593600000000000402653184", + "bAssetQtys": [ + "3096903682937575571979561", + "281664599911004283804427", + "2249096051037619260657451" + ], + "redemptionFee": "1678080000000000120795" + }, + { + "mAssetQty": "6292799999999999781896192", + "bAssetQtys": [ + "3484016643304772146927935", + "316872674899879785487448", + "2530233057417321398405750" + ], + "redemptionFee": "1887839999999999934568" + }, + { + "mAssetQty": "6992000000000000234881024", + "bAssetQtys": [ + "3871129603671969316354823", + "352080749888755341238521", + "2811370063797023967888261" + ], + "redemptionFee": "2097600000000000070464" + } + ] + }, + { + "reserve0": "2007000000000000000000000", + "reserve1": "500500000000000000000000", + "reserve2": "7492500000000000000000000", + "A": 120, + "mAssetSupply": "9896372713490403790662354", + "hardMin": 50000000000000000, + "hardMax": 750000000000000000, + "redemptionFeeRate": 300000000000000, + "redeems": [ + { + "mAssetQty": "10000000000000", + "bAssetQtys": [ + "2027407372464", + "505589132993", + "7568684473442" + ], + "redemptionFee": "3000000000" + }, + { + "mAssetQty": "1000000000000000", + "bAssetQtys": [ + "202740737246580", + "50558913299408", + "756868447344301" + ], + "redemptionFee": "300000000000" + }, + { + "mAssetQty": "100000000000000000", + "bAssetQtys": [ + "20274073724658181", + "5055891329940916", + "75686844734430211" + ], + "redemptionFee": "30000000000000" + }, + { + "mAssetQty": "1000000000000000000", + "bAssetQtys": [ + "202740737246581828", + "50558913299409169", + "756868447344302121" + ], + "redemptionFee": "300000000000000" + }, + { + "mAssetQty": "10000000000000000000", + "bAssetQtys": [ + "2027407372465818297", + "505589132994091707", + "7568684473443021227" + ], + "redemptionFee": "3000000000000000" + }, + { + "mAssetQty": "100000000000000000000", + "bAssetQtys": [ + "20274073724658182988", + "5055891329940917082", + "75686844734430212281" + ], + "redemptionFee": "30000000000000000" + }, + { + "mAssetQty": "699200000000000050331648", + "bAssetQtys": [ + "141756323482810025669551", + "35350792178946894792032", + "529202418383136082376241" + ], + "redemptionFee": "209760000000000015099" + }, + { + "mAssetQty": "1398400000000000100663296", + "bAssetQtys": [ + "283512646965620051339103", + "70701584357893789584065", + "1058404836766272164752484" + ], + "redemptionFee": "419520000000000030198" + }, + { + "mAssetQty": "2097600000000000016777216", + "bAssetQtys": [ + "425268970448430049797253", + "106052376536840677590196", + "1587607255149408145543562" + ], + "redemptionFee": "629280000000000005033" + }, + { + "mAssetQty": "2796800000000000201326592", + "bAssetQtys": [ + "567025293931240102678207", + "141403168715787579168132", + "2116809673532544329504969" + ], + "redemptionFee": "839040000000000060397" + }, + { + "mAssetQty": "3496000000000000117440512", + "bAssetQtys": [ + "708781617414050101136357", + "176753960894734467174262", + "2646012091915680310296047" + ], + "redemptionFee": "1048800000000000035232" + }, + { + "mAssetQty": "4195200000000000033554432", + "bAssetQtys": [ + "850537940896860099594508", + "212104753073681355180393", + "3175214510298816291087126" + ], + "redemptionFee": "1258560000000000010066" + }, + { + "mAssetQty": "4894399999999999949668352", + "bAssetQtys": [ + "992294264379670098052659", + "247455545252628243186524", + "3704416928681952271878205" + ], + "redemptionFee": "1468319999999999984900" + }, + { + "mAssetQty": "5593600000000000402653184", + "bAssetQtys": [ + "1134050587862480205356415", + "282806337431575158336265", + "4233619347065088659009938" + ], + "redemptionFee": "1678080000000000120795" + }, + { + "mAssetQty": "6292799999999999781896192", + "bAssetQtys": [ + "1275806911345290094968961", + "318157129610522019198786", + "4762821765448224233460363" + ], + "redemptionFee": "1887839999999999934568" + }, + { + "mAssetQty": "6992000000000000234881024", + "bAssetQtys": [ + "1417563234828100202272716", + "353507921789468934348526", + "5292024183831360620592095" + ], + "redemptionFee": "2097600000000000070464" + }, + { + "mAssetQty": "10000000000000", + "bAssetQtys": [ + "2027407372464", + "505589132993", + "7568684473442" + ], + "redemptionFee": "3000000000" + }, + { + "mAssetQty": "1000000000000000", + "bAssetQtys": [ + "202740737246580", + "50558913299408", + "756868447344301" + ], + "redemptionFee": "300000000000" + }, + { + "mAssetQty": "100000000000000000", + "bAssetQtys": [ + "20274073724658181", + "5055891329940916", + "75686844734430211" + ], + "redemptionFee": "30000000000000" + }, + { + "mAssetQty": "1000000000000000000", + "bAssetQtys": [ + "202740737246581828", + "50558913299409169", + "756868447344302121" + ], + "redemptionFee": "300000000000000" + }, + { + "mAssetQty": "10000000000000000000", + "bAssetQtys": [ + "2027407372465818297", + "505589132994091707", + "7568684473443021227" + ], + "redemptionFee": "3000000000000000" + }, + { + "mAssetQty": "100000000000000000000", + "bAssetQtys": [ + "20274073724658182988", + "5055891329940917082", + "75686844734430212281" + ], + "redemptionFee": "30000000000000000" + }, + { + "mAssetQty": "699200000000000050331648", + "bAssetQtys": [ + "141756323482810025669551", + "35350792178946894792032", + "529202418383136082376241" + ], + "redemptionFee": "209760000000000015099" + }, + { + "mAssetQty": "1398400000000000100663296", + "bAssetQtys": [ + "283512646965620051339103", + "70701584357893789584065", + "1058404836766272164752484" + ], + "redemptionFee": "419520000000000030198" + }, + { + "mAssetQty": "2097600000000000016777216", + "bAssetQtys": [ + "425268970448430049797253", + "106052376536840677590196", + "1587607255149408145543562" + ], + "redemptionFee": "629280000000000005033" + }, + { + "mAssetQty": "2796800000000000201326592", + "bAssetQtys": [ + "567025293931240102678207", + "141403168715787579168132", + "2116809673532544329504969" + ], + "redemptionFee": "839040000000000060397" + }, + { + "mAssetQty": "3496000000000000117440512", + "bAssetQtys": [ + "708781617414050101136357", + "176753960894734467174262", + "2646012091915680310296047" + ], + "redemptionFee": "1048800000000000035232" + }, + { + "mAssetQty": "4195200000000000033554432", + "bAssetQtys": [ + "850537940896860099594508", + "212104753073681355180393", + "3175214510298816291087126" + ], + "redemptionFee": "1258560000000000010066" + }, + { + "mAssetQty": "4894399999999999949668352", + "bAssetQtys": [ + "992294264379670098052659", + "247455545252628243186524", + "3704416928681952271878205" + ], + "redemptionFee": "1468319999999999984900" + }, + { + "mAssetQty": "5593600000000000402653184", + "bAssetQtys": [ + "1134050587862480205356415", + "282806337431575158336265", + "4233619347065088659009938" + ], + "redemptionFee": "1678080000000000120795" + }, + { + "mAssetQty": "6292799999999999781896192", + "bAssetQtys": [ + "1275806911345290094968961", + "318157129610522019198786", + "4762821765448224233460363" + ], + "redemptionFee": "1887839999999999934568" + }, + { + "mAssetQty": "6992000000000000234881024", + "bAssetQtys": [ + "1417563234828100202272716", + "353507921789468934348526", + "5292024183831360620592095" + ], + "redemptionFee": "2097600000000000070464" + }, + { + "mAssetQty": "10000000000000", + "bAssetQtys": [ + "2027407372464", + "505589132993", + "7568684473442" + ], + "redemptionFee": "3000000000" + }, + { + "mAssetQty": "1000000000000000", + "bAssetQtys": [ + "202740737246580", + "50558913299408", + "756868447344301" + ], + "redemptionFee": "300000000000" + }, + { + "mAssetQty": "100000000000000000", + "bAssetQtys": [ + "20274073724658181", + "5055891329940916", + "75686844734430211" + ], + "redemptionFee": "30000000000000" + }, + { + "mAssetQty": "1000000000000000000", + "bAssetQtys": [ + "202740737246581828", + "50558913299409169", + "756868447344302121" + ], + "redemptionFee": "300000000000000" + }, + { + "mAssetQty": "10000000000000000000", + "bAssetQtys": [ + "2027407372465818297", + "505589132994091707", + "7568684473443021227" + ], + "redemptionFee": "3000000000000000" + }, + { + "mAssetQty": "100000000000000000000", + "bAssetQtys": [ + "20274073724658182988", + "5055891329940917082", + "75686844734430212281" + ], + "redemptionFee": "30000000000000000" + }, + { + "mAssetQty": "699200000000000050331648", + "bAssetQtys": [ + "141756323482810025669551", + "35350792178946894792032", + "529202418383136082376241" + ], + "redemptionFee": "209760000000000015099" + }, + { + "mAssetQty": "1398400000000000100663296", + "bAssetQtys": [ + "283512646965620051339103", + "70701584357893789584065", + "1058404836766272164752484" + ], + "redemptionFee": "419520000000000030198" + }, + { + "mAssetQty": "2097600000000000016777216", + "bAssetQtys": [ + "425268970448430049797253", + "106052376536840677590196", + "1587607255149408145543562" + ], + "redemptionFee": "629280000000000005033" + }, + { + "mAssetQty": "2796800000000000201326592", + "bAssetQtys": [ + "567025293931240102678207", + "141403168715787579168132", + "2116809673532544329504969" + ], + "redemptionFee": "839040000000000060397" + }, + { + "mAssetQty": "3496000000000000117440512", + "bAssetQtys": [ + "708781617414050101136357", + "176753960894734467174262", + "2646012091915680310296047" + ], + "redemptionFee": "1048800000000000035232" + }, + { + "mAssetQty": "4195200000000000033554432", + "bAssetQtys": [ + "850537940896860099594508", + "212104753073681355180393", + "3175214510298816291087126" + ], + "redemptionFee": "1258560000000000010066" + }, + { + "mAssetQty": "4894399999999999949668352", + "bAssetQtys": [ + "992294264379670098052659", + "247455545252628243186524", + "3704416928681952271878205" + ], + "redemptionFee": "1468319999999999984900" + }, + { + "mAssetQty": "5593600000000000402653184", + "bAssetQtys": [ + "1134050587862480205356415", + "282806337431575158336265", + "4233619347065088659009938" + ], + "redemptionFee": "1678080000000000120795" + }, + { + "mAssetQty": "6292799999999999781896192", + "bAssetQtys": [ + "1275806911345290094968961", + "318157129610522019198786", + "4762821765448224233460363" + ], + "redemptionFee": "1887839999999999934568" + }, + { + "mAssetQty": "6992000000000000234881024", + "bAssetQtys": [ + "1417563234828100202272716", + "353507921789468934348526", + "5292024183831360620592095" + ], + "redemptionFee": "2097600000000000070464" + } + ] + }, + { + "reserve0": "5503000000000000000000000", + "reserve1": "3996499999999999360000000", + "reserve2": "500500000000000000000000", + "A": 120, + "mAssetSupply": "9936488013915504712820075", + "hardMin": 50000000000000000, + "hardMax": 750000000000000000, + "redemptionFeeRate": 300000000000000, + "redeems": [ + { + "mAssetQty": "10000000000000", + "bAssetQtys": [ + "5536512591063", + "4020838191928", + "503547983249" + ], + "redemptionFee": "3000000000" + }, + { + "mAssetQty": "1000000000000000", + "bAssetQtys": [ + "553651259106401", + "402083819192937", + "50354798325049" + ], + "redemptionFee": "300000000000" + }, + { + "mAssetQty": "100000000000000000", + "bAssetQtys": [ + "55365125910640290", + "40208381919293818", + "5035479832505080" + ], + "redemptionFee": "30000000000000" + }, + { + "mAssetQty": "1000000000000000000", + "bAssetQtys": [ + "553651259106402914", + "402083819192938196", + "50354798325050818" + ], + "redemptionFee": "300000000000000" + }, + { + "mAssetQty": "10000000000000000000", + "bAssetQtys": [ + "5536512591064029155", + "4020838191929381969", + "503547983250508193" + ], + "redemptionFee": "3000000000000000" + }, + { + "mAssetQty": "100000000000000000000", + "bAssetQtys": [ + "55365125910640291565", + "40208381919293819699", + "5035479832505081941" + ], + "redemptionFee": "30000000000000000" + }, + { + "mAssetQty": "699200000000000050331648", + "bAssetQtys": [ + "387112960367196946497444", + "281137006379702407582180", + "35208074988875535475552" + ], + "redemptionFee": "209760000000000015099" + }, + { + "mAssetQty": "1398400000000000100663296", + "bAssetQtys": [ + "774225920734393892994889", + "562274012759404815164362", + "70416149977751070951106" + ], + "redemptionFee": "419520000000000030198" + }, + { + "mAssetQty": "2097600000000000016777216", + "bAssetQtys": [ + "1161338881101590765182520", + "843411019139107168779767", + "105624224966626599668153" + ], + "redemptionFee": "629280000000000005033" + }, + { + "mAssetQty": "2796800000000000201326592", + "bAssetQtys": [ + "1548451841468787785989780", + "1124548025518809630328725", + "140832299955502141902213" + ], + "redemptionFee": "839040000000000060397" + }, + { + "mAssetQty": "3496000000000000117440512", + "bAssetQtys": [ + "1935564801835984658177411", + "1405685031898511983944130", + "176040374944377670619260" + ], + "redemptionFee": "1048800000000000035232" + }, + { + "mAssetQty": "4195200000000000033554432", + "bAssetQtys": [ + "2322677762203181530365042", + "1686822038278214337559535", + "211248449933253199336307" + ], + "redemptionFee": "1258560000000000010066" + }, + { + "mAssetQty": "4894399999999999949668352", + "bAssetQtys": [ + "2709790722570378402552673", + "1967959044657916691174940", + "246456524922128728053354" + ], + "redemptionFee": "1468319999999999984900" + }, + { + "mAssetQty": "5593600000000000402653184", + "bAssetQtys": [ + "3096903682937575571979561", + "2249096051037619260657451", + "281664599911004283804427" + ], + "redemptionFee": "1678080000000000120795" + }, + { + "mAssetQty": "6292799999999999781896192", + "bAssetQtys": [ + "3484016643304772146927935", + "2530233057417321398405750", + "316872674899879785487448" + ], + "redemptionFee": "1887839999999999934568" + }, + { + "mAssetQty": "6992000000000000234881024", + "bAssetQtys": [ + "3871129603671969316354823", + "2811370063797023967888261", + "352080749888755341238521" + ], + "redemptionFee": "2097600000000000070464" + }, + { + "mAssetQty": "10000000000000", + "bAssetQtys": [ + "5536512591063", + "4020838191928", + "503547983249" + ], + "redemptionFee": "3000000000" + }, + { + "mAssetQty": "1000000000000000", + "bAssetQtys": [ + "553651259106401", + "402083819192937", + "50354798325049" + ], + "redemptionFee": "300000000000" + }, + { + "mAssetQty": "100000000000000000", + "bAssetQtys": [ + "55365125910640290", + "40208381919293818", + "5035479832505080" + ], + "redemptionFee": "30000000000000" + }, + { + "mAssetQty": "1000000000000000000", + "bAssetQtys": [ + "553651259106402914", + "402083819192938196", + "50354798325050818" + ], + "redemptionFee": "300000000000000" + }, + { + "mAssetQty": "10000000000000000000", + "bAssetQtys": [ + "5536512591064029155", + "4020838191929381969", + "503547983250508193" + ], + "redemptionFee": "3000000000000000" + }, + { + "mAssetQty": "100000000000000000000", + "bAssetQtys": [ + "55365125910640291565", + "40208381919293819699", + "5035479832505081941" + ], + "redemptionFee": "30000000000000000" + }, + { + "mAssetQty": "699200000000000050331648", + "bAssetQtys": [ + "387112960367196946497444", + "281137006379702407582180", + "35208074988875535475552" + ], + "redemptionFee": "209760000000000015099" + }, + { + "mAssetQty": "1398400000000000100663296", + "bAssetQtys": [ + "774225920734393892994889", + "562274012759404815164362", + "70416149977751070951106" + ], + "redemptionFee": "419520000000000030198" + }, + { + "mAssetQty": "2097600000000000016777216", + "bAssetQtys": [ + "1161338881101590765182520", + "843411019139107168779767", + "105624224966626599668153" + ], + "redemptionFee": "629280000000000005033" + }, + { + "mAssetQty": "2796800000000000201326592", + "bAssetQtys": [ + "1548451841468787785989780", + "1124548025518809630328725", + "140832299955502141902213" + ], + "redemptionFee": "839040000000000060397" + }, + { + "mAssetQty": "3496000000000000117440512", + "bAssetQtys": [ + "1935564801835984658177411", + "1405685031898511983944130", + "176040374944377670619260" + ], + "redemptionFee": "1048800000000000035232" + }, + { + "mAssetQty": "4195200000000000033554432", + "bAssetQtys": [ + "2322677762203181530365042", + "1686822038278214337559535", + "211248449933253199336307" + ], + "redemptionFee": "1258560000000000010066" + }, + { + "mAssetQty": "4894399999999999949668352", + "bAssetQtys": [ + "2709790722570378402552673", + "1967959044657916691174940", + "246456524922128728053354" + ], + "redemptionFee": "1468319999999999984900" + }, + { + "mAssetQty": "5593600000000000402653184", + "bAssetQtys": [ + "3096903682937575571979561", + "2249096051037619260657451", + "281664599911004283804427" + ], + "redemptionFee": "1678080000000000120795" + }, + { + "mAssetQty": "6292799999999999781896192", + "bAssetQtys": [ + "3484016643304772146927935", + "2530233057417321398405750", + "316872674899879785487448" + ], + "redemptionFee": "1887839999999999934568" + }, + { + "mAssetQty": "6992000000000000234881024", + "bAssetQtys": [ + "3871129603671969316354823", + "2811370063797023967888261", + "352080749888755341238521" + ], + "redemptionFee": "2097600000000000070464" + }, + { + "mAssetQty": "10000000000000", + "bAssetQtys": [ + "5536512591063", + "4020838191928", + "503547983249" + ], + "redemptionFee": "3000000000" + }, + { + "mAssetQty": "1000000000000000", + "bAssetQtys": [ + "553651259106401", + "402083819192937", + "50354798325049" + ], + "redemptionFee": "300000000000" + }, + { + "mAssetQty": "100000000000000000", + "bAssetQtys": [ + "55365125910640290", + "40208381919293818", + "5035479832505080" + ], + "redemptionFee": "30000000000000" + }, + { + "mAssetQty": "1000000000000000000", + "bAssetQtys": [ + "553651259106402914", + "402083819192938196", + "50354798325050818" + ], + "redemptionFee": "300000000000000" + }, + { + "mAssetQty": "10000000000000000000", + "bAssetQtys": [ + "5536512591064029155", + "4020838191929381969", + "503547983250508193" + ], + "redemptionFee": "3000000000000000" + }, + { + "mAssetQty": "100000000000000000000", + "bAssetQtys": [ + "55365125910640291565", + "40208381919293819699", + "5035479832505081941" + ], + "redemptionFee": "30000000000000000" + }, + { + "mAssetQty": "699200000000000050331648", + "bAssetQtys": [ + "387112960367196946497444", + "281137006379702407582180", + "35208074988875535475552" + ], + "redemptionFee": "209760000000000015099" + }, + { + "mAssetQty": "1398400000000000100663296", + "bAssetQtys": [ + "774225920734393892994889", + "562274012759404815164362", + "70416149977751070951106" + ], + "redemptionFee": "419520000000000030198" + }, + { + "mAssetQty": "2097600000000000016777216", + "bAssetQtys": [ + "1161338881101590765182520", + "843411019139107168779767", + "105624224966626599668153" + ], + "redemptionFee": "629280000000000005033" + }, + { + "mAssetQty": "2796800000000000201326592", + "bAssetQtys": [ + "1548451841468787785989780", + "1124548025518809630328725", + "140832299955502141902213" + ], + "redemptionFee": "839040000000000060397" + }, + { + "mAssetQty": "3496000000000000117440512", + "bAssetQtys": [ + "1935564801835984658177411", + "1405685031898511983944130", + "176040374944377670619260" + ], + "redemptionFee": "1048800000000000035232" + }, + { + "mAssetQty": "4195200000000000033554432", + "bAssetQtys": [ + "2322677762203181530365042", + "1686822038278214337559535", + "211248449933253199336307" + ], + "redemptionFee": "1258560000000000010066" + }, + { + "mAssetQty": "4894399999999999949668352", + "bAssetQtys": [ + "2709790722570378402552673", + "1967959044657916691174940", + "246456524922128728053354" + ], + "redemptionFee": "1468319999999999984900" + }, + { + "mAssetQty": "5593600000000000402653184", + "bAssetQtys": [ + "3096903682937575571979561", + "2249096051037619260657451", + "281664599911004283804427" + ], + "redemptionFee": "1678080000000000120795" + }, + { + "mAssetQty": "6292799999999999781896192", + "bAssetQtys": [ + "3484016643304772146927935", + "2530233057417321398405750", + "316872674899879785487448" + ], + "redemptionFee": "1887839999999999934568" + }, + { + "mAssetQty": "6992000000000000234881024", + "bAssetQtys": [ + "3871129603671969316354823", + "2811370063797023967888261", + "352080749888755341238521" + ], + "redemptionFee": "2097600000000000070464" + } + ] + }, + { + "reserve0": "2007000000000000960000000", + "reserve1": "3996499999999999360000000", + "reserve2": "3996499999999999360000000", + "A": 120, + "mAssetSupply": "9995726520619110731126433", + "hardMin": 50000000000000000, + "hardMax": 750000000000000000, + "redemptionFeeRate": 300000000000000, + "redeems": [ + { + "mAssetQty": "10000000000000", + "bAssetQtys": [ + "2007255696582", + "3997009163623", + "3997009163623" + ], + "redemptionFee": "3000000000" + }, + { + "mAssetQty": "1000000000000000", + "bAssetQtys": [ + "200725569658314", + "399700916362458", + "399700916362458" + ], + "redemptionFee": "300000000000" + }, + { + "mAssetQty": "100000000000000000", + "bAssetQtys": [ + "20072556965831529", + "39970091636245967", + "39970091636245967" + ], + "redemptionFee": "30000000000000" + }, + { + "mAssetQty": "1000000000000000000", + "bAssetQtys": [ + "200725569658315301", + "399700916362459686", + "399700916362459686" + ], + "redemptionFee": "300000000000000" + }, + { + "mAssetQty": "10000000000000000000", + "bAssetQtys": [ + "2007255696583153021", + "3997009163624596876", + "3997009163624596876" + ], + "redemptionFee": "3000000000000000" + }, + { + "mAssetQty": "100000000000000000000", + "bAssetQtys": [ + "20072556965831530227", + "39970091636245968777", + "39970091636245968777" + ], + "redemptionFee": "30000000000000000" + }, + { + "mAssetQty": "699200000000000050331648", + "bAssetQtys": [ + "140347318305094069457237", + "279470880720631833817400", + "279470880720631833817400" + ], + "redemptionFee": "209760000000000015099" + }, + { + "mAssetQty": "1398400000000000100663296", + "bAssetQtys": [ + "280694636610188138914476", + "558941761441263667634802", + "558941761441263667634802" + ], + "redemptionFee": "419520000000000030198" + }, + { + "mAssetQty": "2097600000000000016777216", + "bAssetQtys": [ + "421041954915282181430785", + "838412642161895447805254", + "838412642161895447805254" + ], + "redemptionFee": "629280000000000005033" + }, + { + "mAssetQty": "2796800000000000201326592", + "bAssetQtys": [ + "561389273220376277828953", + "1117883522882527335269605", + "1117883522882527335269605" + ], + "redemptionFee": "839040000000000060397" + }, + { + "mAssetQty": "3496000000000000117440512", + "bAssetQtys": [ + "701736591525470320345262", + "1397354403603159115440058", + "1397354403603159115440058" + ], + "redemptionFee": "1048800000000000035232" + }, + { + "mAssetQty": "4195200000000000033554432", + "bAssetQtys": [ + "842083909830564362861571", + "1676825284323790895610510", + "1676825284323790895610510" + ], + "redemptionFee": "1258560000000000010066" + }, + { + "mAssetQty": "4894399999999999949668352", + "bAssetQtys": [ + "982431228135658405377879", + "1956296165044422675780963", + "1956296165044422675780963" + ], + "redemptionFee": "1468319999999999984900" + }, + { + "mAssetQty": "5593600000000000402653184", + "bAssetQtys": [ + "1122778546440752555657908", + "2235767045765054670539212", + "2235767045765054670539212" + ], + "redemptionFee": "1678080000000000120795" + }, + { + "mAssetQty": "6292799999999999781896192", + "bAssetQtys": [ + "1263125864745846490410497", + "2515237926485686236121869", + "2515237926485686236121869" + ], + "redemptionFee": "1887839999999999934568" + }, + { + "mAssetQty": "6992000000000000234881024", + "bAssetQtys": [ + "1403473183050940640690525", + "2794708807206318230880117", + "2794708807206318230880117" + ], + "redemptionFee": "2097600000000000070464" + }, + { + "mAssetQty": "10000000000000", + "bAssetQtys": [ + "2007255696582", + "3997009163623", + "3997009163623" + ], + "redemptionFee": "3000000000" + }, + { + "mAssetQty": "1000000000000000", + "bAssetQtys": [ + "200725569658314", + "399700916362458", + "399700916362458" + ], + "redemptionFee": "300000000000" + }, + { + "mAssetQty": "100000000000000000", + "bAssetQtys": [ + "20072556965831529", + "39970091636245967", + "39970091636245967" + ], + "redemptionFee": "30000000000000" + }, + { + "mAssetQty": "1000000000000000000", + "bAssetQtys": [ + "200725569658315301", + "399700916362459686", + "399700916362459686" + ], + "redemptionFee": "300000000000000" + }, + { + "mAssetQty": "10000000000000000000", + "bAssetQtys": [ + "2007255696583153021", + "3997009163624596876", + "3997009163624596876" + ], + "redemptionFee": "3000000000000000" + }, + { + "mAssetQty": "100000000000000000000", + "bAssetQtys": [ + "20072556965831530227", + "39970091636245968777", + "39970091636245968777" + ], + "redemptionFee": "30000000000000000" + }, + { + "mAssetQty": "699200000000000050331648", + "bAssetQtys": [ + "140347318305094069457237", + "279470880720631833817400", + "279470880720631833817400" + ], + "redemptionFee": "209760000000000015099" + }, + { + "mAssetQty": "1398400000000000100663296", + "bAssetQtys": [ + "280694636610188138914476", + "558941761441263667634802", + "558941761441263667634802" + ], + "redemptionFee": "419520000000000030198" + }, + { + "mAssetQty": "2097600000000000016777216", + "bAssetQtys": [ + "421041954915282181430785", + "838412642161895447805254", + "838412642161895447805254" + ], + "redemptionFee": "629280000000000005033" + }, + { + "mAssetQty": "2796800000000000201326592", + "bAssetQtys": [ + "561389273220376277828953", + "1117883522882527335269605", + "1117883522882527335269605" + ], + "redemptionFee": "839040000000000060397" + }, + { + "mAssetQty": "3496000000000000117440512", + "bAssetQtys": [ + "701736591525470320345262", + "1397354403603159115440058", + "1397354403603159115440058" + ], + "redemptionFee": "1048800000000000035232" + }, + { + "mAssetQty": "4195200000000000033554432", + "bAssetQtys": [ + "842083909830564362861571", + "1676825284323790895610510", + "1676825284323790895610510" + ], + "redemptionFee": "1258560000000000010066" + }, + { + "mAssetQty": "4894399999999999949668352", + "bAssetQtys": [ + "982431228135658405377879", + "1956296165044422675780963", + "1956296165044422675780963" + ], + "redemptionFee": "1468319999999999984900" + }, + { + "mAssetQty": "5593600000000000402653184", + "bAssetQtys": [ + "1122778546440752555657908", + "2235767045765054670539212", + "2235767045765054670539212" + ], + "redemptionFee": "1678080000000000120795" + }, + { + "mAssetQty": "6292799999999999781896192", + "bAssetQtys": [ + "1263125864745846490410497", + "2515237926485686236121869", + "2515237926485686236121869" + ], + "redemptionFee": "1887839999999999934568" + }, + { + "mAssetQty": "6992000000000000234881024", + "bAssetQtys": [ + "1403473183050940640690525", + "2794708807206318230880117", + "2794708807206318230880117" + ], + "redemptionFee": "2097600000000000070464" + }, + { + "mAssetQty": "10000000000000", + "bAssetQtys": [ + "2007255696582", + "3997009163623", + "3997009163623" + ], + "redemptionFee": "3000000000" + }, + { + "mAssetQty": "1000000000000000", + "bAssetQtys": [ + "200725569658314", + "399700916362458", + "399700916362458" + ], + "redemptionFee": "300000000000" + }, + { + "mAssetQty": "100000000000000000", + "bAssetQtys": [ + "20072556965831529", + "39970091636245967", + "39970091636245967" + ], + "redemptionFee": "30000000000000" + }, + { + "mAssetQty": "1000000000000000000", + "bAssetQtys": [ + "200725569658315301", + "399700916362459686", + "399700916362459686" + ], + "redemptionFee": "300000000000000" + }, + { + "mAssetQty": "10000000000000000000", + "bAssetQtys": [ + "2007255696583153021", + "3997009163624596876", + "3997009163624596876" + ], + "redemptionFee": "3000000000000000" + }, + { + "mAssetQty": "100000000000000000000", + "bAssetQtys": [ + "20072556965831530227", + "39970091636245968777", + "39970091636245968777" + ], + "redemptionFee": "30000000000000000" + }, + { + "mAssetQty": "699200000000000050331648", + "bAssetQtys": [ + "140347318305094069457237", + "279470880720631833817400", + "279470880720631833817400" + ], + "redemptionFee": "209760000000000015099" + }, + { + "mAssetQty": "1398400000000000100663296", + "bAssetQtys": [ + "280694636610188138914476", + "558941761441263667634802", + "558941761441263667634802" + ], + "redemptionFee": "419520000000000030198" + }, + { + "mAssetQty": "2097600000000000016777216", + "bAssetQtys": [ + "421041954915282181430785", + "838412642161895447805254", + "838412642161895447805254" + ], + "redemptionFee": "629280000000000005033" + }, + { + "mAssetQty": "2796800000000000201326592", + "bAssetQtys": [ + "561389273220376277828953", + "1117883522882527335269605", + "1117883522882527335269605" + ], + "redemptionFee": "839040000000000060397" + }, + { + "mAssetQty": "3496000000000000117440512", + "bAssetQtys": [ + "701736591525470320345262", + "1397354403603159115440058", + "1397354403603159115440058" + ], + "redemptionFee": "1048800000000000035232" + }, + { + "mAssetQty": "4195200000000000033554432", + "bAssetQtys": [ + "842083909830564362861571", + "1676825284323790895610510", + "1676825284323790895610510" + ], + "redemptionFee": "1258560000000000010066" + }, + { + "mAssetQty": "4894399999999999949668352", + "bAssetQtys": [ + "982431228135658405377879", + "1956296165044422675780963", + "1956296165044422675780963" + ], + "redemptionFee": "1468319999999999984900" + }, + { + "mAssetQty": "5593600000000000402653184", + "bAssetQtys": [ + "1122778546440752555657908", + "2235767045765054670539212", + "2235767045765054670539212" + ], + "redemptionFee": "1678080000000000120795" + }, + { + "mAssetQty": "6292799999999999781896192", + "bAssetQtys": [ + "1263125864745846490410497", + "2515237926485686236121869", + "2515237926485686236121869" + ], + "redemptionFee": "1887839999999999934568" + }, + { + "mAssetQty": "6992000000000000234881024", + "bAssetQtys": [ + "1403473183050940640690525", + "2794708807206318230880117", + "2794708807206318230880117" + ], + "redemptionFee": "2097600000000000070464" + } + ] + }, + { + "reserve0": "2007000000000000000000000", + "reserve1": "7492500000000000000000000", + "reserve2": "500500000000000000000000", + "A": 120, + "mAssetSupply": "9896372713490403790662354", + "hardMin": 50000000000000000, + "hardMax": 750000000000000000, + "redemptionFeeRate": 300000000000000, + "redeems": [ + { + "mAssetQty": "10000000000000", + "bAssetQtys": [ + "2027407372464", + "7568684473442", + "505589132993" + ], + "redemptionFee": "3000000000" + }, + { + "mAssetQty": "1000000000000000", + "bAssetQtys": [ + "202740737246580", + "756868447344301", + "50558913299408" + ], + "redemptionFee": "300000000000" + }, + { + "mAssetQty": "100000000000000000", + "bAssetQtys": [ + "20274073724658181", + "75686844734430211", + "5055891329940916" + ], + "redemptionFee": "30000000000000" + }, + { + "mAssetQty": "1000000000000000000", + "bAssetQtys": [ + "202740737246581828", + "756868447344302121", + "50558913299409169" + ], + "redemptionFee": "300000000000000" + }, + { + "mAssetQty": "10000000000000000000", + "bAssetQtys": [ + "2027407372465818297", + "7568684473443021227", + "505589132994091707" + ], + "redemptionFee": "3000000000000000" + }, + { + "mAssetQty": "100000000000000000000", + "bAssetQtys": [ + "20274073724658182988", + "75686844734430212281", + "5055891329940917082" + ], + "redemptionFee": "30000000000000000" + }, + { + "mAssetQty": "699200000000000050331648", + "bAssetQtys": [ + "141756323482810025669551", + "529202418383136082376241", + "35350792178946894792032" + ], + "redemptionFee": "209760000000000015099" + }, + { + "mAssetQty": "1398400000000000100663296", + "bAssetQtys": [ + "283512646965620051339103", + "1058404836766272164752484", + "70701584357893789584065" + ], + "redemptionFee": "419520000000000030198" + }, + { + "mAssetQty": "2097600000000000016777216", + "bAssetQtys": [ + "425268970448430049797253", + "1587607255149408145543562", + "106052376536840677590196" + ], + "redemptionFee": "629280000000000005033" + }, + { + "mAssetQty": "2796800000000000201326592", + "bAssetQtys": [ + "567025293931240102678207", + "2116809673532544329504969", + "141403168715787579168132" + ], + "redemptionFee": "839040000000000060397" + }, + { + "mAssetQty": "3496000000000000117440512", + "bAssetQtys": [ + "708781617414050101136357", + "2646012091915680310296047", + "176753960894734467174262" + ], + "redemptionFee": "1048800000000000035232" + }, + { + "mAssetQty": "4195200000000000033554432", + "bAssetQtys": [ + "850537940896860099594508", + "3175214510298816291087126", + "212104753073681355180393" + ], + "redemptionFee": "1258560000000000010066" + }, + { + "mAssetQty": "4894399999999999949668352", + "bAssetQtys": [ + "992294264379670098052659", + "3704416928681952271878205", + "247455545252628243186524" + ], + "redemptionFee": "1468319999999999984900" + }, + { + "mAssetQty": "5593600000000000402653184", + "bAssetQtys": [ + "1134050587862480205356415", + "4233619347065088659009938", + "282806337431575158336265" + ], + "redemptionFee": "1678080000000000120795" + }, + { + "mAssetQty": "6292799999999999781896192", + "bAssetQtys": [ + "1275806911345290094968961", + "4762821765448224233460363", + "318157129610522019198786" + ], + "redemptionFee": "1887839999999999934568" + }, + { + "mAssetQty": "6992000000000000234881024", + "bAssetQtys": [ + "1417563234828100202272716", + "5292024183831360620592095", + "353507921789468934348526" + ], + "redemptionFee": "2097600000000000070464" + }, + { + "mAssetQty": "10000000000000", + "bAssetQtys": [ + "2027407372464", + "7568684473442", + "505589132993" + ], + "redemptionFee": "3000000000" + }, + { + "mAssetQty": "1000000000000000", + "bAssetQtys": [ + "202740737246580", + "756868447344301", + "50558913299408" + ], + "redemptionFee": "300000000000" + }, + { + "mAssetQty": "100000000000000000", + "bAssetQtys": [ + "20274073724658181", + "75686844734430211", + "5055891329940916" + ], + "redemptionFee": "30000000000000" + }, + { + "mAssetQty": "1000000000000000000", + "bAssetQtys": [ + "202740737246581828", + "756868447344302121", + "50558913299409169" + ], + "redemptionFee": "300000000000000" + }, + { + "mAssetQty": "10000000000000000000", + "bAssetQtys": [ + "2027407372465818297", + "7568684473443021227", + "505589132994091707" + ], + "redemptionFee": "3000000000000000" + }, + { + "mAssetQty": "100000000000000000000", + "bAssetQtys": [ + "20274073724658182988", + "75686844734430212281", + "5055891329940917082" + ], + "redemptionFee": "30000000000000000" + }, + { + "mAssetQty": "699200000000000050331648", + "bAssetQtys": [ + "141756323482810025669551", + "529202418383136082376241", + "35350792178946894792032" + ], + "redemptionFee": "209760000000000015099" + }, + { + "mAssetQty": "1398400000000000100663296", + "bAssetQtys": [ + "283512646965620051339103", + "1058404836766272164752484", + "70701584357893789584065" + ], + "redemptionFee": "419520000000000030198" + }, + { + "mAssetQty": "2097600000000000016777216", + "bAssetQtys": [ + "425268970448430049797253", + "1587607255149408145543562", + "106052376536840677590196" + ], + "redemptionFee": "629280000000000005033" + }, + { + "mAssetQty": "2796800000000000201326592", + "bAssetQtys": [ + "567025293931240102678207", + "2116809673532544329504969", + "141403168715787579168132" + ], + "redemptionFee": "839040000000000060397" + }, + { + "mAssetQty": "3496000000000000117440512", + "bAssetQtys": [ + "708781617414050101136357", + "2646012091915680310296047", + "176753960894734467174262" + ], + "redemptionFee": "1048800000000000035232" + }, + { + "mAssetQty": "4195200000000000033554432", + "bAssetQtys": [ + "850537940896860099594508", + "3175214510298816291087126", + "212104753073681355180393" + ], + "redemptionFee": "1258560000000000010066" + }, + { + "mAssetQty": "4894399999999999949668352", + "bAssetQtys": [ + "992294264379670098052659", + "3704416928681952271878205", + "247455545252628243186524" + ], + "redemptionFee": "1468319999999999984900" + }, + { + "mAssetQty": "5593600000000000402653184", + "bAssetQtys": [ + "1134050587862480205356415", + "4233619347065088659009938", + "282806337431575158336265" + ], + "redemptionFee": "1678080000000000120795" + }, + { + "mAssetQty": "6292799999999999781896192", + "bAssetQtys": [ + "1275806911345290094968961", + "4762821765448224233460363", + "318157129610522019198786" + ], + "redemptionFee": "1887839999999999934568" + }, + { + "mAssetQty": "6992000000000000234881024", + "bAssetQtys": [ + "1417563234828100202272716", + "5292024183831360620592095", + "353507921789468934348526" + ], + "redemptionFee": "2097600000000000070464" + }, + { + "mAssetQty": "10000000000000", + "bAssetQtys": [ + "2027407372464", + "7568684473442", + "505589132993" + ], + "redemptionFee": "3000000000" + }, + { + "mAssetQty": "1000000000000000", + "bAssetQtys": [ + "202740737246580", + "756868447344301", + "50558913299408" + ], + "redemptionFee": "300000000000" + }, + { + "mAssetQty": "100000000000000000", + "bAssetQtys": [ + "20274073724658181", + "75686844734430211", + "5055891329940916" + ], + "redemptionFee": "30000000000000" + }, + { + "mAssetQty": "1000000000000000000", + "bAssetQtys": [ + "202740737246581828", + "756868447344302121", + "50558913299409169" + ], + "redemptionFee": "300000000000000" + }, + { + "mAssetQty": "10000000000000000000", + "bAssetQtys": [ + "2027407372465818297", + "7568684473443021227", + "505589132994091707" + ], + "redemptionFee": "3000000000000000" + }, + { + "mAssetQty": "100000000000000000000", + "bAssetQtys": [ + "20274073724658182988", + "75686844734430212281", + "5055891329940917082" + ], + "redemptionFee": "30000000000000000" + }, + { + "mAssetQty": "699200000000000050331648", + "bAssetQtys": [ + "141756323482810025669551", + "529202418383136082376241", + "35350792178946894792032" + ], + "redemptionFee": "209760000000000015099" + }, + { + "mAssetQty": "1398400000000000100663296", + "bAssetQtys": [ + "283512646965620051339103", + "1058404836766272164752484", + "70701584357893789584065" + ], + "redemptionFee": "419520000000000030198" + }, + { + "mAssetQty": "2097600000000000016777216", + "bAssetQtys": [ + "425268970448430049797253", + "1587607255149408145543562", + "106052376536840677590196" + ], + "redemptionFee": "629280000000000005033" + }, + { + "mAssetQty": "2796800000000000201326592", + "bAssetQtys": [ + "567025293931240102678207", + "2116809673532544329504969", + "141403168715787579168132" + ], + "redemptionFee": "839040000000000060397" + }, + { + "mAssetQty": "3496000000000000117440512", + "bAssetQtys": [ + "708781617414050101136357", + "2646012091915680310296047", + "176753960894734467174262" + ], + "redemptionFee": "1048800000000000035232" + }, + { + "mAssetQty": "4195200000000000033554432", + "bAssetQtys": [ + "850537940896860099594508", + "3175214510298816291087126", + "212104753073681355180393" + ], + "redemptionFee": "1258560000000000010066" + }, + { + "mAssetQty": "4894399999999999949668352", + "bAssetQtys": [ + "992294264379670098052659", + "3704416928681952271878205", + "247455545252628243186524" + ], + "redemptionFee": "1468319999999999984900" + }, + { + "mAssetQty": "5593600000000000402653184", + "bAssetQtys": [ + "1134050587862480205356415", + "4233619347065088659009938", + "282806337431575158336265" + ], + "redemptionFee": "1678080000000000120795" + }, + { + "mAssetQty": "6292799999999999781896192", + "bAssetQtys": [ + "1275806911345290094968961", + "4762821765448224233460363", + "318157129610522019198786" + ], + "redemptionFee": "1887839999999999934568" + }, + { + "mAssetQty": "6992000000000000234881024", + "bAssetQtys": [ + "1417563234828100202272716", + "5292024183831360620592095", + "353507921789468934348526" + ], + "redemptionFee": "2097600000000000070464" + } + ] + }, + { + "reserve0": "500500000000000000000000", + "reserve1": "5503000000000000000000000", + "reserve2": "3996499999999999360000000", + "A": 120, + "mAssetSupply": "9936488013915504712820075", + "hardMin": 50000000000000000, + "hardMax": 750000000000000000, + "redemptionFeeRate": 300000000000000, + "redeems": [ + { + "mAssetQty": "10000000000000", + "bAssetQtys": [ + "503547983249", + "5536512591063", + "4020838191928" + ], + "redemptionFee": "3000000000" + }, + { + "mAssetQty": "1000000000000000", + "bAssetQtys": [ + "50354798325049", + "553651259106401", + "402083819192937" + ], + "redemptionFee": "300000000000" + }, + { + "mAssetQty": "100000000000000000", + "bAssetQtys": [ + "5035479832505080", + "55365125910640290", + "40208381919293818" + ], + "redemptionFee": "30000000000000" + }, + { + "mAssetQty": "1000000000000000000", + "bAssetQtys": [ + "50354798325050818", + "553651259106402914", + "402083819192938196" + ], + "redemptionFee": "300000000000000" + }, + { + "mAssetQty": "10000000000000000000", + "bAssetQtys": [ + "503547983250508193", + "5536512591064029155", + "4020838191929381969" + ], + "redemptionFee": "3000000000000000" + }, + { + "mAssetQty": "100000000000000000000", + "bAssetQtys": [ + "5035479832505081941", + "55365125910640291565", + "40208381919293819699" + ], + "redemptionFee": "30000000000000000" + }, + { + "mAssetQty": "699200000000000050331648", + "bAssetQtys": [ + "35208074988875535475552", + "387112960367196946497444", + "281137006379702407582180" + ], + "redemptionFee": "209760000000000015099" + }, + { + "mAssetQty": "1398400000000000100663296", + "bAssetQtys": [ + "70416149977751070951106", + "774225920734393892994889", + "562274012759404815164362" + ], + "redemptionFee": "419520000000000030198" + }, + { + "mAssetQty": "2097600000000000016777216", + "bAssetQtys": [ + "105624224966626599668153", + "1161338881101590765182520", + "843411019139107168779767" + ], + "redemptionFee": "629280000000000005033" + }, + { + "mAssetQty": "2796800000000000201326592", + "bAssetQtys": [ + "140832299955502141902213", + "1548451841468787785989780", + "1124548025518809630328725" + ], + "redemptionFee": "839040000000000060397" + }, + { + "mAssetQty": "3496000000000000117440512", + "bAssetQtys": [ + "176040374944377670619260", + "1935564801835984658177411", + "1405685031898511983944130" + ], + "redemptionFee": "1048800000000000035232" + }, + { + "mAssetQty": "4195200000000000033554432", + "bAssetQtys": [ + "211248449933253199336307", + "2322677762203181530365042", + "1686822038278214337559535" + ], + "redemptionFee": "1258560000000000010066" + }, + { + "mAssetQty": "4894399999999999949668352", + "bAssetQtys": [ + "246456524922128728053354", + "2709790722570378402552673", + "1967959044657916691174940" + ], + "redemptionFee": "1468319999999999984900" + }, + { + "mAssetQty": "5593600000000000402653184", + "bAssetQtys": [ + "281664599911004283804427", + "3096903682937575571979561", + "2249096051037619260657451" + ], + "redemptionFee": "1678080000000000120795" + }, + { + "mAssetQty": "6292799999999999781896192", + "bAssetQtys": [ + "316872674899879785487448", + "3484016643304772146927935", + "2530233057417321398405750" + ], + "redemptionFee": "1887839999999999934568" + }, + { + "mAssetQty": "6992000000000000234881024", + "bAssetQtys": [ + "352080749888755341238521", + "3871129603671969316354823", + "2811370063797023967888261" + ], + "redemptionFee": "2097600000000000070464" + }, + { + "mAssetQty": "10000000000000", + "bAssetQtys": [ + "503547983249", + "5536512591063", + "4020838191928" + ], + "redemptionFee": "3000000000" + }, + { + "mAssetQty": "1000000000000000", + "bAssetQtys": [ + "50354798325049", + "553651259106401", + "402083819192937" + ], + "redemptionFee": "300000000000" + }, + { + "mAssetQty": "100000000000000000", + "bAssetQtys": [ + "5035479832505080", + "55365125910640290", + "40208381919293818" + ], + "redemptionFee": "30000000000000" + }, + { + "mAssetQty": "1000000000000000000", + "bAssetQtys": [ + "50354798325050818", + "553651259106402914", + "402083819192938196" + ], + "redemptionFee": "300000000000000" + }, + { + "mAssetQty": "10000000000000000000", + "bAssetQtys": [ + "503547983250508193", + "5536512591064029155", + "4020838191929381969" + ], + "redemptionFee": "3000000000000000" + }, + { + "mAssetQty": "100000000000000000000", + "bAssetQtys": [ + "5035479832505081941", + "55365125910640291565", + "40208381919293819699" + ], + "redemptionFee": "30000000000000000" + }, + { + "mAssetQty": "699200000000000050331648", + "bAssetQtys": [ + "35208074988875535475552", + "387112960367196946497444", + "281137006379702407582180" + ], + "redemptionFee": "209760000000000015099" + }, + { + "mAssetQty": "1398400000000000100663296", + "bAssetQtys": [ + "70416149977751070951106", + "774225920734393892994889", + "562274012759404815164362" + ], + "redemptionFee": "419520000000000030198" + }, + { + "mAssetQty": "2097600000000000016777216", + "bAssetQtys": [ + "105624224966626599668153", + "1161338881101590765182520", + "843411019139107168779767" + ], + "redemptionFee": "629280000000000005033" + }, + { + "mAssetQty": "2796800000000000201326592", + "bAssetQtys": [ + "140832299955502141902213", + "1548451841468787785989780", + "1124548025518809630328725" + ], + "redemptionFee": "839040000000000060397" + }, + { + "mAssetQty": "3496000000000000117440512", + "bAssetQtys": [ + "176040374944377670619260", + "1935564801835984658177411", + "1405685031898511983944130" + ], + "redemptionFee": "1048800000000000035232" + }, + { + "mAssetQty": "4195200000000000033554432", + "bAssetQtys": [ + "211248449933253199336307", + "2322677762203181530365042", + "1686822038278214337559535" + ], + "redemptionFee": "1258560000000000010066" + }, + { + "mAssetQty": "4894399999999999949668352", + "bAssetQtys": [ + "246456524922128728053354", + "2709790722570378402552673", + "1967959044657916691174940" + ], + "redemptionFee": "1468319999999999984900" + }, + { + "mAssetQty": "5593600000000000402653184", + "bAssetQtys": [ + "281664599911004283804427", + "3096903682937575571979561", + "2249096051037619260657451" + ], + "redemptionFee": "1678080000000000120795" + }, + { + "mAssetQty": "6292799999999999781896192", + "bAssetQtys": [ + "316872674899879785487448", + "3484016643304772146927935", + "2530233057417321398405750" + ], + "redemptionFee": "1887839999999999934568" + }, + { + "mAssetQty": "6992000000000000234881024", + "bAssetQtys": [ + "352080749888755341238521", + "3871129603671969316354823", + "2811370063797023967888261" + ], + "redemptionFee": "2097600000000000070464" + }, + { + "mAssetQty": "10000000000000", + "bAssetQtys": [ + "503547983249", + "5536512591063", + "4020838191928" + ], + "redemptionFee": "3000000000" + }, + { + "mAssetQty": "1000000000000000", + "bAssetQtys": [ + "50354798325049", + "553651259106401", + "402083819192937" + ], + "redemptionFee": "300000000000" + }, + { + "mAssetQty": "100000000000000000", + "bAssetQtys": [ + "5035479832505080", + "55365125910640290", + "40208381919293818" + ], + "redemptionFee": "30000000000000" + }, + { + "mAssetQty": "1000000000000000000", + "bAssetQtys": [ + "50354798325050818", + "553651259106402914", + "402083819192938196" + ], + "redemptionFee": "300000000000000" + }, + { + "mAssetQty": "10000000000000000000", + "bAssetQtys": [ + "503547983250508193", + "5536512591064029155", + "4020838191929381969" + ], + "redemptionFee": "3000000000000000" + }, + { + "mAssetQty": "100000000000000000000", + "bAssetQtys": [ + "5035479832505081941", + "55365125910640291565", + "40208381919293819699" + ], + "redemptionFee": "30000000000000000" + }, + { + "mAssetQty": "699200000000000050331648", + "bAssetQtys": [ + "35208074988875535475552", + "387112960367196946497444", + "281137006379702407582180" + ], + "redemptionFee": "209760000000000015099" + }, + { + "mAssetQty": "1398400000000000100663296", + "bAssetQtys": [ + "70416149977751070951106", + "774225920734393892994889", + "562274012759404815164362" + ], + "redemptionFee": "419520000000000030198" + }, + { + "mAssetQty": "2097600000000000016777216", + "bAssetQtys": [ + "105624224966626599668153", + "1161338881101590765182520", + "843411019139107168779767" + ], + "redemptionFee": "629280000000000005033" + }, + { + "mAssetQty": "2796800000000000201326592", + "bAssetQtys": [ + "140832299955502141902213", + "1548451841468787785989780", + "1124548025518809630328725" + ], + "redemptionFee": "839040000000000060397" + }, + { + "mAssetQty": "3496000000000000117440512", + "bAssetQtys": [ + "176040374944377670619260", + "1935564801835984658177411", + "1405685031898511983944130" + ], + "redemptionFee": "1048800000000000035232" + }, + { + "mAssetQty": "4195200000000000033554432", + "bAssetQtys": [ + "211248449933253199336307", + "2322677762203181530365042", + "1686822038278214337559535" + ], + "redemptionFee": "1258560000000000010066" + }, + { + "mAssetQty": "4894399999999999949668352", + "bAssetQtys": [ + "246456524922128728053354", + "2709790722570378402552673", + "1967959044657916691174940" + ], + "redemptionFee": "1468319999999999984900" + }, + { + "mAssetQty": "5593600000000000402653184", + "bAssetQtys": [ + "281664599911004283804427", + "3096903682937575571979561", + "2249096051037619260657451" + ], + "redemptionFee": "1678080000000000120795" + }, + { + "mAssetQty": "6292799999999999781896192", + "bAssetQtys": [ + "316872674899879785487448", + "3484016643304772146927935", + "2530233057417321398405750" + ], + "redemptionFee": "1887839999999999934568" + }, + { + "mAssetQty": "6992000000000000234881024", + "bAssetQtys": [ + "352080749888755341238521", + "3871129603671969316354823", + "2811370063797023967888261" + ], + "redemptionFee": "2097600000000000070464" + } + ] + }, + { + "reserve0": "500500000000000000000000", + "reserve1": "2007000000000000000000000", + "reserve2": "7492500000000000000000000", + "A": 120, + "mAssetSupply": "9896372713490403790662354", + "hardMin": 50000000000000000, + "hardMax": 750000000000000000, + "redemptionFeeRate": 300000000000000, + "redeems": [ + { + "mAssetQty": "10000000000000", + "bAssetQtys": [ + "505589132993", + "2027407372464", + "7568684473442" + ], + "redemptionFee": "3000000000" + }, + { + "mAssetQty": "1000000000000000", + "bAssetQtys": [ + "50558913299408", + "202740737246580", + "756868447344301" + ], + "redemptionFee": "300000000000" + }, + { + "mAssetQty": "100000000000000000", + "bAssetQtys": [ + "5055891329940916", + "20274073724658181", + "75686844734430211" + ], + "redemptionFee": "30000000000000" + }, + { + "mAssetQty": "1000000000000000000", + "bAssetQtys": [ + "50558913299409169", + "202740737246581828", + "756868447344302121" + ], + "redemptionFee": "300000000000000" + }, + { + "mAssetQty": "10000000000000000000", + "bAssetQtys": [ + "505589132994091707", + "2027407372465818297", + "7568684473443021227" + ], + "redemptionFee": "3000000000000000" + }, + { + "mAssetQty": "100000000000000000000", + "bAssetQtys": [ + "5055891329940917082", + "20274073724658182988", + "75686844734430212281" + ], + "redemptionFee": "30000000000000000" + }, + { + "mAssetQty": "699200000000000050331648", + "bAssetQtys": [ + "35350792178946894792032", + "141756323482810025669551", + "529202418383136082376241" + ], + "redemptionFee": "209760000000000015099" + }, + { + "mAssetQty": "1398400000000000100663296", + "bAssetQtys": [ + "70701584357893789584065", + "283512646965620051339103", + "1058404836766272164752484" + ], + "redemptionFee": "419520000000000030198" + }, + { + "mAssetQty": "2097600000000000016777216", + "bAssetQtys": [ + "106052376536840677590196", + "425268970448430049797253", + "1587607255149408145543562" + ], + "redemptionFee": "629280000000000005033" + }, + { + "mAssetQty": "2796800000000000201326592", + "bAssetQtys": [ + "141403168715787579168132", + "567025293931240102678207", + "2116809673532544329504969" + ], + "redemptionFee": "839040000000000060397" + }, + { + "mAssetQty": "3496000000000000117440512", + "bAssetQtys": [ + "176753960894734467174262", + "708781617414050101136357", + "2646012091915680310296047" + ], + "redemptionFee": "1048800000000000035232" + }, + { + "mAssetQty": "4195200000000000033554432", + "bAssetQtys": [ + "212104753073681355180393", + "850537940896860099594508", + "3175214510298816291087126" + ], + "redemptionFee": "1258560000000000010066" + }, + { + "mAssetQty": "4894399999999999949668352", + "bAssetQtys": [ + "247455545252628243186524", + "992294264379670098052659", + "3704416928681952271878205" + ], + "redemptionFee": "1468319999999999984900" + }, + { + "mAssetQty": "5593600000000000402653184", + "bAssetQtys": [ + "282806337431575158336265", + "1134050587862480205356415", + "4233619347065088659009938" + ], + "redemptionFee": "1678080000000000120795" + }, + { + "mAssetQty": "6292799999999999781896192", + "bAssetQtys": [ + "318157129610522019198786", + "1275806911345290094968961", + "4762821765448224233460363" + ], + "redemptionFee": "1887839999999999934568" + }, + { + "mAssetQty": "6992000000000000234881024", + "bAssetQtys": [ + "353507921789468934348526", + "1417563234828100202272716", + "5292024183831360620592095" + ], + "redemptionFee": "2097600000000000070464" + }, + { + "mAssetQty": "10000000000000", + "bAssetQtys": [ + "505589132993", + "2027407372464", + "7568684473442" + ], + "redemptionFee": "3000000000" + }, + { + "mAssetQty": "1000000000000000", + "bAssetQtys": [ + "50558913299408", + "202740737246580", + "756868447344301" + ], + "redemptionFee": "300000000000" + }, + { + "mAssetQty": "100000000000000000", + "bAssetQtys": [ + "5055891329940916", + "20274073724658181", + "75686844734430211" + ], + "redemptionFee": "30000000000000" + }, + { + "mAssetQty": "1000000000000000000", + "bAssetQtys": [ + "50558913299409169", + "202740737246581828", + "756868447344302121" + ], + "redemptionFee": "300000000000000" + }, + { + "mAssetQty": "10000000000000000000", + "bAssetQtys": [ + "505589132994091707", + "2027407372465818297", + "7568684473443021227" + ], + "redemptionFee": "3000000000000000" + }, + { + "mAssetQty": "100000000000000000000", + "bAssetQtys": [ + "5055891329940917082", + "20274073724658182988", + "75686844734430212281" + ], + "redemptionFee": "30000000000000000" + }, + { + "mAssetQty": "699200000000000050331648", + "bAssetQtys": [ + "35350792178946894792032", + "141756323482810025669551", + "529202418383136082376241" + ], + "redemptionFee": "209760000000000015099" + }, + { + "mAssetQty": "1398400000000000100663296", + "bAssetQtys": [ + "70701584357893789584065", + "283512646965620051339103", + "1058404836766272164752484" + ], + "redemptionFee": "419520000000000030198" + }, + { + "mAssetQty": "2097600000000000016777216", + "bAssetQtys": [ + "106052376536840677590196", + "425268970448430049797253", + "1587607255149408145543562" + ], + "redemptionFee": "629280000000000005033" + }, + { + "mAssetQty": "2796800000000000201326592", + "bAssetQtys": [ + "141403168715787579168132", + "567025293931240102678207", + "2116809673532544329504969" + ], + "redemptionFee": "839040000000000060397" + }, + { + "mAssetQty": "3496000000000000117440512", + "bAssetQtys": [ + "176753960894734467174262", + "708781617414050101136357", + "2646012091915680310296047" + ], + "redemptionFee": "1048800000000000035232" + }, + { + "mAssetQty": "4195200000000000033554432", + "bAssetQtys": [ + "212104753073681355180393", + "850537940896860099594508", + "3175214510298816291087126" + ], + "redemptionFee": "1258560000000000010066" + }, + { + "mAssetQty": "4894399999999999949668352", + "bAssetQtys": [ + "247455545252628243186524", + "992294264379670098052659", + "3704416928681952271878205" + ], + "redemptionFee": "1468319999999999984900" + }, + { + "mAssetQty": "5593600000000000402653184", + "bAssetQtys": [ + "282806337431575158336265", + "1134050587862480205356415", + "4233619347065088659009938" + ], + "redemptionFee": "1678080000000000120795" + }, + { + "mAssetQty": "6292799999999999781896192", + "bAssetQtys": [ + "318157129610522019198786", + "1275806911345290094968961", + "4762821765448224233460363" + ], + "redemptionFee": "1887839999999999934568" + }, + { + "mAssetQty": "6992000000000000234881024", + "bAssetQtys": [ + "353507921789468934348526", + "1417563234828100202272716", + "5292024183831360620592095" + ], + "redemptionFee": "2097600000000000070464" + }, + { + "mAssetQty": "10000000000000", + "bAssetQtys": [ + "505589132993", + "2027407372464", + "7568684473442" + ], + "redemptionFee": "3000000000" + }, + { + "mAssetQty": "1000000000000000", + "bAssetQtys": [ + "50558913299408", + "202740737246580", + "756868447344301" + ], + "redemptionFee": "300000000000" + }, + { + "mAssetQty": "100000000000000000", + "bAssetQtys": [ + "5055891329940916", + "20274073724658181", + "75686844734430211" + ], + "redemptionFee": "30000000000000" + }, + { + "mAssetQty": "1000000000000000000", + "bAssetQtys": [ + "50558913299409169", + "202740737246581828", + "756868447344302121" + ], + "redemptionFee": "300000000000000" + }, + { + "mAssetQty": "10000000000000000000", + "bAssetQtys": [ + "505589132994091707", + "2027407372465818297", + "7568684473443021227" + ], + "redemptionFee": "3000000000000000" + }, + { + "mAssetQty": "100000000000000000000", + "bAssetQtys": [ + "5055891329940917082", + "20274073724658182988", + "75686844734430212281" + ], + "redemptionFee": "30000000000000000" + }, + { + "mAssetQty": "699200000000000050331648", + "bAssetQtys": [ + "35350792178946894792032", + "141756323482810025669551", + "529202418383136082376241" + ], + "redemptionFee": "209760000000000015099" + }, + { + "mAssetQty": "1398400000000000100663296", + "bAssetQtys": [ + "70701584357893789584065", + "283512646965620051339103", + "1058404836766272164752484" + ], + "redemptionFee": "419520000000000030198" + }, + { + "mAssetQty": "2097600000000000016777216", + "bAssetQtys": [ + "106052376536840677590196", + "425268970448430049797253", + "1587607255149408145543562" + ], + "redemptionFee": "629280000000000005033" + }, + { + "mAssetQty": "2796800000000000201326592", + "bAssetQtys": [ + "141403168715787579168132", + "567025293931240102678207", + "2116809673532544329504969" + ], + "redemptionFee": "839040000000000060397" + }, + { + "mAssetQty": "3496000000000000117440512", + "bAssetQtys": [ + "176753960894734467174262", + "708781617414050101136357", + "2646012091915680310296047" + ], + "redemptionFee": "1048800000000000035232" + }, + { + "mAssetQty": "4195200000000000033554432", + "bAssetQtys": [ + "212104753073681355180393", + "850537940896860099594508", + "3175214510298816291087126" + ], + "redemptionFee": "1258560000000000010066" + }, + { + "mAssetQty": "4894399999999999949668352", + "bAssetQtys": [ + "247455545252628243186524", + "992294264379670098052659", + "3704416928681952271878205" + ], + "redemptionFee": "1468319999999999984900" + }, + { + "mAssetQty": "5593600000000000402653184", + "bAssetQtys": [ + "282806337431575158336265", + "1134050587862480205356415", + "4233619347065088659009938" + ], + "redemptionFee": "1678080000000000120795" + }, + { + "mAssetQty": "6292799999999999781896192", + "bAssetQtys": [ + "318157129610522019198786", + "1275806911345290094968961", + "4762821765448224233460363" + ], + "redemptionFee": "1887839999999999934568" + }, + { + "mAssetQty": "6992000000000000234881024", + "bAssetQtys": [ + "353507921789468934348526", + "1417563234828100202272716", + "5292024183831360620592095" + ], + "redemptionFee": "2097600000000000070464" + } + ] + }, + { + "reserve0": "3996499999999999360000000", + "reserve1": "5503000000000000000000000", + "reserve2": "500500000000000000000000", + "A": 120, + "mAssetSupply": "9936488013915504712820075", + "hardMin": 50000000000000000, + "hardMax": 750000000000000000, + "redemptionFeeRate": 300000000000000, + "redeems": [ + { + "mAssetQty": "10000000000000", + "bAssetQtys": [ + "4020838191928", + "5536512591063", + "503547983249" + ], + "redemptionFee": "3000000000" + }, + { + "mAssetQty": "1000000000000000", + "bAssetQtys": [ + "402083819192937", + "553651259106401", + "50354798325049" + ], + "redemptionFee": "300000000000" + }, + { + "mAssetQty": "100000000000000000", + "bAssetQtys": [ + "40208381919293818", + "55365125910640290", + "5035479832505080" + ], + "redemptionFee": "30000000000000" + }, + { + "mAssetQty": "1000000000000000000", + "bAssetQtys": [ + "402083819192938196", + "553651259106402914", + "50354798325050818" + ], + "redemptionFee": "300000000000000" + }, + { + "mAssetQty": "10000000000000000000", + "bAssetQtys": [ + "4020838191929381969", + "5536512591064029155", + "503547983250508193" + ], + "redemptionFee": "3000000000000000" + }, + { + "mAssetQty": "100000000000000000000", + "bAssetQtys": [ + "40208381919293819699", + "55365125910640291565", + "5035479832505081941" + ], + "redemptionFee": "30000000000000000" + }, + { + "mAssetQty": "699200000000000050331648", + "bAssetQtys": [ + "281137006379702407582180", + "387112960367196946497444", + "35208074988875535475552" + ], + "redemptionFee": "209760000000000015099" + }, + { + "mAssetQty": "1398400000000000100663296", + "bAssetQtys": [ + "562274012759404815164362", + "774225920734393892994889", + "70416149977751070951106" + ], + "redemptionFee": "419520000000000030198" + }, + { + "mAssetQty": "2097600000000000016777216", + "bAssetQtys": [ + "843411019139107168779767", + "1161338881101590765182520", + "105624224966626599668153" + ], + "redemptionFee": "629280000000000005033" + }, + { + "mAssetQty": "2796800000000000201326592", + "bAssetQtys": [ + "1124548025518809630328725", + "1548451841468787785989780", + "140832299955502141902213" + ], + "redemptionFee": "839040000000000060397" + }, + { + "mAssetQty": "3496000000000000117440512", + "bAssetQtys": [ + "1405685031898511983944130", + "1935564801835984658177411", + "176040374944377670619260" + ], + "redemptionFee": "1048800000000000035232" + }, + { + "mAssetQty": "4195200000000000033554432", + "bAssetQtys": [ + "1686822038278214337559535", + "2322677762203181530365042", + "211248449933253199336307" + ], + "redemptionFee": "1258560000000000010066" + }, + { + "mAssetQty": "4894399999999999949668352", + "bAssetQtys": [ + "1967959044657916691174940", + "2709790722570378402552673", + "246456524922128728053354" + ], + "redemptionFee": "1468319999999999984900" + }, + { + "mAssetQty": "5593600000000000402653184", + "bAssetQtys": [ + "2249096051037619260657451", + "3096903682937575571979561", + "281664599911004283804427" + ], + "redemptionFee": "1678080000000000120795" + }, + { + "mAssetQty": "6292799999999999781896192", + "bAssetQtys": [ + "2530233057417321398405750", + "3484016643304772146927935", + "316872674899879785487448" + ], + "redemptionFee": "1887839999999999934568" + }, + { + "mAssetQty": "6992000000000000234881024", + "bAssetQtys": [ + "2811370063797023967888261", + "3871129603671969316354823", + "352080749888755341238521" + ], + "redemptionFee": "2097600000000000070464" + }, + { + "mAssetQty": "10000000000000", + "bAssetQtys": [ + "4020838191928", + "5536512591063", + "503547983249" + ], + "redemptionFee": "3000000000" + }, + { + "mAssetQty": "1000000000000000", + "bAssetQtys": [ + "402083819192937", + "553651259106401", + "50354798325049" + ], + "redemptionFee": "300000000000" + }, + { + "mAssetQty": "100000000000000000", + "bAssetQtys": [ + "40208381919293818", + "55365125910640290", + "5035479832505080" + ], + "redemptionFee": "30000000000000" + }, + { + "mAssetQty": "1000000000000000000", + "bAssetQtys": [ + "402083819192938196", + "553651259106402914", + "50354798325050818" + ], + "redemptionFee": "300000000000000" + }, + { + "mAssetQty": "10000000000000000000", + "bAssetQtys": [ + "4020838191929381969", + "5536512591064029155", + "503547983250508193" + ], + "redemptionFee": "3000000000000000" + }, + { + "mAssetQty": "100000000000000000000", + "bAssetQtys": [ + "40208381919293819699", + "55365125910640291565", + "5035479832505081941" + ], + "redemptionFee": "30000000000000000" + }, + { + "mAssetQty": "699200000000000050331648", + "bAssetQtys": [ + "281137006379702407582180", + "387112960367196946497444", + "35208074988875535475552" + ], + "redemptionFee": "209760000000000015099" + }, + { + "mAssetQty": "1398400000000000100663296", + "bAssetQtys": [ + "562274012759404815164362", + "774225920734393892994889", + "70416149977751070951106" + ], + "redemptionFee": "419520000000000030198" + }, + { + "mAssetQty": "2097600000000000016777216", + "bAssetQtys": [ + "843411019139107168779767", + "1161338881101590765182520", + "105624224966626599668153" + ], + "redemptionFee": "629280000000000005033" + }, + { + "mAssetQty": "2796800000000000201326592", + "bAssetQtys": [ + "1124548025518809630328725", + "1548451841468787785989780", + "140832299955502141902213" + ], + "redemptionFee": "839040000000000060397" + }, + { + "mAssetQty": "3496000000000000117440512", + "bAssetQtys": [ + "1405685031898511983944130", + "1935564801835984658177411", + "176040374944377670619260" + ], + "redemptionFee": "1048800000000000035232" + }, + { + "mAssetQty": "4195200000000000033554432", + "bAssetQtys": [ + "1686822038278214337559535", + "2322677762203181530365042", + "211248449933253199336307" + ], + "redemptionFee": "1258560000000000010066" + }, + { + "mAssetQty": "4894399999999999949668352", + "bAssetQtys": [ + "1967959044657916691174940", + "2709790722570378402552673", + "246456524922128728053354" + ], + "redemptionFee": "1468319999999999984900" + }, + { + "mAssetQty": "5593600000000000402653184", + "bAssetQtys": [ + "2249096051037619260657451", + "3096903682937575571979561", + "281664599911004283804427" + ], + "redemptionFee": "1678080000000000120795" + }, + { + "mAssetQty": "6292799999999999781896192", + "bAssetQtys": [ + "2530233057417321398405750", + "3484016643304772146927935", + "316872674899879785487448" + ], + "redemptionFee": "1887839999999999934568" + }, + { + "mAssetQty": "6992000000000000234881024", + "bAssetQtys": [ + "2811370063797023967888261", + "3871129603671969316354823", + "352080749888755341238521" + ], + "redemptionFee": "2097600000000000070464" + }, + { + "mAssetQty": "10000000000000", + "bAssetQtys": [ + "4020838191928", + "5536512591063", + "503547983249" + ], + "redemptionFee": "3000000000" + }, + { + "mAssetQty": "1000000000000000", + "bAssetQtys": [ + "402083819192937", + "553651259106401", + "50354798325049" + ], + "redemptionFee": "300000000000" + }, + { + "mAssetQty": "100000000000000000", + "bAssetQtys": [ + "40208381919293818", + "55365125910640290", + "5035479832505080" + ], + "redemptionFee": "30000000000000" + }, + { + "mAssetQty": "1000000000000000000", + "bAssetQtys": [ + "402083819192938196", + "553651259106402914", + "50354798325050818" + ], + "redemptionFee": "300000000000000" + }, + { + "mAssetQty": "10000000000000000000", + "bAssetQtys": [ + "4020838191929381969", + "5536512591064029155", + "503547983250508193" + ], + "redemptionFee": "3000000000000000" + }, + { + "mAssetQty": "100000000000000000000", + "bAssetQtys": [ + "40208381919293819699", + "55365125910640291565", + "5035479832505081941" + ], + "redemptionFee": "30000000000000000" + }, + { + "mAssetQty": "699200000000000050331648", + "bAssetQtys": [ + "281137006379702407582180", + "387112960367196946497444", + "35208074988875535475552" + ], + "redemptionFee": "209760000000000015099" + }, + { + "mAssetQty": "1398400000000000100663296", + "bAssetQtys": [ + "562274012759404815164362", + "774225920734393892994889", + "70416149977751070951106" + ], + "redemptionFee": "419520000000000030198" + }, + { + "mAssetQty": "2097600000000000016777216", + "bAssetQtys": [ + "843411019139107168779767", + "1161338881101590765182520", + "105624224966626599668153" + ], + "redemptionFee": "629280000000000005033" + }, + { + "mAssetQty": "2796800000000000201326592", + "bAssetQtys": [ + "1124548025518809630328725", + "1548451841468787785989780", + "140832299955502141902213" + ], + "redemptionFee": "839040000000000060397" + }, + { + "mAssetQty": "3496000000000000117440512", + "bAssetQtys": [ + "1405685031898511983944130", + "1935564801835984658177411", + "176040374944377670619260" + ], + "redemptionFee": "1048800000000000035232" + }, + { + "mAssetQty": "4195200000000000033554432", + "bAssetQtys": [ + "1686822038278214337559535", + "2322677762203181530365042", + "211248449933253199336307" + ], + "redemptionFee": "1258560000000000010066" + }, + { + "mAssetQty": "4894399999999999949668352", + "bAssetQtys": [ + "1967959044657916691174940", + "2709790722570378402552673", + "246456524922128728053354" + ], + "redemptionFee": "1468319999999999984900" + }, + { + "mAssetQty": "5593600000000000402653184", + "bAssetQtys": [ + "2249096051037619260657451", + "3096903682937575571979561", + "281664599911004283804427" + ], + "redemptionFee": "1678080000000000120795" + }, + { + "mAssetQty": "6292799999999999781896192", + "bAssetQtys": [ + "2530233057417321398405750", + "3484016643304772146927935", + "316872674899879785487448" + ], + "redemptionFee": "1887839999999999934568" + }, + { + "mAssetQty": "6992000000000000234881024", + "bAssetQtys": [ + "2811370063797023967888261", + "3871129603671969316354823", + "352080749888755341238521" + ], + "redemptionFee": "2097600000000000070464" + } + ] + }, + { + "reserve0": "3996499999999999360000000", + "reserve1": "2007000000000000960000000", + "reserve2": "3996499999999999360000000", + "A": 120, + "mAssetSupply": "9995726520619110731126433", + "hardMin": 50000000000000000, + "hardMax": 750000000000000000, + "redemptionFeeRate": 300000000000000, + "redeems": [ + { + "mAssetQty": "10000000000000", + "bAssetQtys": [ + "3997009163623", + "2007255696582", + "3997009163623" + ], + "redemptionFee": "3000000000" + }, + { + "mAssetQty": "1000000000000000", + "bAssetQtys": [ + "399700916362458", + "200725569658314", + "399700916362458" + ], + "redemptionFee": "300000000000" + }, + { + "mAssetQty": "100000000000000000", + "bAssetQtys": [ + "39970091636245967", + "20072556965831529", + "39970091636245967" + ], + "redemptionFee": "30000000000000" + }, + { + "mAssetQty": "1000000000000000000", + "bAssetQtys": [ + "399700916362459686", + "200725569658315301", + "399700916362459686" + ], + "redemptionFee": "300000000000000" + }, + { + "mAssetQty": "10000000000000000000", + "bAssetQtys": [ + "3997009163624596876", + "2007255696583153021", + "3997009163624596876" + ], + "redemptionFee": "3000000000000000" + }, + { + "mAssetQty": "100000000000000000000", + "bAssetQtys": [ + "39970091636245968777", + "20072556965831530227", + "39970091636245968777" + ], + "redemptionFee": "30000000000000000" + }, + { + "mAssetQty": "699200000000000050331648", + "bAssetQtys": [ + "279470880720631833817400", + "140347318305094069457237", + "279470880720631833817400" + ], + "redemptionFee": "209760000000000015099" + }, + { + "mAssetQty": "1398400000000000100663296", + "bAssetQtys": [ + "558941761441263667634802", + "280694636610188138914476", + "558941761441263667634802" + ], + "redemptionFee": "419520000000000030198" + }, + { + "mAssetQty": "2097600000000000016777216", + "bAssetQtys": [ + "838412642161895447805254", + "421041954915282181430785", + "838412642161895447805254" + ], + "redemptionFee": "629280000000000005033" + }, + { + "mAssetQty": "2796800000000000201326592", + "bAssetQtys": [ + "1117883522882527335269605", + "561389273220376277828953", + "1117883522882527335269605" + ], + "redemptionFee": "839040000000000060397" + }, + { + "mAssetQty": "3496000000000000117440512", + "bAssetQtys": [ + "1397354403603159115440058", + "701736591525470320345262", + "1397354403603159115440058" + ], + "redemptionFee": "1048800000000000035232" + }, + { + "mAssetQty": "4195200000000000033554432", + "bAssetQtys": [ + "1676825284323790895610510", + "842083909830564362861571", + "1676825284323790895610510" + ], + "redemptionFee": "1258560000000000010066" + }, + { + "mAssetQty": "4894399999999999949668352", + "bAssetQtys": [ + "1956296165044422675780963", + "982431228135658405377879", + "1956296165044422675780963" + ], + "redemptionFee": "1468319999999999984900" + }, + { + "mAssetQty": "5593600000000000402653184", + "bAssetQtys": [ + "2235767045765054670539212", + "1122778546440752555657908", + "2235767045765054670539212" + ], + "redemptionFee": "1678080000000000120795" + }, + { + "mAssetQty": "6292799999999999781896192", + "bAssetQtys": [ + "2515237926485686236121869", + "1263125864745846490410497", + "2515237926485686236121869" + ], + "redemptionFee": "1887839999999999934568" + }, + { + "mAssetQty": "6992000000000000234881024", + "bAssetQtys": [ + "2794708807206318230880117", + "1403473183050940640690525", + "2794708807206318230880117" + ], + "redemptionFee": "2097600000000000070464" + }, + { + "mAssetQty": "10000000000000", + "bAssetQtys": [ + "3997009163623", + "2007255696582", + "3997009163623" + ], + "redemptionFee": "3000000000" + }, + { + "mAssetQty": "1000000000000000", + "bAssetQtys": [ + "399700916362458", + "200725569658314", + "399700916362458" + ], + "redemptionFee": "300000000000" + }, + { + "mAssetQty": "100000000000000000", + "bAssetQtys": [ + "39970091636245967", + "20072556965831529", + "39970091636245967" + ], + "redemptionFee": "30000000000000" + }, + { + "mAssetQty": "1000000000000000000", + "bAssetQtys": [ + "399700916362459686", + "200725569658315301", + "399700916362459686" + ], + "redemptionFee": "300000000000000" + }, + { + "mAssetQty": "10000000000000000000", + "bAssetQtys": [ + "3997009163624596876", + "2007255696583153021", + "3997009163624596876" + ], + "redemptionFee": "3000000000000000" + }, + { + "mAssetQty": "100000000000000000000", + "bAssetQtys": [ + "39970091636245968777", + "20072556965831530227", + "39970091636245968777" + ], + "redemptionFee": "30000000000000000" + }, + { + "mAssetQty": "699200000000000050331648", + "bAssetQtys": [ + "279470880720631833817400", + "140347318305094069457237", + "279470880720631833817400" + ], + "redemptionFee": "209760000000000015099" + }, + { + "mAssetQty": "1398400000000000100663296", + "bAssetQtys": [ + "558941761441263667634802", + "280694636610188138914476", + "558941761441263667634802" + ], + "redemptionFee": "419520000000000030198" + }, + { + "mAssetQty": "2097600000000000016777216", + "bAssetQtys": [ + "838412642161895447805254", + "421041954915282181430785", + "838412642161895447805254" + ], + "redemptionFee": "629280000000000005033" + }, + { + "mAssetQty": "2796800000000000201326592", + "bAssetQtys": [ + "1117883522882527335269605", + "561389273220376277828953", + "1117883522882527335269605" + ], + "redemptionFee": "839040000000000060397" + }, + { + "mAssetQty": "3496000000000000117440512", + "bAssetQtys": [ + "1397354403603159115440058", + "701736591525470320345262", + "1397354403603159115440058" + ], + "redemptionFee": "1048800000000000035232" + }, + { + "mAssetQty": "4195200000000000033554432", + "bAssetQtys": [ + "1676825284323790895610510", + "842083909830564362861571", + "1676825284323790895610510" + ], + "redemptionFee": "1258560000000000010066" + }, + { + "mAssetQty": "4894399999999999949668352", + "bAssetQtys": [ + "1956296165044422675780963", + "982431228135658405377879", + "1956296165044422675780963" + ], + "redemptionFee": "1468319999999999984900" + }, + { + "mAssetQty": "5593600000000000402653184", + "bAssetQtys": [ + "2235767045765054670539212", + "1122778546440752555657908", + "2235767045765054670539212" + ], + "redemptionFee": "1678080000000000120795" + }, + { + "mAssetQty": "6292799999999999781896192", + "bAssetQtys": [ + "2515237926485686236121869", + "1263125864745846490410497", + "2515237926485686236121869" + ], + "redemptionFee": "1887839999999999934568" + }, + { + "mAssetQty": "6992000000000000234881024", + "bAssetQtys": [ + "2794708807206318230880117", + "1403473183050940640690525", + "2794708807206318230880117" + ], + "redemptionFee": "2097600000000000070464" + }, + { + "mAssetQty": "10000000000000", + "bAssetQtys": [ + "3997009163623", + "2007255696582", + "3997009163623" + ], + "redemptionFee": "3000000000" + }, + { + "mAssetQty": "1000000000000000", + "bAssetQtys": [ + "399700916362458", + "200725569658314", + "399700916362458" + ], + "redemptionFee": "300000000000" + }, + { + "mAssetQty": "100000000000000000", + "bAssetQtys": [ + "39970091636245967", + "20072556965831529", + "39970091636245967" + ], + "redemptionFee": "30000000000000" + }, + { + "mAssetQty": "1000000000000000000", + "bAssetQtys": [ + "399700916362459686", + "200725569658315301", + "399700916362459686" + ], + "redemptionFee": "300000000000000" + }, + { + "mAssetQty": "10000000000000000000", + "bAssetQtys": [ + "3997009163624596876", + "2007255696583153021", + "3997009163624596876" + ], + "redemptionFee": "3000000000000000" + }, + { + "mAssetQty": "100000000000000000000", + "bAssetQtys": [ + "39970091636245968777", + "20072556965831530227", + "39970091636245968777" + ], + "redemptionFee": "30000000000000000" + }, + { + "mAssetQty": "699200000000000050331648", + "bAssetQtys": [ + "279470880720631833817400", + "140347318305094069457237", + "279470880720631833817400" + ], + "redemptionFee": "209760000000000015099" + }, + { + "mAssetQty": "1398400000000000100663296", + "bAssetQtys": [ + "558941761441263667634802", + "280694636610188138914476", + "558941761441263667634802" + ], + "redemptionFee": "419520000000000030198" + }, + { + "mAssetQty": "2097600000000000016777216", + "bAssetQtys": [ + "838412642161895447805254", + "421041954915282181430785", + "838412642161895447805254" + ], + "redemptionFee": "629280000000000005033" + }, + { + "mAssetQty": "2796800000000000201326592", + "bAssetQtys": [ + "1117883522882527335269605", + "561389273220376277828953", + "1117883522882527335269605" + ], + "redemptionFee": "839040000000000060397" + }, + { + "mAssetQty": "3496000000000000117440512", + "bAssetQtys": [ + "1397354403603159115440058", + "701736591525470320345262", + "1397354403603159115440058" + ], + "redemptionFee": "1048800000000000035232" + }, + { + "mAssetQty": "4195200000000000033554432", + "bAssetQtys": [ + "1676825284323790895610510", + "842083909830564362861571", + "1676825284323790895610510" + ], + "redemptionFee": "1258560000000000010066" + }, + { + "mAssetQty": "4894399999999999949668352", + "bAssetQtys": [ + "1956296165044422675780963", + "982431228135658405377879", + "1956296165044422675780963" + ], + "redemptionFee": "1468319999999999984900" + }, + { + "mAssetQty": "5593600000000000402653184", + "bAssetQtys": [ + "2235767045765054670539212", + "1122778546440752555657908", + "2235767045765054670539212" + ], + "redemptionFee": "1678080000000000120795" + }, + { + "mAssetQty": "6292799999999999781896192", + "bAssetQtys": [ + "2515237926485686236121869", + "1263125864745846490410497", + "2515237926485686236121869" + ], + "redemptionFee": "1887839999999999934568" + }, + { + "mAssetQty": "6992000000000000234881024", + "bAssetQtys": [ + "2794708807206318230880117", + "1403473183050940640690525", + "2794708807206318230880117" + ], + "redemptionFee": "2097600000000000070464" + } + ] + }, + { + "reserve0": "7492500000000000000000000", + "reserve1": "2007000000000000000000000", + "reserve2": "500500000000000000000000", + "A": 120, + "mAssetSupply": "9896372713490403790662354", + "hardMin": 50000000000000000, + "hardMax": 750000000000000000, + "redemptionFeeRate": 300000000000000, + "redeems": [ + { + "mAssetQty": "10000000000000", + "bAssetQtys": [ + "7568684473442", + "2027407372464", + "505589132993" + ], + "redemptionFee": "3000000000" + }, + { + "mAssetQty": "1000000000000000", + "bAssetQtys": [ + "756868447344301", + "202740737246580", + "50558913299408" + ], + "redemptionFee": "300000000000" + }, + { + "mAssetQty": "100000000000000000", + "bAssetQtys": [ + "75686844734430211", + "20274073724658181", + "5055891329940916" + ], + "redemptionFee": "30000000000000" + }, + { + "mAssetQty": "1000000000000000000", + "bAssetQtys": [ + "756868447344302121", + "202740737246581828", + "50558913299409169" + ], + "redemptionFee": "300000000000000" + }, + { + "mAssetQty": "10000000000000000000", + "bAssetQtys": [ + "7568684473443021227", + "2027407372465818297", + "505589132994091707" + ], + "redemptionFee": "3000000000000000" + }, + { + "mAssetQty": "100000000000000000000", + "bAssetQtys": [ + "75686844734430212281", + "20274073724658182988", + "5055891329940917082" + ], + "redemptionFee": "30000000000000000" + }, + { + "mAssetQty": "699200000000000050331648", + "bAssetQtys": [ + "529202418383136082376241", + "141756323482810025669551", + "35350792178946894792032" + ], + "redemptionFee": "209760000000000015099" + }, + { + "mAssetQty": "1398400000000000100663296", + "bAssetQtys": [ + "1058404836766272164752484", + "283512646965620051339103", + "70701584357893789584065" + ], + "redemptionFee": "419520000000000030198" + }, + { + "mAssetQty": "2097600000000000016777216", + "bAssetQtys": [ + "1587607255149408145543562", + "425268970448430049797253", + "106052376536840677590196" + ], + "redemptionFee": "629280000000000005033" + }, + { + "mAssetQty": "2796800000000000201326592", + "bAssetQtys": [ + "2116809673532544329504969", + "567025293931240102678207", + "141403168715787579168132" + ], + "redemptionFee": "839040000000000060397" + }, + { + "mAssetQty": "3496000000000000117440512", + "bAssetQtys": [ + "2646012091915680310296047", + "708781617414050101136357", + "176753960894734467174262" + ], + "redemptionFee": "1048800000000000035232" + }, + { + "mAssetQty": "4195200000000000033554432", + "bAssetQtys": [ + "3175214510298816291087126", + "850537940896860099594508", + "212104753073681355180393" + ], + "redemptionFee": "1258560000000000010066" + }, + { + "mAssetQty": "4894399999999999949668352", + "bAssetQtys": [ + "3704416928681952271878205", + "992294264379670098052659", + "247455545252628243186524" + ], + "redemptionFee": "1468319999999999984900" + }, + { + "mAssetQty": "5593600000000000402653184", + "bAssetQtys": [ + "4233619347065088659009938", + "1134050587862480205356415", + "282806337431575158336265" + ], + "redemptionFee": "1678080000000000120795" + }, + { + "mAssetQty": "6292799999999999781896192", + "bAssetQtys": [ + "4762821765448224233460363", + "1275806911345290094968961", + "318157129610522019198786" + ], + "redemptionFee": "1887839999999999934568" + }, + { + "mAssetQty": "6992000000000000234881024", + "bAssetQtys": [ + "5292024183831360620592095", + "1417563234828100202272716", + "353507921789468934348526" + ], + "redemptionFee": "2097600000000000070464" + }, + { + "mAssetQty": "10000000000000", + "bAssetQtys": [ + "7568684473442", + "2027407372464", + "505589132993" + ], + "redemptionFee": "3000000000" + }, + { + "mAssetQty": "1000000000000000", + "bAssetQtys": [ + "756868447344301", + "202740737246580", + "50558913299408" + ], + "redemptionFee": "300000000000" + }, + { + "mAssetQty": "100000000000000000", + "bAssetQtys": [ + "75686844734430211", + "20274073724658181", + "5055891329940916" + ], + "redemptionFee": "30000000000000" + }, + { + "mAssetQty": "1000000000000000000", + "bAssetQtys": [ + "756868447344302121", + "202740737246581828", + "50558913299409169" + ], + "redemptionFee": "300000000000000" + }, + { + "mAssetQty": "10000000000000000000", + "bAssetQtys": [ + "7568684473443021227", + "2027407372465818297", + "505589132994091707" + ], + "redemptionFee": "3000000000000000" + }, + { + "mAssetQty": "100000000000000000000", + "bAssetQtys": [ + "75686844734430212281", + "20274073724658182988", + "5055891329940917082" + ], + "redemptionFee": "30000000000000000" + }, + { + "mAssetQty": "699200000000000050331648", + "bAssetQtys": [ + "529202418383136082376241", + "141756323482810025669551", + "35350792178946894792032" + ], + "redemptionFee": "209760000000000015099" + }, + { + "mAssetQty": "1398400000000000100663296", + "bAssetQtys": [ + "1058404836766272164752484", + "283512646965620051339103", + "70701584357893789584065" + ], + "redemptionFee": "419520000000000030198" + }, + { + "mAssetQty": "2097600000000000016777216", + "bAssetQtys": [ + "1587607255149408145543562", + "425268970448430049797253", + "106052376536840677590196" + ], + "redemptionFee": "629280000000000005033" + }, + { + "mAssetQty": "2796800000000000201326592", + "bAssetQtys": [ + "2116809673532544329504969", + "567025293931240102678207", + "141403168715787579168132" + ], + "redemptionFee": "839040000000000060397" + }, + { + "mAssetQty": "3496000000000000117440512", + "bAssetQtys": [ + "2646012091915680310296047", + "708781617414050101136357", + "176753960894734467174262" + ], + "redemptionFee": "1048800000000000035232" + }, + { + "mAssetQty": "4195200000000000033554432", + "bAssetQtys": [ + "3175214510298816291087126", + "850537940896860099594508", + "212104753073681355180393" + ], + "redemptionFee": "1258560000000000010066" + }, + { + "mAssetQty": "4894399999999999949668352", + "bAssetQtys": [ + "3704416928681952271878205", + "992294264379670098052659", + "247455545252628243186524" + ], + "redemptionFee": "1468319999999999984900" + }, + { + "mAssetQty": "5593600000000000402653184", + "bAssetQtys": [ + "4233619347065088659009938", + "1134050587862480205356415", + "282806337431575158336265" + ], + "redemptionFee": "1678080000000000120795" + }, + { + "mAssetQty": "6292799999999999781896192", + "bAssetQtys": [ + "4762821765448224233460363", + "1275806911345290094968961", + "318157129610522019198786" + ], + "redemptionFee": "1887839999999999934568" + }, + { + "mAssetQty": "6992000000000000234881024", + "bAssetQtys": [ + "5292024183831360620592095", + "1417563234828100202272716", + "353507921789468934348526" + ], + "redemptionFee": "2097600000000000070464" + }, + { + "mAssetQty": "10000000000000", + "bAssetQtys": [ + "7568684473442", + "2027407372464", + "505589132993" + ], + "redemptionFee": "3000000000" + }, + { + "mAssetQty": "1000000000000000", + "bAssetQtys": [ + "756868447344301", + "202740737246580", + "50558913299408" + ], + "redemptionFee": "300000000000" + }, + { + "mAssetQty": "100000000000000000", + "bAssetQtys": [ + "75686844734430211", + "20274073724658181", + "5055891329940916" + ], + "redemptionFee": "30000000000000" + }, + { + "mAssetQty": "1000000000000000000", + "bAssetQtys": [ + "756868447344302121", + "202740737246581828", + "50558913299409169" + ], + "redemptionFee": "300000000000000" + }, + { + "mAssetQty": "10000000000000000000", + "bAssetQtys": [ + "7568684473443021227", + "2027407372465818297", + "505589132994091707" + ], + "redemptionFee": "3000000000000000" + }, + { + "mAssetQty": "100000000000000000000", + "bAssetQtys": [ + "75686844734430212281", + "20274073724658182988", + "5055891329940917082" + ], + "redemptionFee": "30000000000000000" + }, + { + "mAssetQty": "699200000000000050331648", + "bAssetQtys": [ + "529202418383136082376241", + "141756323482810025669551", + "35350792178946894792032" + ], + "redemptionFee": "209760000000000015099" + }, + { + "mAssetQty": "1398400000000000100663296", + "bAssetQtys": [ + "1058404836766272164752484", + "283512646965620051339103", + "70701584357893789584065" + ], + "redemptionFee": "419520000000000030198" + }, + { + "mAssetQty": "2097600000000000016777216", + "bAssetQtys": [ + "1587607255149408145543562", + "425268970448430049797253", + "106052376536840677590196" + ], + "redemptionFee": "629280000000000005033" + }, + { + "mAssetQty": "2796800000000000201326592", + "bAssetQtys": [ + "2116809673532544329504969", + "567025293931240102678207", + "141403168715787579168132" + ], + "redemptionFee": "839040000000000060397" + }, + { + "mAssetQty": "3496000000000000117440512", + "bAssetQtys": [ + "2646012091915680310296047", + "708781617414050101136357", + "176753960894734467174262" + ], + "redemptionFee": "1048800000000000035232" + }, + { + "mAssetQty": "4195200000000000033554432", + "bAssetQtys": [ + "3175214510298816291087126", + "850537940896860099594508", + "212104753073681355180393" + ], + "redemptionFee": "1258560000000000010066" + }, + { + "mAssetQty": "4894399999999999949668352", + "bAssetQtys": [ + "3704416928681952271878205", + "992294264379670098052659", + "247455545252628243186524" + ], + "redemptionFee": "1468319999999999984900" + }, + { + "mAssetQty": "5593600000000000402653184", + "bAssetQtys": [ + "4233619347065088659009938", + "1134050587862480205356415", + "282806337431575158336265" + ], + "redemptionFee": "1678080000000000120795" + }, + { + "mAssetQty": "6292799999999999781896192", + "bAssetQtys": [ + "4762821765448224233460363", + "1275806911345290094968961", + "318157129610522019198786" + ], + "redemptionFee": "1887839999999999934568" + }, + { + "mAssetQty": "6992000000000000234881024", + "bAssetQtys": [ + "5292024183831360620592095", + "1417563234828100202272716", + "353507921789468934348526" + ], + "redemptionFee": "2097600000000000070464" + } + ] + }, + { + "reserve0": "500500000000000000000000", + "reserve1": "3996499999999999360000000", + "reserve2": "5503000000000000000000000", + "A": 120, + "mAssetSupply": "9936488013915504712820075", + "hardMin": 50000000000000000, + "hardMax": 750000000000000000, + "redemptionFeeRate": 300000000000000, + "redeems": [ + { + "mAssetQty": "10000000000000", + "bAssetQtys": [ + "503547983249", + "4020838191928", + "5536512591063" + ], + "redemptionFee": "3000000000" + }, + { + "mAssetQty": "1000000000000000", + "bAssetQtys": [ + "50354798325049", + "402083819192937", + "553651259106401" + ], + "redemptionFee": "300000000000" + }, + { + "mAssetQty": "100000000000000000", + "bAssetQtys": [ + "5035479832505080", + "40208381919293818", + "55365125910640290" + ], + "redemptionFee": "30000000000000" + }, + { + "mAssetQty": "1000000000000000000", + "bAssetQtys": [ + "50354798325050818", + "402083819192938196", + "553651259106402914" + ], + "redemptionFee": "300000000000000" + }, + { + "mAssetQty": "10000000000000000000", + "bAssetQtys": [ + "503547983250508193", + "4020838191929381969", + "5536512591064029155" + ], + "redemptionFee": "3000000000000000" + }, + { + "mAssetQty": "100000000000000000000", + "bAssetQtys": [ + "5035479832505081941", + "40208381919293819699", + "55365125910640291565" + ], + "redemptionFee": "30000000000000000" + }, + { + "mAssetQty": "699200000000000050331648", + "bAssetQtys": [ + "35208074988875535475552", + "281137006379702407582180", + "387112960367196946497444" + ], + "redemptionFee": "209760000000000015099" + }, + { + "mAssetQty": "1398400000000000100663296", + "bAssetQtys": [ + "70416149977751070951106", + "562274012759404815164362", + "774225920734393892994889" + ], + "redemptionFee": "419520000000000030198" + }, + { + "mAssetQty": "2097600000000000016777216", + "bAssetQtys": [ + "105624224966626599668153", + "843411019139107168779767", + "1161338881101590765182520" + ], + "redemptionFee": "629280000000000005033" + }, + { + "mAssetQty": "2796800000000000201326592", + "bAssetQtys": [ + "140832299955502141902213", + "1124548025518809630328725", + "1548451841468787785989780" + ], + "redemptionFee": "839040000000000060397" + }, + { + "mAssetQty": "3496000000000000117440512", + "bAssetQtys": [ + "176040374944377670619260", + "1405685031898511983944130", + "1935564801835984658177411" + ], + "redemptionFee": "1048800000000000035232" + }, + { + "mAssetQty": "4195200000000000033554432", + "bAssetQtys": [ + "211248449933253199336307", + "1686822038278214337559535", + "2322677762203181530365042" + ], + "redemptionFee": "1258560000000000010066" + }, + { + "mAssetQty": "4894399999999999949668352", + "bAssetQtys": [ + "246456524922128728053354", + "1967959044657916691174940", + "2709790722570378402552673" + ], + "redemptionFee": "1468319999999999984900" + }, + { + "mAssetQty": "5593600000000000402653184", + "bAssetQtys": [ + "281664599911004283804427", + "2249096051037619260657451", + "3096903682937575571979561" + ], + "redemptionFee": "1678080000000000120795" + }, + { + "mAssetQty": "6292799999999999781896192", + "bAssetQtys": [ + "316872674899879785487448", + "2530233057417321398405750", + "3484016643304772146927935" + ], + "redemptionFee": "1887839999999999934568" + }, + { + "mAssetQty": "6992000000000000234881024", + "bAssetQtys": [ + "352080749888755341238521", + "2811370063797023967888261", + "3871129603671969316354823" + ], + "redemptionFee": "2097600000000000070464" + }, + { + "mAssetQty": "10000000000000", + "bAssetQtys": [ + "503547983249", + "4020838191928", + "5536512591063" + ], + "redemptionFee": "3000000000" + }, + { + "mAssetQty": "1000000000000000", + "bAssetQtys": [ + "50354798325049", + "402083819192937", + "553651259106401" + ], + "redemptionFee": "300000000000" + }, + { + "mAssetQty": "100000000000000000", + "bAssetQtys": [ + "5035479832505080", + "40208381919293818", + "55365125910640290" + ], + "redemptionFee": "30000000000000" + }, + { + "mAssetQty": "1000000000000000000", + "bAssetQtys": [ + "50354798325050818", + "402083819192938196", + "553651259106402914" + ], + "redemptionFee": "300000000000000" + }, + { + "mAssetQty": "10000000000000000000", + "bAssetQtys": [ + "503547983250508193", + "4020838191929381969", + "5536512591064029155" + ], + "redemptionFee": "3000000000000000" + }, + { + "mAssetQty": "100000000000000000000", + "bAssetQtys": [ + "5035479832505081941", + "40208381919293819699", + "55365125910640291565" + ], + "redemptionFee": "30000000000000000" + }, + { + "mAssetQty": "699200000000000050331648", + "bAssetQtys": [ + "35208074988875535475552", + "281137006379702407582180", + "387112960367196946497444" + ], + "redemptionFee": "209760000000000015099" + }, + { + "mAssetQty": "1398400000000000100663296", + "bAssetQtys": [ + "70416149977751070951106", + "562274012759404815164362", + "774225920734393892994889" + ], + "redemptionFee": "419520000000000030198" + }, + { + "mAssetQty": "2097600000000000016777216", + "bAssetQtys": [ + "105624224966626599668153", + "843411019139107168779767", + "1161338881101590765182520" + ], + "redemptionFee": "629280000000000005033" + }, + { + "mAssetQty": "2796800000000000201326592", + "bAssetQtys": [ + "140832299955502141902213", + "1124548025518809630328725", + "1548451841468787785989780" + ], + "redemptionFee": "839040000000000060397" + }, + { + "mAssetQty": "3496000000000000117440512", + "bAssetQtys": [ + "176040374944377670619260", + "1405685031898511983944130", + "1935564801835984658177411" + ], + "redemptionFee": "1048800000000000035232" + }, + { + "mAssetQty": "4195200000000000033554432", + "bAssetQtys": [ + "211248449933253199336307", + "1686822038278214337559535", + "2322677762203181530365042" + ], + "redemptionFee": "1258560000000000010066" + }, + { + "mAssetQty": "4894399999999999949668352", + "bAssetQtys": [ + "246456524922128728053354", + "1967959044657916691174940", + "2709790722570378402552673" + ], + "redemptionFee": "1468319999999999984900" + }, + { + "mAssetQty": "5593600000000000402653184", + "bAssetQtys": [ + "281664599911004283804427", + "2249096051037619260657451", + "3096903682937575571979561" + ], + "redemptionFee": "1678080000000000120795" + }, + { + "mAssetQty": "6292799999999999781896192", + "bAssetQtys": [ + "316872674899879785487448", + "2530233057417321398405750", + "3484016643304772146927935" + ], + "redemptionFee": "1887839999999999934568" + }, + { + "mAssetQty": "6992000000000000234881024", + "bAssetQtys": [ + "352080749888755341238521", + "2811370063797023967888261", + "3871129603671969316354823" + ], + "redemptionFee": "2097600000000000070464" + }, + { + "mAssetQty": "10000000000000", + "bAssetQtys": [ + "503547983249", + "4020838191928", + "5536512591063" + ], + "redemptionFee": "3000000000" + }, + { + "mAssetQty": "1000000000000000", + "bAssetQtys": [ + "50354798325049", + "402083819192937", + "553651259106401" + ], + "redemptionFee": "300000000000" + }, + { + "mAssetQty": "100000000000000000", + "bAssetQtys": [ + "5035479832505080", + "40208381919293818", + "55365125910640290" + ], + "redemptionFee": "30000000000000" + }, + { + "mAssetQty": "1000000000000000000", + "bAssetQtys": [ + "50354798325050818", + "402083819192938196", + "553651259106402914" + ], + "redemptionFee": "300000000000000" + }, + { + "mAssetQty": "10000000000000000000", + "bAssetQtys": [ + "503547983250508193", + "4020838191929381969", + "5536512591064029155" + ], + "redemptionFee": "3000000000000000" + }, + { + "mAssetQty": "100000000000000000000", + "bAssetQtys": [ + "5035479832505081941", + "40208381919293819699", + "55365125910640291565" + ], + "redemptionFee": "30000000000000000" + }, + { + "mAssetQty": "699200000000000050331648", + "bAssetQtys": [ + "35208074988875535475552", + "281137006379702407582180", + "387112960367196946497444" + ], + "redemptionFee": "209760000000000015099" + }, + { + "mAssetQty": "1398400000000000100663296", + "bAssetQtys": [ + "70416149977751070951106", + "562274012759404815164362", + "774225920734393892994889" + ], + "redemptionFee": "419520000000000030198" + }, + { + "mAssetQty": "2097600000000000016777216", + "bAssetQtys": [ + "105624224966626599668153", + "843411019139107168779767", + "1161338881101590765182520" + ], + "redemptionFee": "629280000000000005033" + }, + { + "mAssetQty": "2796800000000000201326592", + "bAssetQtys": [ + "140832299955502141902213", + "1124548025518809630328725", + "1548451841468787785989780" + ], + "redemptionFee": "839040000000000060397" + }, + { + "mAssetQty": "3496000000000000117440512", + "bAssetQtys": [ + "176040374944377670619260", + "1405685031898511983944130", + "1935564801835984658177411" + ], + "redemptionFee": "1048800000000000035232" + }, + { + "mAssetQty": "4195200000000000033554432", + "bAssetQtys": [ + "211248449933253199336307", + "1686822038278214337559535", + "2322677762203181530365042" + ], + "redemptionFee": "1258560000000000010066" + }, + { + "mAssetQty": "4894399999999999949668352", + "bAssetQtys": [ + "246456524922128728053354", + "1967959044657916691174940", + "2709790722570378402552673" + ], + "redemptionFee": "1468319999999999984900" + }, + { + "mAssetQty": "5593600000000000402653184", + "bAssetQtys": [ + "281664599911004283804427", + "2249096051037619260657451", + "3096903682937575571979561" + ], + "redemptionFee": "1678080000000000120795" + }, + { + "mAssetQty": "6292799999999999781896192", + "bAssetQtys": [ + "316872674899879785487448", + "2530233057417321398405750", + "3484016643304772146927935" + ], + "redemptionFee": "1887839999999999934568" + }, + { + "mAssetQty": "6992000000000000234881024", + "bAssetQtys": [ + "352080749888755341238521", + "2811370063797023967888261", + "3871129603671969316354823" + ], + "redemptionFee": "2097600000000000070464" + } + ] + }, + { + "reserve0": "500500000000000000000000", + "reserve1": "7492500000000000000000000", + "reserve2": "2007000000000000000000000", + "A": 120, + "mAssetSupply": "9896372713490403790662354", + "hardMin": 50000000000000000, + "hardMax": 750000000000000000, + "redemptionFeeRate": 300000000000000, + "redeems": [ + { + "mAssetQty": "10000000000000", + "bAssetQtys": [ + "505589132993", + "7568684473442", + "2027407372464" + ], + "redemptionFee": "3000000000" + }, + { + "mAssetQty": "1000000000000000", + "bAssetQtys": [ + "50558913299408", + "756868447344301", + "202740737246580" + ], + "redemptionFee": "300000000000" + }, + { + "mAssetQty": "100000000000000000", + "bAssetQtys": [ + "5055891329940916", + "75686844734430211", + "20274073724658181" + ], + "redemptionFee": "30000000000000" + }, + { + "mAssetQty": "1000000000000000000", + "bAssetQtys": [ + "50558913299409169", + "756868447344302121", + "202740737246581828" + ], + "redemptionFee": "300000000000000" + }, + { + "mAssetQty": "10000000000000000000", + "bAssetQtys": [ + "505589132994091707", + "7568684473443021227", + "2027407372465818297" + ], + "redemptionFee": "3000000000000000" + }, + { + "mAssetQty": "100000000000000000000", + "bAssetQtys": [ + "5055891329940917082", + "75686844734430212281", + "20274073724658182988" + ], + "redemptionFee": "30000000000000000" + }, + { + "mAssetQty": "699200000000000050331648", + "bAssetQtys": [ + "35350792178946894792032", + "529202418383136082376241", + "141756323482810025669551" + ], + "redemptionFee": "209760000000000015099" + }, + { + "mAssetQty": "1398400000000000100663296", + "bAssetQtys": [ + "70701584357893789584065", + "1058404836766272164752484", + "283512646965620051339103" + ], + "redemptionFee": "419520000000000030198" + }, + { + "mAssetQty": "2097600000000000016777216", + "bAssetQtys": [ + "106052376536840677590196", + "1587607255149408145543562", + "425268970448430049797253" + ], + "redemptionFee": "629280000000000005033" + }, + { + "mAssetQty": "2796800000000000201326592", + "bAssetQtys": [ + "141403168715787579168132", + "2116809673532544329504969", + "567025293931240102678207" + ], + "redemptionFee": "839040000000000060397" + }, + { + "mAssetQty": "3496000000000000117440512", + "bAssetQtys": [ + "176753960894734467174262", + "2646012091915680310296047", + "708781617414050101136357" + ], + "redemptionFee": "1048800000000000035232" + }, + { + "mAssetQty": "4195200000000000033554432", + "bAssetQtys": [ + "212104753073681355180393", + "3175214510298816291087126", + "850537940896860099594508" + ], + "redemptionFee": "1258560000000000010066" + }, + { + "mAssetQty": "4894399999999999949668352", + "bAssetQtys": [ + "247455545252628243186524", + "3704416928681952271878205", + "992294264379670098052659" + ], + "redemptionFee": "1468319999999999984900" + }, + { + "mAssetQty": "5593600000000000402653184", + "bAssetQtys": [ + "282806337431575158336265", + "4233619347065088659009938", + "1134050587862480205356415" + ], + "redemptionFee": "1678080000000000120795" + }, + { + "mAssetQty": "6292799999999999781896192", + "bAssetQtys": [ + "318157129610522019198786", + "4762821765448224233460363", + "1275806911345290094968961" + ], + "redemptionFee": "1887839999999999934568" + }, + { + "mAssetQty": "6992000000000000234881024", + "bAssetQtys": [ + "353507921789468934348526", + "5292024183831360620592095", + "1417563234828100202272716" + ], + "redemptionFee": "2097600000000000070464" + }, + { + "mAssetQty": "10000000000000", + "bAssetQtys": [ + "505589132993", + "7568684473442", + "2027407372464" + ], + "redemptionFee": "3000000000" + }, + { + "mAssetQty": "1000000000000000", + "bAssetQtys": [ + "50558913299408", + "756868447344301", + "202740737246580" + ], + "redemptionFee": "300000000000" + }, + { + "mAssetQty": "100000000000000000", + "bAssetQtys": [ + "5055891329940916", + "75686844734430211", + "20274073724658181" + ], + "redemptionFee": "30000000000000" + }, + { + "mAssetQty": "1000000000000000000", + "bAssetQtys": [ + "50558913299409169", + "756868447344302121", + "202740737246581828" + ], + "redemptionFee": "300000000000000" + }, + { + "mAssetQty": "10000000000000000000", + "bAssetQtys": [ + "505589132994091707", + "7568684473443021227", + "2027407372465818297" + ], + "redemptionFee": "3000000000000000" + }, + { + "mAssetQty": "100000000000000000000", + "bAssetQtys": [ + "5055891329940917082", + "75686844734430212281", + "20274073724658182988" + ], + "redemptionFee": "30000000000000000" + }, + { + "mAssetQty": "699200000000000050331648", + "bAssetQtys": [ + "35350792178946894792032", + "529202418383136082376241", + "141756323482810025669551" + ], + "redemptionFee": "209760000000000015099" + }, + { + "mAssetQty": "1398400000000000100663296", + "bAssetQtys": [ + "70701584357893789584065", + "1058404836766272164752484", + "283512646965620051339103" + ], + "redemptionFee": "419520000000000030198" + }, + { + "mAssetQty": "2097600000000000016777216", + "bAssetQtys": [ + "106052376536840677590196", + "1587607255149408145543562", + "425268970448430049797253" + ], + "redemptionFee": "629280000000000005033" + }, + { + "mAssetQty": "2796800000000000201326592", + "bAssetQtys": [ + "141403168715787579168132", + "2116809673532544329504969", + "567025293931240102678207" + ], + "redemptionFee": "839040000000000060397" + }, + { + "mAssetQty": "3496000000000000117440512", + "bAssetQtys": [ + "176753960894734467174262", + "2646012091915680310296047", + "708781617414050101136357" + ], + "redemptionFee": "1048800000000000035232" + }, + { + "mAssetQty": "4195200000000000033554432", + "bAssetQtys": [ + "212104753073681355180393", + "3175214510298816291087126", + "850537940896860099594508" + ], + "redemptionFee": "1258560000000000010066" + }, + { + "mAssetQty": "4894399999999999949668352", + "bAssetQtys": [ + "247455545252628243186524", + "3704416928681952271878205", + "992294264379670098052659" + ], + "redemptionFee": "1468319999999999984900" + }, + { + "mAssetQty": "5593600000000000402653184", + "bAssetQtys": [ + "282806337431575158336265", + "4233619347065088659009938", + "1134050587862480205356415" + ], + "redemptionFee": "1678080000000000120795" + }, + { + "mAssetQty": "6292799999999999781896192", + "bAssetQtys": [ + "318157129610522019198786", + "4762821765448224233460363", + "1275806911345290094968961" + ], + "redemptionFee": "1887839999999999934568" + }, + { + "mAssetQty": "6992000000000000234881024", + "bAssetQtys": [ + "353507921789468934348526", + "5292024183831360620592095", + "1417563234828100202272716" + ], + "redemptionFee": "2097600000000000070464" + }, + { + "mAssetQty": "10000000000000", + "bAssetQtys": [ + "505589132993", + "7568684473442", + "2027407372464" + ], + "redemptionFee": "3000000000" + }, + { + "mAssetQty": "1000000000000000", + "bAssetQtys": [ + "50558913299408", + "756868447344301", + "202740737246580" + ], + "redemptionFee": "300000000000" + }, + { + "mAssetQty": "100000000000000000", + "bAssetQtys": [ + "5055891329940916", + "75686844734430211", + "20274073724658181" + ], + "redemptionFee": "30000000000000" + }, + { + "mAssetQty": "1000000000000000000", + "bAssetQtys": [ + "50558913299409169", + "756868447344302121", + "202740737246581828" + ], + "redemptionFee": "300000000000000" + }, + { + "mAssetQty": "10000000000000000000", + "bAssetQtys": [ + "505589132994091707", + "7568684473443021227", + "2027407372465818297" + ], + "redemptionFee": "3000000000000000" + }, + { + "mAssetQty": "100000000000000000000", + "bAssetQtys": [ + "5055891329940917082", + "75686844734430212281", + "20274073724658182988" + ], + "redemptionFee": "30000000000000000" + }, + { + "mAssetQty": "699200000000000050331648", + "bAssetQtys": [ + "35350792178946894792032", + "529202418383136082376241", + "141756323482810025669551" + ], + "redemptionFee": "209760000000000015099" + }, + { + "mAssetQty": "1398400000000000100663296", + "bAssetQtys": [ + "70701584357893789584065", + "1058404836766272164752484", + "283512646965620051339103" + ], + "redemptionFee": "419520000000000030198" + }, + { + "mAssetQty": "2097600000000000016777216", + "bAssetQtys": [ + "106052376536840677590196", + "1587607255149408145543562", + "425268970448430049797253" + ], + "redemptionFee": "629280000000000005033" + }, + { + "mAssetQty": "2796800000000000201326592", + "bAssetQtys": [ + "141403168715787579168132", + "2116809673532544329504969", + "567025293931240102678207" + ], + "redemptionFee": "839040000000000060397" + }, + { + "mAssetQty": "3496000000000000117440512", + "bAssetQtys": [ + "176753960894734467174262", + "2646012091915680310296047", + "708781617414050101136357" + ], + "redemptionFee": "1048800000000000035232" + }, + { + "mAssetQty": "4195200000000000033554432", + "bAssetQtys": [ + "212104753073681355180393", + "3175214510298816291087126", + "850537940896860099594508" + ], + "redemptionFee": "1258560000000000010066" + }, + { + "mAssetQty": "4894399999999999949668352", + "bAssetQtys": [ + "247455545252628243186524", + "3704416928681952271878205", + "992294264379670098052659" + ], + "redemptionFee": "1468319999999999984900" + }, + { + "mAssetQty": "5593600000000000402653184", + "bAssetQtys": [ + "282806337431575158336265", + "4233619347065088659009938", + "1134050587862480205356415" + ], + "redemptionFee": "1678080000000000120795" + }, + { + "mAssetQty": "6292799999999999781896192", + "bAssetQtys": [ + "318157129610522019198786", + "4762821765448224233460363", + "1275806911345290094968961" + ], + "redemptionFee": "1887839999999999934568" + }, + { + "mAssetQty": "6992000000000000234881024", + "bAssetQtys": [ + "353507921789468934348526", + "5292024183831360620592095", + "1417563234828100202272716" + ], + "redemptionFee": "2097600000000000070464" + } + ] + }, + { + "reserve0": "3996499999999999360000000", + "reserve1": "500500000000000000000000", + "reserve2": "5503000000000000000000000", + "A": 120, + "mAssetSupply": "9936488013915504712820075", + "hardMin": 50000000000000000, + "hardMax": 750000000000000000, + "redemptionFeeRate": 300000000000000, + "redeems": [ + { + "mAssetQty": "10000000000000", + "bAssetQtys": [ + "4020838191928", + "503547983249", + "5536512591063" + ], + "redemptionFee": "3000000000" + }, + { + "mAssetQty": "1000000000000000", + "bAssetQtys": [ + "402083819192937", + "50354798325049", + "553651259106401" + ], + "redemptionFee": "300000000000" + }, + { + "mAssetQty": "100000000000000000", + "bAssetQtys": [ + "40208381919293818", + "5035479832505080", + "55365125910640290" + ], + "redemptionFee": "30000000000000" + }, + { + "mAssetQty": "1000000000000000000", + "bAssetQtys": [ + "402083819192938196", + "50354798325050818", + "553651259106402914" + ], + "redemptionFee": "300000000000000" + }, + { + "mAssetQty": "10000000000000000000", + "bAssetQtys": [ + "4020838191929381969", + "503547983250508193", + "5536512591064029155" + ], + "redemptionFee": "3000000000000000" + }, + { + "mAssetQty": "100000000000000000000", + "bAssetQtys": [ + "40208381919293819699", + "5035479832505081941", + "55365125910640291565" + ], + "redemptionFee": "30000000000000000" + }, + { + "mAssetQty": "699200000000000050331648", + "bAssetQtys": [ + "281137006379702407582180", + "35208074988875535475552", + "387112960367196946497444" + ], + "redemptionFee": "209760000000000015099" + }, + { + "mAssetQty": "1398400000000000100663296", + "bAssetQtys": [ + "562274012759404815164362", + "70416149977751070951106", + "774225920734393892994889" + ], + "redemptionFee": "419520000000000030198" + }, + { + "mAssetQty": "2097600000000000016777216", + "bAssetQtys": [ + "843411019139107168779767", + "105624224966626599668153", + "1161338881101590765182520" + ], + "redemptionFee": "629280000000000005033" + }, + { + "mAssetQty": "2796800000000000201326592", + "bAssetQtys": [ + "1124548025518809630328725", + "140832299955502141902213", + "1548451841468787785989780" + ], + "redemptionFee": "839040000000000060397" + }, + { + "mAssetQty": "3496000000000000117440512", + "bAssetQtys": [ + "1405685031898511983944130", + "176040374944377670619260", + "1935564801835984658177411" + ], + "redemptionFee": "1048800000000000035232" + }, + { + "mAssetQty": "4195200000000000033554432", + "bAssetQtys": [ + "1686822038278214337559535", + "211248449933253199336307", + "2322677762203181530365042" + ], + "redemptionFee": "1258560000000000010066" + }, + { + "mAssetQty": "4894399999999999949668352", + "bAssetQtys": [ + "1967959044657916691174940", + "246456524922128728053354", + "2709790722570378402552673" + ], + "redemptionFee": "1468319999999999984900" + }, + { + "mAssetQty": "5593600000000000402653184", + "bAssetQtys": [ + "2249096051037619260657451", + "281664599911004283804427", + "3096903682937575571979561" + ], + "redemptionFee": "1678080000000000120795" + }, + { + "mAssetQty": "6292799999999999781896192", + "bAssetQtys": [ + "2530233057417321398405750", + "316872674899879785487448", + "3484016643304772146927935" + ], + "redemptionFee": "1887839999999999934568" + }, + { + "mAssetQty": "6992000000000000234881024", + "bAssetQtys": [ + "2811370063797023967888261", + "352080749888755341238521", + "3871129603671969316354823" + ], + "redemptionFee": "2097600000000000070464" + }, + { + "mAssetQty": "10000000000000", + "bAssetQtys": [ + "4020838191928", + "503547983249", + "5536512591063" + ], + "redemptionFee": "3000000000" + }, + { + "mAssetQty": "1000000000000000", + "bAssetQtys": [ + "402083819192937", + "50354798325049", + "553651259106401" + ], + "redemptionFee": "300000000000" + }, + { + "mAssetQty": "100000000000000000", + "bAssetQtys": [ + "40208381919293818", + "5035479832505080", + "55365125910640290" + ], + "redemptionFee": "30000000000000" + }, + { + "mAssetQty": "1000000000000000000", + "bAssetQtys": [ + "402083819192938196", + "50354798325050818", + "553651259106402914" + ], + "redemptionFee": "300000000000000" + }, + { + "mAssetQty": "10000000000000000000", + "bAssetQtys": [ + "4020838191929381969", + "503547983250508193", + "5536512591064029155" + ], + "redemptionFee": "3000000000000000" + }, + { + "mAssetQty": "100000000000000000000", + "bAssetQtys": [ + "40208381919293819699", + "5035479832505081941", + "55365125910640291565" + ], + "redemptionFee": "30000000000000000" + }, + { + "mAssetQty": "699200000000000050331648", + "bAssetQtys": [ + "281137006379702407582180", + "35208074988875535475552", + "387112960367196946497444" + ], + "redemptionFee": "209760000000000015099" + }, + { + "mAssetQty": "1398400000000000100663296", + "bAssetQtys": [ + "562274012759404815164362", + "70416149977751070951106", + "774225920734393892994889" + ], + "redemptionFee": "419520000000000030198" + }, + { + "mAssetQty": "2097600000000000016777216", + "bAssetQtys": [ + "843411019139107168779767", + "105624224966626599668153", + "1161338881101590765182520" + ], + "redemptionFee": "629280000000000005033" + }, + { + "mAssetQty": "2796800000000000201326592", + "bAssetQtys": [ + "1124548025518809630328725", + "140832299955502141902213", + "1548451841468787785989780" + ], + "redemptionFee": "839040000000000060397" + }, + { + "mAssetQty": "3496000000000000117440512", + "bAssetQtys": [ + "1405685031898511983944130", + "176040374944377670619260", + "1935564801835984658177411" + ], + "redemptionFee": "1048800000000000035232" + }, + { + "mAssetQty": "4195200000000000033554432", + "bAssetQtys": [ + "1686822038278214337559535", + "211248449933253199336307", + "2322677762203181530365042" + ], + "redemptionFee": "1258560000000000010066" + }, + { + "mAssetQty": "4894399999999999949668352", + "bAssetQtys": [ + "1967959044657916691174940", + "246456524922128728053354", + "2709790722570378402552673" + ], + "redemptionFee": "1468319999999999984900" + }, + { + "mAssetQty": "5593600000000000402653184", + "bAssetQtys": [ + "2249096051037619260657451", + "281664599911004283804427", + "3096903682937575571979561" + ], + "redemptionFee": "1678080000000000120795" + }, + { + "mAssetQty": "6292799999999999781896192", + "bAssetQtys": [ + "2530233057417321398405750", + "316872674899879785487448", + "3484016643304772146927935" + ], + "redemptionFee": "1887839999999999934568" + }, + { + "mAssetQty": "6992000000000000234881024", + "bAssetQtys": [ + "2811370063797023967888261", + "352080749888755341238521", + "3871129603671969316354823" + ], + "redemptionFee": "2097600000000000070464" + }, + { + "mAssetQty": "10000000000000", + "bAssetQtys": [ + "4020838191928", + "503547983249", + "5536512591063" + ], + "redemptionFee": "3000000000" + }, + { + "mAssetQty": "1000000000000000", + "bAssetQtys": [ + "402083819192937", + "50354798325049", + "553651259106401" + ], + "redemptionFee": "300000000000" + }, + { + "mAssetQty": "100000000000000000", + "bAssetQtys": [ + "40208381919293818", + "5035479832505080", + "55365125910640290" + ], + "redemptionFee": "30000000000000" + }, + { + "mAssetQty": "1000000000000000000", + "bAssetQtys": [ + "402083819192938196", + "50354798325050818", + "553651259106402914" + ], + "redemptionFee": "300000000000000" + }, + { + "mAssetQty": "10000000000000000000", + "bAssetQtys": [ + "4020838191929381969", + "503547983250508193", + "5536512591064029155" + ], + "redemptionFee": "3000000000000000" + }, + { + "mAssetQty": "100000000000000000000", + "bAssetQtys": [ + "40208381919293819699", + "5035479832505081941", + "55365125910640291565" + ], + "redemptionFee": "30000000000000000" + }, + { + "mAssetQty": "699200000000000050331648", + "bAssetQtys": [ + "281137006379702407582180", + "35208074988875535475552", + "387112960367196946497444" + ], + "redemptionFee": "209760000000000015099" + }, + { + "mAssetQty": "1398400000000000100663296", + "bAssetQtys": [ + "562274012759404815164362", + "70416149977751070951106", + "774225920734393892994889" + ], + "redemptionFee": "419520000000000030198" + }, + { + "mAssetQty": "2097600000000000016777216", + "bAssetQtys": [ + "843411019139107168779767", + "105624224966626599668153", + "1161338881101590765182520" + ], + "redemptionFee": "629280000000000005033" + }, + { + "mAssetQty": "2796800000000000201326592", + "bAssetQtys": [ + "1124548025518809630328725", + "140832299955502141902213", + "1548451841468787785989780" + ], + "redemptionFee": "839040000000000060397" + }, + { + "mAssetQty": "3496000000000000117440512", + "bAssetQtys": [ + "1405685031898511983944130", + "176040374944377670619260", + "1935564801835984658177411" + ], + "redemptionFee": "1048800000000000035232" + }, + { + "mAssetQty": "4195200000000000033554432", + "bAssetQtys": [ + "1686822038278214337559535", + "211248449933253199336307", + "2322677762203181530365042" + ], + "redemptionFee": "1258560000000000010066" + }, + { + "mAssetQty": "4894399999999999949668352", + "bAssetQtys": [ + "1967959044657916691174940", + "246456524922128728053354", + "2709790722570378402552673" + ], + "redemptionFee": "1468319999999999984900" + }, + { + "mAssetQty": "5593600000000000402653184", + "bAssetQtys": [ + "2249096051037619260657451", + "281664599911004283804427", + "3096903682937575571979561" + ], + "redemptionFee": "1678080000000000120795" + }, + { + "mAssetQty": "6292799999999999781896192", + "bAssetQtys": [ + "2530233057417321398405750", + "316872674899879785487448", + "3484016643304772146927935" + ], + "redemptionFee": "1887839999999999934568" + }, + { + "mAssetQty": "6992000000000000234881024", + "bAssetQtys": [ + "2811370063797023967888261", + "352080749888755341238521", + "3871129603671969316354823" + ], + "redemptionFee": "2097600000000000070464" + } + ] + }, + { + "reserve0": "3996499999999999360000000", + "reserve1": "3996499999999999360000000", + "reserve2": "2007000000000000960000000", + "A": 120, + "mAssetSupply": "9995726520619110731126433", + "hardMin": 50000000000000000, + "hardMax": 750000000000000000, + "redemptionFeeRate": 300000000000000, + "redeems": [ + { + "mAssetQty": "10000000000000", + "bAssetQtys": [ + "3997009163623", + "3997009163623", + "2007255696582" + ], + "redemptionFee": "3000000000" + }, + { + "mAssetQty": "1000000000000000", + "bAssetQtys": [ + "399700916362458", + "399700916362458", + "200725569658314" + ], + "redemptionFee": "300000000000" + }, + { + "mAssetQty": "100000000000000000", + "bAssetQtys": [ + "39970091636245967", + "39970091636245967", + "20072556965831529" + ], + "redemptionFee": "30000000000000" + }, + { + "mAssetQty": "1000000000000000000", + "bAssetQtys": [ + "399700916362459686", + "399700916362459686", + "200725569658315301" + ], + "redemptionFee": "300000000000000" + }, + { + "mAssetQty": "10000000000000000000", + "bAssetQtys": [ + "3997009163624596876", + "3997009163624596876", + "2007255696583153021" + ], + "redemptionFee": "3000000000000000" + }, + { + "mAssetQty": "100000000000000000000", + "bAssetQtys": [ + "39970091636245968777", + "39970091636245968777", + "20072556965831530227" + ], + "redemptionFee": "30000000000000000" + }, + { + "mAssetQty": "699200000000000050331648", + "bAssetQtys": [ + "279470880720631833817400", + "279470880720631833817400", + "140347318305094069457237" + ], + "redemptionFee": "209760000000000015099" + }, + { + "mAssetQty": "1398400000000000100663296", + "bAssetQtys": [ + "558941761441263667634802", + "558941761441263667634802", + "280694636610188138914476" + ], + "redemptionFee": "419520000000000030198" + }, + { + "mAssetQty": "2097600000000000016777216", + "bAssetQtys": [ + "838412642161895447805254", + "838412642161895447805254", + "421041954915282181430785" + ], + "redemptionFee": "629280000000000005033" + }, + { + "mAssetQty": "2796800000000000201326592", + "bAssetQtys": [ + "1117883522882527335269605", + "1117883522882527335269605", + "561389273220376277828953" + ], + "redemptionFee": "839040000000000060397" + }, + { + "mAssetQty": "3496000000000000117440512", + "bAssetQtys": [ + "1397354403603159115440058", + "1397354403603159115440058", + "701736591525470320345262" + ], + "redemptionFee": "1048800000000000035232" + }, + { + "mAssetQty": "4195200000000000033554432", + "bAssetQtys": [ + "1676825284323790895610510", + "1676825284323790895610510", + "842083909830564362861571" + ], + "redemptionFee": "1258560000000000010066" + }, + { + "mAssetQty": "4894399999999999949668352", + "bAssetQtys": [ + "1956296165044422675780963", + "1956296165044422675780963", + "982431228135658405377879" + ], + "redemptionFee": "1468319999999999984900" + }, + { + "mAssetQty": "5593600000000000402653184", + "bAssetQtys": [ + "2235767045765054670539212", + "2235767045765054670539212", + "1122778546440752555657908" + ], + "redemptionFee": "1678080000000000120795" + }, + { + "mAssetQty": "6292799999999999781896192", + "bAssetQtys": [ + "2515237926485686236121869", + "2515237926485686236121869", + "1263125864745846490410497" + ], + "redemptionFee": "1887839999999999934568" + }, + { + "mAssetQty": "6992000000000000234881024", + "bAssetQtys": [ + "2794708807206318230880117", + "2794708807206318230880117", + "1403473183050940640690525" + ], + "redemptionFee": "2097600000000000070464" + }, + { + "mAssetQty": "10000000000000", + "bAssetQtys": [ + "3997009163623", + "3997009163623", + "2007255696582" + ], + "redemptionFee": "3000000000" + }, + { + "mAssetQty": "1000000000000000", + "bAssetQtys": [ + "399700916362458", + "399700916362458", + "200725569658314" + ], + "redemptionFee": "300000000000" + }, + { + "mAssetQty": "100000000000000000", + "bAssetQtys": [ + "39970091636245967", + "39970091636245967", + "20072556965831529" + ], + "redemptionFee": "30000000000000" + }, + { + "mAssetQty": "1000000000000000000", + "bAssetQtys": [ + "399700916362459686", + "399700916362459686", + "200725569658315301" + ], + "redemptionFee": "300000000000000" + }, + { + "mAssetQty": "10000000000000000000", + "bAssetQtys": [ + "3997009163624596876", + "3997009163624596876", + "2007255696583153021" + ], + "redemptionFee": "3000000000000000" + }, + { + "mAssetQty": "100000000000000000000", + "bAssetQtys": [ + "39970091636245968777", + "39970091636245968777", + "20072556965831530227" + ], + "redemptionFee": "30000000000000000" + }, + { + "mAssetQty": "699200000000000050331648", + "bAssetQtys": [ + "279470880720631833817400", + "279470880720631833817400", + "140347318305094069457237" + ], + "redemptionFee": "209760000000000015099" + }, + { + "mAssetQty": "1398400000000000100663296", + "bAssetQtys": [ + "558941761441263667634802", + "558941761441263667634802", + "280694636610188138914476" + ], + "redemptionFee": "419520000000000030198" + }, + { + "mAssetQty": "2097600000000000016777216", + "bAssetQtys": [ + "838412642161895447805254", + "838412642161895447805254", + "421041954915282181430785" + ], + "redemptionFee": "629280000000000005033" + }, + { + "mAssetQty": "2796800000000000201326592", + "bAssetQtys": [ + "1117883522882527335269605", + "1117883522882527335269605", + "561389273220376277828953" + ], + "redemptionFee": "839040000000000060397" + }, + { + "mAssetQty": "3496000000000000117440512", + "bAssetQtys": [ + "1397354403603159115440058", + "1397354403603159115440058", + "701736591525470320345262" + ], + "redemptionFee": "1048800000000000035232" + }, + { + "mAssetQty": "4195200000000000033554432", + "bAssetQtys": [ + "1676825284323790895610510", + "1676825284323790895610510", + "842083909830564362861571" + ], + "redemptionFee": "1258560000000000010066" + }, + { + "mAssetQty": "4894399999999999949668352", + "bAssetQtys": [ + "1956296165044422675780963", + "1956296165044422675780963", + "982431228135658405377879" + ], + "redemptionFee": "1468319999999999984900" + }, + { + "mAssetQty": "5593600000000000402653184", + "bAssetQtys": [ + "2235767045765054670539212", + "2235767045765054670539212", + "1122778546440752555657908" + ], + "redemptionFee": "1678080000000000120795" + }, + { + "mAssetQty": "6292799999999999781896192", + "bAssetQtys": [ + "2515237926485686236121869", + "2515237926485686236121869", + "1263125864745846490410497" + ], + "redemptionFee": "1887839999999999934568" + }, + { + "mAssetQty": "6992000000000000234881024", + "bAssetQtys": [ + "2794708807206318230880117", + "2794708807206318230880117", + "1403473183050940640690525" + ], + "redemptionFee": "2097600000000000070464" + }, + { + "mAssetQty": "10000000000000", + "bAssetQtys": [ + "3997009163623", + "3997009163623", + "2007255696582" + ], + "redemptionFee": "3000000000" + }, + { + "mAssetQty": "1000000000000000", + "bAssetQtys": [ + "399700916362458", + "399700916362458", + "200725569658314" + ], + "redemptionFee": "300000000000" + }, + { + "mAssetQty": "100000000000000000", + "bAssetQtys": [ + "39970091636245967", + "39970091636245967", + "20072556965831529" + ], + "redemptionFee": "30000000000000" + }, + { + "mAssetQty": "1000000000000000000", + "bAssetQtys": [ + "399700916362459686", + "399700916362459686", + "200725569658315301" + ], + "redemptionFee": "300000000000000" + }, + { + "mAssetQty": "10000000000000000000", + "bAssetQtys": [ + "3997009163624596876", + "3997009163624596876", + "2007255696583153021" + ], + "redemptionFee": "3000000000000000" + }, + { + "mAssetQty": "100000000000000000000", + "bAssetQtys": [ + "39970091636245968777", + "39970091636245968777", + "20072556965831530227" + ], + "redemptionFee": "30000000000000000" + }, + { + "mAssetQty": "699200000000000050331648", + "bAssetQtys": [ + "279470880720631833817400", + "279470880720631833817400", + "140347318305094069457237" + ], + "redemptionFee": "209760000000000015099" + }, + { + "mAssetQty": "1398400000000000100663296", + "bAssetQtys": [ + "558941761441263667634802", + "558941761441263667634802", + "280694636610188138914476" + ], + "redemptionFee": "419520000000000030198" + }, + { + "mAssetQty": "2097600000000000016777216", + "bAssetQtys": [ + "838412642161895447805254", + "838412642161895447805254", + "421041954915282181430785" + ], + "redemptionFee": "629280000000000005033" + }, + { + "mAssetQty": "2796800000000000201326592", + "bAssetQtys": [ + "1117883522882527335269605", + "1117883522882527335269605", + "561389273220376277828953" + ], + "redemptionFee": "839040000000000060397" + }, + { + "mAssetQty": "3496000000000000117440512", + "bAssetQtys": [ + "1397354403603159115440058", + "1397354403603159115440058", + "701736591525470320345262" + ], + "redemptionFee": "1048800000000000035232" + }, + { + "mAssetQty": "4195200000000000033554432", + "bAssetQtys": [ + "1676825284323790895610510", + "1676825284323790895610510", + "842083909830564362861571" + ], + "redemptionFee": "1258560000000000010066" + }, + { + "mAssetQty": "4894399999999999949668352", + "bAssetQtys": [ + "1956296165044422675780963", + "1956296165044422675780963", + "982431228135658405377879" + ], + "redemptionFee": "1468319999999999984900" + }, + { + "mAssetQty": "5593600000000000402653184", + "bAssetQtys": [ + "2235767045765054670539212", + "2235767045765054670539212", + "1122778546440752555657908" + ], + "redemptionFee": "1678080000000000120795" + }, + { + "mAssetQty": "6292799999999999781896192", + "bAssetQtys": [ + "2515237926485686236121869", + "2515237926485686236121869", + "1263125864745846490410497" + ], + "redemptionFee": "1887839999999999934568" + }, + { + "mAssetQty": "6992000000000000234881024", + "bAssetQtys": [ + "2794708807206318230880117", + "2794708807206318230880117", + "1403473183050940640690525" + ], + "redemptionFee": "2097600000000000070464" + } + ] + }, + { + "reserve0": "7492500000000000000000000", + "reserve1": "500500000000000000000000", + "reserve2": "2007000000000000000000000", + "A": 120, + "mAssetSupply": "9896372713490403790662354", + "hardMin": 50000000000000000, + "hardMax": 750000000000000000, + "redemptionFeeRate": 300000000000000, + "redeems": [ + { + "mAssetQty": "10000000000000", + "bAssetQtys": [ + "7568684473442", + "505589132993", + "2027407372464" + ], + "redemptionFee": "3000000000" + }, + { + "mAssetQty": "1000000000000000", + "bAssetQtys": [ + "756868447344301", + "50558913299408", + "202740737246580" + ], + "redemptionFee": "300000000000" + }, + { + "mAssetQty": "100000000000000000", + "bAssetQtys": [ + "75686844734430211", + "5055891329940916", + "20274073724658181" + ], + "redemptionFee": "30000000000000" + }, + { + "mAssetQty": "1000000000000000000", + "bAssetQtys": [ + "756868447344302121", + "50558913299409169", + "202740737246581828" + ], + "redemptionFee": "300000000000000" + }, + { + "mAssetQty": "10000000000000000000", + "bAssetQtys": [ + "7568684473443021227", + "505589132994091707", + "2027407372465818297" + ], + "redemptionFee": "3000000000000000" + }, + { + "mAssetQty": "100000000000000000000", + "bAssetQtys": [ + "75686844734430212281", + "5055891329940917082", + "20274073724658182988" + ], + "redemptionFee": "30000000000000000" + }, + { + "mAssetQty": "699200000000000050331648", + "bAssetQtys": [ + "529202418383136082376241", + "35350792178946894792032", + "141756323482810025669551" + ], + "redemptionFee": "209760000000000015099" + }, + { + "mAssetQty": "1398400000000000100663296", + "bAssetQtys": [ + "1058404836766272164752484", + "70701584357893789584065", + "283512646965620051339103" + ], + "redemptionFee": "419520000000000030198" + }, + { + "mAssetQty": "2097600000000000016777216", + "bAssetQtys": [ + "1587607255149408145543562", + "106052376536840677590196", + "425268970448430049797253" + ], + "redemptionFee": "629280000000000005033" + }, + { + "mAssetQty": "2796800000000000201326592", + "bAssetQtys": [ + "2116809673532544329504969", + "141403168715787579168132", + "567025293931240102678207" + ], + "redemptionFee": "839040000000000060397" + }, + { + "mAssetQty": "3496000000000000117440512", + "bAssetQtys": [ + "2646012091915680310296047", + "176753960894734467174262", + "708781617414050101136357" + ], + "redemptionFee": "1048800000000000035232" + }, + { + "mAssetQty": "4195200000000000033554432", + "bAssetQtys": [ + "3175214510298816291087126", + "212104753073681355180393", + "850537940896860099594508" + ], + "redemptionFee": "1258560000000000010066" + }, + { + "mAssetQty": "4894399999999999949668352", + "bAssetQtys": [ + "3704416928681952271878205", + "247455545252628243186524", + "992294264379670098052659" + ], + "redemptionFee": "1468319999999999984900" + }, + { + "mAssetQty": "5593600000000000402653184", + "bAssetQtys": [ + "4233619347065088659009938", + "282806337431575158336265", + "1134050587862480205356415" + ], + "redemptionFee": "1678080000000000120795" + }, + { + "mAssetQty": "6292799999999999781896192", + "bAssetQtys": [ + "4762821765448224233460363", + "318157129610522019198786", + "1275806911345290094968961" + ], + "redemptionFee": "1887839999999999934568" + }, + { + "mAssetQty": "6992000000000000234881024", + "bAssetQtys": [ + "5292024183831360620592095", + "353507921789468934348526", + "1417563234828100202272716" + ], + "redemptionFee": "2097600000000000070464" + }, + { + "mAssetQty": "10000000000000", + "bAssetQtys": [ + "7568684473442", + "505589132993", + "2027407372464" + ], + "redemptionFee": "3000000000" + }, + { + "mAssetQty": "1000000000000000", + "bAssetQtys": [ + "756868447344301", + "50558913299408", + "202740737246580" + ], + "redemptionFee": "300000000000" + }, + { + "mAssetQty": "100000000000000000", + "bAssetQtys": [ + "75686844734430211", + "5055891329940916", + "20274073724658181" + ], + "redemptionFee": "30000000000000" + }, + { + "mAssetQty": "1000000000000000000", + "bAssetQtys": [ + "756868447344302121", + "50558913299409169", + "202740737246581828" + ], + "redemptionFee": "300000000000000" + }, + { + "mAssetQty": "10000000000000000000", + "bAssetQtys": [ + "7568684473443021227", + "505589132994091707", + "2027407372465818297" + ], + "redemptionFee": "3000000000000000" + }, + { + "mAssetQty": "100000000000000000000", + "bAssetQtys": [ + "75686844734430212281", + "5055891329940917082", + "20274073724658182988" + ], + "redemptionFee": "30000000000000000" + }, + { + "mAssetQty": "699200000000000050331648", + "bAssetQtys": [ + "529202418383136082376241", + "35350792178946894792032", + "141756323482810025669551" + ], + "redemptionFee": "209760000000000015099" + }, + { + "mAssetQty": "1398400000000000100663296", + "bAssetQtys": [ + "1058404836766272164752484", + "70701584357893789584065", + "283512646965620051339103" + ], + "redemptionFee": "419520000000000030198" + }, + { + "mAssetQty": "2097600000000000016777216", + "bAssetQtys": [ + "1587607255149408145543562", + "106052376536840677590196", + "425268970448430049797253" + ], + "redemptionFee": "629280000000000005033" + }, + { + "mAssetQty": "2796800000000000201326592", + "bAssetQtys": [ + "2116809673532544329504969", + "141403168715787579168132", + "567025293931240102678207" + ], + "redemptionFee": "839040000000000060397" + }, + { + "mAssetQty": "3496000000000000117440512", + "bAssetQtys": [ + "2646012091915680310296047", + "176753960894734467174262", + "708781617414050101136357" + ], + "redemptionFee": "1048800000000000035232" + }, + { + "mAssetQty": "4195200000000000033554432", + "bAssetQtys": [ + "3175214510298816291087126", + "212104753073681355180393", + "850537940896860099594508" + ], + "redemptionFee": "1258560000000000010066" + }, + { + "mAssetQty": "4894399999999999949668352", + "bAssetQtys": [ + "3704416928681952271878205", + "247455545252628243186524", + "992294264379670098052659" + ], + "redemptionFee": "1468319999999999984900" + }, + { + "mAssetQty": "5593600000000000402653184", + "bAssetQtys": [ + "4233619347065088659009938", + "282806337431575158336265", + "1134050587862480205356415" + ], + "redemptionFee": "1678080000000000120795" + }, + { + "mAssetQty": "6292799999999999781896192", + "bAssetQtys": [ + "4762821765448224233460363", + "318157129610522019198786", + "1275806911345290094968961" + ], + "redemptionFee": "1887839999999999934568" + }, + { + "mAssetQty": "6992000000000000234881024", + "bAssetQtys": [ + "5292024183831360620592095", + "353507921789468934348526", + "1417563234828100202272716" + ], + "redemptionFee": "2097600000000000070464" + }, + { + "mAssetQty": "10000000000000", + "bAssetQtys": [ + "7568684473442", + "505589132993", + "2027407372464" + ], + "redemptionFee": "3000000000" + }, + { + "mAssetQty": "1000000000000000", + "bAssetQtys": [ + "756868447344301", + "50558913299408", + "202740737246580" + ], + "redemptionFee": "300000000000" + }, + { + "mAssetQty": "100000000000000000", + "bAssetQtys": [ + "75686844734430211", + "5055891329940916", + "20274073724658181" + ], + "redemptionFee": "30000000000000" + }, + { + "mAssetQty": "1000000000000000000", + "bAssetQtys": [ + "756868447344302121", + "50558913299409169", + "202740737246581828" + ], + "redemptionFee": "300000000000000" + }, + { + "mAssetQty": "10000000000000000000", + "bAssetQtys": [ + "7568684473443021227", + "505589132994091707", + "2027407372465818297" + ], + "redemptionFee": "3000000000000000" + }, + { + "mAssetQty": "100000000000000000000", + "bAssetQtys": [ + "75686844734430212281", + "5055891329940917082", + "20274073724658182988" + ], + "redemptionFee": "30000000000000000" + }, + { + "mAssetQty": "699200000000000050331648", + "bAssetQtys": [ + "529202418383136082376241", + "35350792178946894792032", + "141756323482810025669551" + ], + "redemptionFee": "209760000000000015099" + }, + { + "mAssetQty": "1398400000000000100663296", + "bAssetQtys": [ + "1058404836766272164752484", + "70701584357893789584065", + "283512646965620051339103" + ], + "redemptionFee": "419520000000000030198" + }, + { + "mAssetQty": "2097600000000000016777216", + "bAssetQtys": [ + "1587607255149408145543562", + "106052376536840677590196", + "425268970448430049797253" + ], + "redemptionFee": "629280000000000005033" + }, + { + "mAssetQty": "2796800000000000201326592", + "bAssetQtys": [ + "2116809673532544329504969", + "141403168715787579168132", + "567025293931240102678207" + ], + "redemptionFee": "839040000000000060397" + }, + { + "mAssetQty": "3496000000000000117440512", + "bAssetQtys": [ + "2646012091915680310296047", + "176753960894734467174262", + "708781617414050101136357" + ], + "redemptionFee": "1048800000000000035232" + }, + { + "mAssetQty": "4195200000000000033554432", + "bAssetQtys": [ + "3175214510298816291087126", + "212104753073681355180393", + "850537940896860099594508" + ], + "redemptionFee": "1258560000000000010066" + }, + { + "mAssetQty": "4894399999999999949668352", + "bAssetQtys": [ + "3704416928681952271878205", + "247455545252628243186524", + "992294264379670098052659" + ], + "redemptionFee": "1468319999999999984900" + }, + { + "mAssetQty": "5593600000000000402653184", + "bAssetQtys": [ + "4233619347065088659009938", + "282806337431575158336265", + "1134050587862480205356415" + ], + "redemptionFee": "1678080000000000120795" + }, + { + "mAssetQty": "6292799999999999781896192", + "bAssetQtys": [ + "4762821765448224233460363", + "318157129610522019198786", + "1275806911345290094968961" + ], + "redemptionFee": "1887839999999999934568" + }, + { + "mAssetQty": "6992000000000000234881024", + "bAssetQtys": [ + "5292024183831360620592095", + "353507921789468934348526", + "1417563234828100202272716" + ], + "redemptionFee": "2097600000000000070464" + } + ] + } +] \ No newline at end of file diff --git a/test-utils/validator-data/full/redeemTestData.json b/test-utils/validator-data/full/redeemTestData.json new file mode 100644 index 00000000..8ec6eb39 --- /dev/null +++ b/test-utils/validator-data/full/redeemTestData.json @@ -0,0 +1,4622 @@ +[ + { + "reserve0": "5503000000000000000000000", + "reserve1": "500500000000000000000000", + "reserve2": "3996499999999999360000000", + "A": 120, + "mAssetSupply": "9936488013915504712820075", + "hardMin": 50000000000000000, + "hardMax": 750000000000000000, + "swapFeeRate": 600000000000000, + "redeems": [ + { + "bAssetIndex": 0, + "mAssetQty": "10000000000000", + "outputQty": "10164507628712", + "swapFee": "6000000000", + "priceReceived": 0.9838154847513411 + }, + { + "bAssetIndex": 0, + "mAssetQty": "1000000000000000", + "outputQty": "1016450762869405", + "swapFee": "600000000000", + "priceReceived": 0.9838154847530783 + }, + { + "bAssetIndex": 0, + "mAssetQty": "100000000000000000", + "outputQty": "101645076268747784", + "swapFee": "60000000000000", + "priceReceived": 0.9838154849291644 + }, + { + "bAssetIndex": 0, + "mAssetQty": "1000000000000000000", + "outputQty": "1016450761033593659", + "swapFee": "600000000000000", + "priceReceived": 0.9838154865299471 + }, + { + "bAssetIndex": 0, + "mAssetQty": "10000000000000000000", + "outputQty": "10164507444947540299", + "swapFee": "6000000000000000", + "priceReceived": 0.9838155025377731 + }, + { + "bAssetIndex": 0, + "mAssetQty": "100000000000000000000", + "outputQty": "101645057910657481556", + "swapFee": "60000000000000000", + "priceReceived": 0.9838156626158506 + }, + { + "bAssetIndex": 0, + "mAssetQty": "699200000000000050331648", + "outputQty": "709811194731357498535926", + "swapFee": "419520000000000030198", + "priceReceived": 0.9850506799412012 + }, + { + "bAssetIndex": 0, + "mAssetQty": "1398400000000000100663296", + "outputQty": "1417856802946775499008223", + "swapFee": "839040000000000060397", + "priceReceived": 0.9862773145311023 + }, + { + "bAssetIndex": 0, + "mAssetQty": "2097600000000000016777216", + "outputQty": "2124117621986889874550225", + "swapFee": "1258560000000000010066", + "priceReceived": 0.987515935222982 + }, + { + "bAssetIndex": 0, + "mAssetQty": "2796800000000000201326592", + "outputQty": "2828453206635174009338277", + "swapFee": "1678080000000000120795", + "priceReceived": 0.9888090046669609 + }, + { + "bAssetIndex": 0, + "mAssetQty": "3496000000000000117440512", + "outputQty": "3530389470952646920936233", + "swapFee": "2097600000000000070464", + "priceReceived": 0.9902590149796229 + }, + { + "bAssetIndex": 0, + "mAssetQty": "4195200000000000033554432", + "outputQty": "4228234336159812906095991", + "swapFee": "2517120000000000020132", + "priceReceived": 0.9921872030891704 + }, + { + "bAssetIndex": 0, + "mAssetQty": "4894399999999999949668352", + "hardLimitError": true + }, + { + "bAssetIndex": 0, + "mAssetQty": "5593600000000000402653184", + "hardLimitError": true + }, + { + "bAssetIndex": 0, + "mAssetQty": "6292799999999999781896192", + "hardLimitError": true + }, + { + "bAssetIndex": 0, + "mAssetQty": "6992000000000000234881024", + "hardLimitError": true + }, + { + "bAssetIndex": 1, + "mAssetQty": "10000000000000", + "outputQty": "8741464880681", + "swapFee": "6000000000", + "priceReceived": 1.1439730224279017 + }, + { + "bAssetIndex": 1, + "mAssetQty": "1000000000000000", + "outputQty": "874146487884345", + "swapFee": "600000000000", + "priceReceived": 1.143973022668377 + }, + { + "bAssetIndex": 1, + "mAssetQty": "100000000000000000", + "outputQty": "87414646950531602", + "swapFee": "60000000000000", + "priceReceived": 1.14397304672054 + }, + { + "bAssetIndex": 1, + "mAssetQty": "1000000000000000000", + "outputQty": "874146302423016603", + "swapFee": "600000000000000", + "priceReceived": 1.1439732653768984 + }, + { + "bAssetIndex": 1, + "mAssetQty": "10000000000000000000", + "outputQty": "8741446315790339457", + "swapFee": "6000000000000000", + "priceReceived": 1.143975451972546 + }, + { + "bAssetIndex": 1, + "mAssetQty": "100000000000000000000", + "outputQty": "87412792104014619454", + "swapFee": "60000000000000000", + "priceReceived": 1.1439973211358763 + }, + { + "bAssetIndex": 1, + "mAssetQty": "699200000000000050331648", + "hardLimitError": true + }, + { + "bAssetIndex": 1, + "mAssetQty": "1398400000000000100663296", + "hardLimitError": true + }, + { + "bAssetIndex": 1, + "mAssetQty": "2097600000000000016777216", + "hardLimitError": true + }, + { + "bAssetIndex": 1, + "mAssetQty": "2796800000000000201326592", + "hardLimitError": true + }, + { + "bAssetIndex": 1, + "mAssetQty": "3496000000000000117440512", + "hardLimitError": true + }, + { + "bAssetIndex": 1, + "mAssetQty": "4195200000000000033554432", + "hardLimitError": true + }, + { + "bAssetIndex": 1, + "mAssetQty": "4894399999999999949668352", + "hardLimitError": true + }, + { + "bAssetIndex": 1, + "mAssetQty": "5593600000000000402653184", + "hardLimitError": true + }, + { + "bAssetIndex": 1, + "mAssetQty": "6292799999999999781896192", + "hardLimitError": true + }, + { + "bAssetIndex": 1, + "mAssetQty": "6992000000000000234881024", + "hardLimitError": true + }, + { + "bAssetIndex": 2, + "mAssetQty": "10000000000000", + "outputQty": "10102482433971", + "swapFee": "6000000000", + "priceReceived": 0.9898557176772326 + }, + { + "bAssetIndex": 2, + "mAssetQty": "1000000000000000", + "outputQty": "1010248243395131", + "swapFee": "600000000000", + "priceReceived": 0.9898557176791619 + }, + { + "bAssetIndex": 2, + "mAssetQty": "100000000000000000", + "outputQty": "101024824319319536", + "swapFee": "60000000000000", + "priceReceived": 0.9898557178770213 + }, + { + "bAssetIndex": 2, + "mAssetQty": "1000000000000000000", + "outputQty": "1010248241357415368", + "swapFee": "600000000000000", + "priceReceived": 0.9898557196757449 + }, + { + "bAssetIndex": 2, + "mAssetQty": "10000000000000000000", + "outputQty": "10102482229996021343", + "swapFee": "6000000000000000", + "priceReceived": 0.989855737662994 + }, + { + "bAssetIndex": 2, + "mAssetQty": "100000000000000000000", + "outputQty": "101024803942014778472", + "swapFee": "60000000000000000", + "priceReceived": 0.9898559175368161 + }, + { + "bAssetIndex": 2, + "mAssetQty": "699200000000000050331648", + "outputQty": "705304582913346103367752", + "swapFee": "419520000000000030198", + "priceReceived": 0.9913447564906919 + }, + { + "bAssetIndex": 2, + "mAssetQty": "1398400000000000100663296", + "outputQty": "1408072410479239344834297", + "swapFee": "839040000000000060397", + "priceReceived": 0.9931307435560454 + }, + { + "bAssetIndex": 2, + "mAssetQty": "2097600000000000016777216", + "outputQty": "2106940933929894641926187", + "swapFee": "1258560000000000010066", + "priceReceived": 0.9955665895614493 + }, + { + "bAssetIndex": 2, + "mAssetQty": "2796800000000000201326592", + "hardLimitError": true + }, + { + "bAssetIndex": 2, + "mAssetQty": "3496000000000000117440512", + "hardLimitError": true + }, + { + "bAssetIndex": 2, + "mAssetQty": "4195200000000000033554432", + "hardLimitError": true + }, + { + "bAssetIndex": 2, + "mAssetQty": "4894399999999999949668352", + "hardLimitError": true + }, + { + "bAssetIndex": 2, + "mAssetQty": "5593600000000000402653184", + "hardLimitError": true + }, + { + "bAssetIndex": 2, + "mAssetQty": "6292799999999999781896192", + "hardLimitError": true + }, + { + "bAssetIndex": 2, + "mAssetQty": "6992000000000000234881024", + "hardLimitError": true + } + ] + }, + { + "reserve0": "2007000000000000000000000", + "reserve1": "500500000000000000000000", + "reserve2": "7492500000000000000000000", + "A": 120, + "mAssetSupply": "9896372713490403790662354", + "hardMin": 50000000000000000, + "hardMax": 750000000000000000, + "swapFeeRate": 600000000000000, + "redeems": [ + { + "bAssetIndex": 0, + "mAssetQty": "10000000000000", + "outputQty": "9852235534025", + "swapFee": "6000000000", + "priceReceived": 1.0149980646995995 + }, + { + "bAssetIndex": 0, + "mAssetQty": "1000000000000000", + "outputQty": "985223553389812", + "swapFee": "600000000000", + "priceReceived": 1.0149980647126708 + }, + { + "bAssetIndex": 0, + "mAssetQty": "100000000000000000", + "outputQty": "98522355212417833", + "swapFee": "60000000000000", + "priceReceived": 1.0149980660165534 + }, + { + "bAssetIndex": 0, + "mAssetQty": "1000000000000000000", + "outputQty": "985223540618413979", + "swapFee": "600000000000000", + "priceReceived": 1.0149980778700345 + }, + { + "bAssetIndex": 0, + "mAssetQty": "10000000000000000000", + "outputQty": "9852234255602968696", + "swapFee": "6000000000000000", + "priceReceived": 1.014998196405348 + }, + { + "bAssetIndex": 0, + "mAssetQty": "100000000000000000000", + "outputQty": "98522227493176110124", + "swapFee": "60000000000000000", + "priceReceived": 1.014999381808803 + }, + { + "bAssetIndex": 0, + "mAssetQty": "699200000000000050331648", + "hardLimitError": true + }, + { + "bAssetIndex": 0, + "mAssetQty": "1398400000000000100663296", + "hardLimitError": true + }, + { + "bAssetIndex": 0, + "mAssetQty": "2097600000000000016777216", + "hardLimitError": true + }, + { + "bAssetIndex": 0, + "mAssetQty": "2796800000000000201326592", + "hardLimitError": true + }, + { + "bAssetIndex": 0, + "mAssetQty": "3496000000000000117440512", + "hardLimitError": true + }, + { + "bAssetIndex": 0, + "mAssetQty": "4195200000000000033554432", + "hardLimitError": true + }, + { + "bAssetIndex": 0, + "mAssetQty": "4894399999999999949668352", + "hardLimitError": true + }, + { + "bAssetIndex": 0, + "mAssetQty": "5593600000000000402653184", + "hardLimitError": true + }, + { + "bAssetIndex": 0, + "mAssetQty": "6292799999999999781896192", + "hardLimitError": true + }, + { + "bAssetIndex": 0, + "mAssetQty": "6992000000000000234881024", + "hardLimitError": true + }, + { + "bAssetIndex": 1, + "mAssetQty": "10000000000000", + "outputQty": "8317044958106", + "swapFee": "6000000000", + "priceReceived": 1.202350119588298 + }, + { + "bAssetIndex": 1, + "mAssetQty": "1000000000000000", + "outputQty": "831704495589349", + "swapFee": "600000000000", + "priceReceived": 1.2023501199081486 + }, + { + "bAssetIndex": 1, + "mAssetQty": "100000000000000000", + "outputQty": "83170447346076645", + "swapFee": "60000000000000", + "priceReceived": 1.202350151898242 + }, + { + "bAssetIndex": 1, + "mAssetQty": "1000000000000000000", + "outputQty": "831704272291620904", + "swapFee": "600000000000000", + "priceReceived": 1.2023504427176603 + }, + { + "bAssetIndex": 1, + "mAssetQty": "10000000000000000000", + "outputQty": "8317022605791788171", + "swapFee": "6000000000000000", + "priceReceived": 1.202353350949921 + }, + { + "bAssetIndex": 1, + "mAssetQty": "100000000000000000000", + "outputQty": "83168214135594263901", + "swapFee": "60000000000000000", + "priceReceived": 1.2023824370806355 + }, + { + "bAssetIndex": 1, + "mAssetQty": "699200000000000050331648", + "hardLimitError": true + }, + { + "bAssetIndex": 1, + "mAssetQty": "1398400000000000100663296", + "hardLimitError": true + }, + { + "bAssetIndex": 1, + "mAssetQty": "2097600000000000016777216", + "hardLimitError": true + }, + { + "bAssetIndex": 1, + "mAssetQty": "2796800000000000201326592", + "hardLimitError": true + }, + { + "bAssetIndex": 1, + "mAssetQty": "3496000000000000117440512", + "hardLimitError": true + }, + { + "bAssetIndex": 1, + "mAssetQty": "4195200000000000033554432", + "hardLimitError": true + }, + { + "bAssetIndex": 1, + "mAssetQty": "4894399999999999949668352", + "hardLimitError": true + }, + { + "bAssetIndex": 1, + "mAssetQty": "5593600000000000402653184", + "hardLimitError": true + }, + { + "bAssetIndex": 1, + "mAssetQty": "6292799999999999781896192", + "hardLimitError": true + }, + { + "bAssetIndex": 1, + "mAssetQty": "6992000000000000234881024", + "hardLimitError": true + }, + { + "bAssetIndex": 2, + "mAssetQty": "10000000000000", + "outputQty": "10315364828795", + "swapFee": "6000000000", + "priceReceived": 0.969427661160886 + }, + { + "bAssetIndex": 2, + "mAssetQty": "1000000000000000", + "outputQty": "1031536482876419", + "swapFee": "600000000000", + "priceReceived": 0.9694276611637815 + }, + { + "bAssetIndex": 2, + "mAssetQty": "100000000000000000", + "outputQty": "103153648256347236", + "swapFee": "60000000000000", + "priceReceived": 0.9694276614578856 + }, + { + "bAssetIndex": 2, + "mAssetQty": "1000000000000000000", + "outputQty": "1031536479718505769", + "swapFee": "600000000000000", + "priceReceived": 0.9694276641315568 + }, + { + "bAssetIndex": 2, + "mAssetQty": "10000000000000000000", + "outputQty": "10315364512688477585", + "swapFee": "6000000000000000", + "priceReceived": 0.9694276908682614 + }, + { + "bAssetIndex": 2, + "mAssetQty": "100000000000000000000", + "outputQty": "103153616677305760855", + "swapFee": "60000000000000000", + "priceReceived": 0.9694279582346474 + }, + { + "bAssetIndex": 2, + "mAssetQty": "699200000000000050331648", + "outputQty": "719735295724774695853497", + "swapFee": "419520000000000030198", + "priceReceived": 0.9714682663935558 + }, + { + "bAssetIndex": 2, + "mAssetQty": "1398400000000000100663296", + "outputQty": "1436562510306433132366436", + "swapFee": "839040000000000060397", + "priceReceived": 0.9734348418306611 + }, + { + "bAssetIndex": 2, + "mAssetQty": "2097600000000000016777216", + "outputQty": "2150665089589668874928626", + "swapFee": "1258560000000000010066", + "priceReceived": 0.975326195674756 + }, + { + "bAssetIndex": 2, + "mAssetQty": "2796800000000000201326592", + "outputQty": "2862225880440749949280956", + "swapFee": "1678080000000000120795", + "priceReceived": 0.9771416082539667 + }, + { + "bAssetIndex": 2, + "mAssetQty": "3496000000000000117440512", + "outputQty": "3571424149396287304299315", + "swapFee": "2097600000000000070464", + "priceReceived": 0.9788812120204101 + }, + { + "bAssetIndex": 2, + "mAssetQty": "4195200000000000033554432", + "outputQty": "4278428870450291387040727", + "swapFee": "2517120000000000020132", + "priceReceived": 0.980546861249669 + }, + { + "bAssetIndex": 2, + "mAssetQty": "4894399999999999949668352", + "outputQty": "4983381031041406904758446", + "swapFee": "2936639999999999969801", + "priceReceived": 0.9821444456108924 + }, + { + "bAssetIndex": 2, + "mAssetQty": "5593600000000000402653184", + "outputQty": "5686335360077022575227123", + "swapFee": "3356160000000000241591", + "priceReceived": 0.9836915422315566 + }, + { + "bAssetIndex": 2, + "mAssetQty": "6292799999999999781896192", + "outputQty": "6386983946516870516850932", + "swapFee": "3775679999999999869137", + "priceReceived": 0.9852537680843501 + }, + { + "bAssetIndex": 2, + "mAssetQty": "6992000000000000234881024", + "outputQty": "7081669723679473743584718", + "swapFee": "4195200000000000140928", + "priceReceived": 0.9873377710090547 + } + ] + }, + { + "reserve0": "5503000000000000000000000", + "reserve1": "3996499999999999360000000", + "reserve2": "500500000000000000000000", + "A": 120, + "mAssetSupply": "9936488013915504712820075", + "hardMin": 50000000000000000, + "hardMax": 750000000000000000, + "swapFeeRate": 600000000000000, + "redeems": [ + { + "bAssetIndex": 0, + "mAssetQty": "10000000000000", + "outputQty": "10164507628712", + "swapFee": "6000000000", + "priceReceived": 0.9838154847513411 + }, + { + "bAssetIndex": 0, + "mAssetQty": "1000000000000000", + "outputQty": "1016450762869405", + "swapFee": "600000000000", + "priceReceived": 0.9838154847530783 + }, + { + "bAssetIndex": 0, + "mAssetQty": "100000000000000000", + "outputQty": "101645076268747784", + "swapFee": "60000000000000", + "priceReceived": 0.9838154849291644 + }, + { + "bAssetIndex": 0, + "mAssetQty": "1000000000000000000", + "outputQty": "1016450761033593659", + "swapFee": "600000000000000", + "priceReceived": 0.9838154865299471 + }, + { + "bAssetIndex": 0, + "mAssetQty": "10000000000000000000", + "outputQty": "10164507444947540299", + "swapFee": "6000000000000000", + "priceReceived": 0.9838155025377731 + }, + { + "bAssetIndex": 0, + "mAssetQty": "100000000000000000000", + "outputQty": "101645057910657481556", + "swapFee": "60000000000000000", + "priceReceived": 0.9838156626158506 + }, + { + "bAssetIndex": 0, + "mAssetQty": "699200000000000050331648", + "outputQty": "709811194731357498535926", + "swapFee": "419520000000000030198", + "priceReceived": 0.9850506799412012 + }, + { + "bAssetIndex": 0, + "mAssetQty": "1398400000000000100663296", + "outputQty": "1417856802946775499008223", + "swapFee": "839040000000000060397", + "priceReceived": 0.9862773145311023 + }, + { + "bAssetIndex": 0, + "mAssetQty": "2097600000000000016777216", + "outputQty": "2124117621986889874550225", + "swapFee": "1258560000000000010066", + "priceReceived": 0.987515935222982 + }, + { + "bAssetIndex": 0, + "mAssetQty": "2796800000000000201326592", + "outputQty": "2828453206635174009338277", + "swapFee": "1678080000000000120795", + "priceReceived": 0.9888090046669609 + }, + { + "bAssetIndex": 0, + "mAssetQty": "3496000000000000117440512", + "outputQty": "3530389470952646920936233", + "swapFee": "2097600000000000070464", + "priceReceived": 0.9902590149796229 + }, + { + "bAssetIndex": 0, + "mAssetQty": "4195200000000000033554432", + "outputQty": "4228234336159812906095991", + "swapFee": "2517120000000000020132", + "priceReceived": 0.9921872030891704 + }, + { + "bAssetIndex": 0, + "mAssetQty": "4894399999999999949668352", + "hardLimitError": true + }, + { + "bAssetIndex": 0, + "mAssetQty": "5593600000000000402653184", + "hardLimitError": true + }, + { + "bAssetIndex": 0, + "mAssetQty": "6292799999999999781896192", + "hardLimitError": true + }, + { + "bAssetIndex": 0, + "mAssetQty": "6992000000000000234881024", + "hardLimitError": true + }, + { + "bAssetIndex": 1, + "mAssetQty": "10000000000000", + "outputQty": "10102482433971", + "swapFee": "6000000000", + "priceReceived": 0.9898557176772326 + }, + { + "bAssetIndex": 1, + "mAssetQty": "1000000000000000", + "outputQty": "1010248243395131", + "swapFee": "600000000000", + "priceReceived": 0.9898557176791619 + }, + { + "bAssetIndex": 1, + "mAssetQty": "100000000000000000", + "outputQty": "101024824319319536", + "swapFee": "60000000000000", + "priceReceived": 0.9898557178770213 + }, + { + "bAssetIndex": 1, + "mAssetQty": "1000000000000000000", + "outputQty": "1010248241357415368", + "swapFee": "600000000000000", + "priceReceived": 0.9898557196757449 + }, + { + "bAssetIndex": 1, + "mAssetQty": "10000000000000000000", + "outputQty": "10102482229996021343", + "swapFee": "6000000000000000", + "priceReceived": 0.989855737662994 + }, + { + "bAssetIndex": 1, + "mAssetQty": "100000000000000000000", + "outputQty": "101024803942014778472", + "swapFee": "60000000000000000", + "priceReceived": 0.9898559175368161 + }, + { + "bAssetIndex": 1, + "mAssetQty": "699200000000000050331648", + "outputQty": "705304582913346103367752", + "swapFee": "419520000000000030198", + "priceReceived": 0.9913447564906919 + }, + { + "bAssetIndex": 1, + "mAssetQty": "1398400000000000100663296", + "outputQty": "1408072410479239344834297", + "swapFee": "839040000000000060397", + "priceReceived": 0.9931307435560454 + }, + { + "bAssetIndex": 1, + "mAssetQty": "2097600000000000016777216", + "outputQty": "2106940933929894641926187", + "swapFee": "1258560000000000010066", + "priceReceived": 0.9955665895614493 + }, + { + "bAssetIndex": 1, + "mAssetQty": "2796800000000000201326592", + "hardLimitError": true + }, + { + "bAssetIndex": 1, + "mAssetQty": "3496000000000000117440512", + "hardLimitError": true + }, + { + "bAssetIndex": 1, + "mAssetQty": "4195200000000000033554432", + "hardLimitError": true + }, + { + "bAssetIndex": 1, + "mAssetQty": "4894399999999999949668352", + "hardLimitError": true + }, + { + "bAssetIndex": 1, + "mAssetQty": "5593600000000000402653184", + "hardLimitError": true + }, + { + "bAssetIndex": 1, + "mAssetQty": "6292799999999999781896192", + "hardLimitError": true + }, + { + "bAssetIndex": 1, + "mAssetQty": "6992000000000000234881024", + "hardLimitError": true + }, + { + "bAssetIndex": 2, + "mAssetQty": "10000000000000", + "outputQty": "8741464880681", + "swapFee": "6000000000", + "priceReceived": 1.1439730224279017 + }, + { + "bAssetIndex": 2, + "mAssetQty": "1000000000000000", + "outputQty": "874146487884345", + "swapFee": "600000000000", + "priceReceived": 1.143973022668377 + }, + { + "bAssetIndex": 2, + "mAssetQty": "100000000000000000", + "outputQty": "87414646950531602", + "swapFee": "60000000000000", + "priceReceived": 1.14397304672054 + }, + { + "bAssetIndex": 2, + "mAssetQty": "1000000000000000000", + "outputQty": "874146302423016603", + "swapFee": "600000000000000", + "priceReceived": 1.1439732653768984 + }, + { + "bAssetIndex": 2, + "mAssetQty": "10000000000000000000", + "outputQty": "8741446315790339457", + "swapFee": "6000000000000000", + "priceReceived": 1.143975451972546 + }, + { + "bAssetIndex": 2, + "mAssetQty": "100000000000000000000", + "outputQty": "87412792104014619454", + "swapFee": "60000000000000000", + "priceReceived": 1.1439973211358763 + }, + { + "bAssetIndex": 2, + "mAssetQty": "699200000000000050331648", + "hardLimitError": true + }, + { + "bAssetIndex": 2, + "mAssetQty": "1398400000000000100663296", + "hardLimitError": true + }, + { + "bAssetIndex": 2, + "mAssetQty": "2097600000000000016777216", + "hardLimitError": true + }, + { + "bAssetIndex": 2, + "mAssetQty": "2796800000000000201326592", + "hardLimitError": true + }, + { + "bAssetIndex": 2, + "mAssetQty": "3496000000000000117440512", + "hardLimitError": true + }, + { + "bAssetIndex": 2, + "mAssetQty": "4195200000000000033554432", + "hardLimitError": true + }, + { + "bAssetIndex": 2, + "mAssetQty": "4894399999999999949668352", + "hardLimitError": true + }, + { + "bAssetIndex": 2, + "mAssetQty": "5593600000000000402653184", + "hardLimitError": true + }, + { + "bAssetIndex": 2, + "mAssetQty": "6292799999999999781896192", + "hardLimitError": true + }, + { + "bAssetIndex": 2, + "mAssetQty": "6992000000000000234881024", + "hardLimitError": true + } + ] + }, + { + "reserve0": "2007000000000000960000000", + "reserve1": "3996499999999999360000000", + "reserve2": "3996499999999999360000000", + "A": 120, + "mAssetSupply": "9995726520619110731126433", + "hardMin": 50000000000000000, + "hardMax": 750000000000000000, + "swapFeeRate": 600000000000000, + "redeems": [ + { + "bAssetIndex": 0, + "mAssetQty": "10000000000000", + "outputQty": "9935761590471", + "swapFee": "6000000000", + "priceReceived": 1.0064653734838613 + }, + { + "bAssetIndex": 0, + "mAssetQty": "1000000000000000", + "outputQty": "993576159043733", + "swapFee": "600000000000", + "priceReceived": 1.0064653734872722 + }, + { + "bAssetIndex": 0, + "mAssetQty": "100000000000000000", + "outputQty": "99357615870945108", + "swapFee": "60000000000000", + "priceReceived": 1.0064653738258904 + }, + { + "bAssetIndex": 0, + "mAssetQty": "1000000000000000000", + "outputQty": "993576155670517734", + "swapFee": "600000000000000", + "priceReceived": 1.0064653769042466 + }, + { + "bAssetIndex": 0, + "mAssetQty": "10000000000000000000", + "outputQty": "9935761252810493721", + "swapFee": "6000000000000000", + "priceReceived": 1.006465407687945 + }, + { + "bAssetIndex": 0, + "mAssetQty": "100000000000000000000", + "outputQty": "99357582137287342596", + "swapFee": "60000000000000000", + "priceReceived": 1.0064657155386993 + }, + { + "bAssetIndex": 0, + "mAssetQty": "699200000000000050331648", + "outputQty": "692277120953961843804569", + "swapFee": "419520000000000030198", + "priceReceived": 1.01000015577071 + }, + { + "bAssetIndex": 0, + "mAssetQty": "1398400000000000100663296", + "outputQty": "1370416125300544307124714", + "swapFee": "839040000000000060397", + "priceReceived": 1.0204199835238503 + }, + { + "bAssetIndex": 0, + "mAssetQty": "2097600000000000016777216", + "hardLimitError": true + }, + { + "bAssetIndex": 0, + "mAssetQty": "2796800000000000201326592", + "hardLimitError": true + }, + { + "bAssetIndex": 0, + "mAssetQty": "3496000000000000117440512", + "hardLimitError": true + }, + { + "bAssetIndex": 0, + "mAssetQty": "4195200000000000033554432", + "hardLimitError": true + }, + { + "bAssetIndex": 0, + "mAssetQty": "4894399999999999949668352", + "hardLimitError": true + }, + { + "bAssetIndex": 0, + "mAssetQty": "5593600000000000402653184", + "hardLimitError": true + }, + { + "bAssetIndex": 0, + "mAssetQty": "6292799999999999781896192", + "hardLimitError": true + }, + { + "bAssetIndex": 0, + "mAssetQty": "6992000000000000234881024", + "hardLimitError": true + }, + { + "bAssetIndex": 1, + "mAssetQty": "10000000000000", + "outputQty": "10014092705535", + "swapFee": "6000000000", + "priceReceived": 0.9985927126950591 + }, + { + "bAssetIndex": 1, + "mAssetQty": "1000000000000000", + "outputQty": "1001409270552820", + "swapFee": "600000000000", + "priceReceived": 0.9985927126957372 + }, + { + "bAssetIndex": 1, + "mAssetQty": "100000000000000000", + "outputQty": "100140927048184973", + "swapFee": "60000000000000", + "priceReceived": 0.998592712766508 + }, + { + "bAssetIndex": 1, + "mAssetQty": "1000000000000000000", + "outputQty": "1001409269836665323", + "swapFee": "600000000000000", + "priceReceived": 0.9985927134098777 + }, + { + "bAssetIndex": 1, + "mAssetQty": "10000000000000000000", + "outputQty": "10014092633848165782", + "swapFee": "6000000000000000", + "priceReceived": 0.99859271984358 + }, + { + "bAssetIndex": 1, + "mAssetQty": "100000000000000000000", + "outputQty": "100140919886586598600", + "swapFee": "60000000000000000", + "priceReceived": 0.9985927841810701 + }, + { + "bAssetIndex": 1, + "mAssetQty": "699200000000000050331648", + "outputQty": "699812492593522390954084", + "swapFee": "419520000000000030198", + "priceReceived": 0.9991247761364584 + }, + { + "bAssetIndex": 1, + "mAssetQty": "1398400000000000100663296", + "outputQty": "1398732791081049832328563", + "swapFee": "839040000000000060397", + "priceReceived": 0.9997620767288994 + }, + { + "bAssetIndex": 1, + "mAssetQty": "2097600000000000016777216", + "outputQty": "2096274676868418159589052", + "swapFee": "1258560000000000010066", + "priceReceived": 1.0006322278021131 + }, + { + "bAssetIndex": 1, + "mAssetQty": "2796800000000000201326592", + "outputQty": "2790798619219561685672826", + "swapFee": "1678080000000000120795", + "priceReceived": 1.0021504169950166 + }, + { + "bAssetIndex": 1, + "mAssetQty": "3496000000000000117440512", + "outputQty": "3472493299533946121231065", + "swapFee": "2097600000000000070464", + "priceReceived": 1.0067694012452693 + }, + { + "bAssetIndex": 1, + "mAssetQty": "4195200000000000033554432", + "hardLimitError": true + }, + { + "bAssetIndex": 1, + "mAssetQty": "4894399999999999949668352", + "hardLimitError": true + }, + { + "bAssetIndex": 1, + "mAssetQty": "5593600000000000402653184", + "hardLimitError": true + }, + { + "bAssetIndex": 1, + "mAssetQty": "6292799999999999781896192", + "hardLimitError": true + }, + { + "bAssetIndex": 1, + "mAssetQty": "6992000000000000234881024", + "hardLimitError": true + }, + { + "bAssetIndex": 2, + "mAssetQty": "10000000000000", + "outputQty": "10014092705535", + "swapFee": "6000000000", + "priceReceived": 0.9985927126950591 + }, + { + "bAssetIndex": 2, + "mAssetQty": "1000000000000000", + "outputQty": "1001409270552820", + "swapFee": "600000000000", + "priceReceived": 0.9985927126957372 + }, + { + "bAssetIndex": 2, + "mAssetQty": "100000000000000000", + "outputQty": "100140927048184973", + "swapFee": "60000000000000", + "priceReceived": 0.998592712766508 + }, + { + "bAssetIndex": 2, + "mAssetQty": "1000000000000000000", + "outputQty": "1001409269836665323", + "swapFee": "600000000000000", + "priceReceived": 0.9985927134098777 + }, + { + "bAssetIndex": 2, + "mAssetQty": "10000000000000000000", + "outputQty": "10014092633848165782", + "swapFee": "6000000000000000", + "priceReceived": 0.99859271984358 + }, + { + "bAssetIndex": 2, + "mAssetQty": "100000000000000000000", + "outputQty": "100140919886586598600", + "swapFee": "60000000000000000", + "priceReceived": 0.9985927841810701 + }, + { + "bAssetIndex": 2, + "mAssetQty": "699200000000000050331648", + "outputQty": "699812492593522390954084", + "swapFee": "419520000000000030198", + "priceReceived": 0.9991247761364584 + }, + { + "bAssetIndex": 2, + "mAssetQty": "1398400000000000100663296", + "outputQty": "1398732791081049832328563", + "swapFee": "839040000000000060397", + "priceReceived": 0.9997620767288994 + }, + { + "bAssetIndex": 2, + "mAssetQty": "2097600000000000016777216", + "outputQty": "2096274676868418159589052", + "swapFee": "1258560000000000010066", + "priceReceived": 1.0006322278021131 + }, + { + "bAssetIndex": 2, + "mAssetQty": "2796800000000000201326592", + "outputQty": "2790798619219561685672826", + "swapFee": "1678080000000000120795", + "priceReceived": 1.0021504169950166 + }, + { + "bAssetIndex": 2, + "mAssetQty": "3496000000000000117440512", + "outputQty": "3472493299533946121231065", + "swapFee": "2097600000000000070464", + "priceReceived": 1.0067694012452693 + }, + { + "bAssetIndex": 2, + "mAssetQty": "4195200000000000033554432", + "hardLimitError": true + }, + { + "bAssetIndex": 2, + "mAssetQty": "4894399999999999949668352", + "hardLimitError": true + }, + { + "bAssetIndex": 2, + "mAssetQty": "5593600000000000402653184", + "hardLimitError": true + }, + { + "bAssetIndex": 2, + "mAssetQty": "6292799999999999781896192", + "hardLimitError": true + }, + { + "bAssetIndex": 2, + "mAssetQty": "6992000000000000234881024", + "hardLimitError": true + } + ] + }, + { + "reserve0": "2007000000000000000000000", + "reserve1": "7492500000000000000000000", + "reserve2": "500500000000000000000000", + "A": 120, + "mAssetSupply": "9896372713490403790662354", + "hardMin": 50000000000000000, + "hardMax": 750000000000000000, + "swapFeeRate": 600000000000000, + "redeems": [ + { + "bAssetIndex": 0, + "mAssetQty": "10000000000000", + "outputQty": "9852235534025", + "swapFee": "6000000000", + "priceReceived": 1.0149980646995995 + }, + { + "bAssetIndex": 0, + "mAssetQty": "1000000000000000", + "outputQty": "985223553389812", + "swapFee": "600000000000", + "priceReceived": 1.0149980647126708 + }, + { + "bAssetIndex": 0, + "mAssetQty": "100000000000000000", + "outputQty": "98522355212417833", + "swapFee": "60000000000000", + "priceReceived": 1.0149980660165534 + }, + { + "bAssetIndex": 0, + "mAssetQty": "1000000000000000000", + "outputQty": "985223540618413979", + "swapFee": "600000000000000", + "priceReceived": 1.0149980778700345 + }, + { + "bAssetIndex": 0, + "mAssetQty": "10000000000000000000", + "outputQty": "9852234255602968696", + "swapFee": "6000000000000000", + "priceReceived": 1.014998196405348 + }, + { + "bAssetIndex": 0, + "mAssetQty": "100000000000000000000", + "outputQty": "98522227493176110124", + "swapFee": "60000000000000000", + "priceReceived": 1.014999381808803 + }, + { + "bAssetIndex": 0, + "mAssetQty": "699200000000000050331648", + "hardLimitError": true + }, + { + "bAssetIndex": 0, + "mAssetQty": "1398400000000000100663296", + "hardLimitError": true + }, + { + "bAssetIndex": 0, + "mAssetQty": "2097600000000000016777216", + "hardLimitError": true + }, + { + "bAssetIndex": 0, + "mAssetQty": "2796800000000000201326592", + "hardLimitError": true + }, + { + "bAssetIndex": 0, + "mAssetQty": "3496000000000000117440512", + "hardLimitError": true + }, + { + "bAssetIndex": 0, + "mAssetQty": "4195200000000000033554432", + "hardLimitError": true + }, + { + "bAssetIndex": 0, + "mAssetQty": "4894399999999999949668352", + "hardLimitError": true + }, + { + "bAssetIndex": 0, + "mAssetQty": "5593600000000000402653184", + "hardLimitError": true + }, + { + "bAssetIndex": 0, + "mAssetQty": "6292799999999999781896192", + "hardLimitError": true + }, + { + "bAssetIndex": 0, + "mAssetQty": "6992000000000000234881024", + "hardLimitError": true + }, + { + "bAssetIndex": 1, + "mAssetQty": "10000000000000", + "outputQty": "10315364828795", + "swapFee": "6000000000", + "priceReceived": 0.969427661160886 + }, + { + "bAssetIndex": 1, + "mAssetQty": "1000000000000000", + "outputQty": "1031536482876419", + "swapFee": "600000000000", + "priceReceived": 0.9694276611637815 + }, + { + "bAssetIndex": 1, + "mAssetQty": "100000000000000000", + "outputQty": "103153648256347236", + "swapFee": "60000000000000", + "priceReceived": 0.9694276614578856 + }, + { + "bAssetIndex": 1, + "mAssetQty": "1000000000000000000", + "outputQty": "1031536479718505769", + "swapFee": "600000000000000", + "priceReceived": 0.9694276641315568 + }, + { + "bAssetIndex": 1, + "mAssetQty": "10000000000000000000", + "outputQty": "10315364512688477585", + "swapFee": "6000000000000000", + "priceReceived": 0.9694276908682614 + }, + { + "bAssetIndex": 1, + "mAssetQty": "100000000000000000000", + "outputQty": "103153616677305760855", + "swapFee": "60000000000000000", + "priceReceived": 0.9694279582346474 + }, + { + "bAssetIndex": 1, + "mAssetQty": "699200000000000050331648", + "outputQty": "719735295724774695853497", + "swapFee": "419520000000000030198", + "priceReceived": 0.9714682663935558 + }, + { + "bAssetIndex": 1, + "mAssetQty": "1398400000000000100663296", + "outputQty": "1436562510306433132366436", + "swapFee": "839040000000000060397", + "priceReceived": 0.9734348418306611 + }, + { + "bAssetIndex": 1, + "mAssetQty": "2097600000000000016777216", + "outputQty": "2150665089589668874928626", + "swapFee": "1258560000000000010066", + "priceReceived": 0.975326195674756 + }, + { + "bAssetIndex": 1, + "mAssetQty": "2796800000000000201326592", + "outputQty": "2862225880440749949280956", + "swapFee": "1678080000000000120795", + "priceReceived": 0.9771416082539667 + }, + { + "bAssetIndex": 1, + "mAssetQty": "3496000000000000117440512", + "outputQty": "3571424149396287304299315", + "swapFee": "2097600000000000070464", + "priceReceived": 0.9788812120204101 + }, + { + "bAssetIndex": 1, + "mAssetQty": "4195200000000000033554432", + "outputQty": "4278428870450291387040727", + "swapFee": "2517120000000000020132", + "priceReceived": 0.980546861249669 + }, + { + "bAssetIndex": 1, + "mAssetQty": "4894399999999999949668352", + "outputQty": "4983381031041406904758446", + "swapFee": "2936639999999999969801", + "priceReceived": 0.9821444456108924 + }, + { + "bAssetIndex": 1, + "mAssetQty": "5593600000000000402653184", + "outputQty": "5686335360077022575227123", + "swapFee": "3356160000000000241591", + "priceReceived": 0.9836915422315566 + }, + { + "bAssetIndex": 1, + "mAssetQty": "6292799999999999781896192", + "outputQty": "6386983946516870516850932", + "swapFee": "3775679999999999869137", + "priceReceived": 0.9852537680843501 + }, + { + "bAssetIndex": 1, + "mAssetQty": "6992000000000000234881024", + "outputQty": "7081669723679473743584718", + "swapFee": "4195200000000000140928", + "priceReceived": 0.9873377710090547 + }, + { + "bAssetIndex": 2, + "mAssetQty": "10000000000000", + "outputQty": "8317044958106", + "swapFee": "6000000000", + "priceReceived": 1.202350119588298 + }, + { + "bAssetIndex": 2, + "mAssetQty": "1000000000000000", + "outputQty": "831704495589349", + "swapFee": "600000000000", + "priceReceived": 1.2023501199081486 + }, + { + "bAssetIndex": 2, + "mAssetQty": "100000000000000000", + "outputQty": "83170447346076645", + "swapFee": "60000000000000", + "priceReceived": 1.202350151898242 + }, + { + "bAssetIndex": 2, + "mAssetQty": "1000000000000000000", + "outputQty": "831704272291620904", + "swapFee": "600000000000000", + "priceReceived": 1.2023504427176603 + }, + { + "bAssetIndex": 2, + "mAssetQty": "10000000000000000000", + "outputQty": "8317022605791788171", + "swapFee": "6000000000000000", + "priceReceived": 1.202353350949921 + }, + { + "bAssetIndex": 2, + "mAssetQty": "100000000000000000000", + "outputQty": "83168214135594263901", + "swapFee": "60000000000000000", + "priceReceived": 1.2023824370806355 + }, + { + "bAssetIndex": 2, + "mAssetQty": "699200000000000050331648", + "hardLimitError": true + }, + { + "bAssetIndex": 2, + "mAssetQty": "1398400000000000100663296", + "hardLimitError": true + }, + { + "bAssetIndex": 2, + "mAssetQty": "2097600000000000016777216", + "hardLimitError": true + }, + { + "bAssetIndex": 2, + "mAssetQty": "2796800000000000201326592", + "hardLimitError": true + }, + { + "bAssetIndex": 2, + "mAssetQty": "3496000000000000117440512", + "hardLimitError": true + }, + { + "bAssetIndex": 2, + "mAssetQty": "4195200000000000033554432", + "hardLimitError": true + }, + { + "bAssetIndex": 2, + "mAssetQty": "4894399999999999949668352", + "hardLimitError": true + }, + { + "bAssetIndex": 2, + "mAssetQty": "5593600000000000402653184", + "hardLimitError": true + }, + { + "bAssetIndex": 2, + "mAssetQty": "6292799999999999781896192", + "hardLimitError": true + }, + { + "bAssetIndex": 2, + "mAssetQty": "6992000000000000234881024", + "hardLimitError": true + } + ] + }, + { + "reserve0": "500500000000000000000000", + "reserve1": "5503000000000000000000000", + "reserve2": "3996499999999999360000000", + "A": 120, + "mAssetSupply": "9936488013915504712820075", + "hardMin": 50000000000000000, + "hardMax": 750000000000000000, + "swapFeeRate": 600000000000000, + "redeems": [ + { + "bAssetIndex": 0, + "mAssetQty": "10000000000000", + "outputQty": "8741464880681", + "swapFee": "6000000000", + "priceReceived": 1.1439730224279017 + }, + { + "bAssetIndex": 0, + "mAssetQty": "1000000000000000", + "outputQty": "874146487884345", + "swapFee": "600000000000", + "priceReceived": 1.143973022668377 + }, + { + "bAssetIndex": 0, + "mAssetQty": "100000000000000000", + "outputQty": "87414646950531602", + "swapFee": "60000000000000", + "priceReceived": 1.14397304672054 + }, + { + "bAssetIndex": 0, + "mAssetQty": "1000000000000000000", + "outputQty": "874146302423016603", + "swapFee": "600000000000000", + "priceReceived": 1.1439732653768984 + }, + { + "bAssetIndex": 0, + "mAssetQty": "10000000000000000000", + "outputQty": "8741446315790339457", + "swapFee": "6000000000000000", + "priceReceived": 1.143975451972546 + }, + { + "bAssetIndex": 0, + "mAssetQty": "100000000000000000000", + "outputQty": "87412792104014619454", + "swapFee": "60000000000000000", + "priceReceived": 1.1439973211358763 + }, + { + "bAssetIndex": 0, + "mAssetQty": "699200000000000050331648", + "hardLimitError": true + }, + { + "bAssetIndex": 0, + "mAssetQty": "1398400000000000100663296", + "hardLimitError": true + }, + { + "bAssetIndex": 0, + "mAssetQty": "2097600000000000016777216", + "hardLimitError": true + }, + { + "bAssetIndex": 0, + "mAssetQty": "2796800000000000201326592", + "hardLimitError": true + }, + { + "bAssetIndex": 0, + "mAssetQty": "3496000000000000117440512", + "hardLimitError": true + }, + { + "bAssetIndex": 0, + "mAssetQty": "4195200000000000033554432", + "hardLimitError": true + }, + { + "bAssetIndex": 0, + "mAssetQty": "4894399999999999949668352", + "hardLimitError": true + }, + { + "bAssetIndex": 0, + "mAssetQty": "5593600000000000402653184", + "hardLimitError": true + }, + { + "bAssetIndex": 0, + "mAssetQty": "6292799999999999781896192", + "hardLimitError": true + }, + { + "bAssetIndex": 0, + "mAssetQty": "6992000000000000234881024", + "hardLimitError": true + }, + { + "bAssetIndex": 1, + "mAssetQty": "10000000000000", + "outputQty": "10164507628712", + "swapFee": "6000000000", + "priceReceived": 0.9838154847513411 + }, + { + "bAssetIndex": 1, + "mAssetQty": "1000000000000000", + "outputQty": "1016450762869405", + "swapFee": "600000000000", + "priceReceived": 0.9838154847530783 + }, + { + "bAssetIndex": 1, + "mAssetQty": "100000000000000000", + "outputQty": "101645076268747784", + "swapFee": "60000000000000", + "priceReceived": 0.9838154849291644 + }, + { + "bAssetIndex": 1, + "mAssetQty": "1000000000000000000", + "outputQty": "1016450761033593659", + "swapFee": "600000000000000", + "priceReceived": 0.9838154865299471 + }, + { + "bAssetIndex": 1, + "mAssetQty": "10000000000000000000", + "outputQty": "10164507444947540299", + "swapFee": "6000000000000000", + "priceReceived": 0.9838155025377731 + }, + { + "bAssetIndex": 1, + "mAssetQty": "100000000000000000000", + "outputQty": "101645057910657481556", + "swapFee": "60000000000000000", + "priceReceived": 0.9838156626158506 + }, + { + "bAssetIndex": 1, + "mAssetQty": "699200000000000050331648", + "outputQty": "709811194731357498535926", + "swapFee": "419520000000000030198", + "priceReceived": 0.9850506799412012 + }, + { + "bAssetIndex": 1, + "mAssetQty": "1398400000000000100663296", + "outputQty": "1417856802946775499008223", + "swapFee": "839040000000000060397", + "priceReceived": 0.9862773145311023 + }, + { + "bAssetIndex": 1, + "mAssetQty": "2097600000000000016777216", + "outputQty": "2124117621986889874550225", + "swapFee": "1258560000000000010066", + "priceReceived": 0.987515935222982 + }, + { + "bAssetIndex": 1, + "mAssetQty": "2796800000000000201326592", + "outputQty": "2828453206635174009338277", + "swapFee": "1678080000000000120795", + "priceReceived": 0.9888090046669609 + }, + { + "bAssetIndex": 1, + "mAssetQty": "3496000000000000117440512", + "outputQty": "3530389470952646920936233", + "swapFee": "2097600000000000070464", + "priceReceived": 0.9902590149796229 + }, + { + "bAssetIndex": 1, + "mAssetQty": "4195200000000000033554432", + "outputQty": "4228234336159812906095991", + "swapFee": "2517120000000000020132", + "priceReceived": 0.9921872030891704 + }, + { + "bAssetIndex": 1, + "mAssetQty": "4894399999999999949668352", + "hardLimitError": true + }, + { + "bAssetIndex": 1, + "mAssetQty": "5593600000000000402653184", + "hardLimitError": true + }, + { + "bAssetIndex": 1, + "mAssetQty": "6292799999999999781896192", + "hardLimitError": true + }, + { + "bAssetIndex": 1, + "mAssetQty": "6992000000000000234881024", + "hardLimitError": true + }, + { + "bAssetIndex": 2, + "mAssetQty": "10000000000000", + "outputQty": "10102482433971", + "swapFee": "6000000000", + "priceReceived": 0.9898557176772326 + }, + { + "bAssetIndex": 2, + "mAssetQty": "1000000000000000", + "outputQty": "1010248243395131", + "swapFee": "600000000000", + "priceReceived": 0.9898557176791619 + }, + { + "bAssetIndex": 2, + "mAssetQty": "100000000000000000", + "outputQty": "101024824319319536", + "swapFee": "60000000000000", + "priceReceived": 0.9898557178770213 + }, + { + "bAssetIndex": 2, + "mAssetQty": "1000000000000000000", + "outputQty": "1010248241357415368", + "swapFee": "600000000000000", + "priceReceived": 0.9898557196757449 + }, + { + "bAssetIndex": 2, + "mAssetQty": "10000000000000000000", + "outputQty": "10102482229996021343", + "swapFee": "6000000000000000", + "priceReceived": 0.989855737662994 + }, + { + "bAssetIndex": 2, + "mAssetQty": "100000000000000000000", + "outputQty": "101024803942014778472", + "swapFee": "60000000000000000", + "priceReceived": 0.9898559175368161 + }, + { + "bAssetIndex": 2, + "mAssetQty": "699200000000000050331648", + "outputQty": "705304582913346103367752", + "swapFee": "419520000000000030198", + "priceReceived": 0.9913447564906919 + }, + { + "bAssetIndex": 2, + "mAssetQty": "1398400000000000100663296", + "outputQty": "1408072410479239344834297", + "swapFee": "839040000000000060397", + "priceReceived": 0.9931307435560454 + }, + { + "bAssetIndex": 2, + "mAssetQty": "2097600000000000016777216", + "outputQty": "2106940933929894641926187", + "swapFee": "1258560000000000010066", + "priceReceived": 0.9955665895614493 + }, + { + "bAssetIndex": 2, + "mAssetQty": "2796800000000000201326592", + "hardLimitError": true + }, + { + "bAssetIndex": 2, + "mAssetQty": "3496000000000000117440512", + "hardLimitError": true + }, + { + "bAssetIndex": 2, + "mAssetQty": "4195200000000000033554432", + "hardLimitError": true + }, + { + "bAssetIndex": 2, + "mAssetQty": "4894399999999999949668352", + "hardLimitError": true + }, + { + "bAssetIndex": 2, + "mAssetQty": "5593600000000000402653184", + "hardLimitError": true + }, + { + "bAssetIndex": 2, + "mAssetQty": "6292799999999999781896192", + "hardLimitError": true + }, + { + "bAssetIndex": 2, + "mAssetQty": "6992000000000000234881024", + "hardLimitError": true + } + ] + }, + { + "reserve0": "500500000000000000000000", + "reserve1": "2007000000000000000000000", + "reserve2": "7492500000000000000000000", + "A": 120, + "mAssetSupply": "9896372713490403790662354", + "hardMin": 50000000000000000, + "hardMax": 750000000000000000, + "swapFeeRate": 600000000000000, + "redeems": [ + { + "bAssetIndex": 0, + "mAssetQty": "10000000000000", + "outputQty": "8317044958106", + "swapFee": "6000000000", + "priceReceived": 1.202350119588298 + }, + { + "bAssetIndex": 0, + "mAssetQty": "1000000000000000", + "outputQty": "831704495589349", + "swapFee": "600000000000", + "priceReceived": 1.2023501199081486 + }, + { + "bAssetIndex": 0, + "mAssetQty": "100000000000000000", + "outputQty": "83170447346076645", + "swapFee": "60000000000000", + "priceReceived": 1.202350151898242 + }, + { + "bAssetIndex": 0, + "mAssetQty": "1000000000000000000", + "outputQty": "831704272291620904", + "swapFee": "600000000000000", + "priceReceived": 1.2023504427176603 + }, + { + "bAssetIndex": 0, + "mAssetQty": "10000000000000000000", + "outputQty": "8317022605791788171", + "swapFee": "6000000000000000", + "priceReceived": 1.202353350949921 + }, + { + "bAssetIndex": 0, + "mAssetQty": "100000000000000000000", + "outputQty": "83168214135594263901", + "swapFee": "60000000000000000", + "priceReceived": 1.2023824370806355 + }, + { + "bAssetIndex": 0, + "mAssetQty": "699200000000000050331648", + "hardLimitError": true + }, + { + "bAssetIndex": 0, + "mAssetQty": "1398400000000000100663296", + "hardLimitError": true + }, + { + "bAssetIndex": 0, + "mAssetQty": "2097600000000000016777216", + "hardLimitError": true + }, + { + "bAssetIndex": 0, + "mAssetQty": "2796800000000000201326592", + "hardLimitError": true + }, + { + "bAssetIndex": 0, + "mAssetQty": "3496000000000000117440512", + "hardLimitError": true + }, + { + "bAssetIndex": 0, + "mAssetQty": "4195200000000000033554432", + "hardLimitError": true + }, + { + "bAssetIndex": 0, + "mAssetQty": "4894399999999999949668352", + "hardLimitError": true + }, + { + "bAssetIndex": 0, + "mAssetQty": "5593600000000000402653184", + "hardLimitError": true + }, + { + "bAssetIndex": 0, + "mAssetQty": "6292799999999999781896192", + "hardLimitError": true + }, + { + "bAssetIndex": 0, + "mAssetQty": "6992000000000000234881024", + "hardLimitError": true + }, + { + "bAssetIndex": 1, + "mAssetQty": "10000000000000", + "outputQty": "9852235534025", + "swapFee": "6000000000", + "priceReceived": 1.0149980646995995 + }, + { + "bAssetIndex": 1, + "mAssetQty": "1000000000000000", + "outputQty": "985223553389812", + "swapFee": "600000000000", + "priceReceived": 1.0149980647126708 + }, + { + "bAssetIndex": 1, + "mAssetQty": "100000000000000000", + "outputQty": "98522355212417833", + "swapFee": "60000000000000", + "priceReceived": 1.0149980660165534 + }, + { + "bAssetIndex": 1, + "mAssetQty": "1000000000000000000", + "outputQty": "985223540618413979", + "swapFee": "600000000000000", + "priceReceived": 1.0149980778700345 + }, + { + "bAssetIndex": 1, + "mAssetQty": "10000000000000000000", + "outputQty": "9852234255602968696", + "swapFee": "6000000000000000", + "priceReceived": 1.014998196405348 + }, + { + "bAssetIndex": 1, + "mAssetQty": "100000000000000000000", + "outputQty": "98522227493176110124", + "swapFee": "60000000000000000", + "priceReceived": 1.014999381808803 + }, + { + "bAssetIndex": 1, + "mAssetQty": "699200000000000050331648", + "hardLimitError": true + }, + { + "bAssetIndex": 1, + "mAssetQty": "1398400000000000100663296", + "hardLimitError": true + }, + { + "bAssetIndex": 1, + "mAssetQty": "2097600000000000016777216", + "hardLimitError": true + }, + { + "bAssetIndex": 1, + "mAssetQty": "2796800000000000201326592", + "hardLimitError": true + }, + { + "bAssetIndex": 1, + "mAssetQty": "3496000000000000117440512", + "hardLimitError": true + }, + { + "bAssetIndex": 1, + "mAssetQty": "4195200000000000033554432", + "hardLimitError": true + }, + { + "bAssetIndex": 1, + "mAssetQty": "4894399999999999949668352", + "hardLimitError": true + }, + { + "bAssetIndex": 1, + "mAssetQty": "5593600000000000402653184", + "hardLimitError": true + }, + { + "bAssetIndex": 1, + "mAssetQty": "6292799999999999781896192", + "hardLimitError": true + }, + { + "bAssetIndex": 1, + "mAssetQty": "6992000000000000234881024", + "hardLimitError": true + }, + { + "bAssetIndex": 2, + "mAssetQty": "10000000000000", + "outputQty": "10315364828795", + "swapFee": "6000000000", + "priceReceived": 0.969427661160886 + }, + { + "bAssetIndex": 2, + "mAssetQty": "1000000000000000", + "outputQty": "1031536482876419", + "swapFee": "600000000000", + "priceReceived": 0.9694276611637815 + }, + { + "bAssetIndex": 2, + "mAssetQty": "100000000000000000", + "outputQty": "103153648256347236", + "swapFee": "60000000000000", + "priceReceived": 0.9694276614578856 + }, + { + "bAssetIndex": 2, + "mAssetQty": "1000000000000000000", + "outputQty": "1031536479718505769", + "swapFee": "600000000000000", + "priceReceived": 0.9694276641315568 + }, + { + "bAssetIndex": 2, + "mAssetQty": "10000000000000000000", + "outputQty": "10315364512688477585", + "swapFee": "6000000000000000", + "priceReceived": 0.9694276908682614 + }, + { + "bAssetIndex": 2, + "mAssetQty": "100000000000000000000", + "outputQty": "103153616677305760855", + "swapFee": "60000000000000000", + "priceReceived": 0.9694279582346474 + }, + { + "bAssetIndex": 2, + "mAssetQty": "699200000000000050331648", + "outputQty": "719735295724774695853497", + "swapFee": "419520000000000030198", + "priceReceived": 0.9714682663935558 + }, + { + "bAssetIndex": 2, + "mAssetQty": "1398400000000000100663296", + "outputQty": "1436562510306433132366436", + "swapFee": "839040000000000060397", + "priceReceived": 0.9734348418306611 + }, + { + "bAssetIndex": 2, + "mAssetQty": "2097600000000000016777216", + "outputQty": "2150665089589668874928626", + "swapFee": "1258560000000000010066", + "priceReceived": 0.975326195674756 + }, + { + "bAssetIndex": 2, + "mAssetQty": "2796800000000000201326592", + "outputQty": "2862225880440749949280956", + "swapFee": "1678080000000000120795", + "priceReceived": 0.9771416082539667 + }, + { + "bAssetIndex": 2, + "mAssetQty": "3496000000000000117440512", + "outputQty": "3571424149396287304299315", + "swapFee": "2097600000000000070464", + "priceReceived": 0.9788812120204101 + }, + { + "bAssetIndex": 2, + "mAssetQty": "4195200000000000033554432", + "outputQty": "4278428870450291387040727", + "swapFee": "2517120000000000020132", + "priceReceived": 0.980546861249669 + }, + { + "bAssetIndex": 2, + "mAssetQty": "4894399999999999949668352", + "outputQty": "4983381031041406904758446", + "swapFee": "2936639999999999969801", + "priceReceived": 0.9821444456108924 + }, + { + "bAssetIndex": 2, + "mAssetQty": "5593600000000000402653184", + "outputQty": "5686335360077022575227123", + "swapFee": "3356160000000000241591", + "priceReceived": 0.9836915422315566 + }, + { + "bAssetIndex": 2, + "mAssetQty": "6292799999999999781896192", + "outputQty": "6386983946516870516850932", + "swapFee": "3775679999999999869137", + "priceReceived": 0.9852537680843501 + }, + { + "bAssetIndex": 2, + "mAssetQty": "6992000000000000234881024", + "outputQty": "7081669723679473743584718", + "swapFee": "4195200000000000140928", + "priceReceived": 0.9873377710090547 + } + ] + }, + { + "reserve0": "3996499999999999360000000", + "reserve1": "5503000000000000000000000", + "reserve2": "500500000000000000000000", + "A": 120, + "mAssetSupply": "9936488013915504712820075", + "hardMin": 50000000000000000, + "hardMax": 750000000000000000, + "swapFeeRate": 600000000000000, + "redeems": [ + { + "bAssetIndex": 0, + "mAssetQty": "10000000000000", + "outputQty": "10102482433971", + "swapFee": "6000000000", + "priceReceived": 0.9898557176772326 + }, + { + "bAssetIndex": 0, + "mAssetQty": "1000000000000000", + "outputQty": "1010248243395131", + "swapFee": "600000000000", + "priceReceived": 0.9898557176791619 + }, + { + "bAssetIndex": 0, + "mAssetQty": "100000000000000000", + "outputQty": "101024824319319536", + "swapFee": "60000000000000", + "priceReceived": 0.9898557178770213 + }, + { + "bAssetIndex": 0, + "mAssetQty": "1000000000000000000", + "outputQty": "1010248241357415368", + "swapFee": "600000000000000", + "priceReceived": 0.9898557196757449 + }, + { + "bAssetIndex": 0, + "mAssetQty": "10000000000000000000", + "outputQty": "10102482229996021343", + "swapFee": "6000000000000000", + "priceReceived": 0.989855737662994 + }, + { + "bAssetIndex": 0, + "mAssetQty": "100000000000000000000", + "outputQty": "101024803942014778472", + "swapFee": "60000000000000000", + "priceReceived": 0.9898559175368161 + }, + { + "bAssetIndex": 0, + "mAssetQty": "699200000000000050331648", + "outputQty": "705304582913346103367752", + "swapFee": "419520000000000030198", + "priceReceived": 0.9913447564906919 + }, + { + "bAssetIndex": 0, + "mAssetQty": "1398400000000000100663296", + "outputQty": "1408072410479239344834297", + "swapFee": "839040000000000060397", + "priceReceived": 0.9931307435560454 + }, + { + "bAssetIndex": 0, + "mAssetQty": "2097600000000000016777216", + "outputQty": "2106940933929894641926187", + "swapFee": "1258560000000000010066", + "priceReceived": 0.9955665895614493 + }, + { + "bAssetIndex": 0, + "mAssetQty": "2796800000000000201326592", + "hardLimitError": true + }, + { + "bAssetIndex": 0, + "mAssetQty": "3496000000000000117440512", + "hardLimitError": true + }, + { + "bAssetIndex": 0, + "mAssetQty": "4195200000000000033554432", + "hardLimitError": true + }, + { + "bAssetIndex": 0, + "mAssetQty": "4894399999999999949668352", + "hardLimitError": true + }, + { + "bAssetIndex": 0, + "mAssetQty": "5593600000000000402653184", + "hardLimitError": true + }, + { + "bAssetIndex": 0, + "mAssetQty": "6292799999999999781896192", + "hardLimitError": true + }, + { + "bAssetIndex": 0, + "mAssetQty": "6992000000000000234881024", + "hardLimitError": true + }, + { + "bAssetIndex": 1, + "mAssetQty": "10000000000000", + "outputQty": "10164507628712", + "swapFee": "6000000000", + "priceReceived": 0.9838154847513411 + }, + { + "bAssetIndex": 1, + "mAssetQty": "1000000000000000", + "outputQty": "1016450762869405", + "swapFee": "600000000000", + "priceReceived": 0.9838154847530783 + }, + { + "bAssetIndex": 1, + "mAssetQty": "100000000000000000", + "outputQty": "101645076268747784", + "swapFee": "60000000000000", + "priceReceived": 0.9838154849291644 + }, + { + "bAssetIndex": 1, + "mAssetQty": "1000000000000000000", + "outputQty": "1016450761033593659", + "swapFee": "600000000000000", + "priceReceived": 0.9838154865299471 + }, + { + "bAssetIndex": 1, + "mAssetQty": "10000000000000000000", + "outputQty": "10164507444947540299", + "swapFee": "6000000000000000", + "priceReceived": 0.9838155025377731 + }, + { + "bAssetIndex": 1, + "mAssetQty": "100000000000000000000", + "outputQty": "101645057910657481556", + "swapFee": "60000000000000000", + "priceReceived": 0.9838156626158506 + }, + { + "bAssetIndex": 1, + "mAssetQty": "699200000000000050331648", + "outputQty": "709811194731357498535926", + "swapFee": "419520000000000030198", + "priceReceived": 0.9850506799412012 + }, + { + "bAssetIndex": 1, + "mAssetQty": "1398400000000000100663296", + "outputQty": "1417856802946775499008223", + "swapFee": "839040000000000060397", + "priceReceived": 0.9862773145311023 + }, + { + "bAssetIndex": 1, + "mAssetQty": "2097600000000000016777216", + "outputQty": "2124117621986889874550225", + "swapFee": "1258560000000000010066", + "priceReceived": 0.987515935222982 + }, + { + "bAssetIndex": 1, + "mAssetQty": "2796800000000000201326592", + "outputQty": "2828453206635174009338277", + "swapFee": "1678080000000000120795", + "priceReceived": 0.9888090046669609 + }, + { + "bAssetIndex": 1, + "mAssetQty": "3496000000000000117440512", + "outputQty": "3530389470952646920936233", + "swapFee": "2097600000000000070464", + "priceReceived": 0.9902590149796229 + }, + { + "bAssetIndex": 1, + "mAssetQty": "4195200000000000033554432", + "outputQty": "4228234336159812906095991", + "swapFee": "2517120000000000020132", + "priceReceived": 0.9921872030891704 + }, + { + "bAssetIndex": 1, + "mAssetQty": "4894399999999999949668352", + "hardLimitError": true + }, + { + "bAssetIndex": 1, + "mAssetQty": "5593600000000000402653184", + "hardLimitError": true + }, + { + "bAssetIndex": 1, + "mAssetQty": "6292799999999999781896192", + "hardLimitError": true + }, + { + "bAssetIndex": 1, + "mAssetQty": "6992000000000000234881024", + "hardLimitError": true + }, + { + "bAssetIndex": 2, + "mAssetQty": "10000000000000", + "outputQty": "8741464880681", + "swapFee": "6000000000", + "priceReceived": 1.1439730224279017 + }, + { + "bAssetIndex": 2, + "mAssetQty": "1000000000000000", + "outputQty": "874146487884345", + "swapFee": "600000000000", + "priceReceived": 1.143973022668377 + }, + { + "bAssetIndex": 2, + "mAssetQty": "100000000000000000", + "outputQty": "87414646950531602", + "swapFee": "60000000000000", + "priceReceived": 1.14397304672054 + }, + { + "bAssetIndex": 2, + "mAssetQty": "1000000000000000000", + "outputQty": "874146302423016603", + "swapFee": "600000000000000", + "priceReceived": 1.1439732653768984 + }, + { + "bAssetIndex": 2, + "mAssetQty": "10000000000000000000", + "outputQty": "8741446315790339457", + "swapFee": "6000000000000000", + "priceReceived": 1.143975451972546 + }, + { + "bAssetIndex": 2, + "mAssetQty": "100000000000000000000", + "outputQty": "87412792104014619454", + "swapFee": "60000000000000000", + "priceReceived": 1.1439973211358763 + }, + { + "bAssetIndex": 2, + "mAssetQty": "699200000000000050331648", + "hardLimitError": true + }, + { + "bAssetIndex": 2, + "mAssetQty": "1398400000000000100663296", + "hardLimitError": true + }, + { + "bAssetIndex": 2, + "mAssetQty": "2097600000000000016777216", + "hardLimitError": true + }, + { + "bAssetIndex": 2, + "mAssetQty": "2796800000000000201326592", + "hardLimitError": true + }, + { + "bAssetIndex": 2, + "mAssetQty": "3496000000000000117440512", + "hardLimitError": true + }, + { + "bAssetIndex": 2, + "mAssetQty": "4195200000000000033554432", + "hardLimitError": true + }, + { + "bAssetIndex": 2, + "mAssetQty": "4894399999999999949668352", + "hardLimitError": true + }, + { + "bAssetIndex": 2, + "mAssetQty": "5593600000000000402653184", + "hardLimitError": true + }, + { + "bAssetIndex": 2, + "mAssetQty": "6292799999999999781896192", + "hardLimitError": true + }, + { + "bAssetIndex": 2, + "mAssetQty": "6992000000000000234881024", + "hardLimitError": true + } + ] + }, + { + "reserve0": "3996499999999999360000000", + "reserve1": "2007000000000000960000000", + "reserve2": "3996499999999999360000000", + "A": 120, + "mAssetSupply": "9995726520619110731126433", + "hardMin": 50000000000000000, + "hardMax": 750000000000000000, + "swapFeeRate": 600000000000000, + "redeems": [ + { + "bAssetIndex": 0, + "mAssetQty": "10000000000000", + "outputQty": "10014092705535", + "swapFee": "6000000000", + "priceReceived": 0.9985927126950591 + }, + { + "bAssetIndex": 0, + "mAssetQty": "1000000000000000", + "outputQty": "1001409270552820", + "swapFee": "600000000000", + "priceReceived": 0.9985927126957372 + }, + { + "bAssetIndex": 0, + "mAssetQty": "100000000000000000", + "outputQty": "100140927048184973", + "swapFee": "60000000000000", + "priceReceived": 0.998592712766508 + }, + { + "bAssetIndex": 0, + "mAssetQty": "1000000000000000000", + "outputQty": "1001409269836665323", + "swapFee": "600000000000000", + "priceReceived": 0.9985927134098777 + }, + { + "bAssetIndex": 0, + "mAssetQty": "10000000000000000000", + "outputQty": "10014092633848165782", + "swapFee": "6000000000000000", + "priceReceived": 0.99859271984358 + }, + { + "bAssetIndex": 0, + "mAssetQty": "100000000000000000000", + "outputQty": "100140919886586598600", + "swapFee": "60000000000000000", + "priceReceived": 0.9985927841810701 + }, + { + "bAssetIndex": 0, + "mAssetQty": "699200000000000050331648", + "outputQty": "699812492593522390954084", + "swapFee": "419520000000000030198", + "priceReceived": 0.9991247761364584 + }, + { + "bAssetIndex": 0, + "mAssetQty": "1398400000000000100663296", + "outputQty": "1398732791081049832328563", + "swapFee": "839040000000000060397", + "priceReceived": 0.9997620767288994 + }, + { + "bAssetIndex": 0, + "mAssetQty": "2097600000000000016777216", + "outputQty": "2096274676868418159589052", + "swapFee": "1258560000000000010066", + "priceReceived": 1.0006322278021131 + }, + { + "bAssetIndex": 0, + "mAssetQty": "2796800000000000201326592", + "outputQty": "2790798619219561685672826", + "swapFee": "1678080000000000120795", + "priceReceived": 1.0021504169950166 + }, + { + "bAssetIndex": 0, + "mAssetQty": "3496000000000000117440512", + "outputQty": "3472493299533946121231065", + "swapFee": "2097600000000000070464", + "priceReceived": 1.0067694012452693 + }, + { + "bAssetIndex": 0, + "mAssetQty": "4195200000000000033554432", + "hardLimitError": true + }, + { + "bAssetIndex": 0, + "mAssetQty": "4894399999999999949668352", + "hardLimitError": true + }, + { + "bAssetIndex": 0, + "mAssetQty": "5593600000000000402653184", + "hardLimitError": true + }, + { + "bAssetIndex": 0, + "mAssetQty": "6292799999999999781896192", + "hardLimitError": true + }, + { + "bAssetIndex": 0, + "mAssetQty": "6992000000000000234881024", + "hardLimitError": true + }, + { + "bAssetIndex": 1, + "mAssetQty": "10000000000000", + "outputQty": "9935761590471", + "swapFee": "6000000000", + "priceReceived": 1.0064653734838613 + }, + { + "bAssetIndex": 1, + "mAssetQty": "1000000000000000", + "outputQty": "993576159043733", + "swapFee": "600000000000", + "priceReceived": 1.0064653734872722 + }, + { + "bAssetIndex": 1, + "mAssetQty": "100000000000000000", + "outputQty": "99357615870945108", + "swapFee": "60000000000000", + "priceReceived": 1.0064653738258904 + }, + { + "bAssetIndex": 1, + "mAssetQty": "1000000000000000000", + "outputQty": "993576155670517734", + "swapFee": "600000000000000", + "priceReceived": 1.0064653769042466 + }, + { + "bAssetIndex": 1, + "mAssetQty": "10000000000000000000", + "outputQty": "9935761252810493721", + "swapFee": "6000000000000000", + "priceReceived": 1.006465407687945 + }, + { + "bAssetIndex": 1, + "mAssetQty": "100000000000000000000", + "outputQty": "99357582137287342596", + "swapFee": "60000000000000000", + "priceReceived": 1.0064657155386993 + }, + { + "bAssetIndex": 1, + "mAssetQty": "699200000000000050331648", + "outputQty": "692277120953961843804569", + "swapFee": "419520000000000030198", + "priceReceived": 1.01000015577071 + }, + { + "bAssetIndex": 1, + "mAssetQty": "1398400000000000100663296", + "outputQty": "1370416125300544307124714", + "swapFee": "839040000000000060397", + "priceReceived": 1.0204199835238503 + }, + { + "bAssetIndex": 1, + "mAssetQty": "2097600000000000016777216", + "hardLimitError": true + }, + { + "bAssetIndex": 1, + "mAssetQty": "2796800000000000201326592", + "hardLimitError": true + }, + { + "bAssetIndex": 1, + "mAssetQty": "3496000000000000117440512", + "hardLimitError": true + }, + { + "bAssetIndex": 1, + "mAssetQty": "4195200000000000033554432", + "hardLimitError": true + }, + { + "bAssetIndex": 1, + "mAssetQty": "4894399999999999949668352", + "hardLimitError": true + }, + { + "bAssetIndex": 1, + "mAssetQty": "5593600000000000402653184", + "hardLimitError": true + }, + { + "bAssetIndex": 1, + "mAssetQty": "6292799999999999781896192", + "hardLimitError": true + }, + { + "bAssetIndex": 1, + "mAssetQty": "6992000000000000234881024", + "hardLimitError": true + }, + { + "bAssetIndex": 2, + "mAssetQty": "10000000000000", + "outputQty": "10014092705535", + "swapFee": "6000000000", + "priceReceived": 0.9985927126950591 + }, + { + "bAssetIndex": 2, + "mAssetQty": "1000000000000000", + "outputQty": "1001409270552820", + "swapFee": "600000000000", + "priceReceived": 0.9985927126957372 + }, + { + "bAssetIndex": 2, + "mAssetQty": "100000000000000000", + "outputQty": "100140927048184973", + "swapFee": "60000000000000", + "priceReceived": 0.998592712766508 + }, + { + "bAssetIndex": 2, + "mAssetQty": "1000000000000000000", + "outputQty": "1001409269836665323", + "swapFee": "600000000000000", + "priceReceived": 0.9985927134098777 + }, + { + "bAssetIndex": 2, + "mAssetQty": "10000000000000000000", + "outputQty": "10014092633848165782", + "swapFee": "6000000000000000", + "priceReceived": 0.99859271984358 + }, + { + "bAssetIndex": 2, + "mAssetQty": "100000000000000000000", + "outputQty": "100140919886586598600", + "swapFee": "60000000000000000", + "priceReceived": 0.9985927841810701 + }, + { + "bAssetIndex": 2, + "mAssetQty": "699200000000000050331648", + "outputQty": "699812492593522390954084", + "swapFee": "419520000000000030198", + "priceReceived": 0.9991247761364584 + }, + { + "bAssetIndex": 2, + "mAssetQty": "1398400000000000100663296", + "outputQty": "1398732791081049832328563", + "swapFee": "839040000000000060397", + "priceReceived": 0.9997620767288994 + }, + { + "bAssetIndex": 2, + "mAssetQty": "2097600000000000016777216", + "outputQty": "2096274676868418159589052", + "swapFee": "1258560000000000010066", + "priceReceived": 1.0006322278021131 + }, + { + "bAssetIndex": 2, + "mAssetQty": "2796800000000000201326592", + "outputQty": "2790798619219561685672826", + "swapFee": "1678080000000000120795", + "priceReceived": 1.0021504169950166 + }, + { + "bAssetIndex": 2, + "mAssetQty": "3496000000000000117440512", + "outputQty": "3472493299533946121231065", + "swapFee": "2097600000000000070464", + "priceReceived": 1.0067694012452693 + }, + { + "bAssetIndex": 2, + "mAssetQty": "4195200000000000033554432", + "hardLimitError": true + }, + { + "bAssetIndex": 2, + "mAssetQty": "4894399999999999949668352", + "hardLimitError": true + }, + { + "bAssetIndex": 2, + "mAssetQty": "5593600000000000402653184", + "hardLimitError": true + }, + { + "bAssetIndex": 2, + "mAssetQty": "6292799999999999781896192", + "hardLimitError": true + }, + { + "bAssetIndex": 2, + "mAssetQty": "6992000000000000234881024", + "hardLimitError": true + } + ] + }, + { + "reserve0": "7492500000000000000000000", + "reserve1": "2007000000000000000000000", + "reserve2": "500500000000000000000000", + "A": 120, + "mAssetSupply": "9896372713490403790662354", + "hardMin": 50000000000000000, + "hardMax": 750000000000000000, + "swapFeeRate": 600000000000000, + "redeems": [ + { + "bAssetIndex": 0, + "mAssetQty": "10000000000000", + "outputQty": "10315364828795", + "swapFee": "6000000000", + "priceReceived": 0.969427661160886 + }, + { + "bAssetIndex": 0, + "mAssetQty": "1000000000000000", + "outputQty": "1031536482876419", + "swapFee": "600000000000", + "priceReceived": 0.9694276611637815 + }, + { + "bAssetIndex": 0, + "mAssetQty": "100000000000000000", + "outputQty": "103153648256347236", + "swapFee": "60000000000000", + "priceReceived": 0.9694276614578856 + }, + { + "bAssetIndex": 0, + "mAssetQty": "1000000000000000000", + "outputQty": "1031536479718505769", + "swapFee": "600000000000000", + "priceReceived": 0.9694276641315568 + }, + { + "bAssetIndex": 0, + "mAssetQty": "10000000000000000000", + "outputQty": "10315364512688477585", + "swapFee": "6000000000000000", + "priceReceived": 0.9694276908682614 + }, + { + "bAssetIndex": 0, + "mAssetQty": "100000000000000000000", + "outputQty": "103153616677305760855", + "swapFee": "60000000000000000", + "priceReceived": 0.9694279582346474 + }, + { + "bAssetIndex": 0, + "mAssetQty": "699200000000000050331648", + "outputQty": "719735295724774695853497", + "swapFee": "419520000000000030198", + "priceReceived": 0.9714682663935558 + }, + { + "bAssetIndex": 0, + "mAssetQty": "1398400000000000100663296", + "outputQty": "1436562510306433132366436", + "swapFee": "839040000000000060397", + "priceReceived": 0.9734348418306611 + }, + { + "bAssetIndex": 0, + "mAssetQty": "2097600000000000016777216", + "outputQty": "2150665089589668874928626", + "swapFee": "1258560000000000010066", + "priceReceived": 0.975326195674756 + }, + { + "bAssetIndex": 0, + "mAssetQty": "2796800000000000201326592", + "outputQty": "2862225880440749949280956", + "swapFee": "1678080000000000120795", + "priceReceived": 0.9771416082539667 + }, + { + "bAssetIndex": 0, + "mAssetQty": "3496000000000000117440512", + "outputQty": "3571424149396287304299315", + "swapFee": "2097600000000000070464", + "priceReceived": 0.9788812120204101 + }, + { + "bAssetIndex": 0, + "mAssetQty": "4195200000000000033554432", + "outputQty": "4278428870450291387040727", + "swapFee": "2517120000000000020132", + "priceReceived": 0.980546861249669 + }, + { + "bAssetIndex": 0, + "mAssetQty": "4894399999999999949668352", + "outputQty": "4983381031041406904758446", + "swapFee": "2936639999999999969801", + "priceReceived": 0.9821444456108924 + }, + { + "bAssetIndex": 0, + "mAssetQty": "5593600000000000402653184", + "outputQty": "5686335360077022575227123", + "swapFee": "3356160000000000241591", + "priceReceived": 0.9836915422315566 + }, + { + "bAssetIndex": 0, + "mAssetQty": "6292799999999999781896192", + "outputQty": "6386983946516870516850932", + "swapFee": "3775679999999999869137", + "priceReceived": 0.9852537680843501 + }, + { + "bAssetIndex": 0, + "mAssetQty": "6992000000000000234881024", + "outputQty": "7081669723679473743584718", + "swapFee": "4195200000000000140928", + "priceReceived": 0.9873377710090547 + }, + { + "bAssetIndex": 1, + "mAssetQty": "10000000000000", + "outputQty": "9852235534025", + "swapFee": "6000000000", + "priceReceived": 1.0149980646995995 + }, + { + "bAssetIndex": 1, + "mAssetQty": "1000000000000000", + "outputQty": "985223553389812", + "swapFee": "600000000000", + "priceReceived": 1.0149980647126708 + }, + { + "bAssetIndex": 1, + "mAssetQty": "100000000000000000", + "outputQty": "98522355212417833", + "swapFee": "60000000000000", + "priceReceived": 1.0149980660165534 + }, + { + "bAssetIndex": 1, + "mAssetQty": "1000000000000000000", + "outputQty": "985223540618413979", + "swapFee": "600000000000000", + "priceReceived": 1.0149980778700345 + }, + { + "bAssetIndex": 1, + "mAssetQty": "10000000000000000000", + "outputQty": "9852234255602968696", + "swapFee": "6000000000000000", + "priceReceived": 1.014998196405348 + }, + { + "bAssetIndex": 1, + "mAssetQty": "100000000000000000000", + "outputQty": "98522227493176110124", + "swapFee": "60000000000000000", + "priceReceived": 1.014999381808803 + }, + { + "bAssetIndex": 1, + "mAssetQty": "699200000000000050331648", + "hardLimitError": true + }, + { + "bAssetIndex": 1, + "mAssetQty": "1398400000000000100663296", + "hardLimitError": true + }, + { + "bAssetIndex": 1, + "mAssetQty": "2097600000000000016777216", + "hardLimitError": true + }, + { + "bAssetIndex": 1, + "mAssetQty": "2796800000000000201326592", + "hardLimitError": true + }, + { + "bAssetIndex": 1, + "mAssetQty": "3496000000000000117440512", + "hardLimitError": true + }, + { + "bAssetIndex": 1, + "mAssetQty": "4195200000000000033554432", + "hardLimitError": true + }, + { + "bAssetIndex": 1, + "mAssetQty": "4894399999999999949668352", + "hardLimitError": true + }, + { + "bAssetIndex": 1, + "mAssetQty": "5593600000000000402653184", + "hardLimitError": true + }, + { + "bAssetIndex": 1, + "mAssetQty": "6292799999999999781896192", + "hardLimitError": true + }, + { + "bAssetIndex": 1, + "mAssetQty": "6992000000000000234881024", + "hardLimitError": true + }, + { + "bAssetIndex": 2, + "mAssetQty": "10000000000000", + "outputQty": "8317044958106", + "swapFee": "6000000000", + "priceReceived": 1.202350119588298 + }, + { + "bAssetIndex": 2, + "mAssetQty": "1000000000000000", + "outputQty": "831704495589349", + "swapFee": "600000000000", + "priceReceived": 1.2023501199081486 + }, + { + "bAssetIndex": 2, + "mAssetQty": "100000000000000000", + "outputQty": "83170447346076645", + "swapFee": "60000000000000", + "priceReceived": 1.202350151898242 + }, + { + "bAssetIndex": 2, + "mAssetQty": "1000000000000000000", + "outputQty": "831704272291620904", + "swapFee": "600000000000000", + "priceReceived": 1.2023504427176603 + }, + { + "bAssetIndex": 2, + "mAssetQty": "10000000000000000000", + "outputQty": "8317022605791788171", + "swapFee": "6000000000000000", + "priceReceived": 1.202353350949921 + }, + { + "bAssetIndex": 2, + "mAssetQty": "100000000000000000000", + "outputQty": "83168214135594263901", + "swapFee": "60000000000000000", + "priceReceived": 1.2023824370806355 + }, + { + "bAssetIndex": 2, + "mAssetQty": "699200000000000050331648", + "hardLimitError": true + }, + { + "bAssetIndex": 2, + "mAssetQty": "1398400000000000100663296", + "hardLimitError": true + }, + { + "bAssetIndex": 2, + "mAssetQty": "2097600000000000016777216", + "hardLimitError": true + }, + { + "bAssetIndex": 2, + "mAssetQty": "2796800000000000201326592", + "hardLimitError": true + }, + { + "bAssetIndex": 2, + "mAssetQty": "3496000000000000117440512", + "hardLimitError": true + }, + { + "bAssetIndex": 2, + "mAssetQty": "4195200000000000033554432", + "hardLimitError": true + }, + { + "bAssetIndex": 2, + "mAssetQty": "4894399999999999949668352", + "hardLimitError": true + }, + { + "bAssetIndex": 2, + "mAssetQty": "5593600000000000402653184", + "hardLimitError": true + }, + { + "bAssetIndex": 2, + "mAssetQty": "6292799999999999781896192", + "hardLimitError": true + }, + { + "bAssetIndex": 2, + "mAssetQty": "6992000000000000234881024", + "hardLimitError": true + } + ] + }, + { + "reserve0": "500500000000000000000000", + "reserve1": "3996499999999999360000000", + "reserve2": "5503000000000000000000000", + "A": 120, + "mAssetSupply": "9936488013915504712820075", + "hardMin": 50000000000000000, + "hardMax": 750000000000000000, + "swapFeeRate": 600000000000000, + "redeems": [ + { + "bAssetIndex": 0, + "mAssetQty": "10000000000000", + "outputQty": "8741464880681", + "swapFee": "6000000000", + "priceReceived": 1.1439730224279017 + }, + { + "bAssetIndex": 0, + "mAssetQty": "1000000000000000", + "outputQty": "874146487884345", + "swapFee": "600000000000", + "priceReceived": 1.143973022668377 + }, + { + "bAssetIndex": 0, + "mAssetQty": "100000000000000000", + "outputQty": "87414646950531602", + "swapFee": "60000000000000", + "priceReceived": 1.14397304672054 + }, + { + "bAssetIndex": 0, + "mAssetQty": "1000000000000000000", + "outputQty": "874146302423016603", + "swapFee": "600000000000000", + "priceReceived": 1.1439732653768984 + }, + { + "bAssetIndex": 0, + "mAssetQty": "10000000000000000000", + "outputQty": "8741446315790339457", + "swapFee": "6000000000000000", + "priceReceived": 1.143975451972546 + }, + { + "bAssetIndex": 0, + "mAssetQty": "100000000000000000000", + "outputQty": "87412792104014619454", + "swapFee": "60000000000000000", + "priceReceived": 1.1439973211358763 + }, + { + "bAssetIndex": 0, + "mAssetQty": "699200000000000050331648", + "hardLimitError": true + }, + { + "bAssetIndex": 0, + "mAssetQty": "1398400000000000100663296", + "hardLimitError": true + }, + { + "bAssetIndex": 0, + "mAssetQty": "2097600000000000016777216", + "hardLimitError": true + }, + { + "bAssetIndex": 0, + "mAssetQty": "2796800000000000201326592", + "hardLimitError": true + }, + { + "bAssetIndex": 0, + "mAssetQty": "3496000000000000117440512", + "hardLimitError": true + }, + { + "bAssetIndex": 0, + "mAssetQty": "4195200000000000033554432", + "hardLimitError": true + }, + { + "bAssetIndex": 0, + "mAssetQty": "4894399999999999949668352", + "hardLimitError": true + }, + { + "bAssetIndex": 0, + "mAssetQty": "5593600000000000402653184", + "hardLimitError": true + }, + { + "bAssetIndex": 0, + "mAssetQty": "6292799999999999781896192", + "hardLimitError": true + }, + { + "bAssetIndex": 0, + "mAssetQty": "6992000000000000234881024", + "hardLimitError": true + }, + { + "bAssetIndex": 1, + "mAssetQty": "10000000000000", + "outputQty": "10102482433971", + "swapFee": "6000000000", + "priceReceived": 0.9898557176772326 + }, + { + "bAssetIndex": 1, + "mAssetQty": "1000000000000000", + "outputQty": "1010248243395131", + "swapFee": "600000000000", + "priceReceived": 0.9898557176791619 + }, + { + "bAssetIndex": 1, + "mAssetQty": "100000000000000000", + "outputQty": "101024824319319536", + "swapFee": "60000000000000", + "priceReceived": 0.9898557178770213 + }, + { + "bAssetIndex": 1, + "mAssetQty": "1000000000000000000", + "outputQty": "1010248241357415368", + "swapFee": "600000000000000", + "priceReceived": 0.9898557196757449 + }, + { + "bAssetIndex": 1, + "mAssetQty": "10000000000000000000", + "outputQty": "10102482229996021343", + "swapFee": "6000000000000000", + "priceReceived": 0.989855737662994 + }, + { + "bAssetIndex": 1, + "mAssetQty": "100000000000000000000", + "outputQty": "101024803942014778472", + "swapFee": "60000000000000000", + "priceReceived": 0.9898559175368161 + }, + { + "bAssetIndex": 1, + "mAssetQty": "699200000000000050331648", + "outputQty": "705304582913346103367752", + "swapFee": "419520000000000030198", + "priceReceived": 0.9913447564906919 + }, + { + "bAssetIndex": 1, + "mAssetQty": "1398400000000000100663296", + "outputQty": "1408072410479239344834297", + "swapFee": "839040000000000060397", + "priceReceived": 0.9931307435560454 + }, + { + "bAssetIndex": 1, + "mAssetQty": "2097600000000000016777216", + "outputQty": "2106940933929894641926187", + "swapFee": "1258560000000000010066", + "priceReceived": 0.9955665895614493 + }, + { + "bAssetIndex": 1, + "mAssetQty": "2796800000000000201326592", + "hardLimitError": true + }, + { + "bAssetIndex": 1, + "mAssetQty": "3496000000000000117440512", + "hardLimitError": true + }, + { + "bAssetIndex": 1, + "mAssetQty": "4195200000000000033554432", + "hardLimitError": true + }, + { + "bAssetIndex": 1, + "mAssetQty": "4894399999999999949668352", + "hardLimitError": true + }, + { + "bAssetIndex": 1, + "mAssetQty": "5593600000000000402653184", + "hardLimitError": true + }, + { + "bAssetIndex": 1, + "mAssetQty": "6292799999999999781896192", + "hardLimitError": true + }, + { + "bAssetIndex": 1, + "mAssetQty": "6992000000000000234881024", + "hardLimitError": true + }, + { + "bAssetIndex": 2, + "mAssetQty": "10000000000000", + "outputQty": "10164507628712", + "swapFee": "6000000000", + "priceReceived": 0.9838154847513411 + }, + { + "bAssetIndex": 2, + "mAssetQty": "1000000000000000", + "outputQty": "1016450762869405", + "swapFee": "600000000000", + "priceReceived": 0.9838154847530783 + }, + { + "bAssetIndex": 2, + "mAssetQty": "100000000000000000", + "outputQty": "101645076268747784", + "swapFee": "60000000000000", + "priceReceived": 0.9838154849291644 + }, + { + "bAssetIndex": 2, + "mAssetQty": "1000000000000000000", + "outputQty": "1016450761033593659", + "swapFee": "600000000000000", + "priceReceived": 0.9838154865299471 + }, + { + "bAssetIndex": 2, + "mAssetQty": "10000000000000000000", + "outputQty": "10164507444947540299", + "swapFee": "6000000000000000", + "priceReceived": 0.9838155025377731 + }, + { + "bAssetIndex": 2, + "mAssetQty": "100000000000000000000", + "outputQty": "101645057910657481556", + "swapFee": "60000000000000000", + "priceReceived": 0.9838156626158506 + }, + { + "bAssetIndex": 2, + "mAssetQty": "699200000000000050331648", + "outputQty": "709811194731357498535926", + "swapFee": "419520000000000030198", + "priceReceived": 0.9850506799412012 + }, + { + "bAssetIndex": 2, + "mAssetQty": "1398400000000000100663296", + "outputQty": "1417856802946775499008223", + "swapFee": "839040000000000060397", + "priceReceived": 0.9862773145311023 + }, + { + "bAssetIndex": 2, + "mAssetQty": "2097600000000000016777216", + "outputQty": "2124117621986889874550225", + "swapFee": "1258560000000000010066", + "priceReceived": 0.987515935222982 + }, + { + "bAssetIndex": 2, + "mAssetQty": "2796800000000000201326592", + "outputQty": "2828453206635174009338277", + "swapFee": "1678080000000000120795", + "priceReceived": 0.9888090046669609 + }, + { + "bAssetIndex": 2, + "mAssetQty": "3496000000000000117440512", + "outputQty": "3530389470952646920936233", + "swapFee": "2097600000000000070464", + "priceReceived": 0.9902590149796229 + }, + { + "bAssetIndex": 2, + "mAssetQty": "4195200000000000033554432", + "outputQty": "4228234336159812906095991", + "swapFee": "2517120000000000020132", + "priceReceived": 0.9921872030891704 + }, + { + "bAssetIndex": 2, + "mAssetQty": "4894399999999999949668352", + "hardLimitError": true + }, + { + "bAssetIndex": 2, + "mAssetQty": "5593600000000000402653184", + "hardLimitError": true + }, + { + "bAssetIndex": 2, + "mAssetQty": "6292799999999999781896192", + "hardLimitError": true + }, + { + "bAssetIndex": 2, + "mAssetQty": "6992000000000000234881024", + "hardLimitError": true + } + ] + }, + { + "reserve0": "500500000000000000000000", + "reserve1": "7492500000000000000000000", + "reserve2": "2007000000000000000000000", + "A": 120, + "mAssetSupply": "9896372713490403790662354", + "hardMin": 50000000000000000, + "hardMax": 750000000000000000, + "swapFeeRate": 600000000000000, + "redeems": [ + { + "bAssetIndex": 0, + "mAssetQty": "10000000000000", + "outputQty": "8317044958106", + "swapFee": "6000000000", + "priceReceived": 1.202350119588298 + }, + { + "bAssetIndex": 0, + "mAssetQty": "1000000000000000", + "outputQty": "831704495589349", + "swapFee": "600000000000", + "priceReceived": 1.2023501199081486 + }, + { + "bAssetIndex": 0, + "mAssetQty": "100000000000000000", + "outputQty": "83170447346076645", + "swapFee": "60000000000000", + "priceReceived": 1.202350151898242 + }, + { + "bAssetIndex": 0, + "mAssetQty": "1000000000000000000", + "outputQty": "831704272291620904", + "swapFee": "600000000000000", + "priceReceived": 1.2023504427176603 + }, + { + "bAssetIndex": 0, + "mAssetQty": "10000000000000000000", + "outputQty": "8317022605791788171", + "swapFee": "6000000000000000", + "priceReceived": 1.202353350949921 + }, + { + "bAssetIndex": 0, + "mAssetQty": "100000000000000000000", + "outputQty": "83168214135594263901", + "swapFee": "60000000000000000", + "priceReceived": 1.2023824370806355 + }, + { + "bAssetIndex": 0, + "mAssetQty": "699200000000000050331648", + "hardLimitError": true + }, + { + "bAssetIndex": 0, + "mAssetQty": "1398400000000000100663296", + "hardLimitError": true + }, + { + "bAssetIndex": 0, + "mAssetQty": "2097600000000000016777216", + "hardLimitError": true + }, + { + "bAssetIndex": 0, + "mAssetQty": "2796800000000000201326592", + "hardLimitError": true + }, + { + "bAssetIndex": 0, + "mAssetQty": "3496000000000000117440512", + "hardLimitError": true + }, + { + "bAssetIndex": 0, + "mAssetQty": "4195200000000000033554432", + "hardLimitError": true + }, + { + "bAssetIndex": 0, + "mAssetQty": "4894399999999999949668352", + "hardLimitError": true + }, + { + "bAssetIndex": 0, + "mAssetQty": "5593600000000000402653184", + "hardLimitError": true + }, + { + "bAssetIndex": 0, + "mAssetQty": "6292799999999999781896192", + "hardLimitError": true + }, + { + "bAssetIndex": 0, + "mAssetQty": "6992000000000000234881024", + "hardLimitError": true + }, + { + "bAssetIndex": 1, + "mAssetQty": "10000000000000", + "outputQty": "10315364828795", + "swapFee": "6000000000", + "priceReceived": 0.969427661160886 + }, + { + "bAssetIndex": 1, + "mAssetQty": "1000000000000000", + "outputQty": "1031536482876419", + "swapFee": "600000000000", + "priceReceived": 0.9694276611637815 + }, + { + "bAssetIndex": 1, + "mAssetQty": "100000000000000000", + "outputQty": "103153648256347236", + "swapFee": "60000000000000", + "priceReceived": 0.9694276614578856 + }, + { + "bAssetIndex": 1, + "mAssetQty": "1000000000000000000", + "outputQty": "1031536479718505769", + "swapFee": "600000000000000", + "priceReceived": 0.9694276641315568 + }, + { + "bAssetIndex": 1, + "mAssetQty": "10000000000000000000", + "outputQty": "10315364512688477585", + "swapFee": "6000000000000000", + "priceReceived": 0.9694276908682614 + }, + { + "bAssetIndex": 1, + "mAssetQty": "100000000000000000000", + "outputQty": "103153616677305760855", + "swapFee": "60000000000000000", + "priceReceived": 0.9694279582346474 + }, + { + "bAssetIndex": 1, + "mAssetQty": "699200000000000050331648", + "outputQty": "719735295724774695853497", + "swapFee": "419520000000000030198", + "priceReceived": 0.9714682663935558 + }, + { + "bAssetIndex": 1, + "mAssetQty": "1398400000000000100663296", + "outputQty": "1436562510306433132366436", + "swapFee": "839040000000000060397", + "priceReceived": 0.9734348418306611 + }, + { + "bAssetIndex": 1, + "mAssetQty": "2097600000000000016777216", + "outputQty": "2150665089589668874928626", + "swapFee": "1258560000000000010066", + "priceReceived": 0.975326195674756 + }, + { + "bAssetIndex": 1, + "mAssetQty": "2796800000000000201326592", + "outputQty": "2862225880440749949280956", + "swapFee": "1678080000000000120795", + "priceReceived": 0.9771416082539667 + }, + { + "bAssetIndex": 1, + "mAssetQty": "3496000000000000117440512", + "outputQty": "3571424149396287304299315", + "swapFee": "2097600000000000070464", + "priceReceived": 0.9788812120204101 + }, + { + "bAssetIndex": 1, + "mAssetQty": "4195200000000000033554432", + "outputQty": "4278428870450291387040727", + "swapFee": "2517120000000000020132", + "priceReceived": 0.980546861249669 + }, + { + "bAssetIndex": 1, + "mAssetQty": "4894399999999999949668352", + "outputQty": "4983381031041406904758446", + "swapFee": "2936639999999999969801", + "priceReceived": 0.9821444456108924 + }, + { + "bAssetIndex": 1, + "mAssetQty": "5593600000000000402653184", + "outputQty": "5686335360077022575227123", + "swapFee": "3356160000000000241591", + "priceReceived": 0.9836915422315566 + }, + { + "bAssetIndex": 1, + "mAssetQty": "6292799999999999781896192", + "outputQty": "6386983946516870516850932", + "swapFee": "3775679999999999869137", + "priceReceived": 0.9852537680843501 + }, + { + "bAssetIndex": 1, + "mAssetQty": "6992000000000000234881024", + "outputQty": "7081669723679473743584718", + "swapFee": "4195200000000000140928", + "priceReceived": 0.9873377710090547 + }, + { + "bAssetIndex": 2, + "mAssetQty": "10000000000000", + "outputQty": "9852235534025", + "swapFee": "6000000000", + "priceReceived": 1.0149980646995995 + }, + { + "bAssetIndex": 2, + "mAssetQty": "1000000000000000", + "outputQty": "985223553389812", + "swapFee": "600000000000", + "priceReceived": 1.0149980647126708 + }, + { + "bAssetIndex": 2, + "mAssetQty": "100000000000000000", + "outputQty": "98522355212417833", + "swapFee": "60000000000000", + "priceReceived": 1.0149980660165534 + }, + { + "bAssetIndex": 2, + "mAssetQty": "1000000000000000000", + "outputQty": "985223540618413979", + "swapFee": "600000000000000", + "priceReceived": 1.0149980778700345 + }, + { + "bAssetIndex": 2, + "mAssetQty": "10000000000000000000", + "outputQty": "9852234255602968696", + "swapFee": "6000000000000000", + "priceReceived": 1.014998196405348 + }, + { + "bAssetIndex": 2, + "mAssetQty": "100000000000000000000", + "outputQty": "98522227493176110124", + "swapFee": "60000000000000000", + "priceReceived": 1.014999381808803 + }, + { + "bAssetIndex": 2, + "mAssetQty": "699200000000000050331648", + "hardLimitError": true + }, + { + "bAssetIndex": 2, + "mAssetQty": "1398400000000000100663296", + "hardLimitError": true + }, + { + "bAssetIndex": 2, + "mAssetQty": "2097600000000000016777216", + "hardLimitError": true + }, + { + "bAssetIndex": 2, + "mAssetQty": "2796800000000000201326592", + "hardLimitError": true + }, + { + "bAssetIndex": 2, + "mAssetQty": "3496000000000000117440512", + "hardLimitError": true + }, + { + "bAssetIndex": 2, + "mAssetQty": "4195200000000000033554432", + "hardLimitError": true + }, + { + "bAssetIndex": 2, + "mAssetQty": "4894399999999999949668352", + "hardLimitError": true + }, + { + "bAssetIndex": 2, + "mAssetQty": "5593600000000000402653184", + "hardLimitError": true + }, + { + "bAssetIndex": 2, + "mAssetQty": "6292799999999999781896192", + "hardLimitError": true + }, + { + "bAssetIndex": 2, + "mAssetQty": "6992000000000000234881024", + "hardLimitError": true + } + ] + }, + { + "reserve0": "3996499999999999360000000", + "reserve1": "500500000000000000000000", + "reserve2": "5503000000000000000000000", + "A": 120, + "mAssetSupply": "9936488013915504712820075", + "hardMin": 50000000000000000, + "hardMax": 750000000000000000, + "swapFeeRate": 600000000000000, + "redeems": [ + { + "bAssetIndex": 0, + "mAssetQty": "10000000000000", + "outputQty": "10102482433971", + "swapFee": "6000000000", + "priceReceived": 0.9898557176772326 + }, + { + "bAssetIndex": 0, + "mAssetQty": "1000000000000000", + "outputQty": "1010248243395131", + "swapFee": "600000000000", + "priceReceived": 0.9898557176791619 + }, + { + "bAssetIndex": 0, + "mAssetQty": "100000000000000000", + "outputQty": "101024824319319536", + "swapFee": "60000000000000", + "priceReceived": 0.9898557178770213 + }, + { + "bAssetIndex": 0, + "mAssetQty": "1000000000000000000", + "outputQty": "1010248241357415368", + "swapFee": "600000000000000", + "priceReceived": 0.9898557196757449 + }, + { + "bAssetIndex": 0, + "mAssetQty": "10000000000000000000", + "outputQty": "10102482229996021343", + "swapFee": "6000000000000000", + "priceReceived": 0.989855737662994 + }, + { + "bAssetIndex": 0, + "mAssetQty": "100000000000000000000", + "outputQty": "101024803942014778472", + "swapFee": "60000000000000000", + "priceReceived": 0.9898559175368161 + }, + { + "bAssetIndex": 0, + "mAssetQty": "699200000000000050331648", + "outputQty": "705304582913346103367752", + "swapFee": "419520000000000030198", + "priceReceived": 0.9913447564906919 + }, + { + "bAssetIndex": 0, + "mAssetQty": "1398400000000000100663296", + "outputQty": "1408072410479239344834297", + "swapFee": "839040000000000060397", + "priceReceived": 0.9931307435560454 + }, + { + "bAssetIndex": 0, + "mAssetQty": "2097600000000000016777216", + "outputQty": "2106940933929894641926187", + "swapFee": "1258560000000000010066", + "priceReceived": 0.9955665895614493 + }, + { + "bAssetIndex": 0, + "mAssetQty": "2796800000000000201326592", + "hardLimitError": true + }, + { + "bAssetIndex": 0, + "mAssetQty": "3496000000000000117440512", + "hardLimitError": true + }, + { + "bAssetIndex": 0, + "mAssetQty": "4195200000000000033554432", + "hardLimitError": true + }, + { + "bAssetIndex": 0, + "mAssetQty": "4894399999999999949668352", + "hardLimitError": true + }, + { + "bAssetIndex": 0, + "mAssetQty": "5593600000000000402653184", + "hardLimitError": true + }, + { + "bAssetIndex": 0, + "mAssetQty": "6292799999999999781896192", + "hardLimitError": true + }, + { + "bAssetIndex": 0, + "mAssetQty": "6992000000000000234881024", + "hardLimitError": true + }, + { + "bAssetIndex": 1, + "mAssetQty": "10000000000000", + "outputQty": "8741464880681", + "swapFee": "6000000000", + "priceReceived": 1.1439730224279017 + }, + { + "bAssetIndex": 1, + "mAssetQty": "1000000000000000", + "outputQty": "874146487884345", + "swapFee": "600000000000", + "priceReceived": 1.143973022668377 + }, + { + "bAssetIndex": 1, + "mAssetQty": "100000000000000000", + "outputQty": "87414646950531602", + "swapFee": "60000000000000", + "priceReceived": 1.14397304672054 + }, + { + "bAssetIndex": 1, + "mAssetQty": "1000000000000000000", + "outputQty": "874146302423016603", + "swapFee": "600000000000000", + "priceReceived": 1.1439732653768984 + }, + { + "bAssetIndex": 1, + "mAssetQty": "10000000000000000000", + "outputQty": "8741446315790339457", + "swapFee": "6000000000000000", + "priceReceived": 1.143975451972546 + }, + { + "bAssetIndex": 1, + "mAssetQty": "100000000000000000000", + "outputQty": "87412792104014619454", + "swapFee": "60000000000000000", + "priceReceived": 1.1439973211358763 + }, + { + "bAssetIndex": 1, + "mAssetQty": "699200000000000050331648", + "hardLimitError": true + }, + { + "bAssetIndex": 1, + "mAssetQty": "1398400000000000100663296", + "hardLimitError": true + }, + { + "bAssetIndex": 1, + "mAssetQty": "2097600000000000016777216", + "hardLimitError": true + }, + { + "bAssetIndex": 1, + "mAssetQty": "2796800000000000201326592", + "hardLimitError": true + }, + { + "bAssetIndex": 1, + "mAssetQty": "3496000000000000117440512", + "hardLimitError": true + }, + { + "bAssetIndex": 1, + "mAssetQty": "4195200000000000033554432", + "hardLimitError": true + }, + { + "bAssetIndex": 1, + "mAssetQty": "4894399999999999949668352", + "hardLimitError": true + }, + { + "bAssetIndex": 1, + "mAssetQty": "5593600000000000402653184", + "hardLimitError": true + }, + { + "bAssetIndex": 1, + "mAssetQty": "6292799999999999781896192", + "hardLimitError": true + }, + { + "bAssetIndex": 1, + "mAssetQty": "6992000000000000234881024", + "hardLimitError": true + }, + { + "bAssetIndex": 2, + "mAssetQty": "10000000000000", + "outputQty": "10164507628712", + "swapFee": "6000000000", + "priceReceived": 0.9838154847513411 + }, + { + "bAssetIndex": 2, + "mAssetQty": "1000000000000000", + "outputQty": "1016450762869405", + "swapFee": "600000000000", + "priceReceived": 0.9838154847530783 + }, + { + "bAssetIndex": 2, + "mAssetQty": "100000000000000000", + "outputQty": "101645076268747784", + "swapFee": "60000000000000", + "priceReceived": 0.9838154849291644 + }, + { + "bAssetIndex": 2, + "mAssetQty": "1000000000000000000", + "outputQty": "1016450761033593659", + "swapFee": "600000000000000", + "priceReceived": 0.9838154865299471 + }, + { + "bAssetIndex": 2, + "mAssetQty": "10000000000000000000", + "outputQty": "10164507444947540299", + "swapFee": "6000000000000000", + "priceReceived": 0.9838155025377731 + }, + { + "bAssetIndex": 2, + "mAssetQty": "100000000000000000000", + "outputQty": "101645057910657481556", + "swapFee": "60000000000000000", + "priceReceived": 0.9838156626158506 + }, + { + "bAssetIndex": 2, + "mAssetQty": "699200000000000050331648", + "outputQty": "709811194731357498535926", + "swapFee": "419520000000000030198", + "priceReceived": 0.9850506799412012 + }, + { + "bAssetIndex": 2, + "mAssetQty": "1398400000000000100663296", + "outputQty": "1417856802946775499008223", + "swapFee": "839040000000000060397", + "priceReceived": 0.9862773145311023 + }, + { + "bAssetIndex": 2, + "mAssetQty": "2097600000000000016777216", + "outputQty": "2124117621986889874550225", + "swapFee": "1258560000000000010066", + "priceReceived": 0.987515935222982 + }, + { + "bAssetIndex": 2, + "mAssetQty": "2796800000000000201326592", + "outputQty": "2828453206635174009338277", + "swapFee": "1678080000000000120795", + "priceReceived": 0.9888090046669609 + }, + { + "bAssetIndex": 2, + "mAssetQty": "3496000000000000117440512", + "outputQty": "3530389470952646920936233", + "swapFee": "2097600000000000070464", + "priceReceived": 0.9902590149796229 + }, + { + "bAssetIndex": 2, + "mAssetQty": "4195200000000000033554432", + "outputQty": "4228234336159812906095991", + "swapFee": "2517120000000000020132", + "priceReceived": 0.9921872030891704 + }, + { + "bAssetIndex": 2, + "mAssetQty": "4894399999999999949668352", + "hardLimitError": true + }, + { + "bAssetIndex": 2, + "mAssetQty": "5593600000000000402653184", + "hardLimitError": true + }, + { + "bAssetIndex": 2, + "mAssetQty": "6292799999999999781896192", + "hardLimitError": true + }, + { + "bAssetIndex": 2, + "mAssetQty": "6992000000000000234881024", + "hardLimitError": true + } + ] + }, + { + "reserve0": "3996499999999999360000000", + "reserve1": "3996499999999999360000000", + "reserve2": "2007000000000000960000000", + "A": 120, + "mAssetSupply": "9995726520619110731126433", + "hardMin": 50000000000000000, + "hardMax": 750000000000000000, + "swapFeeRate": 600000000000000, + "redeems": [ + { + "bAssetIndex": 0, + "mAssetQty": "10000000000000", + "outputQty": "10014092705535", + "swapFee": "6000000000", + "priceReceived": 0.9985927126950591 + }, + { + "bAssetIndex": 0, + "mAssetQty": "1000000000000000", + "outputQty": "1001409270552820", + "swapFee": "600000000000", + "priceReceived": 0.9985927126957372 + }, + { + "bAssetIndex": 0, + "mAssetQty": "100000000000000000", + "outputQty": "100140927048184973", + "swapFee": "60000000000000", + "priceReceived": 0.998592712766508 + }, + { + "bAssetIndex": 0, + "mAssetQty": "1000000000000000000", + "outputQty": "1001409269836665323", + "swapFee": "600000000000000", + "priceReceived": 0.9985927134098777 + }, + { + "bAssetIndex": 0, + "mAssetQty": "10000000000000000000", + "outputQty": "10014092633848165782", + "swapFee": "6000000000000000", + "priceReceived": 0.99859271984358 + }, + { + "bAssetIndex": 0, + "mAssetQty": "100000000000000000000", + "outputQty": "100140919886586598600", + "swapFee": "60000000000000000", + "priceReceived": 0.9985927841810701 + }, + { + "bAssetIndex": 0, + "mAssetQty": "699200000000000050331648", + "outputQty": "699812492593522390954084", + "swapFee": "419520000000000030198", + "priceReceived": 0.9991247761364584 + }, + { + "bAssetIndex": 0, + "mAssetQty": "1398400000000000100663296", + "outputQty": "1398732791081049832328563", + "swapFee": "839040000000000060397", + "priceReceived": 0.9997620767288994 + }, + { + "bAssetIndex": 0, + "mAssetQty": "2097600000000000016777216", + "outputQty": "2096274676868418159589052", + "swapFee": "1258560000000000010066", + "priceReceived": 1.0006322278021131 + }, + { + "bAssetIndex": 0, + "mAssetQty": "2796800000000000201326592", + "outputQty": "2790798619219561685672826", + "swapFee": "1678080000000000120795", + "priceReceived": 1.0021504169950166 + }, + { + "bAssetIndex": 0, + "mAssetQty": "3496000000000000117440512", + "outputQty": "3472493299533946121231065", + "swapFee": "2097600000000000070464", + "priceReceived": 1.0067694012452693 + }, + { + "bAssetIndex": 0, + "mAssetQty": "4195200000000000033554432", + "hardLimitError": true + }, + { + "bAssetIndex": 0, + "mAssetQty": "4894399999999999949668352", + "hardLimitError": true + }, + { + "bAssetIndex": 0, + "mAssetQty": "5593600000000000402653184", + "hardLimitError": true + }, + { + "bAssetIndex": 0, + "mAssetQty": "6292799999999999781896192", + "hardLimitError": true + }, + { + "bAssetIndex": 0, + "mAssetQty": "6992000000000000234881024", + "hardLimitError": true + }, + { + "bAssetIndex": 1, + "mAssetQty": "10000000000000", + "outputQty": "10014092705535", + "swapFee": "6000000000", + "priceReceived": 0.9985927126950591 + }, + { + "bAssetIndex": 1, + "mAssetQty": "1000000000000000", + "outputQty": "1001409270552820", + "swapFee": "600000000000", + "priceReceived": 0.9985927126957372 + }, + { + "bAssetIndex": 1, + "mAssetQty": "100000000000000000", + "outputQty": "100140927048184973", + "swapFee": "60000000000000", + "priceReceived": 0.998592712766508 + }, + { + "bAssetIndex": 1, + "mAssetQty": "1000000000000000000", + "outputQty": "1001409269836665323", + "swapFee": "600000000000000", + "priceReceived": 0.9985927134098777 + }, + { + "bAssetIndex": 1, + "mAssetQty": "10000000000000000000", + "outputQty": "10014092633848165782", + "swapFee": "6000000000000000", + "priceReceived": 0.99859271984358 + }, + { + "bAssetIndex": 1, + "mAssetQty": "100000000000000000000", + "outputQty": "100140919886586598600", + "swapFee": "60000000000000000", + "priceReceived": 0.9985927841810701 + }, + { + "bAssetIndex": 1, + "mAssetQty": "699200000000000050331648", + "outputQty": "699812492593522390954084", + "swapFee": "419520000000000030198", + "priceReceived": 0.9991247761364584 + }, + { + "bAssetIndex": 1, + "mAssetQty": "1398400000000000100663296", + "outputQty": "1398732791081049832328563", + "swapFee": "839040000000000060397", + "priceReceived": 0.9997620767288994 + }, + { + "bAssetIndex": 1, + "mAssetQty": "2097600000000000016777216", + "outputQty": "2096274676868418159589052", + "swapFee": "1258560000000000010066", + "priceReceived": 1.0006322278021131 + }, + { + "bAssetIndex": 1, + "mAssetQty": "2796800000000000201326592", + "outputQty": "2790798619219561685672826", + "swapFee": "1678080000000000120795", + "priceReceived": 1.0021504169950166 + }, + { + "bAssetIndex": 1, + "mAssetQty": "3496000000000000117440512", + "outputQty": "3472493299533946121231065", + "swapFee": "2097600000000000070464", + "priceReceived": 1.0067694012452693 + }, + { + "bAssetIndex": 1, + "mAssetQty": "4195200000000000033554432", + "hardLimitError": true + }, + { + "bAssetIndex": 1, + "mAssetQty": "4894399999999999949668352", + "hardLimitError": true + }, + { + "bAssetIndex": 1, + "mAssetQty": "5593600000000000402653184", + "hardLimitError": true + }, + { + "bAssetIndex": 1, + "mAssetQty": "6292799999999999781896192", + "hardLimitError": true + }, + { + "bAssetIndex": 1, + "mAssetQty": "6992000000000000234881024", + "hardLimitError": true + }, + { + "bAssetIndex": 2, + "mAssetQty": "10000000000000", + "outputQty": "9935761590471", + "swapFee": "6000000000", + "priceReceived": 1.0064653734838613 + }, + { + "bAssetIndex": 2, + "mAssetQty": "1000000000000000", + "outputQty": "993576159043733", + "swapFee": "600000000000", + "priceReceived": 1.0064653734872722 + }, + { + "bAssetIndex": 2, + "mAssetQty": "100000000000000000", + "outputQty": "99357615870945108", + "swapFee": "60000000000000", + "priceReceived": 1.0064653738258904 + }, + { + "bAssetIndex": 2, + "mAssetQty": "1000000000000000000", + "outputQty": "993576155670517734", + "swapFee": "600000000000000", + "priceReceived": 1.0064653769042466 + }, + { + "bAssetIndex": 2, + "mAssetQty": "10000000000000000000", + "outputQty": "9935761252810493721", + "swapFee": "6000000000000000", + "priceReceived": 1.006465407687945 + }, + { + "bAssetIndex": 2, + "mAssetQty": "100000000000000000000", + "outputQty": "99357582137287342596", + "swapFee": "60000000000000000", + "priceReceived": 1.0064657155386993 + }, + { + "bAssetIndex": 2, + "mAssetQty": "699200000000000050331648", + "outputQty": "692277120953961843804569", + "swapFee": "419520000000000030198", + "priceReceived": 1.01000015577071 + }, + { + "bAssetIndex": 2, + "mAssetQty": "1398400000000000100663296", + "outputQty": "1370416125300544307124714", + "swapFee": "839040000000000060397", + "priceReceived": 1.0204199835238503 + }, + { + "bAssetIndex": 2, + "mAssetQty": "2097600000000000016777216", + "hardLimitError": true + }, + { + "bAssetIndex": 2, + "mAssetQty": "2796800000000000201326592", + "hardLimitError": true + }, + { + "bAssetIndex": 2, + "mAssetQty": "3496000000000000117440512", + "hardLimitError": true + }, + { + "bAssetIndex": 2, + "mAssetQty": "4195200000000000033554432", + "hardLimitError": true + }, + { + "bAssetIndex": 2, + "mAssetQty": "4894399999999999949668352", + "hardLimitError": true + }, + { + "bAssetIndex": 2, + "mAssetQty": "5593600000000000402653184", + "hardLimitError": true + }, + { + "bAssetIndex": 2, + "mAssetQty": "6292799999999999781896192", + "hardLimitError": true + }, + { + "bAssetIndex": 2, + "mAssetQty": "6992000000000000234881024", + "hardLimitError": true + } + ] + }, + { + "reserve0": "7492500000000000000000000", + "reserve1": "500500000000000000000000", + "reserve2": "2007000000000000000000000", + "A": 120, + "mAssetSupply": "9896372713490403790662354", + "hardMin": 50000000000000000, + "hardMax": 750000000000000000, + "swapFeeRate": 600000000000000, + "redeems": [ + { + "bAssetIndex": 0, + "mAssetQty": "10000000000000", + "outputQty": "10315364828795", + "swapFee": "6000000000", + "priceReceived": 0.969427661160886 + }, + { + "bAssetIndex": 0, + "mAssetQty": "1000000000000000", + "outputQty": "1031536482876419", + "swapFee": "600000000000", + "priceReceived": 0.9694276611637815 + }, + { + "bAssetIndex": 0, + "mAssetQty": "100000000000000000", + "outputQty": "103153648256347236", + "swapFee": "60000000000000", + "priceReceived": 0.9694276614578856 + }, + { + "bAssetIndex": 0, + "mAssetQty": "1000000000000000000", + "outputQty": "1031536479718505769", + "swapFee": "600000000000000", + "priceReceived": 0.9694276641315568 + }, + { + "bAssetIndex": 0, + "mAssetQty": "10000000000000000000", + "outputQty": "10315364512688477585", + "swapFee": "6000000000000000", + "priceReceived": 0.9694276908682614 + }, + { + "bAssetIndex": 0, + "mAssetQty": "100000000000000000000", + "outputQty": "103153616677305760855", + "swapFee": "60000000000000000", + "priceReceived": 0.9694279582346474 + }, + { + "bAssetIndex": 0, + "mAssetQty": "699200000000000050331648", + "outputQty": "719735295724774695853497", + "swapFee": "419520000000000030198", + "priceReceived": 0.9714682663935558 + }, + { + "bAssetIndex": 0, + "mAssetQty": "1398400000000000100663296", + "outputQty": "1436562510306433132366436", + "swapFee": "839040000000000060397", + "priceReceived": 0.9734348418306611 + }, + { + "bAssetIndex": 0, + "mAssetQty": "2097600000000000016777216", + "outputQty": "2150665089589668874928626", + "swapFee": "1258560000000000010066", + "priceReceived": 0.975326195674756 + }, + { + "bAssetIndex": 0, + "mAssetQty": "2796800000000000201326592", + "outputQty": "2862225880440749949280956", + "swapFee": "1678080000000000120795", + "priceReceived": 0.9771416082539667 + }, + { + "bAssetIndex": 0, + "mAssetQty": "3496000000000000117440512", + "outputQty": "3571424149396287304299315", + "swapFee": "2097600000000000070464", + "priceReceived": 0.9788812120204101 + }, + { + "bAssetIndex": 0, + "mAssetQty": "4195200000000000033554432", + "outputQty": "4278428870450291387040727", + "swapFee": "2517120000000000020132", + "priceReceived": 0.980546861249669 + }, + { + "bAssetIndex": 0, + "mAssetQty": "4894399999999999949668352", + "outputQty": "4983381031041406904758446", + "swapFee": "2936639999999999969801", + "priceReceived": 0.9821444456108924 + }, + { + "bAssetIndex": 0, + "mAssetQty": "5593600000000000402653184", + "outputQty": "5686335360077022575227123", + "swapFee": "3356160000000000241591", + "priceReceived": 0.9836915422315566 + }, + { + "bAssetIndex": 0, + "mAssetQty": "6292799999999999781896192", + "outputQty": "6386983946516870516850932", + "swapFee": "3775679999999999869137", + "priceReceived": 0.9852537680843501 + }, + { + "bAssetIndex": 0, + "mAssetQty": "6992000000000000234881024", + "outputQty": "7081669723679473743584718", + "swapFee": "4195200000000000140928", + "priceReceived": 0.9873377710090547 + }, + { + "bAssetIndex": 1, + "mAssetQty": "10000000000000", + "outputQty": "8317044958106", + "swapFee": "6000000000", + "priceReceived": 1.202350119588298 + }, + { + "bAssetIndex": 1, + "mAssetQty": "1000000000000000", + "outputQty": "831704495589349", + "swapFee": "600000000000", + "priceReceived": 1.2023501199081486 + }, + { + "bAssetIndex": 1, + "mAssetQty": "100000000000000000", + "outputQty": "83170447346076645", + "swapFee": "60000000000000", + "priceReceived": 1.202350151898242 + }, + { + "bAssetIndex": 1, + "mAssetQty": "1000000000000000000", + "outputQty": "831704272291620904", + "swapFee": "600000000000000", + "priceReceived": 1.2023504427176603 + }, + { + "bAssetIndex": 1, + "mAssetQty": "10000000000000000000", + "outputQty": "8317022605791788171", + "swapFee": "6000000000000000", + "priceReceived": 1.202353350949921 + }, + { + "bAssetIndex": 1, + "mAssetQty": "100000000000000000000", + "outputQty": "83168214135594263901", + "swapFee": "60000000000000000", + "priceReceived": 1.2023824370806355 + }, + { + "bAssetIndex": 1, + "mAssetQty": "699200000000000050331648", + "hardLimitError": true + }, + { + "bAssetIndex": 1, + "mAssetQty": "1398400000000000100663296", + "hardLimitError": true + }, + { + "bAssetIndex": 1, + "mAssetQty": "2097600000000000016777216", + "hardLimitError": true + }, + { + "bAssetIndex": 1, + "mAssetQty": "2796800000000000201326592", + "hardLimitError": true + }, + { + "bAssetIndex": 1, + "mAssetQty": "3496000000000000117440512", + "hardLimitError": true + }, + { + "bAssetIndex": 1, + "mAssetQty": "4195200000000000033554432", + "hardLimitError": true + }, + { + "bAssetIndex": 1, + "mAssetQty": "4894399999999999949668352", + "hardLimitError": true + }, + { + "bAssetIndex": 1, + "mAssetQty": "5593600000000000402653184", + "hardLimitError": true + }, + { + "bAssetIndex": 1, + "mAssetQty": "6292799999999999781896192", + "hardLimitError": true + }, + { + "bAssetIndex": 1, + "mAssetQty": "6992000000000000234881024", + "hardLimitError": true + }, + { + "bAssetIndex": 2, + "mAssetQty": "10000000000000", + "outputQty": "9852235534025", + "swapFee": "6000000000", + "priceReceived": 1.0149980646995995 + }, + { + "bAssetIndex": 2, + "mAssetQty": "1000000000000000", + "outputQty": "985223553389812", + "swapFee": "600000000000", + "priceReceived": 1.0149980647126708 + }, + { + "bAssetIndex": 2, + "mAssetQty": "100000000000000000", + "outputQty": "98522355212417833", + "swapFee": "60000000000000", + "priceReceived": 1.0149980660165534 + }, + { + "bAssetIndex": 2, + "mAssetQty": "1000000000000000000", + "outputQty": "985223540618413979", + "swapFee": "600000000000000", + "priceReceived": 1.0149980778700345 + }, + { + "bAssetIndex": 2, + "mAssetQty": "10000000000000000000", + "outputQty": "9852234255602968696", + "swapFee": "6000000000000000", + "priceReceived": 1.014998196405348 + }, + { + "bAssetIndex": 2, + "mAssetQty": "100000000000000000000", + "outputQty": "98522227493176110124", + "swapFee": "60000000000000000", + "priceReceived": 1.014999381808803 + }, + { + "bAssetIndex": 2, + "mAssetQty": "699200000000000050331648", + "hardLimitError": true + }, + { + "bAssetIndex": 2, + "mAssetQty": "1398400000000000100663296", + "hardLimitError": true + }, + { + "bAssetIndex": 2, + "mAssetQty": "2097600000000000016777216", + "hardLimitError": true + }, + { + "bAssetIndex": 2, + "mAssetQty": "2796800000000000201326592", + "hardLimitError": true + }, + { + "bAssetIndex": 2, + "mAssetQty": "3496000000000000117440512", + "hardLimitError": true + }, + { + "bAssetIndex": 2, + "mAssetQty": "4195200000000000033554432", + "hardLimitError": true + }, + { + "bAssetIndex": 2, + "mAssetQty": "4894399999999999949668352", + "hardLimitError": true + }, + { + "bAssetIndex": 2, + "mAssetQty": "5593600000000000402653184", + "hardLimitError": true + }, + { + "bAssetIndex": 2, + "mAssetQty": "6292799999999999781896192", + "hardLimitError": true + }, + { + "bAssetIndex": 2, + "mAssetQty": "6992000000000000234881024", + "hardLimitError": true + } + ] + } +] \ No newline at end of file diff --git a/test-utils/validator-data/full/swapTestData.json b/test-utils/validator-data/full/swapTestData.json new file mode 100644 index 00000000..b9a00f7f --- /dev/null +++ b/test-utils/validator-data/full/swapTestData.json @@ -0,0 +1,10442 @@ +[ + { + "reserve0": "5503000000000000000000000", + "reserve1": "500500000000000000000000", + "reserve2": "3996499999999999360000000", + "A": 120, + "mAssetSupply": "9936488013915504712820075", + "hardMin": 50000000000000000, + "hardMax": 750000000000000000, + "swapFeeRate": 600000000000000, + "swaps": [ + { + "inputIndex": 0, + "inputQty": "10000000000000", + "outputIndex": 1, + "outputQty": "8594828515917", + "swapFee": "5899351172", + "priceReceived": 1.1628039617450947 + }, + { + "inputIndex": 0, + "inputQty": "1000000000000000", + "outputIndex": 1, + "outputQty": "859482851387857", + "swapFee": "589935117275", + "priceReceived": 1.1628039620207888 + }, + { + "inputIndex": 0, + "inputQty": "100000000000000000", + "outputIndex": 1, + "outputQty": "85948283101101317", + "swapFee": "58993511717134", + "priceReceived": 1.1628039895889701 + }, + { + "inputIndex": 0, + "inputQty": "1000000000000000000", + "outputIndex": 1, + "outputQty": "859482645766757989", + "swapFee": "589935116226982", + "priceReceived": 1.1628042402091592 + }, + { + "inputIndex": 0, + "inputQty": "10000000000000000000", + "outputIndex": 1, + "outputQty": "8594807933019418572", + "swapFee": "5899351067834018", + "priceReceived": 1.1628067464471152 + }, + { + "inputIndex": 0, + "inputQty": "100000000000000000000", + "outputIndex": 1, + "outputQty": "85946226642713984426", + "swapFee": "58993501234750486", + "priceReceived": 1.1628318124334742 + }, + { + "inputIndex": 0, + "inputQty": "699200000000000050331648", + "outputIndex": 1, + "hardLimitError": true + }, + { + "inputIndex": 0, + "inputQty": "1398400000000000100663296", + "outputIndex": 1, + "hardLimitError": true + }, + { + "inputIndex": 0, + "inputQty": "2097600000000000016777216", + "outputIndex": 1, + "hardLimitError": true + }, + { + "inputIndex": 0, + "inputQty": "2796800000000000201326592", + "outputIndex": 1, + "hardLimitError": true + }, + { + "inputIndex": 0, + "inputQty": "3496000000000000117440512", + "outputIndex": 1, + "hardLimitError": true + }, + { + "inputIndex": 0, + "inputQty": "4195200000000000033554432", + "outputIndex": 1, + "hardLimitError": true + }, + { + "inputIndex": 0, + "inputQty": "4894399999999999949668352", + "outputIndex": 1, + "hardLimitError": true + }, + { + "inputIndex": 0, + "inputQty": "5593600000000000402653184", + "outputIndex": 1, + "hardLimitError": true + }, + { + "inputIndex": 0, + "inputQty": "6292799999999999781896192", + "outputIndex": 1, + "hardLimitError": true + }, + { + "inputIndex": 0, + "inputQty": "6992000000000000234881024", + "outputIndex": 1, + "hardLimitError": true + }, + { + "inputIndex": 0, + "inputQty": "10000000000000", + "outputIndex": 2, + "outputQty": "9933015265778", + "swapFee": "5899351172", + "priceReceived": 1.006149732122174 + }, + { + "inputIndex": 0, + "inputQty": "1000000000000000", + "outputIndex": 2, + "outputQty": "993301526573337", + "swapFee": "589935117275", + "priceReceived": 1.0061497321266193 + }, + { + "inputIndex": 0, + "inputQty": "100000000000000000", + "outputIndex": 2, + "outputQty": "99330152613560344", + "swapFee": "58993511717134", + "priceReceived": 1.0061497325701192 + }, + { + "inputIndex": 0, + "inputQty": "1000000000000000000", + "outputIndex": 2, + "outputQty": "993301522156207633", + "swapFee": "589935116226982", + "priceReceived": 1.0061497366019387 + }, + { + "inputIndex": 0, + "inputQty": "10000000000000000000", + "outputIndex": 2, + "outputQty": "9933014823622019721", + "swapFee": "5899351067834018", + "priceReceived": 1.006149776920183 + }, + { + "inputIndex": 0, + "inputQty": "100000000000000000000", + "outputIndex": 2, + "outputQty": "99330108441738514131", + "swapFee": "58993501234750486", + "priceReceived": 1.0061501801076262 + }, + { + "inputIndex": 0, + "inputQty": "699200000000000050331648", + "outputIndex": 2, + "outputQty": "692112050839051884447054", + "swapFee": "411965810390800782245", + "priceReceived": 1.0096458129033645 + }, + { + "inputIndex": 0, + "inputQty": "1398400000000000100663296", + "outputIndex": 2, + "hardLimitError": true + }, + { + "inputIndex": 0, + "inputQty": "2097600000000000016777216", + "outputIndex": 2, + "hardLimitError": true + }, + { + "inputIndex": 0, + "inputQty": "2796800000000000201326592", + "outputIndex": 2, + "hardLimitError": true + }, + { + "inputIndex": 0, + "inputQty": "3496000000000000117440512", + "outputIndex": 2, + "hardLimitError": true + }, + { + "inputIndex": 0, + "inputQty": "4195200000000000033554432", + "outputIndex": 2, + "hardLimitError": true + }, + { + "inputIndex": 0, + "inputQty": "4894399999999999949668352", + "outputIndex": 2, + "hardLimitError": true + }, + { + "inputIndex": 0, + "inputQty": "5593600000000000402653184", + "outputIndex": 2, + "hardLimitError": true + }, + { + "inputIndex": 0, + "inputQty": "6292799999999999781896192", + "outputIndex": 2, + "hardLimitError": true + }, + { + "inputIndex": 0, + "inputQty": "6992000000000000234881024", + "outputIndex": 2, + "hardLimitError": true + }, + { + "inputIndex": 1, + "inputQty": "10000000000000", + "outputIndex": 0, + "outputQty": "11620945759945", + "swapFee": "6859719831", + "priceReceived": 0.8599248707117532 + }, + { + "inputIndex": 1, + "inputQty": "1000000000000000", + "outputIndex": 0, + "outputQty": "1162094575673868", + "swapFee": "685971983000", + "priceReceived": 0.8599248709491 + }, + { + "inputIndex": 1, + "inputQty": "100000000000000000", + "outputIndex": 0, + "outputQty": "116209454362088099", + "swapFee": "68597196650141", + "priceReceived": 0.8599248946818155 + }, + { + "inputIndex": 1, + "inputQty": "1000000000000000000", + "outputIndex": 0, + "outputQty": "1162094252230663839", + "swapFee": "685971816509847", + "priceReceived": 0.8599251104334148 + }, + { + "inputIndex": 1, + "inputQty": "10000000000000000000", + "outputIndex": 0, + "outputQty": "11620913383853133332", + "swapFee": "6859703166228994", + "priceReceived": 0.8599272679132866 + }, + { + "inputIndex": 1, + "inputQty": "100000000000000000000", + "outputIndex": 0, + "outputQty": "116206220561278555141", + "swapFee": "68595532062973176", + "priceReceived": 0.8599488391005764 + }, + { + "inputIndex": 1, + "inputQty": "699200000000000050331648", + "outputIndex": 0, + "outputQty": "745890348448147376765907", + "swapFee": "445006902707531211857", + "priceReceived": 0.9368065889994129 + }, + { + "inputIndex": 1, + "inputQty": "1398400000000000100663296", + "outputIndex": 0, + "outputQty": "1455978176046775934050805", + "swapFee": "871263438783980145513", + "priceReceived": 0.9598555524752027 + }, + { + "inputIndex": 1, + "inputQty": "2097600000000000016777216", + "outputIndex": 0, + "outputQty": "2158527843482740112916076", + "swapFee": "1293720116988526957620", + "priceReceived": 0.9711740741322403 + }, + { + "inputIndex": 1, + "inputQty": "2796800000000000201326592", + "outputIndex": 0, + "outputQty": "2857415815532514252372830", + "swapFee": "1714701523310602758700", + "priceReceived": 0.9781864030019696 + }, + { + "inputIndex": 1, + "inputQty": "3496000000000000117440512", + "outputIndex": 0, + "outputQty": "3552759522564674531561542", + "swapFee": "2134908027576693262258", + "priceReceived": 0.9834229054293727 + }, + { + "inputIndex": 1, + "inputQty": "4195200000000000033554432", + "outputIndex": 0, + "outputQty": "4241362748345309178531825", + "swapFee": "2554620993917667761718", + "priceReceived": 0.9885137461165676 + }, + { + "inputIndex": 1, + "inputQty": "4894399999999999949668352", + "outputIndex": 0, + "outputQty": "4904706719603051186243047", + "swapFee": "2973973525353851305566", + "priceReceived": 0.9972922554012608 + }, + { + "inputIndex": 1, + "inputQty": "5593600000000000402653184", + "outputIndex": 0, + "hardLimitError": true + }, + { + "inputIndex": 1, + "inputQty": "6292799999999999781896192", + "outputIndex": 0, + "hardLimitError": true + }, + { + "inputIndex": 1, + "inputQty": "6992000000000000234881024", + "outputIndex": 0, + "hardLimitError": true + }, + { + "inputIndex": 1, + "inputQty": "10000000000000", + "outputIndex": 2, + "outputQty": "11550033183542", + "swapFee": "6859719831", + "priceReceived": 0.8652044649021905 + }, + { + "inputIndex": 1, + "inputQty": "1000000000000000", + "outputIndex": 2, + "outputQty": "1155003318045790", + "swapFee": "685971983000", + "priceReceived": 0.8652044651333047 + }, + { + "inputIndex": 1, + "inputQty": "100000000000000000", + "outputIndex": 2, + "outputQty": "115500328721628968", + "swapFee": "68597196650141", + "priceReceived": 0.8652044882417411 + }, + { + "inputIndex": 1, + "inputQty": "1000000000000000000", + "outputIndex": 2, + "outputQty": "1155003006948657823", + "swapFee": "685971816509847", + "priceReceived": 0.8652046983180812 + }, + { + "inputIndex": 1, + "inputQty": "10000000000000000000", + "outputIndex": 2, + "outputQty": "11550002043267059664", + "swapFee": "6859703166228994", + "priceReceived": 0.8652067990463392 + }, + { + "inputIndex": 1, + "inputQty": "100000000000000000000", + "outputIndex": 2, + "outputQty": "115497218354278530158", + "swapFee": "68595532062973176", + "priceReceived": 0.865227802815176 + }, + { + "inputIndex": 1, + "inputQty": "699200000000000050331648", + "outputIndex": 2, + "outputQty": "743166819088135044993130", + "swapFee": "445006902707531211857", + "priceReceived": 0.9402397619886531 + }, + { + "inputIndex": 1, + "inputQty": "1398400000000000100663296", + "outputIndex": 2, + "outputQty": "1450928056228897744391420", + "swapFee": "871263438783980145513", + "priceReceived": 0.9631964386942302 + }, + { + "inputIndex": 1, + "inputQty": "2097600000000000016777216", + "outputIndex": 2, + "outputQty": "2149425990449541609895316", + "swapFee": "1293720116988526957620", + "priceReceived": 0.9752865598524654 + }, + { + "inputIndex": 1, + "inputQty": "2796800000000000201326592", + "outputIndex": 2, + "outputQty": "2838442023752825260195309", + "swapFee": "1714701523310602758700", + "priceReceived": 0.9847251679219391 + }, + { + "inputIndex": 1, + "inputQty": "3496000000000000117440512", + "outputIndex": 2, + "outputQty": "3494131812367917204123626", + "swapFee": "2134908027576693262258", + "priceReceived": 0.9999236661895382 + }, + { + "inputIndex": 1, + "inputQty": "4195200000000000033554432", + "outputIndex": 2, + "hardLimitError": true + }, + { + "inputIndex": 1, + "inputQty": "4894399999999999949668352", + "outputIndex": 2, + "hardLimitError": true + }, + { + "inputIndex": 1, + "inputQty": "5593600000000000402653184", + "outputIndex": 2, + "hardLimitError": true + }, + { + "inputIndex": 1, + "inputQty": "6292799999999999781896192", + "outputIndex": 2, + "hardLimitError": true + }, + { + "inputIndex": 1, + "inputQty": "6992000000000000234881024", + "outputIndex": 2, + "hardLimitError": true + }, + { + "inputIndex": 2, + "inputQty": "10000000000000", + "outputIndex": 0, + "outputQty": "10055359156058", + "swapFee": "5935570825", + "priceReceived": 0.9939042727433488 + }, + { + "inputIndex": 2, + "inputQty": "1000000000000000", + "outputIndex": 0, + "outputQty": "1005535915601292", + "swapFee": "593557082546", + "priceReceived": 0.9939042727477589 + }, + { + "inputIndex": 2, + "inputQty": "100000000000000000", + "outputIndex": 0, + "outputQty": "100553591515543302", + "swapFee": "59355708242930", + "priceReceived": 0.9939042731885764 + }, + { + "inputIndex": 2, + "inputQty": "1000000000000000000", + "outputIndex": 0, + "outputQty": "1005535911102178221", + "swapFee": "593557081361661", + "priceReceived": 0.9939042771960065 + }, + { + "inputIndex": 2, + "inputQty": "10000000000000000000", + "outputIndex": 0, + "outputQty": "10055358705696826886", + "swapFee": "5935570706852205", + "priceReceived": 0.9939043172702577 + }, + { + "inputIndex": 2, + "inputQty": "100000000000000000000", + "outputIndex": 0, + "outputQty": "100553546524996650939", + "swapFee": "59355696392160991", + "priceReceived": 0.9939047180077686 + }, + { + "inputIndex": 2, + "inputQty": "699200000000000050331648", + "outputIndex": 0, + "outputQty": "701018217861898684511298", + "swapFee": "414460558510421777310", + "priceReceived": 0.9968150921566366 + }, + { + "inputIndex": 2, + "inputQty": "1398400000000000100663296", + "outputIndex": 0, + "outputQty": "1398171292102579103177398", + "swapFee": "827881449563621606965", + "priceReceived": 0.9995714591226933 + }, + { + "inputIndex": 2, + "inputQty": "2097600000000000016777216", + "outputIndex": 0, + "outputQty": "2091056554689476319158584", + "swapFee": "1240319563507359838670", + "priceReceived": 1.0025360986698917 + }, + { + "inputIndex": 2, + "inputQty": "2796800000000000201326592", + "outputIndex": 0, + "hardLimitError": true + }, + { + "inputIndex": 2, + "inputQty": "3496000000000000117440512", + "outputIndex": 0, + "hardLimitError": true + }, + { + "inputIndex": 2, + "inputQty": "4195200000000000033554432", + "outputIndex": 0, + "hardLimitError": true + }, + { + "inputIndex": 2, + "inputQty": "4894399999999999949668352", + "outputIndex": 0, + "hardLimitError": true + }, + { + "inputIndex": 2, + "inputQty": "5593600000000000402653184", + "outputIndex": 0, + "hardLimitError": true + }, + { + "inputIndex": 2, + "inputQty": "6292799999999999781896192", + "outputIndex": 0, + "hardLimitError": true + }, + { + "inputIndex": 2, + "inputQty": "6992000000000000234881024", + "outputIndex": 0, + "hardLimitError": true + }, + { + "inputIndex": 2, + "inputQty": "10000000000000", + "outputIndex": 1, + "outputQty": "8647597319619", + "swapFee": "5935570825", + "priceReceived": 1.155704186930772 + }, + { + "inputIndex": 2, + "inputQty": "1000000000000000", + "outputIndex": 1, + "outputQty": "864759731762277", + "swapFee": "593557082546", + "priceReceived": 1.155704187197504 + }, + { + "inputIndex": 2, + "inputQty": "100000000000000000", + "outputIndex": 1, + "outputQty": "86475971180035582", + "swapFee": "59355708242930", + "priceReceived": 1.155704213875658 + }, + { + "inputIndex": 2, + "inputQty": "1000000000000000000", + "outputIndex": 1, + "outputQty": "864759530328127639", + "swapFee": "593557081361661", + "priceReceived": 1.1557044564046837 + }, + { + "inputIndex": 2, + "inputQty": "10000000000000000000", + "outputIndex": 1, + "outputQty": "8647577155837814186", + "swapFee": "5935570706852205", + "priceReceived": 1.1557068817300284 + }, + { + "inputIndex": 2, + "inputQty": "100000000000000000000", + "outputIndex": 1, + "outputQty": "86473956593366315633", + "swapFee": "59355696392160991", + "priceReceived": 1.1557311384925644 + }, + { + "inputIndex": 2, + "inputQty": "699200000000000050331648", + "outputIndex": 1, + "hardLimitError": true + }, + { + "inputIndex": 2, + "inputQty": "1398400000000000100663296", + "outputIndex": 1, + "hardLimitError": true + }, + { + "inputIndex": 2, + "inputQty": "2097600000000000016777216", + "outputIndex": 1, + "hardLimitError": true + }, + { + "inputIndex": 2, + "inputQty": "2796800000000000201326592", + "outputIndex": 1, + "hardLimitError": true + }, + { + "inputIndex": 2, + "inputQty": "3496000000000000117440512", + "outputIndex": 1, + "hardLimitError": true + }, + { + "inputIndex": 2, + "inputQty": "4195200000000000033554432", + "outputIndex": 1, + "hardLimitError": true + }, + { + "inputIndex": 2, + "inputQty": "4894399999999999949668352", + "outputIndex": 1, + "hardLimitError": true + }, + { + "inputIndex": 2, + "inputQty": "5593600000000000402653184", + "outputIndex": 1, + "hardLimitError": true + }, + { + "inputIndex": 2, + "inputQty": "6292799999999999781896192", + "outputIndex": 1, + "hardLimitError": true + }, + { + "inputIndex": 2, + "inputQty": "6992000000000000234881024", + "outputIndex": 1, + "hardLimitError": true + } + ] + }, + { + "reserve0": "2007000000000000000000000", + "reserve1": "500500000000000000000000", + "reserve2": "7492500000000000000000000", + "A": 120, + "mAssetSupply": "9896372713490403790662354", + "hardMin": 50000000000000000, + "hardMax": 750000000000000000, + "swapFeeRate": 600000000000000, + "swaps": [ + { + "inputIndex": 0, + "inputQty": "10000000000000", + "outputIndex": 1, + "outputQty": "8436719465774", + "swapFee": "6086334395", + "priceReceived": 1.1845734240836394 + }, + { + "inputIndex": 0, + "inputQty": "1000000000000000", + "outputIndex": 1, + "outputQty": "843671946345970", + "swapFee": "608633439508", + "priceReceived": 1.1845734244085735 + }, + { + "inputIndex": 0, + "inputQty": "100000000000000000", + "outputIndex": 1, + "outputQty": "84367192320212282", + "swapFee": "60863343871480", + "priceReceived": 1.1845734569050674 + }, + { + "inputIndex": 0, + "inputQty": "1000000000000000000", + "outputIndex": 1, + "outputQty": "843671712803297357", + "swapFee": "608633431500388", + "priceReceived": 1.1845737523281268 + }, + { + "inputIndex": 0, + "inputQty": "10000000000000000000", + "outputIndex": 1, + "outputQty": "8436696087934987253", + "swapFee": "6086333593565286", + "priceReceived": 1.1845767065970727 + }, + { + "inputIndex": 0, + "inputQty": "100000000000000000000", + "outputIndex": 1, + "outputQty": "84364856654093899177", + "swapFee": "60863263794995589", + "priceReceived": 1.184606253122287 + }, + { + "inputIndex": 0, + "inputQty": "699200000000000050331648", + "outputIndex": 1, + "hardLimitError": true + }, + { + "inputIndex": 0, + "inputQty": "1398400000000000100663296", + "outputIndex": 1, + "hardLimitError": true + }, + { + "inputIndex": 0, + "inputQty": "2097600000000000016777216", + "outputIndex": 1, + "hardLimitError": true + }, + { + "inputIndex": 0, + "inputQty": "2796800000000000201326592", + "outputIndex": 1, + "hardLimitError": true + }, + { + "inputIndex": 0, + "inputQty": "3496000000000000117440512", + "outputIndex": 1, + "hardLimitError": true + }, + { + "inputIndex": 0, + "inputQty": "4195200000000000033554432", + "outputIndex": 1, + "hardLimitError": true + }, + { + "inputIndex": 0, + "inputQty": "4894399999999999949668352", + "outputIndex": 1, + "hardLimitError": true + }, + { + "inputIndex": 0, + "inputQty": "5593600000000000402653184", + "outputIndex": 1, + "hardLimitError": true + }, + { + "inputIndex": 0, + "inputQty": "6292799999999999781896192", + "outputIndex": 1, + "hardLimitError": true + }, + { + "inputIndex": 0, + "inputQty": "6992000000000000234881024", + "outputIndex": 1, + "hardLimitError": true + }, + { + "inputIndex": 0, + "inputQty": "10000000000000", + "outputIndex": 2, + "outputQty": "10463793292692", + "swapFee": "6086334395", + "priceReceived": 0.9550947143217013 + }, + { + "inputIndex": 0, + "inputQty": "1000000000000000", + "outputIndex": 2, + "outputQty": "1046379329243911", + "swapFee": "608633439508", + "priceReceived": 0.9550947143447764 + }, + { + "inputIndex": 0, + "inputQty": "100000000000000000", + "outputIndex": 2, + "outputQty": "104637932671762503", + "swapFee": "60863343871480", + "priceReceived": 0.955094716651431 + }, + { + "inputIndex": 0, + "inputQty": "1000000000000000000", + "outputIndex": 2, + "outputQty": "1046379303751399330", + "swapFee": "608633431500388", + "priceReceived": 0.9550947376210117 + }, + { + "inputIndex": 0, + "inputQty": "10000000000000000000", + "outputIndex": 2, + "outputQty": "10463790740902354752", + "swapFee": "6086333593565286", + "priceReceived": 0.9550949473158712 + }, + { + "inputIndex": 0, + "inputQty": "100000000000000000000", + "outputIndex": 2, + "outputQty": "104637677758789146648", + "swapFee": "60863263794995589", + "priceReceived": 0.9550970441697376 + }, + { + "inputIndex": 0, + "inputQty": "699200000000000050331648", + "outputIndex": 2, + "outputQty": "722263128479055491881378", + "swapFee": "422553559162174988487", + "priceReceived": 0.9674832050645118 + }, + { + "inputIndex": 0, + "inputQty": "1398400000000000100663296", + "outputIndex": 2, + "outputQty": "1433094677312411634245482", + "swapFee": "841275721935342452176", + "priceReceived": 0.975203345880127 + }, + { + "inputIndex": 0, + "inputQty": "2097600000000000016777216", + "outputIndex": 2, + "outputQty": "2137711494094160926435218", + "swapFee": "1257768754982574099612", + "priceReceived": 0.980647873689488 + }, + { + "inputIndex": 0, + "inputQty": "2796800000000000201326592", + "outputIndex": 2, + "outputQty": "2838008198118375113442264", + "swapFee": "1672697094452568553252", + "priceReceived": 0.9848904963554165 + }, + { + "inputIndex": 0, + "inputQty": "3496000000000000117440512", + "outputIndex": 2, + "outputQty": "3534438755467934405642287", + "swapFee": "2086377935724127709749", + "priceReceived": 0.988534209755095 + }, + { + "inputIndex": 0, + "inputQty": "4195200000000000033554432", + "outputIndex": 2, + "outputQty": "4226394339111648882141178", + "swapFee": "2498975677928744759900", + "priceReceived": 0.9920278819044936 + }, + { + "inputIndex": 0, + "inputQty": "4894399999999999949668352", + "outputIndex": 2, + "outputQty": "4911782260367201108637264", + "swapFee": "2910579067931670693036", + "priceReceived": 0.9958685384735243 + }, + { + "inputIndex": 0, + "inputQty": "5593600000000000402653184", + "outputIndex": 2, + "hardLimitError": true + }, + { + "inputIndex": 0, + "inputQty": "6292799999999999781896192", + "outputIndex": 2, + "hardLimitError": true + }, + { + "inputIndex": 0, + "inputQty": "6992000000000000234881024", + "outputIndex": 2, + "hardLimitError": true + }, + { + "inputIndex": 1, + "inputQty": "10000000000000", + "outputIndex": 0, + "outputQty": "11838729070533", + "swapFee": "7209772257", + "priceReceived": 0.8440762659748161 + }, + { + "inputIndex": 1, + "inputQty": "1000000000000000", + "outputIndex": 0, + "outputQty": "1183872906668422", + "swapFee": "720977225474", + "priceReceived": 0.8440762662494169 + }, + { + "inputIndex": 1, + "inputQty": "100000000000000000", + "outputIndex": 0, + "outputQty": "118387286817586995", + "swapFee": "72097720241086", + "priceReceived": 0.8440762937132719 + }, + { + "inputIndex": 1, + "inputQty": "1000000000000000000", + "outputIndex": 0, + "outputQty": "1183872518244243855", + "swapFee": "720976992737435", + "priceReceived": 0.8440765433842954 + }, + { + "inputIndex": 1, + "inputQty": "10000000000000000000", + "outputIndex": 0, + "outputQty": "11838690189932096567", + "swapFee": "7209748960428383", + "priceReceived": 0.8440790400561101 + }, + { + "inputIndex": 1, + "inputQty": "100000000000000000000", + "outputIndex": 0, + "outputQty": "118383403300427069140", + "swapFee": "72095393306750833", + "priceReceived": 0.8441040029327553 + }, + { + "inputIndex": 1, + "inputQty": "699200000000000050331648", + "outputIndex": 0, + "hardLimitError": true + }, + { + "inputIndex": 1, + "inputQty": "1398400000000000100663296", + "outputIndex": 0, + "hardLimitError": true + }, + { + "inputIndex": 1, + "inputQty": "2097600000000000016777216", + "outputIndex": 0, + "hardLimitError": true + }, + { + "inputIndex": 1, + "inputQty": "2796800000000000201326592", + "outputIndex": 0, + "hardLimitError": true + }, + { + "inputIndex": 1, + "inputQty": "3496000000000000117440512", + "outputIndex": 0, + "hardLimitError": true + }, + { + "inputIndex": 1, + "inputQty": "4195200000000000033554432", + "outputIndex": 0, + "hardLimitError": true + }, + { + "inputIndex": 1, + "inputQty": "4894399999999999949668352", + "outputIndex": 0, + "hardLimitError": true + }, + { + "inputIndex": 1, + "inputQty": "5593600000000000402653184", + "outputIndex": 0, + "hardLimitError": true + }, + { + "inputIndex": 1, + "inputQty": "6292799999999999781896192", + "outputIndex": 0, + "hardLimitError": true + }, + { + "inputIndex": 1, + "inputQty": "6992000000000000234881024", + "outputIndex": 0, + "hardLimitError": true + }, + { + "inputIndex": 1, + "inputQty": "10000000000000", + "outputIndex": 2, + "outputQty": "12395238527337", + "swapFee": "7209772257", + "priceReceived": 0.8061797443997922 + }, + { + "inputIndex": 1, + "inputQty": "1000000000000000", + "outputIndex": 2, + "outputQty": "1239523852263400", + "swapFee": "720977225474", + "priceReceived": 0.8061797447058552 + }, + { + "inputIndex": 1, + "inputQty": "100000000000000000", + "outputIndex": 2, + "outputQty": "123952380523418314", + "swapFee": "72097720241086", + "priceReceived": 0.8061797753120162 + }, + { + "inputIndex": 1, + "inputQty": "1000000000000000000", + "outputIndex": 2, + "outputQty": "1239523377696697198", + "swapFee": "720976992737435", + "priceReceived": 0.8061800535494049 + }, + { + "inputIndex": 1, + "inputQty": "10000000000000000000", + "outputIndex": 2, + "outputQty": "12395191024051384203", + "swapFee": "7209748960428383", + "priceReceived": 0.8061828358796373 + }, + { + "inputIndex": 1, + "inputQty": "100000000000000000000", + "outputIndex": 2, + "outputQty": "123947635781796985191", + "swapFee": "72095393306750833", + "priceReceived": 0.8062106548172556 + }, + { + "inputIndex": 1, + "inputQty": "699200000000000050331648", + "outputIndex": 2, + "outputQty": "768896006715057077927865", + "swapFee": "455349056078842881937", + "priceReceived": 0.908763532183185 + }, + { + "inputIndex": 1, + "inputQty": "1398400000000000100663296", + "outputIndex": 2, + "outputQty": "1485514801822270051395981", + "swapFee": "884040318185604670645", + "priceReceived": 0.9407620563372994 + }, + { + "inputIndex": 1, + "inputQty": "2097600000000000016777216", + "outputIndex": 2, + "outputQty": "2191692694525269933121433", + "swapFee": "1307270388189317742828", + "priceReceived": 0.9564720158296994 + }, + { + "inputIndex": 1, + "inputQty": "2796800000000000201326592", + "outputIndex": 2, + "outputQty": "2893745098578223596232972", + "swapFee": "1728372076376296111498", + "priceReceived": 0.9659011186911105 + }, + { + "inputIndex": 1, + "inputQty": "3496000000000000117440512", + "outputIndex": 2, + "outputQty": "3593394051728979159386178", + "swapFee": "2148353632174868084140", + "priceReceived": 0.9722984999896522 + }, + { + "inputIndex": 1, + "inputQty": "4195200000000000033554432", + "outputIndex": 2, + "outputQty": "4291015906040761605294836", + "swapFee": "2567621069932273372757", + "priceReceived": 0.9770722063807332 + }, + { + "inputIndex": 1, + "inputQty": "4894399999999999949668352", + "outputIndex": 2, + "outputQty": "4986132009816772962673844", + "swapFee": "2986366809676326880201", + "priceReceived": 0.98100363639792 + }, + { + "inputIndex": 1, + "inputQty": "5593600000000000402653184", + "outputIndex": 2, + "outputQty": "5676824010962740152173763", + "swapFee": "3404691779986865867419", + "priceReceived": 0.9847399351159319 + }, + { + "inputIndex": 1, + "inputQty": "6292799999999999781896192", + "outputIndex": 2, + "outputQty": "6356304183245645467880735", + "swapFee": "3822652371743742700155", + "priceReceived": 0.989407864432471 + }, + { + "inputIndex": 1, + "inputQty": "6992000000000000234881024", + "outputIndex": 2, + "outputQty": "6988467216013139965717995", + "swapFee": "4240281183082721427082", + "priceReceived": 0.9998987621785502 + }, + { + "inputIndex": 2, + "inputQty": "10000000000000", + "outputIndex": 0, + "outputQty": "9545299033164", + "swapFee": "5813076027", + "priceReceived": 1.0470271166203795 + }, + { + "inputIndex": 2, + "inputQty": "1000000000000000", + "outputIndex": 0, + "outputQty": "954529903294338", + "swapFee": "581307602736", + "priceReceived": 1.0470271166445417 + }, + { + "inputIndex": 2, + "inputQty": "100000000000000000", + "outputIndex": 0, + "outputQty": "95452990109381565", + "swapFee": "58130760256577", + "priceReceived": 1.0470271190584806 + }, + { + "inputIndex": 2, + "inputQty": "1000000000000000000", + "outputIndex": 0, + "outputQty": "954529881089065644", + "swapFee": "581307601011551", + "priceReceived": 1.0470271410033882 + }, + { + "inputIndex": 2, + "inputQty": "10000000000000000000", + "outputIndex": 0, + "outputQty": "9545296810407490515", + "swapFee": "5813075854692939", + "priceReceived": 1.04702736045341 + }, + { + "inputIndex": 2, + "inputQty": "100000000000000000000", + "outputIndex": 0, + "outputQty": "95452768047591845254", + "swapFee": "58130743004639067", + "priceReceived": 1.0470295550482653 + }, + { + "inputIndex": 2, + "inputQty": "699200000000000050331648", + "outputIndex": 0, + "hardLimitError": true + }, + { + "inputIndex": 2, + "inputQty": "1398400000000000100663296", + "outputIndex": 0, + "hardLimitError": true + }, + { + "inputIndex": 2, + "inputQty": "2097600000000000016777216", + "outputIndex": 0, + "hardLimitError": true + }, + { + "inputIndex": 2, + "inputQty": "2796800000000000201326592", + "outputIndex": 0, + "hardLimitError": true + }, + { + "inputIndex": 2, + "inputQty": "3496000000000000117440512", + "outputIndex": 0, + "hardLimitError": true + }, + { + "inputIndex": 2, + "inputQty": "4195200000000000033554432", + "outputIndex": 0, + "hardLimitError": true + }, + { + "inputIndex": 2, + "inputQty": "4894399999999999949668352", + "outputIndex": 0, + "hardLimitError": true + }, + { + "inputIndex": 2, + "inputQty": "5593600000000000402653184", + "outputIndex": 0, + "hardLimitError": true + }, + { + "inputIndex": 2, + "inputQty": "6292799999999999781896192", + "outputIndex": 0, + "hardLimitError": true + }, + { + "inputIndex": 2, + "inputQty": "6992000000000000234881024", + "outputIndex": 0, + "hardLimitError": true + }, + { + "inputIndex": 2, + "inputQty": "10000000000000", + "outputIndex": 1, + "outputQty": "8057935777439", + "swapFee": "5813076027", + "priceReceived": 1.2402912110512483 + }, + { + "inputIndex": 2, + "inputQty": "1000000000000000", + "outputIndex": 1, + "outputQty": "805793577497443", + "swapFee": "581307602736", + "priceReceived": 1.2402912114305544 + }, + { + "inputIndex": 2, + "inputQty": "100000000000000000", + "outputIndex": 1, + "outputQty": "80579355285952603", + "swapFee": "58130760256577", + "priceReceived": 1.2402912493538687 + }, + { + "inputIndex": 2, + "inputQty": "1000000000000000000", + "outputIndex": 1, + "outputQty": "805793328878247977", + "swapFee": "581307601011551", + "priceReceived": 1.240291594111716 + }, + { + "inputIndex": 2, + "inputQty": "10000000000000000000", + "outputIndex": 1, + "outputQty": "8057910890439978463", + "swapFee": "5813075854692939", + "priceReceived": 1.2402950417337768 + }, + { + "inputIndex": 2, + "inputQty": "100000000000000000000", + "outputIndex": 1, + "outputQty": "80576868855441209889", + "swapFee": "58130743004639067", + "priceReceived": 1.2403295223136046 + }, + { + "inputIndex": 2, + "inputQty": "699200000000000050331648", + "outputIndex": 1, + "hardLimitError": true + }, + { + "inputIndex": 2, + "inputQty": "1398400000000000100663296", + "outputIndex": 1, + "hardLimitError": true + }, + { + "inputIndex": 2, + "inputQty": "2097600000000000016777216", + "outputIndex": 1, + "hardLimitError": true + }, + { + "inputIndex": 2, + "inputQty": "2796800000000000201326592", + "outputIndex": 1, + "hardLimitError": true + }, + { + "inputIndex": 2, + "inputQty": "3496000000000000117440512", + "outputIndex": 1, + "hardLimitError": true + }, + { + "inputIndex": 2, + "inputQty": "4195200000000000033554432", + "outputIndex": 1, + "hardLimitError": true + }, + { + "inputIndex": 2, + "inputQty": "4894399999999999949668352", + "outputIndex": 1, + "hardLimitError": true + }, + { + "inputIndex": 2, + "inputQty": "5593600000000000402653184", + "outputIndex": 1, + "hardLimitError": true + }, + { + "inputIndex": 2, + "inputQty": "6292799999999999781896192", + "outputIndex": 1, + "hardLimitError": true + }, + { + "inputIndex": 2, + "inputQty": "6992000000000000234881024", + "outputIndex": 1, + "hardLimitError": true + } + ] + }, + { + "reserve0": "5503000000000000000000000", + "reserve1": "3996499999999999360000000", + "reserve2": "500500000000000000000000", + "A": 120, + "mAssetSupply": "9936488013915504712820075", + "hardMin": 50000000000000000, + "hardMax": 750000000000000000, + "swapFeeRate": 600000000000000, + "swaps": [ + { + "inputIndex": 0, + "inputQty": "10000000000000", + "outputIndex": 1, + "outputQty": "9933015265778", + "swapFee": "5899351172", + "priceReceived": 1.006149732122174 + }, + { + "inputIndex": 0, + "inputQty": "1000000000000000", + "outputIndex": 1, + "outputQty": "993301526573337", + "swapFee": "589935117275", + "priceReceived": 1.0061497321266193 + }, + { + "inputIndex": 0, + "inputQty": "100000000000000000", + "outputIndex": 1, + "outputQty": "99330152613560344", + "swapFee": "58993511717134", + "priceReceived": 1.0061497325701192 + }, + { + "inputIndex": 0, + "inputQty": "1000000000000000000", + "outputIndex": 1, + "outputQty": "993301522156207633", + "swapFee": "589935116226982", + "priceReceived": 1.0061497366019387 + }, + { + "inputIndex": 0, + "inputQty": "10000000000000000000", + "outputIndex": 1, + "outputQty": "9933014823622019721", + "swapFee": "5899351067834018", + "priceReceived": 1.006149776920183 + }, + { + "inputIndex": 0, + "inputQty": "100000000000000000000", + "outputIndex": 1, + "outputQty": "99330108441738514131", + "swapFee": "58993501234750486", + "priceReceived": 1.0061501801076262 + }, + { + "inputIndex": 0, + "inputQty": "699200000000000050331648", + "outputIndex": 1, + "outputQty": "692112050839051884447054", + "swapFee": "411965810390800782245", + "priceReceived": 1.0096458129033645 + }, + { + "inputIndex": 0, + "inputQty": "1398400000000000100663296", + "outputIndex": 1, + "hardLimitError": true + }, + { + "inputIndex": 0, + "inputQty": "2097600000000000016777216", + "outputIndex": 1, + "hardLimitError": true + }, + { + "inputIndex": 0, + "inputQty": "2796800000000000201326592", + "outputIndex": 1, + "hardLimitError": true + }, + { + "inputIndex": 0, + "inputQty": "3496000000000000117440512", + "outputIndex": 1, + "hardLimitError": true + }, + { + "inputIndex": 0, + "inputQty": "4195200000000000033554432", + "outputIndex": 1, + "hardLimitError": true + }, + { + "inputIndex": 0, + "inputQty": "4894399999999999949668352", + "outputIndex": 1, + "hardLimitError": true + }, + { + "inputIndex": 0, + "inputQty": "5593600000000000402653184", + "outputIndex": 1, + "hardLimitError": true + }, + { + "inputIndex": 0, + "inputQty": "6292799999999999781896192", + "outputIndex": 1, + "hardLimitError": true + }, + { + "inputIndex": 0, + "inputQty": "6992000000000000234881024", + "outputIndex": 1, + "hardLimitError": true + }, + { + "inputIndex": 0, + "inputQty": "10000000000000", + "outputIndex": 2, + "outputQty": "8594828515917", + "swapFee": "5899351172", + "priceReceived": 1.1628039617450947 + }, + { + "inputIndex": 0, + "inputQty": "1000000000000000", + "outputIndex": 2, + "outputQty": "859482851387857", + "swapFee": "589935117275", + "priceReceived": 1.1628039620207888 + }, + { + "inputIndex": 0, + "inputQty": "100000000000000000", + "outputIndex": 2, + "outputQty": "85948283101101317", + "swapFee": "58993511717134", + "priceReceived": 1.1628039895889701 + }, + { + "inputIndex": 0, + "inputQty": "1000000000000000000", + "outputIndex": 2, + "outputQty": "859482645766757989", + "swapFee": "589935116226982", + "priceReceived": 1.1628042402091592 + }, + { + "inputIndex": 0, + "inputQty": "10000000000000000000", + "outputIndex": 2, + "outputQty": "8594807933019418572", + "swapFee": "5899351067834018", + "priceReceived": 1.1628067464471152 + }, + { + "inputIndex": 0, + "inputQty": "100000000000000000000", + "outputIndex": 2, + "outputQty": "85946226642713984426", + "swapFee": "58993501234750486", + "priceReceived": 1.1628318124334742 + }, + { + "inputIndex": 0, + "inputQty": "699200000000000050331648", + "outputIndex": 2, + "hardLimitError": true + }, + { + "inputIndex": 0, + "inputQty": "1398400000000000100663296", + "outputIndex": 2, + "hardLimitError": true + }, + { + "inputIndex": 0, + "inputQty": "2097600000000000016777216", + "outputIndex": 2, + "hardLimitError": true + }, + { + "inputIndex": 0, + "inputQty": "2796800000000000201326592", + "outputIndex": 2, + "hardLimitError": true + }, + { + "inputIndex": 0, + "inputQty": "3496000000000000117440512", + "outputIndex": 2, + "hardLimitError": true + }, + { + "inputIndex": 0, + "inputQty": "4195200000000000033554432", + "outputIndex": 2, + "hardLimitError": true + }, + { + "inputIndex": 0, + "inputQty": "4894399999999999949668352", + "outputIndex": 2, + "hardLimitError": true + }, + { + "inputIndex": 0, + "inputQty": "5593600000000000402653184", + "outputIndex": 2, + "hardLimitError": true + }, + { + "inputIndex": 0, + "inputQty": "6292799999999999781896192", + "outputIndex": 2, + "hardLimitError": true + }, + { + "inputIndex": 0, + "inputQty": "6992000000000000234881024", + "outputIndex": 2, + "hardLimitError": true + }, + { + "inputIndex": 1, + "inputQty": "10000000000000", + "outputIndex": 0, + "outputQty": "10055359156058", + "swapFee": "5935570825", + "priceReceived": 0.9939042727433488 + }, + { + "inputIndex": 1, + "inputQty": "1000000000000000", + "outputIndex": 0, + "outputQty": "1005535915601292", + "swapFee": "593557082546", + "priceReceived": 0.9939042727477589 + }, + { + "inputIndex": 1, + "inputQty": "100000000000000000", + "outputIndex": 0, + "outputQty": "100553591515543302", + "swapFee": "59355708242930", + "priceReceived": 0.9939042731885764 + }, + { + "inputIndex": 1, + "inputQty": "1000000000000000000", + "outputIndex": 0, + "outputQty": "1005535911102178221", + "swapFee": "593557081361661", + "priceReceived": 0.9939042771960065 + }, + { + "inputIndex": 1, + "inputQty": "10000000000000000000", + "outputIndex": 0, + "outputQty": "10055358705696826886", + "swapFee": "5935570706852205", + "priceReceived": 0.9939043172702577 + }, + { + "inputIndex": 1, + "inputQty": "100000000000000000000", + "outputIndex": 0, + "outputQty": "100553546524996650939", + "swapFee": "59355696392160991", + "priceReceived": 0.9939047180077686 + }, + { + "inputIndex": 1, + "inputQty": "699200000000000050331648", + "outputIndex": 0, + "outputQty": "701018217861898684511298", + "swapFee": "414460558510421777310", + "priceReceived": 0.9968150921566366 + }, + { + "inputIndex": 1, + "inputQty": "1398400000000000100663296", + "outputIndex": 0, + "outputQty": "1398171292102579103177398", + "swapFee": "827881449563621606965", + "priceReceived": 0.9995714591226933 + }, + { + "inputIndex": 1, + "inputQty": "2097600000000000016777216", + "outputIndex": 0, + "outputQty": "2091056554689476319158584", + "swapFee": "1240319563507359838670", + "priceReceived": 1.0025360986698917 + }, + { + "inputIndex": 1, + "inputQty": "2796800000000000201326592", + "outputIndex": 0, + "hardLimitError": true + }, + { + "inputIndex": 1, + "inputQty": "3496000000000000117440512", + "outputIndex": 0, + "hardLimitError": true + }, + { + "inputIndex": 1, + "inputQty": "4195200000000000033554432", + "outputIndex": 0, + "hardLimitError": true + }, + { + "inputIndex": 1, + "inputQty": "4894399999999999949668352", + "outputIndex": 0, + "hardLimitError": true + }, + { + "inputIndex": 1, + "inputQty": "5593600000000000402653184", + "outputIndex": 0, + "hardLimitError": true + }, + { + "inputIndex": 1, + "inputQty": "6292799999999999781896192", + "outputIndex": 0, + "hardLimitError": true + }, + { + "inputIndex": 1, + "inputQty": "6992000000000000234881024", + "outputIndex": 0, + "hardLimitError": true + }, + { + "inputIndex": 1, + "inputQty": "10000000000000", + "outputIndex": 2, + "outputQty": "8647597319619", + "swapFee": "5935570825", + "priceReceived": 1.155704186930772 + }, + { + "inputIndex": 1, + "inputQty": "1000000000000000", + "outputIndex": 2, + "outputQty": "864759731762277", + "swapFee": "593557082546", + "priceReceived": 1.155704187197504 + }, + { + "inputIndex": 1, + "inputQty": "100000000000000000", + "outputIndex": 2, + "outputQty": "86475971180035582", + "swapFee": "59355708242930", + "priceReceived": 1.155704213875658 + }, + { + "inputIndex": 1, + "inputQty": "1000000000000000000", + "outputIndex": 2, + "outputQty": "864759530328127639", + "swapFee": "593557081361661", + "priceReceived": 1.1557044564046837 + }, + { + "inputIndex": 1, + "inputQty": "10000000000000000000", + "outputIndex": 2, + "outputQty": "8647577155837814186", + "swapFee": "5935570706852205", + "priceReceived": 1.1557068817300284 + }, + { + "inputIndex": 1, + "inputQty": "100000000000000000000", + "outputIndex": 2, + "outputQty": "86473956593366315633", + "swapFee": "59355696392160991", + "priceReceived": 1.1557311384925644 + }, + { + "inputIndex": 1, + "inputQty": "699200000000000050331648", + "outputIndex": 2, + "hardLimitError": true + }, + { + "inputIndex": 1, + "inputQty": "1398400000000000100663296", + "outputIndex": 2, + "hardLimitError": true + }, + { + "inputIndex": 1, + "inputQty": "2097600000000000016777216", + "outputIndex": 2, + "hardLimitError": true + }, + { + "inputIndex": 1, + "inputQty": "2796800000000000201326592", + "outputIndex": 2, + "hardLimitError": true + }, + { + "inputIndex": 1, + "inputQty": "3496000000000000117440512", + "outputIndex": 2, + "hardLimitError": true + }, + { + "inputIndex": 1, + "inputQty": "4195200000000000033554432", + "outputIndex": 2, + "hardLimitError": true + }, + { + "inputIndex": 1, + "inputQty": "4894399999999999949668352", + "outputIndex": 2, + "hardLimitError": true + }, + { + "inputIndex": 1, + "inputQty": "5593600000000000402653184", + "outputIndex": 2, + "hardLimitError": true + }, + { + "inputIndex": 1, + "inputQty": "6292799999999999781896192", + "outputIndex": 2, + "hardLimitError": true + }, + { + "inputIndex": 1, + "inputQty": "6992000000000000234881024", + "outputIndex": 2, + "hardLimitError": true + }, + { + "inputIndex": 2, + "inputQty": "10000000000000", + "outputIndex": 0, + "outputQty": "11620945759945", + "swapFee": "6859719831", + "priceReceived": 0.8599248707117532 + }, + { + "inputIndex": 2, + "inputQty": "1000000000000000", + "outputIndex": 0, + "outputQty": "1162094575673868", + "swapFee": "685971983000", + "priceReceived": 0.8599248709491 + }, + { + "inputIndex": 2, + "inputQty": "100000000000000000", + "outputIndex": 0, + "outputQty": "116209454362088099", + "swapFee": "68597196650141", + "priceReceived": 0.8599248946818155 + }, + { + "inputIndex": 2, + "inputQty": "1000000000000000000", + "outputIndex": 0, + "outputQty": "1162094252230663839", + "swapFee": "685971816509847", + "priceReceived": 0.8599251104334148 + }, + { + "inputIndex": 2, + "inputQty": "10000000000000000000", + "outputIndex": 0, + "outputQty": "11620913383853133332", + "swapFee": "6859703166228994", + "priceReceived": 0.8599272679132866 + }, + { + "inputIndex": 2, + "inputQty": "100000000000000000000", + "outputIndex": 0, + "outputQty": "116206220561278555141", + "swapFee": "68595532062973176", + "priceReceived": 0.8599488391005764 + }, + { + "inputIndex": 2, + "inputQty": "699200000000000050331648", + "outputIndex": 0, + "outputQty": "745890348448147376765907", + "swapFee": "445006902707531211857", + "priceReceived": 0.9368065889994129 + }, + { + "inputIndex": 2, + "inputQty": "1398400000000000100663296", + "outputIndex": 0, + "outputQty": "1455978176046775934050805", + "swapFee": "871263438783980145513", + "priceReceived": 0.9598555524752027 + }, + { + "inputIndex": 2, + "inputQty": "2097600000000000016777216", + "outputIndex": 0, + "outputQty": "2158527843482740112916076", + "swapFee": "1293720116988526957620", + "priceReceived": 0.9711740741322403 + }, + { + "inputIndex": 2, + "inputQty": "2796800000000000201326592", + "outputIndex": 0, + "outputQty": "2857415815532514252372830", + "swapFee": "1714701523310602758700", + "priceReceived": 0.9781864030019696 + }, + { + "inputIndex": 2, + "inputQty": "3496000000000000117440512", + "outputIndex": 0, + "outputQty": "3552759522564674531561542", + "swapFee": "2134908027576693262258", + "priceReceived": 0.9834229054293727 + }, + { + "inputIndex": 2, + "inputQty": "4195200000000000033554432", + "outputIndex": 0, + "outputQty": "4241362748345309178531825", + "swapFee": "2554620993917667761718", + "priceReceived": 0.9885137461165676 + }, + { + "inputIndex": 2, + "inputQty": "4894399999999999949668352", + "outputIndex": 0, + "outputQty": "4904706719603051186243047", + "swapFee": "2973973525353851305566", + "priceReceived": 0.9972922554012608 + }, + { + "inputIndex": 2, + "inputQty": "5593600000000000402653184", + "outputIndex": 0, + "hardLimitError": true + }, + { + "inputIndex": 2, + "inputQty": "6292799999999999781896192", + "outputIndex": 0, + "hardLimitError": true + }, + { + "inputIndex": 2, + "inputQty": "6992000000000000234881024", + "outputIndex": 0, + "hardLimitError": true + }, + { + "inputIndex": 2, + "inputQty": "10000000000000", + "outputIndex": 1, + "outputQty": "11550033183542", + "swapFee": "6859719831", + "priceReceived": 0.8652044649021905 + }, + { + "inputIndex": 2, + "inputQty": "1000000000000000", + "outputIndex": 1, + "outputQty": "1155003318045790", + "swapFee": "685971983000", + "priceReceived": 0.8652044651333047 + }, + { + "inputIndex": 2, + "inputQty": "100000000000000000", + "outputIndex": 1, + "outputQty": "115500328721628968", + "swapFee": "68597196650141", + "priceReceived": 0.8652044882417411 + }, + { + "inputIndex": 2, + "inputQty": "1000000000000000000", + "outputIndex": 1, + "outputQty": "1155003006948657823", + "swapFee": "685971816509847", + "priceReceived": 0.8652046983180812 + }, + { + "inputIndex": 2, + "inputQty": "10000000000000000000", + "outputIndex": 1, + "outputQty": "11550002043267059664", + "swapFee": "6859703166228994", + "priceReceived": 0.8652067990463392 + }, + { + "inputIndex": 2, + "inputQty": "100000000000000000000", + "outputIndex": 1, + "outputQty": "115497218354278530158", + "swapFee": "68595532062973176", + "priceReceived": 0.865227802815176 + }, + { + "inputIndex": 2, + "inputQty": "699200000000000050331648", + "outputIndex": 1, + "outputQty": "743166819088135044993130", + "swapFee": "445006902707531211857", + "priceReceived": 0.9402397619886531 + }, + { + "inputIndex": 2, + "inputQty": "1398400000000000100663296", + "outputIndex": 1, + "outputQty": "1450928056228897744391420", + "swapFee": "871263438783980145513", + "priceReceived": 0.9631964386942302 + }, + { + "inputIndex": 2, + "inputQty": "2097600000000000016777216", + "outputIndex": 1, + "outputQty": "2149425990449541609895316", + "swapFee": "1293720116988526957620", + "priceReceived": 0.9752865598524654 + }, + { + "inputIndex": 2, + "inputQty": "2796800000000000201326592", + "outputIndex": 1, + "outputQty": "2838442023752825260195309", + "swapFee": "1714701523310602758700", + "priceReceived": 0.9847251679219391 + }, + { + "inputIndex": 2, + "inputQty": "3496000000000000117440512", + "outputIndex": 1, + "outputQty": "3494131812367917204123626", + "swapFee": "2134908027576693262258", + "priceReceived": 0.9999236661895382 + }, + { + "inputIndex": 2, + "inputQty": "4195200000000000033554432", + "outputIndex": 1, + "hardLimitError": true + }, + { + "inputIndex": 2, + "inputQty": "4894399999999999949668352", + "outputIndex": 1, + "hardLimitError": true + }, + { + "inputIndex": 2, + "inputQty": "5593600000000000402653184", + "outputIndex": 1, + "hardLimitError": true + }, + { + "inputIndex": 2, + "inputQty": "6292799999999999781896192", + "outputIndex": 1, + "hardLimitError": true + }, + { + "inputIndex": 2, + "inputQty": "6992000000000000234881024", + "outputIndex": 1, + "hardLimitError": true + } + ] + }, + { + "reserve0": "2007000000000000960000000", + "reserve1": "3996499999999999360000000", + "reserve2": "3996499999999999360000000", + "A": 120, + "mAssetSupply": "9995726520619110731126433", + "hardMin": 50000000000000000, + "hardMax": 750000000000000000, + "swapFeeRate": 600000000000000, + "swaps": [ + { + "inputIndex": 0, + "inputQty": "10000000000000", + "outputIndex": 1, + "outputQty": "10072790252445", + "swapFee": "6035168965", + "priceReceived": 0.9921744204500966 + }, + { + "inputIndex": 0, + "inputQty": "1000000000000000", + "outputIndex": 1, + "outputQty": "1007279025238644", + "swapFee": "603516896553", + "priceReceived": 0.9921744204558122 + }, + { + "inputIndex": 0, + "inputQty": "100000000000000000", + "outputIndex": 1, + "outputQty": "100727902465311571", + "swapFee": "60351689634942", + "priceReceived": 0.9921744210327623 + }, + { + "inputIndex": 0, + "inputQty": "1000000000000000000", + "outputIndex": 1, + "outputQty": "1007279019330139954", + "swapFee": "603516894491591", + "priceReceived": 0.9921744262777621 + }, + { + "inputIndex": 0, + "inputQty": "10000000000000000000", + "outputIndex": 1, + "outputQty": "10072789661005997875", + "swapFee": "6035168759132957", + "priceReceived": 0.9921744787275486 + }, + { + "inputIndex": 0, + "inputQty": "100000000000000000000", + "outputIndex": 1, + "outputQty": "100727843382691828833", + "swapFee": "60351669013876130", + "priceReceived": 0.9921750032043162 + }, + { + "inputIndex": 0, + "inputQty": "699200000000000050331648", + "outputIndex": 1, + "outputQty": "701990061873335666661480", + "swapFee": "421209678016508108806", + "priceReceived": 0.9954254743396473 + }, + { + "inputIndex": 0, + "inputQty": "1398400000000000100663296", + "outputIndex": 1, + "outputQty": "1400520690043401824861045", + "swapFee": "841445523586415237822", + "priceReceived": 0.9978849755037205 + }, + { + "inputIndex": 0, + "inputQty": "2097600000000000016777216", + "outputIndex": 1, + "outputQty": "2095431279847674350793501", + "swapFee": "1261119325233018729452", + "priceReceived": 1.0004331331863856 + }, + { + "inputIndex": 0, + "inputQty": "2796800000000000201326592", + "outputIndex": 1, + "outputQty": "2783047691616111483913211", + "swapFee": "1680399398546506822409", + "priceReceived": 1.004337657964579 + }, + { + "inputIndex": 0, + "inputQty": "3496000000000000117440512", + "outputIndex": 1, + "outputQty": "3441701398292317538340882", + "swapFee": "2099364923554529841758", + "priceReceived": 1.0151666954053677 + }, + { + "inputIndex": 0, + "inputQty": "4195200000000000033554432", + "outputIndex": 1, + "hardLimitError": true + }, + { + "inputIndex": 0, + "inputQty": "4894399999999999949668352", + "outputIndex": 1, + "hardLimitError": true + }, + { + "inputIndex": 0, + "inputQty": "5593600000000000402653184", + "outputIndex": 1, + "hardLimitError": true + }, + { + "inputIndex": 0, + "inputQty": "6292799999999999781896192", + "outputIndex": 1, + "hardLimitError": true + }, + { + "inputIndex": 0, + "inputQty": "6992000000000000234881024", + "outputIndex": 1, + "hardLimitError": true + }, + { + "inputIndex": 0, + "inputQty": "10000000000000", + "outputIndex": 2, + "outputQty": "10072790252445", + "swapFee": "6035168965", + "priceReceived": 0.9921744204500966 + }, + { + "inputIndex": 0, + "inputQty": "1000000000000000", + "outputIndex": 2, + "outputQty": "1007279025238644", + "swapFee": "603516896553", + "priceReceived": 0.9921744204558122 + }, + { + "inputIndex": 0, + "inputQty": "100000000000000000", + "outputIndex": 2, + "outputQty": "100727902465311571", + "swapFee": "60351689634942", + "priceReceived": 0.9921744210327623 + }, + { + "inputIndex": 0, + "inputQty": "1000000000000000000", + "outputIndex": 2, + "outputQty": "1007279019330139954", + "swapFee": "603516894491591", + "priceReceived": 0.9921744262777621 + }, + { + "inputIndex": 0, + "inputQty": "10000000000000000000", + "outputIndex": 2, + "outputQty": "10072789661005997875", + "swapFee": "6035168759132957", + "priceReceived": 0.9921744787275486 + }, + { + "inputIndex": 0, + "inputQty": "100000000000000000000", + "outputIndex": 2, + "outputQty": "100727843382691828833", + "swapFee": "60351669013876130", + "priceReceived": 0.9921750032043162 + }, + { + "inputIndex": 0, + "inputQty": "699200000000000050331648", + "outputIndex": 2, + "outputQty": "701990061873335666661480", + "swapFee": "421209678016508108806", + "priceReceived": 0.9954254743396473 + }, + { + "inputIndex": 0, + "inputQty": "1398400000000000100663296", + "outputIndex": 2, + "outputQty": "1400520690043401824861045", + "swapFee": "841445523586415237822", + "priceReceived": 0.9978849755037205 + }, + { + "inputIndex": 0, + "inputQty": "2097600000000000016777216", + "outputIndex": 2, + "outputQty": "2095431279847674350793501", + "swapFee": "1261119325233018729452", + "priceReceived": 1.0004331331863856 + }, + { + "inputIndex": 0, + "inputQty": "2796800000000000201326592", + "outputIndex": 2, + "outputQty": "2783047691616111483913211", + "swapFee": "1680399398546506822409", + "priceReceived": 1.004337657964579 + }, + { + "inputIndex": 0, + "inputQty": "3496000000000000117440512", + "outputIndex": 2, + "outputQty": "3441701398292317538340882", + "swapFee": "2099364923554529841758", + "priceReceived": 1.0151666954053677 + }, + { + "inputIndex": 0, + "inputQty": "4195200000000000033554432", + "outputIndex": 2, + "hardLimitError": true + }, + { + "inputIndex": 0, + "inputQty": "4894399999999999949668352", + "outputIndex": 2, + "hardLimitError": true + }, + { + "inputIndex": 0, + "inputQty": "5593600000000000402653184", + "outputIndex": 2, + "hardLimitError": true + }, + { + "inputIndex": 0, + "inputQty": "6292799999999999781896192", + "outputIndex": 2, + "hardLimitError": true + }, + { + "inputIndex": 0, + "inputQty": "6992000000000000234881024", + "outputIndex": 2, + "hardLimitError": true + }, + { + "inputIndex": 1, + "inputQty": "10000000000000", + "outputIndex": 0, + "outputQty": "9915826051847", + "swapFee": "5987961342", + "priceReceived": 1.0078849695831884 + }, + { + "inputIndex": 1, + "inputQty": "1000000000000000", + "outputIndex": 0, + "outputQty": "991582605179020", + "swapFee": "598796134240", + "priceReceived": 1.0078849695889214 + }, + { + "inputIndex": 1, + "inputQty": "100000000000000000", + "outputIndex": 0, + "outputQty": "99158260460728360", + "swapFee": "59879613419763", + "priceReceived": 1.0078849701701003 + }, + { + "inputIndex": 1, + "inputQty": "1000000000000000000", + "outputIndex": 0, + "outputQty": "991582599409673433", + "swapFee": "598796133812390", + "priceReceived": 1.0078849754535517 + }, + { + "inputIndex": 1, + "inputQty": "10000000000000000000", + "outputIndex": 0, + "outputQty": "9915825474333675757", + "swapFee": "5987961299599208", + "priceReceived": 1.0078850282882756 + }, + { + "inputIndex": 1, + "inputQty": "100000000000000000000", + "outputIndex": 0, + "outputQty": "99158202764987759654", + "swapFee": "59879609143550369", + "priceReceived": 1.0078855566565874 + }, + { + "inputIndex": 1, + "inputQty": "699200000000000050331648", + "outputIndex": 0, + "outputQty": "689282551659223245636916", + "swapFee": "418477829487451578495", + "priceReceived": 1.0137809530916222 + }, + { + "inputIndex": 1, + "inputQty": "1398400000000000100663296", + "outputIndex": 0, + "outputQty": "1356366996729241375923282", + "swapFee": "836578522387612414347", + "priceReceived": 1.0303726239636564 + }, + { + "inputIndex": 1, + "inputQty": "2097600000000000016777216", + "outputIndex": 0, + "hardLimitError": true + }, + { + "inputIndex": 1, + "inputQty": "2796800000000000201326592", + "outputIndex": 0, + "hardLimitError": true + }, + { + "inputIndex": 1, + "inputQty": "3496000000000000117440512", + "outputIndex": 0, + "hardLimitError": true + }, + { + "inputIndex": 1, + "inputQty": "4195200000000000033554432", + "outputIndex": 0, + "hardLimitError": true + }, + { + "inputIndex": 1, + "inputQty": "4894399999999999949668352", + "outputIndex": 0, + "hardLimitError": true + }, + { + "inputIndex": 1, + "inputQty": "5593600000000000402653184", + "outputIndex": 0, + "hardLimitError": true + }, + { + "inputIndex": 1, + "inputQty": "6292799999999999781896192", + "outputIndex": 0, + "hardLimitError": true + }, + { + "inputIndex": 1, + "inputQty": "6992000000000000234881024", + "outputIndex": 0, + "hardLimitError": true + }, + { + "inputIndex": 1, + "inputQty": "10000000000000", + "outputIndex": 2, + "outputQty": "9994000000000", + "swapFee": "5987961342", + "priceReceived": 1.0000012045885531 + }, + { + "inputIndex": 1, + "inputQty": "1000000000000000", + "outputIndex": 2, + "outputQty": "999399999998011", + "swapFee": "598796134240", + "priceReceived": 1.0000012045905033 + }, + { + "inputIndex": 1, + "inputQty": "100000000000000000", + "outputIndex": 2, + "outputQty": "99939999980116059", + "swapFee": "59879613419763", + "priceReceived": 1.0000012047875144 + }, + { + "inputIndex": 1, + "inputQty": "1000000000000000000", + "outputIndex": 2, + "outputQty": "999399998011605799", + "swapFee": "598796133812390", + "priceReceived": 1.0000012065785313 + }, + { + "inputIndex": 1, + "inputQty": "10000000000000000000", + "outputIndex": 2, + "outputQty": "9993999801160583413", + "swapFee": "5987961299599208", + "priceReceived": 1.0000012244886993 + }, + { + "inputIndex": 1, + "inputQty": "100000000000000000000", + "outputIndex": 2, + "outputQty": "99939980116061969608", + "swapFee": "59879609143550369", + "priceReceived": 1.0000014035903781 + }, + { + "inputIndex": 1, + "inputQty": "699200000000000050331648", + "outputIndex": 2, + "outputQty": "697779736747200745522864", + "swapFee": "418477829487451578495", + "priceReceived": 1.0014356757162106 + }, + { + "inputIndex": 1, + "inputQty": "1398400000000000100663296", + "outputIndex": 2, + "outputQty": "1393157070614067945102172", + "swapFee": "836578522387612414347", + "priceReceived": 1.0031628528875085 + }, + { + "inputIndex": 1, + "inputQty": "2097600000000000016777216", + "outputIndex": 2, + "outputQty": "2084449282114052419694637", + "swapFee": "1254320506285243319162", + "priceReceived": 1.0057072136423473 + }, + { + "inputIndex": 1, + "inputQty": "2796800000000000201326592", + "outputIndex": 2, + "outputQty": "2765917160800186035881131", + "swapFee": "1671708803050131015856", + "priceReceived": 1.0105611009652629 + }, + { + "inputIndex": 1, + "inputQty": "3496000000000000117440512", + "outputIndex": 2, + "outputQty": "3409504832193172411327541", + "swapFee": "2088741347897643737830", + "priceReceived": 1.0247562125919134 + }, + { + "inputIndex": 1, + "inputQty": "4195200000000000033554432", + "outputIndex": 2, + "hardLimitError": true + }, + { + "inputIndex": 1, + "inputQty": "4894399999999999949668352", + "outputIndex": 2, + "hardLimitError": true + }, + { + "inputIndex": 1, + "inputQty": "5593600000000000402653184", + "outputIndex": 2, + "hardLimitError": true + }, + { + "inputIndex": 1, + "inputQty": "6292799999999999781896192", + "outputIndex": 2, + "hardLimitError": true + }, + { + "inputIndex": 1, + "inputQty": "6992000000000000234881024", + "outputIndex": 2, + "hardLimitError": true + }, + { + "inputIndex": 2, + "inputQty": "10000000000000", + "outputIndex": 0, + "outputQty": "9915826051847", + "swapFee": "5987961342", + "priceReceived": 1.0078849695831884 + }, + { + "inputIndex": 2, + "inputQty": "1000000000000000", + "outputIndex": 0, + "outputQty": "991582605179020", + "swapFee": "598796134240", + "priceReceived": 1.0078849695889214 + }, + { + "inputIndex": 2, + "inputQty": "100000000000000000", + "outputIndex": 0, + "outputQty": "99158260460728360", + "swapFee": "59879613419763", + "priceReceived": 1.0078849701701003 + }, + { + "inputIndex": 2, + "inputQty": "1000000000000000000", + "outputIndex": 0, + "outputQty": "991582599409673433", + "swapFee": "598796133812390", + "priceReceived": 1.0078849754535517 + }, + { + "inputIndex": 2, + "inputQty": "10000000000000000000", + "outputIndex": 0, + "outputQty": "9915825474333675757", + "swapFee": "5987961299599208", + "priceReceived": 1.0078850282882756 + }, + { + "inputIndex": 2, + "inputQty": "100000000000000000000", + "outputIndex": 0, + "outputQty": "99158202764987759654", + "swapFee": "59879609143550369", + "priceReceived": 1.0078855566565874 + }, + { + "inputIndex": 2, + "inputQty": "699200000000000050331648", + "outputIndex": 0, + "outputQty": "689282551659223245636916", + "swapFee": "418477829487451578495", + "priceReceived": 1.0137809530916222 + }, + { + "inputIndex": 2, + "inputQty": "1398400000000000100663296", + "outputIndex": 0, + "outputQty": "1356366996729241375923282", + "swapFee": "836578522387612414347", + "priceReceived": 1.0303726239636564 + }, + { + "inputIndex": 2, + "inputQty": "2097600000000000016777216", + "outputIndex": 0, + "hardLimitError": true + }, + { + "inputIndex": 2, + "inputQty": "2796800000000000201326592", + "outputIndex": 0, + "hardLimitError": true + }, + { + "inputIndex": 2, + "inputQty": "3496000000000000117440512", + "outputIndex": 0, + "hardLimitError": true + }, + { + "inputIndex": 2, + "inputQty": "4195200000000000033554432", + "outputIndex": 0, + "hardLimitError": true + }, + { + "inputIndex": 2, + "inputQty": "4894399999999999949668352", + "outputIndex": 0, + "hardLimitError": true + }, + { + "inputIndex": 2, + "inputQty": "5593600000000000402653184", + "outputIndex": 0, + "hardLimitError": true + }, + { + "inputIndex": 2, + "inputQty": "6292799999999999781896192", + "outputIndex": 0, + "hardLimitError": true + }, + { + "inputIndex": 2, + "inputQty": "6992000000000000234881024", + "outputIndex": 0, + "hardLimitError": true + }, + { + "inputIndex": 2, + "inputQty": "10000000000000", + "outputIndex": 1, + "outputQty": "9994000000000", + "swapFee": "5987961342", + "priceReceived": 1.0000012045885531 + }, + { + "inputIndex": 2, + "inputQty": "1000000000000000", + "outputIndex": 1, + "outputQty": "999399999998011", + "swapFee": "598796134240", + "priceReceived": 1.0000012045905033 + }, + { + "inputIndex": 2, + "inputQty": "100000000000000000", + "outputIndex": 1, + "outputQty": "99939999980116059", + "swapFee": "59879613419763", + "priceReceived": 1.0000012047875144 + }, + { + "inputIndex": 2, + "inputQty": "1000000000000000000", + "outputIndex": 1, + "outputQty": "999399998011605799", + "swapFee": "598796133812390", + "priceReceived": 1.0000012065785313 + }, + { + "inputIndex": 2, + "inputQty": "10000000000000000000", + "outputIndex": 1, + "outputQty": "9993999801160583413", + "swapFee": "5987961299599208", + "priceReceived": 1.0000012244886993 + }, + { + "inputIndex": 2, + "inputQty": "100000000000000000000", + "outputIndex": 1, + "outputQty": "99939980116061969608", + "swapFee": "59879609143550369", + "priceReceived": 1.0000014035903781 + }, + { + "inputIndex": 2, + "inputQty": "699200000000000050331648", + "outputIndex": 1, + "outputQty": "697779736747200745522864", + "swapFee": "418477829487451578495", + "priceReceived": 1.0014356757162106 + }, + { + "inputIndex": 2, + "inputQty": "1398400000000000100663296", + "outputIndex": 1, + "outputQty": "1393157070614067945102172", + "swapFee": "836578522387612414347", + "priceReceived": 1.0031628528875085 + }, + { + "inputIndex": 2, + "inputQty": "2097600000000000016777216", + "outputIndex": 1, + "outputQty": "2084449282114052419694637", + "swapFee": "1254320506285243319162", + "priceReceived": 1.0057072136423473 + }, + { + "inputIndex": 2, + "inputQty": "2796800000000000201326592", + "outputIndex": 1, + "outputQty": "2765917160800186035881131", + "swapFee": "1671708803050131015856", + "priceReceived": 1.0105611009652629 + }, + { + "inputIndex": 2, + "inputQty": "3496000000000000117440512", + "outputIndex": 1, + "outputQty": "3409504832193172411327541", + "swapFee": "2088741347897643737830", + "priceReceived": 1.0247562125919134 + }, + { + "inputIndex": 2, + "inputQty": "4195200000000000033554432", + "outputIndex": 1, + "hardLimitError": true + }, + { + "inputIndex": 2, + "inputQty": "4894399999999999949668352", + "outputIndex": 1, + "hardLimitError": true + }, + { + "inputIndex": 2, + "inputQty": "5593600000000000402653184", + "outputIndex": 1, + "hardLimitError": true + }, + { + "inputIndex": 2, + "inputQty": "6292799999999999781896192", + "outputIndex": 1, + "hardLimitError": true + }, + { + "inputIndex": 2, + "inputQty": "6992000000000000234881024", + "outputIndex": 1, + "hardLimitError": true + } + ] + }, + { + "reserve0": "2007000000000000000000000", + "reserve1": "7492500000000000000000000", + "reserve2": "500500000000000000000000", + "A": 120, + "mAssetSupply": "9896372713490403790662354", + "hardMin": 50000000000000000, + "hardMax": 750000000000000000, + "swapFeeRate": 600000000000000, + "swaps": [ + { + "inputIndex": 0, + "inputQty": "10000000000000", + "outputIndex": 1, + "outputQty": "10463793292692", + "swapFee": "6086334395", + "priceReceived": 0.9550947143217013 + }, + { + "inputIndex": 0, + "inputQty": "1000000000000000", + "outputIndex": 1, + "outputQty": "1046379329243911", + "swapFee": "608633439508", + "priceReceived": 0.9550947143447764 + }, + { + "inputIndex": 0, + "inputQty": "100000000000000000", + "outputIndex": 1, + "outputQty": "104637932671762503", + "swapFee": "60863343871480", + "priceReceived": 0.955094716651431 + }, + { + "inputIndex": 0, + "inputQty": "1000000000000000000", + "outputIndex": 1, + "outputQty": "1046379303751399330", + "swapFee": "608633431500388", + "priceReceived": 0.9550947376210117 + }, + { + "inputIndex": 0, + "inputQty": "10000000000000000000", + "outputIndex": 1, + "outputQty": "10463790740902354752", + "swapFee": "6086333593565286", + "priceReceived": 0.9550949473158712 + }, + { + "inputIndex": 0, + "inputQty": "100000000000000000000", + "outputIndex": 1, + "outputQty": "104637677758789146648", + "swapFee": "60863263794995589", + "priceReceived": 0.9550970441697376 + }, + { + "inputIndex": 0, + "inputQty": "699200000000000050331648", + "outputIndex": 1, + "outputQty": "722263128479055491881378", + "swapFee": "422553559162174988487", + "priceReceived": 0.9674832050645118 + }, + { + "inputIndex": 0, + "inputQty": "1398400000000000100663296", + "outputIndex": 1, + "outputQty": "1433094677312411634245482", + "swapFee": "841275721935342452176", + "priceReceived": 0.975203345880127 + }, + { + "inputIndex": 0, + "inputQty": "2097600000000000016777216", + "outputIndex": 1, + "outputQty": "2137711494094160926435218", + "swapFee": "1257768754982574099612", + "priceReceived": 0.980647873689488 + }, + { + "inputIndex": 0, + "inputQty": "2796800000000000201326592", + "outputIndex": 1, + "outputQty": "2838008198118375113442264", + "swapFee": "1672697094452568553252", + "priceReceived": 0.9848904963554165 + }, + { + "inputIndex": 0, + "inputQty": "3496000000000000117440512", + "outputIndex": 1, + "outputQty": "3534438755467934405642287", + "swapFee": "2086377935724127709749", + "priceReceived": 0.988534209755095 + }, + { + "inputIndex": 0, + "inputQty": "4195200000000000033554432", + "outputIndex": 1, + "outputQty": "4226394339111648882141178", + "swapFee": "2498975677928744759900", + "priceReceived": 0.9920278819044936 + }, + { + "inputIndex": 0, + "inputQty": "4894399999999999949668352", + "outputIndex": 1, + "outputQty": "4911782260367201108637264", + "swapFee": "2910579067931670693036", + "priceReceived": 0.9958685384735243 + }, + { + "inputIndex": 0, + "inputQty": "5593600000000000402653184", + "outputIndex": 1, + "hardLimitError": true + }, + { + "inputIndex": 0, + "inputQty": "6292799999999999781896192", + "outputIndex": 1, + "hardLimitError": true + }, + { + "inputIndex": 0, + "inputQty": "6992000000000000234881024", + "outputIndex": 1, + "hardLimitError": true + }, + { + "inputIndex": 0, + "inputQty": "10000000000000", + "outputIndex": 2, + "outputQty": "8436719465774", + "swapFee": "6086334395", + "priceReceived": 1.1845734240836394 + }, + { + "inputIndex": 0, + "inputQty": "1000000000000000", + "outputIndex": 2, + "outputQty": "843671946345970", + "swapFee": "608633439508", + "priceReceived": 1.1845734244085735 + }, + { + "inputIndex": 0, + "inputQty": "100000000000000000", + "outputIndex": 2, + "outputQty": "84367192320212282", + "swapFee": "60863343871480", + "priceReceived": 1.1845734569050674 + }, + { + "inputIndex": 0, + "inputQty": "1000000000000000000", + "outputIndex": 2, + "outputQty": "843671712803297357", + "swapFee": "608633431500388", + "priceReceived": 1.1845737523281268 + }, + { + "inputIndex": 0, + "inputQty": "10000000000000000000", + "outputIndex": 2, + "outputQty": "8436696087934987253", + "swapFee": "6086333593565286", + "priceReceived": 1.1845767065970727 + }, + { + "inputIndex": 0, + "inputQty": "100000000000000000000", + "outputIndex": 2, + "outputQty": "84364856654093899177", + "swapFee": "60863263794995589", + "priceReceived": 1.184606253122287 + }, + { + "inputIndex": 0, + "inputQty": "699200000000000050331648", + "outputIndex": 2, + "hardLimitError": true + }, + { + "inputIndex": 0, + "inputQty": "1398400000000000100663296", + "outputIndex": 2, + "hardLimitError": true + }, + { + "inputIndex": 0, + "inputQty": "2097600000000000016777216", + "outputIndex": 2, + "hardLimitError": true + }, + { + "inputIndex": 0, + "inputQty": "2796800000000000201326592", + "outputIndex": 2, + "hardLimitError": true + }, + { + "inputIndex": 0, + "inputQty": "3496000000000000117440512", + "outputIndex": 2, + "hardLimitError": true + }, + { + "inputIndex": 0, + "inputQty": "4195200000000000033554432", + "outputIndex": 2, + "hardLimitError": true + }, + { + "inputIndex": 0, + "inputQty": "4894399999999999949668352", + "outputIndex": 2, + "hardLimitError": true + }, + { + "inputIndex": 0, + "inputQty": "5593600000000000402653184", + "outputIndex": 2, + "hardLimitError": true + }, + { + "inputIndex": 0, + "inputQty": "6292799999999999781896192", + "outputIndex": 2, + "hardLimitError": true + }, + { + "inputIndex": 0, + "inputQty": "6992000000000000234881024", + "outputIndex": 2, + "hardLimitError": true + }, + { + "inputIndex": 1, + "inputQty": "10000000000000", + "outputIndex": 0, + "outputQty": "9545299033164", + "swapFee": "5813076027", + "priceReceived": 1.0470271166203795 + }, + { + "inputIndex": 1, + "inputQty": "1000000000000000", + "outputIndex": 0, + "outputQty": "954529903294338", + "swapFee": "581307602736", + "priceReceived": 1.0470271166445417 + }, + { + "inputIndex": 1, + "inputQty": "100000000000000000", + "outputIndex": 0, + "outputQty": "95452990109381565", + "swapFee": "58130760256577", + "priceReceived": 1.0470271190584806 + }, + { + "inputIndex": 1, + "inputQty": "1000000000000000000", + "outputIndex": 0, + "outputQty": "954529881089065644", + "swapFee": "581307601011551", + "priceReceived": 1.0470271410033882 + }, + { + "inputIndex": 1, + "inputQty": "10000000000000000000", + "outputIndex": 0, + "outputQty": "9545296810407490515", + "swapFee": "5813075854692939", + "priceReceived": 1.04702736045341 + }, + { + "inputIndex": 1, + "inputQty": "100000000000000000000", + "outputIndex": 0, + "outputQty": "95452768047591845254", + "swapFee": "58130743004639067", + "priceReceived": 1.0470295550482653 + }, + { + "inputIndex": 1, + "inputQty": "699200000000000050331648", + "outputIndex": 0, + "hardLimitError": true + }, + { + "inputIndex": 1, + "inputQty": "1398400000000000100663296", + "outputIndex": 0, + "hardLimitError": true + }, + { + "inputIndex": 1, + "inputQty": "2097600000000000016777216", + "outputIndex": 0, + "hardLimitError": true + }, + { + "inputIndex": 1, + "inputQty": "2796800000000000201326592", + "outputIndex": 0, + "hardLimitError": true + }, + { + "inputIndex": 1, + "inputQty": "3496000000000000117440512", + "outputIndex": 0, + "hardLimitError": true + }, + { + "inputIndex": 1, + "inputQty": "4195200000000000033554432", + "outputIndex": 0, + "hardLimitError": true + }, + { + "inputIndex": 1, + "inputQty": "4894399999999999949668352", + "outputIndex": 0, + "hardLimitError": true + }, + { + "inputIndex": 1, + "inputQty": "5593600000000000402653184", + "outputIndex": 0, + "hardLimitError": true + }, + { + "inputIndex": 1, + "inputQty": "6292799999999999781896192", + "outputIndex": 0, + "hardLimitError": true + }, + { + "inputIndex": 1, + "inputQty": "6992000000000000234881024", + "outputIndex": 0, + "hardLimitError": true + }, + { + "inputIndex": 1, + "inputQty": "10000000000000", + "outputIndex": 2, + "outputQty": "8057935777439", + "swapFee": "5813076027", + "priceReceived": 1.2402912110512483 + }, + { + "inputIndex": 1, + "inputQty": "1000000000000000", + "outputIndex": 2, + "outputQty": "805793577497443", + "swapFee": "581307602736", + "priceReceived": 1.2402912114305544 + }, + { + "inputIndex": 1, + "inputQty": "100000000000000000", + "outputIndex": 2, + "outputQty": "80579355285952603", + "swapFee": "58130760256577", + "priceReceived": 1.2402912493538687 + }, + { + "inputIndex": 1, + "inputQty": "1000000000000000000", + "outputIndex": 2, + "outputQty": "805793328878247977", + "swapFee": "581307601011551", + "priceReceived": 1.240291594111716 + }, + { + "inputIndex": 1, + "inputQty": "10000000000000000000", + "outputIndex": 2, + "outputQty": "8057910890439978463", + "swapFee": "5813075854692939", + "priceReceived": 1.2402950417337768 + }, + { + "inputIndex": 1, + "inputQty": "100000000000000000000", + "outputIndex": 2, + "outputQty": "80576868855441209889", + "swapFee": "58130743004639067", + "priceReceived": 1.2403295223136046 + }, + { + "inputIndex": 1, + "inputQty": "699200000000000050331648", + "outputIndex": 2, + "hardLimitError": true + }, + { + "inputIndex": 1, + "inputQty": "1398400000000000100663296", + "outputIndex": 2, + "hardLimitError": true + }, + { + "inputIndex": 1, + "inputQty": "2097600000000000016777216", + "outputIndex": 2, + "hardLimitError": true + }, + { + "inputIndex": 1, + "inputQty": "2796800000000000201326592", + "outputIndex": 2, + "hardLimitError": true + }, + { + "inputIndex": 1, + "inputQty": "3496000000000000117440512", + "outputIndex": 2, + "hardLimitError": true + }, + { + "inputIndex": 1, + "inputQty": "4195200000000000033554432", + "outputIndex": 2, + "hardLimitError": true + }, + { + "inputIndex": 1, + "inputQty": "4894399999999999949668352", + "outputIndex": 2, + "hardLimitError": true + }, + { + "inputIndex": 1, + "inputQty": "5593600000000000402653184", + "outputIndex": 2, + "hardLimitError": true + }, + { + "inputIndex": 1, + "inputQty": "6292799999999999781896192", + "outputIndex": 2, + "hardLimitError": true + }, + { + "inputIndex": 1, + "inputQty": "6992000000000000234881024", + "outputIndex": 2, + "hardLimitError": true + }, + { + "inputIndex": 2, + "inputQty": "10000000000000", + "outputIndex": 0, + "outputQty": "11838729070533", + "swapFee": "7209772257", + "priceReceived": 0.8440762659748161 + }, + { + "inputIndex": 2, + "inputQty": "1000000000000000", + "outputIndex": 0, + "outputQty": "1183872906668422", + "swapFee": "720977225474", + "priceReceived": 0.8440762662494169 + }, + { + "inputIndex": 2, + "inputQty": "100000000000000000", + "outputIndex": 0, + "outputQty": "118387286817586995", + "swapFee": "72097720241086", + "priceReceived": 0.8440762937132719 + }, + { + "inputIndex": 2, + "inputQty": "1000000000000000000", + "outputIndex": 0, + "outputQty": "1183872518244243855", + "swapFee": "720976992737435", + "priceReceived": 0.8440765433842954 + }, + { + "inputIndex": 2, + "inputQty": "10000000000000000000", + "outputIndex": 0, + "outputQty": "11838690189932096568", + "swapFee": "7209748960428383", + "priceReceived": 0.8440790400561101 + }, + { + "inputIndex": 2, + "inputQty": "100000000000000000000", + "outputIndex": 0, + "outputQty": "118383403300427069140", + "swapFee": "72095393306750833", + "priceReceived": 0.8441040029327553 + }, + { + "inputIndex": 2, + "inputQty": "699200000000000050331648", + "outputIndex": 0, + "hardLimitError": true + }, + { + "inputIndex": 2, + "inputQty": "1398400000000000100663296", + "outputIndex": 0, + "hardLimitError": true + }, + { + "inputIndex": 2, + "inputQty": "2097600000000000016777216", + "outputIndex": 0, + "hardLimitError": true + }, + { + "inputIndex": 2, + "inputQty": "2796800000000000201326592", + "outputIndex": 0, + "hardLimitError": true + }, + { + "inputIndex": 2, + "inputQty": "3496000000000000117440512", + "outputIndex": 0, + "hardLimitError": true + }, + { + "inputIndex": 2, + "inputQty": "4195200000000000033554432", + "outputIndex": 0, + "hardLimitError": true + }, + { + "inputIndex": 2, + "inputQty": "4894399999999999949668352", + "outputIndex": 0, + "hardLimitError": true + }, + { + "inputIndex": 2, + "inputQty": "5593600000000000402653184", + "outputIndex": 0, + "hardLimitError": true + }, + { + "inputIndex": 2, + "inputQty": "6292799999999999781896192", + "outputIndex": 0, + "hardLimitError": true + }, + { + "inputIndex": 2, + "inputQty": "6992000000000000234881024", + "outputIndex": 0, + "hardLimitError": true + }, + { + "inputIndex": 2, + "inputQty": "10000000000000", + "outputIndex": 1, + "outputQty": "12395238527337", + "swapFee": "7209772257", + "priceReceived": 0.8061797443997922 + }, + { + "inputIndex": 2, + "inputQty": "1000000000000000", + "outputIndex": 1, + "outputQty": "1239523852263400", + "swapFee": "720977225474", + "priceReceived": 0.8061797447058552 + }, + { + "inputIndex": 2, + "inputQty": "100000000000000000", + "outputIndex": 1, + "outputQty": "123952380523418314", + "swapFee": "72097720241086", + "priceReceived": 0.8061797753120162 + }, + { + "inputIndex": 2, + "inputQty": "1000000000000000000", + "outputIndex": 1, + "outputQty": "1239523377696697198", + "swapFee": "720976992737435", + "priceReceived": 0.8061800535494049 + }, + { + "inputIndex": 2, + "inputQty": "10000000000000000000", + "outputIndex": 1, + "outputQty": "12395191024051384203", + "swapFee": "7209748960428383", + "priceReceived": 0.8061828358796373 + }, + { + "inputIndex": 2, + "inputQty": "100000000000000000000", + "outputIndex": 1, + "outputQty": "123947635781796985191", + "swapFee": "72095393306750833", + "priceReceived": 0.8062106548172556 + }, + { + "inputIndex": 2, + "inputQty": "699200000000000050331648", + "outputIndex": 1, + "outputQty": "768896006715057077927865", + "swapFee": "455349056078842881937", + "priceReceived": 0.908763532183185 + }, + { + "inputIndex": 2, + "inputQty": "1398400000000000100663296", + "outputIndex": 1, + "outputQty": "1485514801822270051395981", + "swapFee": "884040318185604670645", + "priceReceived": 0.9407620563372994 + }, + { + "inputIndex": 2, + "inputQty": "2097600000000000016777216", + "outputIndex": 1, + "outputQty": "2191692694525269933121433", + "swapFee": "1307270388189317742828", + "priceReceived": 0.9564720158296994 + }, + { + "inputIndex": 2, + "inputQty": "2796800000000000201326592", + "outputIndex": 1, + "outputQty": "2893745098578223596232972", + "swapFee": "1728372076376296111498", + "priceReceived": 0.9659011186911105 + }, + { + "inputIndex": 2, + "inputQty": "3496000000000000117440512", + "outputIndex": 1, + "outputQty": "3593394051728979159386178", + "swapFee": "2148353632174868084140", + "priceReceived": 0.9722984999896522 + }, + { + "inputIndex": 2, + "inputQty": "4195200000000000033554432", + "outputIndex": 1, + "outputQty": "4291015906040761605294836", + "swapFee": "2567621069932273372757", + "priceReceived": 0.9770722063807332 + }, + { + "inputIndex": 2, + "inputQty": "4894399999999999949668352", + "outputIndex": 1, + "outputQty": "4986132009816772962673844", + "swapFee": "2986366809676326880201", + "priceReceived": 0.98100363639792 + }, + { + "inputIndex": 2, + "inputQty": "5593600000000000402653184", + "outputIndex": 1, + "outputQty": "5676824010962740152173763", + "swapFee": "3404691779986865867419", + "priceReceived": 0.9847399351159319 + }, + { + "inputIndex": 2, + "inputQty": "6292799999999999781896192", + "outputIndex": 1, + "outputQty": "6356304183245645467880735", + "swapFee": "3822652371743742700155", + "priceReceived": 0.989407864432471 + }, + { + "inputIndex": 2, + "inputQty": "6992000000000000234881024", + "outputIndex": 1, + "outputQty": "6988467216013139965717995", + "swapFee": "4240281183082721427082", + "priceReceived": 0.9998987621785502 + } + ] + }, + { + "reserve0": "500500000000000000000000", + "reserve1": "5503000000000000000000000", + "reserve2": "3996499999999999360000000", + "A": 120, + "mAssetSupply": "9936488013915504712820075", + "hardMin": 50000000000000000, + "hardMax": 750000000000000000, + "swapFeeRate": 600000000000000, + "swaps": [ + { + "inputIndex": 0, + "inputQty": "10000000000000", + "outputIndex": 1, + "outputQty": "11620945759945", + "swapFee": "6859719831", + "priceReceived": 0.8599248707117532 + }, + { + "inputIndex": 0, + "inputQty": "1000000000000000", + "outputIndex": 1, + "outputQty": "1162094575673868", + "swapFee": "685971983000", + "priceReceived": 0.8599248709491 + }, + { + "inputIndex": 0, + "inputQty": "100000000000000000", + "outputIndex": 1, + "outputQty": "116209454362088099", + "swapFee": "68597196650141", + "priceReceived": 0.8599248946818155 + }, + { + "inputIndex": 0, + "inputQty": "1000000000000000000", + "outputIndex": 1, + "outputQty": "1162094252230663839", + "swapFee": "685971816509847", + "priceReceived": 0.8599251104334148 + }, + { + "inputIndex": 0, + "inputQty": "10000000000000000000", + "outputIndex": 1, + "outputQty": "11620913383853133332", + "swapFee": "6859703166228994", + "priceReceived": 0.8599272679132866 + }, + { + "inputIndex": 0, + "inputQty": "100000000000000000000", + "outputIndex": 1, + "outputQty": "116206220561278555141", + "swapFee": "68595532062973176", + "priceReceived": 0.8599488391005764 + }, + { + "inputIndex": 0, + "inputQty": "699200000000000050331648", + "outputIndex": 1, + "outputQty": "745890348448147376765907", + "swapFee": "445006902707531211857", + "priceReceived": 0.9368065889994129 + }, + { + "inputIndex": 0, + "inputQty": "1398400000000000100663296", + "outputIndex": 1, + "outputQty": "1455978176046775934050805", + "swapFee": "871263438783980145513", + "priceReceived": 0.9598555524752027 + }, + { + "inputIndex": 0, + "inputQty": "2097600000000000016777216", + "outputIndex": 1, + "outputQty": "2158527843482740112916076", + "swapFee": "1293720116988526957620", + "priceReceived": 0.9711740741322403 + }, + { + "inputIndex": 0, + "inputQty": "2796800000000000201326592", + "outputIndex": 1, + "outputQty": "2857415815532514252372830", + "swapFee": "1714701523310602758700", + "priceReceived": 0.9781864030019696 + }, + { + "inputIndex": 0, + "inputQty": "3496000000000000117440512", + "outputIndex": 1, + "outputQty": "3552759522564674531561542", + "swapFee": "2134908027576693262258", + "priceReceived": 0.9834229054293727 + }, + { + "inputIndex": 0, + "inputQty": "4195200000000000033554432", + "outputIndex": 1, + "outputQty": "4241362748345309178531825", + "swapFee": "2554620993917667761718", + "priceReceived": 0.9885137461165676 + }, + { + "inputIndex": 0, + "inputQty": "4894399999999999949668352", + "outputIndex": 1, + "outputQty": "4904706719603051186243047", + "swapFee": "2973973525353851305566", + "priceReceived": 0.9972922554012608 + }, + { + "inputIndex": 0, + "inputQty": "5593600000000000402653184", + "outputIndex": 1, + "hardLimitError": true + }, + { + "inputIndex": 0, + "inputQty": "6292799999999999781896192", + "outputIndex": 1, + "hardLimitError": true + }, + { + "inputIndex": 0, + "inputQty": "6992000000000000234881024", + "outputIndex": 1, + "hardLimitError": true + }, + { + "inputIndex": 0, + "inputQty": "10000000000000", + "outputIndex": 2, + "outputQty": "11550033183542", + "swapFee": "6859719831", + "priceReceived": 0.8652044649021905 + }, + { + "inputIndex": 0, + "inputQty": "1000000000000000", + "outputIndex": 2, + "outputQty": "1155003318045790", + "swapFee": "685971983000", + "priceReceived": 0.8652044651333047 + }, + { + "inputIndex": 0, + "inputQty": "100000000000000000", + "outputIndex": 2, + "outputQty": "115500328721628968", + "swapFee": "68597196650141", + "priceReceived": 0.8652044882417411 + }, + { + "inputIndex": 0, + "inputQty": "1000000000000000000", + "outputIndex": 2, + "outputQty": "1155003006948657823", + "swapFee": "685971816509847", + "priceReceived": 0.8652046983180812 + }, + { + "inputIndex": 0, + "inputQty": "10000000000000000000", + "outputIndex": 2, + "outputQty": "11550002043267059664", + "swapFee": "6859703166228994", + "priceReceived": 0.8652067990463392 + }, + { + "inputIndex": 0, + "inputQty": "100000000000000000000", + "outputIndex": 2, + "outputQty": "115497218354278530158", + "swapFee": "68595532062973176", + "priceReceived": 0.865227802815176 + }, + { + "inputIndex": 0, + "inputQty": "699200000000000050331648", + "outputIndex": 2, + "outputQty": "743166819088135044993130", + "swapFee": "445006902707531211857", + "priceReceived": 0.9402397619886531 + }, + { + "inputIndex": 0, + "inputQty": "1398400000000000100663296", + "outputIndex": 2, + "outputQty": "1450928056228897744391420", + "swapFee": "871263438783980145513", + "priceReceived": 0.9631964386942302 + }, + { + "inputIndex": 0, + "inputQty": "2097600000000000016777216", + "outputIndex": 2, + "outputQty": "2149425990449541609895316", + "swapFee": "1293720116988526957620", + "priceReceived": 0.9752865598524654 + }, + { + "inputIndex": 0, + "inputQty": "2796800000000000201326592", + "outputIndex": 2, + "outputQty": "2838442023752825260195309", + "swapFee": "1714701523310602758700", + "priceReceived": 0.9847251679219391 + }, + { + "inputIndex": 0, + "inputQty": "3496000000000000117440512", + "outputIndex": 2, + "outputQty": "3494131812367917204123626", + "swapFee": "2134908027576693262258", + "priceReceived": 0.9999236661895382 + }, + { + "inputIndex": 0, + "inputQty": "4195200000000000033554432", + "outputIndex": 2, + "hardLimitError": true + }, + { + "inputIndex": 0, + "inputQty": "4894399999999999949668352", + "outputIndex": 2, + "hardLimitError": true + }, + { + "inputIndex": 0, + "inputQty": "5593600000000000402653184", + "outputIndex": 2, + "hardLimitError": true + }, + { + "inputIndex": 0, + "inputQty": "6292799999999999781896192", + "outputIndex": 2, + "hardLimitError": true + }, + { + "inputIndex": 0, + "inputQty": "6992000000000000234881024", + "outputIndex": 2, + "hardLimitError": true + }, + { + "inputIndex": 1, + "inputQty": "10000000000000", + "outputIndex": 0, + "outputQty": "8594828515917", + "swapFee": "5899351172", + "priceReceived": 1.1628039617450947 + }, + { + "inputIndex": 1, + "inputQty": "1000000000000000", + "outputIndex": 0, + "outputQty": "859482851387857", + "swapFee": "589935117275", + "priceReceived": 1.1628039620207888 + }, + { + "inputIndex": 1, + "inputQty": "100000000000000000", + "outputIndex": 0, + "outputQty": "85948283101101317", + "swapFee": "58993511717134", + "priceReceived": 1.1628039895889701 + }, + { + "inputIndex": 1, + "inputQty": "1000000000000000000", + "outputIndex": 0, + "outputQty": "859482645766757989", + "swapFee": "589935116226982", + "priceReceived": 1.1628042402091592 + }, + { + "inputIndex": 1, + "inputQty": "10000000000000000000", + "outputIndex": 0, + "outputQty": "8594807933019418572", + "swapFee": "5899351067834018", + "priceReceived": 1.1628067464471152 + }, + { + "inputIndex": 1, + "inputQty": "100000000000000000000", + "outputIndex": 0, + "outputQty": "85946226642713984426", + "swapFee": "58993501234750486", + "priceReceived": 1.1628318124334742 + }, + { + "inputIndex": 1, + "inputQty": "699200000000000050331648", + "outputIndex": 0, + "hardLimitError": true + }, + { + "inputIndex": 1, + "inputQty": "1398400000000000100663296", + "outputIndex": 0, + "hardLimitError": true + }, + { + "inputIndex": 1, + "inputQty": "2097600000000000016777216", + "outputIndex": 0, + "hardLimitError": true + }, + { + "inputIndex": 1, + "inputQty": "2796800000000000201326592", + "outputIndex": 0, + "hardLimitError": true + }, + { + "inputIndex": 1, + "inputQty": "3496000000000000117440512", + "outputIndex": 0, + "hardLimitError": true + }, + { + "inputIndex": 1, + "inputQty": "4195200000000000033554432", + "outputIndex": 0, + "hardLimitError": true + }, + { + "inputIndex": 1, + "inputQty": "4894399999999999949668352", + "outputIndex": 0, + "hardLimitError": true + }, + { + "inputIndex": 1, + "inputQty": "5593600000000000402653184", + "outputIndex": 0, + "hardLimitError": true + }, + { + "inputIndex": 1, + "inputQty": "6292799999999999781896192", + "outputIndex": 0, + "hardLimitError": true + }, + { + "inputIndex": 1, + "inputQty": "6992000000000000234881024", + "outputIndex": 0, + "hardLimitError": true + }, + { + "inputIndex": 1, + "inputQty": "10000000000000", + "outputIndex": 2, + "outputQty": "9933015265778", + "swapFee": "5899351172", + "priceReceived": 1.006149732122174 + }, + { + "inputIndex": 1, + "inputQty": "1000000000000000", + "outputIndex": 2, + "outputQty": "993301526573337", + "swapFee": "589935117275", + "priceReceived": 1.0061497321266193 + }, + { + "inputIndex": 1, + "inputQty": "100000000000000000", + "outputIndex": 2, + "outputQty": "99330152613560344", + "swapFee": "58993511717134", + "priceReceived": 1.0061497325701192 + }, + { + "inputIndex": 1, + "inputQty": "1000000000000000000", + "outputIndex": 2, + "outputQty": "993301522156207633", + "swapFee": "589935116226982", + "priceReceived": 1.0061497366019387 + }, + { + "inputIndex": 1, + "inputQty": "10000000000000000000", + "outputIndex": 2, + "outputQty": "9933014823622019721", + "swapFee": "5899351067834018", + "priceReceived": 1.006149776920183 + }, + { + "inputIndex": 1, + "inputQty": "100000000000000000000", + "outputIndex": 2, + "outputQty": "99330108441738514131", + "swapFee": "58993501234750486", + "priceReceived": 1.0061501801076262 + }, + { + "inputIndex": 1, + "inputQty": "699200000000000050331648", + "outputIndex": 2, + "outputQty": "692112050839051884447054", + "swapFee": "411965810390800782245", + "priceReceived": 1.0096458129033645 + }, + { + "inputIndex": 1, + "inputQty": "1398400000000000100663296", + "outputIndex": 2, + "hardLimitError": true + }, + { + "inputIndex": 1, + "inputQty": "2097600000000000016777216", + "outputIndex": 2, + "hardLimitError": true + }, + { + "inputIndex": 1, + "inputQty": "2796800000000000201326592", + "outputIndex": 2, + "hardLimitError": true + }, + { + "inputIndex": 1, + "inputQty": "3496000000000000117440512", + "outputIndex": 2, + "hardLimitError": true + }, + { + "inputIndex": 1, + "inputQty": "4195200000000000033554432", + "outputIndex": 2, + "hardLimitError": true + }, + { + "inputIndex": 1, + "inputQty": "4894399999999999949668352", + "outputIndex": 2, + "hardLimitError": true + }, + { + "inputIndex": 1, + "inputQty": "5593600000000000402653184", + "outputIndex": 2, + "hardLimitError": true + }, + { + "inputIndex": 1, + "inputQty": "6292799999999999781896192", + "outputIndex": 2, + "hardLimitError": true + }, + { + "inputIndex": 1, + "inputQty": "6992000000000000234881024", + "outputIndex": 2, + "hardLimitError": true + }, + { + "inputIndex": 2, + "inputQty": "10000000000000", + "outputIndex": 0, + "outputQty": "8647597319619", + "swapFee": "5935570825", + "priceReceived": 1.155704186930772 + }, + { + "inputIndex": 2, + "inputQty": "1000000000000000", + "outputIndex": 0, + "outputQty": "864759731762277", + "swapFee": "593557082546", + "priceReceived": 1.155704187197504 + }, + { + "inputIndex": 2, + "inputQty": "100000000000000000", + "outputIndex": 0, + "outputQty": "86475971180035582", + "swapFee": "59355708242930", + "priceReceived": 1.155704213875658 + }, + { + "inputIndex": 2, + "inputQty": "1000000000000000000", + "outputIndex": 0, + "outputQty": "864759530328127639", + "swapFee": "593557081361661", + "priceReceived": 1.1557044564046837 + }, + { + "inputIndex": 2, + "inputQty": "10000000000000000000", + "outputIndex": 0, + "outputQty": "8647577155837814186", + "swapFee": "5935570706852205", + "priceReceived": 1.1557068817300284 + }, + { + "inputIndex": 2, + "inputQty": "100000000000000000000", + "outputIndex": 0, + "outputQty": "86473956593366315633", + "swapFee": "59355696392160991", + "priceReceived": 1.1557311384925644 + }, + { + "inputIndex": 2, + "inputQty": "699200000000000050331648", + "outputIndex": 0, + "hardLimitError": true + }, + { + "inputIndex": 2, + "inputQty": "1398400000000000100663296", + "outputIndex": 0, + "hardLimitError": true + }, + { + "inputIndex": 2, + "inputQty": "2097600000000000016777216", + "outputIndex": 0, + "hardLimitError": true + }, + { + "inputIndex": 2, + "inputQty": "2796800000000000201326592", + "outputIndex": 0, + "hardLimitError": true + }, + { + "inputIndex": 2, + "inputQty": "3496000000000000117440512", + "outputIndex": 0, + "hardLimitError": true + }, + { + "inputIndex": 2, + "inputQty": "4195200000000000033554432", + "outputIndex": 0, + "hardLimitError": true + }, + { + "inputIndex": 2, + "inputQty": "4894399999999999949668352", + "outputIndex": 0, + "hardLimitError": true + }, + { + "inputIndex": 2, + "inputQty": "5593600000000000402653184", + "outputIndex": 0, + "hardLimitError": true + }, + { + "inputIndex": 2, + "inputQty": "6292799999999999781896192", + "outputIndex": 0, + "hardLimitError": true + }, + { + "inputIndex": 2, + "inputQty": "6992000000000000234881024", + "outputIndex": 0, + "hardLimitError": true + }, + { + "inputIndex": 2, + "inputQty": "10000000000000", + "outputIndex": 1, + "outputQty": "10055359156058", + "swapFee": "5935570825", + "priceReceived": 0.9939042727433488 + }, + { + "inputIndex": 2, + "inputQty": "1000000000000000", + "outputIndex": 1, + "outputQty": "1005535915601292", + "swapFee": "593557082546", + "priceReceived": 0.9939042727477589 + }, + { + "inputIndex": 2, + "inputQty": "100000000000000000", + "outputIndex": 1, + "outputQty": "100553591515543302", + "swapFee": "59355708242930", + "priceReceived": 0.9939042731885764 + }, + { + "inputIndex": 2, + "inputQty": "1000000000000000000", + "outputIndex": 1, + "outputQty": "1005535911102178221", + "swapFee": "593557081361661", + "priceReceived": 0.9939042771960065 + }, + { + "inputIndex": 2, + "inputQty": "10000000000000000000", + "outputIndex": 1, + "outputQty": "10055358705696826886", + "swapFee": "5935570706852205", + "priceReceived": 0.9939043172702577 + }, + { + "inputIndex": 2, + "inputQty": "100000000000000000000", + "outputIndex": 1, + "outputQty": "100553546524996650939", + "swapFee": "59355696392160991", + "priceReceived": 0.9939047180077686 + }, + { + "inputIndex": 2, + "inputQty": "699200000000000050331648", + "outputIndex": 1, + "outputQty": "701018217861898684511298", + "swapFee": "414460558510421777310", + "priceReceived": 0.9968150921566366 + }, + { + "inputIndex": 2, + "inputQty": "1398400000000000100663296", + "outputIndex": 1, + "outputQty": "1398171292102579103177398", + "swapFee": "827881449563621606965", + "priceReceived": 0.9995714591226933 + }, + { + "inputIndex": 2, + "inputQty": "2097600000000000016777216", + "outputIndex": 1, + "outputQty": "2091056554689476319158584", + "swapFee": "1240319563507359838670", + "priceReceived": 1.0025360986698917 + }, + { + "inputIndex": 2, + "inputQty": "2796800000000000201326592", + "outputIndex": 1, + "hardLimitError": true + }, + { + "inputIndex": 2, + "inputQty": "3496000000000000117440512", + "outputIndex": 1, + "hardLimitError": true + }, + { + "inputIndex": 2, + "inputQty": "4195200000000000033554432", + "outputIndex": 1, + "hardLimitError": true + }, + { + "inputIndex": 2, + "inputQty": "4894399999999999949668352", + "outputIndex": 1, + "hardLimitError": true + }, + { + "inputIndex": 2, + "inputQty": "5593600000000000402653184", + "outputIndex": 1, + "hardLimitError": true + }, + { + "inputIndex": 2, + "inputQty": "6292799999999999781896192", + "outputIndex": 1, + "hardLimitError": true + }, + { + "inputIndex": 2, + "inputQty": "6992000000000000234881024", + "outputIndex": 1, + "hardLimitError": true + } + ] + }, + { + "reserve0": "500500000000000000000000", + "reserve1": "2007000000000000000000000", + "reserve2": "7492500000000000000000000", + "A": 120, + "mAssetSupply": "9896372713490403790662354", + "hardMin": 50000000000000000, + "hardMax": 750000000000000000, + "swapFeeRate": 600000000000000, + "swaps": [ + { + "inputIndex": 0, + "inputQty": "10000000000000", + "outputIndex": 1, + "outputQty": "11838729070533", + "swapFee": "7209772257", + "priceReceived": 0.8440762659748161 + }, + { + "inputIndex": 0, + "inputQty": "1000000000000000", + "outputIndex": 1, + "outputQty": "1183872906668422", + "swapFee": "720977225474", + "priceReceived": 0.8440762662494169 + }, + { + "inputIndex": 0, + "inputQty": "100000000000000000", + "outputIndex": 1, + "outputQty": "118387286817586995", + "swapFee": "72097720241086", + "priceReceived": 0.8440762937132719 + }, + { + "inputIndex": 0, + "inputQty": "1000000000000000000", + "outputIndex": 1, + "outputQty": "1183872518244243855", + "swapFee": "720976992737435", + "priceReceived": 0.8440765433842954 + }, + { + "inputIndex": 0, + "inputQty": "10000000000000000000", + "outputIndex": 1, + "outputQty": "11838690189932096567", + "swapFee": "7209748960428383", + "priceReceived": 0.8440790400561101 + }, + { + "inputIndex": 0, + "inputQty": "100000000000000000000", + "outputIndex": 1, + "outputQty": "118383403300427069140", + "swapFee": "72095393306750833", + "priceReceived": 0.8441040029327553 + }, + { + "inputIndex": 0, + "inputQty": "699200000000000050331648", + "outputIndex": 1, + "hardLimitError": true + }, + { + "inputIndex": 0, + "inputQty": "1398400000000000100663296", + "outputIndex": 1, + "hardLimitError": true + }, + { + "inputIndex": 0, + "inputQty": "2097600000000000016777216", + "outputIndex": 1, + "hardLimitError": true + }, + { + "inputIndex": 0, + "inputQty": "2796800000000000201326592", + "outputIndex": 1, + "hardLimitError": true + }, + { + "inputIndex": 0, + "inputQty": "3496000000000000117440512", + "outputIndex": 1, + "hardLimitError": true + }, + { + "inputIndex": 0, + "inputQty": "4195200000000000033554432", + "outputIndex": 1, + "hardLimitError": true + }, + { + "inputIndex": 0, + "inputQty": "4894399999999999949668352", + "outputIndex": 1, + "hardLimitError": true + }, + { + "inputIndex": 0, + "inputQty": "5593600000000000402653184", + "outputIndex": 1, + "hardLimitError": true + }, + { + "inputIndex": 0, + "inputQty": "6292799999999999781896192", + "outputIndex": 1, + "hardLimitError": true + }, + { + "inputIndex": 0, + "inputQty": "6992000000000000234881024", + "outputIndex": 1, + "hardLimitError": true + }, + { + "inputIndex": 0, + "inputQty": "10000000000000", + "outputIndex": 2, + "outputQty": "12395238527337", + "swapFee": "7209772257", + "priceReceived": 0.8061797443997922 + }, + { + "inputIndex": 0, + "inputQty": "1000000000000000", + "outputIndex": 2, + "outputQty": "1239523852263400", + "swapFee": "720977225474", + "priceReceived": 0.8061797447058552 + }, + { + "inputIndex": 0, + "inputQty": "100000000000000000", + "outputIndex": 2, + "outputQty": "123952380523418314", + "swapFee": "72097720241086", + "priceReceived": 0.8061797753120162 + }, + { + "inputIndex": 0, + "inputQty": "1000000000000000000", + "outputIndex": 2, + "outputQty": "1239523377696697198", + "swapFee": "720976992737435", + "priceReceived": 0.8061800535494049 + }, + { + "inputIndex": 0, + "inputQty": "10000000000000000000", + "outputIndex": 2, + "outputQty": "12395191024051384203", + "swapFee": "7209748960428383", + "priceReceived": 0.8061828358796373 + }, + { + "inputIndex": 0, + "inputQty": "100000000000000000000", + "outputIndex": 2, + "outputQty": "123947635781796985191", + "swapFee": "72095393306750833", + "priceReceived": 0.8062106548172556 + }, + { + "inputIndex": 0, + "inputQty": "699200000000000050331648", + "outputIndex": 2, + "outputQty": "768896006715057077927865", + "swapFee": "455349056078842881937", + "priceReceived": 0.908763532183185 + }, + { + "inputIndex": 0, + "inputQty": "1398400000000000100663296", + "outputIndex": 2, + "outputQty": "1485514801822270051395981", + "swapFee": "884040318185604670645", + "priceReceived": 0.9407620563372994 + }, + { + "inputIndex": 0, + "inputQty": "2097600000000000016777216", + "outputIndex": 2, + "outputQty": "2191692694525269933121433", + "swapFee": "1307270388189317742828", + "priceReceived": 0.9564720158296994 + }, + { + "inputIndex": 0, + "inputQty": "2796800000000000201326592", + "outputIndex": 2, + "outputQty": "2893745098578223596232972", + "swapFee": "1728372076376296111498", + "priceReceived": 0.9659011186911105 + }, + { + "inputIndex": 0, + "inputQty": "3496000000000000117440512", + "outputIndex": 2, + "outputQty": "3593394051728979159386178", + "swapFee": "2148353632174868084140", + "priceReceived": 0.9722984999896522 + }, + { + "inputIndex": 0, + "inputQty": "4195200000000000033554432", + "outputIndex": 2, + "outputQty": "4291015906040761605294836", + "swapFee": "2567621069932273372757", + "priceReceived": 0.9770722063807332 + }, + { + "inputIndex": 0, + "inputQty": "4894399999999999949668352", + "outputIndex": 2, + "outputQty": "4986132009816772962673844", + "swapFee": "2986366809676326880201", + "priceReceived": 0.98100363639792 + }, + { + "inputIndex": 0, + "inputQty": "5593600000000000402653184", + "outputIndex": 2, + "outputQty": "5676824010962740152173763", + "swapFee": "3404691779986865867419", + "priceReceived": 0.9847399351159319 + }, + { + "inputIndex": 0, + "inputQty": "6292799999999999781896192", + "outputIndex": 2, + "outputQty": "6356304183245645467880735", + "swapFee": "3822652371743742700155", + "priceReceived": 0.989407864432471 + }, + { + "inputIndex": 0, + "inputQty": "6992000000000000234881024", + "outputIndex": 2, + "outputQty": "6988467216013139965717995", + "swapFee": "4240281183082721427082", + "priceReceived": 0.9998987621785502 + }, + { + "inputIndex": 1, + "inputQty": "10000000000000", + "outputIndex": 0, + "outputQty": "8436719465774", + "swapFee": "6086334395", + "priceReceived": 1.1845734240836394 + }, + { + "inputIndex": 1, + "inputQty": "1000000000000000", + "outputIndex": 0, + "outputQty": "843671946345970", + "swapFee": "608633439508", + "priceReceived": 1.1845734244085735 + }, + { + "inputIndex": 1, + "inputQty": "100000000000000000", + "outputIndex": 0, + "outputQty": "84367192320212282", + "swapFee": "60863343871480", + "priceReceived": 1.1845734569050674 + }, + { + "inputIndex": 1, + "inputQty": "1000000000000000000", + "outputIndex": 0, + "outputQty": "843671712803297357", + "swapFee": "608633431500388", + "priceReceived": 1.1845737523281268 + }, + { + "inputIndex": 1, + "inputQty": "10000000000000000000", + "outputIndex": 0, + "outputQty": "8436696087934987253", + "swapFee": "6086333593565286", + "priceReceived": 1.1845767065970727 + }, + { + "inputIndex": 1, + "inputQty": "100000000000000000000", + "outputIndex": 0, + "outputQty": "84364856654093899177", + "swapFee": "60863263794995589", + "priceReceived": 1.184606253122287 + }, + { + "inputIndex": 1, + "inputQty": "699200000000000050331648", + "outputIndex": 0, + "hardLimitError": true + }, + { + "inputIndex": 1, + "inputQty": "1398400000000000100663296", + "outputIndex": 0, + "hardLimitError": true + }, + { + "inputIndex": 1, + "inputQty": "2097600000000000016777216", + "outputIndex": 0, + "hardLimitError": true + }, + { + "inputIndex": 1, + "inputQty": "2796800000000000201326592", + "outputIndex": 0, + "hardLimitError": true + }, + { + "inputIndex": 1, + "inputQty": "3496000000000000117440512", + "outputIndex": 0, + "hardLimitError": true + }, + { + "inputIndex": 1, + "inputQty": "4195200000000000033554432", + "outputIndex": 0, + "hardLimitError": true + }, + { + "inputIndex": 1, + "inputQty": "4894399999999999949668352", + "outputIndex": 0, + "hardLimitError": true + }, + { + "inputIndex": 1, + "inputQty": "5593600000000000402653184", + "outputIndex": 0, + "hardLimitError": true + }, + { + "inputIndex": 1, + "inputQty": "6292799999999999781896192", + "outputIndex": 0, + "hardLimitError": true + }, + { + "inputIndex": 1, + "inputQty": "6992000000000000234881024", + "outputIndex": 0, + "hardLimitError": true + }, + { + "inputIndex": 1, + "inputQty": "10000000000000", + "outputIndex": 2, + "outputQty": "10463793292692", + "swapFee": "6086334395", + "priceReceived": 0.9550947143217013 + }, + { + "inputIndex": 1, + "inputQty": "1000000000000000", + "outputIndex": 2, + "outputQty": "1046379329243911", + "swapFee": "608633439508", + "priceReceived": 0.9550947143447764 + }, + { + "inputIndex": 1, + "inputQty": "100000000000000000", + "outputIndex": 2, + "outputQty": "104637932671762503", + "swapFee": "60863343871480", + "priceReceived": 0.955094716651431 + }, + { + "inputIndex": 1, + "inputQty": "1000000000000000000", + "outputIndex": 2, + "outputQty": "1046379303751399330", + "swapFee": "608633431500388", + "priceReceived": 0.9550947376210117 + }, + { + "inputIndex": 1, + "inputQty": "10000000000000000000", + "outputIndex": 2, + "outputQty": "10463790740902354752", + "swapFee": "6086333593565286", + "priceReceived": 0.9550949473158712 + }, + { + "inputIndex": 1, + "inputQty": "100000000000000000000", + "outputIndex": 2, + "outputQty": "104637677758789146648", + "swapFee": "60863263794995589", + "priceReceived": 0.9550970441697376 + }, + { + "inputIndex": 1, + "inputQty": "699200000000000050331648", + "outputIndex": 2, + "outputQty": "722263128479055491881378", + "swapFee": "422553559162174988487", + "priceReceived": 0.9674832050645118 + }, + { + "inputIndex": 1, + "inputQty": "1398400000000000100663296", + "outputIndex": 2, + "outputQty": "1433094677312411634245482", + "swapFee": "841275721935342452176", + "priceReceived": 0.975203345880127 + }, + { + "inputIndex": 1, + "inputQty": "2097600000000000016777216", + "outputIndex": 2, + "outputQty": "2137711494094160926435218", + "swapFee": "1257768754982574099612", + "priceReceived": 0.980647873689488 + }, + { + "inputIndex": 1, + "inputQty": "2796800000000000201326592", + "outputIndex": 2, + "outputQty": "2838008198118375113442264", + "swapFee": "1672697094452568553252", + "priceReceived": 0.9848904963554165 + }, + { + "inputIndex": 1, + "inputQty": "3496000000000000117440512", + "outputIndex": 2, + "outputQty": "3534438755467934405642287", + "swapFee": "2086377935724127709749", + "priceReceived": 0.988534209755095 + }, + { + "inputIndex": 1, + "inputQty": "4195200000000000033554432", + "outputIndex": 2, + "outputQty": "4226394339111648882141178", + "swapFee": "2498975677928744759900", + "priceReceived": 0.9920278819044936 + }, + { + "inputIndex": 1, + "inputQty": "4894399999999999949668352", + "outputIndex": 2, + "outputQty": "4911782260367201108637264", + "swapFee": "2910579067931670693036", + "priceReceived": 0.9958685384735243 + }, + { + "inputIndex": 1, + "inputQty": "5593600000000000402653184", + "outputIndex": 2, + "hardLimitError": true + }, + { + "inputIndex": 1, + "inputQty": "6292799999999999781896192", + "outputIndex": 2, + "hardLimitError": true + }, + { + "inputIndex": 1, + "inputQty": "6992000000000000234881024", + "outputIndex": 2, + "hardLimitError": true + }, + { + "inputIndex": 2, + "inputQty": "10000000000000", + "outputIndex": 0, + "outputQty": "8057935777439", + "swapFee": "5813076027", + "priceReceived": 1.2402912110512483 + }, + { + "inputIndex": 2, + "inputQty": "1000000000000000", + "outputIndex": 0, + "outputQty": "805793577497443", + "swapFee": "581307602736", + "priceReceived": 1.2402912114305544 + }, + { + "inputIndex": 2, + "inputQty": "100000000000000000", + "outputIndex": 0, + "outputQty": "80579355285952603", + "swapFee": "58130760256577", + "priceReceived": 1.2402912493538687 + }, + { + "inputIndex": 2, + "inputQty": "1000000000000000000", + "outputIndex": 0, + "outputQty": "805793328878247977", + "swapFee": "581307601011551", + "priceReceived": 1.240291594111716 + }, + { + "inputIndex": 2, + "inputQty": "10000000000000000000", + "outputIndex": 0, + "outputQty": "8057910890439978463", + "swapFee": "5813075854692939", + "priceReceived": 1.2402950417337768 + }, + { + "inputIndex": 2, + "inputQty": "100000000000000000000", + "outputIndex": 0, + "outputQty": "80576868855441209889", + "swapFee": "58130743004639067", + "priceReceived": 1.2403295223136046 + }, + { + "inputIndex": 2, + "inputQty": "699200000000000050331648", + "outputIndex": 0, + "hardLimitError": true + }, + { + "inputIndex": 2, + "inputQty": "1398400000000000100663296", + "outputIndex": 0, + "hardLimitError": true + }, + { + "inputIndex": 2, + "inputQty": "2097600000000000016777216", + "outputIndex": 0, + "hardLimitError": true + }, + { + "inputIndex": 2, + "inputQty": "2796800000000000201326592", + "outputIndex": 0, + "hardLimitError": true + }, + { + "inputIndex": 2, + "inputQty": "3496000000000000117440512", + "outputIndex": 0, + "hardLimitError": true + }, + { + "inputIndex": 2, + "inputQty": "4195200000000000033554432", + "outputIndex": 0, + "hardLimitError": true + }, + { + "inputIndex": 2, + "inputQty": "4894399999999999949668352", + "outputIndex": 0, + "hardLimitError": true + }, + { + "inputIndex": 2, + "inputQty": "5593600000000000402653184", + "outputIndex": 0, + "hardLimitError": true + }, + { + "inputIndex": 2, + "inputQty": "6292799999999999781896192", + "outputIndex": 0, + "hardLimitError": true + }, + { + "inputIndex": 2, + "inputQty": "6992000000000000234881024", + "outputIndex": 0, + "hardLimitError": true + }, + { + "inputIndex": 2, + "inputQty": "10000000000000", + "outputIndex": 1, + "outputQty": "9545299033164", + "swapFee": "5813076027", + "priceReceived": 1.0470271166203795 + }, + { + "inputIndex": 2, + "inputQty": "1000000000000000", + "outputIndex": 1, + "outputQty": "954529903294338", + "swapFee": "581307602736", + "priceReceived": 1.0470271166445417 + }, + { + "inputIndex": 2, + "inputQty": "100000000000000000", + "outputIndex": 1, + "outputQty": "95452990109381565", + "swapFee": "58130760256577", + "priceReceived": 1.0470271190584806 + }, + { + "inputIndex": 2, + "inputQty": "1000000000000000000", + "outputIndex": 1, + "outputQty": "954529881089065644", + "swapFee": "581307601011551", + "priceReceived": 1.0470271410033882 + }, + { + "inputIndex": 2, + "inputQty": "10000000000000000000", + "outputIndex": 1, + "outputQty": "9545296810407490515", + "swapFee": "5813075854692939", + "priceReceived": 1.04702736045341 + }, + { + "inputIndex": 2, + "inputQty": "100000000000000000000", + "outputIndex": 1, + "outputQty": "95452768047591845254", + "swapFee": "58130743004639067", + "priceReceived": 1.0470295550482653 + }, + { + "inputIndex": 2, + "inputQty": "699200000000000050331648", + "outputIndex": 1, + "hardLimitError": true + }, + { + "inputIndex": 2, + "inputQty": "1398400000000000100663296", + "outputIndex": 1, + "hardLimitError": true + }, + { + "inputIndex": 2, + "inputQty": "2097600000000000016777216", + "outputIndex": 1, + "hardLimitError": true + }, + { + "inputIndex": 2, + "inputQty": "2796800000000000201326592", + "outputIndex": 1, + "hardLimitError": true + }, + { + "inputIndex": 2, + "inputQty": "3496000000000000117440512", + "outputIndex": 1, + "hardLimitError": true + }, + { + "inputIndex": 2, + "inputQty": "4195200000000000033554432", + "outputIndex": 1, + "hardLimitError": true + }, + { + "inputIndex": 2, + "inputQty": "4894399999999999949668352", + "outputIndex": 1, + "hardLimitError": true + }, + { + "inputIndex": 2, + "inputQty": "5593600000000000402653184", + "outputIndex": 1, + "hardLimitError": true + }, + { + "inputIndex": 2, + "inputQty": "6292799999999999781896192", + "outputIndex": 1, + "hardLimitError": true + }, + { + "inputIndex": 2, + "inputQty": "6992000000000000234881024", + "outputIndex": 1, + "hardLimitError": true + } + ] + }, + { + "reserve0": "3996499999999999360000000", + "reserve1": "5503000000000000000000000", + "reserve2": "500500000000000000000000", + "A": 120, + "mAssetSupply": "9936488013915504712820075", + "hardMin": 50000000000000000, + "hardMax": 750000000000000000, + "swapFeeRate": 600000000000000, + "swaps": [ + { + "inputIndex": 0, + "inputQty": "10000000000000", + "outputIndex": 1, + "outputQty": "10055359156058", + "swapFee": "5935570825", + "priceReceived": 0.9939042727433488 + }, + { + "inputIndex": 0, + "inputQty": "1000000000000000", + "outputIndex": 1, + "outputQty": "1005535915601292", + "swapFee": "593557082546", + "priceReceived": 0.9939042727477589 + }, + { + "inputIndex": 0, + "inputQty": "100000000000000000", + "outputIndex": 1, + "outputQty": "100553591515543302", + "swapFee": "59355708242930", + "priceReceived": 0.9939042731885764 + }, + { + "inputIndex": 0, + "inputQty": "1000000000000000000", + "outputIndex": 1, + "outputQty": "1005535911102178221", + "swapFee": "593557081361661", + "priceReceived": 0.9939042771960065 + }, + { + "inputIndex": 0, + "inputQty": "10000000000000000000", + "outputIndex": 1, + "outputQty": "10055358705696826886", + "swapFee": "5935570706852205", + "priceReceived": 0.9939043172702577 + }, + { + "inputIndex": 0, + "inputQty": "100000000000000000000", + "outputIndex": 1, + "outputQty": "100553546524996650939", + "swapFee": "59355696392160991", + "priceReceived": 0.9939047180077686 + }, + { + "inputIndex": 0, + "inputQty": "699200000000000050331648", + "outputIndex": 1, + "outputQty": "701018217861898684511298", + "swapFee": "414460558510421777310", + "priceReceived": 0.9968150921566366 + }, + { + "inputIndex": 0, + "inputQty": "1398400000000000100663296", + "outputIndex": 1, + "outputQty": "1398171292102579103177398", + "swapFee": "827881449563621606965", + "priceReceived": 0.9995714591226933 + }, + { + "inputIndex": 0, + "inputQty": "2097600000000000016777216", + "outputIndex": 1, + "outputQty": "2091056554689476319158584", + "swapFee": "1240319563507359838670", + "priceReceived": 1.0025360986698917 + }, + { + "inputIndex": 0, + "inputQty": "2796800000000000201326592", + "outputIndex": 1, + "hardLimitError": true + }, + { + "inputIndex": 0, + "inputQty": "3496000000000000117440512", + "outputIndex": 1, + "hardLimitError": true + }, + { + "inputIndex": 0, + "inputQty": "4195200000000000033554432", + "outputIndex": 1, + "hardLimitError": true + }, + { + "inputIndex": 0, + "inputQty": "4894399999999999949668352", + "outputIndex": 1, + "hardLimitError": true + }, + { + "inputIndex": 0, + "inputQty": "5593600000000000402653184", + "outputIndex": 1, + "hardLimitError": true + }, + { + "inputIndex": 0, + "inputQty": "6292799999999999781896192", + "outputIndex": 1, + "hardLimitError": true + }, + { + "inputIndex": 0, + "inputQty": "6992000000000000234881024", + "outputIndex": 1, + "hardLimitError": true + }, + { + "inputIndex": 0, + "inputQty": "10000000000000", + "outputIndex": 2, + "outputQty": "8647597319619", + "swapFee": "5935570825", + "priceReceived": 1.155704186930772 + }, + { + "inputIndex": 0, + "inputQty": "1000000000000000", + "outputIndex": 2, + "outputQty": "864759731762277", + "swapFee": "593557082546", + "priceReceived": 1.155704187197504 + }, + { + "inputIndex": 0, + "inputQty": "100000000000000000", + "outputIndex": 2, + "outputQty": "86475971180035582", + "swapFee": "59355708242930", + "priceReceived": 1.155704213875658 + }, + { + "inputIndex": 0, + "inputQty": "1000000000000000000", + "outputIndex": 2, + "outputQty": "864759530328127639", + "swapFee": "593557081361661", + "priceReceived": 1.1557044564046837 + }, + { + "inputIndex": 0, + "inputQty": "10000000000000000000", + "outputIndex": 2, + "outputQty": "8647577155837814186", + "swapFee": "5935570706852205", + "priceReceived": 1.1557068817300284 + }, + { + "inputIndex": 0, + "inputQty": "100000000000000000000", + "outputIndex": 2, + "outputQty": "86473956593366315633", + "swapFee": "59355696392160991", + "priceReceived": 1.1557311384925644 + }, + { + "inputIndex": 0, + "inputQty": "699200000000000050331648", + "outputIndex": 2, + "hardLimitError": true + }, + { + "inputIndex": 0, + "inputQty": "1398400000000000100663296", + "outputIndex": 2, + "hardLimitError": true + }, + { + "inputIndex": 0, + "inputQty": "2097600000000000016777216", + "outputIndex": 2, + "hardLimitError": true + }, + { + "inputIndex": 0, + "inputQty": "2796800000000000201326592", + "outputIndex": 2, + "hardLimitError": true + }, + { + "inputIndex": 0, + "inputQty": "3496000000000000117440512", + "outputIndex": 2, + "hardLimitError": true + }, + { + "inputIndex": 0, + "inputQty": "4195200000000000033554432", + "outputIndex": 2, + "hardLimitError": true + }, + { + "inputIndex": 0, + "inputQty": "4894399999999999949668352", + "outputIndex": 2, + "hardLimitError": true + }, + { + "inputIndex": 0, + "inputQty": "5593600000000000402653184", + "outputIndex": 2, + "hardLimitError": true + }, + { + "inputIndex": 0, + "inputQty": "6292799999999999781896192", + "outputIndex": 2, + "hardLimitError": true + }, + { + "inputIndex": 0, + "inputQty": "6992000000000000234881024", + "outputIndex": 2, + "hardLimitError": true + }, + { + "inputIndex": 1, + "inputQty": "10000000000000", + "outputIndex": 0, + "outputQty": "9933015265778", + "swapFee": "5899351172", + "priceReceived": 1.006149732122174 + }, + { + "inputIndex": 1, + "inputQty": "1000000000000000", + "outputIndex": 0, + "outputQty": "993301526573337", + "swapFee": "589935117275", + "priceReceived": 1.0061497321266193 + }, + { + "inputIndex": 1, + "inputQty": "100000000000000000", + "outputIndex": 0, + "outputQty": "99330152613560344", + "swapFee": "58993511717134", + "priceReceived": 1.0061497325701192 + }, + { + "inputIndex": 1, + "inputQty": "1000000000000000000", + "outputIndex": 0, + "outputQty": "993301522156207633", + "swapFee": "589935116226982", + "priceReceived": 1.0061497366019387 + }, + { + "inputIndex": 1, + "inputQty": "10000000000000000000", + "outputIndex": 0, + "outputQty": "9933014823622019721", + "swapFee": "5899351067834018", + "priceReceived": 1.006149776920183 + }, + { + "inputIndex": 1, + "inputQty": "100000000000000000000", + "outputIndex": 0, + "outputQty": "99330108441738514131", + "swapFee": "58993501234750486", + "priceReceived": 1.0061501801076262 + }, + { + "inputIndex": 1, + "inputQty": "699200000000000050331648", + "outputIndex": 0, + "outputQty": "692112050839051884447054", + "swapFee": "411965810390800782245", + "priceReceived": 1.0096458129033645 + }, + { + "inputIndex": 1, + "inputQty": "1398400000000000100663296", + "outputIndex": 0, + "hardLimitError": true + }, + { + "inputIndex": 1, + "inputQty": "2097600000000000016777216", + "outputIndex": 0, + "hardLimitError": true + }, + { + "inputIndex": 1, + "inputQty": "2796800000000000201326592", + "outputIndex": 0, + "hardLimitError": true + }, + { + "inputIndex": 1, + "inputQty": "3496000000000000117440512", + "outputIndex": 0, + "hardLimitError": true + }, + { + "inputIndex": 1, + "inputQty": "4195200000000000033554432", + "outputIndex": 0, + "hardLimitError": true + }, + { + "inputIndex": 1, + "inputQty": "4894399999999999949668352", + "outputIndex": 0, + "hardLimitError": true + }, + { + "inputIndex": 1, + "inputQty": "5593600000000000402653184", + "outputIndex": 0, + "hardLimitError": true + }, + { + "inputIndex": 1, + "inputQty": "6292799999999999781896192", + "outputIndex": 0, + "hardLimitError": true + }, + { + "inputIndex": 1, + "inputQty": "6992000000000000234881024", + "outputIndex": 0, + "hardLimitError": true + }, + { + "inputIndex": 1, + "inputQty": "10000000000000", + "outputIndex": 2, + "outputQty": "8594828515917", + "swapFee": "5899351172", + "priceReceived": 1.1628039617450947 + }, + { + "inputIndex": 1, + "inputQty": "1000000000000000", + "outputIndex": 2, + "outputQty": "859482851387857", + "swapFee": "589935117275", + "priceReceived": 1.1628039620207888 + }, + { + "inputIndex": 1, + "inputQty": "100000000000000000", + "outputIndex": 2, + "outputQty": "85948283101101317", + "swapFee": "58993511717134", + "priceReceived": 1.1628039895889701 + }, + { + "inputIndex": 1, + "inputQty": "1000000000000000000", + "outputIndex": 2, + "outputQty": "859482645766757989", + "swapFee": "589935116226982", + "priceReceived": 1.1628042402091592 + }, + { + "inputIndex": 1, + "inputQty": "10000000000000000000", + "outputIndex": 2, + "outputQty": "8594807933019418572", + "swapFee": "5899351067834018", + "priceReceived": 1.1628067464471152 + }, + { + "inputIndex": 1, + "inputQty": "100000000000000000000", + "outputIndex": 2, + "outputQty": "85946226642713984426", + "swapFee": "58993501234750486", + "priceReceived": 1.1628318124334742 + }, + { + "inputIndex": 1, + "inputQty": "699200000000000050331648", + "outputIndex": 2, + "hardLimitError": true + }, + { + "inputIndex": 1, + "inputQty": "1398400000000000100663296", + "outputIndex": 2, + "hardLimitError": true + }, + { + "inputIndex": 1, + "inputQty": "2097600000000000016777216", + "outputIndex": 2, + "hardLimitError": true + }, + { + "inputIndex": 1, + "inputQty": "2796800000000000201326592", + "outputIndex": 2, + "hardLimitError": true + }, + { + "inputIndex": 1, + "inputQty": "3496000000000000117440512", + "outputIndex": 2, + "hardLimitError": true + }, + { + "inputIndex": 1, + "inputQty": "4195200000000000033554432", + "outputIndex": 2, + "hardLimitError": true + }, + { + "inputIndex": 1, + "inputQty": "4894399999999999949668352", + "outputIndex": 2, + "hardLimitError": true + }, + { + "inputIndex": 1, + "inputQty": "5593600000000000402653184", + "outputIndex": 2, + "hardLimitError": true + }, + { + "inputIndex": 1, + "inputQty": "6292799999999999781896192", + "outputIndex": 2, + "hardLimitError": true + }, + { + "inputIndex": 1, + "inputQty": "6992000000000000234881024", + "outputIndex": 2, + "hardLimitError": true + }, + { + "inputIndex": 2, + "inputQty": "10000000000000", + "outputIndex": 0, + "outputQty": "11550033183542", + "swapFee": "6859719831", + "priceReceived": 0.8652044649021905 + }, + { + "inputIndex": 2, + "inputQty": "1000000000000000", + "outputIndex": 0, + "outputQty": "1155003318045790", + "swapFee": "685971983000", + "priceReceived": 0.8652044651333047 + }, + { + "inputIndex": 2, + "inputQty": "100000000000000000", + "outputIndex": 0, + "outputQty": "115500328721628968", + "swapFee": "68597196650141", + "priceReceived": 0.8652044882417411 + }, + { + "inputIndex": 2, + "inputQty": "1000000000000000000", + "outputIndex": 0, + "outputQty": "1155003006948657823", + "swapFee": "685971816509847", + "priceReceived": 0.8652046983180812 + }, + { + "inputIndex": 2, + "inputQty": "10000000000000000000", + "outputIndex": 0, + "outputQty": "11550002043267059664", + "swapFee": "6859703166228994", + "priceReceived": 0.8652067990463392 + }, + { + "inputIndex": 2, + "inputQty": "100000000000000000000", + "outputIndex": 0, + "outputQty": "115497218354278530158", + "swapFee": "68595532062973176", + "priceReceived": 0.865227802815176 + }, + { + "inputIndex": 2, + "inputQty": "699200000000000050331648", + "outputIndex": 0, + "outputQty": "743166819088135044993130", + "swapFee": "445006902707531211857", + "priceReceived": 0.9402397619886531 + }, + { + "inputIndex": 2, + "inputQty": "1398400000000000100663296", + "outputIndex": 0, + "outputQty": "1450928056228897744391420", + "swapFee": "871263438783980145513", + "priceReceived": 0.9631964386942302 + }, + { + "inputIndex": 2, + "inputQty": "2097600000000000016777216", + "outputIndex": 0, + "outputQty": "2149425990449541609895316", + "swapFee": "1293720116988526957620", + "priceReceived": 0.9752865598524654 + }, + { + "inputIndex": 2, + "inputQty": "2796800000000000201326592", + "outputIndex": 0, + "outputQty": "2838442023752825260195309", + "swapFee": "1714701523310602758700", + "priceReceived": 0.9847251679219391 + }, + { + "inputIndex": 2, + "inputQty": "3496000000000000117440512", + "outputIndex": 0, + "outputQty": "3494131812367917204123626", + "swapFee": "2134908027576693262258", + "priceReceived": 0.9999236661895382 + }, + { + "inputIndex": 2, + "inputQty": "4195200000000000033554432", + "outputIndex": 0, + "hardLimitError": true + }, + { + "inputIndex": 2, + "inputQty": "4894399999999999949668352", + "outputIndex": 0, + "hardLimitError": true + }, + { + "inputIndex": 2, + "inputQty": "5593600000000000402653184", + "outputIndex": 0, + "hardLimitError": true + }, + { + "inputIndex": 2, + "inputQty": "6292799999999999781896192", + "outputIndex": 0, + "hardLimitError": true + }, + { + "inputIndex": 2, + "inputQty": "6992000000000000234881024", + "outputIndex": 0, + "hardLimitError": true + }, + { + "inputIndex": 2, + "inputQty": "10000000000000", + "outputIndex": 1, + "outputQty": "11620945759945", + "swapFee": "6859719831", + "priceReceived": 0.8599248707117532 + }, + { + "inputIndex": 2, + "inputQty": "1000000000000000", + "outputIndex": 1, + "outputQty": "1162094575673868", + "swapFee": "685971983000", + "priceReceived": 0.8599248709491 + }, + { + "inputIndex": 2, + "inputQty": "100000000000000000", + "outputIndex": 1, + "outputQty": "116209454362088099", + "swapFee": "68597196650141", + "priceReceived": 0.8599248946818155 + }, + { + "inputIndex": 2, + "inputQty": "1000000000000000000", + "outputIndex": 1, + "outputQty": "1162094252230663839", + "swapFee": "685971816509847", + "priceReceived": 0.8599251104334148 + }, + { + "inputIndex": 2, + "inputQty": "10000000000000000000", + "outputIndex": 1, + "outputQty": "11620913383853133332", + "swapFee": "6859703166228994", + "priceReceived": 0.8599272679132866 + }, + { + "inputIndex": 2, + "inputQty": "100000000000000000000", + "outputIndex": 1, + "outputQty": "116206220561278555141", + "swapFee": "68595532062973176", + "priceReceived": 0.8599488391005764 + }, + { + "inputIndex": 2, + "inputQty": "699200000000000050331648", + "outputIndex": 1, + "outputQty": "745890348448147376765907", + "swapFee": "445006902707531211857", + "priceReceived": 0.9368065889994129 + }, + { + "inputIndex": 2, + "inputQty": "1398400000000000100663296", + "outputIndex": 1, + "outputQty": "1455978176046775934050805", + "swapFee": "871263438783980145513", + "priceReceived": 0.9598555524752027 + }, + { + "inputIndex": 2, + "inputQty": "2097600000000000016777216", + "outputIndex": 1, + "outputQty": "2158527843482740112916076", + "swapFee": "1293720116988526957620", + "priceReceived": 0.9711740741322403 + }, + { + "inputIndex": 2, + "inputQty": "2796800000000000201326592", + "outputIndex": 1, + "outputQty": "2857415815532514252372830", + "swapFee": "1714701523310602758700", + "priceReceived": 0.9781864030019696 + }, + { + "inputIndex": 2, + "inputQty": "3496000000000000117440512", + "outputIndex": 1, + "outputQty": "3552759522564674531561542", + "swapFee": "2134908027576693262258", + "priceReceived": 0.9834229054293727 + }, + { + "inputIndex": 2, + "inputQty": "4195200000000000033554432", + "outputIndex": 1, + "outputQty": "4241362748345309178531825", + "swapFee": "2554620993917667761718", + "priceReceived": 0.9885137461165676 + }, + { + "inputIndex": 2, + "inputQty": "4894399999999999949668352", + "outputIndex": 1, + "outputQty": "4904706719603051186243047", + "swapFee": "2973973525353851305566", + "priceReceived": 0.9972922554012608 + }, + { + "inputIndex": 2, + "inputQty": "5593600000000000402653184", + "outputIndex": 1, + "hardLimitError": true + }, + { + "inputIndex": 2, + "inputQty": "6292799999999999781896192", + "outputIndex": 1, + "hardLimitError": true + }, + { + "inputIndex": 2, + "inputQty": "6992000000000000234881024", + "outputIndex": 1, + "hardLimitError": true + } + ] + }, + { + "reserve0": "3996499999999999360000000", + "reserve1": "2007000000000000960000000", + "reserve2": "3996499999999999360000000", + "A": 120, + "mAssetSupply": "9995726520619110731126433", + "hardMin": 50000000000000000, + "hardMax": 750000000000000000, + "swapFeeRate": 600000000000000, + "swaps": [ + { + "inputIndex": 0, + "inputQty": "10000000000000", + "outputIndex": 1, + "outputQty": "9915826051847", + "swapFee": "5987961342", + "priceReceived": 1.0078849695831884 + }, + { + "inputIndex": 0, + "inputQty": "1000000000000000", + "outputIndex": 1, + "outputQty": "991582605179020", + "swapFee": "598796134240", + "priceReceived": 1.0078849695889214 + }, + { + "inputIndex": 0, + "inputQty": "100000000000000000", + "outputIndex": 1, + "outputQty": "99158260460728360", + "swapFee": "59879613419763", + "priceReceived": 1.0078849701701003 + }, + { + "inputIndex": 0, + "inputQty": "1000000000000000000", + "outputIndex": 1, + "outputQty": "991582599409673433", + "swapFee": "598796133812390", + "priceReceived": 1.0078849754535517 + }, + { + "inputIndex": 0, + "inputQty": "10000000000000000000", + "outputIndex": 1, + "outputQty": "9915825474333675757", + "swapFee": "5987961299599208", + "priceReceived": 1.0078850282882756 + }, + { + "inputIndex": 0, + "inputQty": "100000000000000000000", + "outputIndex": 1, + "outputQty": "99158202764987759654", + "swapFee": "59879609143550369", + "priceReceived": 1.0078855566565874 + }, + { + "inputIndex": 0, + "inputQty": "699200000000000050331648", + "outputIndex": 1, + "outputQty": "689282551659223245636916", + "swapFee": "418477829487451578495", + "priceReceived": 1.0137809530916222 + }, + { + "inputIndex": 0, + "inputQty": "1398400000000000100663296", + "outputIndex": 1, + "outputQty": "1356366996729241375923282", + "swapFee": "836578522387612414347", + "priceReceived": 1.0303726239636564 + }, + { + "inputIndex": 0, + "inputQty": "2097600000000000016777216", + "outputIndex": 1, + "hardLimitError": true + }, + { + "inputIndex": 0, + "inputQty": "2796800000000000201326592", + "outputIndex": 1, + "hardLimitError": true + }, + { + "inputIndex": 0, + "inputQty": "3496000000000000117440512", + "outputIndex": 1, + "hardLimitError": true + }, + { + "inputIndex": 0, + "inputQty": "4195200000000000033554432", + "outputIndex": 1, + "hardLimitError": true + }, + { + "inputIndex": 0, + "inputQty": "4894399999999999949668352", + "outputIndex": 1, + "hardLimitError": true + }, + { + "inputIndex": 0, + "inputQty": "5593600000000000402653184", + "outputIndex": 1, + "hardLimitError": true + }, + { + "inputIndex": 0, + "inputQty": "6292799999999999781896192", + "outputIndex": 1, + "hardLimitError": true + }, + { + "inputIndex": 0, + "inputQty": "6992000000000000234881024", + "outputIndex": 1, + "hardLimitError": true + }, + { + "inputIndex": 0, + "inputQty": "10000000000000", + "outputIndex": 2, + "outputQty": "9994000000000", + "swapFee": "5987961342", + "priceReceived": 1.0000012045885531 + }, + { + "inputIndex": 0, + "inputQty": "1000000000000000", + "outputIndex": 2, + "outputQty": "999399999998011", + "swapFee": "598796134240", + "priceReceived": 1.0000012045905033 + }, + { + "inputIndex": 0, + "inputQty": "100000000000000000", + "outputIndex": 2, + "outputQty": "99939999980116059", + "swapFee": "59879613419763", + "priceReceived": 1.0000012047875144 + }, + { + "inputIndex": 0, + "inputQty": "1000000000000000000", + "outputIndex": 2, + "outputQty": "999399998011605799", + "swapFee": "598796133812390", + "priceReceived": 1.0000012065785313 + }, + { + "inputIndex": 0, + "inputQty": "10000000000000000000", + "outputIndex": 2, + "outputQty": "9993999801160583413", + "swapFee": "5987961299599208", + "priceReceived": 1.0000012244886993 + }, + { + "inputIndex": 0, + "inputQty": "100000000000000000000", + "outputIndex": 2, + "outputQty": "99939980116061969608", + "swapFee": "59879609143550369", + "priceReceived": 1.0000014035903781 + }, + { + "inputIndex": 0, + "inputQty": "699200000000000050331648", + "outputIndex": 2, + "outputQty": "697779736747200745522864", + "swapFee": "418477829487451578495", + "priceReceived": 1.0014356757162106 + }, + { + "inputIndex": 0, + "inputQty": "1398400000000000100663296", + "outputIndex": 2, + "outputQty": "1393157070614067945102172", + "swapFee": "836578522387612414347", + "priceReceived": 1.0031628528875085 + }, + { + "inputIndex": 0, + "inputQty": "2097600000000000016777216", + "outputIndex": 2, + "outputQty": "2084449282114052419694637", + "swapFee": "1254320506285243319162", + "priceReceived": 1.0057072136423473 + }, + { + "inputIndex": 0, + "inputQty": "2796800000000000201326592", + "outputIndex": 2, + "outputQty": "2765917160800186035881131", + "swapFee": "1671708803050131015856", + "priceReceived": 1.0105611009652629 + }, + { + "inputIndex": 0, + "inputQty": "3496000000000000117440512", + "outputIndex": 2, + "outputQty": "3409504832193172411327541", + "swapFee": "2088741347897643737830", + "priceReceived": 1.0247562125919134 + }, + { + "inputIndex": 0, + "inputQty": "4195200000000000033554432", + "outputIndex": 2, + "hardLimitError": true + }, + { + "inputIndex": 0, + "inputQty": "4894399999999999949668352", + "outputIndex": 2, + "hardLimitError": true + }, + { + "inputIndex": 0, + "inputQty": "5593600000000000402653184", + "outputIndex": 2, + "hardLimitError": true + }, + { + "inputIndex": 0, + "inputQty": "6292799999999999781896192", + "outputIndex": 2, + "hardLimitError": true + }, + { + "inputIndex": 0, + "inputQty": "6992000000000000234881024", + "outputIndex": 2, + "hardLimitError": true + }, + { + "inputIndex": 1, + "inputQty": "10000000000000", + "outputIndex": 0, + "outputQty": "10072790252445", + "swapFee": "6035168965", + "priceReceived": 0.9921744204500966 + }, + { + "inputIndex": 1, + "inputQty": "1000000000000000", + "outputIndex": 0, + "outputQty": "1007279025238644", + "swapFee": "603516896553", + "priceReceived": 0.9921744204558122 + }, + { + "inputIndex": 1, + "inputQty": "100000000000000000", + "outputIndex": 0, + "outputQty": "100727902465311571", + "swapFee": "60351689634942", + "priceReceived": 0.9921744210327623 + }, + { + "inputIndex": 1, + "inputQty": "1000000000000000000", + "outputIndex": 0, + "outputQty": "1007279019330139954", + "swapFee": "603516894491591", + "priceReceived": 0.9921744262777621 + }, + { + "inputIndex": 1, + "inputQty": "10000000000000000000", + "outputIndex": 0, + "outputQty": "10072789661005997875", + "swapFee": "6035168759132957", + "priceReceived": 0.9921744787275486 + }, + { + "inputIndex": 1, + "inputQty": "100000000000000000000", + "outputIndex": 0, + "outputQty": "100727843382691828833", + "swapFee": "60351669013876130", + "priceReceived": 0.9921750032043162 + }, + { + "inputIndex": 1, + "inputQty": "699200000000000050331648", + "outputIndex": 0, + "outputQty": "701990061873335666661480", + "swapFee": "421209678016508108806", + "priceReceived": 0.9954254743396473 + }, + { + "inputIndex": 1, + "inputQty": "1398400000000000100663296", + "outputIndex": 0, + "outputQty": "1400520690043401824861045", + "swapFee": "841445523586415237822", + "priceReceived": 0.9978849755037205 + }, + { + "inputIndex": 1, + "inputQty": "2097600000000000016777216", + "outputIndex": 0, + "outputQty": "2095431279847674350793501", + "swapFee": "1261119325233018729452", + "priceReceived": 1.0004331331863856 + }, + { + "inputIndex": 1, + "inputQty": "2796800000000000201326592", + "outputIndex": 0, + "outputQty": "2783047691616111483913211", + "swapFee": "1680399398546506822409", + "priceReceived": 1.004337657964579 + }, + { + "inputIndex": 1, + "inputQty": "3496000000000000117440512", + "outputIndex": 0, + "outputQty": "3441701398292317538340882", + "swapFee": "2099364923554529841758", + "priceReceived": 1.0151666954053677 + }, + { + "inputIndex": 1, + "inputQty": "4195200000000000033554432", + "outputIndex": 0, + "hardLimitError": true + }, + { + "inputIndex": 1, + "inputQty": "4894399999999999949668352", + "outputIndex": 0, + "hardLimitError": true + }, + { + "inputIndex": 1, + "inputQty": "5593600000000000402653184", + "outputIndex": 0, + "hardLimitError": true + }, + { + "inputIndex": 1, + "inputQty": "6292799999999999781896192", + "outputIndex": 0, + "hardLimitError": true + }, + { + "inputIndex": 1, + "inputQty": "6992000000000000234881024", + "outputIndex": 0, + "hardLimitError": true + }, + { + "inputIndex": 1, + "inputQty": "10000000000000", + "outputIndex": 2, + "outputQty": "10072790252445", + "swapFee": "6035168965", + "priceReceived": 0.9921744204500966 + }, + { + "inputIndex": 1, + "inputQty": "1000000000000000", + "outputIndex": 2, + "outputQty": "1007279025238644", + "swapFee": "603516896553", + "priceReceived": 0.9921744204558122 + }, + { + "inputIndex": 1, + "inputQty": "100000000000000000", + "outputIndex": 2, + "outputQty": "100727902465311571", + "swapFee": "60351689634942", + "priceReceived": 0.9921744210327623 + }, + { + "inputIndex": 1, + "inputQty": "1000000000000000000", + "outputIndex": 2, + "outputQty": "1007279019330139954", + "swapFee": "603516894491591", + "priceReceived": 0.9921744262777621 + }, + { + "inputIndex": 1, + "inputQty": "10000000000000000000", + "outputIndex": 2, + "outputQty": "10072789661005997875", + "swapFee": "6035168759132957", + "priceReceived": 0.9921744787275486 + }, + { + "inputIndex": 1, + "inputQty": "100000000000000000000", + "outputIndex": 2, + "outputQty": "100727843382691828833", + "swapFee": "60351669013876130", + "priceReceived": 0.9921750032043162 + }, + { + "inputIndex": 1, + "inputQty": "699200000000000050331648", + "outputIndex": 2, + "outputQty": "701990061873335666661480", + "swapFee": "421209678016508108806", + "priceReceived": 0.9954254743396473 + }, + { + "inputIndex": 1, + "inputQty": "1398400000000000100663296", + "outputIndex": 2, + "outputQty": "1400520690043401824861045", + "swapFee": "841445523586415237822", + "priceReceived": 0.9978849755037205 + }, + { + "inputIndex": 1, + "inputQty": "2097600000000000016777216", + "outputIndex": 2, + "outputQty": "2095431279847674350793501", + "swapFee": "1261119325233018729452", + "priceReceived": 1.0004331331863856 + }, + { + "inputIndex": 1, + "inputQty": "2796800000000000201326592", + "outputIndex": 2, + "outputQty": "2783047691616111483913211", + "swapFee": "1680399398546506822409", + "priceReceived": 1.004337657964579 + }, + { + "inputIndex": 1, + "inputQty": "3496000000000000117440512", + "outputIndex": 2, + "outputQty": "3441701398292317538340882", + "swapFee": "2099364923554529841758", + "priceReceived": 1.0151666954053677 + }, + { + "inputIndex": 1, + "inputQty": "4195200000000000033554432", + "outputIndex": 2, + "hardLimitError": true + }, + { + "inputIndex": 1, + "inputQty": "4894399999999999949668352", + "outputIndex": 2, + "hardLimitError": true + }, + { + "inputIndex": 1, + "inputQty": "5593600000000000402653184", + "outputIndex": 2, + "hardLimitError": true + }, + { + "inputIndex": 1, + "inputQty": "6292799999999999781896192", + "outputIndex": 2, + "hardLimitError": true + }, + { + "inputIndex": 1, + "inputQty": "6992000000000000234881024", + "outputIndex": 2, + "hardLimitError": true + }, + { + "inputIndex": 2, + "inputQty": "10000000000000", + "outputIndex": 0, + "outputQty": "9994000000000", + "swapFee": "5987961342", + "priceReceived": 1.0000012045885531 + }, + { + "inputIndex": 2, + "inputQty": "1000000000000000", + "outputIndex": 0, + "outputQty": "999399999998011", + "swapFee": "598796134240", + "priceReceived": 1.0000012045905033 + }, + { + "inputIndex": 2, + "inputQty": "100000000000000000", + "outputIndex": 0, + "outputQty": "99939999980116059", + "swapFee": "59879613419763", + "priceReceived": 1.0000012047875144 + }, + { + "inputIndex": 2, + "inputQty": "1000000000000000000", + "outputIndex": 0, + "outputQty": "999399998011605799", + "swapFee": "598796133812390", + "priceReceived": 1.0000012065785313 + }, + { + "inputIndex": 2, + "inputQty": "10000000000000000000", + "outputIndex": 0, + "outputQty": "9993999801160583413", + "swapFee": "5987961299599208", + "priceReceived": 1.0000012244886993 + }, + { + "inputIndex": 2, + "inputQty": "100000000000000000000", + "outputIndex": 0, + "outputQty": "99939980116061969608", + "swapFee": "59879609143550369", + "priceReceived": 1.0000014035903781 + }, + { + "inputIndex": 2, + "inputQty": "699200000000000050331648", + "outputIndex": 0, + "outputQty": "697779736747200745522864", + "swapFee": "418477829487451578495", + "priceReceived": 1.0014356757162106 + }, + { + "inputIndex": 2, + "inputQty": "1398400000000000100663296", + "outputIndex": 0, + "outputQty": "1393157070614067945102172", + "swapFee": "836578522387612414347", + "priceReceived": 1.0031628528875085 + }, + { + "inputIndex": 2, + "inputQty": "2097600000000000016777216", + "outputIndex": 0, + "outputQty": "2084449282114052419694637", + "swapFee": "1254320506285243319162", + "priceReceived": 1.0057072136423473 + }, + { + "inputIndex": 2, + "inputQty": "2796800000000000201326592", + "outputIndex": 0, + "outputQty": "2765917160800186035881131", + "swapFee": "1671708803050131015856", + "priceReceived": 1.0105611009652629 + }, + { + "inputIndex": 2, + "inputQty": "3496000000000000117440512", + "outputIndex": 0, + "outputQty": "3409504832193172411327541", + "swapFee": "2088741347897643737830", + "priceReceived": 1.0247562125919134 + }, + { + "inputIndex": 2, + "inputQty": "4195200000000000033554432", + "outputIndex": 0, + "hardLimitError": true + }, + { + "inputIndex": 2, + "inputQty": "4894399999999999949668352", + "outputIndex": 0, + "hardLimitError": true + }, + { + "inputIndex": 2, + "inputQty": "5593600000000000402653184", + "outputIndex": 0, + "hardLimitError": true + }, + { + "inputIndex": 2, + "inputQty": "6292799999999999781896192", + "outputIndex": 0, + "hardLimitError": true + }, + { + "inputIndex": 2, + "inputQty": "6992000000000000234881024", + "outputIndex": 0, + "hardLimitError": true + }, + { + "inputIndex": 2, + "inputQty": "10000000000000", + "outputIndex": 1, + "outputQty": "9915826051847", + "swapFee": "5987961342", + "priceReceived": 1.0078849695831884 + }, + { + "inputIndex": 2, + "inputQty": "1000000000000000", + "outputIndex": 1, + "outputQty": "991582605179020", + "swapFee": "598796134240", + "priceReceived": 1.0078849695889214 + }, + { + "inputIndex": 2, + "inputQty": "100000000000000000", + "outputIndex": 1, + "outputQty": "99158260460728360", + "swapFee": "59879613419763", + "priceReceived": 1.0078849701701003 + }, + { + "inputIndex": 2, + "inputQty": "1000000000000000000", + "outputIndex": 1, + "outputQty": "991582599409673433", + "swapFee": "598796133812390", + "priceReceived": 1.0078849754535517 + }, + { + "inputIndex": 2, + "inputQty": "10000000000000000000", + "outputIndex": 1, + "outputQty": "9915825474333675757", + "swapFee": "5987961299599208", + "priceReceived": 1.0078850282882756 + }, + { + "inputIndex": 2, + "inputQty": "100000000000000000000", + "outputIndex": 1, + "outputQty": "99158202764987759654", + "swapFee": "59879609143550369", + "priceReceived": 1.0078855566565874 + }, + { + "inputIndex": 2, + "inputQty": "699200000000000050331648", + "outputIndex": 1, + "outputQty": "689282551659223245636916", + "swapFee": "418477829487451578495", + "priceReceived": 1.0137809530916222 + }, + { + "inputIndex": 2, + "inputQty": "1398400000000000100663296", + "outputIndex": 1, + "outputQty": "1356366996729241375923282", + "swapFee": "836578522387612414347", + "priceReceived": 1.0303726239636564 + }, + { + "inputIndex": 2, + "inputQty": "2097600000000000016777216", + "outputIndex": 1, + "hardLimitError": true + }, + { + "inputIndex": 2, + "inputQty": "2796800000000000201326592", + "outputIndex": 1, + "hardLimitError": true + }, + { + "inputIndex": 2, + "inputQty": "3496000000000000117440512", + "outputIndex": 1, + "hardLimitError": true + }, + { + "inputIndex": 2, + "inputQty": "4195200000000000033554432", + "outputIndex": 1, + "hardLimitError": true + }, + { + "inputIndex": 2, + "inputQty": "4894399999999999949668352", + "outputIndex": 1, + "hardLimitError": true + }, + { + "inputIndex": 2, + "inputQty": "5593600000000000402653184", + "outputIndex": 1, + "hardLimitError": true + }, + { + "inputIndex": 2, + "inputQty": "6292799999999999781896192", + "outputIndex": 1, + "hardLimitError": true + }, + { + "inputIndex": 2, + "inputQty": "6992000000000000234881024", + "outputIndex": 1, + "hardLimitError": true + } + ] + }, + { + "reserve0": "7492500000000000000000000", + "reserve1": "2007000000000000000000000", + "reserve2": "500500000000000000000000", + "A": 120, + "mAssetSupply": "9896372713490403790662354", + "hardMin": 50000000000000000, + "hardMax": 750000000000000000, + "swapFeeRate": 600000000000000, + "swaps": [ + { + "inputIndex": 0, + "inputQty": "10000000000000", + "outputIndex": 1, + "outputQty": "9545299033164", + "swapFee": "5813076027", + "priceReceived": 1.0470271166203795 + }, + { + "inputIndex": 0, + "inputQty": "1000000000000000", + "outputIndex": 1, + "outputQty": "954529903294338", + "swapFee": "581307602736", + "priceReceived": 1.0470271166445417 + }, + { + "inputIndex": 0, + "inputQty": "100000000000000000", + "outputIndex": 1, + "outputQty": "95452990109381565", + "swapFee": "58130760256577", + "priceReceived": 1.0470271190584806 + }, + { + "inputIndex": 0, + "inputQty": "1000000000000000000", + "outputIndex": 1, + "outputQty": "954529881089065644", + "swapFee": "581307601011551", + "priceReceived": 1.0470271410033882 + }, + { + "inputIndex": 0, + "inputQty": "10000000000000000000", + "outputIndex": 1, + "outputQty": "9545296810407490515", + "swapFee": "5813075854692939", + "priceReceived": 1.04702736045341 + }, + { + "inputIndex": 0, + "inputQty": "100000000000000000000", + "outputIndex": 1, + "outputQty": "95452768047591845254", + "swapFee": "58130743004639067", + "priceReceived": 1.0470295550482653 + }, + { + "inputIndex": 0, + "inputQty": "699200000000000050331648", + "outputIndex": 1, + "hardLimitError": true + }, + { + "inputIndex": 0, + "inputQty": "1398400000000000100663296", + "outputIndex": 1, + "hardLimitError": true + }, + { + "inputIndex": 0, + "inputQty": "2097600000000000016777216", + "outputIndex": 1, + "hardLimitError": true + }, + { + "inputIndex": 0, + "inputQty": "2796800000000000201326592", + "outputIndex": 1, + "hardLimitError": true + }, + { + "inputIndex": 0, + "inputQty": "3496000000000000117440512", + "outputIndex": 1, + "hardLimitError": true + }, + { + "inputIndex": 0, + "inputQty": "4195200000000000033554432", + "outputIndex": 1, + "hardLimitError": true + }, + { + "inputIndex": 0, + "inputQty": "4894399999999999949668352", + "outputIndex": 1, + "hardLimitError": true + }, + { + "inputIndex": 0, + "inputQty": "5593600000000000402653184", + "outputIndex": 1, + "hardLimitError": true + }, + { + "inputIndex": 0, + "inputQty": "6292799999999999781896192", + "outputIndex": 1, + "hardLimitError": true + }, + { + "inputIndex": 0, + "inputQty": "6992000000000000234881024", + "outputIndex": 1, + "hardLimitError": true + }, + { + "inputIndex": 0, + "inputQty": "10000000000000", + "outputIndex": 2, + "outputQty": "8057935777439", + "swapFee": "5813076027", + "priceReceived": 1.2402912110512483 + }, + { + "inputIndex": 0, + "inputQty": "1000000000000000", + "outputIndex": 2, + "outputQty": "805793577497443", + "swapFee": "581307602736", + "priceReceived": 1.2402912114305544 + }, + { + "inputIndex": 0, + "inputQty": "100000000000000000", + "outputIndex": 2, + "outputQty": "80579355285952603", + "swapFee": "58130760256577", + "priceReceived": 1.2402912493538687 + }, + { + "inputIndex": 0, + "inputQty": "1000000000000000000", + "outputIndex": 2, + "outputQty": "805793328878247977", + "swapFee": "581307601011551", + "priceReceived": 1.240291594111716 + }, + { + "inputIndex": 0, + "inputQty": "10000000000000000000", + "outputIndex": 2, + "outputQty": "8057910890439978463", + "swapFee": "5813075854692939", + "priceReceived": 1.2402950417337768 + }, + { + "inputIndex": 0, + "inputQty": "100000000000000000000", + "outputIndex": 2, + "outputQty": "80576868855441209889", + "swapFee": "58130743004639067", + "priceReceived": 1.2403295223136046 + }, + { + "inputIndex": 0, + "inputQty": "699200000000000050331648", + "outputIndex": 2, + "hardLimitError": true + }, + { + "inputIndex": 0, + "inputQty": "1398400000000000100663296", + "outputIndex": 2, + "hardLimitError": true + }, + { + "inputIndex": 0, + "inputQty": "2097600000000000016777216", + "outputIndex": 2, + "hardLimitError": true + }, + { + "inputIndex": 0, + "inputQty": "2796800000000000201326592", + "outputIndex": 2, + "hardLimitError": true + }, + { + "inputIndex": 0, + "inputQty": "3496000000000000117440512", + "outputIndex": 2, + "hardLimitError": true + }, + { + "inputIndex": 0, + "inputQty": "4195200000000000033554432", + "outputIndex": 2, + "hardLimitError": true + }, + { + "inputIndex": 0, + "inputQty": "4894399999999999949668352", + "outputIndex": 2, + "hardLimitError": true + }, + { + "inputIndex": 0, + "inputQty": "5593600000000000402653184", + "outputIndex": 2, + "hardLimitError": true + }, + { + "inputIndex": 0, + "inputQty": "6292799999999999781896192", + "outputIndex": 2, + "hardLimitError": true + }, + { + "inputIndex": 0, + "inputQty": "6992000000000000234881024", + "outputIndex": 2, + "hardLimitError": true + }, + { + "inputIndex": 1, + "inputQty": "10000000000000", + "outputIndex": 0, + "outputQty": "10463793292692", + "swapFee": "6086334395", + "priceReceived": 0.9550947143217013 + }, + { + "inputIndex": 1, + "inputQty": "1000000000000000", + "outputIndex": 0, + "outputQty": "1046379329243911", + "swapFee": "608633439508", + "priceReceived": 0.9550947143447764 + }, + { + "inputIndex": 1, + "inputQty": "100000000000000000", + "outputIndex": 0, + "outputQty": "104637932671762503", + "swapFee": "60863343871480", + "priceReceived": 0.955094716651431 + }, + { + "inputIndex": 1, + "inputQty": "1000000000000000000", + "outputIndex": 0, + "outputQty": "1046379303751399330", + "swapFee": "608633431500388", + "priceReceived": 0.9550947376210117 + }, + { + "inputIndex": 1, + "inputQty": "10000000000000000000", + "outputIndex": 0, + "outputQty": "10463790740902354752", + "swapFee": "6086333593565286", + "priceReceived": 0.9550949473158712 + }, + { + "inputIndex": 1, + "inputQty": "100000000000000000000", + "outputIndex": 0, + "outputQty": "104637677758789146648", + "swapFee": "60863263794995589", + "priceReceived": 0.9550970441697376 + }, + { + "inputIndex": 1, + "inputQty": "699200000000000050331648", + "outputIndex": 0, + "outputQty": "722263128479055491881378", + "swapFee": "422553559162174988487", + "priceReceived": 0.9674832050645118 + }, + { + "inputIndex": 1, + "inputQty": "1398400000000000100663296", + "outputIndex": 0, + "outputQty": "1433094677312411634245482", + "swapFee": "841275721935342452176", + "priceReceived": 0.975203345880127 + }, + { + "inputIndex": 1, + "inputQty": "2097600000000000016777216", + "outputIndex": 0, + "outputQty": "2137711494094160926435218", + "swapFee": "1257768754982574099612", + "priceReceived": 0.980647873689488 + }, + { + "inputIndex": 1, + "inputQty": "2796800000000000201326592", + "outputIndex": 0, + "outputQty": "2838008198118375113442264", + "swapFee": "1672697094452568553252", + "priceReceived": 0.9848904963554165 + }, + { + "inputIndex": 1, + "inputQty": "3496000000000000117440512", + "outputIndex": 0, + "outputQty": "3534438755467934405642287", + "swapFee": "2086377935724127709749", + "priceReceived": 0.988534209755095 + }, + { + "inputIndex": 1, + "inputQty": "4195200000000000033554432", + "outputIndex": 0, + "outputQty": "4226394339111648882141178", + "swapFee": "2498975677928744759900", + "priceReceived": 0.9920278819044936 + }, + { + "inputIndex": 1, + "inputQty": "4894399999999999949668352", + "outputIndex": 0, + "outputQty": "4911782260367201108637264", + "swapFee": "2910579067931670693036", + "priceReceived": 0.9958685384735243 + }, + { + "inputIndex": 1, + "inputQty": "5593600000000000402653184", + "outputIndex": 0, + "hardLimitError": true + }, + { + "inputIndex": 1, + "inputQty": "6292799999999999781896192", + "outputIndex": 0, + "hardLimitError": true + }, + { + "inputIndex": 1, + "inputQty": "6992000000000000234881024", + "outputIndex": 0, + "hardLimitError": true + }, + { + "inputIndex": 1, + "inputQty": "10000000000000", + "outputIndex": 2, + "outputQty": "8436719465774", + "swapFee": "6086334395", + "priceReceived": 1.1845734240836394 + }, + { + "inputIndex": 1, + "inputQty": "1000000000000000", + "outputIndex": 2, + "outputQty": "843671946345970", + "swapFee": "608633439508", + "priceReceived": 1.1845734244085735 + }, + { + "inputIndex": 1, + "inputQty": "100000000000000000", + "outputIndex": 2, + "outputQty": "84367192320212282", + "swapFee": "60863343871480", + "priceReceived": 1.1845734569050674 + }, + { + "inputIndex": 1, + "inputQty": "1000000000000000000", + "outputIndex": 2, + "outputQty": "843671712803297357", + "swapFee": "608633431500388", + "priceReceived": 1.1845737523281268 + }, + { + "inputIndex": 1, + "inputQty": "10000000000000000000", + "outputIndex": 2, + "outputQty": "8436696087934987253", + "swapFee": "6086333593565286", + "priceReceived": 1.1845767065970727 + }, + { + "inputIndex": 1, + "inputQty": "100000000000000000000", + "outputIndex": 2, + "outputQty": "84364856654093899177", + "swapFee": "60863263794995589", + "priceReceived": 1.184606253122287 + }, + { + "inputIndex": 1, + "inputQty": "699200000000000050331648", + "outputIndex": 2, + "hardLimitError": true + }, + { + "inputIndex": 1, + "inputQty": "1398400000000000100663296", + "outputIndex": 2, + "hardLimitError": true + }, + { + "inputIndex": 1, + "inputQty": "2097600000000000016777216", + "outputIndex": 2, + "hardLimitError": true + }, + { + "inputIndex": 1, + "inputQty": "2796800000000000201326592", + "outputIndex": 2, + "hardLimitError": true + }, + { + "inputIndex": 1, + "inputQty": "3496000000000000117440512", + "outputIndex": 2, + "hardLimitError": true + }, + { + "inputIndex": 1, + "inputQty": "4195200000000000033554432", + "outputIndex": 2, + "hardLimitError": true + }, + { + "inputIndex": 1, + "inputQty": "4894399999999999949668352", + "outputIndex": 2, + "hardLimitError": true + }, + { + "inputIndex": 1, + "inputQty": "5593600000000000402653184", + "outputIndex": 2, + "hardLimitError": true + }, + { + "inputIndex": 1, + "inputQty": "6292799999999999781896192", + "outputIndex": 2, + "hardLimitError": true + }, + { + "inputIndex": 1, + "inputQty": "6992000000000000234881024", + "outputIndex": 2, + "hardLimitError": true + }, + { + "inputIndex": 2, + "inputQty": "10000000000000", + "outputIndex": 0, + "outputQty": "12395238527337", + "swapFee": "7209772257", + "priceReceived": 0.8061797443997922 + }, + { + "inputIndex": 2, + "inputQty": "1000000000000000", + "outputIndex": 0, + "outputQty": "1239523852263400", + "swapFee": "720977225474", + "priceReceived": 0.8061797447058552 + }, + { + "inputIndex": 2, + "inputQty": "100000000000000000", + "outputIndex": 0, + "outputQty": "123952380523418314", + "swapFee": "72097720241086", + "priceReceived": 0.8061797753120162 + }, + { + "inputIndex": 2, + "inputQty": "1000000000000000000", + "outputIndex": 0, + "outputQty": "1239523377696697198", + "swapFee": "720976992737435", + "priceReceived": 0.8061800535494049 + }, + { + "inputIndex": 2, + "inputQty": "10000000000000000000", + "outputIndex": 0, + "outputQty": "12395191024051384203", + "swapFee": "7209748960428383", + "priceReceived": 0.8061828358796373 + }, + { + "inputIndex": 2, + "inputQty": "100000000000000000000", + "outputIndex": 0, + "outputQty": "123947635781796985191", + "swapFee": "72095393306750833", + "priceReceived": 0.8062106548172556 + }, + { + "inputIndex": 2, + "inputQty": "699200000000000050331648", + "outputIndex": 0, + "outputQty": "768896006715057077927865", + "swapFee": "455349056078842881937", + "priceReceived": 0.908763532183185 + }, + { + "inputIndex": 2, + "inputQty": "1398400000000000100663296", + "outputIndex": 0, + "outputQty": "1485514801822270051395981", + "swapFee": "884040318185604670645", + "priceReceived": 0.9407620563372994 + }, + { + "inputIndex": 2, + "inputQty": "2097600000000000016777216", + "outputIndex": 0, + "outputQty": "2191692694525269933121433", + "swapFee": "1307270388189317742828", + "priceReceived": 0.9564720158296994 + }, + { + "inputIndex": 2, + "inputQty": "2796800000000000201326592", + "outputIndex": 0, + "outputQty": "2893745098578223596232972", + "swapFee": "1728372076376296111498", + "priceReceived": 0.9659011186911105 + }, + { + "inputIndex": 2, + "inputQty": "3496000000000000117440512", + "outputIndex": 0, + "outputQty": "3593394051728979159386178", + "swapFee": "2148353632174868084140", + "priceReceived": 0.9722984999896522 + }, + { + "inputIndex": 2, + "inputQty": "4195200000000000033554432", + "outputIndex": 0, + "outputQty": "4291015906040761605294836", + "swapFee": "2567621069932273372757", + "priceReceived": 0.9770722063807332 + }, + { + "inputIndex": 2, + "inputQty": "4894399999999999949668352", + "outputIndex": 0, + "outputQty": "4986132009816772962673844", + "swapFee": "2986366809676326880201", + "priceReceived": 0.98100363639792 + }, + { + "inputIndex": 2, + "inputQty": "5593600000000000402653184", + "outputIndex": 0, + "outputQty": "5676824010962740152173763", + "swapFee": "3404691779986865867419", + "priceReceived": 0.9847399351159319 + }, + { + "inputIndex": 2, + "inputQty": "6292799999999999781896192", + "outputIndex": 0, + "outputQty": "6356304183245645467880735", + "swapFee": "3822652371743742700155", + "priceReceived": 0.989407864432471 + }, + { + "inputIndex": 2, + "inputQty": "6992000000000000234881024", + "outputIndex": 0, + "outputQty": "6988467216013139965717995", + "swapFee": "4240281183082721427082", + "priceReceived": 0.9998987621785502 + }, + { + "inputIndex": 2, + "inputQty": "10000000000000", + "outputIndex": 1, + "outputQty": "11838729070533", + "swapFee": "7209772257", + "priceReceived": 0.8440762659748161 + }, + { + "inputIndex": 2, + "inputQty": "1000000000000000", + "outputIndex": 1, + "outputQty": "1183872906668422", + "swapFee": "720977225474", + "priceReceived": 0.8440762662494169 + }, + { + "inputIndex": 2, + "inputQty": "100000000000000000", + "outputIndex": 1, + "outputQty": "118387286817586995", + "swapFee": "72097720241086", + "priceReceived": 0.8440762937132719 + }, + { + "inputIndex": 2, + "inputQty": "1000000000000000000", + "outputIndex": 1, + "outputQty": "1183872518244243855", + "swapFee": "720976992737435", + "priceReceived": 0.8440765433842954 + }, + { + "inputIndex": 2, + "inputQty": "10000000000000000000", + "outputIndex": 1, + "outputQty": "11838690189932096568", + "swapFee": "7209748960428383", + "priceReceived": 0.8440790400561101 + }, + { + "inputIndex": 2, + "inputQty": "100000000000000000000", + "outputIndex": 1, + "outputQty": "118383403300427069140", + "swapFee": "72095393306750833", + "priceReceived": 0.8441040029327553 + }, + { + "inputIndex": 2, + "inputQty": "699200000000000050331648", + "outputIndex": 1, + "hardLimitError": true + }, + { + "inputIndex": 2, + "inputQty": "1398400000000000100663296", + "outputIndex": 1, + "hardLimitError": true + }, + { + "inputIndex": 2, + "inputQty": "2097600000000000016777216", + "outputIndex": 1, + "hardLimitError": true + }, + { + "inputIndex": 2, + "inputQty": "2796800000000000201326592", + "outputIndex": 1, + "hardLimitError": true + }, + { + "inputIndex": 2, + "inputQty": "3496000000000000117440512", + "outputIndex": 1, + "hardLimitError": true + }, + { + "inputIndex": 2, + "inputQty": "4195200000000000033554432", + "outputIndex": 1, + "hardLimitError": true + }, + { + "inputIndex": 2, + "inputQty": "4894399999999999949668352", + "outputIndex": 1, + "hardLimitError": true + }, + { + "inputIndex": 2, + "inputQty": "5593600000000000402653184", + "outputIndex": 1, + "hardLimitError": true + }, + { + "inputIndex": 2, + "inputQty": "6292799999999999781896192", + "outputIndex": 1, + "hardLimitError": true + }, + { + "inputIndex": 2, + "inputQty": "6992000000000000234881024", + "outputIndex": 1, + "hardLimitError": true + } + ] + }, + { + "reserve0": "500500000000000000000000", + "reserve1": "3996499999999999360000000", + "reserve2": "5503000000000000000000000", + "A": 120, + "mAssetSupply": "9936488013915504712820075", + "hardMin": 50000000000000000, + "hardMax": 750000000000000000, + "swapFeeRate": 600000000000000, + "swaps": [ + { + "inputIndex": 0, + "inputQty": "10000000000000", + "outputIndex": 1, + "outputQty": "11550033183542", + "swapFee": "6859719831", + "priceReceived": 0.8652044649021905 + }, + { + "inputIndex": 0, + "inputQty": "1000000000000000", + "outputIndex": 1, + "outputQty": "1155003318045790", + "swapFee": "685971983000", + "priceReceived": 0.8652044651333047 + }, + { + "inputIndex": 0, + "inputQty": "100000000000000000", + "outputIndex": 1, + "outputQty": "115500328721628968", + "swapFee": "68597196650141", + "priceReceived": 0.8652044882417411 + }, + { + "inputIndex": 0, + "inputQty": "1000000000000000000", + "outputIndex": 1, + "outputQty": "1155003006948657823", + "swapFee": "685971816509847", + "priceReceived": 0.8652046983180812 + }, + { + "inputIndex": 0, + "inputQty": "10000000000000000000", + "outputIndex": 1, + "outputQty": "11550002043267059664", + "swapFee": "6859703166228994", + "priceReceived": 0.8652067990463392 + }, + { + "inputIndex": 0, + "inputQty": "100000000000000000000", + "outputIndex": 1, + "outputQty": "115497218354278530158", + "swapFee": "68595532062973176", + "priceReceived": 0.865227802815176 + }, + { + "inputIndex": 0, + "inputQty": "699200000000000050331648", + "outputIndex": 1, + "outputQty": "743166819088135044993130", + "swapFee": "445006902707531211857", + "priceReceived": 0.9402397619886531 + }, + { + "inputIndex": 0, + "inputQty": "1398400000000000100663296", + "outputIndex": 1, + "outputQty": "1450928056228897744391420", + "swapFee": "871263438783980145513", + "priceReceived": 0.9631964386942302 + }, + { + "inputIndex": 0, + "inputQty": "2097600000000000016777216", + "outputIndex": 1, + "outputQty": "2149425990449541609895316", + "swapFee": "1293720116988526957620", + "priceReceived": 0.9752865598524654 + }, + { + "inputIndex": 0, + "inputQty": "2796800000000000201326592", + "outputIndex": 1, + "outputQty": "2838442023752825260195309", + "swapFee": "1714701523310602758700", + "priceReceived": 0.9847251679219391 + }, + { + "inputIndex": 0, + "inputQty": "3496000000000000117440512", + "outputIndex": 1, + "outputQty": "3494131812367917204123626", + "swapFee": "2134908027576693262258", + "priceReceived": 0.9999236661895382 + }, + { + "inputIndex": 0, + "inputQty": "4195200000000000033554432", + "outputIndex": 1, + "hardLimitError": true + }, + { + "inputIndex": 0, + "inputQty": "4894399999999999949668352", + "outputIndex": 1, + "hardLimitError": true + }, + { + "inputIndex": 0, + "inputQty": "5593600000000000402653184", + "outputIndex": 1, + "hardLimitError": true + }, + { + "inputIndex": 0, + "inputQty": "6292799999999999781896192", + "outputIndex": 1, + "hardLimitError": true + }, + { + "inputIndex": 0, + "inputQty": "6992000000000000234881024", + "outputIndex": 1, + "hardLimitError": true + }, + { + "inputIndex": 0, + "inputQty": "10000000000000", + "outputIndex": 2, + "outputQty": "11620945759945", + "swapFee": "6859719831", + "priceReceived": 0.8599248707117532 + }, + { + "inputIndex": 0, + "inputQty": "1000000000000000", + "outputIndex": 2, + "outputQty": "1162094575673868", + "swapFee": "685971983000", + "priceReceived": 0.8599248709491 + }, + { + "inputIndex": 0, + "inputQty": "100000000000000000", + "outputIndex": 2, + "outputQty": "116209454362088099", + "swapFee": "68597196650141", + "priceReceived": 0.8599248946818155 + }, + { + "inputIndex": 0, + "inputQty": "1000000000000000000", + "outputIndex": 2, + "outputQty": "1162094252230663839", + "swapFee": "685971816509847", + "priceReceived": 0.8599251104334148 + }, + { + "inputIndex": 0, + "inputQty": "10000000000000000000", + "outputIndex": 2, + "outputQty": "11620913383853133332", + "swapFee": "6859703166228994", + "priceReceived": 0.8599272679132866 + }, + { + "inputIndex": 0, + "inputQty": "100000000000000000000", + "outputIndex": 2, + "outputQty": "116206220561278555141", + "swapFee": "68595532062973176", + "priceReceived": 0.8599488391005764 + }, + { + "inputIndex": 0, + "inputQty": "699200000000000050331648", + "outputIndex": 2, + "outputQty": "745890348448147376765907", + "swapFee": "445006902707531211857", + "priceReceived": 0.9368065889994129 + }, + { + "inputIndex": 0, + "inputQty": "1398400000000000100663296", + "outputIndex": 2, + "outputQty": "1455978176046775934050805", + "swapFee": "871263438783980145513", + "priceReceived": 0.9598555524752027 + }, + { + "inputIndex": 0, + "inputQty": "2097600000000000016777216", + "outputIndex": 2, + "outputQty": "2158527843482740112916076", + "swapFee": "1293720116988526957620", + "priceReceived": 0.9711740741322403 + }, + { + "inputIndex": 0, + "inputQty": "2796800000000000201326592", + "outputIndex": 2, + "outputQty": "2857415815532514252372830", + "swapFee": "1714701523310602758700", + "priceReceived": 0.9781864030019696 + }, + { + "inputIndex": 0, + "inputQty": "3496000000000000117440512", + "outputIndex": 2, + "outputQty": "3552759522564674531561542", + "swapFee": "2134908027576693262258", + "priceReceived": 0.9834229054293727 + }, + { + "inputIndex": 0, + "inputQty": "4195200000000000033554432", + "outputIndex": 2, + "outputQty": "4241362748345309178531825", + "swapFee": "2554620993917667761718", + "priceReceived": 0.9885137461165676 + }, + { + "inputIndex": 0, + "inputQty": "4894399999999999949668352", + "outputIndex": 2, + "outputQty": "4904706719603051186243047", + "swapFee": "2973973525353851305566", + "priceReceived": 0.9972922554012608 + }, + { + "inputIndex": 0, + "inputQty": "5593600000000000402653184", + "outputIndex": 2, + "hardLimitError": true + }, + { + "inputIndex": 0, + "inputQty": "6292799999999999781896192", + "outputIndex": 2, + "hardLimitError": true + }, + { + "inputIndex": 0, + "inputQty": "6992000000000000234881024", + "outputIndex": 2, + "hardLimitError": true + }, + { + "inputIndex": 1, + "inputQty": "10000000000000", + "outputIndex": 0, + "outputQty": "8647597319619", + "swapFee": "5935570825", + "priceReceived": 1.155704186930772 + }, + { + "inputIndex": 1, + "inputQty": "1000000000000000", + "outputIndex": 0, + "outputQty": "864759731762277", + "swapFee": "593557082546", + "priceReceived": 1.155704187197504 + }, + { + "inputIndex": 1, + "inputQty": "100000000000000000", + "outputIndex": 0, + "outputQty": "86475971180035582", + "swapFee": "59355708242930", + "priceReceived": 1.155704213875658 + }, + { + "inputIndex": 1, + "inputQty": "1000000000000000000", + "outputIndex": 0, + "outputQty": "864759530328127639", + "swapFee": "593557081361661", + "priceReceived": 1.1557044564046837 + }, + { + "inputIndex": 1, + "inputQty": "10000000000000000000", + "outputIndex": 0, + "outputQty": "8647577155837814186", + "swapFee": "5935570706852205", + "priceReceived": 1.1557068817300284 + }, + { + "inputIndex": 1, + "inputQty": "100000000000000000000", + "outputIndex": 0, + "outputQty": "86473956593366315633", + "swapFee": "59355696392160991", + "priceReceived": 1.1557311384925644 + }, + { + "inputIndex": 1, + "inputQty": "699200000000000050331648", + "outputIndex": 0, + "hardLimitError": true + }, + { + "inputIndex": 1, + "inputQty": "1398400000000000100663296", + "outputIndex": 0, + "hardLimitError": true + }, + { + "inputIndex": 1, + "inputQty": "2097600000000000016777216", + "outputIndex": 0, + "hardLimitError": true + }, + { + "inputIndex": 1, + "inputQty": "2796800000000000201326592", + "outputIndex": 0, + "hardLimitError": true + }, + { + "inputIndex": 1, + "inputQty": "3496000000000000117440512", + "outputIndex": 0, + "hardLimitError": true + }, + { + "inputIndex": 1, + "inputQty": "4195200000000000033554432", + "outputIndex": 0, + "hardLimitError": true + }, + { + "inputIndex": 1, + "inputQty": "4894399999999999949668352", + "outputIndex": 0, + "hardLimitError": true + }, + { + "inputIndex": 1, + "inputQty": "5593600000000000402653184", + "outputIndex": 0, + "hardLimitError": true + }, + { + "inputIndex": 1, + "inputQty": "6292799999999999781896192", + "outputIndex": 0, + "hardLimitError": true + }, + { + "inputIndex": 1, + "inputQty": "6992000000000000234881024", + "outputIndex": 0, + "hardLimitError": true + }, + { + "inputIndex": 1, + "inputQty": "10000000000000", + "outputIndex": 2, + "outputQty": "10055359156058", + "swapFee": "5935570825", + "priceReceived": 0.9939042727433488 + }, + { + "inputIndex": 1, + "inputQty": "1000000000000000", + "outputIndex": 2, + "outputQty": "1005535915601292", + "swapFee": "593557082546", + "priceReceived": 0.9939042727477589 + }, + { + "inputIndex": 1, + "inputQty": "100000000000000000", + "outputIndex": 2, + "outputQty": "100553591515543302", + "swapFee": "59355708242930", + "priceReceived": 0.9939042731885764 + }, + { + "inputIndex": 1, + "inputQty": "1000000000000000000", + "outputIndex": 2, + "outputQty": "1005535911102178221", + "swapFee": "593557081361661", + "priceReceived": 0.9939042771960065 + }, + { + "inputIndex": 1, + "inputQty": "10000000000000000000", + "outputIndex": 2, + "outputQty": "10055358705696826886", + "swapFee": "5935570706852205", + "priceReceived": 0.9939043172702577 + }, + { + "inputIndex": 1, + "inputQty": "100000000000000000000", + "outputIndex": 2, + "outputQty": "100553546524996650939", + "swapFee": "59355696392160991", + "priceReceived": 0.9939047180077686 + }, + { + "inputIndex": 1, + "inputQty": "699200000000000050331648", + "outputIndex": 2, + "outputQty": "701018217861898684511298", + "swapFee": "414460558510421777310", + "priceReceived": 0.9968150921566366 + }, + { + "inputIndex": 1, + "inputQty": "1398400000000000100663296", + "outputIndex": 2, + "outputQty": "1398171292102579103177398", + "swapFee": "827881449563621606965", + "priceReceived": 0.9995714591226933 + }, + { + "inputIndex": 1, + "inputQty": "2097600000000000016777216", + "outputIndex": 2, + "outputQty": "2091056554689476319158584", + "swapFee": "1240319563507359838670", + "priceReceived": 1.0025360986698917 + }, + { + "inputIndex": 1, + "inputQty": "2796800000000000201326592", + "outputIndex": 2, + "hardLimitError": true + }, + { + "inputIndex": 1, + "inputQty": "3496000000000000117440512", + "outputIndex": 2, + "hardLimitError": true + }, + { + "inputIndex": 1, + "inputQty": "4195200000000000033554432", + "outputIndex": 2, + "hardLimitError": true + }, + { + "inputIndex": 1, + "inputQty": "4894399999999999949668352", + "outputIndex": 2, + "hardLimitError": true + }, + { + "inputIndex": 1, + "inputQty": "5593600000000000402653184", + "outputIndex": 2, + "hardLimitError": true + }, + { + "inputIndex": 1, + "inputQty": "6292799999999999781896192", + "outputIndex": 2, + "hardLimitError": true + }, + { + "inputIndex": 1, + "inputQty": "6992000000000000234881024", + "outputIndex": 2, + "hardLimitError": true + }, + { + "inputIndex": 2, + "inputQty": "10000000000000", + "outputIndex": 0, + "outputQty": "8594828515917", + "swapFee": "5899351172", + "priceReceived": 1.1628039617450947 + }, + { + "inputIndex": 2, + "inputQty": "1000000000000000", + "outputIndex": 0, + "outputQty": "859482851387857", + "swapFee": "589935117275", + "priceReceived": 1.1628039620207888 + }, + { + "inputIndex": 2, + "inputQty": "100000000000000000", + "outputIndex": 0, + "outputQty": "85948283101101317", + "swapFee": "58993511717134", + "priceReceived": 1.1628039895889701 + }, + { + "inputIndex": 2, + "inputQty": "1000000000000000000", + "outputIndex": 0, + "outputQty": "859482645766757989", + "swapFee": "589935116226982", + "priceReceived": 1.1628042402091592 + }, + { + "inputIndex": 2, + "inputQty": "10000000000000000000", + "outputIndex": 0, + "outputQty": "8594807933019418572", + "swapFee": "5899351067834018", + "priceReceived": 1.1628067464471152 + }, + { + "inputIndex": 2, + "inputQty": "100000000000000000000", + "outputIndex": 0, + "outputQty": "85946226642713984426", + "swapFee": "58993501234750486", + "priceReceived": 1.1628318124334742 + }, + { + "inputIndex": 2, + "inputQty": "699200000000000050331648", + "outputIndex": 0, + "hardLimitError": true + }, + { + "inputIndex": 2, + "inputQty": "1398400000000000100663296", + "outputIndex": 0, + "hardLimitError": true + }, + { + "inputIndex": 2, + "inputQty": "2097600000000000016777216", + "outputIndex": 0, + "hardLimitError": true + }, + { + "inputIndex": 2, + "inputQty": "2796800000000000201326592", + "outputIndex": 0, + "hardLimitError": true + }, + { + "inputIndex": 2, + "inputQty": "3496000000000000117440512", + "outputIndex": 0, + "hardLimitError": true + }, + { + "inputIndex": 2, + "inputQty": "4195200000000000033554432", + "outputIndex": 0, + "hardLimitError": true + }, + { + "inputIndex": 2, + "inputQty": "4894399999999999949668352", + "outputIndex": 0, + "hardLimitError": true + }, + { + "inputIndex": 2, + "inputQty": "5593600000000000402653184", + "outputIndex": 0, + "hardLimitError": true + }, + { + "inputIndex": 2, + "inputQty": "6292799999999999781896192", + "outputIndex": 0, + "hardLimitError": true + }, + { + "inputIndex": 2, + "inputQty": "6992000000000000234881024", + "outputIndex": 0, + "hardLimitError": true + }, + { + "inputIndex": 2, + "inputQty": "10000000000000", + "outputIndex": 1, + "outputQty": "9933015265778", + "swapFee": "5899351172", + "priceReceived": 1.006149732122174 + }, + { + "inputIndex": 2, + "inputQty": "1000000000000000", + "outputIndex": 1, + "outputQty": "993301526573337", + "swapFee": "589935117275", + "priceReceived": 1.0061497321266193 + }, + { + "inputIndex": 2, + "inputQty": "100000000000000000", + "outputIndex": 1, + "outputQty": "99330152613560344", + "swapFee": "58993511717134", + "priceReceived": 1.0061497325701192 + }, + { + "inputIndex": 2, + "inputQty": "1000000000000000000", + "outputIndex": 1, + "outputQty": "993301522156207633", + "swapFee": "589935116226982", + "priceReceived": 1.0061497366019387 + }, + { + "inputIndex": 2, + "inputQty": "10000000000000000000", + "outputIndex": 1, + "outputQty": "9933014823622019721", + "swapFee": "5899351067834018", + "priceReceived": 1.006149776920183 + }, + { + "inputIndex": 2, + "inputQty": "100000000000000000000", + "outputIndex": 1, + "outputQty": "99330108441738514131", + "swapFee": "58993501234750486", + "priceReceived": 1.0061501801076262 + }, + { + "inputIndex": 2, + "inputQty": "699200000000000050331648", + "outputIndex": 1, + "outputQty": "692112050839051884447054", + "swapFee": "411965810390800782245", + "priceReceived": 1.0096458129033645 + }, + { + "inputIndex": 2, + "inputQty": "1398400000000000100663296", + "outputIndex": 1, + "hardLimitError": true + }, + { + "inputIndex": 2, + "inputQty": "2097600000000000016777216", + "outputIndex": 1, + "hardLimitError": true + }, + { + "inputIndex": 2, + "inputQty": "2796800000000000201326592", + "outputIndex": 1, + "hardLimitError": true + }, + { + "inputIndex": 2, + "inputQty": "3496000000000000117440512", + "outputIndex": 1, + "hardLimitError": true + }, + { + "inputIndex": 2, + "inputQty": "4195200000000000033554432", + "outputIndex": 1, + "hardLimitError": true + }, + { + "inputIndex": 2, + "inputQty": "4894399999999999949668352", + "outputIndex": 1, + "hardLimitError": true + }, + { + "inputIndex": 2, + "inputQty": "5593600000000000402653184", + "outputIndex": 1, + "hardLimitError": true + }, + { + "inputIndex": 2, + "inputQty": "6292799999999999781896192", + "outputIndex": 1, + "hardLimitError": true + }, + { + "inputIndex": 2, + "inputQty": "6992000000000000234881024", + "outputIndex": 1, + "hardLimitError": true + } + ] + }, + { + "reserve0": "500500000000000000000000", + "reserve1": "7492500000000000000000000", + "reserve2": "2007000000000000000000000", + "A": 120, + "mAssetSupply": "9896372713490403790662354", + "hardMin": 50000000000000000, + "hardMax": 750000000000000000, + "swapFeeRate": 600000000000000, + "swaps": [ + { + "inputIndex": 0, + "inputQty": "10000000000000", + "outputIndex": 1, + "outputQty": "12395238527337", + "swapFee": "7209772257", + "priceReceived": 0.8061797443997922 + }, + { + "inputIndex": 0, + "inputQty": "1000000000000000", + "outputIndex": 1, + "outputQty": "1239523852263400", + "swapFee": "720977225474", + "priceReceived": 0.8061797447058552 + }, + { + "inputIndex": 0, + "inputQty": "100000000000000000", + "outputIndex": 1, + "outputQty": "123952380523418314", + "swapFee": "72097720241086", + "priceReceived": 0.8061797753120162 + }, + { + "inputIndex": 0, + "inputQty": "1000000000000000000", + "outputIndex": 1, + "outputQty": "1239523377696697198", + "swapFee": "720976992737435", + "priceReceived": 0.8061800535494049 + }, + { + "inputIndex": 0, + "inputQty": "10000000000000000000", + "outputIndex": 1, + "outputQty": "12395191024051384203", + "swapFee": "7209748960428383", + "priceReceived": 0.8061828358796373 + }, + { + "inputIndex": 0, + "inputQty": "100000000000000000000", + "outputIndex": 1, + "outputQty": "123947635781796985191", + "swapFee": "72095393306750833", + "priceReceived": 0.8062106548172556 + }, + { + "inputIndex": 0, + "inputQty": "699200000000000050331648", + "outputIndex": 1, + "outputQty": "768896006715057077927865", + "swapFee": "455349056078842881937", + "priceReceived": 0.908763532183185 + }, + { + "inputIndex": 0, + "inputQty": "1398400000000000100663296", + "outputIndex": 1, + "outputQty": "1485514801822270051395981", + "swapFee": "884040318185604670645", + "priceReceived": 0.9407620563372994 + }, + { + "inputIndex": 0, + "inputQty": "2097600000000000016777216", + "outputIndex": 1, + "outputQty": "2191692694525269933121433", + "swapFee": "1307270388189317742828", + "priceReceived": 0.9564720158296994 + }, + { + "inputIndex": 0, + "inputQty": "2796800000000000201326592", + "outputIndex": 1, + "outputQty": "2893745098578223596232972", + "swapFee": "1728372076376296111498", + "priceReceived": 0.9659011186911105 + }, + { + "inputIndex": 0, + "inputQty": "3496000000000000117440512", + "outputIndex": 1, + "outputQty": "3593394051728979159386178", + "swapFee": "2148353632174868084140", + "priceReceived": 0.9722984999896522 + }, + { + "inputIndex": 0, + "inputQty": "4195200000000000033554432", + "outputIndex": 1, + "outputQty": "4291015906040761605294836", + "swapFee": "2567621069932273372757", + "priceReceived": 0.9770722063807332 + }, + { + "inputIndex": 0, + "inputQty": "4894399999999999949668352", + "outputIndex": 1, + "outputQty": "4986132009816772962673844", + "swapFee": "2986366809676326880201", + "priceReceived": 0.98100363639792 + }, + { + "inputIndex": 0, + "inputQty": "5593600000000000402653184", + "outputIndex": 1, + "outputQty": "5676824010962740152173763", + "swapFee": "3404691779986865867419", + "priceReceived": 0.9847399351159319 + }, + { + "inputIndex": 0, + "inputQty": "6292799999999999781896192", + "outputIndex": 1, + "outputQty": "6356304183245645467880735", + "swapFee": "3822652371743742700155", + "priceReceived": 0.989407864432471 + }, + { + "inputIndex": 0, + "inputQty": "6992000000000000234881024", + "outputIndex": 1, + "outputQty": "6988467216013139965717995", + "swapFee": "4240281183082721427082", + "priceReceived": 0.9998987621785502 + }, + { + "inputIndex": 0, + "inputQty": "10000000000000", + "outputIndex": 2, + "outputQty": "11838729070533", + "swapFee": "7209772257", + "priceReceived": 0.8440762659748161 + }, + { + "inputIndex": 0, + "inputQty": "1000000000000000", + "outputIndex": 2, + "outputQty": "1183872906668422", + "swapFee": "720977225474", + "priceReceived": 0.8440762662494169 + }, + { + "inputIndex": 0, + "inputQty": "100000000000000000", + "outputIndex": 2, + "outputQty": "118387286817586995", + "swapFee": "72097720241086", + "priceReceived": 0.8440762937132719 + }, + { + "inputIndex": 0, + "inputQty": "1000000000000000000", + "outputIndex": 2, + "outputQty": "1183872518244243855", + "swapFee": "720976992737435", + "priceReceived": 0.8440765433842954 + }, + { + "inputIndex": 0, + "inputQty": "10000000000000000000", + "outputIndex": 2, + "outputQty": "11838690189932096567", + "swapFee": "7209748960428383", + "priceReceived": 0.8440790400561101 + }, + { + "inputIndex": 0, + "inputQty": "100000000000000000000", + "outputIndex": 2, + "outputQty": "118383403300427069140", + "swapFee": "72095393306750833", + "priceReceived": 0.8441040029327553 + }, + { + "inputIndex": 0, + "inputQty": "699200000000000050331648", + "outputIndex": 2, + "hardLimitError": true + }, + { + "inputIndex": 0, + "inputQty": "1398400000000000100663296", + "outputIndex": 2, + "hardLimitError": true + }, + { + "inputIndex": 0, + "inputQty": "2097600000000000016777216", + "outputIndex": 2, + "hardLimitError": true + }, + { + "inputIndex": 0, + "inputQty": "2796800000000000201326592", + "outputIndex": 2, + "hardLimitError": true + }, + { + "inputIndex": 0, + "inputQty": "3496000000000000117440512", + "outputIndex": 2, + "hardLimitError": true + }, + { + "inputIndex": 0, + "inputQty": "4195200000000000033554432", + "outputIndex": 2, + "hardLimitError": true + }, + { + "inputIndex": 0, + "inputQty": "4894399999999999949668352", + "outputIndex": 2, + "hardLimitError": true + }, + { + "inputIndex": 0, + "inputQty": "5593600000000000402653184", + "outputIndex": 2, + "hardLimitError": true + }, + { + "inputIndex": 0, + "inputQty": "6292799999999999781896192", + "outputIndex": 2, + "hardLimitError": true + }, + { + "inputIndex": 0, + "inputQty": "6992000000000000234881024", + "outputIndex": 2, + "hardLimitError": true + }, + { + "inputIndex": 1, + "inputQty": "10000000000000", + "outputIndex": 0, + "outputQty": "8057935777439", + "swapFee": "5813076027", + "priceReceived": 1.2402912110512483 + }, + { + "inputIndex": 1, + "inputQty": "1000000000000000", + "outputIndex": 0, + "outputQty": "805793577497443", + "swapFee": "581307602736", + "priceReceived": 1.2402912114305544 + }, + { + "inputIndex": 1, + "inputQty": "100000000000000000", + "outputIndex": 0, + "outputQty": "80579355285952603", + "swapFee": "58130760256577", + "priceReceived": 1.2402912493538687 + }, + { + "inputIndex": 1, + "inputQty": "1000000000000000000", + "outputIndex": 0, + "outputQty": "805793328878247977", + "swapFee": "581307601011551", + "priceReceived": 1.240291594111716 + }, + { + "inputIndex": 1, + "inputQty": "10000000000000000000", + "outputIndex": 0, + "outputQty": "8057910890439978463", + "swapFee": "5813075854692939", + "priceReceived": 1.2402950417337768 + }, + { + "inputIndex": 1, + "inputQty": "100000000000000000000", + "outputIndex": 0, + "outputQty": "80576868855441209889", + "swapFee": "58130743004639067", + "priceReceived": 1.2403295223136046 + }, + { + "inputIndex": 1, + "inputQty": "699200000000000050331648", + "outputIndex": 0, + "hardLimitError": true + }, + { + "inputIndex": 1, + "inputQty": "1398400000000000100663296", + "outputIndex": 0, + "hardLimitError": true + }, + { + "inputIndex": 1, + "inputQty": "2097600000000000016777216", + "outputIndex": 0, + "hardLimitError": true + }, + { + "inputIndex": 1, + "inputQty": "2796800000000000201326592", + "outputIndex": 0, + "hardLimitError": true + }, + { + "inputIndex": 1, + "inputQty": "3496000000000000117440512", + "outputIndex": 0, + "hardLimitError": true + }, + { + "inputIndex": 1, + "inputQty": "4195200000000000033554432", + "outputIndex": 0, + "hardLimitError": true + }, + { + "inputIndex": 1, + "inputQty": "4894399999999999949668352", + "outputIndex": 0, + "hardLimitError": true + }, + { + "inputIndex": 1, + "inputQty": "5593600000000000402653184", + "outputIndex": 0, + "hardLimitError": true + }, + { + "inputIndex": 1, + "inputQty": "6292799999999999781896192", + "outputIndex": 0, + "hardLimitError": true + }, + { + "inputIndex": 1, + "inputQty": "6992000000000000234881024", + "outputIndex": 0, + "hardLimitError": true + }, + { + "inputIndex": 1, + "inputQty": "10000000000000", + "outputIndex": 2, + "outputQty": "9545299033164", + "swapFee": "5813076027", + "priceReceived": 1.0470271166203795 + }, + { + "inputIndex": 1, + "inputQty": "1000000000000000", + "outputIndex": 2, + "outputQty": "954529903294338", + "swapFee": "581307602736", + "priceReceived": 1.0470271166445417 + }, + { + "inputIndex": 1, + "inputQty": "100000000000000000", + "outputIndex": 2, + "outputQty": "95452990109381565", + "swapFee": "58130760256577", + "priceReceived": 1.0470271190584806 + }, + { + "inputIndex": 1, + "inputQty": "1000000000000000000", + "outputIndex": 2, + "outputQty": "954529881089065644", + "swapFee": "581307601011551", + "priceReceived": 1.0470271410033882 + }, + { + "inputIndex": 1, + "inputQty": "10000000000000000000", + "outputIndex": 2, + "outputQty": "9545296810407490515", + "swapFee": "5813075854692939", + "priceReceived": 1.04702736045341 + }, + { + "inputIndex": 1, + "inputQty": "100000000000000000000", + "outputIndex": 2, + "outputQty": "95452768047591845254", + "swapFee": "58130743004639067", + "priceReceived": 1.0470295550482653 + }, + { + "inputIndex": 1, + "inputQty": "699200000000000050331648", + "outputIndex": 2, + "hardLimitError": true + }, + { + "inputIndex": 1, + "inputQty": "1398400000000000100663296", + "outputIndex": 2, + "hardLimitError": true + }, + { + "inputIndex": 1, + "inputQty": "2097600000000000016777216", + "outputIndex": 2, + "hardLimitError": true + }, + { + "inputIndex": 1, + "inputQty": "2796800000000000201326592", + "outputIndex": 2, + "hardLimitError": true + }, + { + "inputIndex": 1, + "inputQty": "3496000000000000117440512", + "outputIndex": 2, + "hardLimitError": true + }, + { + "inputIndex": 1, + "inputQty": "4195200000000000033554432", + "outputIndex": 2, + "hardLimitError": true + }, + { + "inputIndex": 1, + "inputQty": "4894399999999999949668352", + "outputIndex": 2, + "hardLimitError": true + }, + { + "inputIndex": 1, + "inputQty": "5593600000000000402653184", + "outputIndex": 2, + "hardLimitError": true + }, + { + "inputIndex": 1, + "inputQty": "6292799999999999781896192", + "outputIndex": 2, + "hardLimitError": true + }, + { + "inputIndex": 1, + "inputQty": "6992000000000000234881024", + "outputIndex": 2, + "hardLimitError": true + }, + { + "inputIndex": 2, + "inputQty": "10000000000000", + "outputIndex": 0, + "outputQty": "8436719465774", + "swapFee": "6086334395", + "priceReceived": 1.1845734240836394 + }, + { + "inputIndex": 2, + "inputQty": "1000000000000000", + "outputIndex": 0, + "outputQty": "843671946345970", + "swapFee": "608633439508", + "priceReceived": 1.1845734244085735 + }, + { + "inputIndex": 2, + "inputQty": "100000000000000000", + "outputIndex": 0, + "outputQty": "84367192320212282", + "swapFee": "60863343871480", + "priceReceived": 1.1845734569050674 + }, + { + "inputIndex": 2, + "inputQty": "1000000000000000000", + "outputIndex": 0, + "outputQty": "843671712803297357", + "swapFee": "608633431500388", + "priceReceived": 1.1845737523281268 + }, + { + "inputIndex": 2, + "inputQty": "10000000000000000000", + "outputIndex": 0, + "outputQty": "8436696087934987253", + "swapFee": "6086333593565286", + "priceReceived": 1.1845767065970727 + }, + { + "inputIndex": 2, + "inputQty": "100000000000000000000", + "outputIndex": 0, + "outputQty": "84364856654093899177", + "swapFee": "60863263794995589", + "priceReceived": 1.184606253122287 + }, + { + "inputIndex": 2, + "inputQty": "699200000000000050331648", + "outputIndex": 0, + "hardLimitError": true + }, + { + "inputIndex": 2, + "inputQty": "1398400000000000100663296", + "outputIndex": 0, + "hardLimitError": true + }, + { + "inputIndex": 2, + "inputQty": "2097600000000000016777216", + "outputIndex": 0, + "hardLimitError": true + }, + { + "inputIndex": 2, + "inputQty": "2796800000000000201326592", + "outputIndex": 0, + "hardLimitError": true + }, + { + "inputIndex": 2, + "inputQty": "3496000000000000117440512", + "outputIndex": 0, + "hardLimitError": true + }, + { + "inputIndex": 2, + "inputQty": "4195200000000000033554432", + "outputIndex": 0, + "hardLimitError": true + }, + { + "inputIndex": 2, + "inputQty": "4894399999999999949668352", + "outputIndex": 0, + "hardLimitError": true + }, + { + "inputIndex": 2, + "inputQty": "5593600000000000402653184", + "outputIndex": 0, + "hardLimitError": true + }, + { + "inputIndex": 2, + "inputQty": "6292799999999999781896192", + "outputIndex": 0, + "hardLimitError": true + }, + { + "inputIndex": 2, + "inputQty": "6992000000000000234881024", + "outputIndex": 0, + "hardLimitError": true + }, + { + "inputIndex": 2, + "inputQty": "10000000000000", + "outputIndex": 1, + "outputQty": "10463793292692", + "swapFee": "6086334395", + "priceReceived": 0.9550947143217013 + }, + { + "inputIndex": 2, + "inputQty": "1000000000000000", + "outputIndex": 1, + "outputQty": "1046379329243911", + "swapFee": "608633439508", + "priceReceived": 0.9550947143447764 + }, + { + "inputIndex": 2, + "inputQty": "100000000000000000", + "outputIndex": 1, + "outputQty": "104637932671762503", + "swapFee": "60863343871480", + "priceReceived": 0.955094716651431 + }, + { + "inputIndex": 2, + "inputQty": "1000000000000000000", + "outputIndex": 1, + "outputQty": "1046379303751399330", + "swapFee": "608633431500388", + "priceReceived": 0.9550947376210117 + }, + { + "inputIndex": 2, + "inputQty": "10000000000000000000", + "outputIndex": 1, + "outputQty": "10463790740902354752", + "swapFee": "6086333593565286", + "priceReceived": 0.9550949473158712 + }, + { + "inputIndex": 2, + "inputQty": "100000000000000000000", + "outputIndex": 1, + "outputQty": "104637677758789146648", + "swapFee": "60863263794995589", + "priceReceived": 0.9550970441697376 + }, + { + "inputIndex": 2, + "inputQty": "699200000000000050331648", + "outputIndex": 1, + "outputQty": "722263128479055491881378", + "swapFee": "422553559162174988487", + "priceReceived": 0.9674832050645118 + }, + { + "inputIndex": 2, + "inputQty": "1398400000000000100663296", + "outputIndex": 1, + "outputQty": "1433094677312411634245482", + "swapFee": "841275721935342452176", + "priceReceived": 0.975203345880127 + }, + { + "inputIndex": 2, + "inputQty": "2097600000000000016777216", + "outputIndex": 1, + "outputQty": "2137711494094160926435218", + "swapFee": "1257768754982574099612", + "priceReceived": 0.980647873689488 + }, + { + "inputIndex": 2, + "inputQty": "2796800000000000201326592", + "outputIndex": 1, + "outputQty": "2838008198118375113442264", + "swapFee": "1672697094452568553252", + "priceReceived": 0.9848904963554165 + }, + { + "inputIndex": 2, + "inputQty": "3496000000000000117440512", + "outputIndex": 1, + "outputQty": "3534438755467934405642287", + "swapFee": "2086377935724127709749", + "priceReceived": 0.988534209755095 + }, + { + "inputIndex": 2, + "inputQty": "4195200000000000033554432", + "outputIndex": 1, + "outputQty": "4226394339111648882141178", + "swapFee": "2498975677928744759900", + "priceReceived": 0.9920278819044936 + }, + { + "inputIndex": 2, + "inputQty": "4894399999999999949668352", + "outputIndex": 1, + "outputQty": "4911782260367201108637264", + "swapFee": "2910579067931670693036", + "priceReceived": 0.9958685384735243 + }, + { + "inputIndex": 2, + "inputQty": "5593600000000000402653184", + "outputIndex": 1, + "hardLimitError": true + }, + { + "inputIndex": 2, + "inputQty": "6292799999999999781896192", + "outputIndex": 1, + "hardLimitError": true + }, + { + "inputIndex": 2, + "inputQty": "6992000000000000234881024", + "outputIndex": 1, + "hardLimitError": true + } + ] + }, + { + "reserve0": "3996499999999999360000000", + "reserve1": "500500000000000000000000", + "reserve2": "5503000000000000000000000", + "A": 120, + "mAssetSupply": "9936488013915504712820075", + "hardMin": 50000000000000000, + "hardMax": 750000000000000000, + "swapFeeRate": 600000000000000, + "swaps": [ + { + "inputIndex": 0, + "inputQty": "10000000000000", + "outputIndex": 1, + "outputQty": "8647597319619", + "swapFee": "5935570825", + "priceReceived": 1.155704186930772 + }, + { + "inputIndex": 0, + "inputQty": "1000000000000000", + "outputIndex": 1, + "outputQty": "864759731762277", + "swapFee": "593557082546", + "priceReceived": 1.155704187197504 + }, + { + "inputIndex": 0, + "inputQty": "100000000000000000", + "outputIndex": 1, + "outputQty": "86475971180035582", + "swapFee": "59355708242930", + "priceReceived": 1.155704213875658 + }, + { + "inputIndex": 0, + "inputQty": "1000000000000000000", + "outputIndex": 1, + "outputQty": "864759530328127639", + "swapFee": "593557081361661", + "priceReceived": 1.1557044564046837 + }, + { + "inputIndex": 0, + "inputQty": "10000000000000000000", + "outputIndex": 1, + "outputQty": "8647577155837814186", + "swapFee": "5935570706852205", + "priceReceived": 1.1557068817300284 + }, + { + "inputIndex": 0, + "inputQty": "100000000000000000000", + "outputIndex": 1, + "outputQty": "86473956593366315633", + "swapFee": "59355696392160991", + "priceReceived": 1.1557311384925644 + }, + { + "inputIndex": 0, + "inputQty": "699200000000000050331648", + "outputIndex": 1, + "hardLimitError": true + }, + { + "inputIndex": 0, + "inputQty": "1398400000000000100663296", + "outputIndex": 1, + "hardLimitError": true + }, + { + "inputIndex": 0, + "inputQty": "2097600000000000016777216", + "outputIndex": 1, + "hardLimitError": true + }, + { + "inputIndex": 0, + "inputQty": "2796800000000000201326592", + "outputIndex": 1, + "hardLimitError": true + }, + { + "inputIndex": 0, + "inputQty": "3496000000000000117440512", + "outputIndex": 1, + "hardLimitError": true + }, + { + "inputIndex": 0, + "inputQty": "4195200000000000033554432", + "outputIndex": 1, + "hardLimitError": true + }, + { + "inputIndex": 0, + "inputQty": "4894399999999999949668352", + "outputIndex": 1, + "hardLimitError": true + }, + { + "inputIndex": 0, + "inputQty": "5593600000000000402653184", + "outputIndex": 1, + "hardLimitError": true + }, + { + "inputIndex": 0, + "inputQty": "6292799999999999781896192", + "outputIndex": 1, + "hardLimitError": true + }, + { + "inputIndex": 0, + "inputQty": "6992000000000000234881024", + "outputIndex": 1, + "hardLimitError": true + }, + { + "inputIndex": 0, + "inputQty": "10000000000000", + "outputIndex": 2, + "outputQty": "10055359156058", + "swapFee": "5935570825", + "priceReceived": 0.9939042727433488 + }, + { + "inputIndex": 0, + "inputQty": "1000000000000000", + "outputIndex": 2, + "outputQty": "1005535915601292", + "swapFee": "593557082546", + "priceReceived": 0.9939042727477589 + }, + { + "inputIndex": 0, + "inputQty": "100000000000000000", + "outputIndex": 2, + "outputQty": "100553591515543302", + "swapFee": "59355708242930", + "priceReceived": 0.9939042731885764 + }, + { + "inputIndex": 0, + "inputQty": "1000000000000000000", + "outputIndex": 2, + "outputQty": "1005535911102178221", + "swapFee": "593557081361661", + "priceReceived": 0.9939042771960065 + }, + { + "inputIndex": 0, + "inputQty": "10000000000000000000", + "outputIndex": 2, + "outputQty": "10055358705696826886", + "swapFee": "5935570706852205", + "priceReceived": 0.9939043172702577 + }, + { + "inputIndex": 0, + "inputQty": "100000000000000000000", + "outputIndex": 2, + "outputQty": "100553546524996650939", + "swapFee": "59355696392160991", + "priceReceived": 0.9939047180077686 + }, + { + "inputIndex": 0, + "inputQty": "699200000000000050331648", + "outputIndex": 2, + "outputQty": "701018217861898684511298", + "swapFee": "414460558510421777310", + "priceReceived": 0.9968150921566366 + }, + { + "inputIndex": 0, + "inputQty": "1398400000000000100663296", + "outputIndex": 2, + "outputQty": "1398171292102579103177398", + "swapFee": "827881449563621606965", + "priceReceived": 0.9995714591226933 + }, + { + "inputIndex": 0, + "inputQty": "2097600000000000016777216", + "outputIndex": 2, + "outputQty": "2091056554689476319158584", + "swapFee": "1240319563507359838670", + "priceReceived": 1.0025360986698917 + }, + { + "inputIndex": 0, + "inputQty": "2796800000000000201326592", + "outputIndex": 2, + "hardLimitError": true + }, + { + "inputIndex": 0, + "inputQty": "3496000000000000117440512", + "outputIndex": 2, + "hardLimitError": true + }, + { + "inputIndex": 0, + "inputQty": "4195200000000000033554432", + "outputIndex": 2, + "hardLimitError": true + }, + { + "inputIndex": 0, + "inputQty": "4894399999999999949668352", + "outputIndex": 2, + "hardLimitError": true + }, + { + "inputIndex": 0, + "inputQty": "5593600000000000402653184", + "outputIndex": 2, + "hardLimitError": true + }, + { + "inputIndex": 0, + "inputQty": "6292799999999999781896192", + "outputIndex": 2, + "hardLimitError": true + }, + { + "inputIndex": 0, + "inputQty": "6992000000000000234881024", + "outputIndex": 2, + "hardLimitError": true + }, + { + "inputIndex": 1, + "inputQty": "10000000000000", + "outputIndex": 0, + "outputQty": "11550033183542", + "swapFee": "6859719831", + "priceReceived": 0.8652044649021905 + }, + { + "inputIndex": 1, + "inputQty": "1000000000000000", + "outputIndex": 0, + "outputQty": "1155003318045790", + "swapFee": "685971983000", + "priceReceived": 0.8652044651333047 + }, + { + "inputIndex": 1, + "inputQty": "100000000000000000", + "outputIndex": 0, + "outputQty": "115500328721628968", + "swapFee": "68597196650141", + "priceReceived": 0.8652044882417411 + }, + { + "inputIndex": 1, + "inputQty": "1000000000000000000", + "outputIndex": 0, + "outputQty": "1155003006948657823", + "swapFee": "685971816509847", + "priceReceived": 0.8652046983180812 + }, + { + "inputIndex": 1, + "inputQty": "10000000000000000000", + "outputIndex": 0, + "outputQty": "11550002043267059664", + "swapFee": "6859703166228994", + "priceReceived": 0.8652067990463392 + }, + { + "inputIndex": 1, + "inputQty": "100000000000000000000", + "outputIndex": 0, + "outputQty": "115497218354278530158", + "swapFee": "68595532062973176", + "priceReceived": 0.865227802815176 + }, + { + "inputIndex": 1, + "inputQty": "699200000000000050331648", + "outputIndex": 0, + "outputQty": "743166819088135044993130", + "swapFee": "445006902707531211857", + "priceReceived": 0.9402397619886531 + }, + { + "inputIndex": 1, + "inputQty": "1398400000000000100663296", + "outputIndex": 0, + "outputQty": "1450928056228897744391420", + "swapFee": "871263438783980145513", + "priceReceived": 0.9631964386942302 + }, + { + "inputIndex": 1, + "inputQty": "2097600000000000016777216", + "outputIndex": 0, + "outputQty": "2149425990449541609895316", + "swapFee": "1293720116988526957620", + "priceReceived": 0.9752865598524654 + }, + { + "inputIndex": 1, + "inputQty": "2796800000000000201326592", + "outputIndex": 0, + "outputQty": "2838442023752825260195309", + "swapFee": "1714701523310602758700", + "priceReceived": 0.9847251679219391 + }, + { + "inputIndex": 1, + "inputQty": "3496000000000000117440512", + "outputIndex": 0, + "outputQty": "3494131812367917204123626", + "swapFee": "2134908027576693262258", + "priceReceived": 0.9999236661895382 + }, + { + "inputIndex": 1, + "inputQty": "4195200000000000033554432", + "outputIndex": 0, + "hardLimitError": true + }, + { + "inputIndex": 1, + "inputQty": "4894399999999999949668352", + "outputIndex": 0, + "hardLimitError": true + }, + { + "inputIndex": 1, + "inputQty": "5593600000000000402653184", + "outputIndex": 0, + "hardLimitError": true + }, + { + "inputIndex": 1, + "inputQty": "6292799999999999781896192", + "outputIndex": 0, + "hardLimitError": true + }, + { + "inputIndex": 1, + "inputQty": "6992000000000000234881024", + "outputIndex": 0, + "hardLimitError": true + }, + { + "inputIndex": 1, + "inputQty": "10000000000000", + "outputIndex": 2, + "outputQty": "11620945759945", + "swapFee": "6859719831", + "priceReceived": 0.8599248707117532 + }, + { + "inputIndex": 1, + "inputQty": "1000000000000000", + "outputIndex": 2, + "outputQty": "1162094575673868", + "swapFee": "685971983000", + "priceReceived": 0.8599248709491 + }, + { + "inputIndex": 1, + "inputQty": "100000000000000000", + "outputIndex": 2, + "outputQty": "116209454362088099", + "swapFee": "68597196650141", + "priceReceived": 0.8599248946818155 + }, + { + "inputIndex": 1, + "inputQty": "1000000000000000000", + "outputIndex": 2, + "outputQty": "1162094252230663839", + "swapFee": "685971816509847", + "priceReceived": 0.8599251104334148 + }, + { + "inputIndex": 1, + "inputQty": "10000000000000000000", + "outputIndex": 2, + "outputQty": "11620913383853133332", + "swapFee": "6859703166228994", + "priceReceived": 0.8599272679132866 + }, + { + "inputIndex": 1, + "inputQty": "100000000000000000000", + "outputIndex": 2, + "outputQty": "116206220561278555141", + "swapFee": "68595532062973176", + "priceReceived": 0.8599488391005764 + }, + { + "inputIndex": 1, + "inputQty": "699200000000000050331648", + "outputIndex": 2, + "outputQty": "745890348448147376765907", + "swapFee": "445006902707531211857", + "priceReceived": 0.9368065889994129 + }, + { + "inputIndex": 1, + "inputQty": "1398400000000000100663296", + "outputIndex": 2, + "outputQty": "1455978176046775934050805", + "swapFee": "871263438783980145513", + "priceReceived": 0.9598555524752027 + }, + { + "inputIndex": 1, + "inputQty": "2097600000000000016777216", + "outputIndex": 2, + "outputQty": "2158527843482740112916076", + "swapFee": "1293720116988526957620", + "priceReceived": 0.9711740741322403 + }, + { + "inputIndex": 1, + "inputQty": "2796800000000000201326592", + "outputIndex": 2, + "outputQty": "2857415815532514252372830", + "swapFee": "1714701523310602758700", + "priceReceived": 0.9781864030019696 + }, + { + "inputIndex": 1, + "inputQty": "3496000000000000117440512", + "outputIndex": 2, + "outputQty": "3552759522564674531561542", + "swapFee": "2134908027576693262258", + "priceReceived": 0.9834229054293727 + }, + { + "inputIndex": 1, + "inputQty": "4195200000000000033554432", + "outputIndex": 2, + "outputQty": "4241362748345309178531825", + "swapFee": "2554620993917667761718", + "priceReceived": 0.9885137461165676 + }, + { + "inputIndex": 1, + "inputQty": "4894399999999999949668352", + "outputIndex": 2, + "outputQty": "4904706719603051186243047", + "swapFee": "2973973525353851305566", + "priceReceived": 0.9972922554012608 + }, + { + "inputIndex": 1, + "inputQty": "5593600000000000402653184", + "outputIndex": 2, + "hardLimitError": true + }, + { + "inputIndex": 1, + "inputQty": "6292799999999999781896192", + "outputIndex": 2, + "hardLimitError": true + }, + { + "inputIndex": 1, + "inputQty": "6992000000000000234881024", + "outputIndex": 2, + "hardLimitError": true + }, + { + "inputIndex": 2, + "inputQty": "10000000000000", + "outputIndex": 0, + "outputQty": "9933015265778", + "swapFee": "5899351172", + "priceReceived": 1.006149732122174 + }, + { + "inputIndex": 2, + "inputQty": "1000000000000000", + "outputIndex": 0, + "outputQty": "993301526573337", + "swapFee": "589935117275", + "priceReceived": 1.0061497321266193 + }, + { + "inputIndex": 2, + "inputQty": "100000000000000000", + "outputIndex": 0, + "outputQty": "99330152613560344", + "swapFee": "58993511717134", + "priceReceived": 1.0061497325701192 + }, + { + "inputIndex": 2, + "inputQty": "1000000000000000000", + "outputIndex": 0, + "outputQty": "993301522156207633", + "swapFee": "589935116226982", + "priceReceived": 1.0061497366019387 + }, + { + "inputIndex": 2, + "inputQty": "10000000000000000000", + "outputIndex": 0, + "outputQty": "9933014823622019721", + "swapFee": "5899351067834018", + "priceReceived": 1.006149776920183 + }, + { + "inputIndex": 2, + "inputQty": "100000000000000000000", + "outputIndex": 0, + "outputQty": "99330108441738514131", + "swapFee": "58993501234750486", + "priceReceived": 1.0061501801076262 + }, + { + "inputIndex": 2, + "inputQty": "699200000000000050331648", + "outputIndex": 0, + "outputQty": "692112050839051884447054", + "swapFee": "411965810390800782245", + "priceReceived": 1.0096458129033645 + }, + { + "inputIndex": 2, + "inputQty": "1398400000000000100663296", + "outputIndex": 0, + "hardLimitError": true + }, + { + "inputIndex": 2, + "inputQty": "2097600000000000016777216", + "outputIndex": 0, + "hardLimitError": true + }, + { + "inputIndex": 2, + "inputQty": "2796800000000000201326592", + "outputIndex": 0, + "hardLimitError": true + }, + { + "inputIndex": 2, + "inputQty": "3496000000000000117440512", + "outputIndex": 0, + "hardLimitError": true + }, + { + "inputIndex": 2, + "inputQty": "4195200000000000033554432", + "outputIndex": 0, + "hardLimitError": true + }, + { + "inputIndex": 2, + "inputQty": "4894399999999999949668352", + "outputIndex": 0, + "hardLimitError": true + }, + { + "inputIndex": 2, + "inputQty": "5593600000000000402653184", + "outputIndex": 0, + "hardLimitError": true + }, + { + "inputIndex": 2, + "inputQty": "6292799999999999781896192", + "outputIndex": 0, + "hardLimitError": true + }, + { + "inputIndex": 2, + "inputQty": "6992000000000000234881024", + "outputIndex": 0, + "hardLimitError": true + }, + { + "inputIndex": 2, + "inputQty": "10000000000000", + "outputIndex": 1, + "outputQty": "8594828515917", + "swapFee": "5899351172", + "priceReceived": 1.1628039617450947 + }, + { + "inputIndex": 2, + "inputQty": "1000000000000000", + "outputIndex": 1, + "outputQty": "859482851387857", + "swapFee": "589935117275", + "priceReceived": 1.1628039620207888 + }, + { + "inputIndex": 2, + "inputQty": "100000000000000000", + "outputIndex": 1, + "outputQty": "85948283101101317", + "swapFee": "58993511717134", + "priceReceived": 1.1628039895889701 + }, + { + "inputIndex": 2, + "inputQty": "1000000000000000000", + "outputIndex": 1, + "outputQty": "859482645766757989", + "swapFee": "589935116226982", + "priceReceived": 1.1628042402091592 + }, + { + "inputIndex": 2, + "inputQty": "10000000000000000000", + "outputIndex": 1, + "outputQty": "8594807933019418572", + "swapFee": "5899351067834018", + "priceReceived": 1.1628067464471152 + }, + { + "inputIndex": 2, + "inputQty": "100000000000000000000", + "outputIndex": 1, + "outputQty": "85946226642713984426", + "swapFee": "58993501234750486", + "priceReceived": 1.1628318124334742 + }, + { + "inputIndex": 2, + "inputQty": "699200000000000050331648", + "outputIndex": 1, + "hardLimitError": true + }, + { + "inputIndex": 2, + "inputQty": "1398400000000000100663296", + "outputIndex": 1, + "hardLimitError": true + }, + { + "inputIndex": 2, + "inputQty": "2097600000000000016777216", + "outputIndex": 1, + "hardLimitError": true + }, + { + "inputIndex": 2, + "inputQty": "2796800000000000201326592", + "outputIndex": 1, + "hardLimitError": true + }, + { + "inputIndex": 2, + "inputQty": "3496000000000000117440512", + "outputIndex": 1, + "hardLimitError": true + }, + { + "inputIndex": 2, + "inputQty": "4195200000000000033554432", + "outputIndex": 1, + "hardLimitError": true + }, + { + "inputIndex": 2, + "inputQty": "4894399999999999949668352", + "outputIndex": 1, + "hardLimitError": true + }, + { + "inputIndex": 2, + "inputQty": "5593600000000000402653184", + "outputIndex": 1, + "hardLimitError": true + }, + { + "inputIndex": 2, + "inputQty": "6292799999999999781896192", + "outputIndex": 1, + "hardLimitError": true + }, + { + "inputIndex": 2, + "inputQty": "6992000000000000234881024", + "outputIndex": 1, + "hardLimitError": true + } + ] + }, + { + "reserve0": "3996499999999999360000000", + "reserve1": "3996499999999999360000000", + "reserve2": "2007000000000000960000000", + "A": 120, + "mAssetSupply": "9995726520619110731126433", + "hardMin": 50000000000000000, + "hardMax": 750000000000000000, + "swapFeeRate": 600000000000000, + "swaps": [ + { + "inputIndex": 0, + "inputQty": "10000000000000", + "outputIndex": 1, + "outputQty": "9994000000000", + "swapFee": "5987961342", + "priceReceived": 1.0000012045885531 + }, + { + "inputIndex": 0, + "inputQty": "1000000000000000", + "outputIndex": 1, + "outputQty": "999399999998011", + "swapFee": "598796134240", + "priceReceived": 1.0000012045905033 + }, + { + "inputIndex": 0, + "inputQty": "100000000000000000", + "outputIndex": 1, + "outputQty": "99939999980116059", + "swapFee": "59879613419763", + "priceReceived": 1.0000012047875144 + }, + { + "inputIndex": 0, + "inputQty": "1000000000000000000", + "outputIndex": 1, + "outputQty": "999399998011605799", + "swapFee": "598796133812390", + "priceReceived": 1.0000012065785313 + }, + { + "inputIndex": 0, + "inputQty": "10000000000000000000", + "outputIndex": 1, + "outputQty": "9993999801160583413", + "swapFee": "5987961299599208", + "priceReceived": 1.0000012244886993 + }, + { + "inputIndex": 0, + "inputQty": "100000000000000000000", + "outputIndex": 1, + "outputQty": "99939980116061969608", + "swapFee": "59879609143550369", + "priceReceived": 1.0000014035903781 + }, + { + "inputIndex": 0, + "inputQty": "699200000000000050331648", + "outputIndex": 1, + "outputQty": "697779736747200745522864", + "swapFee": "418477829487451578495", + "priceReceived": 1.0014356757162106 + }, + { + "inputIndex": 0, + "inputQty": "1398400000000000100663296", + "outputIndex": 1, + "outputQty": "1393157070614067945102172", + "swapFee": "836578522387612414347", + "priceReceived": 1.0031628528875085 + }, + { + "inputIndex": 0, + "inputQty": "2097600000000000016777216", + "outputIndex": 1, + "outputQty": "2084449282114052419694637", + "swapFee": "1254320506285243319162", + "priceReceived": 1.0057072136423473 + }, + { + "inputIndex": 0, + "inputQty": "2796800000000000201326592", + "outputIndex": 1, + "outputQty": "2765917160800186035881131", + "swapFee": "1671708803050131015856", + "priceReceived": 1.0105611009652629 + }, + { + "inputIndex": 0, + "inputQty": "3496000000000000117440512", + "outputIndex": 1, + "outputQty": "3409504832193172411327541", + "swapFee": "2088741347897643737830", + "priceReceived": 1.0247562125919134 + }, + { + "inputIndex": 0, + "inputQty": "4195200000000000033554432", + "outputIndex": 1, + "hardLimitError": true + }, + { + "inputIndex": 0, + "inputQty": "4894399999999999949668352", + "outputIndex": 1, + "hardLimitError": true + }, + { + "inputIndex": 0, + "inputQty": "5593600000000000402653184", + "outputIndex": 1, + "hardLimitError": true + }, + { + "inputIndex": 0, + "inputQty": "6292799999999999781896192", + "outputIndex": 1, + "hardLimitError": true + }, + { + "inputIndex": 0, + "inputQty": "6992000000000000234881024", + "outputIndex": 1, + "hardLimitError": true + }, + { + "inputIndex": 0, + "inputQty": "10000000000000", + "outputIndex": 2, + "outputQty": "9915826051847", + "swapFee": "5987961342", + "priceReceived": 1.0078849695831884 + }, + { + "inputIndex": 0, + "inputQty": "1000000000000000", + "outputIndex": 2, + "outputQty": "991582605179020", + "swapFee": "598796134240", + "priceReceived": 1.0078849695889214 + }, + { + "inputIndex": 0, + "inputQty": "100000000000000000", + "outputIndex": 2, + "outputQty": "99158260460728360", + "swapFee": "59879613419763", + "priceReceived": 1.0078849701701003 + }, + { + "inputIndex": 0, + "inputQty": "1000000000000000000", + "outputIndex": 2, + "outputQty": "991582599409673433", + "swapFee": "598796133812390", + "priceReceived": 1.0078849754535517 + }, + { + "inputIndex": 0, + "inputQty": "10000000000000000000", + "outputIndex": 2, + "outputQty": "9915825474333675757", + "swapFee": "5987961299599208", + "priceReceived": 1.0078850282882756 + }, + { + "inputIndex": 0, + "inputQty": "100000000000000000000", + "outputIndex": 2, + "outputQty": "99158202764987759654", + "swapFee": "59879609143550369", + "priceReceived": 1.0078855566565874 + }, + { + "inputIndex": 0, + "inputQty": "699200000000000050331648", + "outputIndex": 2, + "outputQty": "689282551659223245636916", + "swapFee": "418477829487451578495", + "priceReceived": 1.0137809530916222 + }, + { + "inputIndex": 0, + "inputQty": "1398400000000000100663296", + "outputIndex": 2, + "outputQty": "1356366996729241375923282", + "swapFee": "836578522387612414347", + "priceReceived": 1.0303726239636564 + }, + { + "inputIndex": 0, + "inputQty": "2097600000000000016777216", + "outputIndex": 2, + "hardLimitError": true + }, + { + "inputIndex": 0, + "inputQty": "2796800000000000201326592", + "outputIndex": 2, + "hardLimitError": true + }, + { + "inputIndex": 0, + "inputQty": "3496000000000000117440512", + "outputIndex": 2, + "hardLimitError": true + }, + { + "inputIndex": 0, + "inputQty": "4195200000000000033554432", + "outputIndex": 2, + "hardLimitError": true + }, + { + "inputIndex": 0, + "inputQty": "4894399999999999949668352", + "outputIndex": 2, + "hardLimitError": true + }, + { + "inputIndex": 0, + "inputQty": "5593600000000000402653184", + "outputIndex": 2, + "hardLimitError": true + }, + { + "inputIndex": 0, + "inputQty": "6292799999999999781896192", + "outputIndex": 2, + "hardLimitError": true + }, + { + "inputIndex": 0, + "inputQty": "6992000000000000234881024", + "outputIndex": 2, + "hardLimitError": true + }, + { + "inputIndex": 1, + "inputQty": "10000000000000", + "outputIndex": 0, + "outputQty": "9994000000000", + "swapFee": "5987961342", + "priceReceived": 1.0000012045885531 + }, + { + "inputIndex": 1, + "inputQty": "1000000000000000", + "outputIndex": 0, + "outputQty": "999399999998011", + "swapFee": "598796134240", + "priceReceived": 1.0000012045905033 + }, + { + "inputIndex": 1, + "inputQty": "100000000000000000", + "outputIndex": 0, + "outputQty": "99939999980116059", + "swapFee": "59879613419763", + "priceReceived": 1.0000012047875144 + }, + { + "inputIndex": 1, + "inputQty": "1000000000000000000", + "outputIndex": 0, + "outputQty": "999399998011605799", + "swapFee": "598796133812390", + "priceReceived": 1.0000012065785313 + }, + { + "inputIndex": 1, + "inputQty": "10000000000000000000", + "outputIndex": 0, + "outputQty": "9993999801160583413", + "swapFee": "5987961299599208", + "priceReceived": 1.0000012244886993 + }, + { + "inputIndex": 1, + "inputQty": "100000000000000000000", + "outputIndex": 0, + "outputQty": "99939980116061969608", + "swapFee": "59879609143550369", + "priceReceived": 1.0000014035903781 + }, + { + "inputIndex": 1, + "inputQty": "699200000000000050331648", + "outputIndex": 0, + "outputQty": "697779736747200745522864", + "swapFee": "418477829487451578495", + "priceReceived": 1.0014356757162106 + }, + { + "inputIndex": 1, + "inputQty": "1398400000000000100663296", + "outputIndex": 0, + "outputQty": "1393157070614067945102172", + "swapFee": "836578522387612414347", + "priceReceived": 1.0031628528875085 + }, + { + "inputIndex": 1, + "inputQty": "2097600000000000016777216", + "outputIndex": 0, + "outputQty": "2084449282114052419694637", + "swapFee": "1254320506285243319162", + "priceReceived": 1.0057072136423473 + }, + { + "inputIndex": 1, + "inputQty": "2796800000000000201326592", + "outputIndex": 0, + "outputQty": "2765917160800186035881131", + "swapFee": "1671708803050131015856", + "priceReceived": 1.0105611009652629 + }, + { + "inputIndex": 1, + "inputQty": "3496000000000000117440512", + "outputIndex": 0, + "outputQty": "3409504832193172411327541", + "swapFee": "2088741347897643737830", + "priceReceived": 1.0247562125919134 + }, + { + "inputIndex": 1, + "inputQty": "4195200000000000033554432", + "outputIndex": 0, + "hardLimitError": true + }, + { + "inputIndex": 1, + "inputQty": "4894399999999999949668352", + "outputIndex": 0, + "hardLimitError": true + }, + { + "inputIndex": 1, + "inputQty": "5593600000000000402653184", + "outputIndex": 0, + "hardLimitError": true + }, + { + "inputIndex": 1, + "inputQty": "6292799999999999781896192", + "outputIndex": 0, + "hardLimitError": true + }, + { + "inputIndex": 1, + "inputQty": "6992000000000000234881024", + "outputIndex": 0, + "hardLimitError": true + }, + { + "inputIndex": 1, + "inputQty": "10000000000000", + "outputIndex": 2, + "outputQty": "9915826051847", + "swapFee": "5987961342", + "priceReceived": 1.0078849695831884 + }, + { + "inputIndex": 1, + "inputQty": "1000000000000000", + "outputIndex": 2, + "outputQty": "991582605179020", + "swapFee": "598796134240", + "priceReceived": 1.0078849695889214 + }, + { + "inputIndex": 1, + "inputQty": "100000000000000000", + "outputIndex": 2, + "outputQty": "99158260460728360", + "swapFee": "59879613419763", + "priceReceived": 1.0078849701701003 + }, + { + "inputIndex": 1, + "inputQty": "1000000000000000000", + "outputIndex": 2, + "outputQty": "991582599409673433", + "swapFee": "598796133812390", + "priceReceived": 1.0078849754535517 + }, + { + "inputIndex": 1, + "inputQty": "10000000000000000000", + "outputIndex": 2, + "outputQty": "9915825474333675757", + "swapFee": "5987961299599208", + "priceReceived": 1.0078850282882756 + }, + { + "inputIndex": 1, + "inputQty": "100000000000000000000", + "outputIndex": 2, + "outputQty": "99158202764987759654", + "swapFee": "59879609143550369", + "priceReceived": 1.0078855566565874 + }, + { + "inputIndex": 1, + "inputQty": "699200000000000050331648", + "outputIndex": 2, + "outputQty": "689282551659223245636916", + "swapFee": "418477829487451578495", + "priceReceived": 1.0137809530916222 + }, + { + "inputIndex": 1, + "inputQty": "1398400000000000100663296", + "outputIndex": 2, + "outputQty": "1356366996729241375923282", + "swapFee": "836578522387612414347", + "priceReceived": 1.0303726239636564 + }, + { + "inputIndex": 1, + "inputQty": "2097600000000000016777216", + "outputIndex": 2, + "hardLimitError": true + }, + { + "inputIndex": 1, + "inputQty": "2796800000000000201326592", + "outputIndex": 2, + "hardLimitError": true + }, + { + "inputIndex": 1, + "inputQty": "3496000000000000117440512", + "outputIndex": 2, + "hardLimitError": true + }, + { + "inputIndex": 1, + "inputQty": "4195200000000000033554432", + "outputIndex": 2, + "hardLimitError": true + }, + { + "inputIndex": 1, + "inputQty": "4894399999999999949668352", + "outputIndex": 2, + "hardLimitError": true + }, + { + "inputIndex": 1, + "inputQty": "5593600000000000402653184", + "outputIndex": 2, + "hardLimitError": true + }, + { + "inputIndex": 1, + "inputQty": "6292799999999999781896192", + "outputIndex": 2, + "hardLimitError": true + }, + { + "inputIndex": 1, + "inputQty": "6992000000000000234881024", + "outputIndex": 2, + "hardLimitError": true + }, + { + "inputIndex": 2, + "inputQty": "10000000000000", + "outputIndex": 0, + "outputQty": "10072790252445", + "swapFee": "6035168965", + "priceReceived": 0.9921744204500966 + }, + { + "inputIndex": 2, + "inputQty": "1000000000000000", + "outputIndex": 0, + "outputQty": "1007279025238644", + "swapFee": "603516896553", + "priceReceived": 0.9921744204558122 + }, + { + "inputIndex": 2, + "inputQty": "100000000000000000", + "outputIndex": 0, + "outputQty": "100727902465311571", + "swapFee": "60351689634942", + "priceReceived": 0.9921744210327623 + }, + { + "inputIndex": 2, + "inputQty": "1000000000000000000", + "outputIndex": 0, + "outputQty": "1007279019330139954", + "swapFee": "603516894491591", + "priceReceived": 0.9921744262777621 + }, + { + "inputIndex": 2, + "inputQty": "10000000000000000000", + "outputIndex": 0, + "outputQty": "10072789661005997875", + "swapFee": "6035168759132957", + "priceReceived": 0.9921744787275486 + }, + { + "inputIndex": 2, + "inputQty": "100000000000000000000", + "outputIndex": 0, + "outputQty": "100727843382691828833", + "swapFee": "60351669013876130", + "priceReceived": 0.9921750032043162 + }, + { + "inputIndex": 2, + "inputQty": "699200000000000050331648", + "outputIndex": 0, + "outputQty": "701990061873335666661480", + "swapFee": "421209678016508108806", + "priceReceived": 0.9954254743396473 + }, + { + "inputIndex": 2, + "inputQty": "1398400000000000100663296", + "outputIndex": 0, + "outputQty": "1400520690043401824861045", + "swapFee": "841445523586415237822", + "priceReceived": 0.9978849755037205 + }, + { + "inputIndex": 2, + "inputQty": "2097600000000000016777216", + "outputIndex": 0, + "outputQty": "2095431279847674350793501", + "swapFee": "1261119325233018729452", + "priceReceived": 1.0004331331863856 + }, + { + "inputIndex": 2, + "inputQty": "2796800000000000201326592", + "outputIndex": 0, + "outputQty": "2783047691616111483913211", + "swapFee": "1680399398546506822409", + "priceReceived": 1.004337657964579 + }, + { + "inputIndex": 2, + "inputQty": "3496000000000000117440512", + "outputIndex": 0, + "outputQty": "3441701398292317538340882", + "swapFee": "2099364923554529841758", + "priceReceived": 1.0151666954053677 + }, + { + "inputIndex": 2, + "inputQty": "4195200000000000033554432", + "outputIndex": 0, + "hardLimitError": true + }, + { + "inputIndex": 2, + "inputQty": "4894399999999999949668352", + "outputIndex": 0, + "hardLimitError": true + }, + { + "inputIndex": 2, + "inputQty": "5593600000000000402653184", + "outputIndex": 0, + "hardLimitError": true + }, + { + "inputIndex": 2, + "inputQty": "6292799999999999781896192", + "outputIndex": 0, + "hardLimitError": true + }, + { + "inputIndex": 2, + "inputQty": "6992000000000000234881024", + "outputIndex": 0, + "hardLimitError": true + }, + { + "inputIndex": 2, + "inputQty": "10000000000000", + "outputIndex": 1, + "outputQty": "10072790252445", + "swapFee": "6035168965", + "priceReceived": 0.9921744204500966 + }, + { + "inputIndex": 2, + "inputQty": "1000000000000000", + "outputIndex": 1, + "outputQty": "1007279025238644", + "swapFee": "603516896553", + "priceReceived": 0.9921744204558122 + }, + { + "inputIndex": 2, + "inputQty": "100000000000000000", + "outputIndex": 1, + "outputQty": "100727902465311571", + "swapFee": "60351689634942", + "priceReceived": 0.9921744210327623 + }, + { + "inputIndex": 2, + "inputQty": "1000000000000000000", + "outputIndex": 1, + "outputQty": "1007279019330139954", + "swapFee": "603516894491591", + "priceReceived": 0.9921744262777621 + }, + { + "inputIndex": 2, + "inputQty": "10000000000000000000", + "outputIndex": 1, + "outputQty": "10072789661005997875", + "swapFee": "6035168759132957", + "priceReceived": 0.9921744787275486 + }, + { + "inputIndex": 2, + "inputQty": "100000000000000000000", + "outputIndex": 1, + "outputQty": "100727843382691828833", + "swapFee": "60351669013876130", + "priceReceived": 0.9921750032043162 + }, + { + "inputIndex": 2, + "inputQty": "699200000000000050331648", + "outputIndex": 1, + "outputQty": "701990061873335666661480", + "swapFee": "421209678016508108806", + "priceReceived": 0.9954254743396473 + }, + { + "inputIndex": 2, + "inputQty": "1398400000000000100663296", + "outputIndex": 1, + "outputQty": "1400520690043401824861045", + "swapFee": "841445523586415237822", + "priceReceived": 0.9978849755037205 + }, + { + "inputIndex": 2, + "inputQty": "2097600000000000016777216", + "outputIndex": 1, + "outputQty": "2095431279847674350793501", + "swapFee": "1261119325233018729452", + "priceReceived": 1.0004331331863856 + }, + { + "inputIndex": 2, + "inputQty": "2796800000000000201326592", + "outputIndex": 1, + "outputQty": "2783047691616111483913211", + "swapFee": "1680399398546506822409", + "priceReceived": 1.004337657964579 + }, + { + "inputIndex": 2, + "inputQty": "3496000000000000117440512", + "outputIndex": 1, + "outputQty": "3441701398292317538340882", + "swapFee": "2099364923554529841758", + "priceReceived": 1.0151666954053677 + }, + { + "inputIndex": 2, + "inputQty": "4195200000000000033554432", + "outputIndex": 1, + "hardLimitError": true + }, + { + "inputIndex": 2, + "inputQty": "4894399999999999949668352", + "outputIndex": 1, + "hardLimitError": true + }, + { + "inputIndex": 2, + "inputQty": "5593600000000000402653184", + "outputIndex": 1, + "hardLimitError": true + }, + { + "inputIndex": 2, + "inputQty": "6292799999999999781896192", + "outputIndex": 1, + "hardLimitError": true + }, + { + "inputIndex": 2, + "inputQty": "6992000000000000234881024", + "outputIndex": 1, + "hardLimitError": true + } + ] + }, + { + "reserve0": "7492500000000000000000000", + "reserve1": "500500000000000000000000", + "reserve2": "2007000000000000000000000", + "A": 120, + "mAssetSupply": "9896372713490403790662354", + "hardMin": 50000000000000000, + "hardMax": 750000000000000000, + "swapFeeRate": 600000000000000, + "swaps": [ + { + "inputIndex": 0, + "inputQty": "10000000000000", + "outputIndex": 1, + "outputQty": "8057935777439", + "swapFee": "5813076027", + "priceReceived": 1.2402912110512483 + }, + { + "inputIndex": 0, + "inputQty": "1000000000000000", + "outputIndex": 1, + "outputQty": "805793577497443", + "swapFee": "581307602736", + "priceReceived": 1.2402912114305544 + }, + { + "inputIndex": 0, + "inputQty": "100000000000000000", + "outputIndex": 1, + "outputQty": "80579355285952603", + "swapFee": "58130760256577", + "priceReceived": 1.2402912493538687 + }, + { + "inputIndex": 0, + "inputQty": "1000000000000000000", + "outputIndex": 1, + "outputQty": "805793328878247977", + "swapFee": "581307601011551", + "priceReceived": 1.240291594111716 + }, + { + "inputIndex": 0, + "inputQty": "10000000000000000000", + "outputIndex": 1, + "outputQty": "8057910890439978463", + "swapFee": "5813075854692939", + "priceReceived": 1.2402950417337768 + }, + { + "inputIndex": 0, + "inputQty": "100000000000000000000", + "outputIndex": 1, + "outputQty": "80576868855441209889", + "swapFee": "58130743004639067", + "priceReceived": 1.2403295223136046 + }, + { + "inputIndex": 0, + "inputQty": "699200000000000050331648", + "outputIndex": 1, + "hardLimitError": true + }, + { + "inputIndex": 0, + "inputQty": "1398400000000000100663296", + "outputIndex": 1, + "hardLimitError": true + }, + { + "inputIndex": 0, + "inputQty": "2097600000000000016777216", + "outputIndex": 1, + "hardLimitError": true + }, + { + "inputIndex": 0, + "inputQty": "2796800000000000201326592", + "outputIndex": 1, + "hardLimitError": true + }, + { + "inputIndex": 0, + "inputQty": "3496000000000000117440512", + "outputIndex": 1, + "hardLimitError": true + }, + { + "inputIndex": 0, + "inputQty": "4195200000000000033554432", + "outputIndex": 1, + "hardLimitError": true + }, + { + "inputIndex": 0, + "inputQty": "4894399999999999949668352", + "outputIndex": 1, + "hardLimitError": true + }, + { + "inputIndex": 0, + "inputQty": "5593600000000000402653184", + "outputIndex": 1, + "hardLimitError": true + }, + { + "inputIndex": 0, + "inputQty": "6292799999999999781896192", + "outputIndex": 1, + "hardLimitError": true + }, + { + "inputIndex": 0, + "inputQty": "6992000000000000234881024", + "outputIndex": 1, + "hardLimitError": true + }, + { + "inputIndex": 0, + "inputQty": "10000000000000", + "outputIndex": 2, + "outputQty": "9545299033164", + "swapFee": "5813076027", + "priceReceived": 1.0470271166203795 + }, + { + "inputIndex": 0, + "inputQty": "1000000000000000", + "outputIndex": 2, + "outputQty": "954529903294338", + "swapFee": "581307602736", + "priceReceived": 1.0470271166445417 + }, + { + "inputIndex": 0, + "inputQty": "100000000000000000", + "outputIndex": 2, + "outputQty": "95452990109381565", + "swapFee": "58130760256577", + "priceReceived": 1.0470271190584806 + }, + { + "inputIndex": 0, + "inputQty": "1000000000000000000", + "outputIndex": 2, + "outputQty": "954529881089065644", + "swapFee": "581307601011551", + "priceReceived": 1.0470271410033882 + }, + { + "inputIndex": 0, + "inputQty": "10000000000000000000", + "outputIndex": 2, + "outputQty": "9545296810407490515", + "swapFee": "5813075854692939", + "priceReceived": 1.04702736045341 + }, + { + "inputIndex": 0, + "inputQty": "100000000000000000000", + "outputIndex": 2, + "outputQty": "95452768047591845254", + "swapFee": "58130743004639067", + "priceReceived": 1.0470295550482653 + }, + { + "inputIndex": 0, + "inputQty": "699200000000000050331648", + "outputIndex": 2, + "hardLimitError": true + }, + { + "inputIndex": 0, + "inputQty": "1398400000000000100663296", + "outputIndex": 2, + "hardLimitError": true + }, + { + "inputIndex": 0, + "inputQty": "2097600000000000016777216", + "outputIndex": 2, + "hardLimitError": true + }, + { + "inputIndex": 0, + "inputQty": "2796800000000000201326592", + "outputIndex": 2, + "hardLimitError": true + }, + { + "inputIndex": 0, + "inputQty": "3496000000000000117440512", + "outputIndex": 2, + "hardLimitError": true + }, + { + "inputIndex": 0, + "inputQty": "4195200000000000033554432", + "outputIndex": 2, + "hardLimitError": true + }, + { + "inputIndex": 0, + "inputQty": "4894399999999999949668352", + "outputIndex": 2, + "hardLimitError": true + }, + { + "inputIndex": 0, + "inputQty": "5593600000000000402653184", + "outputIndex": 2, + "hardLimitError": true + }, + { + "inputIndex": 0, + "inputQty": "6292799999999999781896192", + "outputIndex": 2, + "hardLimitError": true + }, + { + "inputIndex": 0, + "inputQty": "6992000000000000234881024", + "outputIndex": 2, + "hardLimitError": true + }, + { + "inputIndex": 1, + "inputQty": "10000000000000", + "outputIndex": 0, + "outputQty": "12395238527337", + "swapFee": "7209772257", + "priceReceived": 0.8061797443997922 + }, + { + "inputIndex": 1, + "inputQty": "1000000000000000", + "outputIndex": 0, + "outputQty": "1239523852263400", + "swapFee": "720977225474", + "priceReceived": 0.8061797447058552 + }, + { + "inputIndex": 1, + "inputQty": "100000000000000000", + "outputIndex": 0, + "outputQty": "123952380523418314", + "swapFee": "72097720241086", + "priceReceived": 0.8061797753120162 + }, + { + "inputIndex": 1, + "inputQty": "1000000000000000000", + "outputIndex": 0, + "outputQty": "1239523377696697198", + "swapFee": "720976992737435", + "priceReceived": 0.8061800535494049 + }, + { + "inputIndex": 1, + "inputQty": "10000000000000000000", + "outputIndex": 0, + "outputQty": "12395191024051384203", + "swapFee": "7209748960428383", + "priceReceived": 0.8061828358796373 + }, + { + "inputIndex": 1, + "inputQty": "100000000000000000000", + "outputIndex": 0, + "outputQty": "123947635781796985191", + "swapFee": "72095393306750833", + "priceReceived": 0.8062106548172556 + }, + { + "inputIndex": 1, + "inputQty": "699200000000000050331648", + "outputIndex": 0, + "outputQty": "768896006715057077927865", + "swapFee": "455349056078842881937", + "priceReceived": 0.908763532183185 + }, + { + "inputIndex": 1, + "inputQty": "1398400000000000100663296", + "outputIndex": 0, + "outputQty": "1485514801822270051395981", + "swapFee": "884040318185604670645", + "priceReceived": 0.9407620563372994 + }, + { + "inputIndex": 1, + "inputQty": "2097600000000000016777216", + "outputIndex": 0, + "outputQty": "2191692694525269933121433", + "swapFee": "1307270388189317742828", + "priceReceived": 0.9564720158296994 + }, + { + "inputIndex": 1, + "inputQty": "2796800000000000201326592", + "outputIndex": 0, + "outputQty": "2893745098578223596232972", + "swapFee": "1728372076376296111498", + "priceReceived": 0.9659011186911105 + }, + { + "inputIndex": 1, + "inputQty": "3496000000000000117440512", + "outputIndex": 0, + "outputQty": "3593394051728979159386178", + "swapFee": "2148353632174868084140", + "priceReceived": 0.9722984999896522 + }, + { + "inputIndex": 1, + "inputQty": "4195200000000000033554432", + "outputIndex": 0, + "outputQty": "4291015906040761605294836", + "swapFee": "2567621069932273372757", + "priceReceived": 0.9770722063807332 + }, + { + "inputIndex": 1, + "inputQty": "4894399999999999949668352", + "outputIndex": 0, + "outputQty": "4986132009816772962673844", + "swapFee": "2986366809676326880201", + "priceReceived": 0.98100363639792 + }, + { + "inputIndex": 1, + "inputQty": "5593600000000000402653184", + "outputIndex": 0, + "outputQty": "5676824010962740152173763", + "swapFee": "3404691779986865867419", + "priceReceived": 0.9847399351159319 + }, + { + "inputIndex": 1, + "inputQty": "6292799999999999781896192", + "outputIndex": 0, + "outputQty": "6356304183245645467880735", + "swapFee": "3822652371743742700155", + "priceReceived": 0.989407864432471 + }, + { + "inputIndex": 1, + "inputQty": "6992000000000000234881024", + "outputIndex": 0, + "outputQty": "6988467216013139965717995", + "swapFee": "4240281183082721427082", + "priceReceived": 0.9998987621785502 + }, + { + "inputIndex": 1, + "inputQty": "10000000000000", + "outputIndex": 2, + "outputQty": "11838729070533", + "swapFee": "7209772257", + "priceReceived": 0.8440762659748161 + }, + { + "inputIndex": 1, + "inputQty": "1000000000000000", + "outputIndex": 2, + "outputQty": "1183872906668422", + "swapFee": "720977225474", + "priceReceived": 0.8440762662494169 + }, + { + "inputIndex": 1, + "inputQty": "100000000000000000", + "outputIndex": 2, + "outputQty": "118387286817586995", + "swapFee": "72097720241086", + "priceReceived": 0.8440762937132719 + }, + { + "inputIndex": 1, + "inputQty": "1000000000000000000", + "outputIndex": 2, + "outputQty": "1183872518244243855", + "swapFee": "720976992737435", + "priceReceived": 0.8440765433842954 + }, + { + "inputIndex": 1, + "inputQty": "10000000000000000000", + "outputIndex": 2, + "outputQty": "11838690189932096568", + "swapFee": "7209748960428383", + "priceReceived": 0.8440790400561101 + }, + { + "inputIndex": 1, + "inputQty": "100000000000000000000", + "outputIndex": 2, + "outputQty": "118383403300427069140", + "swapFee": "72095393306750833", + "priceReceived": 0.8441040029327553 + }, + { + "inputIndex": 1, + "inputQty": "699200000000000050331648", + "outputIndex": 2, + "hardLimitError": true + }, + { + "inputIndex": 1, + "inputQty": "1398400000000000100663296", + "outputIndex": 2, + "hardLimitError": true + }, + { + "inputIndex": 1, + "inputQty": "2097600000000000016777216", + "outputIndex": 2, + "hardLimitError": true + }, + { + "inputIndex": 1, + "inputQty": "2796800000000000201326592", + "outputIndex": 2, + "hardLimitError": true + }, + { + "inputIndex": 1, + "inputQty": "3496000000000000117440512", + "outputIndex": 2, + "hardLimitError": true + }, + { + "inputIndex": 1, + "inputQty": "4195200000000000033554432", + "outputIndex": 2, + "hardLimitError": true + }, + { + "inputIndex": 1, + "inputQty": "4894399999999999949668352", + "outputIndex": 2, + "hardLimitError": true + }, + { + "inputIndex": 1, + "inputQty": "5593600000000000402653184", + "outputIndex": 2, + "hardLimitError": true + }, + { + "inputIndex": 1, + "inputQty": "6292799999999999781896192", + "outputIndex": 2, + "hardLimitError": true + }, + { + "inputIndex": 1, + "inputQty": "6992000000000000234881024", + "outputIndex": 2, + "hardLimitError": true + }, + { + "inputIndex": 2, + "inputQty": "10000000000000", + "outputIndex": 0, + "outputQty": "10463793292692", + "swapFee": "6086334395", + "priceReceived": 0.9550947143217013 + }, + { + "inputIndex": 2, + "inputQty": "1000000000000000", + "outputIndex": 0, + "outputQty": "1046379329243911", + "swapFee": "608633439508", + "priceReceived": 0.9550947143447764 + }, + { + "inputIndex": 2, + "inputQty": "100000000000000000", + "outputIndex": 0, + "outputQty": "104637932671762503", + "swapFee": "60863343871480", + "priceReceived": 0.955094716651431 + }, + { + "inputIndex": 2, + "inputQty": "1000000000000000000", + "outputIndex": 0, + "outputQty": "1046379303751399330", + "swapFee": "608633431500388", + "priceReceived": 0.9550947376210117 + }, + { + "inputIndex": 2, + "inputQty": "10000000000000000000", + "outputIndex": 0, + "outputQty": "10463790740902354752", + "swapFee": "6086333593565286", + "priceReceived": 0.9550949473158712 + }, + { + "inputIndex": 2, + "inputQty": "100000000000000000000", + "outputIndex": 0, + "outputQty": "104637677758789146648", + "swapFee": "60863263794995589", + "priceReceived": 0.9550970441697376 + }, + { + "inputIndex": 2, + "inputQty": "699200000000000050331648", + "outputIndex": 0, + "outputQty": "722263128479055491881378", + "swapFee": "422553559162174988487", + "priceReceived": 0.9674832050645118 + }, + { + "inputIndex": 2, + "inputQty": "1398400000000000100663296", + "outputIndex": 0, + "outputQty": "1433094677312411634245482", + "swapFee": "841275721935342452176", + "priceReceived": 0.975203345880127 + }, + { + "inputIndex": 2, + "inputQty": "2097600000000000016777216", + "outputIndex": 0, + "outputQty": "2137711494094160926435218", + "swapFee": "1257768754982574099612", + "priceReceived": 0.980647873689488 + }, + { + "inputIndex": 2, + "inputQty": "2796800000000000201326592", + "outputIndex": 0, + "outputQty": "2838008198118375113442264", + "swapFee": "1672697094452568553252", + "priceReceived": 0.9848904963554165 + }, + { + "inputIndex": 2, + "inputQty": "3496000000000000117440512", + "outputIndex": 0, + "outputQty": "3534438755467934405642287", + "swapFee": "2086377935724127709749", + "priceReceived": 0.988534209755095 + }, + { + "inputIndex": 2, + "inputQty": "4195200000000000033554432", + "outputIndex": 0, + "outputQty": "4226394339111648882141178", + "swapFee": "2498975677928744759900", + "priceReceived": 0.9920278819044936 + }, + { + "inputIndex": 2, + "inputQty": "4894399999999999949668352", + "outputIndex": 0, + "outputQty": "4911782260367201108637264", + "swapFee": "2910579067931670693036", + "priceReceived": 0.9958685384735243 + }, + { + "inputIndex": 2, + "inputQty": "5593600000000000402653184", + "outputIndex": 0, + "hardLimitError": true + }, + { + "inputIndex": 2, + "inputQty": "6292799999999999781896192", + "outputIndex": 0, + "hardLimitError": true + }, + { + "inputIndex": 2, + "inputQty": "6992000000000000234881024", + "outputIndex": 0, + "hardLimitError": true + }, + { + "inputIndex": 2, + "inputQty": "10000000000000", + "outputIndex": 1, + "outputQty": "8436719465774", + "swapFee": "6086334395", + "priceReceived": 1.1845734240836394 + }, + { + "inputIndex": 2, + "inputQty": "1000000000000000", + "outputIndex": 1, + "outputQty": "843671946345970", + "swapFee": "608633439508", + "priceReceived": 1.1845734244085735 + }, + { + "inputIndex": 2, + "inputQty": "100000000000000000", + "outputIndex": 1, + "outputQty": "84367192320212282", + "swapFee": "60863343871480", + "priceReceived": 1.1845734569050674 + }, + { + "inputIndex": 2, + "inputQty": "1000000000000000000", + "outputIndex": 1, + "outputQty": "843671712803297357", + "swapFee": "608633431500388", + "priceReceived": 1.1845737523281268 + }, + { + "inputIndex": 2, + "inputQty": "10000000000000000000", + "outputIndex": 1, + "outputQty": "8436696087934987253", + "swapFee": "6086333593565286", + "priceReceived": 1.1845767065970727 + }, + { + "inputIndex": 2, + "inputQty": "100000000000000000000", + "outputIndex": 1, + "outputQty": "84364856654093899177", + "swapFee": "60863263794995589", + "priceReceived": 1.184606253122287 + }, + { + "inputIndex": 2, + "inputQty": "699200000000000050331648", + "outputIndex": 1, + "hardLimitError": true + }, + { + "inputIndex": 2, + "inputQty": "1398400000000000100663296", + "outputIndex": 1, + "hardLimitError": true + }, + { + "inputIndex": 2, + "inputQty": "2097600000000000016777216", + "outputIndex": 1, + "hardLimitError": true + }, + { + "inputIndex": 2, + "inputQty": "2796800000000000201326592", + "outputIndex": 1, + "hardLimitError": true + }, + { + "inputIndex": 2, + "inputQty": "3496000000000000117440512", + "outputIndex": 1, + "hardLimitError": true + }, + { + "inputIndex": 2, + "inputQty": "4195200000000000033554432", + "outputIndex": 1, + "hardLimitError": true + }, + { + "inputIndex": 2, + "inputQty": "4894399999999999949668352", + "outputIndex": 1, + "hardLimitError": true + }, + { + "inputIndex": 2, + "inputQty": "5593600000000000402653184", + "outputIndex": 1, + "hardLimitError": true + }, + { + "inputIndex": 2, + "inputQty": "6292799999999999781896192", + "outputIndex": 1, + "hardLimitError": true + }, + { + "inputIndex": 2, + "inputQty": "6992000000000000234881024", + "outputIndex": 1, + "hardLimitError": true + } + ] + } +] \ No newline at end of file diff --git a/test-utils/validator-data/index.ts b/test-utils/validator-data/index.ts new file mode 100644 index 00000000..a9876f4c --- /dev/null +++ b/test-utils/validator-data/index.ts @@ -0,0 +1,57 @@ +import fullIntegrationData from "./full/integrationData.json" +import fullMintData from "./full/mintTestData.json" +import fullMintMultiData from "./full/mintMultiTestData.json" +import fullSwapData from "./full/swapTestData.json" +import fullRedeemData from "./full/redeemTestData.json" +import fullRedeemMassetData from "./full/redeemMassetTestData.json" +import fullRedeemExactData from "./full/redeemExactTestData.json" + +import sampleIntegrationData from "./sample/integrationData.json" +import sampleMintData from "./sample/mintTestData.json" +import sampleMintMultiData from "./sample/mintMultiTestData.json" +import sampleSwapData from "./sample/swapTestData.json" +import sampleRedeemData from "./sample/redeemTestData.json" +import sampleRedeemMassetData from "./sample/redeemMassetTestData.json" +import sampleRedeemExactData from "./sample/redeemExactTestData.json" + +interface Data { + full + sample +} + +const integrationData: Data = { + full: fullIntegrationData, + sample: sampleIntegrationData, +} + +const mintData: Data = { + full: fullMintData, + sample: sampleMintData, +} + +const mintMultiData: Data = { + full: fullMintMultiData, + sample: sampleMintMultiData, +} + +const swapData: Data = { + full: fullSwapData, + sample: sampleSwapData, +} + +const redeemData: Data = { + full: fullRedeemData, + sample: sampleRedeemData, +} + +const redeemMassetData: Data = { + full: fullRedeemMassetData, + sample: sampleRedeemMassetData, +} + +const redeemExactData: Data = { + full: fullRedeemExactData, + sample: sampleRedeemExactData, +} + +export { integrationData, mintData, mintMultiData, swapData, redeemData, redeemMassetData, redeemExactData } diff --git a/test-utils/validator-data/sample/integrationData.json b/test-utils/validator-data/sample/integrationData.json new file mode 100644 index 00000000..a470ce8c --- /dev/null +++ b/test-utils/validator-data/sample/integrationData.json @@ -0,0 +1,1274 @@ +{ + "reserve0": "3333333333333333330000000", + "reserve1": "3333333333333333330000000", + "reserve2": "3333333333333333330000000", + "A": 120, + "hardMin": 50000000000000000, + "hardMax": 750000000000000000, + "swapFeeRate": 600000000000000, + "redemptionFeeRate": 300000000000000, + "actions": [ + { + "type": "redeemBassets", + "inputQtys": [ + "7273078205549974528", + "155969121455495380992", + "144531542372101226496" + ], + "expectedQty": "307773759009220050661", + "swapFee": "184775120477818721", + "reserves": [ + "3333326060255127780025472", + "3333177364211877834619008", + "3333188801790961228773504" + ], + "mAssetSupply": "9999692226240990769949339" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "734048361118712268324864", + "48623817237249994522624", + "311219938026755327000576" + ], + "expectedQty": "1094235429070908550838837", + "swapFee": "656935418693761387335", + "reserves": [ + "2599277699136415511700608", + "3284553546974627840096384", + "3021968863764205901772928" + ], + "mAssetSupply": "8905456797170082219110502" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "5917110544627535872", + "expectedQty": "5906756900185624322", + "swapFee": "3550266326776521", + "reserves": [ + "2599271792379515326076286", + "3284553546974627840096384", + "3021968863764205901772928" + ], + "mAssetSupply": "8905450883609803918351151" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "121789446577382156664832", + "expectedQty": "121725315346367419990412", + "swapFee": "73073667946429293998", + "reserves": [ + "2599271792379515326076286", + "3284553546974627840096384", + "2900243548417838481782516" + ], + "mAssetSupply": "8783734510700368190980317" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "295340756022743793664", + "expectedQty": "295353123656581259674", + "reserves": [ + "2599271792379515326076286", + "3284553546974627840096384", + "2900538889173861225576180" + ] + }, + { + "type": "redeemMasset", + "inputQty": "15123009034654849590886", + "expectedQtys": [ + "4473689043143975981877", + "5653149185013976573362", + "4992209389473296852951" + ], + "redemptionFee": "4536902710396454877", + "reserves": [ + "2594798103336371350094409", + "3278900397789613863523022", + "2895546679784387928723229" + ], + "mAssetSupply": "8768911391692080319103982" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "301324324015181066665984", + "expectedQty": "300713716118922601156584", + "swapFee": "180794594409108639999", + "reserves": [ + "2294084387217448748937825", + "3278900397789613863523022", + "2895546679784387928723229" + ], + "mAssetSupply": "8467767862271308361077997" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "56051756230399240437760", + "outputIndex": 1, + "expectedQty": "56064585403996278447371", + "swapFee": "33619030323132013007", + "reserves": [ + "2294084387217448748937825", + "3222835812385617585075651", + "2951598436014787169160989" + ], + "mAssetSupply": "8467801481301631493091004", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemMasset", + "inputQty": "9908604724032924182118", + "expectedQtys": [ + "2683619366145195855729", + "3770072560632675127971", + "3452779142785017378377" + ], + "redemptionFee": "2972581417209877254", + "reserves": [ + "2291400767851303553082096", + "3219065739824984909947680", + "2948145656872002151782612" + ], + "mAssetSupply": "8457895849159015778786140" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "90734708768013959168", + "expectedQty": "90721633474467029817", + "swapFee": "54440825260808375", + "reserves": [ + "2291400767851303553082096", + "3219065739824984909947680", + "2948054935238527684752795" + ], + "mAssetSupply": "8457805168891073025635347" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "1209345053528237015040", + "expectedQty": "1211612977780551471601", + "reserves": [ + "2292610112904831790097136", + "3219065739824984909947680", + "2948054935238527684752795" + ] + }, + { + "type": "redeemMasset", + "inputQty": "291186238385344256", + "expectedQtys": [ + "78895249780915482", + "110777229052213532", + "101450974666078849" + ], + "redemptionFee": "87355871515603", + "reserves": [ + "2292610034009582009181654", + "3219065629047755857734148", + "2948054833787553018673946" + ], + "mAssetSupply": "8459016490769971063278295" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "3850933973332442742784", + "5745025913465163743232", + "115434005736064204800" + ], + "expectedQty": "9712030143821573040308", + "swapFee": "5830716516202665423", + "reserves": [ + "2288759100036249566438870", + "3213320603134290693990916", + "2947939399781816954469146" + ], + "mAssetSupply": "8449304460626149490237987" + }, + { + "type": "redeemMasset", + "inputQty": "5403265076163042187673", + "expectedQtys": [ + "1463204709802366875219", + "2054277289618033480738", + "1884618968376532263438" + ], + "redemptionFee": "1620979522848912656", + "reserves": [ + "2287295895326447199563651", + "3211266325844672660510178", + "2946054780813440422205708" + ], + "mAssetSupply": "8443902816529509296962970" + }, + { + "type": "redeemMasset", + "inputQty": "1711578172521137255219", + "expectedQtys": [ + "463495536111337495607", + "650728054177368777646", + "596985830664296318825" + ], + "redemptionFee": "513473451756341176", + "reserves": [ + "2286832399790335862068044", + "3210615597790495291732532", + "2945457794982776125886883" + ], + "mAssetSupply": "8442191751830439916048927" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "358800792615223488", + "expectedQty": "358393429115469163", + "reserves": [ + "2286832399790335862068044", + "3210615956591287906956020", + "2945457794982776125886883" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "123309140047431217446912", + "29225268438406097010688", + "162492634658043297005568" + ], + "expectedQty": "315168004878843302905384", + "swapFee": "189214331526221714772", + "reserves": [ + "2163523259742904644621132", + "3181390688152881809945332", + "2782965160324732828881315" + ], + "mAssetSupply": "8127024105345025728612706" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "2004770994211215988752384", + "hardLimitError": true + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "21288465480056983552", + "expectedQty": "21282760857608373529", + "swapFee": "12773079288034190", + "reserves": [ + "2163523259742904644621132", + "3181390688152881809945332", + "2782943877563875220507786" + ], + "mAssetSupply": "8127002829652624959663344" + }, + { + "type": "redeemMasset", + "inputQty": "41963284353312544", + "expectedQtys": [ + "11167869274010150", + "16421989065681038", + "14365250422698717" + ], + "redemptionFee": "12588985305993", + "reserves": [ + "2163523248575035370610982", + "3181390671730892744264294", + "2782943863198624797809069" + ], + "mAssetSupply": "8127002787701929591656793" + }, + { + "type": "redeemMasset", + "inputQty": "68662288952151286323609", + "expectedQtys": [ + "18273390152584793524462", + "26870426749803508987426", + "23505094765431322173933" + ], + "redemptionFee": "20598686685645385897", + "reserves": [ + "2145249858422450577086520", + "3154520244981089235276868", + "2759438768433193475635136" + ], + "mAssetSupply": "8058361097436463950719081" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "817206035558604415696896", + "outputIndex": 2, + "expectedQty": "816055084064554311968936", + "swapFee": "490766500324224353762", + "reserves": [ + "2962455893981054992783416", + "3154520244981089235276868", + "1943383684368639163666200" + ], + "mAssetSupply": "8058851863936788175072843", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemMasset", + "inputQty": "390366989468777267", + "expectedQtys": [ + "143456918527601511", + "152757634197140784", + "94108349576705901" + ], + "redemptionFee": "117110096840633", + "reserves": [ + "2962455750524136465181905", + "3154520092223455038136084", + "1943383590260289586960299" + ], + "mAssetSupply": "8058851473686908803136209" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "31626296670497", + "40391349933409", + "10361514912368" + ], + "expectedQty": "82319963637528", + "swapFee": "49421631161", + "reserves": [ + "2962455750492510168511408", + "3154520092183063688202675", + "1943383590249928072047931" + ], + "mAssetSupply": "8058851473604588839498681" + }, + { + "type": "mintMulti", + "inputQtys": [ + "41352735484718514176", + "2786143862716305920", + "20176704195146088448" + ], + "expectedQty": "64334016863795542477", + "reserves": [ + "2962497103227994887025584", + "3154522878326926404508595", + "1943403766954123218136379" + ], + "mAssetSupply": "8058915807621452635041158" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "137693195249614011236352", + "expectedQty": "137800222272376116090390", + "swapFee": "82615917149768406741", + "reserves": [ + "2962497103227994887025584", + "3016722656054550288418205", + "1943403766954123218136379" + ], + "mAssetSupply": "7921305228288988392211547" + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "545567435996840260009984", + "expectedQty": "545555890716041351940295", + "swapFee": "327340461598104156005", + "reserves": [ + "2416941212511953535085289", + "3016722656054550288418205", + "1943403766954123218136379" + ], + "mAssetSupply": "7376065132753746236357568" + }, + { + "type": "mintMulti", + "inputQtys": [ + "666114235388421256249344", + "545054779485157328945152", + "1196313873163898138394624" + ], + "expectedQty": "2408316044099353844884075", + "reserves": [ + "3083055447900374791334633", + "3561777435539707617363357", + "3139717640118021356531003" + ], + "mAssetSupply": "9784381176853100081241643" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "71127153735251632128", + "outputIndex": 0, + "expectedQty": "71000460116592538259", + "swapFee": "42645636133682555", + "reserves": [ + "3082984447440258198796374", + "3561848562693442868995485", + "3139717640118021356531003" + ], + "mAssetSupply": "9784381219498736214924198", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "1667322653332190923849728", + "expectedQty": "1660944546190015720710383", + "swapFee": "1000393591999314554309", + "reserves": [ + "1422039901250242478085991", + "3561848562693442868995485", + "3139717640118021356531003" + ], + "mAssetSupply": "8118058959758544605628779" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "694339394638019662184448", + "expectedQty": "694853343123431192025931", + "swapFee": "416603636782811797310", + "reserves": [ + "1422039901250242478085991", + "3561848562693442868995485", + "2444864296994590164505072" + ], + "mAssetSupply": "7424136168757307755241641" + }, + { + "type": "mintMulti", + "inputQtys": [ + "136178307463526970556416", + "33823881941116832972800", + "69274577206037767520256" + ], + "expectedQty": "239983471456530457180944", + "reserves": [ + "1558218208713769448642407", + "3595672444634559701968285", + "2514138874200627932025328" + ], + "mAssetSupply": "7664119640213838212422585" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "18076767285165498368", + "11045863185563906048", + "10868197050903506944" + ], + "expectedQty": "40053985824790099495", + "swapFee": "24046819586626035", + "reserves": [ + "1558200131946484283144039", + "3595661398771374138062237", + "2514128006003577028518384" + ], + "mAssetSupply": "7664079586228013422323090" + }, + { + "type": "mintMulti", + "inputQtys": [ + "30164655958507884544", + "20369638325277392896", + "9213618988052046848" + ], + "expectedQty": "59849949827842235931", + "reserves": [ + "1558230296602442791028583", + "3595681768409699415455133", + "2514137219622565080565232" + ], + "mAssetSupply": "7664139436177841264559021" + }, + { + "type": "redeemMasset", + "inputQty": "19446764098466573031833", + "expectedQtys": [ + "3952622010635302250720", + "9120841079810105534432", + "6377384738125757890698" + ], + "redemptionFee": "5834029229539971909", + "reserves": [ + "1554277674591807488777863", + "3586560927329889309920701", + "2507759834884439322674534" + ], + "mAssetSupply": "7644698506108604231499097" + }, + { + "type": "swap", + "inputIndex": 1, + "inputQty": "9487306187281740595200", + "outputIndex": 0, + "expectedQty": "9395426758618060362579", + "swapFee": "5673375108423775257", + "reserves": [ + "1544882247833189428415284", + "3596048233517171050515901", + "2507759834884439322674534" + ], + "mAssetSupply": "7644704179483712655274354", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemMasset", + "inputQty": "12433589650730920391475", + "expectedQtys": [ + "2511891755107134291492", + "5846972428745710789776", + "4077476624428930451347" + ], + "redemptionFee": "3730076895219276117", + "reserves": [ + "1542370356078082294123792", + "3590201261088425339726125", + "2503682358260010392223187" + ], + "mAssetSupply": "7632274319909876954158996" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "71134567957281581826048", + "expectedQty": "70890493263008435889385", + "reserves": [ + "1542370356078082294123792", + "3661335829045706921552173", + "2503682358260010392223187" + ] + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "2405982357208262569361408", + "hardLimitError": true + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "232737354977212897427456", + "expectedQty": "233365898433554516193628", + "swapFee": "139642412986327738456", + "reserves": [ + "1542370356078082294123792", + "3427969930612152405358545", + "2503682358260010392223187" + ], + "mAssetSupply": "7470567100608658820359381" + }, + { + "type": "redeemMasset", + "inputQty": "7744196965767415280435", + "expectedQtys": [ + "1598384211649358358340", + "3552462606342925891882", + "2594607927115295368327" + ], + "redemptionFee": "2323259089730224584", + "reserves": [ + "1540771971866432935765452", + "3424417468005809479466663", + "2501087750332895096854860" + ], + "mAssetSupply": "7462825226901981135303530" + }, + { + "type": "mintMulti", + "inputQtys": [ + "128049032356046850490368", + "191620114957392569958400", + "94547891439582834589696" + ], + "expectedQty": "414262064257465162277992", + "reserves": [ + "1668821004222479786255820", + "3616037582963202049425063", + "2595635641772477931444556" + ], + "mAssetSupply": "7877087291159446297581522" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "2502476695581235347456", + "expectedQty": "2494865115595518722180", + "reserves": [ + "1668821004222479786255820", + "3618540059658783284772519", + "2595635641772477931444556" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "3319259101849882984448", + "892201999830101786624", + "847220923742197776384" + ], + "expectedQty": "5072473403464615399614", + "swapFee": "3045311228816058875", + "reserves": [ + "1665501745120629903271372", + "3617647857658953182985895", + "2594788420848735733668172" + ], + "mAssetSupply": "7874509682871577200904088" + }, + { + "type": "mintMulti", + "inputQtys": [ + "79090084482260257472512", + "93104087638600497233920", + "52357028037842601771008" + ], + "expectedQty": "224645137052112526738586", + "reserves": [ + "1744591829602890160743884", + "3710751945297553680219815", + "2647145448886578335439180" + ], + "mAssetSupply": "8099154819923689727642674" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "607107027923552174080", + "expectedQty": "606875510140973405608", + "swapFee": "364264216754131304", + "reserves": [ + "1744591829602890160743884", + "3710751945297553680219815", + "2646538573376437362033572" + ], + "mAssetSupply": "8098548077159982929599898" + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "679592281064666243792896", + "expectedQty": "680843848772351286845860", + "swapFee": "407755368638799746275", + "reserves": [ + "1744591829602890160743884", + "3029908096525202393373955", + "2646538573376437362033572" + ], + "mAssetSupply": "7419363551463955485553277" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "218772838972175987769344", + "expectedQty": "218765587694121154083988", + "swapFee": "131263703383305592661", + "reserves": [ + "1744591829602890160743884", + "3029908096525202393373955", + "2427772985682316207949584" + ], + "mAssetSupply": "7200721976195162803376594" + }, + { + "type": "redeemMasset", + "inputQty": "136491275302280757248", + "expectedQtys": [ + "33059202677494752237", + "57415347336579696422", + "46005167413220868635" + ], + "redemptionFee": "40947382590684227", + "reserves": [ + "1744558770400212665991647", + "3029850681177865813677533", + "2427726980514902987080949" + ], + "mAssetSupply": "7200585525867243113303573" + }, + { + "type": "mintMulti", + "inputQtys": [ + "478059257416337384800256", + "19651726114616246272000", + "66820529752799801507840" + ], + "expectedQty": "565520856816563256904398", + "reserves": [ + "2222618027816550050791903", + "3049502407292482059949533", + "2494547510267702788588789" + ], + "mAssetSupply": "7766106382683806370207971" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "3173226448094203282980864", + "expectedQty": "3161620621057727003591834", + "reserves": [ + "2222618027816550050791903", + "6222728855386685342930397", + "2494547510267702788588789" + ] + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "336513233567333604130816", + "expectedQty": "334453766843499392293160", + "reserves": [ + "2222618027816550050791903", + "6559242088954018947061213", + "2494547510267702788588789" + ] + }, + { + "type": "mintMulti", + "inputQtys": [ + "406473423465423634432", + "362829301080640716800", + "156588650767507816448" + ], + "expectedQty": "927176873572347554735", + "reserves": [ + "2223024501240015474426335", + "6559604918255099587778013", + "2494704098918470296405237" + ], + "mAssetSupply": "11263107947458605113647700" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "11079786313743078", + "outputIndex": 1, + "expectedQty": "11221978257123481", + "swapFee": "6694366709617", + "reserves": [ + "2223024512319801788169413", + "6559604907033121330654532", + "2494704098918470296405237" + ], + "mAssetSupply": "11263107947465299480357317", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemMasset", + "inputQty": "3717531749450651166310", + "expectedQtys": [ + "733517337632713835523", + "2164431341473769361720", + "823161732441052866298" + ], + "redemptionFee": "1115259524835195349", + "reserves": [ + "2222290994982169074333890", + "6557440475691647561292812", + "2493880937186029243538939" + ], + "mAssetSupply": "11259391530975373664386356" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "27744279367341353992192", + "outputIndex": 1, + "expectedQty": "28034717527392457034996", + "swapFee": "16725025110633706053", + "reserves": [ + "2222290994982169074333890", + "6529405758164255104257816", + "2521625216553370597531131" + ], + "mAssetSupply": "11259408256000484298092409", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "66497874436608153878528", + "expectedQty": "66943922470213726860559", + "reserves": [ + "2288788869418777228212418", + "6529405758164255104257816", + "2521625216553370597531131" + ] + }, + { + "type": "redeemMasset", + "inputQty": "42778549449420971389747", + "expectedQtys": [ + "8641943404816740092798", + "24653543095685025619738", + "9521080210053124599811" + ], + "redemptionFee": "12833564834826291416", + "reserves": [ + "2280146926013960488119620", + "6504752215068570078638078", + "2512104136343317472931320" + ], + "mAssetSupply": "11283586462586111879854637" + }, + { + "type": "mintMulti", + "inputQtys": [ + "72924996141066674176", + "2610408488017192960", + "4560305431174331392" + ], + "expectedQty": "80571802944130401747", + "reserves": [ + "2280219851010101554793796", + "6504754825477058095831038", + "2512108696648748647262712" + ], + "mAssetSupply": "11283667034389056010256384" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "80086277263270395904", + "274084131519848218624", + "720740761028219264" + ], + "expectedQty": "353731962534506695086", + "swapFee": "212366597479191531", + "reserves": [ + "2280139764732838284397892", + "6504480741345538247612414", + "2512107975907987619043448" + ], + "mAssetSupply": "11283313302426521503561298" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "1007169083700320241975296", + "299176736478277721391104", + "474187104246107817902080" + ], + "expectedQty": "1792605925496218170380620", + "swapFee": "1076209280866250652619", + "reserves": [ + "1272970681032518042422596", + "6205304004867260526221310", + "2037920871661879801141368" + ], + "mAssetSupply": "9490707376930303333180678" + }, + { + "type": "redeemMasset", + "inputQty": "7781017044710064128", + "expectedQtys": [ + "1043340045298391616", + "5085931874155327826", + "1670301198790868675" + ], + "redemptionFee": "2334305113413019", + "reserves": [ + "1272969637692472744030980", + "6205298918935386370893484", + "2037919201360681010272693" + ], + "mAssetSupply": "9490699598247563736529569" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "157722652094670412185600", + "236859317664397419085824", + "154673058908341440348160" + ], + "expectedQty": "551345946805465839769677", + "swapFee": "331006171786351314650", + "reserves": [ + "1115246985597802331845380", + "5968439601270988951807660", + "1883246142452339569924533" + ], + "mAssetSupply": "8939353651442097896759892" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "1077065453544859893760", + "expectedQty": "1064514204517026746047", + "reserves": [ + "1115246985597802331845380", + "5969516666724533811701420", + "1883246142452339569924533" + ] + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "117592968511631151595520", + "expectedQty": "116616387544818894323173", + "swapFee": "70555781106978690957", + "reserves": [ + "1115246985597802331845380", + "5969516666724533811701420", + "1766629754907520675601360" + ], + "mAssetSupply": "8822895752916090750601376" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "84841783274341352341504", + "115456751558910447452160", + "183701926149258246881280" + ], + "expectedQty": "386645228029495421380125", + "swapFee": "232126412665296430686", + "reserves": [ + "1030405202323460979503876", + "5854059915165623364249260", + "1582927828758262428720080" + ], + "mAssetSupply": "8436250524886595329221251" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "23455628750610067619840", + "outputIndex": 1, + "expectedQty": "24016435111127788184540", + "swapFee": "14226731669308432324", + "reserves": [ + "1030405202323460979503876", + "5830043480054495576064720", + "1606383457508872496339920" + ], + "mAssetSupply": "8436264751618264637653575", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeem", + "inputIndex": 1, + "inputQty": "1701876139838482321244160", + "expectedQty": "1719015988040708933203062", + "swapFee": "1021125683903089392746", + "reserves": [ + "1030405202323460979503876", + "4111027492013786642861658", + "1606383457508872496339920" + ], + "mAssetSupply": "6735409737463685405802161" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "2012307768815537094656", + "expectedQty": "2019558122603942107391", + "reserves": [ + "1030405202323460979503876", + "4111027492013786642861658", + "1608395765277688033434576" + ] + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "178113383824631201792", + "outputIndex": 1, + "expectedQty": "182003381441958591554", + "swapFee": "108393535116040236", + "reserves": [ + "1030583315707285610705668", + "4110845488632344684270104", + "1608395765277688033434576" + ], + "mAssetSupply": "6737429403979824463949788", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mintMulti", + "inputQtys": [ + "610417500926156566691840", + "1435648899744822942760960", + "595337380972156332015616" + ], + "expectedQty": "2640182060869153036515720", + "reserves": [ + "1641000816633442177397508", + "5546494388377167627031064", + "2203733146249844365450192" + ], + "mAssetSupply": "9377611464848977500465508" + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "329823967768117706752", + "expectedQty": "327550521743329575196", + "reserves": [ + "1641000816633442177397508", + "5546824212344935744737816", + "2203733146249844365450192" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "778703813423478670884864", + "336300575891834372358144", + "555988608222827361861632" + ], + "expectedQty": "1684683204244682619577295", + "swapFee": "1011416772610375797224", + "reserves": [ + "862297003209963506512644", + "5210523636453101372379672", + "1647744538027017003588560" + ], + "mAssetSupply": "7693255811126038210463409" + }, + { + "type": "redeemBassets", + "inputQtys": [ + "21246592409485332", + "118031323729715392", + "117766338337406528" + ], + "expectedQty": "257033986438627448", + "swapFee": "154312979650967", + "reserves": [ + "862296981963371097027312", + "5210523518421777642664280", + "1647744420260678666182032" + ], + "mAssetSupply": "7693255554092051771835961" + }, + { + "type": "mint", + "inputIndex": 2, + "inputQty": "532302322661583908503552", + "expectedQty": "534335593707293779997208", + "reserves": [ + "862296981963371097027312", + "5210523518421777642664280", + "2180046742922262574685584" + ] + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "3427431940015150730313728", + "hardLimitError": true + }, + { + "type": "mintMulti", + "inputQtys": [ + "22840319556047278702592", + "208313487341895689437184", + "105975241759318234628096" + ], + "expectedQty": "335736851908445274932050", + "reserves": [ + "885137301519418375729904", + "5418837005763673332101464", + "2286021984681580809313680" + ], + "mAssetSupply": "8563327999707790826765219" + }, + { + "type": "redeemMasset", + "inputQty": "283034887487408884940", + "expectedQtys": [ + "29246757701449661524", + "179049524473963530035", + "75534870094617178679" + ], + "redemptionFee": "84910466246222665", + "reserves": [ + "885108054761716926068380", + "5418657956239199368571429", + "2285946449811486192135001" + ], + "mAssetSupply": "8563045049730769664102944" + }, + { + "type": "mint", + "inputIndex": 0, + "inputQty": "167298545495576182784", + "expectedQty": "173232324812953997202", + "reserves": [ + "885275353307212502251164", + "5418657956239199368571429", + "2285946449811486192135001" + ] + }, + { + "type": "redeem", + "inputIndex": 0, + "inputQty": "63948933607080975138816", + "expectedQty": "61563188335711803450321", + "swapFee": "38369360164248585083", + "reserves": [ + "823712164971500698800843", + "5418657956239199368571429", + "2285946449811486192135001" + ], + "mAssetSupply": "8499307717808665891546413" + }, + { + "type": "redeemMasset", + "inputQty": "689478124769262855782", + "expectedQtys": [ + "66800868758862487193", + "439438768026965445122", + "185384185492669083309" + ], + "redemptionFee": "206843437430778856", + "reserves": [ + "823645364102741836313650", + "5418218517471172403126307", + "2285761065625993523051692" + ], + "mAssetSupply": "8498618446527334059469487" + }, + { + "type": "redeemMasset", + "inputQty": "728430778336682180608", + "expectedQtys": [ + "70574840702696688599", + "464265235292734488688", + "195857622857764246030" + ], + "redemptionFee": "218529233501004654", + "reserves": [ + "823574789262039139625051", + "5417754252235879668637619", + "2285565208003135758805662" + ], + "mAssetSupply": "8497890234278230878293533" + }, + { + "type": "redeemMasset", + "inputQty": "145069190424394598658867", + "expectedQtys": [ + "14055192764436825701450", + "92459824363679602891770", + "39005637366533349013942" + ], + "redemptionFee": "43520757127318379597", + "reserves": [ + "809519596497602313923601", + "5325294427872200065745849", + "2246559570636602409791720" + ], + "mAssetSupply": "8352864564610963598014263" + }, + { + "type": "swap", + "inputIndex": 0, + "inputQty": "258900394266450236276736", + "outputIndex": 2, + "expectedQty": "266005727002437978633769", + "swapFee": "160151545824754648752", + "reserves": [ + "1068419990764052550200337", + "5325294427872200065745849", + "1980553843634164431157951" + ], + "mAssetSupply": "8353024716156788352663015", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "mint", + "inputIndex": 1, + "inputQty": "2450226992579134095360", + "expectedQty": "2425777213590348150120", + "reserves": [ + "1068419990764052550200337", + "5327744654864779199841209", + "1980553843634164431157951" + ] + }, + { + "type": "redeemBassets", + "inputQtys": [ + "9488571908290083028992", + "6437382599435136008192", + "10212587236063904268288" + ], + "expectedQty": "26330782198948881703373", + "swapFee": "15807954091824423676", + "reserves": [ + "1058931418855762467171345", + "5321307272265344063833017", + "1970341256398100526889663" + ], + "mAssetSupply": "8329119711171429819109762" + }, + { + "type": "swap", + "inputIndex": 2, + "inputQty": "115447724213879340793856", + "outputIndex": 1, + "expectedQty": "116899117334945199192315", + "swapFee": "69506895503247804825", + "reserves": [ + "1058931418855762467171345", + "5204408154930398864640702", + "2085788980611979867683519" + ], + "mAssetSupply": "8329189218066933066914587", + "hardLimitError": false, + "insufficientLiquidityError": false + }, + { + "type": "redeemBassets", + "inputQtys": [ + "13426645720632215470080", + "32586969545503804489728", + "4858202670983985233920" + ], + "expectedQty": "50878307966845106823264", + "swapFee": "30545311967287436555", + "reserves": [ + "1045504773135130251701265", + "5171821185384895060150974", + "2080930777940995882449599" + ], + "mAssetSupply": "8278310910100087960091323" + }, + { + "type": "redeem", + "inputIndex": 2, + "inputQty": "1060047634790708890566656", + "expectedQty": "1049321996510545843496137", + "swapFee": "636028580874425334339", + "reserves": [ + "1045504773135130251701265", + "5171821185384895060150974", + "1031608781430450038953462" + ], + "mAssetSupply": "7218899303890253494859006" + } + ] +} \ No newline at end of file diff --git a/test-utils/validator-data/sample/mintMultiTestData.json b/test-utils/validator-data/sample/mintMultiTestData.json new file mode 100644 index 00000000..c8f30f60 --- /dev/null +++ b/test-utils/validator-data/sample/mintMultiTestData.json @@ -0,0 +1,1190 @@ +[ + { + "reserve0": "5503000000000000000000000", + "reserve1": "500500000000000000000000", + "reserve2": "3996499999999999360000000", + "A": 120, + "mAssetSupply": "9936488013915504712820075", + "hardMin": 50000000000000000, + "hardMax": 750000000000000000, + "swapFeeRate": 600000000000000, + "mints": [ + { + "bAssetQtys": [ + "3333333333333", + "3333333333333", + "3333333333333" + ], + "expectedQty": "10385912127727" + }, + { + "bAssetQtys": [ + "333333333333333", + "333333333333333", + "333333333333333" + ], + "expectedQty": "1038591212748137" + }, + { + "bAssetQtys": [ + "33333333333333332", + "33333333333333332", + "33333333333333332" + ], + "expectedQty": "103859121028758490" + }, + { + "bAssetQtys": [ + "333333333333333312", + "333333333333333312", + "333333333333333312" + ], + "expectedQty": "1038591187918937221" + }, + { + "bAssetQtys": [ + "3333333333333333504", + "3333333333333333504", + "3333333333333333504" + ], + "expectedQty": "10385909642338954743" + }, + { + "bAssetQtys": [ + "33333333333333336064", + "33333333333333336064", + "33333333333333336064" + ], + "expectedQty": "103858872752693091205" + }, + { + "bAssetQtys": [ + "233066666666666672259072", + "233066666666666672259072", + "233066666666666672259072" + ], + "expectedQty": "717819511157338147988270" + }, + { + "bAssetQtys": [ + "466133333333333344518144", + "466133333333333344518144", + "466133333333333344518144" + ], + "expectedQty": "1426858395787741341108746" + }, + { + "bAssetQtys": [ + "699200000000000050331648", + "699200000000000050331648", + "699200000000000050331648" + ], + "expectedQty": "2132169018987193819175100" + }, + { + "bAssetQtys": [ + "932266666666666689036288", + "932266666666666689036288", + "932266666666666689036288" + ], + "expectedQty": "2835548601135555974061802" + }, + { + "bAssetQtys": [ + "1165333333333333193523200", + "1165333333333333193523200", + "1165333333333333193523200" + ], + "expectedQty": "3537797483589527161733747" + }, + { + "bAssetQtys": [ + "1398400000000000100663296", + "1398400000000000100663296", + "1398400000000000100663296" + ], + "expectedQty": "4239326362763222019077212" + }, + { + "bAssetQtys": [ + "1631466666666666739367936", + "1631466666666666739367936", + "1631466666666666739367936" + ], + "expectedQty": "4940367822219734927726353" + }, + { + "bAssetQtys": [ + "1864533333333333378072576", + "1864533333333333378072576", + "1864533333333333378072576" + ], + "expectedQty": "5641063534359531162361781" + }, + { + "bAssetQtys": [ + "2097600000000000016777216", + "2097600000000000016777216", + "2097600000000000016777216" + ], + "expectedQty": "6341504785730401684633876" + }, + { + "bAssetQtys": [ + "2330666666666666387046400", + "2330666666666666387046400", + "2330666666666666387046400" + ], + "expectedQty": "7041753089676310563468007" + }, + { + "bAssetQtys": [ + "3333333333333", + "3333333333333", + "3333333333333" + ], + "expectedQty": "10385912127727" + }, + { + "bAssetQtys": [ + "333333333333333", + "333333333333333", + "333333333333333" + ], + "expectedQty": "1038591212748137" + }, + { + "bAssetQtys": [ + "33333333333333332", + "33333333333333332", + "33333333333333332" + ], + "expectedQty": "103859121028758490" + }, + { + "bAssetQtys": [ + "333333333333333312", + "333333333333333312", + "333333333333333312" + ], + "expectedQty": "1038591187918937221" + }, + { + "bAssetQtys": [ + "3333333333333333504", + "3333333333333333504", + "3333333333333333504" + ], + "expectedQty": "10385909642338954743" + }, + { + "bAssetQtys": [ + "33333333333333336064", + "33333333333333336064", + "33333333333333336064" + ], + "expectedQty": "103858872752693091205" + }, + { + "bAssetQtys": [ + "233066666666666672259072", + "233066666666666672259072", + "233066666666666672259072" + ], + "expectedQty": "717819511157338147988270" + }, + { + "bAssetQtys": [ + "466133333333333344518144", + "466133333333333344518144", + "466133333333333344518144" + ], + "expectedQty": "1426858395787741341108746" + }, + { + "bAssetQtys": [ + "699200000000000050331648", + "699200000000000050331648", + "699200000000000050331648" + ], + "expectedQty": "2132169018987193819175100" + }, + { + "bAssetQtys": [ + "932266666666666689036288", + "932266666666666689036288", + "932266666666666689036288" + ], + "expectedQty": "2835548601135555974061802" + }, + { + "bAssetQtys": [ + "1165333333333333193523200", + "1165333333333333193523200", + "1165333333333333193523200" + ], + "expectedQty": "3537797483589527161733747" + }, + { + "bAssetQtys": [ + "1398400000000000100663296", + "1398400000000000100663296", + "1398400000000000100663296" + ], + "expectedQty": "4239326362763222019077212" + }, + { + "bAssetQtys": [ + "1631466666666666739367936", + "1631466666666666739367936", + "1631466666666666739367936" + ], + "expectedQty": "4940367822219734927726353" + }, + { + "bAssetQtys": [ + "1864533333333333378072576", + "1864533333333333378072576", + "1864533333333333378072576" + ], + "expectedQty": "5641063534359531162361781" + }, + { + "bAssetQtys": [ + "2097600000000000016777216", + "2097600000000000016777216", + "2097600000000000016777216" + ], + "expectedQty": "6341504785730401684633876" + }, + { + "bAssetQtys": [ + "2330666666666666387046400", + "2330666666666666387046400", + "2330666666666666387046400" + ], + "expectedQty": "7041753089676310563468007" + }, + { + "bAssetQtys": [ + "3333333333333", + "3333333333333", + "3333333333333" + ], + "expectedQty": "10385912127727" + }, + { + "bAssetQtys": [ + "333333333333333", + "333333333333333", + "333333333333333" + ], + "expectedQty": "1038591212748137" + }, + { + "bAssetQtys": [ + "33333333333333332", + "33333333333333332", + "33333333333333332" + ], + "expectedQty": "103859121028758490" + }, + { + "bAssetQtys": [ + "333333333333333312", + "333333333333333312", + "333333333333333312" + ], + "expectedQty": "1038591187918937221" + }, + { + "bAssetQtys": [ + "3333333333333333504", + "3333333333333333504", + "3333333333333333504" + ], + "expectedQty": "10385909642338954743" + }, + { + "bAssetQtys": [ + "33333333333333336064", + "33333333333333336064", + "33333333333333336064" + ], + "expectedQty": "103858872752693091205" + }, + { + "bAssetQtys": [ + "233066666666666672259072", + "233066666666666672259072", + "233066666666666672259072" + ], + "expectedQty": "717819511157338147988270" + }, + { + "bAssetQtys": [ + "466133333333333344518144", + "466133333333333344518144", + "466133333333333344518144" + ], + "expectedQty": "1426858395787741341108746" + }, + { + "bAssetQtys": [ + "699200000000000050331648", + "699200000000000050331648", + "699200000000000050331648" + ], + "expectedQty": "2132169018987193819175100" + }, + { + "bAssetQtys": [ + "932266666666666689036288", + "932266666666666689036288", + "932266666666666689036288" + ], + "expectedQty": "2835548601135555974061802" + }, + { + "bAssetQtys": [ + "1165333333333333193523200", + "1165333333333333193523200", + "1165333333333333193523200" + ], + "expectedQty": "3537797483589527161733747" + }, + { + "bAssetQtys": [ + "1398400000000000100663296", + "1398400000000000100663296", + "1398400000000000100663296" + ], + "expectedQty": "4239326362763222019077212" + }, + { + "bAssetQtys": [ + "1631466666666666739367936", + "1631466666666666739367936", + "1631466666666666739367936" + ], + "expectedQty": "4940367822219734927726353" + }, + { + "bAssetQtys": [ + "1864533333333333378072576", + "1864533333333333378072576", + "1864533333333333378072576" + ], + "expectedQty": "5641063534359531162361781" + }, + { + "bAssetQtys": [ + "2097600000000000016777216", + "2097600000000000016777216", + "2097600000000000016777216" + ], + "expectedQty": "6341504785730401684633876" + }, + { + "bAssetQtys": [ + "2330666666666666387046400", + "2330666666666666387046400", + "2330666666666666387046400" + ], + "expectedQty": "7041753089676310563468007" + } + ] + }, + { + "reserve0": "2007000000000000000000000", + "reserve1": "500500000000000000000000", + "reserve2": "7492500000000000000000000", + "A": 120, + "mAssetSupply": "9896372713490403790662354", + "hardMin": 50000000000000000, + "hardMax": 750000000000000000, + "swapFeeRate": 600000000000000, + "mints": [ + { + "bAssetQtys": [ + "3333333333333", + "3333333333333", + "3333333333333" + ], + "expectedQty": "10616212599789" + }, + { + "bAssetQtys": [ + "333333333333333", + "333333333333333", + "333333333333333" + ], + "expectedQty": "1061621259940193" + }, + { + "bAssetQtys": [ + "33333333333333332", + "33333333333333332", + "33333333333333332" + ], + "expectedQty": "106162125606333410" + }, + { + "bAssetQtys": [ + "333333333333333312", + "333333333333333312", + "333333333333333312" + ], + "expectedQty": "1061621220819182343" + }, + { + "bAssetQtys": [ + "3333333333333333504", + "3333333333333333504", + "3333333333333333504" + ], + "expectedQty": "10616208683798909905" + }, + { + "bAssetQtys": [ + "33333333333333336064", + "33333333333333336064", + "33333333333333336064" + ], + "expectedQty": "106161734420953940818" + }, + { + "bAssetQtys": [ + "233066666666666672259072", + "233066666666666672259072", + "233066666666666672259072" + ], + "expectedQty": "729045507934045981147445" + }, + { + "bAssetQtys": [ + "466133333333333344518144", + "466133333333333344518144", + "466133333333333344518144" + ], + "expectedQty": "1444093165885337491540905" + }, + { + "bAssetQtys": [ + "699200000000000050331648", + "699200000000000050331648", + "699200000000000050331648" + ], + "expectedQty": "2153151422959607051690973" + }, + { + "bAssetQtys": [ + "932266666666666689036288", + "932266666666666689036288", + "932266666666666689036288" + ], + "expectedQty": "2859096981577989191295531" + }, + { + "bAssetQtys": [ + "1165333333333333193523200", + "1165333333333333193523200", + "1165333333333333193523200" + ], + "expectedQty": "3563217561037023690548355" + }, + { + "bAssetQtys": [ + "1398400000000000100663296", + "1398400000000000100663296", + "1398400000000000100663296" + ], + "expectedQty": "4266175833285971337758877" + }, + { + "bAssetQtys": [ + "1631466666666666739367936", + "1631466666666666739367936", + "1631466666666666739367936" + ], + "expectedQty": "4968347620679184766532063" + }, + { + "bAssetQtys": [ + "1864533333333333378072576", + "1864533333333333378072576", + "1864533333333333378072576" + ], + "expectedQty": "5669961970717048793425226" + }, + { + "bAssetQtys": [ + "2097600000000000016777216", + "2097600000000000016777216", + "2097600000000000016777216" + ], + "expectedQty": "6371166461806356373525737" + }, + { + "bAssetQtys": [ + "2330666666666666387046400", + "2330666666666666387046400", + "2330666666666666387046400" + ], + "expectedQty": "7072060493137874105294090" + }, + { + "bAssetQtys": [ + "3333333333333", + "3333333333333", + "3333333333333" + ], + "expectedQty": "10616212599789" + }, + { + "bAssetQtys": [ + "333333333333333", + "333333333333333", + "333333333333333" + ], + "expectedQty": "1061621259940193" + }, + { + "bAssetQtys": [ + "33333333333333332", + "33333333333333332", + "33333333333333332" + ], + "expectedQty": "106162125606333410" + }, + { + "bAssetQtys": [ + "333333333333333312", + "333333333333333312", + "333333333333333312" + ], + "expectedQty": "1061621220819182343" + }, + { + "bAssetQtys": [ + "3333333333333333504", + "3333333333333333504", + "3333333333333333504" + ], + "expectedQty": "10616208683798909905" + }, + { + "bAssetQtys": [ + "33333333333333336064", + "33333333333333336064", + "33333333333333336064" + ], + "expectedQty": "106161734420953940818" + }, + { + "bAssetQtys": [ + "233066666666666672259072", + "233066666666666672259072", + "233066666666666672259072" + ], + "expectedQty": "729045507934045981147445" + }, + { + "bAssetQtys": [ + "466133333333333344518144", + "466133333333333344518144", + "466133333333333344518144" + ], + "expectedQty": "1444093165885337491540905" + }, + { + "bAssetQtys": [ + "699200000000000050331648", + "699200000000000050331648", + "699200000000000050331648" + ], + "expectedQty": "2153151422959607051690973" + }, + { + "bAssetQtys": [ + "932266666666666689036288", + "932266666666666689036288", + "932266666666666689036288" + ], + "expectedQty": "2859096981577989191295531" + }, + { + "bAssetQtys": [ + "1165333333333333193523200", + "1165333333333333193523200", + "1165333333333333193523200" + ], + "expectedQty": "3563217561037023690548355" + }, + { + "bAssetQtys": [ + "1398400000000000100663296", + "1398400000000000100663296", + "1398400000000000100663296" + ], + "expectedQty": "4266175833285971337758877" + }, + { + "bAssetQtys": [ + "1631466666666666739367936", + "1631466666666666739367936", + "1631466666666666739367936" + ], + "expectedQty": "4968347620679184766532063" + }, + { + "bAssetQtys": [ + "1864533333333333378072576", + "1864533333333333378072576", + "1864533333333333378072576" + ], + "expectedQty": "5669961970717048793425226" + }, + { + "bAssetQtys": [ + "2097600000000000016777216", + "2097600000000000016777216", + "2097600000000000016777216" + ], + "expectedQty": "6371166461806356373525737" + }, + { + "bAssetQtys": [ + "2330666666666666387046400", + "2330666666666666387046400", + "2330666666666666387046400" + ], + "expectedQty": "7072060493137874105294090" + }, + { + "bAssetQtys": [ + "3333333333333", + "3333333333333", + "3333333333333" + ], + "expectedQty": "10616212599789" + }, + { + "bAssetQtys": [ + "333333333333333", + "333333333333333", + "333333333333333" + ], + "expectedQty": "1061621259940193" + }, + { + "bAssetQtys": [ + "33333333333333332", + "33333333333333332", + "33333333333333332" + ], + "expectedQty": "106162125606333410" + }, + { + "bAssetQtys": [ + "333333333333333312", + "333333333333333312", + "333333333333333312" + ], + "expectedQty": "1061621220819182343" + }, + { + "bAssetQtys": [ + "3333333333333333504", + "3333333333333333504", + "3333333333333333504" + ], + "expectedQty": "10616208683798909905" + }, + { + "bAssetQtys": [ + "33333333333333336064", + "33333333333333336064", + "33333333333333336064" + ], + "expectedQty": "106161734420953940818" + }, + { + "bAssetQtys": [ + "233066666666666672259072", + "233066666666666672259072", + "233066666666666672259072" + ], + "expectedQty": "729045507934045981147445" + }, + { + "bAssetQtys": [ + "466133333333333344518144", + "466133333333333344518144", + "466133333333333344518144" + ], + "expectedQty": "1444093165885337491540905" + }, + { + "bAssetQtys": [ + "699200000000000050331648", + "699200000000000050331648", + "699200000000000050331648" + ], + "expectedQty": "2153151422959607051690973" + }, + { + "bAssetQtys": [ + "932266666666666689036288", + "932266666666666689036288", + "932266666666666689036288" + ], + "expectedQty": "2859096981577989191295531" + }, + { + "bAssetQtys": [ + "1165333333333333193523200", + "1165333333333333193523200", + "1165333333333333193523200" + ], + "expectedQty": "3563217561037023690548355" + }, + { + "bAssetQtys": [ + "1398400000000000100663296", + "1398400000000000100663296", + "1398400000000000100663296" + ], + "expectedQty": "4266175833285971337758877" + }, + { + "bAssetQtys": [ + "1631466666666666739367936", + "1631466666666666739367936", + "1631466666666666739367936" + ], + "expectedQty": "4968347620679184766532063" + }, + { + "bAssetQtys": [ + "1864533333333333378072576", + "1864533333333333378072576", + "1864533333333333378072576" + ], + "expectedQty": "5669961970717048793425226" + }, + { + "bAssetQtys": [ + "2097600000000000016777216", + "2097600000000000016777216", + "2097600000000000016777216" + ], + "expectedQty": "6371166461806356373525737" + }, + { + "bAssetQtys": [ + "2330666666666666387046400", + "2330666666666666387046400", + "2330666666666666387046400" + ], + "expectedQty": "7072060493137874105294090" + } + ] + }, + { + "reserve0": "5503000000000000000000000", + "reserve1": "3996499999999999360000000", + "reserve2": "500500000000000000000000", + "A": 120, + "mAssetSupply": "9936488013915504712820075", + "hardMin": 50000000000000000, + "hardMax": 750000000000000000, + "swapFeeRate": 600000000000000, + "mints": [ + { + "bAssetQtys": [ + "3333333333333", + "3333333333333", + "3333333333333" + ], + "expectedQty": "10385912127727" + }, + { + "bAssetQtys": [ + "333333333333333", + "333333333333333", + "333333333333333" + ], + "expectedQty": "1038591212748137" + }, + { + "bAssetQtys": [ + "33333333333333332", + "33333333333333332", + "33333333333333332" + ], + "expectedQty": "103859121028758490" + }, + { + "bAssetQtys": [ + "333333333333333312", + "333333333333333312", + "333333333333333312" + ], + "expectedQty": "1038591187918937221" + }, + { + "bAssetQtys": [ + "3333333333333333504", + "3333333333333333504", + "3333333333333333504" + ], + "expectedQty": "10385909642338954743" + }, + { + "bAssetQtys": [ + "33333333333333336064", + "33333333333333336064", + "33333333333333336064" + ], + "expectedQty": "103858872752693091205" + }, + { + "bAssetQtys": [ + "233066666666666672259072", + "233066666666666672259072", + "233066666666666672259072" + ], + "expectedQty": "717819511157338147988270" + }, + { + "bAssetQtys": [ + "466133333333333344518144", + "466133333333333344518144", + "466133333333333344518144" + ], + "expectedQty": "1426858395787741341108746" + }, + { + "bAssetQtys": [ + "699200000000000050331648", + "699200000000000050331648", + "699200000000000050331648" + ], + "expectedQty": "2132169018987193819175100" + }, + { + "bAssetQtys": [ + "932266666666666689036288", + "932266666666666689036288", + "932266666666666689036288" + ], + "expectedQty": "2835548601135555974061802" + }, + { + "bAssetQtys": [ + "1165333333333333193523200", + "1165333333333333193523200", + "1165333333333333193523200" + ], + "expectedQty": "3537797483589527161733747" + }, + { + "bAssetQtys": [ + "1398400000000000100663296", + "1398400000000000100663296", + "1398400000000000100663296" + ], + "expectedQty": "4239326362763222019077212" + }, + { + "bAssetQtys": [ + "1631466666666666739367936", + "1631466666666666739367936", + "1631466666666666739367936" + ], + "expectedQty": "4940367822219734927726353" + }, + { + "bAssetQtys": [ + "1864533333333333378072576", + "1864533333333333378072576", + "1864533333333333378072576" + ], + "expectedQty": "5641063534359531162361781" + }, + { + "bAssetQtys": [ + "2097600000000000016777216", + "2097600000000000016777216", + "2097600000000000016777216" + ], + "expectedQty": "6341504785730401684633876" + }, + { + "bAssetQtys": [ + "2330666666666666387046400", + "2330666666666666387046400", + "2330666666666666387046400" + ], + "expectedQty": "7041753089676310563468007" + }, + { + "bAssetQtys": [ + "3333333333333", + "3333333333333", + "3333333333333" + ], + "expectedQty": "10385912127727" + }, + { + "bAssetQtys": [ + "333333333333333", + "333333333333333", + "333333333333333" + ], + "expectedQty": "1038591212748137" + }, + { + "bAssetQtys": [ + "33333333333333332", + "33333333333333332", + "33333333333333332" + ], + "expectedQty": "103859121028758490" + }, + { + "bAssetQtys": [ + "333333333333333312", + "333333333333333312", + "333333333333333312" + ], + "expectedQty": "1038591187918937221" + }, + { + "bAssetQtys": [ + "3333333333333333504", + "3333333333333333504", + "3333333333333333504" + ], + "expectedQty": "10385909642338954743" + }, + { + "bAssetQtys": [ + "33333333333333336064", + "33333333333333336064", + "33333333333333336064" + ], + "expectedQty": "103858872752693091205" + }, + { + "bAssetQtys": [ + "233066666666666672259072", + "233066666666666672259072", + "233066666666666672259072" + ], + "expectedQty": "717819511157338147988270" + }, + { + "bAssetQtys": [ + "466133333333333344518144", + "466133333333333344518144", + "466133333333333344518144" + ], + "expectedQty": "1426858395787741341108746" + }, + { + "bAssetQtys": [ + "699200000000000050331648", + "699200000000000050331648", + "699200000000000050331648" + ], + "expectedQty": "2132169018987193819175100" + }, + { + "bAssetQtys": [ + "932266666666666689036288", + "932266666666666689036288", + "932266666666666689036288" + ], + "expectedQty": "2835548601135555974061802" + }, + { + "bAssetQtys": [ + "1165333333333333193523200", + "1165333333333333193523200", + "1165333333333333193523200" + ], + "expectedQty": "3537797483589527161733747" + }, + { + "bAssetQtys": [ + "1398400000000000100663296", + "1398400000000000100663296", + "1398400000000000100663296" + ], + "expectedQty": "4239326362763222019077212" + }, + { + "bAssetQtys": [ + "1631466666666666739367936", + "1631466666666666739367936", + "1631466666666666739367936" + ], + "expectedQty": "4940367822219734927726353" + }, + { + "bAssetQtys": [ + "1864533333333333378072576", + "1864533333333333378072576", + "1864533333333333378072576" + ], + "expectedQty": "5641063534359531162361781" + }, + { + "bAssetQtys": [ + "2097600000000000016777216", + "2097600000000000016777216", + "2097600000000000016777216" + ], + "expectedQty": "6341504785730401684633876" + }, + { + "bAssetQtys": [ + "2330666666666666387046400", + "2330666666666666387046400", + "2330666666666666387046400" + ], + "expectedQty": "7041753089676310563468007" + }, + { + "bAssetQtys": [ + "3333333333333", + "3333333333333", + "3333333333333" + ], + "expectedQty": "10385912127727" + }, + { + "bAssetQtys": [ + "333333333333333", + "333333333333333", + "333333333333333" + ], + "expectedQty": "1038591212748137" + }, + { + "bAssetQtys": [ + "33333333333333332", + "33333333333333332", + "33333333333333332" + ], + "expectedQty": "103859121028758490" + }, + { + "bAssetQtys": [ + "333333333333333312", + "333333333333333312", + "333333333333333312" + ], + "expectedQty": "1038591187918937221" + }, + { + "bAssetQtys": [ + "3333333333333333504", + "3333333333333333504", + "3333333333333333504" + ], + "expectedQty": "10385909642338954743" + }, + { + "bAssetQtys": [ + "33333333333333336064", + "33333333333333336064", + "33333333333333336064" + ], + "expectedQty": "103858872752693091205" + }, + { + "bAssetQtys": [ + "233066666666666672259072", + "233066666666666672259072", + "233066666666666672259072" + ], + "expectedQty": "717819511157338147988270" + }, + { + "bAssetQtys": [ + "466133333333333344518144", + "466133333333333344518144", + "466133333333333344518144" + ], + "expectedQty": "1426858395787741341108746" + }, + { + "bAssetQtys": [ + "699200000000000050331648", + "699200000000000050331648", + "699200000000000050331648" + ], + "expectedQty": "2132169018987193819175100" + }, + { + "bAssetQtys": [ + "932266666666666689036288", + "932266666666666689036288", + "932266666666666689036288" + ], + "expectedQty": "2835548601135555974061802" + }, + { + "bAssetQtys": [ + "1165333333333333193523200", + "1165333333333333193523200", + "1165333333333333193523200" + ], + "expectedQty": "3537797483589527161733747" + }, + { + "bAssetQtys": [ + "1398400000000000100663296", + "1398400000000000100663296", + "1398400000000000100663296" + ], + "expectedQty": "4239326362763222019077212" + }, + { + "bAssetQtys": [ + "1631466666666666739367936", + "1631466666666666739367936", + "1631466666666666739367936" + ], + "expectedQty": "4940367822219734927726353" + }, + { + "bAssetQtys": [ + "1864533333333333378072576", + "1864533333333333378072576", + "1864533333333333378072576" + ], + "expectedQty": "5641063534359531162361781" + }, + { + "bAssetQtys": [ + "2097600000000000016777216", + "2097600000000000016777216", + "2097600000000000016777216" + ], + "expectedQty": "6341504785730401684633876" + }, + { + "bAssetQtys": [ + "2330666666666666387046400", + "2330666666666666387046400", + "2330666666666666387046400" + ], + "expectedQty": "7041753089676310563468007" + } + ] + } +] \ No newline at end of file diff --git a/test-utils/validator-data/sample/mintTestData.json b/test-utils/validator-data/sample/mintTestData.json new file mode 100644 index 00000000..2f437395 --- /dev/null +++ b/test-utils/validator-data/sample/mintTestData.json @@ -0,0 +1,562 @@ +[ + { + "reserve0": "5503000000000000000000000", + "reserve1": "500500000000000000000000", + "reserve2": "3996499999999999360000000", + "A": 120, + "mAssetSupply": "9936488013915504712820075", + "hardMin": 50000000000000000, + "hardMax": 750000000000000000, + "swapFeeRate": 600000000000000, + "mints": [ + { + "bAssetIndex": 0, + "bAssetQty": "10000000000000", + "expectedQty": "9832251954605", + "priceReceived": 1.0170609994708724 + }, + { + "bAssetIndex": 0, + "bAssetQty": "1000000000000000", + "expectedQty": "983225195458701", + "priceReceived": 1.0170609994727333 + }, + { + "bAssetIndex": 0, + "bAssetQty": "100000000000000000", + "expectedQty": "98322519528556775", + "priceReceived": 1.0170609996518245 + }, + { + "bAssetIndex": 0, + "bAssetQty": "1000000000000000000", + "expectedQty": "983225193711637753", + "priceReceived": 1.0170610012799184 + }, + { + "bAssetIndex": 0, + "bAssetQty": "10000000000000000000", + "expectedQty": "9832251779723363751", + "priceReceived": 1.0170610175608579 + }, + { + "bAssetIndex": 0, + "bAssetQty": "100000000000000000000", + "expectedQty": "98322502057917477303", + "priceReceived": 1.0170611803704344 + }, + { + "bAssetIndex": 0, + "bAssetQty": "699200000000000050331648", + "hardLimitError": true + }, + { + "bAssetIndex": 0, + "bAssetQty": "1398400000000000100663296", + "hardLimitError": true + }, + { + "bAssetIndex": 0, + "bAssetQty": "2097600000000000016777216", + "hardLimitError": true + }, + { + "bAssetIndex": 0, + "bAssetQty": "2796800000000000201326592", + "hardLimitError": true + }, + { + "bAssetIndex": 0, + "bAssetQty": "3496000000000000117440512", + "hardLimitError": true + }, + { + "bAssetIndex": 0, + "bAssetQty": "4195200000000000033554432", + "hardLimitError": true + }, + { + "bAssetIndex": 0, + "bAssetQty": "4894399999999999949668352", + "hardLimitError": true + }, + { + "bAssetIndex": 0, + "bAssetQty": "5593600000000000402653184", + "hardLimitError": true + }, + { + "bAssetIndex": 0, + "bAssetQty": "6292799999999999781896192", + "hardLimitError": true + }, + { + "bAssetIndex": 0, + "bAssetQty": "6992000000000000234881024", + "hardLimitError": true + }, + { + "bAssetIndex": 1, + "bAssetQty": "10000000000000", + "expectedQty": "11432866386092", + "priceReceived": 0.8746712908466182 + }, + { + "bAssetIndex": 1, + "bAssetQty": "1000000000000000", + "expectedQty": "1143286638334208", + "priceReceived": 0.8746712910570007 + }, + { + "bAssetIndex": 1, + "bAssetQty": "100000000000000000", + "expectedQty": "114328661083569904", + "priceReceived": 0.8746713120947319 + }, + { + "bAssetIndex": 1, + "bAssetQty": "1000000000000000000", + "expectedQty": "1143286360849746210", + "priceReceived": 0.874671503346503 + }, + { + "bAssetIndex": 1, + "bAssetQty": "10000000000000000000", + "expectedQty": "11432838610381658208", + "priceReceived": 0.8746734158321311 + }, + { + "bAssetIndex": 1, + "bAssetQty": "100000000000000000000", + "expectedQty": "114325886771621960149", + "priceReceived": 0.8746925374806894 + }, + { + "bAssetIndex": 1, + "bAssetQty": "699200000000000050331648", + "expectedQty": "741678171179218686429800", + "priceReceived": 0.9427269497338971 + }, + { + "bAssetIndex": 1, + "bAssetQty": "1398400000000000100663296", + "expectedQty": "1452105731306633575856596", + "priceReceived": 0.9630152748875194 + }, + { + "bAssetIndex": 1, + "bAssetQty": "2097600000000000016777216", + "expectedQty": "2156200194980878262700900", + "priceReceived": 0.9728224702338467 + }, + { + "bAssetIndex": 1, + "bAssetQty": "2796800000000000201326592", + "expectedQty": "2857835872184337931168178", + "priceReceived": 0.9786426250792051 + }, + { + "bAssetIndex": 1, + "bAssetQty": "3496000000000000117440512", + "expectedQty": "3558180045961155437097768", + "priceReceived": 0.9825247612099519 + }, + { + "bAssetIndex": 1, + "bAssetQty": "4195200000000000033554432", + "expectedQty": "4257701656529446269530387", + "priceReceived": 0.9853203297056767 + }, + { + "bAssetIndex": 1, + "bAssetQty": "4894399999999999949668352", + "expectedQty": "4956622542256418842610799", + "priceReceived": 0.9874465844986265 + }, + { + "bAssetIndex": 1, + "bAssetQty": "5593600000000000402653184", + "expectedQty": "5655058851205474401832123", + "priceReceived": 0.9891320580700282 + }, + { + "bAssetIndex": 1, + "bAssetQty": "6292799999999999781896192", + "expectedQty": "6353075328572007239119684", + "priceReceived": 0.9905124171437212 + }, + { + "bAssetIndex": 1, + "bAssetQty": "6992000000000000234881024", + "expectedQty": "7050709272680501025142512", + "priceReceived": 0.9916732813097283 + }, + { + "bAssetIndex": 2, + "bAssetQty": "10000000000000", + "expectedQty": "9892618042466", + "priceReceived": 1.0108547562508774 + }, + { + "bAssetIndex": 2, + "bAssetQty": "1000000000000000", + "expectedQty": "989261804244580", + "priceReceived": 1.0108547562529415 + }, + { + "bAssetIndex": 2, + "bAssetQty": "100000000000000000", + "expectedQty": "98926180404884481", + "priceReceived": 1.010854756452949 + }, + { + "bAssetIndex": 2, + "bAssetQty": "1000000000000000000", + "expectedQty": "989261802269436564", + "priceReceived": 1.010854758271197 + }, + { + "bAssetIndex": 2, + "bAssetQty": "10000000000000000000", + "expectedQty": "9892617844753675832", + "priceReceived": 1.0108547764536635 + }, + { + "bAssetIndex": 2, + "bAssetQty": "100000000000000000000", + "expectedQty": "98926160653601652020", + "priceReceived": 1.010854958276997 + }, + { + "bAssetIndex": 2, + "bAssetQty": "699200000000000050331648", + "hardLimitError": true + }, + { + "bAssetIndex": 2, + "bAssetQty": "1398400000000000100663296", + "hardLimitError": true + }, + { + "bAssetIndex": 2, + "bAssetQty": "2097600000000000016777216", + "hardLimitError": true + }, + { + "bAssetIndex": 2, + "bAssetQty": "2796800000000000201326592", + "hardLimitError": true + }, + { + "bAssetIndex": 2, + "bAssetQty": "3496000000000000117440512", + "hardLimitError": true + }, + { + "bAssetIndex": 2, + "bAssetQty": "4195200000000000033554432", + "hardLimitError": true + }, + { + "bAssetIndex": 2, + "bAssetQty": "4894399999999999949668352", + "hardLimitError": true + }, + { + "bAssetIndex": 2, + "bAssetQty": "5593600000000000402653184", + "hardLimitError": true + }, + { + "bAssetIndex": 2, + "bAssetQty": "6292799999999999781896192", + "hardLimitError": true + }, + { + "bAssetIndex": 2, + "bAssetQty": "6992000000000000234881024", + "hardLimitError": true + } + ] + }, + { + "reserve0": "2007000000000000000000000", + "reserve1": "500500000000000000000000", + "reserve2": "7492500000000000000000000", + "A": 120, + "mAssetSupply": "9896372713490403790662354", + "hardMin": 50000000000000000, + "hardMax": 750000000000000000, + "swapFeeRate": 600000000000000, + "mints": [ + { + "bAssetIndex": 0, + "bAssetQty": "10000000000000", + "expectedQty": "10143890658606", + "priceReceived": 0.9858150424281314 + }, + { + "bAssetIndex": 0, + "bAssetQty": "1000000000000000", + "expectedQty": "1014389065847321", + "priceReceived": 0.9858150424410363 + }, + { + "bAssetIndex": 0, + "bAssetQty": "100000000000000000", + "expectedQty": "101438906452467690", + "priceReceived": 0.9858150437264234 + }, + { + "bAssetIndex": 0, + "bAssetQty": "1000000000000000000", + "expectedQty": "1014389052500646933", + "priceReceived": 0.9858150554117522 + }, + { + "bAssetIndex": 0, + "bAssetQty": "10000000000000000000", + "expectedQty": "10143889322608810609", + "priceReceived": 0.9858151722645367 + }, + { + "bAssetIndex": 0, + "bAssetQty": "100000000000000000000", + "expectedQty": "101438772991659315644", + "priceReceived": 0.9858163407420394 + }, + { + "bAssetIndex": 0, + "bAssetQty": "699200000000000050331648", + "hardLimitError": true + }, + { + "bAssetIndex": 0, + "bAssetQty": "1398400000000000100663296", + "hardLimitError": true + }, + { + "bAssetIndex": 0, + "bAssetQty": "2097600000000000016777216", + "hardLimitError": true + }, + { + "bAssetIndex": 0, + "bAssetQty": "2796800000000000201326592", + "hardLimitError": true + }, + { + "bAssetIndex": 0, + "bAssetQty": "3496000000000000117440512", + "hardLimitError": true + }, + { + "bAssetIndex": 0, + "bAssetQty": "4195200000000000033554432", + "hardLimitError": true + }, + { + "bAssetIndex": 0, + "bAssetQty": "4894399999999999949668352", + "hardLimitError": true + }, + { + "bAssetIndex": 0, + "bAssetQty": "5593600000000000402653184", + "hardLimitError": true + }, + { + "bAssetIndex": 0, + "bAssetQty": "6292799999999999781896192", + "hardLimitError": true + }, + { + "bAssetIndex": 0, + "bAssetQty": "6992000000000000234881024", + "hardLimitError": true + }, + { + "bAssetIndex": 1, + "bAssetQty": "10000000000000", + "expectedQty": "12016287095094", + "priceReceived": 0.8322038181064092 + }, + { + "bAssetIndex": 1, + "bAssetQty": "1000000000000000", + "expectedQty": "1201628709124981", + "priceReceived": 0.8322038183726437 + }, + { + "bAssetIndex": 1, + "bAssetQty": "100000000000000000", + "expectedQty": "120162867068477766", + "priceReceived": 0.8322038449949146 + }, + { + "bAssetIndex": 1, + "bAssetQty": "1000000000000000000", + "expectedQty": "1201628321229059126", + "priceReceived": 0.8322040870151696 + }, + { + "bAssetIndex": 1, + "bAssetQty": "10000000000000000000", + "expectedQty": "12016248267380638563", + "priceReceived": 0.8322065071796199 + }, + { + "bAssetIndex": 1, + "bAssetQty": "100000000000000000000", + "expectedQty": "120158988844584723142", + "priceReceived": 0.832230705014848 + }, + { + "bAssetIndex": 1, + "bAssetQty": "699200000000000050331648", + "expectedQty": "758915093464738136563169", + "priceReceived": 0.9213151853495023 + }, + { + "bAssetIndex": 1, + "bAssetQty": "1398400000000000100663296", + "expectedQty": "1473400530309341117742129", + "priceReceived": 0.9490969843117983 + }, + { + "bAssetIndex": 1, + "bAssetQty": "2097600000000000016777216", + "expectedQty": "2178783980315529571380871", + "priceReceived": 0.9627388575237401 + }, + { + "bAssetIndex": 1, + "bAssetQty": "2796800000000000201326592", + "expectedQty": "2880620127293826852497696", + "priceReceived": 0.9709020545612271 + }, + { + "bAssetIndex": 1, + "bAssetQty": "3496000000000000117440512", + "expectedQty": "3580589386958113473567706", + "priceReceived": 0.9763755689869884 + }, + { + "bAssetIndex": 1, + "bAssetQty": "4195200000000000033554432", + "expectedQty": "4279368449887122287928618", + "priceReceived": 0.9803315720829454 + }, + { + "bAssetIndex": 1, + "bAssetQty": "4894399999999999949668352", + "expectedQty": "4977278016127211467001887", + "priceReceived": 0.9833487267822547 + }, + { + "bAssetIndex": 1, + "bAssetQty": "5593600000000000402653184", + "expectedQty": "5674486299978109779032834", + "priceReceived": 0.9857456171885689 + }, + { + "bAssetIndex": 1, + "bAssetQty": "6292799999999999781896192", + "expectedQty": "6371087286239571166925768", + "priceReceived": 0.9877120995644404 + }, + { + "bAssetIndex": 1, + "bAssetQty": "6992000000000000234881024", + "expectedQty": "7067135305137869045136995", + "priceReceived": 0.9893683505559537 + }, + { + "bAssetIndex": 2, + "bAssetQty": "10000000000000", + "expectedQty": "9688460045641", + "priceReceived": 1.0321557763454026 + }, + { + "bAssetIndex": 2, + "bAssetQty": "1000000000000000", + "expectedQty": "968846004561237", + "priceReceived": 1.0321557763484526 + }, + { + "bAssetIndex": 2, + "bAssetQty": "100000000000000000", + "expectedQty": "96884600427629503", + "priceReceived": 1.0321557766520142 + }, + { + "bAssetIndex": 2, + "bAssetQty": "1000000000000000000", + "expectedQty": "968846001685919294", + "priceReceived": 1.0321557794116596 + }, + { + "bAssetIndex": 2, + "bAssetQty": "10000000000000000000", + "expectedQty": "9688459757821565729", + "priceReceived": 1.0321558070081187 + }, + { + "bAssetIndex": 2, + "bAssetQty": "100000000000000000000", + "expectedQty": "96884571674398445885", + "priceReceived": 1.0321560829733718 + }, + { + "bAssetIndex": 2, + "bAssetQty": "699200000000000050331648", + "hardLimitError": true + }, + { + "bAssetIndex": 2, + "bAssetQty": "1398400000000000100663296", + "hardLimitError": true + }, + { + "bAssetIndex": 2, + "bAssetQty": "2097600000000000016777216", + "hardLimitError": true + }, + { + "bAssetIndex": 2, + "bAssetQty": "2796800000000000201326592", + "hardLimitError": true + }, + { + "bAssetIndex": 2, + "bAssetQty": "3496000000000000117440512", + "hardLimitError": true + }, + { + "bAssetIndex": 2, + "bAssetQty": "4195200000000000033554432", + "hardLimitError": true + }, + { + "bAssetIndex": 2, + "bAssetQty": "4894399999999999949668352", + "hardLimitError": true + }, + { + "bAssetIndex": 2, + "bAssetQty": "5593600000000000402653184", + "hardLimitError": true + }, + { + "bAssetIndex": 2, + "bAssetQty": "6292799999999999781896192", + "hardLimitError": true + }, + { + "bAssetIndex": 2, + "bAssetQty": "6992000000000000234881024", + "hardLimitError": true + } + ] + } +] \ No newline at end of file diff --git a/test-utils/validator-data/sample/redeemExactTestData.json b/test-utils/validator-data/sample/redeemExactTestData.json new file mode 100644 index 00000000..51ae2ac5 --- /dev/null +++ b/test-utils/validator-data/sample/redeemExactTestData.json @@ -0,0 +1,1337 @@ +[ + { + "reserve0": "5503000000000000000000000", + "reserve1": "500500000000000000000000", + "reserve2": "3996499999999999360000000", + "A": 120, + "mAssetSupply": "9936488013915504712820075", + "hardMin": 50000000000000000, + "hardMax": 750000000000000000, + "swapFeeRate": 600000000000000, + "redeems": [ + { + "bAssetQtys": [ + "3333333333333", + "3333333333333", + "3333333333333" + ], + "mAssetQty": "10392147416180", + "swapFee": "6235288449" + }, + { + "bAssetQtys": [ + "333333333333333", + "333333333333333", + "333333333333333" + ], + "mAssetQty": "1039214741642829", + "swapFee": "623528844985" + }, + { + "bAssetQtys": [ + "33333333333333332", + "33333333333333332", + "33333333333333332" + ], + "mAssetQty": "103921474410486193", + "swapFee": "62352884646291" + }, + { + "bAssetQtys": [ + "333333333333333312", + "333333333333333312", + "333333333333333312" + ], + "mAssetQty": "1039214766486970714", + "swapFee": "623528859892182" + }, + { + "bAssetQtys": [ + "3333333333333333504", + "3333333333333333504", + "3333333333333333504" + ], + "mAssetQty": "10392149903094943109", + "swapFee": "6235289941856965" + }, + { + "bAssetQtys": [ + "33333333333333336064", + "33333333333333336064", + "33333333333333336064" + ], + "mAssetQty": "103921722867828995814", + "swapFee": "62353033720697397" + }, + { + "bAssetQtys": [ + "233066666666666672259072", + "233066666666666672259072", + "233066666666666672259072" + ], + "hardLimitError": true + }, + { + "bAssetQtys": [ + "466133333333333344518144", + "466133333333333344518144", + "466133333333333344518144" + ], + "hardLimitError": true + }, + { + "bAssetQtys": [ + "699200000000000050331648", + "699200000000000050331648", + "699200000000000050331648" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "932266666666666689036288", + "932266666666666689036288", + "932266666666666689036288" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "1165333333333333193523200", + "1165333333333333193523200", + "1165333333333333193523200" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "1398400000000000100663296", + "1398400000000000100663296", + "1398400000000000100663296" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "1631466666666666739367936", + "1631466666666666739367936", + "1631466666666666739367936" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "1864533333333333378072576", + "1864533333333333378072576", + "1864533333333333378072576" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "2097600000000000016777216", + "2097600000000000016777216", + "2097600000000000016777216" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "2330666666666666387046400", + "2330666666666666387046400", + "2330666666666666387046400" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "3333333333333", + "3333333333333", + "3333333333333" + ], + "mAssetQty": "10392147416180", + "swapFee": "6235288449" + }, + { + "bAssetQtys": [ + "333333333333333", + "333333333333333", + "333333333333333" + ], + "mAssetQty": "1039214741642829", + "swapFee": "623528844985" + }, + { + "bAssetQtys": [ + "33333333333333332", + "33333333333333332", + "33333333333333332" + ], + "mAssetQty": "103921474410486193", + "swapFee": "62352884646291" + }, + { + "bAssetQtys": [ + "333333333333333312", + "333333333333333312", + "333333333333333312" + ], + "mAssetQty": "1039214766486970714", + "swapFee": "623528859892182" + }, + { + "bAssetQtys": [ + "3333333333333333504", + "3333333333333333504", + "3333333333333333504" + ], + "mAssetQty": "10392149903094943109", + "swapFee": "6235289941856965" + }, + { + "bAssetQtys": [ + "33333333333333336064", + "33333333333333336064", + "33333333333333336064" + ], + "mAssetQty": "103921722867828995814", + "swapFee": "62353033720697397" + }, + { + "bAssetQtys": [ + "233066666666666672259072", + "233066666666666672259072", + "233066666666666672259072" + ], + "hardLimitError": true + }, + { + "bAssetQtys": [ + "466133333333333344518144", + "466133333333333344518144", + "466133333333333344518144" + ], + "hardLimitError": true + }, + { + "bAssetQtys": [ + "699200000000000050331648", + "699200000000000050331648", + "699200000000000050331648" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "932266666666666689036288", + "932266666666666689036288", + "932266666666666689036288" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "1165333333333333193523200", + "1165333333333333193523200", + "1165333333333333193523200" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "1398400000000000100663296", + "1398400000000000100663296", + "1398400000000000100663296" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "1631466666666666739367936", + "1631466666666666739367936", + "1631466666666666739367936" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "1864533333333333378072576", + "1864533333333333378072576", + "1864533333333333378072576" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "2097600000000000016777216", + "2097600000000000016777216", + "2097600000000000016777216" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "2330666666666666387046400", + "2330666666666666387046400", + "2330666666666666387046400" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "3333333333333", + "3333333333333", + "3333333333333" + ], + "mAssetQty": "10392147416180", + "swapFee": "6235288449" + }, + { + "bAssetQtys": [ + "333333333333333", + "333333333333333", + "333333333333333" + ], + "mAssetQty": "1039214741642829", + "swapFee": "623528844985" + }, + { + "bAssetQtys": [ + "33333333333333332", + "33333333333333332", + "33333333333333332" + ], + "mAssetQty": "103921474410486193", + "swapFee": "62352884646291" + }, + { + "bAssetQtys": [ + "333333333333333312", + "333333333333333312", + "333333333333333312" + ], + "mAssetQty": "1039214766486970714", + "swapFee": "623528859892182" + }, + { + "bAssetQtys": [ + "3333333333333333504", + "3333333333333333504", + "3333333333333333504" + ], + "mAssetQty": "10392149903094943109", + "swapFee": "6235289941856965" + }, + { + "bAssetQtys": [ + "33333333333333336064", + "33333333333333336064", + "33333333333333336064" + ], + "mAssetQty": "103921722867828995814", + "swapFee": "62353033720697397" + }, + { + "bAssetQtys": [ + "233066666666666672259072", + "233066666666666672259072", + "233066666666666672259072" + ], + "hardLimitError": true + }, + { + "bAssetQtys": [ + "466133333333333344518144", + "466133333333333344518144", + "466133333333333344518144" + ], + "hardLimitError": true + }, + { + "bAssetQtys": [ + "699200000000000050331648", + "699200000000000050331648", + "699200000000000050331648" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "932266666666666689036288", + "932266666666666689036288", + "932266666666666689036288" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "1165333333333333193523200", + "1165333333333333193523200", + "1165333333333333193523200" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "1398400000000000100663296", + "1398400000000000100663296", + "1398400000000000100663296" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "1631466666666666739367936", + "1631466666666666739367936", + "1631466666666666739367936" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "1864533333333333378072576", + "1864533333333333378072576", + "1864533333333333378072576" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "2097600000000000016777216", + "2097600000000000016777216", + "2097600000000000016777216" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "2330666666666666387046400", + "2330666666666666387046400", + "2330666666666666387046400" + ], + "insufficientLiquidityError": true + } + ] + }, + { + "reserve0": "2007000000000000000000000", + "reserve1": "500500000000000000000000", + "reserve2": "7492500000000000000000000", + "A": 120, + "mAssetSupply": "9896372713490403790662354", + "hardMin": 50000000000000000, + "hardMax": 750000000000000000, + "swapFeeRate": 600000000000000, + "redeems": [ + { + "bAssetQtys": [ + "3333333333333", + "3333333333333", + "3333333333333" + ], + "mAssetQty": "10622586151486", + "swapFee": "6373551690" + }, + { + "bAssetQtys": [ + "333333333333333", + "333333333333333", + "333333333333333" + ], + "mAssetQty": "1062258615187624", + "swapFee": "637355169112" + }, + { + "bAssetQtys": [ + "33333333333333332", + "33333333333333332", + "33333333333333332" + ], + "mAssetQty": "106225861906681338", + "swapFee": "63735517144008" + }, + { + "bAssetQtys": [ + "333333333333333312", + "333333333333333312", + "333333333333333312" + ], + "mAssetQty": "1062258654332173770", + "swapFee": "637355192599304" + }, + { + "bAssetQtys": [ + "3333333333333333504", + "3333333333333333504", + "3333333333333333504" + ], + "mAssetQty": "10622590069880050646", + "swapFee": "6373554041928030" + }, + { + "bAssetQtys": [ + "33333333333333336064", + "33333333333333336064", + "33333333333333336064" + ], + "mAssetQty": "106226253376904511525", + "swapFee": "63735752026142706" + }, + { + "bAssetQtys": [ + "233066666666666672259072", + "233066666666666672259072", + "233066666666666672259072" + ], + "hardLimitError": true + }, + { + "bAssetQtys": [ + "466133333333333344518144", + "466133333333333344518144", + "466133333333333344518144" + ], + "hardLimitError": true + }, + { + "bAssetQtys": [ + "699200000000000050331648", + "699200000000000050331648", + "699200000000000050331648" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "932266666666666689036288", + "932266666666666689036288", + "932266666666666689036288" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "1165333333333333193523200", + "1165333333333333193523200", + "1165333333333333193523200" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "1398400000000000100663296", + "1398400000000000100663296", + "1398400000000000100663296" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "1631466666666666739367936", + "1631466666666666739367936", + "1631466666666666739367936" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "1864533333333333378072576", + "1864533333333333378072576", + "1864533333333333378072576" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "2097600000000000016777216", + "2097600000000000016777216", + "2097600000000000016777216" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "2330666666666666387046400", + "2330666666666666387046400", + "2330666666666666387046400" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "3333333333333", + "3333333333333", + "3333333333333" + ], + "mAssetQty": "10622586151486", + "swapFee": "6373551690" + }, + { + "bAssetQtys": [ + "333333333333333", + "333333333333333", + "333333333333333" + ], + "mAssetQty": "1062258615187624", + "swapFee": "637355169112" + }, + { + "bAssetQtys": [ + "33333333333333332", + "33333333333333332", + "33333333333333332" + ], + "mAssetQty": "106225861906681338", + "swapFee": "63735517144008" + }, + { + "bAssetQtys": [ + "333333333333333312", + "333333333333333312", + "333333333333333312" + ], + "mAssetQty": "1062258654332173770", + "swapFee": "637355192599304" + }, + { + "bAssetQtys": [ + "3333333333333333504", + "3333333333333333504", + "3333333333333333504" + ], + "mAssetQty": "10622590069880050646", + "swapFee": "6373554041928030" + }, + { + "bAssetQtys": [ + "33333333333333336064", + "33333333333333336064", + "33333333333333336064" + ], + "mAssetQty": "106226253376904511525", + "swapFee": "63735752026142706" + }, + { + "bAssetQtys": [ + "233066666666666672259072", + "233066666666666672259072", + "233066666666666672259072" + ], + "hardLimitError": true + }, + { + "bAssetQtys": [ + "466133333333333344518144", + "466133333333333344518144", + "466133333333333344518144" + ], + "hardLimitError": true + }, + { + "bAssetQtys": [ + "699200000000000050331648", + "699200000000000050331648", + "699200000000000050331648" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "932266666666666689036288", + "932266666666666689036288", + "932266666666666689036288" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "1165333333333333193523200", + "1165333333333333193523200", + "1165333333333333193523200" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "1398400000000000100663296", + "1398400000000000100663296", + "1398400000000000100663296" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "1631466666666666739367936", + "1631466666666666739367936", + "1631466666666666739367936" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "1864533333333333378072576", + "1864533333333333378072576", + "1864533333333333378072576" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "2097600000000000016777216", + "2097600000000000016777216", + "2097600000000000016777216" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "2330666666666666387046400", + "2330666666666666387046400", + "2330666666666666387046400" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "3333333333333", + "3333333333333", + "3333333333333" + ], + "mAssetQty": "10622586151486", + "swapFee": "6373551690" + }, + { + "bAssetQtys": [ + "333333333333333", + "333333333333333", + "333333333333333" + ], + "mAssetQty": "1062258615187624", + "swapFee": "637355169112" + }, + { + "bAssetQtys": [ + "33333333333333332", + "33333333333333332", + "33333333333333332" + ], + "mAssetQty": "106225861906681338", + "swapFee": "63735517144008" + }, + { + "bAssetQtys": [ + "333333333333333312", + "333333333333333312", + "333333333333333312" + ], + "mAssetQty": "1062258654332173770", + "swapFee": "637355192599304" + }, + { + "bAssetQtys": [ + "3333333333333333504", + "3333333333333333504", + "3333333333333333504" + ], + "mAssetQty": "10622590069880050646", + "swapFee": "6373554041928030" + }, + { + "bAssetQtys": [ + "33333333333333336064", + "33333333333333336064", + "33333333333333336064" + ], + "mAssetQty": "106226253376904511525", + "swapFee": "63735752026142706" + }, + { + "bAssetQtys": [ + "233066666666666672259072", + "233066666666666672259072", + "233066666666666672259072" + ], + "hardLimitError": true + }, + { + "bAssetQtys": [ + "466133333333333344518144", + "466133333333333344518144", + "466133333333333344518144" + ], + "hardLimitError": true + }, + { + "bAssetQtys": [ + "699200000000000050331648", + "699200000000000050331648", + "699200000000000050331648" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "932266666666666689036288", + "932266666666666689036288", + "932266666666666689036288" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "1165333333333333193523200", + "1165333333333333193523200", + "1165333333333333193523200" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "1398400000000000100663296", + "1398400000000000100663296", + "1398400000000000100663296" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "1631466666666666739367936", + "1631466666666666739367936", + "1631466666666666739367936" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "1864533333333333378072576", + "1864533333333333378072576", + "1864533333333333378072576" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "2097600000000000016777216", + "2097600000000000016777216", + "2097600000000000016777216" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "2330666666666666387046400", + "2330666666666666387046400", + "2330666666666666387046400" + ], + "insufficientLiquidityError": true + } + ] + }, + { + "reserve0": "5503000000000000000000000", + "reserve1": "3996499999999999360000000", + "reserve2": "500500000000000000000000", + "A": 120, + "mAssetSupply": "9936488013915504712820075", + "hardMin": 50000000000000000, + "hardMax": 750000000000000000, + "swapFeeRate": 600000000000000, + "redeems": [ + { + "bAssetQtys": [ + "3333333333333", + "3333333333333", + "3333333333333" + ], + "mAssetQty": "10392147416180", + "swapFee": "6235288449" + }, + { + "bAssetQtys": [ + "333333333333333", + "333333333333333", + "333333333333333" + ], + "mAssetQty": "1039214741642829", + "swapFee": "623528844985" + }, + { + "bAssetQtys": [ + "33333333333333332", + "33333333333333332", + "33333333333333332" + ], + "mAssetQty": "103921474410486193", + "swapFee": "62352884646291" + }, + { + "bAssetQtys": [ + "333333333333333312", + "333333333333333312", + "333333333333333312" + ], + "mAssetQty": "1039214766486970714", + "swapFee": "623528859892182" + }, + { + "bAssetQtys": [ + "3333333333333333504", + "3333333333333333504", + "3333333333333333504" + ], + "mAssetQty": "10392149903094943109", + "swapFee": "6235289941856965" + }, + { + "bAssetQtys": [ + "33333333333333336064", + "33333333333333336064", + "33333333333333336064" + ], + "mAssetQty": "103921722867828995814", + "swapFee": "62353033720697397" + }, + { + "bAssetQtys": [ + "233066666666666672259072", + "233066666666666672259072", + "233066666666666672259072" + ], + "hardLimitError": true + }, + { + "bAssetQtys": [ + "466133333333333344518144", + "466133333333333344518144", + "466133333333333344518144" + ], + "hardLimitError": true + }, + { + "bAssetQtys": [ + "699200000000000050331648", + "699200000000000050331648", + "699200000000000050331648" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "932266666666666689036288", + "932266666666666689036288", + "932266666666666689036288" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "1165333333333333193523200", + "1165333333333333193523200", + "1165333333333333193523200" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "1398400000000000100663296", + "1398400000000000100663296", + "1398400000000000100663296" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "1631466666666666739367936", + "1631466666666666739367936", + "1631466666666666739367936" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "1864533333333333378072576", + "1864533333333333378072576", + "1864533333333333378072576" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "2097600000000000016777216", + "2097600000000000016777216", + "2097600000000000016777216" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "2330666666666666387046400", + "2330666666666666387046400", + "2330666666666666387046400" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "3333333333333", + "3333333333333", + "3333333333333" + ], + "mAssetQty": "10392147416180", + "swapFee": "6235288449" + }, + { + "bAssetQtys": [ + "333333333333333", + "333333333333333", + "333333333333333" + ], + "mAssetQty": "1039214741642829", + "swapFee": "623528844985" + }, + { + "bAssetQtys": [ + "33333333333333332", + "33333333333333332", + "33333333333333332" + ], + "mAssetQty": "103921474410486193", + "swapFee": "62352884646291" + }, + { + "bAssetQtys": [ + "333333333333333312", + "333333333333333312", + "333333333333333312" + ], + "mAssetQty": "1039214766486970714", + "swapFee": "623528859892182" + }, + { + "bAssetQtys": [ + "3333333333333333504", + "3333333333333333504", + "3333333333333333504" + ], + "mAssetQty": "10392149903094943109", + "swapFee": "6235289941856965" + }, + { + "bAssetQtys": [ + "33333333333333336064", + "33333333333333336064", + "33333333333333336064" + ], + "mAssetQty": "103921722867828995814", + "swapFee": "62353033720697397" + }, + { + "bAssetQtys": [ + "233066666666666672259072", + "233066666666666672259072", + "233066666666666672259072" + ], + "hardLimitError": true + }, + { + "bAssetQtys": [ + "466133333333333344518144", + "466133333333333344518144", + "466133333333333344518144" + ], + "hardLimitError": true + }, + { + "bAssetQtys": [ + "699200000000000050331648", + "699200000000000050331648", + "699200000000000050331648" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "932266666666666689036288", + "932266666666666689036288", + "932266666666666689036288" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "1165333333333333193523200", + "1165333333333333193523200", + "1165333333333333193523200" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "1398400000000000100663296", + "1398400000000000100663296", + "1398400000000000100663296" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "1631466666666666739367936", + "1631466666666666739367936", + "1631466666666666739367936" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "1864533333333333378072576", + "1864533333333333378072576", + "1864533333333333378072576" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "2097600000000000016777216", + "2097600000000000016777216", + "2097600000000000016777216" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "2330666666666666387046400", + "2330666666666666387046400", + "2330666666666666387046400" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "3333333333333", + "3333333333333", + "3333333333333" + ], + "mAssetQty": "10392147416180", + "swapFee": "6235288449" + }, + { + "bAssetQtys": [ + "333333333333333", + "333333333333333", + "333333333333333" + ], + "mAssetQty": "1039214741642829", + "swapFee": "623528844985" + }, + { + "bAssetQtys": [ + "33333333333333332", + "33333333333333332", + "33333333333333332" + ], + "mAssetQty": "103921474410486193", + "swapFee": "62352884646291" + }, + { + "bAssetQtys": [ + "333333333333333312", + "333333333333333312", + "333333333333333312" + ], + "mAssetQty": "1039214766486970714", + "swapFee": "623528859892182" + }, + { + "bAssetQtys": [ + "3333333333333333504", + "3333333333333333504", + "3333333333333333504" + ], + "mAssetQty": "10392149903094943109", + "swapFee": "6235289941856965" + }, + { + "bAssetQtys": [ + "33333333333333336064", + "33333333333333336064", + "33333333333333336064" + ], + "mAssetQty": "103921722867828995814", + "swapFee": "62353033720697397" + }, + { + "bAssetQtys": [ + "233066666666666672259072", + "233066666666666672259072", + "233066666666666672259072" + ], + "hardLimitError": true + }, + { + "bAssetQtys": [ + "466133333333333344518144", + "466133333333333344518144", + "466133333333333344518144" + ], + "hardLimitError": true + }, + { + "bAssetQtys": [ + "699200000000000050331648", + "699200000000000050331648", + "699200000000000050331648" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "932266666666666689036288", + "932266666666666689036288", + "932266666666666689036288" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "1165333333333333193523200", + "1165333333333333193523200", + "1165333333333333193523200" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "1398400000000000100663296", + "1398400000000000100663296", + "1398400000000000100663296" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "1631466666666666739367936", + "1631466666666666739367936", + "1631466666666666739367936" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "1864533333333333378072576", + "1864533333333333378072576", + "1864533333333333378072576" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "2097600000000000016777216", + "2097600000000000016777216", + "2097600000000000016777216" + ], + "insufficientLiquidityError": true + }, + { + "bAssetQtys": [ + "2330666666666666387046400", + "2330666666666666387046400", + "2330666666666666387046400" + ], + "insufficientLiquidityError": true + } + ] + }, + { + "reserve0": "2007000000000000960000000", + "reserve1": "3996499999999999360000000", + "reserve2": "3996499999999999360000000", + "A": 120, + "mAssetSupply": "9995726520619110731126433", + "hardMin": 50000000000000000, + "hardMax": 750000000000000000, + "swapFeeRate": 600000000000000, + "redeems": [ + { + "bAssetQtys": [ + "3333333333333", + "3333333333333", + "3333333333333" + ], + "mAssetQty": "10012169329578", + "swapFee": "6007301597" + }, + { + "bAssetQtys": [ + "333333333333333", + "333333333333333", + "333333333333333" + ], + "mAssetQty": "1001216932958058", + "swapFee": "600730159774" + }, + { + "bAssetQtys": [ + "33333333333333332", + "33333333333333332", + "33333333333333332" + ], + "mAssetQty": "100121693296744420", + "swapFee": "60073015978046" + }, + { + "bAssetQtys": [ + "333333333333333312", + "333333333333333312", + "333333333333333312" + ], + "mAssetQty": "1001216933052754844", + "swapFee": "600730159831652" + }, + { + "bAssetQtys": [ + "3333333333333333504", + "3333333333333333504", + "3333333333333333504" + ], + "mAssetQty": "10012169339058628903", + "swapFee": "6007301603435177" + }, + { + "bAssetQtys": [ + "33333333333333336064", + "33333333333333336064", + "33333333333333336064" + ], + "mAssetQty": "100121694243707687525", + "swapFee": "60073016546224612" + }, + { + "bAssetQtys": [ + "233066666666666672259072", + "233066666666666672259072", + "233066666666666672259072" + ], + "mAssetQty": "700103049377134224963752", + "swapFee": "420061829626280534978" + }, + { + "bAssetQtys": [ + "466133333333333344518144", + "466133333333333344518144", + "466133333333333344518144" + ], + "mAssetQty": "1400340642413086499054609", + "swapFee": "840204385447851899432" + }, + { + "bAssetQtys": [ + "699200000000000050331648", + "699200000000000050331648", + "699200000000000050331648" + ], + "mAssetQty": "2100781755590947292822968", + "swapFee": "1260469053354568375693" + } + ] + } +] \ No newline at end of file diff --git a/test-utils/validator-data/sample/redeemMassetTestData.json b/test-utils/validator-data/sample/redeemMassetTestData.json new file mode 100644 index 00000000..544b5986 --- /dev/null +++ b/test-utils/validator-data/sample/redeemMassetTestData.json @@ -0,0 +1,890 @@ +[ + { + "reserve0": "5503000000000000000000000", + "reserve1": "500500000000000000000000", + "reserve2": "3996499999999999360000000", + "A": 120, + "mAssetSupply": "9936488013915504712820075", + "hardMin": 50000000000000000, + "hardMax": 750000000000000000, + "redemptionFeeRate": 300000000000000, + "redeems": [ + { + "mAssetQty": "10000000000000", + "bAssetQtys": [ + "5536512591063", + "503547983249", + "4020838191928" + ], + "redemptionFee": "3000000000" + }, + { + "mAssetQty": "1000000000000000", + "bAssetQtys": [ + "553651259106401", + "50354798325049", + "402083819192937" + ], + "redemptionFee": "300000000000" + }, + { + "mAssetQty": "100000000000000000", + "bAssetQtys": [ + "55365125910640290", + "5035479832505080", + "40208381919293818" + ], + "redemptionFee": "30000000000000" + }, + { + "mAssetQty": "1000000000000000000", + "bAssetQtys": [ + "553651259106402914", + "50354798325050818", + "402083819192938196" + ], + "redemptionFee": "300000000000000" + }, + { + "mAssetQty": "10000000000000000000", + "bAssetQtys": [ + "5536512591064029155", + "503547983250508193", + "4020838191929381969" + ], + "redemptionFee": "3000000000000000" + }, + { + "mAssetQty": "100000000000000000000", + "bAssetQtys": [ + "55365125910640291565", + "5035479832505081941", + "40208381919293819699" + ], + "redemptionFee": "30000000000000000" + }, + { + "mAssetQty": "699200000000000050331648", + "bAssetQtys": [ + "387112960367196946497444", + "35208074988875535475552", + "281137006379702407582180" + ], + "redemptionFee": "209760000000000015099" + }, + { + "mAssetQty": "1398400000000000100663296", + "bAssetQtys": [ + "774225920734393892994889", + "70416149977751070951106", + "562274012759404815164362" + ], + "redemptionFee": "419520000000000030198" + }, + { + "mAssetQty": "2097600000000000016777216", + "bAssetQtys": [ + "1161338881101590765182520", + "105624224966626599668153", + "843411019139107168779767" + ], + "redemptionFee": "629280000000000005033" + }, + { + "mAssetQty": "2796800000000000201326592", + "bAssetQtys": [ + "1548451841468787785989780", + "140832299955502141902213", + "1124548025518809630328725" + ], + "redemptionFee": "839040000000000060397" + }, + { + "mAssetQty": "3496000000000000117440512", + "bAssetQtys": [ + "1935564801835984658177411", + "176040374944377670619260", + "1405685031898511983944130" + ], + "redemptionFee": "1048800000000000035232" + }, + { + "mAssetQty": "4195200000000000033554432", + "bAssetQtys": [ + "2322677762203181530365042", + "211248449933253199336307", + "1686822038278214337559535" + ], + "redemptionFee": "1258560000000000010066" + }, + { + "mAssetQty": "4894399999999999949668352", + "bAssetQtys": [ + "2709790722570378402552673", + "246456524922128728053354", + "1967959044657916691174940" + ], + "redemptionFee": "1468319999999999984900" + }, + { + "mAssetQty": "5593600000000000402653184", + "bAssetQtys": [ + "3096903682937575571979561", + "281664599911004283804427", + "2249096051037619260657451" + ], + "redemptionFee": "1678080000000000120795" + }, + { + "mAssetQty": "6292799999999999781896192", + "bAssetQtys": [ + "3484016643304772146927935", + "316872674899879785487448", + "2530233057417321398405750" + ], + "redemptionFee": "1887839999999999934568" + }, + { + "mAssetQty": "6992000000000000234881024", + "bAssetQtys": [ + "3871129603671969316354823", + "352080749888755341238521", + "2811370063797023967888261" + ], + "redemptionFee": "2097600000000000070464" + }, + { + "mAssetQty": "10000000000000", + "bAssetQtys": [ + "5536512591063", + "503547983249", + "4020838191928" + ], + "redemptionFee": "3000000000" + }, + { + "mAssetQty": "1000000000000000", + "bAssetQtys": [ + "553651259106401", + "50354798325049", + "402083819192937" + ], + "redemptionFee": "300000000000" + }, + { + "mAssetQty": "100000000000000000", + "bAssetQtys": [ + "55365125910640290", + "5035479832505080", + "40208381919293818" + ], + "redemptionFee": "30000000000000" + }, + { + "mAssetQty": "1000000000000000000", + "bAssetQtys": [ + "553651259106402914", + "50354798325050818", + "402083819192938196" + ], + "redemptionFee": "300000000000000" + }, + { + "mAssetQty": "10000000000000000000", + "bAssetQtys": [ + "5536512591064029155", + "503547983250508193", + "4020838191929381969" + ], + "redemptionFee": "3000000000000000" + }, + { + "mAssetQty": "100000000000000000000", + "bAssetQtys": [ + "55365125910640291565", + "5035479832505081941", + "40208381919293819699" + ], + "redemptionFee": "30000000000000000" + }, + { + "mAssetQty": "699200000000000050331648", + "bAssetQtys": [ + "387112960367196946497444", + "35208074988875535475552", + "281137006379702407582180" + ], + "redemptionFee": "209760000000000015099" + }, + { + "mAssetQty": "1398400000000000100663296", + "bAssetQtys": [ + "774225920734393892994889", + "70416149977751070951106", + "562274012759404815164362" + ], + "redemptionFee": "419520000000000030198" + }, + { + "mAssetQty": "2097600000000000016777216", + "bAssetQtys": [ + "1161338881101590765182520", + "105624224966626599668153", + "843411019139107168779767" + ], + "redemptionFee": "629280000000000005033" + }, + { + "mAssetQty": "2796800000000000201326592", + "bAssetQtys": [ + "1548451841468787785989780", + "140832299955502141902213", + "1124548025518809630328725" + ], + "redemptionFee": "839040000000000060397" + }, + { + "mAssetQty": "3496000000000000117440512", + "bAssetQtys": [ + "1935564801835984658177411", + "176040374944377670619260", + "1405685031898511983944130" + ], + "redemptionFee": "1048800000000000035232" + }, + { + "mAssetQty": "4195200000000000033554432", + "bAssetQtys": [ + "2322677762203181530365042", + "211248449933253199336307", + "1686822038278214337559535" + ], + "redemptionFee": "1258560000000000010066" + }, + { + "mAssetQty": "4894399999999999949668352", + "bAssetQtys": [ + "2709790722570378402552673", + "246456524922128728053354", + "1967959044657916691174940" + ], + "redemptionFee": "1468319999999999984900" + }, + { + "mAssetQty": "5593600000000000402653184", + "bAssetQtys": [ + "3096903682937575571979561", + "281664599911004283804427", + "2249096051037619260657451" + ], + "redemptionFee": "1678080000000000120795" + }, + { + "mAssetQty": "6292799999999999781896192", + "bAssetQtys": [ + "3484016643304772146927935", + "316872674899879785487448", + "2530233057417321398405750" + ], + "redemptionFee": "1887839999999999934568" + }, + { + "mAssetQty": "6992000000000000234881024", + "bAssetQtys": [ + "3871129603671969316354823", + "352080749888755341238521", + "2811370063797023967888261" + ], + "redemptionFee": "2097600000000000070464" + }, + { + "mAssetQty": "10000000000000", + "bAssetQtys": [ + "5536512591063", + "503547983249", + "4020838191928" + ], + "redemptionFee": "3000000000" + }, + { + "mAssetQty": "1000000000000000", + "bAssetQtys": [ + "553651259106401", + "50354798325049", + "402083819192937" + ], + "redemptionFee": "300000000000" + }, + { + "mAssetQty": "100000000000000000", + "bAssetQtys": [ + "55365125910640290", + "5035479832505080", + "40208381919293818" + ], + "redemptionFee": "30000000000000" + }, + { + "mAssetQty": "1000000000000000000", + "bAssetQtys": [ + "553651259106402914", + "50354798325050818", + "402083819192938196" + ], + "redemptionFee": "300000000000000" + }, + { + "mAssetQty": "10000000000000000000", + "bAssetQtys": [ + "5536512591064029155", + "503547983250508193", + "4020838191929381969" + ], + "redemptionFee": "3000000000000000" + }, + { + "mAssetQty": "100000000000000000000", + "bAssetQtys": [ + "55365125910640291565", + "5035479832505081941", + "40208381919293819699" + ], + "redemptionFee": "30000000000000000" + }, + { + "mAssetQty": "699200000000000050331648", + "bAssetQtys": [ + "387112960367196946497444", + "35208074988875535475552", + "281137006379702407582180" + ], + "redemptionFee": "209760000000000015099" + }, + { + "mAssetQty": "1398400000000000100663296", + "bAssetQtys": [ + "774225920734393892994889", + "70416149977751070951106", + "562274012759404815164362" + ], + "redemptionFee": "419520000000000030198" + }, + { + "mAssetQty": "2097600000000000016777216", + "bAssetQtys": [ + "1161338881101590765182520", + "105624224966626599668153", + "843411019139107168779767" + ], + "redemptionFee": "629280000000000005033" + }, + { + "mAssetQty": "2796800000000000201326592", + "bAssetQtys": [ + "1548451841468787785989780", + "140832299955502141902213", + "1124548025518809630328725" + ], + "redemptionFee": "839040000000000060397" + }, + { + "mAssetQty": "3496000000000000117440512", + "bAssetQtys": [ + "1935564801835984658177411", + "176040374944377670619260", + "1405685031898511983944130" + ], + "redemptionFee": "1048800000000000035232" + }, + { + "mAssetQty": "4195200000000000033554432", + "bAssetQtys": [ + "2322677762203181530365042", + "211248449933253199336307", + "1686822038278214337559535" + ], + "redemptionFee": "1258560000000000010066" + }, + { + "mAssetQty": "4894399999999999949668352", + "bAssetQtys": [ + "2709790722570378402552673", + "246456524922128728053354", + "1967959044657916691174940" + ], + "redemptionFee": "1468319999999999984900" + }, + { + "mAssetQty": "5593600000000000402653184", + "bAssetQtys": [ + "3096903682937575571979561", + "281664599911004283804427", + "2249096051037619260657451" + ], + "redemptionFee": "1678080000000000120795" + }, + { + "mAssetQty": "6292799999999999781896192", + "bAssetQtys": [ + "3484016643304772146927935", + "316872674899879785487448", + "2530233057417321398405750" + ], + "redemptionFee": "1887839999999999934568" + }, + { + "mAssetQty": "6992000000000000234881024", + "bAssetQtys": [ + "3871129603671969316354823", + "352080749888755341238521", + "2811370063797023967888261" + ], + "redemptionFee": "2097600000000000070464" + } + ] + }, + { + "reserve0": "2007000000000000000000000", + "reserve1": "500500000000000000000000", + "reserve2": "7492500000000000000000000", + "A": 120, + "mAssetSupply": "9896372713490403790662354", + "hardMin": 50000000000000000, + "hardMax": 750000000000000000, + "redemptionFeeRate": 300000000000000, + "redeems": [ + { + "mAssetQty": "10000000000000", + "bAssetQtys": [ + "2027407372464", + "505589132993", + "7568684473442" + ], + "redemptionFee": "3000000000" + }, + { + "mAssetQty": "1000000000000000", + "bAssetQtys": [ + "202740737246580", + "50558913299408", + "756868447344301" + ], + "redemptionFee": "300000000000" + }, + { + "mAssetQty": "100000000000000000", + "bAssetQtys": [ + "20274073724658181", + "5055891329940916", + "75686844734430211" + ], + "redemptionFee": "30000000000000" + }, + { + "mAssetQty": "1000000000000000000", + "bAssetQtys": [ + "202740737246581828", + "50558913299409169", + "756868447344302121" + ], + "redemptionFee": "300000000000000" + }, + { + "mAssetQty": "10000000000000000000", + "bAssetQtys": [ + "2027407372465818297", + "505589132994091707", + "7568684473443021227" + ], + "redemptionFee": "3000000000000000" + }, + { + "mAssetQty": "100000000000000000000", + "bAssetQtys": [ + "20274073724658182988", + "5055891329940917082", + "75686844734430212281" + ], + "redemptionFee": "30000000000000000" + }, + { + "mAssetQty": "699200000000000050331648", + "bAssetQtys": [ + "141756323482810025669551", + "35350792178946894792032", + "529202418383136082376241" + ], + "redemptionFee": "209760000000000015099" + }, + { + "mAssetQty": "1398400000000000100663296", + "bAssetQtys": [ + "283512646965620051339103", + "70701584357893789584065", + "1058404836766272164752484" + ], + "redemptionFee": "419520000000000030198" + }, + { + "mAssetQty": "2097600000000000016777216", + "bAssetQtys": [ + "425268970448430049797253", + "106052376536840677590196", + "1587607255149408145543562" + ], + "redemptionFee": "629280000000000005033" + }, + { + "mAssetQty": "2796800000000000201326592", + "bAssetQtys": [ + "567025293931240102678207", + "141403168715787579168132", + "2116809673532544329504969" + ], + "redemptionFee": "839040000000000060397" + }, + { + "mAssetQty": "3496000000000000117440512", + "bAssetQtys": [ + "708781617414050101136357", + "176753960894734467174262", + "2646012091915680310296047" + ], + "redemptionFee": "1048800000000000035232" + }, + { + "mAssetQty": "4195200000000000033554432", + "bAssetQtys": [ + "850537940896860099594508", + "212104753073681355180393", + "3175214510298816291087126" + ], + "redemptionFee": "1258560000000000010066" + }, + { + "mAssetQty": "4894399999999999949668352", + "bAssetQtys": [ + "992294264379670098052659", + "247455545252628243186524", + "3704416928681952271878205" + ], + "redemptionFee": "1468319999999999984900" + }, + { + "mAssetQty": "5593600000000000402653184", + "bAssetQtys": [ + "1134050587862480205356415", + "282806337431575158336265", + "4233619347065088659009938" + ], + "redemptionFee": "1678080000000000120795" + }, + { + "mAssetQty": "6292799999999999781896192", + "bAssetQtys": [ + "1275806911345290094968961", + "318157129610522019198786", + "4762821765448224233460363" + ], + "redemptionFee": "1887839999999999934568" + }, + { + "mAssetQty": "6992000000000000234881024", + "bAssetQtys": [ + "1417563234828100202272716", + "353507921789468934348526", + "5292024183831360620592095" + ], + "redemptionFee": "2097600000000000070464" + }, + { + "mAssetQty": "10000000000000", + "bAssetQtys": [ + "2027407372464", + "505589132993", + "7568684473442" + ], + "redemptionFee": "3000000000" + }, + { + "mAssetQty": "1000000000000000", + "bAssetQtys": [ + "202740737246580", + "50558913299408", + "756868447344301" + ], + "redemptionFee": "300000000000" + }, + { + "mAssetQty": "100000000000000000", + "bAssetQtys": [ + "20274073724658181", + "5055891329940916", + "75686844734430211" + ], + "redemptionFee": "30000000000000" + }, + { + "mAssetQty": "1000000000000000000", + "bAssetQtys": [ + "202740737246581828", + "50558913299409169", + "756868447344302121" + ], + "redemptionFee": "300000000000000" + }, + { + "mAssetQty": "10000000000000000000", + "bAssetQtys": [ + "2027407372465818297", + "505589132994091707", + "7568684473443021227" + ], + "redemptionFee": "3000000000000000" + }, + { + "mAssetQty": "100000000000000000000", + "bAssetQtys": [ + "20274073724658182988", + "5055891329940917082", + "75686844734430212281" + ], + "redemptionFee": "30000000000000000" + }, + { + "mAssetQty": "699200000000000050331648", + "bAssetQtys": [ + "141756323482810025669551", + "35350792178946894792032", + "529202418383136082376241" + ], + "redemptionFee": "209760000000000015099" + }, + { + "mAssetQty": "1398400000000000100663296", + "bAssetQtys": [ + "283512646965620051339103", + "70701584357893789584065", + "1058404836766272164752484" + ], + "redemptionFee": "419520000000000030198" + }, + { + "mAssetQty": "2097600000000000016777216", + "bAssetQtys": [ + "425268970448430049797253", + "106052376536840677590196", + "1587607255149408145543562" + ], + "redemptionFee": "629280000000000005033" + }, + { + "mAssetQty": "2796800000000000201326592", + "bAssetQtys": [ + "567025293931240102678207", + "141403168715787579168132", + "2116809673532544329504969" + ], + "redemptionFee": "839040000000000060397" + }, + { + "mAssetQty": "3496000000000000117440512", + "bAssetQtys": [ + "708781617414050101136357", + "176753960894734467174262", + "2646012091915680310296047" + ], + "redemptionFee": "1048800000000000035232" + }, + { + "mAssetQty": "4195200000000000033554432", + "bAssetQtys": [ + "850537940896860099594508", + "212104753073681355180393", + "3175214510298816291087126" + ], + "redemptionFee": "1258560000000000010066" + }, + { + "mAssetQty": "4894399999999999949668352", + "bAssetQtys": [ + "992294264379670098052659", + "247455545252628243186524", + "3704416928681952271878205" + ], + "redemptionFee": "1468319999999999984900" + }, + { + "mAssetQty": "5593600000000000402653184", + "bAssetQtys": [ + "1134050587862480205356415", + "282806337431575158336265", + "4233619347065088659009938" + ], + "redemptionFee": "1678080000000000120795" + }, + { + "mAssetQty": "6292799999999999781896192", + "bAssetQtys": [ + "1275806911345290094968961", + "318157129610522019198786", + "4762821765448224233460363" + ], + "redemptionFee": "1887839999999999934568" + }, + { + "mAssetQty": "6992000000000000234881024", + "bAssetQtys": [ + "1417563234828100202272716", + "353507921789468934348526", + "5292024183831360620592095" + ], + "redemptionFee": "2097600000000000070464" + }, + { + "mAssetQty": "10000000000000", + "bAssetQtys": [ + "2027407372464", + "505589132993", + "7568684473442" + ], + "redemptionFee": "3000000000" + }, + { + "mAssetQty": "1000000000000000", + "bAssetQtys": [ + "202740737246580", + "50558913299408", + "756868447344301" + ], + "redemptionFee": "300000000000" + }, + { + "mAssetQty": "100000000000000000", + "bAssetQtys": [ + "20274073724658181", + "5055891329940916", + "75686844734430211" + ], + "redemptionFee": "30000000000000" + }, + { + "mAssetQty": "1000000000000000000", + "bAssetQtys": [ + "202740737246581828", + "50558913299409169", + "756868447344302121" + ], + "redemptionFee": "300000000000000" + }, + { + "mAssetQty": "10000000000000000000", + "bAssetQtys": [ + "2027407372465818297", + "505589132994091707", + "7568684473443021227" + ], + "redemptionFee": "3000000000000000" + }, + { + "mAssetQty": "100000000000000000000", + "bAssetQtys": [ + "20274073724658182988", + "5055891329940917082", + "75686844734430212281" + ], + "redemptionFee": "30000000000000000" + }, + { + "mAssetQty": "699200000000000050331648", + "bAssetQtys": [ + "141756323482810025669551", + "35350792178946894792032", + "529202418383136082376241" + ], + "redemptionFee": "209760000000000015099" + }, + { + "mAssetQty": "1398400000000000100663296", + "bAssetQtys": [ + "283512646965620051339103", + "70701584357893789584065", + "1058404836766272164752484" + ], + "redemptionFee": "419520000000000030198" + }, + { + "mAssetQty": "2097600000000000016777216", + "bAssetQtys": [ + "425268970448430049797253", + "106052376536840677590196", + "1587607255149408145543562" + ], + "redemptionFee": "629280000000000005033" + }, + { + "mAssetQty": "2796800000000000201326592", + "bAssetQtys": [ + "567025293931240102678207", + "141403168715787579168132", + "2116809673532544329504969" + ], + "redemptionFee": "839040000000000060397" + }, + { + "mAssetQty": "3496000000000000117440512", + "bAssetQtys": [ + "708781617414050101136357", + "176753960894734467174262", + "2646012091915680310296047" + ], + "redemptionFee": "1048800000000000035232" + }, + { + "mAssetQty": "4195200000000000033554432", + "bAssetQtys": [ + "850537940896860099594508", + "212104753073681355180393", + "3175214510298816291087126" + ], + "redemptionFee": "1258560000000000010066" + }, + { + "mAssetQty": "4894399999999999949668352", + "bAssetQtys": [ + "992294264379670098052659", + "247455545252628243186524", + "3704416928681952271878205" + ], + "redemptionFee": "1468319999999999984900" + }, + { + "mAssetQty": "5593600000000000402653184", + "bAssetQtys": [ + "1134050587862480205356415", + "282806337431575158336265", + "4233619347065088659009938" + ], + "redemptionFee": "1678080000000000120795" + }, + { + "mAssetQty": "6292799999999999781896192", + "bAssetQtys": [ + "1275806911345290094968961", + "318157129610522019198786", + "4762821765448224233460363" + ], + "redemptionFee": "1887839999999999934568" + }, + { + "mAssetQty": "6992000000000000234881024", + "bAssetQtys": [ + "1417563234828100202272716", + "353507921789468934348526", + "5292024183831360620592095" + ], + "redemptionFee": "2097600000000000070464" + } + ] + } +] \ No newline at end of file diff --git a/test-utils/validator-data/sample/redeemTestData.json b/test-utils/validator-data/sample/redeemTestData.json new file mode 100644 index 00000000..e97ddf57 --- /dev/null +++ b/test-utils/validator-data/sample/redeemTestData.json @@ -0,0 +1,922 @@ +[ + { + "reserve0": "5503000000000000000000000", + "reserve1": "500500000000000000000000", + "reserve2": "3996499999999999360000000", + "A": 120, + "mAssetSupply": "9936488013915504712820075", + "hardMin": 50000000000000000, + "hardMax": 750000000000000000, + "swapFeeRate": 600000000000000, + "redeems": [ + { + "bAssetIndex": 0, + "mAssetQty": "10000000000000", + "outputQty": "10164507628712", + "swapFee": "6000000000", + "priceReceived": 0.9838154847513411 + }, + { + "bAssetIndex": 0, + "mAssetQty": "1000000000000000", + "outputQty": "1016450762869405", + "swapFee": "600000000000", + "priceReceived": 0.9838154847530783 + }, + { + "bAssetIndex": 0, + "mAssetQty": "100000000000000000", + "outputQty": "101645076268747784", + "swapFee": "60000000000000", + "priceReceived": 0.9838154849291644 + }, + { + "bAssetIndex": 0, + "mAssetQty": "1000000000000000000", + "outputQty": "1016450761033593659", + "swapFee": "600000000000000", + "priceReceived": 0.9838154865299471 + }, + { + "bAssetIndex": 0, + "mAssetQty": "10000000000000000000", + "outputQty": "10164507444947540299", + "swapFee": "6000000000000000", + "priceReceived": 0.9838155025377731 + }, + { + "bAssetIndex": 0, + "mAssetQty": "100000000000000000000", + "outputQty": "101645057910657481556", + "swapFee": "60000000000000000", + "priceReceived": 0.9838156626158506 + }, + { + "bAssetIndex": 0, + "mAssetQty": "699200000000000050331648", + "outputQty": "709811194731357498535926", + "swapFee": "419520000000000030198", + "priceReceived": 0.9850506799412012 + }, + { + "bAssetIndex": 0, + "mAssetQty": "1398400000000000100663296", + "outputQty": "1417856802946775499008223", + "swapFee": "839040000000000060397", + "priceReceived": 0.9862773145311023 + }, + { + "bAssetIndex": 0, + "mAssetQty": "2097600000000000016777216", + "outputQty": "2124117621986889874550225", + "swapFee": "1258560000000000010066", + "priceReceived": 0.987515935222982 + }, + { + "bAssetIndex": 0, + "mAssetQty": "2796800000000000201326592", + "outputQty": "2828453206635174009338277", + "swapFee": "1678080000000000120795", + "priceReceived": 0.9888090046669609 + }, + { + "bAssetIndex": 0, + "mAssetQty": "3496000000000000117440512", + "outputQty": "3530389470952646920936233", + "swapFee": "2097600000000000070464", + "priceReceived": 0.9902590149796229 + }, + { + "bAssetIndex": 0, + "mAssetQty": "4195200000000000033554432", + "outputQty": "4228234336159812906095991", + "swapFee": "2517120000000000020132", + "priceReceived": 0.9921872030891704 + }, + { + "bAssetIndex": 0, + "mAssetQty": "4894399999999999949668352", + "hardLimitError": true + }, + { + "bAssetIndex": 0, + "mAssetQty": "5593600000000000402653184", + "hardLimitError": true + }, + { + "bAssetIndex": 0, + "mAssetQty": "6292799999999999781896192", + "hardLimitError": true + }, + { + "bAssetIndex": 0, + "mAssetQty": "6992000000000000234881024", + "hardLimitError": true + }, + { + "bAssetIndex": 1, + "mAssetQty": "10000000000000", + "outputQty": "8741464880681", + "swapFee": "6000000000", + "priceReceived": 1.1439730224279017 + }, + { + "bAssetIndex": 1, + "mAssetQty": "1000000000000000", + "outputQty": "874146487884345", + "swapFee": "600000000000", + "priceReceived": 1.143973022668377 + }, + { + "bAssetIndex": 1, + "mAssetQty": "100000000000000000", + "outputQty": "87414646950531602", + "swapFee": "60000000000000", + "priceReceived": 1.14397304672054 + }, + { + "bAssetIndex": 1, + "mAssetQty": "1000000000000000000", + "outputQty": "874146302423016603", + "swapFee": "600000000000000", + "priceReceived": 1.1439732653768984 + }, + { + "bAssetIndex": 1, + "mAssetQty": "10000000000000000000", + "outputQty": "8741446315790339457", + "swapFee": "6000000000000000", + "priceReceived": 1.143975451972546 + }, + { + "bAssetIndex": 1, + "mAssetQty": "100000000000000000000", + "outputQty": "87412792104014619454", + "swapFee": "60000000000000000", + "priceReceived": 1.1439973211358763 + }, + { + "bAssetIndex": 1, + "mAssetQty": "699200000000000050331648", + "hardLimitError": true + }, + { + "bAssetIndex": 1, + "mAssetQty": "1398400000000000100663296", + "hardLimitError": true + }, + { + "bAssetIndex": 1, + "mAssetQty": "2097600000000000016777216", + "hardLimitError": true + }, + { + "bAssetIndex": 1, + "mAssetQty": "2796800000000000201326592", + "hardLimitError": true + }, + { + "bAssetIndex": 1, + "mAssetQty": "3496000000000000117440512", + "hardLimitError": true + }, + { + "bAssetIndex": 1, + "mAssetQty": "4195200000000000033554432", + "hardLimitError": true + }, + { + "bAssetIndex": 1, + "mAssetQty": "4894399999999999949668352", + "hardLimitError": true + }, + { + "bAssetIndex": 1, + "mAssetQty": "5593600000000000402653184", + "hardLimitError": true + }, + { + "bAssetIndex": 1, + "mAssetQty": "6292799999999999781896192", + "hardLimitError": true + }, + { + "bAssetIndex": 1, + "mAssetQty": "6992000000000000234881024", + "hardLimitError": true + }, + { + "bAssetIndex": 2, + "mAssetQty": "10000000000000", + "outputQty": "10102482433971", + "swapFee": "6000000000", + "priceReceived": 0.9898557176772326 + }, + { + "bAssetIndex": 2, + "mAssetQty": "1000000000000000", + "outputQty": "1010248243395131", + "swapFee": "600000000000", + "priceReceived": 0.9898557176791619 + }, + { + "bAssetIndex": 2, + "mAssetQty": "100000000000000000", + "outputQty": "101024824319319536", + "swapFee": "60000000000000", + "priceReceived": 0.9898557178770213 + }, + { + "bAssetIndex": 2, + "mAssetQty": "1000000000000000000", + "outputQty": "1010248241357415368", + "swapFee": "600000000000000", + "priceReceived": 0.9898557196757449 + }, + { + "bAssetIndex": 2, + "mAssetQty": "10000000000000000000", + "outputQty": "10102482229996021343", + "swapFee": "6000000000000000", + "priceReceived": 0.989855737662994 + }, + { + "bAssetIndex": 2, + "mAssetQty": "100000000000000000000", + "outputQty": "101024803942014778472", + "swapFee": "60000000000000000", + "priceReceived": 0.9898559175368161 + }, + { + "bAssetIndex": 2, + "mAssetQty": "699200000000000050331648", + "outputQty": "705304582913346103367752", + "swapFee": "419520000000000030198", + "priceReceived": 0.9913447564906919 + }, + { + "bAssetIndex": 2, + "mAssetQty": "1398400000000000100663296", + "outputQty": "1408072410479239344834297", + "swapFee": "839040000000000060397", + "priceReceived": 0.9931307435560454 + }, + { + "bAssetIndex": 2, + "mAssetQty": "2097600000000000016777216", + "outputQty": "2106940933929894641926187", + "swapFee": "1258560000000000010066", + "priceReceived": 0.9955665895614493 + }, + { + "bAssetIndex": 2, + "mAssetQty": "2796800000000000201326592", + "hardLimitError": true + }, + { + "bAssetIndex": 2, + "mAssetQty": "3496000000000000117440512", + "hardLimitError": true + }, + { + "bAssetIndex": 2, + "mAssetQty": "4195200000000000033554432", + "hardLimitError": true + }, + { + "bAssetIndex": 2, + "mAssetQty": "4894399999999999949668352", + "hardLimitError": true + }, + { + "bAssetIndex": 2, + "mAssetQty": "5593600000000000402653184", + "hardLimitError": true + }, + { + "bAssetIndex": 2, + "mAssetQty": "6292799999999999781896192", + "hardLimitError": true + }, + { + "bAssetIndex": 2, + "mAssetQty": "6992000000000000234881024", + "hardLimitError": true + } + ] + }, + { + "reserve0": "2007000000000000000000000", + "reserve1": "500500000000000000000000", + "reserve2": "7492500000000000000000000", + "A": 120, + "mAssetSupply": "9896372713490403790662354", + "hardMin": 50000000000000000, + "hardMax": 750000000000000000, + "swapFeeRate": 600000000000000, + "redeems": [ + { + "bAssetIndex": 0, + "mAssetQty": "10000000000000", + "outputQty": "9852235534025", + "swapFee": "6000000000", + "priceReceived": 1.0149980646995995 + }, + { + "bAssetIndex": 0, + "mAssetQty": "1000000000000000", + "outputQty": "985223553389812", + "swapFee": "600000000000", + "priceReceived": 1.0149980647126708 + }, + { + "bAssetIndex": 0, + "mAssetQty": "100000000000000000", + "outputQty": "98522355212417833", + "swapFee": "60000000000000", + "priceReceived": 1.0149980660165534 + }, + { + "bAssetIndex": 0, + "mAssetQty": "1000000000000000000", + "outputQty": "985223540618413979", + "swapFee": "600000000000000", + "priceReceived": 1.0149980778700345 + }, + { + "bAssetIndex": 0, + "mAssetQty": "10000000000000000000", + "outputQty": "9852234255602968696", + "swapFee": "6000000000000000", + "priceReceived": 1.014998196405348 + }, + { + "bAssetIndex": 0, + "mAssetQty": "100000000000000000000", + "outputQty": "98522227493176110124", + "swapFee": "60000000000000000", + "priceReceived": 1.014999381808803 + }, + { + "bAssetIndex": 0, + "mAssetQty": "699200000000000050331648", + "hardLimitError": true + }, + { + "bAssetIndex": 0, + "mAssetQty": "1398400000000000100663296", + "hardLimitError": true + }, + { + "bAssetIndex": 0, + "mAssetQty": "2097600000000000016777216", + "hardLimitError": true + }, + { + "bAssetIndex": 0, + "mAssetQty": "2796800000000000201326592", + "hardLimitError": true + }, + { + "bAssetIndex": 0, + "mAssetQty": "3496000000000000117440512", + "hardLimitError": true + }, + { + "bAssetIndex": 0, + "mAssetQty": "4195200000000000033554432", + "hardLimitError": true + }, + { + "bAssetIndex": 0, + "mAssetQty": "4894399999999999949668352", + "hardLimitError": true + }, + { + "bAssetIndex": 0, + "mAssetQty": "5593600000000000402653184", + "hardLimitError": true + }, + { + "bAssetIndex": 0, + "mAssetQty": "6292799999999999781896192", + "hardLimitError": true + }, + { + "bAssetIndex": 0, + "mAssetQty": "6992000000000000234881024", + "hardLimitError": true + }, + { + "bAssetIndex": 1, + "mAssetQty": "10000000000000", + "outputQty": "8317044958106", + "swapFee": "6000000000", + "priceReceived": 1.202350119588298 + }, + { + "bAssetIndex": 1, + "mAssetQty": "1000000000000000", + "outputQty": "831704495589349", + "swapFee": "600000000000", + "priceReceived": 1.2023501199081486 + }, + { + "bAssetIndex": 1, + "mAssetQty": "100000000000000000", + "outputQty": "83170447346076645", + "swapFee": "60000000000000", + "priceReceived": 1.202350151898242 + }, + { + "bAssetIndex": 1, + "mAssetQty": "1000000000000000000", + "outputQty": "831704272291620904", + "swapFee": "600000000000000", + "priceReceived": 1.2023504427176603 + }, + { + "bAssetIndex": 1, + "mAssetQty": "10000000000000000000", + "outputQty": "8317022605791788171", + "swapFee": "6000000000000000", + "priceReceived": 1.202353350949921 + }, + { + "bAssetIndex": 1, + "mAssetQty": "100000000000000000000", + "outputQty": "83168214135594263901", + "swapFee": "60000000000000000", + "priceReceived": 1.2023824370806355 + }, + { + "bAssetIndex": 1, + "mAssetQty": "699200000000000050331648", + "hardLimitError": true + }, + { + "bAssetIndex": 1, + "mAssetQty": "1398400000000000100663296", + "hardLimitError": true + }, + { + "bAssetIndex": 1, + "mAssetQty": "2097600000000000016777216", + "hardLimitError": true + }, + { + "bAssetIndex": 1, + "mAssetQty": "2796800000000000201326592", + "hardLimitError": true + }, + { + "bAssetIndex": 1, + "mAssetQty": "3496000000000000117440512", + "hardLimitError": true + }, + { + "bAssetIndex": 1, + "mAssetQty": "4195200000000000033554432", + "hardLimitError": true + }, + { + "bAssetIndex": 1, + "mAssetQty": "4894399999999999949668352", + "hardLimitError": true + }, + { + "bAssetIndex": 1, + "mAssetQty": "5593600000000000402653184", + "hardLimitError": true + }, + { + "bAssetIndex": 1, + "mAssetQty": "6292799999999999781896192", + "hardLimitError": true + }, + { + "bAssetIndex": 1, + "mAssetQty": "6992000000000000234881024", + "hardLimitError": true + }, + { + "bAssetIndex": 2, + "mAssetQty": "10000000000000", + "outputQty": "10315364828795", + "swapFee": "6000000000", + "priceReceived": 0.969427661160886 + }, + { + "bAssetIndex": 2, + "mAssetQty": "1000000000000000", + "outputQty": "1031536482876419", + "swapFee": "600000000000", + "priceReceived": 0.9694276611637815 + }, + { + "bAssetIndex": 2, + "mAssetQty": "100000000000000000", + "outputQty": "103153648256347236", + "swapFee": "60000000000000", + "priceReceived": 0.9694276614578856 + }, + { + "bAssetIndex": 2, + "mAssetQty": "1000000000000000000", + "outputQty": "1031536479718505769", + "swapFee": "600000000000000", + "priceReceived": 0.9694276641315568 + }, + { + "bAssetIndex": 2, + "mAssetQty": "10000000000000000000", + "outputQty": "10315364512688477585", + "swapFee": "6000000000000000", + "priceReceived": 0.9694276908682614 + }, + { + "bAssetIndex": 2, + "mAssetQty": "100000000000000000000", + "outputQty": "103153616677305760855", + "swapFee": "60000000000000000", + "priceReceived": 0.9694279582346474 + }, + { + "bAssetIndex": 2, + "mAssetQty": "699200000000000050331648", + "outputQty": "719735295724774695853497", + "swapFee": "419520000000000030198", + "priceReceived": 0.9714682663935558 + }, + { + "bAssetIndex": 2, + "mAssetQty": "1398400000000000100663296", + "outputQty": "1436562510306433132366436", + "swapFee": "839040000000000060397", + "priceReceived": 0.9734348418306611 + }, + { + "bAssetIndex": 2, + "mAssetQty": "2097600000000000016777216", + "outputQty": "2150665089589668874928626", + "swapFee": "1258560000000000010066", + "priceReceived": 0.975326195674756 + }, + { + "bAssetIndex": 2, + "mAssetQty": "2796800000000000201326592", + "outputQty": "2862225880440749949280956", + "swapFee": "1678080000000000120795", + "priceReceived": 0.9771416082539667 + }, + { + "bAssetIndex": 2, + "mAssetQty": "3496000000000000117440512", + "outputQty": "3571424149396287304299315", + "swapFee": "2097600000000000070464", + "priceReceived": 0.9788812120204101 + }, + { + "bAssetIndex": 2, + "mAssetQty": "4195200000000000033554432", + "outputQty": "4278428870450291387040727", + "swapFee": "2517120000000000020132", + "priceReceived": 0.980546861249669 + }, + { + "bAssetIndex": 2, + "mAssetQty": "4894399999999999949668352", + "outputQty": "4983381031041406904758446", + "swapFee": "2936639999999999969801", + "priceReceived": 0.9821444456108924 + }, + { + "bAssetIndex": 2, + "mAssetQty": "5593600000000000402653184", + "outputQty": "5686335360077022575227123", + "swapFee": "3356160000000000241591", + "priceReceived": 0.9836915422315566 + }, + { + "bAssetIndex": 2, + "mAssetQty": "6292799999999999781896192", + "outputQty": "6386983946516870516850932", + "swapFee": "3775679999999999869137", + "priceReceived": 0.9852537680843501 + }, + { + "bAssetIndex": 2, + "mAssetQty": "6992000000000000234881024", + "outputQty": "7081669723679473743584718", + "swapFee": "4195200000000000140928", + "priceReceived": 0.9873377710090547 + } + ] + }, + { + "reserve0": "5503000000000000000000000", + "reserve1": "3996499999999999360000000", + "reserve2": "500500000000000000000000", + "A": 120, + "mAssetSupply": "9936488013915504712820075", + "hardMin": 50000000000000000, + "hardMax": 750000000000000000, + "swapFeeRate": 600000000000000, + "redeems": [ + { + "bAssetIndex": 0, + "mAssetQty": "10000000000000", + "outputQty": "10164507628712", + "swapFee": "6000000000", + "priceReceived": 0.9838154847513411 + }, + { + "bAssetIndex": 0, + "mAssetQty": "1000000000000000", + "outputQty": "1016450762869405", + "swapFee": "600000000000", + "priceReceived": 0.9838154847530783 + }, + { + "bAssetIndex": 0, + "mAssetQty": "100000000000000000", + "outputQty": "101645076268747784", + "swapFee": "60000000000000", + "priceReceived": 0.9838154849291644 + }, + { + "bAssetIndex": 0, + "mAssetQty": "1000000000000000000", + "outputQty": "1016450761033593659", + "swapFee": "600000000000000", + "priceReceived": 0.9838154865299471 + }, + { + "bAssetIndex": 0, + "mAssetQty": "10000000000000000000", + "outputQty": "10164507444947540299", + "swapFee": "6000000000000000", + "priceReceived": 0.9838155025377731 + }, + { + "bAssetIndex": 0, + "mAssetQty": "100000000000000000000", + "outputQty": "101645057910657481556", + "swapFee": "60000000000000000", + "priceReceived": 0.9838156626158506 + }, + { + "bAssetIndex": 0, + "mAssetQty": "699200000000000050331648", + "outputQty": "709811194731357498535926", + "swapFee": "419520000000000030198", + "priceReceived": 0.9850506799412012 + }, + { + "bAssetIndex": 0, + "mAssetQty": "1398400000000000100663296", + "outputQty": "1417856802946775499008223", + "swapFee": "839040000000000060397", + "priceReceived": 0.9862773145311023 + }, + { + "bAssetIndex": 0, + "mAssetQty": "2097600000000000016777216", + "outputQty": "2124117621986889874550225", + "swapFee": "1258560000000000010066", + "priceReceived": 0.987515935222982 + }, + { + "bAssetIndex": 0, + "mAssetQty": "2796800000000000201326592", + "outputQty": "2828453206635174009338277", + "swapFee": "1678080000000000120795", + "priceReceived": 0.9888090046669609 + }, + { + "bAssetIndex": 0, + "mAssetQty": "3496000000000000117440512", + "outputQty": "3530389470952646920936233", + "swapFee": "2097600000000000070464", + "priceReceived": 0.9902590149796229 + }, + { + "bAssetIndex": 0, + "mAssetQty": "4195200000000000033554432", + "outputQty": "4228234336159812906095991", + "swapFee": "2517120000000000020132", + "priceReceived": 0.9921872030891704 + }, + { + "bAssetIndex": 0, + "mAssetQty": "4894399999999999949668352", + "hardLimitError": true + }, + { + "bAssetIndex": 0, + "mAssetQty": "5593600000000000402653184", + "hardLimitError": true + }, + { + "bAssetIndex": 0, + "mAssetQty": "6292799999999999781896192", + "hardLimitError": true + }, + { + "bAssetIndex": 0, + "mAssetQty": "6992000000000000234881024", + "hardLimitError": true + }, + { + "bAssetIndex": 1, + "mAssetQty": "10000000000000", + "outputQty": "10102482433971", + "swapFee": "6000000000", + "priceReceived": 0.9898557176772326 + }, + { + "bAssetIndex": 1, + "mAssetQty": "1000000000000000", + "outputQty": "1010248243395131", + "swapFee": "600000000000", + "priceReceived": 0.9898557176791619 + }, + { + "bAssetIndex": 1, + "mAssetQty": "100000000000000000", + "outputQty": "101024824319319536", + "swapFee": "60000000000000", + "priceReceived": 0.9898557178770213 + }, + { + "bAssetIndex": 1, + "mAssetQty": "1000000000000000000", + "outputQty": "1010248241357415368", + "swapFee": "600000000000000", + "priceReceived": 0.9898557196757449 + }, + { + "bAssetIndex": 1, + "mAssetQty": "10000000000000000000", + "outputQty": "10102482229996021343", + "swapFee": "6000000000000000", + "priceReceived": 0.989855737662994 + }, + { + "bAssetIndex": 1, + "mAssetQty": "100000000000000000000", + "outputQty": "101024803942014778472", + "swapFee": "60000000000000000", + "priceReceived": 0.9898559175368161 + }, + { + "bAssetIndex": 1, + "mAssetQty": "699200000000000050331648", + "outputQty": "705304582913346103367752", + "swapFee": "419520000000000030198", + "priceReceived": 0.9913447564906919 + }, + { + "bAssetIndex": 1, + "mAssetQty": "1398400000000000100663296", + "outputQty": "1408072410479239344834297", + "swapFee": "839040000000000060397", + "priceReceived": 0.9931307435560454 + }, + { + "bAssetIndex": 1, + "mAssetQty": "2097600000000000016777216", + "outputQty": "2106940933929894641926187", + "swapFee": "1258560000000000010066", + "priceReceived": 0.9955665895614493 + }, + { + "bAssetIndex": 1, + "mAssetQty": "2796800000000000201326592", + "hardLimitError": true + }, + { + "bAssetIndex": 1, + "mAssetQty": "3496000000000000117440512", + "hardLimitError": true + }, + { + "bAssetIndex": 1, + "mAssetQty": "4195200000000000033554432", + "hardLimitError": true + }, + { + "bAssetIndex": 1, + "mAssetQty": "4894399999999999949668352", + "hardLimitError": true + }, + { + "bAssetIndex": 1, + "mAssetQty": "5593600000000000402653184", + "hardLimitError": true + }, + { + "bAssetIndex": 1, + "mAssetQty": "6292799999999999781896192", + "hardLimitError": true + }, + { + "bAssetIndex": 1, + "mAssetQty": "6992000000000000234881024", + "hardLimitError": true + }, + { + "bAssetIndex": 2, + "mAssetQty": "10000000000000", + "outputQty": "8741464880681", + "swapFee": "6000000000", + "priceReceived": 1.1439730224279017 + }, + { + "bAssetIndex": 2, + "mAssetQty": "1000000000000000", + "outputQty": "874146487884345", + "swapFee": "600000000000", + "priceReceived": 1.143973022668377 + }, + { + "bAssetIndex": 2, + "mAssetQty": "100000000000000000", + "outputQty": "87414646950531602", + "swapFee": "60000000000000", + "priceReceived": 1.14397304672054 + }, + { + "bAssetIndex": 2, + "mAssetQty": "1000000000000000000", + "outputQty": "874146302423016603", + "swapFee": "600000000000000", + "priceReceived": 1.1439732653768984 + }, + { + "bAssetIndex": 2, + "mAssetQty": "10000000000000000000", + "outputQty": "8741446315790339457", + "swapFee": "6000000000000000", + "priceReceived": 1.143975451972546 + }, + { + "bAssetIndex": 2, + "mAssetQty": "100000000000000000000", + "outputQty": "87412792104014619454", + "swapFee": "60000000000000000", + "priceReceived": 1.1439973211358763 + }, + { + "bAssetIndex": 2, + "mAssetQty": "699200000000000050331648", + "hardLimitError": true + }, + { + "bAssetIndex": 2, + "mAssetQty": "1398400000000000100663296", + "hardLimitError": true + }, + { + "bAssetIndex": 2, + "mAssetQty": "2097600000000000016777216", + "hardLimitError": true + }, + { + "bAssetIndex": 2, + "mAssetQty": "2796800000000000201326592", + "hardLimitError": true + }, + { + "bAssetIndex": 2, + "mAssetQty": "3496000000000000117440512", + "hardLimitError": true + }, + { + "bAssetIndex": 2, + "mAssetQty": "4195200000000000033554432", + "hardLimitError": true + }, + { + "bAssetIndex": 2, + "mAssetQty": "4894399999999999949668352", + "hardLimitError": true + }, + { + "bAssetIndex": 2, + "mAssetQty": "5593600000000000402653184", + "hardLimitError": true + }, + { + "bAssetIndex": 2, + "mAssetQty": "6292799999999999781896192", + "hardLimitError": true + }, + { + "bAssetIndex": 2, + "mAssetQty": "6992000000000000234881024", + "hardLimitError": true + } + ] + } +] \ No newline at end of file diff --git a/test-utils/validator-data/sample/swapTestData.json b/test-utils/validator-data/sample/swapTestData.json new file mode 100644 index 00000000..94b18081 --- /dev/null +++ b/test-utils/validator-data/sample/swapTestData.json @@ -0,0 +1,694 @@ +[ + { + "reserve0": "5503000000000000000000000", + "reserve1": "500500000000000000000000", + "reserve2": "3996499999999999360000000", + "A": 120, + "mAssetSupply": "9936488013915504712820075", + "hardMin": 50000000000000000, + "hardMax": 750000000000000000, + "swapFeeRate": 600000000000000, + "swaps": [ + { + "inputIndex": 0, + "inputQty": "10000000000000", + "outputIndex": 1, + "outputQty": "8594828515917", + "swapFee": "5899351172", + "priceReceived": 1.1628039617450947 + }, + { + "inputIndex": 0, + "inputQty": "1000000000000000", + "outputIndex": 1, + "outputQty": "859482851387857", + "swapFee": "589935117275", + "priceReceived": 1.1628039620207888 + }, + { + "inputIndex": 0, + "inputQty": "100000000000000000", + "outputIndex": 1, + "outputQty": "85948283101101317", + "swapFee": "58993511717134", + "priceReceived": 1.1628039895889701 + }, + { + "inputIndex": 0, + "inputQty": "1000000000000000000", + "outputIndex": 1, + "outputQty": "859482645766757989", + "swapFee": "589935116226982", + "priceReceived": 1.1628042402091592 + }, + { + "inputIndex": 0, + "inputQty": "10000000000000000000", + "outputIndex": 1, + "outputQty": "8594807933019418572", + "swapFee": "5899351067834018", + "priceReceived": 1.1628067464471152 + }, + { + "inputIndex": 0, + "inputQty": "100000000000000000000", + "outputIndex": 1, + "outputQty": "85946226642713984426", + "swapFee": "58993501234750486", + "priceReceived": 1.1628318124334742 + }, + { + "inputIndex": 0, + "inputQty": "699200000000000050331648", + "outputIndex": 1, + "hardLimitError": true + }, + { + "inputIndex": 0, + "inputQty": "1398400000000000100663296", + "outputIndex": 1, + "hardLimitError": true + }, + { + "inputIndex": 0, + "inputQty": "2097600000000000016777216", + "outputIndex": 1, + "hardLimitError": true + }, + { + "inputIndex": 0, + "inputQty": "2796800000000000201326592", + "outputIndex": 1, + "hardLimitError": true + }, + { + "inputIndex": 0, + "inputQty": "3496000000000000117440512", + "outputIndex": 1, + "hardLimitError": true + }, + { + "inputIndex": 0, + "inputQty": "4195200000000000033554432", + "outputIndex": 1, + "hardLimitError": true + }, + { + "inputIndex": 0, + "inputQty": "4894399999999999949668352", + "outputIndex": 1, + "hardLimitError": true + }, + { + "inputIndex": 0, + "inputQty": "5593600000000000402653184", + "outputIndex": 1, + "hardLimitError": true + }, + { + "inputIndex": 0, + "inputQty": "6292799999999999781896192", + "outputIndex": 1, + "hardLimitError": true + }, + { + "inputIndex": 0, + "inputQty": "6992000000000000234881024", + "outputIndex": 1, + "hardLimitError": true + }, + { + "inputIndex": 0, + "inputQty": "10000000000000", + "outputIndex": 2, + "outputQty": "9933015265778", + "swapFee": "5899351172", + "priceReceived": 1.006149732122174 + }, + { + "inputIndex": 0, + "inputQty": "1000000000000000", + "outputIndex": 2, + "outputQty": "993301526573337", + "swapFee": "589935117275", + "priceReceived": 1.0061497321266193 + }, + { + "inputIndex": 0, + "inputQty": "100000000000000000", + "outputIndex": 2, + "outputQty": "99330152613560344", + "swapFee": "58993511717134", + "priceReceived": 1.0061497325701192 + }, + { + "inputIndex": 0, + "inputQty": "1000000000000000000", + "outputIndex": 2, + "outputQty": "993301522156207633", + "swapFee": "589935116226982", + "priceReceived": 1.0061497366019387 + }, + { + "inputIndex": 0, + "inputQty": "10000000000000000000", + "outputIndex": 2, + "outputQty": "9933014823622019721", + "swapFee": "5899351067834018", + "priceReceived": 1.006149776920183 + }, + { + "inputIndex": 0, + "inputQty": "100000000000000000000", + "outputIndex": 2, + "outputQty": "99330108441738514131", + "swapFee": "58993501234750486", + "priceReceived": 1.0061501801076262 + }, + { + "inputIndex": 0, + "inputQty": "699200000000000050331648", + "outputIndex": 2, + "outputQty": "692112050839051884447054", + "swapFee": "411965810390800782245", + "priceReceived": 1.0096458129033645 + }, + { + "inputIndex": 0, + "inputQty": "1398400000000000100663296", + "outputIndex": 2, + "hardLimitError": true + }, + { + "inputIndex": 0, + "inputQty": "2097600000000000016777216", + "outputIndex": 2, + "hardLimitError": true + }, + { + "inputIndex": 0, + "inputQty": "2796800000000000201326592", + "outputIndex": 2, + "hardLimitError": true + }, + { + "inputIndex": 0, + "inputQty": "3496000000000000117440512", + "outputIndex": 2, + "hardLimitError": true + }, + { + "inputIndex": 0, + "inputQty": "4195200000000000033554432", + "outputIndex": 2, + "hardLimitError": true + }, + { + "inputIndex": 0, + "inputQty": "4894399999999999949668352", + "outputIndex": 2, + "hardLimitError": true + }, + { + "inputIndex": 0, + "inputQty": "5593600000000000402653184", + "outputIndex": 2, + "hardLimitError": true + }, + { + "inputIndex": 0, + "inputQty": "6292799999999999781896192", + "outputIndex": 2, + "hardLimitError": true + }, + { + "inputIndex": 0, + "inputQty": "6992000000000000234881024", + "outputIndex": 2, + "hardLimitError": true + }, + { + "inputIndex": 1, + "inputQty": "10000000000000", + "outputIndex": 0, + "outputQty": "11620945759945", + "swapFee": "6859719831", + "priceReceived": 0.8599248707117532 + }, + { + "inputIndex": 1, + "inputQty": "1000000000000000", + "outputIndex": 0, + "outputQty": "1162094575673868", + "swapFee": "685971983000", + "priceReceived": 0.8599248709491 + }, + { + "inputIndex": 1, + "inputQty": "100000000000000000", + "outputIndex": 0, + "outputQty": "116209454362088099", + "swapFee": "68597196650141", + "priceReceived": 0.8599248946818155 + }, + { + "inputIndex": 1, + "inputQty": "1000000000000000000", + "outputIndex": 0, + "outputQty": "1162094252230663839", + "swapFee": "685971816509847", + "priceReceived": 0.8599251104334148 + }, + { + "inputIndex": 1, + "inputQty": "10000000000000000000", + "outputIndex": 0, + "outputQty": "11620913383853133332", + "swapFee": "6859703166228994", + "priceReceived": 0.8599272679132866 + }, + { + "inputIndex": 1, + "inputQty": "100000000000000000000", + "outputIndex": 0, + "outputQty": "116206220561278555141", + "swapFee": "68595532062973176", + "priceReceived": 0.8599488391005764 + }, + { + "inputIndex": 1, + "inputQty": "699200000000000050331648", + "outputIndex": 0, + "outputQty": "745890348448147376765907", + "swapFee": "445006902707531211857", + "priceReceived": 0.9368065889994129 + }, + { + "inputIndex": 1, + "inputQty": "1398400000000000100663296", + "outputIndex": 0, + "outputQty": "1455978176046775934050805", + "swapFee": "871263438783980145513", + "priceReceived": 0.9598555524752027 + }, + { + "inputIndex": 1, + "inputQty": "2097600000000000016777216", + "outputIndex": 0, + "outputQty": "2158527843482740112916076", + "swapFee": "1293720116988526957620", + "priceReceived": 0.9711740741322403 + }, + { + "inputIndex": 1, + "inputQty": "2796800000000000201326592", + "outputIndex": 0, + "outputQty": "2857415815532514252372830", + "swapFee": "1714701523310602758700", + "priceReceived": 0.9781864030019696 + }, + { + "inputIndex": 1, + "inputQty": "3496000000000000117440512", + "outputIndex": 0, + "outputQty": "3552759522564674531561542", + "swapFee": "2134908027576693262258", + "priceReceived": 0.9834229054293727 + }, + { + "inputIndex": 1, + "inputQty": "4195200000000000033554432", + "outputIndex": 0, + "outputQty": "4241362748345309178531825", + "swapFee": "2554620993917667761718", + "priceReceived": 0.9885137461165676 + }, + { + "inputIndex": 1, + "inputQty": "4894399999999999949668352", + "outputIndex": 0, + "outputQty": "4904706719603051186243047", + "swapFee": "2973973525353851305566", + "priceReceived": 0.9972922554012608 + }, + { + "inputIndex": 1, + "inputQty": "5593600000000000402653184", + "outputIndex": 0, + "hardLimitError": true + }, + { + "inputIndex": 1, + "inputQty": "6292799999999999781896192", + "outputIndex": 0, + "hardLimitError": true + }, + { + "inputIndex": 1, + "inputQty": "6992000000000000234881024", + "outputIndex": 0, + "hardLimitError": true + }, + { + "inputIndex": 1, + "inputQty": "10000000000000", + "outputIndex": 2, + "outputQty": "11550033183542", + "swapFee": "6859719831", + "priceReceived": 0.8652044649021905 + }, + { + "inputIndex": 1, + "inputQty": "1000000000000000", + "outputIndex": 2, + "outputQty": "1155003318045790", + "swapFee": "685971983000", + "priceReceived": 0.8652044651333047 + }, + { + "inputIndex": 1, + "inputQty": "100000000000000000", + "outputIndex": 2, + "outputQty": "115500328721628968", + "swapFee": "68597196650141", + "priceReceived": 0.8652044882417411 + }, + { + "inputIndex": 1, + "inputQty": "1000000000000000000", + "outputIndex": 2, + "outputQty": "1155003006948657823", + "swapFee": "685971816509847", + "priceReceived": 0.8652046983180812 + }, + { + "inputIndex": 1, + "inputQty": "10000000000000000000", + "outputIndex": 2, + "outputQty": "11550002043267059664", + "swapFee": "6859703166228994", + "priceReceived": 0.8652067990463392 + }, + { + "inputIndex": 1, + "inputQty": "100000000000000000000", + "outputIndex": 2, + "outputQty": "115497218354278530158", + "swapFee": "68595532062973176", + "priceReceived": 0.865227802815176 + }, + { + "inputIndex": 1, + "inputQty": "699200000000000050331648", + "outputIndex": 2, + "outputQty": "743166819088135044993130", + "swapFee": "445006902707531211857", + "priceReceived": 0.9402397619886531 + }, + { + "inputIndex": 1, + "inputQty": "1398400000000000100663296", + "outputIndex": 2, + "outputQty": "1450928056228897744391420", + "swapFee": "871263438783980145513", + "priceReceived": 0.9631964386942302 + }, + { + "inputIndex": 1, + "inputQty": "2097600000000000016777216", + "outputIndex": 2, + "outputQty": "2149425990449541609895316", + "swapFee": "1293720116988526957620", + "priceReceived": 0.9752865598524654 + }, + { + "inputIndex": 1, + "inputQty": "2796800000000000201326592", + "outputIndex": 2, + "outputQty": "2838442023752825260195309", + "swapFee": "1714701523310602758700", + "priceReceived": 0.9847251679219391 + }, + { + "inputIndex": 1, + "inputQty": "3496000000000000117440512", + "outputIndex": 2, + "outputQty": "3494131812367917204123626", + "swapFee": "2134908027576693262258", + "priceReceived": 0.9999236661895382 + }, + { + "inputIndex": 1, + "inputQty": "4195200000000000033554432", + "outputIndex": 2, + "hardLimitError": true + }, + { + "inputIndex": 1, + "inputQty": "4894399999999999949668352", + "outputIndex": 2, + "hardLimitError": true + }, + { + "inputIndex": 1, + "inputQty": "5593600000000000402653184", + "outputIndex": 2, + "hardLimitError": true + }, + { + "inputIndex": 1, + "inputQty": "6292799999999999781896192", + "outputIndex": 2, + "hardLimitError": true + }, + { + "inputIndex": 1, + "inputQty": "6992000000000000234881024", + "outputIndex": 2, + "hardLimitError": true + }, + { + "inputIndex": 2, + "inputQty": "10000000000000", + "outputIndex": 0, + "outputQty": "10055359156058", + "swapFee": "5935570825", + "priceReceived": 0.9939042727433488 + }, + { + "inputIndex": 2, + "inputQty": "1000000000000000", + "outputIndex": 0, + "outputQty": "1005535915601292", + "swapFee": "593557082546", + "priceReceived": 0.9939042727477589 + }, + { + "inputIndex": 2, + "inputQty": "100000000000000000", + "outputIndex": 0, + "outputQty": "100553591515543302", + "swapFee": "59355708242930", + "priceReceived": 0.9939042731885764 + }, + { + "inputIndex": 2, + "inputQty": "1000000000000000000", + "outputIndex": 0, + "outputQty": "1005535911102178221", + "swapFee": "593557081361661", + "priceReceived": 0.9939042771960065 + }, + { + "inputIndex": 2, + "inputQty": "10000000000000000000", + "outputIndex": 0, + "outputQty": "10055358705696826886", + "swapFee": "5935570706852205", + "priceReceived": 0.9939043172702577 + }, + { + "inputIndex": 2, + "inputQty": "100000000000000000000", + "outputIndex": 0, + "outputQty": "100553546524996650939", + "swapFee": "59355696392160991", + "priceReceived": 0.9939047180077686 + }, + { + "inputIndex": 2, + "inputQty": "699200000000000050331648", + "outputIndex": 0, + "outputQty": "701018217861898684511298", + "swapFee": "414460558510421777310", + "priceReceived": 0.9968150921566366 + }, + { + "inputIndex": 2, + "inputQty": "1398400000000000100663296", + "outputIndex": 0, + "outputQty": "1398171292102579103177398", + "swapFee": "827881449563621606965", + "priceReceived": 0.9995714591226933 + }, + { + "inputIndex": 2, + "inputQty": "2097600000000000016777216", + "outputIndex": 0, + "outputQty": "2091056554689476319158584", + "swapFee": "1240319563507359838670", + "priceReceived": 1.0025360986698917 + }, + { + "inputIndex": 2, + "inputQty": "2796800000000000201326592", + "outputIndex": 0, + "hardLimitError": true + }, + { + "inputIndex": 2, + "inputQty": "3496000000000000117440512", + "outputIndex": 0, + "hardLimitError": true + }, + { + "inputIndex": 2, + "inputQty": "4195200000000000033554432", + "outputIndex": 0, + "hardLimitError": true + }, + { + "inputIndex": 2, + "inputQty": "4894399999999999949668352", + "outputIndex": 0, + "hardLimitError": true + }, + { + "inputIndex": 2, + "inputQty": "5593600000000000402653184", + "outputIndex": 0, + "hardLimitError": true + }, + { + "inputIndex": 2, + "inputQty": "6292799999999999781896192", + "outputIndex": 0, + "hardLimitError": true + }, + { + "inputIndex": 2, + "inputQty": "6992000000000000234881024", + "outputIndex": 0, + "hardLimitError": true + }, + { + "inputIndex": 2, + "inputQty": "10000000000000", + "outputIndex": 1, + "outputQty": "8647597319619", + "swapFee": "5935570825", + "priceReceived": 1.155704186930772 + }, + { + "inputIndex": 2, + "inputQty": "1000000000000000", + "outputIndex": 1, + "outputQty": "864759731762277", + "swapFee": "593557082546", + "priceReceived": 1.155704187197504 + }, + { + "inputIndex": 2, + "inputQty": "100000000000000000", + "outputIndex": 1, + "outputQty": "86475971180035582", + "swapFee": "59355708242930", + "priceReceived": 1.155704213875658 + }, + { + "inputIndex": 2, + "inputQty": "1000000000000000000", + "outputIndex": 1, + "outputQty": "864759530328127639", + "swapFee": "593557081361661", + "priceReceived": 1.1557044564046837 + }, + { + "inputIndex": 2, + "inputQty": "10000000000000000000", + "outputIndex": 1, + "outputQty": "8647577155837814186", + "swapFee": "5935570706852205", + "priceReceived": 1.1557068817300284 + }, + { + "inputIndex": 2, + "inputQty": "100000000000000000000", + "outputIndex": 1, + "outputQty": "86473956593366315633", + "swapFee": "59355696392160991", + "priceReceived": 1.1557311384925644 + }, + { + "inputIndex": 2, + "inputQty": "699200000000000050331648", + "outputIndex": 1, + "hardLimitError": true + }, + { + "inputIndex": 2, + "inputQty": "1398400000000000100663296", + "outputIndex": 1, + "hardLimitError": true + }, + { + "inputIndex": 2, + "inputQty": "2097600000000000016777216", + "outputIndex": 1, + "hardLimitError": true + }, + { + "inputIndex": 2, + "inputQty": "2796800000000000201326592", + "outputIndex": 1, + "hardLimitError": true + }, + { + "inputIndex": 2, + "inputQty": "3496000000000000117440512", + "outputIndex": 1, + "hardLimitError": true + }, + { + "inputIndex": 2, + "inputQty": "4195200000000000033554432", + "outputIndex": 1, + "hardLimitError": true + }, + { + "inputIndex": 2, + "inputQty": "4894399999999999949668352", + "outputIndex": 1, + "hardLimitError": true + }, + { + "inputIndex": 2, + "inputQty": "5593600000000000402653184", + "outputIndex": 1, + "hardLimitError": true + }, + { + "inputIndex": 2, + "inputQty": "6292799999999999781896192", + "outputIndex": 1, + "hardLimitError": true + }, + { + "inputIndex": 2, + "inputQty": "6992000000000000234881024", + "outputIndex": 1, + "hardLimitError": true + } + ] + } +] \ No newline at end of file diff --git a/test/governance/ClaimableGovernor.behaviour.ts b/test/governance/ClaimableGovernor.behaviour.ts deleted file mode 100644 index e004a48d..00000000 --- a/test/governance/ClaimableGovernor.behaviour.ts +++ /dev/null @@ -1,129 +0,0 @@ -import { StandardAccounts } from "@utils/machines"; -import { constants, expectRevert } from "@openzeppelin/test-helpers"; -import * as t from "types/generated"; - -const { ZERO_ADDRESS } = constants; - -export default function shouldBehaveLikeClaimable( - ctx: { claimable: t.ClaimableGovernorInstance }, - sa: StandardAccounts, -): void { - it("should have a governor", async () => { - const governor = await ctx.claimable.governor(); - assert.isTrue(governor !== ZERO_ADDRESS); - }); - - it("changes pendingGovernor after transfer", async () => { - const newGovernor = sa.other; - await ctx.claimable.requestGovernorChange(newGovernor, { from: sa.governor }); - const proposedGovernor = await ctx.claimable.proposedGovernor(); - - assert.isTrue(proposedGovernor === newGovernor); - }); - - it("should prevent cancelGovernor from non-governor", async () => { - // Request new Governor - const newGovernor = sa.other; - await ctx.claimable.requestGovernorChange(newGovernor, { from: sa.governor }); - const proposedGovernor = await ctx.claimable.proposedGovernor(); - assert.isTrue(proposedGovernor === newGovernor); - - // Try to Cancel governor - await expectRevert( - ctx.claimable.cancelGovernorChange({ from: sa.default }), - "GOV: caller is not the Governor", - ); - const newProposedGovernor = await ctx.claimable.proposedGovernor(); - assert.isTrue(proposedGovernor === newProposedGovernor); - }); - - it("should prevent cancelGovernor from pending-governor", async () => { - // Request new Governor - const newGovernor = sa.other; - await ctx.claimable.requestGovernorChange(newGovernor, { from: sa.governor }); - const proposedGovernor = await ctx.claimable.proposedGovernor(); - assert.isTrue(proposedGovernor === newGovernor); - - // Try to Cancel governor - await expectRevert( - ctx.claimable.cancelGovernorChange({ from: sa.other }), - "GOV: caller is not the Governor", - ); - const newProposedGovernor = await ctx.claimable.proposedGovernor(); - assert.isTrue(proposedGovernor === newProposedGovernor); - }); - - it("should allow cancelGovernor from Governor", async () => { - // Request new Governor - const newGovernor = sa.other; - const currentGovernor = await ctx.claimable.governor(); - await ctx.claimable.requestGovernorChange(newGovernor, { from: sa.governor }); - const proposedGovernor = await ctx.claimable.proposedGovernor(); - assert.isTrue(proposedGovernor === newGovernor); - - // Try to Cancel governor - await ctx.claimable.cancelGovernorChange({ from: sa.governor }); - const newProposedGovernor = await ctx.claimable.proposedGovernor(); - const governor = await ctx.claimable.governor(); - - assert.isTrue(proposedGovernor !== ZERO_ADDRESS); - assert.isTrue(newProposedGovernor === ZERO_ADDRESS); - assert.isTrue(governor === currentGovernor); - }); - - it("should prevent Others to call claimOwnership when there is no pendingGovernor", async () => { - await expectRevert( - ctx.claimable.claimGovernorChange({ from: sa.other }), - "Sender is not proposed governor", - ); - }); - - it("should prevent Governor to call claimOwnership when there is no pendingGovernor", async () => { - await expectRevert( - ctx.claimable.claimGovernorChange({ from: sa.governor }), - "Sender is not proposed governor", - ); - }); - - it("should prevent non-governors from transfering", async () => { - const { other } = sa; - const governor = await ctx.claimable.governor(); - - assert.isTrue(governor !== other); - await expectRevert( - ctx.claimable.requestGovernorChange(other, { from: other }), - "GOV: caller is not the Governor", - ); - }); - - it("should prevent direct change governor", async () => { - const { other } = sa; - await expectRevert( - ctx.claimable.changeGovernor(other, { from: sa.governor }), - "Direct change not allowed", - ); - }); - - it("requestGovernorChange(): should prevent zero address", async () => { - await expectRevert( - ctx.claimable.requestGovernorChange(ZERO_ADDRESS, { from: sa.governor }), - "Proposed governor is address(0)", - ); - }); - - it("should prevent when already proposed", async () => { - const { other } = sa; - await ctx.claimable.requestGovernorChange(other, { from: sa.governor }); - await expectRevert( - ctx.claimable.requestGovernorChange(other, { from: sa.governor }), - "Proposed governor already set", - ); - }); - - it("cancelGovernorChange(): should prevent when not proposed", async () => { - await expectRevert( - ctx.claimable.cancelGovernorChange({ from: sa.governor }), - "Proposed Governor not set", - ); - }); -} diff --git a/test/governance/DelayedClaimableGovernor.behaviour.ts b/test/governance/DelayedClaimableGovernor.behaviour.ts deleted file mode 100644 index 1aead144..00000000 --- a/test/governance/DelayedClaimableGovernor.behaviour.ts +++ /dev/null @@ -1,75 +0,0 @@ -import { StandardAccounts } from "@utils/machines"; -import { BN } from "@utils/tools"; -import envSetup from "@utils/env_setup"; -import { expectEvent, expectRevert, time } from "@openzeppelin/test-helpers"; -import * as t from "types/generated"; - -const { expect } = envSetup.configure(); - -export default function shouldBehaveLikeDelayedClaimable( - ctx: { claimable: t.DelayedClaimableGovernorInstance }, - sa: StandardAccounts, -): void { - it("should have delay set", async () => { - const delay = await ctx.claimable.delay(); - expect(delay, "wrong delay").bignumber.gt(new BN(0) as any); - }); - - it("should have request time set", async () => { - const timestamp = await time.latest(); - const requestTime = await ctx.claimable.requestTime(); - expect(requestTime, "requestTime is 0").bignumber.gt(new BN(0) as any); - expect(timestamp, "wrong timestamp").bignumber.eq(requestTime); - }); - - it("prevent newGovernor to claim ownership before delay over", async () => { - const newOwner = sa.other; - await expectRevert(ctx.claimable.claimGovernorChange({ from: newOwner }), "Delay not over"); - const owner = await ctx.claimable.governor(); - - expect(owner, "wrong owner").to.not.equal(newOwner); - }); - - it("prevent newOwner to claim ownership before 10 second of delay over time", async () => { - const timestamp = await time.latest(); - const delay = await ctx.claimable.delay(); - await time.increase(delay.sub(new BN(10))); - - const newOwner = sa.other; - await expectRevert(ctx.claimable.claimGovernorChange({ from: newOwner }), "Delay not over"); - const owner = await ctx.claimable.governor(); - const requestTime = await ctx.claimable.requestTime(); - - expect(owner, "wrong owner").to.not.equal(newOwner); - expect(requestTime, "wrong requestTime").bignumber.eq(timestamp); - }); - - it("allow pending owner to claim ownership after delay over", async () => { - const timestamp = await time.latest(); - const delay = await ctx.claimable.delay(); - await time.increase(delay); - const previousGov = await ctx.claimable.governor(); - const newGovernor = sa.other; - const tx = await ctx.claimable.claimGovernorChange({ from: newGovernor }); - expectEvent(tx.receipt, "GovernorChangeClaimed", { proposedGovernor: newGovernor }); - expectEvent(tx.receipt, "GovernorChanged", { - previousGovernor: previousGov, - newGovernor, - }); - - const owner = await ctx.claimable.governor(); - const requestTime = await ctx.claimable.requestTime(); - expect(owner, "owner not equal").to.equal(newGovernor); - expect(requestTime, "wrong requestTime").bignumber.eq(new BN(0)); - }); - - it("should allow cancel change request", async () => { - const requestTime = await ctx.claimable.requestTime(); - expect(requestTime, "wrong requestTime").bignumber.gt(new BN(0) as any); - - const tx = await ctx.claimable.cancelGovernorChange({ from: sa.governor }); - - const newRequestTime = await ctx.claimable.requestTime(); - expect(newRequestTime).bignumber.eq(new BN(0)); - }); -} diff --git a/test/governance/Governable.behaviour.ts b/test/governance/Governable.behaviour.ts deleted file mode 100644 index f5374909..00000000 --- a/test/governance/Governable.behaviour.ts +++ /dev/null @@ -1,39 +0,0 @@ -import { constants, expectEvent, expectRevert } from "@openzeppelin/test-helpers"; -import * as t from "types/generated"; - -const { ZERO_ADDRESS } = constants; - -export default function shouldBehaveLikeGovernable( - ctx: { governable: t.GovernableInstance }, - owner: string, - [other]: string[], -): void { - describe("as a Governable", () => { - it("should have a Governor", async () => { - (await ctx.governable.governor()).should.equal(owner); - }); - - it("changes governor after transfer", async () => { - (await ctx.governable.isGovernor({ from: other })).should.be.equal(false); - const { receipt } = await ctx.governable.changeGovernor(other, { from: owner }); - expectEvent(receipt, "GovernorChanged"); - - (await ctx.governable.governor()).should.equal(other); - (await ctx.governable.isGovernor({ from: other })).should.be.equal(true); - }); - - it("should prevent non-governor from changing governor", async () => { - await expectRevert( - ctx.governable.changeGovernor(other, { from: other }), - "GOV: caller is not the Governor", - ); - }); - - it("should guard ownership against stuck state", async () => { - await expectRevert( - ctx.governable.changeGovernor(ZERO_ADDRESS, { from: owner }), - "GOV: new Governor is address(0)", - ); - }); - }); -} diff --git a/test/governance/TestClaimableGovernor.spec.ts b/test/governance/TestClaimableGovernor.spec.ts deleted file mode 100644 index 449751dc..00000000 --- a/test/governance/TestClaimableGovernor.spec.ts +++ /dev/null @@ -1,34 +0,0 @@ -import { StandardAccounts } from "@utils/machines"; -import envSetup from "@utils/env_setup"; -import { ClaimableGovernorInstance } from "../../types/generated"; -import shouldBehaveLikeClaimable from "./ClaimableGovernor.behaviour"; - -const ClaimableGovernor = artifacts.require("ClaimableGovernor"); -const { assert } = envSetup.configure(); - -contract("ClaimableGovernable", async (accounts) => { - const ctx: { claimable?: ClaimableGovernorInstance } = {}; - const sa = new StandardAccounts(accounts); - - beforeEach("Create Contract", async () => { - ctx.claimable = await ClaimableGovernor.new(sa.governor); - }); - - shouldBehaveLikeClaimable(ctx as Required, sa); - - describe("after initiating a transfer", () => { - let newOwner; - - beforeEach(async () => { - newOwner = sa.other; - await ctx.claimable.requestGovernorChange(newOwner, { from: sa.governor }); - }); - - it("changes allow pending owner to claim ownership", async () => { - await ctx.claimable.claimGovernorChange({ from: newOwner }); - const owner = await ctx.claimable.governor(); - - assert.isTrue(owner === newOwner); - }); - }); -}); diff --git a/test/governance/TestDelayedClaimableGovernor.spec.ts b/test/governance/TestDelayedClaimableGovernor.spec.ts deleted file mode 100644 index f76c75fe..00000000 --- a/test/governance/TestDelayedClaimableGovernor.spec.ts +++ /dev/null @@ -1,43 +0,0 @@ -import { StandardAccounts } from "@utils/machines"; -import envSetup from "@utils/env_setup"; -import { expectRevert } from "@openzeppelin/test-helpers"; -import * as t from "types/generated"; -import shouldBehaveLikeClaimable from "./ClaimableGovernor.behaviour"; -import shouldBehaveLikeDelayedClaimable from "./DelayedClaimableGovernor.behaviour"; - -const DelayedClaimableGovernor = artifacts.require("DelayedClaimableGovernor"); - -contract("DelayedClaimableGovernance", async (accounts) => { - const ctx: { claimable?: t.DelayedClaimableGovernorInstance } = {}; - const sa = new StandardAccounts(accounts); - const GOVERNANCE_DELAY = 60 * 60 * 24 * 7; // 1 week - - describe("Should behave like Claimable", () => { - beforeEach("Create Contract", async () => { - ctx.claimable = await DelayedClaimableGovernor.new(sa.governor, GOVERNANCE_DELAY, { - from: sa.governor, - }); - }); - - shouldBehaveLikeClaimable(ctx as Required, sa); - }); - - describe("Should behave like DelayedClaimable", () => { - beforeEach("Initiate change Governor", async () => { - ctx.claimable = await DelayedClaimableGovernor.new(sa.governor, GOVERNANCE_DELAY, { - from: sa.governor, - }); - const { other } = sa; - await ctx.claimable.requestGovernorChange(other, { from: sa.governor }); - }); - - shouldBehaveLikeDelayedClaimable(ctx as Required, sa); - - it("should not allow zero delay", async () => { - await expectRevert( - DelayedClaimableGovernor.new(sa.governor, 0, { from: sa.governor }), - "Delay must be greater than zero", - ); - }); - }); -}); diff --git a/test/governance/TestGovernable.spec.ts b/test/governance/TestGovernable.spec.ts deleted file mode 100644 index 41c69e15..00000000 --- a/test/governance/TestGovernable.spec.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { StandardAccounts } from "@utils/machines"; -import * as t from "types/generated"; -import shouldBehaveLikeGovernable from "./Governable.behaviour"; - -const MockGovernable = artifacts.require("MockGovernable"); - -contract("Governable", async (accounts) => { - const ctx: { governable?: t.GovernableInstance } = {}; - const sa = new StandardAccounts(accounts); - - beforeEach("Create Contract", async () => { - ctx.governable = await MockGovernable.new({ from: sa.governor }); - }); - - shouldBehaveLikeGovernable(ctx as Required, sa.governor, [sa.other]); -}); diff --git a/test/governance/TestIncentivisedVotingLockup.spec.ts b/test/governance/TestIncentivisedVotingLockup.spec.ts deleted file mode 100644 index b4d4907a..00000000 --- a/test/governance/TestIncentivisedVotingLockup.spec.ts +++ /dev/null @@ -1,1106 +0,0 @@ -/* eslint-disable dot-notation */ -/* eslint-disable no-await-in-loop */ -/* eslint-disable @typescript-eslint/camelcase */ -import { network } from "hardhat"; -import { expectRevert, time } from "@openzeppelin/test-helpers"; -import { assertBNClose, assertBNClosePercent } from "@utils/assertions"; -import { StandardAccounts } from "@utils/machines"; -import envSetup from "@utils/env_setup"; -import { simpleToExactAmount } from "@utils/math"; -import { BN } from "@utils/tools"; -import { ONE_WEEK, ONE_HOUR, ONE_DAY, ONE_YEAR } from "@utils/constants"; -import * as t from "../../types/generated"; - -const VotingLockup = artifacts.require("IncentivisedVotingLockup"); -const MetaToken = artifacts.require("MetaToken"); -const Nexus = artifacts.require("Nexus"); -const { expect } = envSetup.configure(); - -contract("IncentivisedVotingLockup", async (accounts) => { - const sa = new StandardAccounts(accounts); - let votingLockup: t.IncentivisedVotingLockupInstance; - let mta: t.MetaTokenInstance; - - const isCoverage = network.name === "coverage"; - - const fundVotingLockup = async (funding = simpleToExactAmount(100, 18)) => { - await mta.transfer(votingLockup.address, funding, { from: sa.fundManager }); - await votingLockup.notifyRewardAmount(funding, { from: sa.fundManager }); - }; - - const calculateStaticBalance = async (lockupLength: BN, amount: BN): Promise => { - const slope = amount.div(await votingLockup.MAXTIME()); - const s = slope.muln(10000).muln(Math.sqrt(lockupLength.toNumber())); - return s; - }; - - const goToNextUnixWeekStart = async () => { - const unixWeekCount = (await time.latest()).div(ONE_WEEK); - const nextUnixWeek = unixWeekCount.addn(1).mul(ONE_WEEK); - await time.increaseTo(nextUnixWeek); - }; - - const oneWeekInAdvance = async (): Promise => { - const now = await time.latest(); - return now.add(ONE_WEEK); - }; - - const deployFresh = async (initialRewardFunding = new BN(0)) => { - const nexus = await Nexus.new(sa.governor); - mta = await MetaToken.new(nexus.address, sa.fundManager); - await mta.transfer(sa.default, simpleToExactAmount(1000, 18), { from: sa.fundManager }); - await mta.transfer(sa.other, simpleToExactAmount(1000, 18), { from: sa.fundManager }); - votingLockup = await VotingLockup.new( - mta.address, - "Voting MTA", - "vMTA", - nexus.address, - sa.fundManager, - ); - await mta.approve(votingLockup.address, simpleToExactAmount(100, 18)); - await mta.approve(votingLockup.address, simpleToExactAmount(100, 18), { from: sa.other }); - await mta.approve(votingLockup.address, simpleToExactAmount(10000, 18), { - from: sa.fundManager, - }); - if (initialRewardFunding.gtn(0)) { - fundVotingLockup(initialRewardFunding); - } - }; - - describe("checking balances & total supply", () => { - before(async () => { - await deployFresh(); - }); - describe("before any stakes are made", () => { - it("returns balances", async () => { - expect(await votingLockup.staticBalanceOf(sa.default)).bignumber.eq(new BN(0)); - expect(await votingLockup.balanceOf(sa.default)).bignumber.eq(new BN(0)); - expect(await votingLockup.balanceOfAt(sa.default, 1)).bignumber.eq(new BN(0)); - }); - it("returns balance at latest block", async () => { - expect( - await votingLockup.balanceOfAt(sa.default, await time.latestBlock()), - ).bignumber.eq(new BN(0)); - }); - it("returns totalSupply", async () => { - expect(await votingLockup.totalSupply()).bignumber.eq(new BN(0)); - expect(await votingLockup.totalSupplyAt(1)).bignumber.eq(new BN(0)); - }); - it("returns totalSupply at latest block", async () => { - expect(await votingLockup.totalSupplyAt(await time.latestBlock())).bignumber.eq( - new BN(0), - ); - }); - }); - describe("fetching for current block", () => { - it("fails for balanceOfAt", async () => { - await expectRevert( - votingLockup.balanceOfAt(sa.default, (await time.latestBlock()).addn(1)), - "Must pass block number in the past", - ); - }); - it("fails for supply", async () => { - await expectRevert( - votingLockup.totalSupplyAt((await time.latestBlock()).addn(1)), - "Must pass block number in the past", - ); - }); - }); - }); - - interface LockedBalance { - amount: BN; - end: BN; - } - - interface Point { - bias: BN; - slope: BN; - ts: BN; - blk?: BN; - } - - interface ContractData { - epoch: BN; - userEpoch: BN; - endTime: BN; - totalStaticWeight: BN; - userStaticWeight: BN; - userLocked: LockedBalance; - userLastPoint: Point; - lastPoint: Point; - senderStakingTokenBalance: BN; - contractStakingTokenBalance: BN; - userRewardPerTokenPaid: BN; - beneficiaryRewardsEarned: BN; - rewardPerTokenStored: BN; - rewardRate: BN; - rewardsPaid: BN; - lastUpdateTime: BN; - lastTimeRewardApplicable: BN; - periodFinishTime: BN; - } - - const snapshotData = async (sender = sa.default): Promise => { - const locked = await votingLockup.locked(sender); - const userLastPoint = await votingLockup.getLastUserPoint(sender); - const epoch = await await votingLockup.globalEpoch(); - const userEpoch = await await votingLockup.userPointEpoch(sender); - const lastPoint = await votingLockup.pointHistory(epoch); - return { - epoch, - userEpoch, - endTime: await votingLockup.END(), - totalStaticWeight: await votingLockup.totalStaticWeight(), - userStaticWeight: await votingLockup.staticBalanceOf(sender), - userLocked: { - amount: locked[0], - end: locked[1], - }, - userLastPoint: { - bias: userLastPoint[0], - slope: userLastPoint[1], - ts: userLastPoint[2], - }, - lastPoint: { - bias: lastPoint[0], - slope: lastPoint[1], - ts: lastPoint[2], - blk: lastPoint[3], - }, - userRewardPerTokenPaid: await votingLockup.userRewardPerTokenPaid(sender), - senderStakingTokenBalance: await mta.balanceOf(sender), - contractStakingTokenBalance: await mta.balanceOf(votingLockup.address), - beneficiaryRewardsEarned: await votingLockup.rewards(sender), - rewardPerTokenStored: await votingLockup.rewardPerTokenStored(), - rewardRate: await votingLockup.rewardRate(), - rewardsPaid: await votingLockup.rewardsPaid(sender), - lastUpdateTime: await votingLockup.lastUpdateTime(), - lastTimeRewardApplicable: await votingLockup.lastTimeRewardApplicable(), - periodFinishTime: await votingLockup.periodFinish(), - }; - }; - - // Flow performed with 4 stakers - // 1 - stakes 10 for a year - // 2 - stakes 1000 for 6 months - // - increases time after 3 to 12m - // 3 - stakes 10 for 6 months - // - increases amount after 3 - // - gets ejected after 6m - // 4 - stakes 10 from 3-6 mo & exits - // 5 - stakes 10 at start for 1 week - describe("performing full system flow", () => { - const alice = sa.default; - const bob = sa.dummy1; - const charlie = sa.dummy2; - const david = sa.dummy3; - const eve = sa.dummy4; - const stakeAmt1 = simpleToExactAmount(10, 18); - const stakeAmt2 = simpleToExactAmount(1000, 18); - let start; - let maxTime; - before(async () => { - await goToNextUnixWeekStart(); - start = await time.latest(); - await deployFresh(simpleToExactAmount(100, 18)); - maxTime = await votingLockup.MAXTIME(); - await mta.transfer(alice, simpleToExactAmount(1, 22), { from: sa.fundManager }); - await mta.transfer(bob, simpleToExactAmount(1, 22), { from: sa.fundManager }); - await mta.transfer(charlie, simpleToExactAmount(1, 22), { from: sa.fundManager }); - await mta.transfer(david, simpleToExactAmount(1, 22), { from: sa.fundManager }); - await mta.transfer(eve, simpleToExactAmount(1, 22), { from: sa.fundManager }); - await mta.approve(votingLockup.address, simpleToExactAmount(100, 21), { from: alice }); - await mta.approve(votingLockup.address, simpleToExactAmount(100, 21), { from: bob }); - await mta.approve(votingLockup.address, simpleToExactAmount(100, 21), { - from: charlie, - }); - await mta.approve(votingLockup.address, simpleToExactAmount(100, 21), { from: david }); - await mta.approve(votingLockup.address, simpleToExactAmount(100, 21), { from: eve }); - }); - describe("checking initial settings", () => { - it("should set END date one year in advance", async () => { - const endTime = await votingLockup.END(); - assertBNClose(endTime, (await time.latest()).add(ONE_YEAR), 100); - }); - it("sets & gets duration", async () => { - const duration = await votingLockup.getDuration(); - expect(duration).bignumber.eq(ONE_WEEK); - }); - it("sets ERC20 details", async () => { - const name = await votingLockup.name(); - const symbol = await votingLockup.symbol(); - const decimals = await votingLockup.decimals(); - const supply = await votingLockup.totalSupply(); - expect(name).eq("Voting MTA"); - expect(symbol).eq("vMTA"); - expect(decimals).bignumber.eq(new BN(18)); - expect(supply).bignumber.eq(new BN(0)); - }); - }); - - const calcBias = (amount: BN, len: BN): BN => { - return amount.div(maxTime).mul(len); - }; - - describe("creating a lockup", () => { - it("allows user to create a lock", async () => { - await votingLockup.createLock(stakeAmt1, start.add(ONE_YEAR), { from: alice }); - await votingLockup.createLock(stakeAmt2, start.add(ONE_WEEK.muln(26)), { - from: bob, - }); - await votingLockup.createLock(stakeAmt1, start.add(ONE_WEEK.muln(26)), { - from: charlie, - }); - await votingLockup.createLock(stakeAmt1, start.add(ONE_WEEK), { - from: eve, - }); - - const aliceData = await snapshotData(alice); - const bobData = await snapshotData(bob); - const charlieData = await snapshotData(charlie); - const eveData = await snapshotData(eve); - - // Bias - assertBNClosePercent( - aliceData.userLastPoint.bias, - calcBias(stakeAmt1, ONE_YEAR), - "0.4", - ); - assertBNClosePercent( - bobData.userLastPoint.bias, - calcBias(stakeAmt2, ONE_WEEK.muln(26)), - "0.4", - ); - assertBNClosePercent( - charlieData.userLastPoint.bias, - calcBias(stakeAmt1, ONE_WEEK.muln(26)), - "0.4", - ); - - // Static Balance - assertBNClosePercent( - aliceData.userStaticWeight, - await calculateStaticBalance(ONE_YEAR, stakeAmt1), - "0.4", - ); - assertBNClosePercent( - bobData.userStaticWeight, - await calculateStaticBalance(ONE_WEEK.muln(26), stakeAmt2), - "0.4", - ); - assertBNClosePercent( - charlieData.userStaticWeight, - await calculateStaticBalance(ONE_WEEK.muln(26), stakeAmt1), - "0.4", - ); - expect(charlieData.totalStaticWeight).bignumber.eq( - aliceData.userStaticWeight - .add(bobData.userStaticWeight) - .add(charlieData.userStaticWeight) - .add(eveData.userStaticWeight), - ); - }); - it("rejects if the params are wrong", async () => { - await expectRevert( - votingLockup.createLock(new BN(0), start.add(ONE_WEEK), { from: sa.other }), - "Must stake non zero amount", - ); - await expectRevert( - votingLockup.createLock(new BN(1), start.add(ONE_WEEK), { from: alice }), - "Withdraw old tokens first", - ); - await expectRevert( - votingLockup.createLock(new BN(1), start.sub(ONE_WEEK), { from: sa.other }), - "Can only lock until time in the future", - ); - }); - it("only allows creation up until END date", async () => { - await expectRevert( - votingLockup.createLock(new BN(1), start.add(ONE_YEAR.add(ONE_WEEK)), { - from: sa.other, - }), - "Voting lock can be 1 year max (until recol)", - ); - }); - }); - - describe("extending lock", () => { - before(async () => { - await time.increase(ONE_WEEK.muln(12)); - - // Eves lock is now expired - }); - describe("by amount", () => { - it("fails if conditions are not met", async () => { - await expectRevert( - votingLockup.increaseLockAmount(new BN(0), { from: alice }), - "Must stake non zero amount", - ); - await expectRevert( - votingLockup.increaseLockAmount(new BN(1), { from: sa.other }), - "No existing lock found", - ); - await expectRevert( - votingLockup.increaseLockAmount(new BN(1), { from: eve }), - "Cannot add to expired lock. Withdraw", - ); - }); - it("allows someone to increase lock amount", async () => { - const charlieSnapBefore = await snapshotData(charlie); - - await votingLockup.increaseLockAmount(stakeAmt2, { from: charlie }); - - const charlieSnapAfter = await snapshotData(charlie); - - expect(charlieSnapAfter.totalStaticWeight).bignumber.eq( - charlieSnapBefore.totalStaticWeight - .sub(charlieSnapBefore.userStaticWeight) - .add(charlieSnapAfter.userStaticWeight), - ); - assertBNClosePercent( - charlieSnapAfter.userStaticWeight, - await calculateStaticBalance(ONE_WEEK.muln(14), stakeAmt2.add(stakeAmt1)), - "0.4", - ); - }); - }); - - describe("by length", () => { - it("fails if conditions are not met", async () => { - await expectRevert( - votingLockup.increaseLockLength((await time.latest()).add(ONE_WEEK), { - from: eve, - }), - "Lock expired", - ); - await expectRevert( - votingLockup.increaseLockLength((await time.latest()).add(ONE_WEEK), { - from: david, - }), - "Nothing is locked", - ); - await expectRevert( - votingLockup.increaseLockLength((await time.latest()).add(ONE_DAY), { - from: alice, - }), - "Can only increase lock WEEK", - ); - await expectRevert( - votingLockup.increaseLockLength( - (await time.latest()).add(ONE_WEEK.muln(42)), - { - from: bob, - }, - ), - "Voting lock can be 1 year max (until recol)", - ); - - await expectRevert( - votingLockup.createLock( - stakeAmt1, - (await time.latest()).add(ONE_WEEK.muln(42)), - { - from: david, - }, - ), - "Voting lock can be 1 year max (until recol)", - ); - }); - it("allows user to extend lock", async () => { - await goToNextUnixWeekStart(); - const bobSnapBefore = await snapshotData(bob); - const len = bobSnapBefore.endTime.sub(await time.latest()); - await votingLockup.increaseLockLength(start.add(ONE_YEAR), { from: bob }); - - const bobSnapAfter = await snapshotData(bob); - - expect(bobSnapAfter.totalStaticWeight).bignumber.eq( - bobSnapBefore.totalStaticWeight - .sub(bobSnapBefore.userStaticWeight) - .add(bobSnapAfter.userStaticWeight), - ); - assertBNClosePercent( - bobSnapAfter.userStaticWeight, - await calculateStaticBalance(len, stakeAmt2), - "0.4", - ); - }); - }); - }); - - describe("trying to withdraw early or with nothing to withdraw", () => { - it("fails", async () => { - await expectRevert( - votingLockup.withdraw({ from: alice }), - "The lock didn't expire", - ); - await expectRevert( - votingLockup.withdraw({ from: david }), - "Must have something to withdraw", - ); - }); - }); - - describe("calling public checkpoint", () => { - // checkpoint updates point history - it("allows anyone to call checkpoint and update the history", async () => { - const before = await snapshotData(alice); - await votingLockup.checkpoint(); - const after = await snapshotData(alice); - - expect(after.epoch).bignumber.eq(before.epoch.addn(1)); - expect(after.totalStaticWeight).bignumber.eq(before.totalStaticWeight); - expect(after.lastPoint.bias).bignumber.lt(before.lastPoint.bias as any); - expect(after.lastPoint.slope).bignumber.eq(before.lastPoint.slope); - expect(after.lastPoint.blk).bignumber.eq(await time.latestBlock()); - }); - }); - - describe("calling the getters", () => { - // returns 0 if 0 - it("allows anyone to get last user point", async () => { - const userLastPoint = await votingLockup.getLastUserPoint(alice); - const e = await votingLockup.userPointEpoch(alice); - const p = await votingLockup.userPointHistory(alice, e); - expect(userLastPoint[0]).bignumber.eq(p[0]); - expect(userLastPoint[1]).bignumber.eq(p[1]); - expect(userLastPoint[2]).bignumber.eq(p[2]); - }); - }); - - describe("exiting the system", () => { - before(async () => { - await votingLockup.createLock( - stakeAmt1, - (await time.latest()).add(ONE_WEEK.muln(13)), - { - from: david, - }, - ); - await time.increase(ONE_WEEK.muln(14)); - }); - it("allows user to withdraw", async () => { - // david withdraws - const davidBefore = await snapshotData(david); - await votingLockup.withdraw({ from: david }); - const davidAfter = await snapshotData(david); - - expect(davidAfter.totalStaticWeight).bignumber.eq( - davidBefore.totalStaticWeight.sub(davidBefore.userStaticWeight), - ); - expect(davidAfter.senderStakingTokenBalance).bignumber.eq( - davidBefore.senderStakingTokenBalance.add(davidBefore.userLocked.amount), - ); - expect(davidAfter.userLastPoint.bias).bignumber.eq(new BN(0)); - expect(davidAfter.userLastPoint.slope).bignumber.eq(new BN(0)); - expect(davidAfter.userLocked.amount).bignumber.eq(new BN(0)); - expect(davidAfter.userLocked.end).bignumber.eq(new BN(0)); - }); - // cant eject a user if they haven't finished lockup yet - it("kicks a user and withdraws their stake", async () => { - // charlie is ejected - const charlieBefore = await snapshotData(charlie); - await votingLockup.eject(charlie, { from: david }); - const charlieAfter = await snapshotData(charlie); - - expect(charlieAfter.totalStaticWeight).bignumber.eq( - charlieBefore.totalStaticWeight.sub(charlieBefore.userStaticWeight), - ); - expect(charlieAfter.senderStakingTokenBalance).bignumber.eq( - charlieBefore.senderStakingTokenBalance.add(charlieBefore.userLocked.amount), - ); - expect(charlieAfter.userLastPoint.bias).bignumber.eq(new BN(0)); - expect(charlieAfter.userLastPoint.slope).bignumber.eq(new BN(0)); - expect(charlieAfter.userLocked.amount).bignumber.eq(new BN(0)); - expect(charlieAfter.userLocked.end).bignumber.eq(new BN(0)); - - await expectRevert( - votingLockup.eject(alice, { from: bob }), - "Users lock didn't expire", - ); - }); - it("fully exits the system", async () => { - // eve exits - const eveBefore = await snapshotData(eve); - await votingLockup.exit({ from: eve }); - const eveAfter = await snapshotData(eve); - - expect(eveAfter.totalStaticWeight).bignumber.eq( - eveBefore.totalStaticWeight.sub(eveBefore.userStaticWeight), - ); - expect(eveAfter.senderStakingTokenBalance).bignumber.eq( - eveBefore.senderStakingTokenBalance - .add(eveBefore.userLocked.amount) - .add(eveAfter.rewardsPaid), - ); - expect(eveAfter.userLastPoint.bias).bignumber.eq(new BN(0)); - expect(eveAfter.userLastPoint.slope).bignumber.eq(new BN(0)); - expect(eveAfter.userLocked.amount).bignumber.eq(new BN(0)); - expect(eveAfter.userLocked.end).bignumber.eq(new BN(0)); - }); - }); - - describe("expiring the contract", () => { - before(async () => { - await fundVotingLockup(simpleToExactAmount(1, 18)); - }); - // cant stake after expiry - // cant notify after expiry - it("must be done after final period finishes", async () => { - await expectRevert( - votingLockup.expireContract({ from: sa.governor }), - "Period must be over", - ); - await time.increase(ONE_WEEK.muln(2)); - - await expectRevert( - votingLockup.withdraw({ from: alice }), - "The lock didn't expire", - ); - - await votingLockup.expireContract({ from: sa.governor }); - expect(await votingLockup.expired()).eq(true); - }); - it("expires the contract and unlocks all stakes", async () => { - await expectRevert( - votingLockup.createLock(new BN(1), (await time.latest()).add(ONE_WEEK), { - from: sa.other, - }), - "Contract is expired", - ); - await votingLockup.exit({ from: alice }); - await votingLockup.exit({ from: bob }); - await votingLockup.claimReward({ from: charlie }); - await votingLockup.claimReward({ from: david }); - - const aliceAfter = await snapshotData(alice); - const bobAfter = await snapshotData(bob); - const charlieAfter = await snapshotData(charlie); - const davidAfter = await snapshotData(david); - const eveAfter = await snapshotData(eve); - expect(aliceAfter.userLocked.amount).bignumber.eq(new BN(0)); - expect(aliceAfter.userLocked.end).bignumber.eq(new BN(0)); - - assertBNClosePercent( - simpleToExactAmount(101, 18), - aliceAfter.rewardsPaid - .add(bobAfter.rewardsPaid) - .add(charlieAfter.rewardsPaid) - .add(davidAfter.rewardsPaid) - .add(eveAfter.rewardsPaid), - "0.0001", - ); - }); - }); - }); - - // Integration test ported from - // https://github.com/curvefi/curve-dao-contracts/blob/master/tests/integration/VotingEscrow/test_votingLockup.py - // Added reward claiming & static balance analysis - describe("testing voting powers changing", () => { - before(async () => { - await deployFresh(); - }); - - /** - * - * Test voting power in the following scenario. - * Alice: - * ~~~~~~~ - * ^ - * | * * - * | | \ | \ - * | | \ | \ - * +-+---+---+------+---> t - * - * Bob: - * ~~~~~~~ - * ^ - * | * - * | | \ - * | | \ - * +-+---+---+---+--+---> t - * - * Alice has 100% of voting power in the first period. - * She has 2/3 power at the start of 2nd period, with Bob having 1/2 power - * (due to smaller locktime). - * Alice's power grows to 100% by Bob's unlock. - * - * Checking that totalSupply is appropriate. - * - * After the test is done, check all over again with balanceOfAt / totalSupplyAt - * - * Rewards for Week 1 = 1000 (Alice = 100%) - * Rewards for Week 2 = 1000 (Alice = 66%, Bob = 33%) - * Rewards = [1666.666, 333.333] - */ - - it("calculates voting weights on a rolling basis", async () => { - /** - * SETUP - */ - const MAXTIME = await votingLockup.MAXTIME(); - const tolerance = "0.03"; // 0.03% | 0.00003 | 3e14 - const alice = sa.dummy1; - const bob = sa.dummy2; - const amount = simpleToExactAmount(1000, 18); - await mta.transfer(alice, amount.muln(5), { from: sa.fundManager }); - await mta.transfer(bob, amount.muln(5), { from: sa.fundManager }); - const stages = {}; - - await mta.approve(votingLockup.address, amount.muln(5), { from: alice }); - await mta.approve(votingLockup.address, amount.muln(5), { from: bob }); - - expect(await votingLockup.totalSupply()).bignumber.eq(new BN(0)); - expect(await votingLockup.balanceOf(alice)).bignumber.eq(new BN(0)); - expect(await votingLockup.balanceOf(bob)).bignumber.eq(new BN(0)); - expect(await votingLockup.staticBalanceOf(bob)).bignumber.eq(new BN(0)); - expect(await votingLockup.totalStaticWeight()).bignumber.eq(new BN(0)); - - /** - * BEGIN PERIOD 1 - * Move to timing which is good for testing - beginning of a UTC week - * Fund the pool - */ - - await goToNextUnixWeekStart(); - await time.increase(ONE_HOUR); - await fundVotingLockup(amount); - - stages["before_deposits"] = [await time.latestBlock(), await time.latest()]; - - await votingLockup.createLock(amount, (await time.latest()).add(ONE_WEEK.addn(1)), { - from: alice, - }); - stages["alice_deposit"] = [await time.latestBlock(), await time.latest()]; - - assertBNClosePercent( - await votingLockup.staticBalanceOf(alice), - await calculateStaticBalance(ONE_WEEK.sub(ONE_HOUR), amount), - "0.1", - ); - expect(await votingLockup.totalStaticWeight()).bignumber.eq( - await votingLockup.staticBalanceOf(alice), - "Total static weight should consist of only alice", - ); - await time.increase(ONE_HOUR); - await time.advanceBlock(); - assertBNClosePercent( - await votingLockup.balanceOf(alice), - amount.div(MAXTIME).mul(ONE_WEEK.sub(ONE_HOUR.muln(2))), - tolerance, - ); - assertBNClosePercent( - await votingLockup.totalSupply(), - amount.div(MAXTIME).mul(ONE_WEEK.sub(ONE_HOUR.muln(2))), - tolerance, - ); - expect(await votingLockup.balanceOf(bob)).bignumber.eq(new BN(0)); - let t0 = await time.latest(); - let dt = new BN(0); - - stages["alice_in_0"] = []; - stages["alice_in_0"].push([await time.latestBlock(), await time.latest()]); - - /** - * Measure Alice's decay over whole week - */ - for (let i = 0; i < 7; i += 1) { - for (let j = 0; j < 24; j += 1) { - await time.increase(ONE_HOUR); - await time.advanceBlock(); - } - dt = (await time.latest()).sub(t0); - assertBNClosePercent( - await votingLockup.totalSupply(), - amount - .div(MAXTIME) - .mul(BN.max(ONE_WEEK.sub(ONE_HOUR.muln(2)).sub(dt), new BN(0))), - tolerance, - ); - assertBNClosePercent( - await votingLockup.balanceOf(alice), - amount - .div(MAXTIME) - .mul(BN.max(ONE_WEEK.sub(ONE_HOUR.muln(2)).sub(dt), new BN(0))), - tolerance, - ); - expect(await votingLockup.balanceOf(bob)).bignumber.eq(new BN(0)); - stages["alice_in_0"].push([await time.latestBlock(), await time.latest()]); - } - - await time.increase(ONE_HOUR); - - expect(await votingLockup.balanceOf(alice)).bignumber.eq(new BN(0)); - assertBNClosePercent( - await votingLockup.staticBalanceOf(alice), - await calculateStaticBalance(ONE_WEEK.sub(ONE_HOUR), amount), - "0.1", - ); - expect(await votingLockup.totalStaticWeight()).bignumber.eq( - await votingLockup.staticBalanceOf(alice), - "Total static weight should consist of only alice", - ); - await votingLockup.exit({ from: alice }); - - stages["alice_withdraw"] = [await time.latestBlock(), await time.latest()]; - expect(await votingLockup.totalSupply()).bignumber.eq(new BN(0)); - expect(await votingLockup.balanceOf(alice)).bignumber.eq(new BN(0)); - expect(await votingLockup.balanceOf(bob)).bignumber.eq(new BN(0)); - expect(await votingLockup.staticBalanceOf(alice)).bignumber.eq(new BN(0)); - expect(await votingLockup.totalStaticWeight()).bignumber.eq(new BN(0)); - - await time.increase(ONE_HOUR); - await time.advanceBlock(); - - /** - * BEGIN PERIOD 2 - * Next week (for round counting) - */ - - await goToNextUnixWeekStart(); - await fundVotingLockup(amount); - - await votingLockup.createLock(amount, (await time.latest()).add(ONE_WEEK.muln(2)), { - from: alice, - }); - stages["alice_deposit_2"] = [await time.latestBlock(), await time.latest()]; - - assertBNClosePercent( - await votingLockup.totalSupply(), - amount - .div(MAXTIME) - .muln(2) - .mul(ONE_WEEK), - tolerance, - ); - assertBNClosePercent( - await votingLockup.balanceOf(alice), - amount - .div(MAXTIME) - .muln(2) - .mul(ONE_WEEK), - tolerance, - ); - expect(await votingLockup.balanceOf(bob)).bignumber.eq(new BN(0)); - - await votingLockup.createLock(amount, (await time.latest()).add(ONE_WEEK.addn(1)), { - from: bob, - }); - stages["bob_deposit_2"] = [await time.latestBlock(), await time.latest()]; - - assertBNClosePercent( - await votingLockup.totalSupply(), - amount - .div(MAXTIME) - .muln(3) - .mul(ONE_WEEK), - tolerance, - ); - assertBNClosePercent( - await votingLockup.balanceOf(alice), - amount - .div(MAXTIME) - .muln(2) - .mul(ONE_WEEK), - tolerance, - ); - assertBNClosePercent( - await votingLockup.balanceOf(bob), - amount.div(MAXTIME).mul(ONE_WEEK), - tolerance, - ); - let aliceStatic = await votingLockup.staticBalanceOf(alice); - let bobStatic = await votingLockup.staticBalanceOf(bob); - let totalStatic = await votingLockup.totalStaticWeight(); - - assertBNClosePercent( - aliceStatic, - await calculateStaticBalance(ONE_WEEK.muln(2), amount), - "0.1", - ); - assertBNClosePercent(bobStatic, await calculateStaticBalance(ONE_WEEK, amount), "0.1"); - expect(totalStatic).bignumber.eq(aliceStatic.add(bobStatic)); - - t0 = await time.latest(); - await time.increase(ONE_HOUR); - await time.advanceBlock(); - - let w_alice = new BN(0); - let w_total = new BN(0); - let w_bob = new BN(0); - - stages["alice_bob_in_2"] = []; - // Beginning of week: weight 3 - // End of week: weight 1 - for (let i = 0; i < 7; i += 1) { - for (let j = 0; j < 24; j += 1) { - await time.increase(ONE_HOUR); - await time.advanceBlock(); - } - dt = (await time.latest()).sub(t0); - const b = await time.latestBlock(); - w_total = await votingLockup.totalSupplyAt(b); - w_alice = await votingLockup.balanceOfAt(alice, b); - w_bob = await votingLockup.balanceOfAt(bob, b); - expect(w_total).bignumber.eq(w_alice.add(w_bob)); - assertBNClosePercent( - w_alice, - amount.div(MAXTIME).mul(BN.max(ONE_WEEK.muln(2).sub(dt), new BN(0))), - tolerance, - ); - assertBNClosePercent( - w_bob, - amount.div(MAXTIME).mul(BN.max(ONE_WEEK.sub(dt), new BN(0))), - tolerance, - ); - stages["alice_bob_in_2"].push([await time.latestBlock(), await time.latest()]); - } - - await time.increase(ONE_HOUR); - await time.advanceBlock(); - - await votingLockup.withdraw({ from: bob }); - t0 = await time.latest(); - stages["bob_withdraw_1"] = [await time.latestBlock(), await time.latest()]; - w_total = await votingLockup.totalSupply(); - w_alice = await votingLockup.balanceOf(alice); - expect(w_alice).bignumber.eq(w_total); - - assertBNClosePercent( - w_total, - amount.div(MAXTIME).mul(ONE_WEEK.sub(ONE_HOUR.muln(2))), - tolerance, - ); - expect(await votingLockup.balanceOf(bob)).bignumber.eq(new BN(0)); - - aliceStatic = await votingLockup.staticBalanceOf(alice); - bobStatic = await votingLockup.staticBalanceOf(bob); - totalStatic = await votingLockup.totalStaticWeight(); - - assertBNClosePercent( - aliceStatic, - await calculateStaticBalance(ONE_WEEK.muln(2), amount), - "0.1", - ); - expect(bobStatic).bignumber.eq(new BN(0)); - expect(totalStatic).bignumber.eq(aliceStatic); - - await time.increase(ONE_HOUR); - await time.advanceBlock(); - - stages["alice_in_2"] = []; - for (let i = 0; i < 7; i += 1) { - for (let j = 0; j < 24; j += 1) { - await time.increase(ONE_HOUR); - await time.advanceBlock(); - } - dt = (await time.latest()).sub(t0); - w_total = await votingLockup.totalSupply(); - w_alice = await votingLockup.balanceOf(alice); - expect(w_total).bignumber.eq(w_alice); - assertBNClosePercent( - w_total, - amount - .div(MAXTIME) - .mul(BN.max(ONE_WEEK.sub(dt).sub(ONE_HOUR.muln(37).divn(18)), new BN(0))), - isCoverage ? "1" : "0.04", - ); - expect(await votingLockup.balanceOf(bob)).bignumber.eq(new BN(0)); - stages["alice_in_2"].push([await time.latestBlock(), await time.latest()]); - } - - await votingLockup.withdraw({ from: alice }); - stages["alice_withdraw_2"] = [await time.latestBlock(), await time.latest()]; - - aliceStatic = await votingLockup.staticBalanceOf(alice); - bobStatic = await votingLockup.staticBalanceOf(bob); - totalStatic = await votingLockup.totalStaticWeight(); - - expect(aliceStatic).bignumber.eq(new BN(0)); - expect(bobStatic).bignumber.eq(new BN(0)); - expect(totalStatic).bignumber.eq(new BN(0)); - - await time.increase(ONE_HOUR); - await time.advanceBlock(); - - // votingLockup.withdraw({ from: bob }); - stages["bob_withdraw_2"] = [await time.latestBlock(), await time.latest()]; - - expect(await votingLockup.totalSupply()).bignumber.eq(new BN(0)); - expect(await votingLockup.balanceOf(alice)).bignumber.eq(new BN(0)); - expect(await votingLockup.balanceOf(bob)).bignumber.eq(new BN(0)); - - const aliceRewardsEarned1 = await votingLockup.rewardsPaid(alice); - const aliceBalBefore = await mta.balanceOf(alice); - const bobBalBefore = await mta.balanceOf(bob); - await votingLockup.claimReward({ from: alice }); - await votingLockup.claimReward({ from: bob }); - const aliceRewardsEarned2 = await votingLockup.rewardsPaid(alice); - const bobRewardsEarned = await votingLockup.rewardsPaid(bob); - - assertBNClosePercent(aliceRewardsEarned1, simpleToExactAmount("1000", 18), "0.01"); - assertBNClosePercent(aliceRewardsEarned2, simpleToExactAmount("1585.788", 18), "0.01"); - assertBNClosePercent(bobRewardsEarned, simpleToExactAmount("414.212", 18), "0.01"); - assertBNClosePercent( - aliceRewardsEarned2.add(bobRewardsEarned), - amount.muln(2), - "0.0001", - ); - - expect(await mta.balanceOf(alice)).bignumber.eq( - aliceBalBefore.add(aliceRewardsEarned2.sub(aliceRewardsEarned1)), - ); - expect(await mta.balanceOf(bob)).bignumber.eq(bobBalBefore.add(bobRewardsEarned)); - - /** - * END OF INTERACTION - * BEGIN HISTORICAL ANALYSIS USING BALANCEOFAT - */ - - expect( - await votingLockup.balanceOfAt(alice, stages["before_deposits"][0]), - ).bignumber.eq(new BN(0)); - expect(await votingLockup.balanceOfAt(bob, stages["before_deposits"][0])).bignumber.eq( - new BN(0), - ); - expect(await votingLockup.totalSupplyAt(stages["before_deposits"][0])).bignumber.eq( - new BN(0), - ); - - w_alice = await votingLockup.balanceOfAt(alice, stages["alice_deposit"][0]); - assertBNClosePercent( - w_alice, - amount.div(MAXTIME).mul(ONE_WEEK.sub(ONE_HOUR)), - tolerance, - ); - expect(await votingLockup.balanceOfAt(bob, stages["alice_deposit"][0])).bignumber.eq( - new BN(0), - ); - w_total = await votingLockup.totalSupplyAt(stages["alice_deposit"][0]); - expect(w_alice).bignumber.eq(w_total); - - for (let i = 0; i < stages["alice_in_0"].length; i += 1) { - const [block] = stages["alice_in_0"][i]; - w_alice = await votingLockup.balanceOfAt(alice, block); - w_bob = await votingLockup.balanceOfAt(bob, block); - w_total = await votingLockup.totalSupplyAt(block); - expect(w_bob).bignumber.eq(new BN(0)); - expect(w_alice).bignumber.eq(w_total); - const time_left = ONE_WEEK.muln(7 - i) - .divn(7) - .sub(ONE_HOUR.muln(2)); - const error_1h = (ONE_HOUR.toNumber() * 100) / time_left.toNumber(); // Rounding error of 1 block is possible, and we have 1h blocks - assertBNClosePercent( - w_alice, - amount.div(MAXTIME).mul(time_left), - error_1h.toString(), - ); - } - - w_total = await votingLockup.totalSupplyAt(stages["alice_withdraw"][0]); - w_alice = await votingLockup.balanceOfAt(alice, stages["alice_withdraw"][0]); - w_bob = await votingLockup.balanceOfAt(bob, stages["alice_withdraw"][0]); - expect(w_total).bignumber.eq(new BN(0)); - expect(w_alice).bignumber.eq(new BN(0)); - expect(w_bob).bignumber.eq(new BN(0)); - - w_total = await votingLockup.totalSupplyAt(stages["alice_deposit_2"][0]); - w_alice = await votingLockup.balanceOfAt(alice, stages["alice_deposit_2"][0]); - w_bob = await votingLockup.balanceOfAt(bob, stages["alice_deposit_2"][0]); - assertBNClosePercent( - w_total, - amount - .div(MAXTIME) - .muln(2) - .mul(ONE_WEEK), - tolerance, - ); - expect(w_total).bignumber.eq(w_alice); - expect(w_bob).bignumber.eq(new BN(0)); - - w_total = await votingLockup.totalSupplyAt(stages["bob_deposit_2"][0]); - w_alice = await votingLockup.balanceOfAt(alice, stages["bob_deposit_2"][0]); - w_bob = await votingLockup.balanceOfAt(bob, stages["bob_deposit_2"][0]); - expect(w_total).bignumber.eq(w_alice.add(w_bob)); - assertBNClosePercent( - w_total, - amount - .div(MAXTIME) - .muln(3) - .mul(ONE_WEEK), - tolerance, - ); - assertBNClosePercent( - w_alice, - amount - .div(MAXTIME) - .muln(2) - .mul(ONE_WEEK), - tolerance, - ); - - let error_1h = 0; - [, t0] = stages["bob_deposit_2"]; - for (let i = 0; i < stages["alice_bob_in_2"].length; i += 1) { - const [block, ts] = stages["alice_bob_in_2"][i]; - w_alice = await votingLockup.balanceOfAt(alice, block); - w_bob = await votingLockup.balanceOfAt(bob, block); - w_total = await votingLockup.totalSupplyAt(block); - expect(w_total).bignumber.eq(w_alice.add(w_bob)); - dt = ts.sub(t0); - error_1h = - (ONE_HOUR.toNumber() * 100) / - (2 * ONE_WEEK.toNumber() - i - ONE_DAY.toNumber()); - assertBNClosePercent( - w_alice, - amount.div(MAXTIME).mul(BN.max(ONE_WEEK.muln(2).sub(dt), new BN(0))), - error_1h.toString(), - ); - assertBNClosePercent( - w_bob, - amount.div(MAXTIME).mul(BN.max(ONE_WEEK.sub(dt), new BN(0))), - error_1h.toString(), - ); - } - w_total = await votingLockup.totalSupplyAt(stages["bob_withdraw_1"][0]); - w_alice = await votingLockup.balanceOfAt(alice, stages["bob_withdraw_1"][0]); - w_bob = await votingLockup.balanceOfAt(bob, stages["bob_withdraw_1"][0]); - expect(w_total).bignumber.eq(w_alice); - assertBNClosePercent( - w_total, - amount.div(MAXTIME).mul(ONE_WEEK.sub(ONE_HOUR.muln(2))), - tolerance, - ); - expect(w_bob).bignumber.eq(new BN(0)); - - [, t0] = stages["bob_withdraw_1"]; - for (let i = 0; i < stages["alice_in_2"].length; i += 1) { - const [block, ts] = stages["alice_in_2"][i]; - w_alice = await votingLockup.balanceOfAt(alice, block); - w_bob = await votingLockup.balanceOfAt(bob, block); - w_total = await votingLockup.totalSupplyAt(block); - expect(w_total).bignumber.eq(w_alice); - expect(w_bob).bignumber.eq(new BN(0)); - dt = ts.sub(t0); - error_1h = - (ONE_HOUR.toNumber() * 100) / - (ONE_WEEK.toNumber() - i * ONE_DAY.toNumber() + ONE_DAY.toNumber()); - assertBNClosePercent( - w_total, - amount - .div(MAXTIME) - .mul(BN.max(ONE_WEEK.sub(dt).sub(ONE_HOUR.muln(2)), new BN(0))), - error_1h.toString(), - ); - } - w_total = await votingLockup.totalSupplyAt(stages["bob_withdraw_2"][0]); - w_alice = await votingLockup.balanceOfAt(alice, stages["bob_withdraw_2"][0]); - w_bob = await votingLockup.balanceOfAt(bob, stages["bob_withdraw_2"][0]); - expect(w_total).bignumber.eq(new BN(0)); - expect(w_alice).bignumber.eq(new BN(0)); - expect(w_bob).bignumber.eq(new BN(0)); - }); - }); -}); diff --git a/test/governance/TestIncentivisedVotingLockupRewards.spec.ts b/test/governance/TestIncentivisedVotingLockupRewards.spec.ts deleted file mode 100644 index b6bb2765..00000000 --- a/test/governance/TestIncentivisedVotingLockupRewards.spec.ts +++ /dev/null @@ -1,954 +0,0 @@ -/* eslint-disable no-nested-ternary */ - -import * as t from "types/generated"; -import { expectEvent, expectRevert, time } from "@openzeppelin/test-helpers"; -import { StandardAccounts, SystemMachine } from "@utils/machines"; -import { assertBNClose, assertBNSlightlyGT, assertBNClosePercent } from "@utils/assertions"; -import { simpleToExactAmount } from "@utils/math"; -import { BN } from "@utils/tools"; -import { ONE_WEEK, ONE_DAY, FIVE_DAYS, fullScale } from "@utils/constants"; -import envSetup from "@utils/env_setup"; - -import shouldBehaveLikeRecipient from "../rewards/RewardsDistributionRecipient.behaviour"; - -const MockERC20 = artifacts.require("MockERC20"); -const VotingLockup = artifacts.require("IncentivisedVotingLockup"); - -const { expect } = envSetup.configure(); - -const goToNextUnixWeekStart = async () => { - const unixWeekCount = (await time.latest()).div(ONE_WEEK); - const nextUnixWeek = unixWeekCount.addn(1).mul(ONE_WEEK); - await time.increaseTo(nextUnixWeek); -}; - -const oneWeekInAdvance = async (): Promise => { - const now = await time.latest(); - return now.add(ONE_WEEK); -}; - -contract("IncentivisedVotingLockupRewards", async (accounts) => { - const recipientCtx: { - recipient?: t.RewardsDistributionRecipientInstance; - } = {}; - const moduleCtx: { - module?: t.ModuleInstance; - } = {}; - const sa = new StandardAccounts(accounts); - let systemMachine: SystemMachine; - - const rewardsDistributor = sa.fundManager; - let stakingToken: t.MockERC20Instance; - let votingLockup: t.IncentivisedVotingLockupInstance; - - const redeployRewards = async ( - nexusAddress = systemMachine.nexus.address, - ): Promise => { - stakingToken = await MockERC20.new("Staking", "ST8k", 18, sa.default, 10000000); - await stakingToken.transfer(rewardsDistributor, simpleToExactAmount(1000, 21)); - return VotingLockup.new( - stakingToken.address, - "Voting MTA", - "vMTA", - nexusAddress, - rewardsDistributor, - ); - }; - - interface LockedBalance { - amount: BN; - end: BN; - } - - interface Point { - bias: BN; - slope: BN; - ts: BN; - blk?: BN; - } - - interface StakingData { - totalStaticWeight: BN; - userStaticWeight: BN; - userLocked: LockedBalance; - userLastPoint: Point; - senderStakingTokenBalance: BN; - contractStakingTokenBalance: BN; - userRewardPerTokenPaid: BN; - beneficiaryRewardsEarned: BN; - rewardPerTokenStored: BN; - rewardRate: BN; - lastUpdateTime: BN; - lastTimeRewardApplicable: BN; - periodFinishTime: BN; - } - - const snapshotStakingData = async (sender = sa.default): Promise => { - const locked = await votingLockup.locked(sender); - const lastPoint = await votingLockup.getLastUserPoint(sender); - return { - totalStaticWeight: await votingLockup.totalStaticWeight(), - userStaticWeight: await votingLockup.staticBalanceOf(sender), - userLocked: { - amount: locked[0], - end: locked[1], - }, - userLastPoint: { - bias: lastPoint[0], - slope: lastPoint[1], - ts: lastPoint[2], - }, - userRewardPerTokenPaid: await votingLockup.userRewardPerTokenPaid(sender), - senderStakingTokenBalance: await stakingToken.balanceOf(sender), - contractStakingTokenBalance: await stakingToken.balanceOf(votingLockup.address), - beneficiaryRewardsEarned: await votingLockup.rewards(sender), - rewardPerTokenStored: await votingLockup.rewardPerTokenStored(), - rewardRate: await votingLockup.rewardRate(), - lastUpdateTime: await votingLockup.lastUpdateTime(), - lastTimeRewardApplicable: await votingLockup.lastTimeRewardApplicable(), - periodFinishTime: await votingLockup.periodFinish(), - }; - }; - - before(async () => { - systemMachine = new SystemMachine(sa.all); - await systemMachine.initialiseMocks(false, false); - votingLockup = await redeployRewards(); - recipientCtx.recipient = (votingLockup as unknown) as t.RewardsDistributionRecipientInstance; - moduleCtx.module = votingLockup as t.ModuleInstance; - }); - - describe("implementing rewardDistributionRecipient and Module", async () => { - shouldBehaveLikeRecipient( - recipientCtx as Required, - moduleCtx as Required, - sa, - ); - }); - - describe("constructor & settings", async () => { - before(async () => { - votingLockup = await redeployRewards(); - }); - it("should set all initial state", async () => { - // Set in constructor - expect(await votingLockup.nexus(), systemMachine.nexus.address); - expect(await votingLockup.stakingToken(), stakingToken.address); - expect(await votingLockup.rewardsDistributor(), rewardsDistributor); - - // Basic storage - expect(await votingLockup.totalStaticWeight()).bignumber.eq(new BN(0)); - expect(await votingLockup.periodFinish()).bignumber.eq(new BN(0)); - expect(await votingLockup.rewardRate()).bignumber.eq(new BN(0)); - expect(await votingLockup.lastUpdateTime()).bignumber.eq(new BN(0)); - expect(await votingLockup.rewardPerTokenStored()).bignumber.eq(new BN(0)); - expect(await votingLockup.lastTimeRewardApplicable()).bignumber.eq(new BN(0)); - expect(await votingLockup.rewardPerToken()).bignumber.eq(new BN(0)); - }); - }); - - /** - * @dev Ensures the reward units are assigned correctly, based on the last update time, etc - * @param beforeData Snapshot after the tx - * @param afterData Snapshot after the tx - * @param isExistingStaker Expect the staker to be existing? - */ - const assertRewardsAssigned = async ( - beforeData: StakingData, - afterData: StakingData, - isExistingStaker: boolean, - shouldResetRewards = false, - ): Promise => { - const timeAfter = await time.latest(); - const periodIsFinished = new BN(timeAfter).gt(beforeData.periodFinishTime); - - // LastUpdateTime - expect( - periodIsFinished - ? beforeData.periodFinishTime - : beforeData.rewardPerTokenStored.eqn(0) && beforeData.totalStaticWeight.eqn(0) - ? beforeData.lastUpdateTime - : timeAfter, - ).bignumber.eq(afterData.lastUpdateTime); - // RewardRate doesnt change - expect(beforeData.rewardRate).bignumber.eq(afterData.rewardRate); - // RewardPerTokenStored goes up - expect(afterData.rewardPerTokenStored).bignumber.gte( - beforeData.rewardPerTokenStored as any, - ); - // Calculate exact expected 'rewardPerToken' increase since last update - const timeApplicableToRewards = periodIsFinished - ? beforeData.periodFinishTime.sub(beforeData.lastUpdateTime) - : timeAfter.sub(beforeData.lastUpdateTime); - const increaseInRewardPerToken = beforeData.totalStaticWeight.eq(new BN(0)) - ? new BN(0) - : beforeData.rewardRate - .mul(timeApplicableToRewards) - .mul(fullScale) - .div(beforeData.totalStaticWeight); - expect(beforeData.rewardPerTokenStored.add(increaseInRewardPerToken)).bignumber.eq( - afterData.rewardPerTokenStored, - ); - - // Expect updated personal state - // userRewardPerTokenPaid(beneficiary) should update - expect(afterData.userRewardPerTokenPaid).bignumber.eq(afterData.rewardPerTokenStored); - - // If existing staker, then rewards Should increase - if (shouldResetRewards) { - expect(afterData.beneficiaryRewardsEarned).bignumber.eq(new BN(0)); - } else if (isExistingStaker) { - // rewards(beneficiary) should update with previously accrued tokens - const increaseInUserRewardPerToken = afterData.rewardPerTokenStored.sub( - beforeData.userRewardPerTokenPaid, - ); - const assignment = beforeData.userStaticWeight - .mul(increaseInUserRewardPerToken) - .div(fullScale); - expect(beforeData.beneficiaryRewardsEarned.add(assignment)).bignumber.eq( - afterData.beneficiaryRewardsEarned, - ); - } else { - // else `rewards` should stay the same - expect(beforeData.beneficiaryRewardsEarned).bignumber.eq( - afterData.beneficiaryRewardsEarned, - ); - } - }; - - const calculateStaticBalance = async (lockupLength: BN, amount: BN): Promise => { - const slope = amount.div(await votingLockup.MAXTIME()); - const s = slope.muln(10000).muln(Math.sqrt(lockupLength.toNumber())); - return s; - }; - - /** - * @dev Ensures a stake is successful, updates the rewards for the beneficiary and - * collects the stake - * @param stakeAmount Exact units to stake - * @param sender Sender of the tx - * @param beneficiary Beneficiary of the stake - * @param confirmExistingStaker Expect the staker to be existing? - */ - const expectSuccessfulStake = async ( - stakeAmount: BN, - sender = sa.default, - confirmExistingStaker = false, - increaseTime = false, - increaseAmount = false, - ): Promise => { - // 1. Get data from the contract - const beforeData = await snapshotStakingData(sender); - - const isExistingStaker = beforeData.userStaticWeight.gt(new BN(0)); - if (confirmExistingStaker) { - expect(isExistingStaker).eq(true); - } - // 2. Approve staking token spending and send the TX - await stakingToken.approve(votingLockup.address, stakeAmount, { - from: sender, - }); - const tx = increaseTime - ? await votingLockup.increaseLockLength((await oneWeekInAdvance()).add(ONE_WEEK), { - from: sender, - }) - : increaseAmount - ? await votingLockup.increaseLockAmount(stakeAmount, { from: sender }) - : await votingLockup.createLock(stakeAmount, await oneWeekInAdvance(), { - from: sender, - }); - expectEvent(tx.receipt, "Deposit", { - provider: sender, - value: increaseTime ? new BN(0) : stakeAmount, - }); - - // 3. Ensure rewards are accrued to the beneficiary - const afterData = await snapshotStakingData(sender); - await assertRewardsAssigned(beforeData, afterData, isExistingStaker); - - // 4. Expect token transfer - // StakingToken balance of sender - expect( - increaseTime - ? beforeData.senderStakingTokenBalance - : beforeData.senderStakingTokenBalance.sub(stakeAmount), - ).bignumber.eq(afterData.senderStakingTokenBalance); - // StakingToken balance of votingLockup - expect( - increaseTime - ? beforeData.contractStakingTokenBalance - : beforeData.contractStakingTokenBalance.add(stakeAmount), - ).bignumber.eq(afterData.contractStakingTokenBalance); - // totalStaticWeight of votingLockup - expect( - isExistingStaker - ? beforeData.totalStaticWeight - .add(afterData.userStaticWeight) - .sub(beforeData.userStaticWeight) - : beforeData.totalStaticWeight.add(afterData.userStaticWeight), - ).bignumber.eq(afterData.totalStaticWeight); - }; - - /** - * @dev Ensures a funding is successful, checking that it updates the rewardRate etc - * @param rewardUnits Number of units to stake - */ - const expectSuccesfulFunding = async (rewardUnits: BN): Promise => { - const beforeData = await snapshotStakingData(); - const tx = await votingLockup.notifyRewardAmount(rewardUnits, { - from: rewardsDistributor, - }); - expectEvent(tx.receipt, "RewardAdded", { reward: rewardUnits }); - - const cur = new BN(await time.latest()); - const leftOverRewards = beforeData.rewardRate.mul( - beforeData.periodFinishTime.sub(beforeData.lastTimeRewardApplicable), - ); - const afterData = await snapshotStakingData(); - - // Sets lastTimeRewardApplicable to latest - expect(cur).bignumber.eq(afterData.lastTimeRewardApplicable); - // Sets lastUpdateTime to latest - expect(cur).bignumber.eq(afterData.lastUpdateTime); - // Sets periodFinish to 1 week from now - expect(cur.add(ONE_WEEK)).bignumber.eq(afterData.periodFinishTime); - // Sets rewardRate to rewardUnits / ONE_WEEK - if (leftOverRewards.gtn(0)) { - const total = rewardUnits.add(leftOverRewards); - assertBNClose( - total.div(ONE_WEEK), - afterData.rewardRate, - beforeData.rewardRate.div(ONE_WEEK).muln(5), // the effect of 1 second on the future scale - ); - } else { - expect(rewardUnits.div(ONE_WEEK)).bignumber.eq(afterData.rewardRate); - } - }; - - /** - * @dev Makes a withdrawal from the contract, and ensures that resulting state is correct - * and the rewards have been applied - * @param sender User to execute the tx - */ - const expectStakingWithdrawal = async (sender = sa.default): Promise => { - // 1. Get data from the contract - const beforeData = await snapshotStakingData(sender); - const isExistingStaker = beforeData.userStaticWeight.gt(new BN(0)); - expect(isExistingStaker).eq(true); - // 2. Send withdrawal tx - const tx = await votingLockup.withdraw({ - from: sender, - }); - expectEvent(tx.receipt, "Withdraw", { - provider: sender, - value: beforeData.userLocked.amount, - }); - - // 3. Expect Rewards to accrue to the beneficiary - // StakingToken balance of sender - const afterData = await snapshotStakingData(sender); - await assertRewardsAssigned(beforeData, afterData, isExistingStaker); - - // 4. Expect token transfer - // StakingToken balance of sender - expect(beforeData.senderStakingTokenBalance.add(beforeData.userLocked.amount)).bignumber.eq( - afterData.senderStakingTokenBalance, - ); - // Withdraws from the actual rewards wrapper token - expect(afterData.userLocked.amount).bignumber.eq(new BN(0)); - expect(afterData.userLocked.end).bignumber.eq(new BN(0)); - expect(afterData.userStaticWeight).bignumber.eq(new BN(0)); - // Updates total supply - expect(beforeData.totalStaticWeight.sub(beforeData.userStaticWeight)).bignumber.eq( - afterData.totalStaticWeight, - ); - }; - - context("initialising and staking in a new pool", () => { - describe("notifying the pool of reward", () => { - it("should begin a new period through", async () => { - const rewardUnits = simpleToExactAmount(1, 18); - await expectSuccesfulFunding(rewardUnits); - }); - }); - describe("staking in the new period", () => { - it("should assign rewards to the staker", async () => { - // Do the stake - const rewardRate = await votingLockup.rewardRate(); - const stakeAmount = simpleToExactAmount(100, 18); - await expectSuccessfulStake(stakeAmount); - - await time.increase(ONE_DAY); - - // This is the total reward per staked token, since the last update - const rewardPerToken = await votingLockup.rewardPerToken(); - const rewardPerSecond = new BN(1) - .mul(rewardRate) - .mul(fullScale) - .div(await votingLockup.staticBalanceOf(sa.default)); - assertBNClose( - rewardPerToken, - ONE_DAY.mul(rewardPerSecond), - rewardPerSecond.muln(10), - ); - - // Calc estimated unclaimed reward for the user - // earned == balance * (rewardPerToken-userExistingReward) - const earned = await votingLockup.earned(sa.default); - expect( - (await votingLockup.staticBalanceOf(sa.default)) - .mul(rewardPerToken) - .div(fullScale), - ).bignumber.eq(earned); - }); - it("should update stakers rewards after consequent stake", async () => { - const stakeAmount = simpleToExactAmount(100, 18); - // This checks resulting state after second stake - await expectSuccessfulStake(stakeAmount, sa.default, true, true); - }); - - it("should fail if stake amount is 0", async () => { - await expectRevert( - votingLockup.createLock(0, await oneWeekInAdvance(), { from: sa.default }), - "Must stake non zero amount", - ); - }); - - it("should fail if staker has insufficient balance", async () => { - await stakingToken.approve(votingLockup.address, 1, { from: sa.dummy2 }); - await expectRevert( - votingLockup.createLock(1, await oneWeekInAdvance(), { from: sa.dummy2 }), - "SafeERC20: low-level call failed", - ); - }); - }); - }); - context("staking before rewards are added", () => { - before(async () => { - votingLockup = await redeployRewards(); - }); - it("should assign no rewards", async () => { - // Get data before - const stakeAmount = simpleToExactAmount(100, 18); - const beforeData = await snapshotStakingData(); - expect(beforeData.rewardRate).bignumber.eq(new BN(0)); - expect(beforeData.rewardPerTokenStored).bignumber.eq(new BN(0)); - expect(beforeData.beneficiaryRewardsEarned).bignumber.eq(new BN(0)); - expect(beforeData.totalStaticWeight).bignumber.eq(new BN(0)); - expect(beforeData.lastTimeRewardApplicable).bignumber.eq(new BN(0)); - - await goToNextUnixWeekStart(); - // Do the stake - await expectSuccessfulStake(stakeAmount); - - // Wait a day - await time.increase(ONE_DAY); - - // Do another stake - // await expectSuccessfulStake(stakeAmount); - // Get end results - const afterData = await snapshotStakingData(); - expect(afterData.rewardRate).bignumber.eq(new BN(0)); - expect(afterData.rewardPerTokenStored).bignumber.eq(new BN(0)); - expect(afterData.beneficiaryRewardsEarned).bignumber.eq(new BN(0)); - assertBNClosePercent( - afterData.totalStaticWeight, - await calculateStaticBalance(ONE_WEEK, stakeAmount), - "0.5", - ); - expect(afterData.lastTimeRewardApplicable).bignumber.eq(new BN(0)); - }); - }); - context("adding first stake days after funding", () => { - before(async () => { - votingLockup = await redeployRewards(); - }); - it("should retrospectively assign rewards to the first staker", async () => { - await expectSuccesfulFunding(simpleToExactAmount(100, 18)); - - // Do the stake - const rewardRate = await votingLockup.rewardRate(); - - await time.increase(FIVE_DAYS); - - const stakeAmount = simpleToExactAmount(100, 18); - await expectSuccessfulStake(stakeAmount); - - // This is the total reward per staked token, since the last update - const rewardPerToken = await votingLockup.rewardPerToken(); - - const rewardPerSecond = new BN(1) - .mul(rewardRate) - .mul(fullScale) - .div(await votingLockup.staticBalanceOf(sa.default)); - assertBNClose(rewardPerToken, FIVE_DAYS.mul(rewardPerSecond), rewardPerSecond.muln(4)); - - // Calc estimated unclaimed reward for the user - // earned == balance * (rewardPerToken-userExistingReward) - const earnedAfterConsequentStake = await votingLockup.earned(sa.default); - expect( - (await votingLockup.staticBalanceOf(sa.default)).mul(rewardPerToken).div(fullScale), - ).bignumber.eq(earnedAfterConsequentStake); - }); - }); - context("staking over multiple funded periods", () => { - context("with a single staker", () => { - before(async () => { - votingLockup = await redeployRewards(); - }); - it("should assign all the rewards from the periods", async () => { - const fundAmount1 = simpleToExactAmount(100, 18); - const fundAmount2 = simpleToExactAmount(200, 18); - await expectSuccesfulFunding(fundAmount1); - - const stakeAmount = simpleToExactAmount(1, 18); - await expectSuccessfulStake(stakeAmount); - - await time.increase(ONE_WEEK.muln(2)); - - await expectSuccesfulFunding(fundAmount2); - - await time.increase(ONE_WEEK.muln(2)); - - const earned = await votingLockup.earned(sa.default); - assertBNSlightlyGT(fundAmount1.add(fundAmount2), earned, new BN(1000000), false); - }); - }); - context("with multiple stakers coming in and out", () => { - const fundAmount1 = simpleToExactAmount(10000, 19); - const fundAmount2 = simpleToExactAmount(20000, 19); - const staker2 = sa.dummy1; - const staker3 = sa.dummy2; - const staker1Stake1 = simpleToExactAmount(100, 18); - const staker1Stake2 = simpleToExactAmount(200, 18); - const staker2Stake = simpleToExactAmount(100, 18); - const staker3Stake = simpleToExactAmount(100, 18); - - before(async () => { - votingLockup = await redeployRewards(); - await stakingToken.transfer(staker2, staker2Stake); - await stakingToken.transfer(staker3, staker3Stake); - }); - it("should accrue rewards on a pro rata basis", async () => { - /* - * 0 1 2 <-- Weeks - * [ - - - - - - ] [ - - - - - - ] - * 100k 200k <-- Funding - * +100 +200 <-- Staker 1 - * +100 | >| <-- Staker 2 - * +100 -100 <-- Staker 3 - * - * Staker 1 gets 25k + 16.66k from week 1 + 150k from week 2 = 191.66k - * Staker 2 gets 16.66k from week 1 + 50k from week 2 = 66.66k - * Staker 3 gets 25k + 16.66k from week 1 + 0 from week 2 = 41.66k - */ - - const expectedStatic1 = await calculateStaticBalance(ONE_WEEK, staker1Stake1); - const expectedStatic2 = await calculateStaticBalance( - ONE_WEEK.divn(2), - staker1Stake1, - ); - const totalStaticp2 = expectedStatic1.muln(2).add(expectedStatic2); - const expectedStatic3 = await calculateStaticBalance(ONE_WEEK, staker1Stake2); - const totalStaticp3 = expectedStatic3.add(expectedStatic2); - const staker1share = fundAmount1 - .divn(2) - .divn(2) - .add( - fundAmount1 - .divn(2) - .mul(expectedStatic1) - .div(totalStaticp2), - ) - .add(fundAmount2.mul(expectedStatic3).div(totalStaticp3)); - const staker2share = fundAmount1 - .divn(2) - .mul(expectedStatic2) - .div(totalStaticp2) - .add(fundAmount2.mul(expectedStatic2).div(totalStaticp3)); - const staker3share = fundAmount1 - .divn(2) - .divn(2) - .add( - fundAmount1 - .divn(2) - .mul(expectedStatic1) - .div(totalStaticp2), - ); - - // WEEK 0-1 START - await goToNextUnixWeekStart(); - await expectSuccessfulStake(staker1Stake1); - await expectSuccessfulStake(staker3Stake, staker3); - await expectSuccesfulFunding(fundAmount1); - - await time.increase(ONE_WEEK.divn(2).addn(1)); - - await expectSuccessfulStake(staker2Stake, staker2); - - await time.increase(ONE_WEEK.divn(2).addn(1)); - - // WEEK 1-2 START - await expectSuccesfulFunding(fundAmount2); - - await votingLockup.eject(staker3); - await votingLockup.withdraw({ from: sa.default }); - await expectSuccessfulStake(staker1Stake2, sa.default); - - await time.increase(ONE_WEEK); - - // WEEK 2 FINISH - const earned1 = await votingLockup.earned(sa.default); - const earned2 = await votingLockup.earned(staker2); - const earned3 = await votingLockup.earned(staker3); - assertBNClose(earned1, staker1share, simpleToExactAmount(5, 19)); - assertBNClose(earned2, staker2share, simpleToExactAmount(5, 19)); - assertBNClose(earned3, staker3share, simpleToExactAmount(5, 19)); - // Ensure that sum of earned rewards does not exceed funcing amount - expect(fundAmount1.add(fundAmount2)).bignumber.gte( - earned1.add(earned2).add(earned3) as any, - ); - }); - }); - }); - context("staking after period finish", () => { - const fundAmount1 = simpleToExactAmount(100, 21); - - before(async () => { - votingLockup = await redeployRewards(); - }); - it("should stop accruing rewards after the period is over", async () => { - await expectSuccessfulStake(simpleToExactAmount(1, 18)); - await expectSuccesfulFunding(fundAmount1); - - await time.increase(ONE_WEEK.addn(1)); - - const earnedAfterWeek = await votingLockup.earned(sa.default); - - await time.increase(ONE_WEEK.addn(1)); - const now = await time.latest(); - - const earnedAfterTwoWeeks = await votingLockup.earned(sa.default); - - expect(earnedAfterWeek).bignumber.eq(earnedAfterTwoWeeks); - - const lastTimeRewardApplicable = await votingLockup.lastTimeRewardApplicable(); - assertBNClose(lastTimeRewardApplicable, now.sub(ONE_WEEK).subn(2), new BN(2)); - }); - }); - - context("getting the reward token", () => { - before(async () => { - votingLockup = await redeployRewards(); - }); - it("should simply return the rewards Token", async () => { - const readToken = await votingLockup.getRewardToken(); - expect(readToken).eq(stakingToken.address); - expect(readToken).eq(await votingLockup.stakingToken()); - }); - }); - - context("notifying new reward amount", () => { - context("from someone other than the distributor", () => { - before(async () => { - votingLockup = await redeployRewards(); - }); - it("should fail", async () => { - await expectRevert( - votingLockup.notifyRewardAmount(1, { from: sa.default }), - "Caller is not reward distributor", - ); - await expectRevert( - votingLockup.notifyRewardAmount(1, { from: sa.dummy1 }), - "Caller is not reward distributor", - ); - await expectRevert( - votingLockup.notifyRewardAmount(1, { from: sa.governor }), - "Caller is not reward distributor", - ); - }); - }); - context("before current period finish", async () => { - const funding1 = simpleToExactAmount(100, 18); - const funding2 = simpleToExactAmount(200, 18); - beforeEach(async () => { - votingLockup = await redeployRewards(); - }); - it("should factor in unspent units to the new rewardRate", async () => { - // Do the initial funding - await expectSuccesfulFunding(funding1); - const actualRewardRate = await votingLockup.rewardRate(); - const expectedRewardRate = funding1.div(ONE_WEEK); - expect(expectedRewardRate).bignumber.eq(actualRewardRate); - - // Zoom forward half a week - await time.increase(ONE_WEEK.divn(2)); - - // Do the second funding, and factor in the unspent units - const expectedLeftoverReward = funding1.divn(2); - await expectSuccesfulFunding(funding2); - const actualRewardRateAfter = await votingLockup.rewardRate(); - const totalRewardsForWeek = funding2.add(expectedLeftoverReward); - const expectedRewardRateAfter = totalRewardsForWeek.div(ONE_WEEK); - assertBNClose( - actualRewardRateAfter, - expectedRewardRateAfter, - actualRewardRate.div(ONE_WEEK).muln(20), - ); - }); - it("should factor in unspent units to the new rewardRate if instant", async () => { - // Do the initial funding - await expectSuccesfulFunding(funding1); - const actualRewardRate = await votingLockup.rewardRate(); - const expectedRewardRate = funding1.div(ONE_WEEK); - expect(expectedRewardRate).bignumber.eq(actualRewardRate); - - // Zoom forward half a week - await time.increase(1); - - // Do the second funding, and factor in the unspent units - await expectSuccesfulFunding(funding2); - const actualRewardRateAfter = await votingLockup.rewardRate(); - const expectedRewardRateAfter = funding1.add(funding2).div(ONE_WEEK); - assertBNClose( - actualRewardRateAfter, - expectedRewardRateAfter, - actualRewardRate.div(ONE_WEEK).muln(20), - ); - }); - }); - - context("after current period finish", () => { - const funding1 = simpleToExactAmount(100, 18); - before(async () => { - votingLockup = await redeployRewards(); - }); - it("should start a new period with the correct rewardRate", async () => { - // Do the initial funding - await expectSuccesfulFunding(funding1); - const actualRewardRate = await votingLockup.rewardRate(); - const expectedRewardRate = funding1.div(ONE_WEEK); - expect(expectedRewardRate).bignumber.eq(actualRewardRate); - - // Zoom forward half a week - await time.increase(ONE_WEEK.addn(1)); - - // Do the second funding, and factor in the unspent units - await expectSuccesfulFunding(funding1.muln(2)); - const actualRewardRateAfter = await votingLockup.rewardRate(); - const expectedRewardRateAfter = expectedRewardRate.muln(2); - expect(actualRewardRateAfter).bignumber.eq(expectedRewardRateAfter); - }); - }); - }); - - context("withdrawing stake or rewards", () => { - context("withdrawing a stake amount", () => { - const fundAmount = simpleToExactAmount(100, 21); - const stakeAmount = simpleToExactAmount(100, 18); - - before(async () => { - votingLockup = await redeployRewards(); - await expectSuccessfulStake(stakeAmount); - await time.increase(ONE_WEEK.divn(3).muln(2)); - await expectSuccesfulFunding(fundAmount); - await time.increase(ONE_WEEK.divn(3).muln(2)); - }); - it("should revert for a non-staker", async () => { - await expectRevert( - votingLockup.withdraw({ from: sa.dummy1 }), - "Must have something to withdraw", - ); - }); - it("should withdraw the stake and update the existing reward accrual", async () => { - // Check that the user has earned something - const earnedBefore = await votingLockup.earned(sa.default); - expect(earnedBefore).bignumber.gt(new BN(0) as any); - const rewardsBefore = await votingLockup.rewards(sa.default); - expect(rewardsBefore).bignumber.eq(new BN(0)); - - // Execute the withdrawal - await expectStakingWithdrawal(); - - // Ensure that the new awards are added + assigned to user - const earnedAfter = await votingLockup.earned(sa.default); - expect(earnedAfter).bignumber.gte(earnedBefore as any); - const rewardsAfter = await votingLockup.rewards(sa.default); - expect(rewardsAfter).bignumber.eq(earnedAfter); - - // Zoom forward now - await time.increase(10); - - // Check that the user does not earn anything else - const earnedEnd = await votingLockup.earned(sa.default); - expect(earnedEnd).bignumber.eq(earnedAfter); - const rewardsEnd = await votingLockup.rewards(sa.default); - expect(rewardsEnd).bignumber.eq(rewardsAfter); - - // Cannot withdraw anything else - await expectRevert( - votingLockup.withdraw({ from: sa.default }), - "Must have something to withdraw", - ); - }); - }); - context("claiming rewards", async () => { - const fundAmount = simpleToExactAmount(100, 21); - const stakeAmount = simpleToExactAmount(100, 18); - - before(async () => { - votingLockup = await redeployRewards(); - await expectSuccesfulFunding(fundAmount); - await stakingToken.transfer(votingLockup.address, fundAmount, { - from: rewardsDistributor, - }); - await stakingToken.transfer(sa.dummy2, stakeAmount, { - from: rewardsDistributor, - }); - await expectSuccessfulStake(stakeAmount, sa.dummy2); - await time.increase(ONE_WEEK.addn(1)); - }); - it("should do nothing for a non-staker", async () => { - const beforeData = await snapshotStakingData(sa.dummy1); - await votingLockup.claimReward({ from: sa.dummy1 }); - - const afterData = await snapshotStakingData(sa.dummy1); - expect(beforeData.beneficiaryRewardsEarned).bignumber.eq(new BN(0)); - expect(afterData.beneficiaryRewardsEarned).bignumber.eq(new BN(0)); - expect(afterData.senderStakingTokenBalance).bignumber.eq(new BN(0)); - expect(afterData.userRewardPerTokenPaid).bignumber.eq( - afterData.rewardPerTokenStored, - ); - }); - it("should send all accrued rewards to the rewardee", async () => { - const beforeData = await snapshotStakingData(sa.dummy2); - - const tx = await votingLockup.claimReward({ from: sa.dummy2 }); - expectEvent(tx.receipt, "RewardPaid", { - user: sa.dummy2, - }); - const afterData = await snapshotStakingData(sa.dummy2); - await assertRewardsAssigned(beforeData, afterData, false, true); - // Balance transferred to the rewardee - const rewardeeBalanceAfter = await stakingToken.balanceOf(sa.dummy2); - assertBNClose(rewardeeBalanceAfter, fundAmount, simpleToExactAmount(1, 16)); - - // 'rewards' reset to 0 - expect(afterData.beneficiaryRewardsEarned).bignumber.eq(new BN(0), "i1"); - // Paid up until the last block - expect(afterData.userRewardPerTokenPaid).bignumber.eq( - afterData.rewardPerTokenStored, - "i2", - ); - // Token balances dont change - expect(afterData.senderStakingTokenBalance).bignumber.eq( - beforeData.senderStakingTokenBalance.add( - await votingLockup.rewardsPaid(sa.dummy2), - ), - "i3", - ); - expect(beforeData.userStaticWeight).bignumber.eq(afterData.userStaticWeight, "i4"); - }); - }); - context("completely 'exiting' the system", () => { - const fundAmount = simpleToExactAmount(100, 21); - const stakeAmount = simpleToExactAmount(100, 18); - - before(async () => { - votingLockup = await redeployRewards(); - await expectSuccesfulFunding(fundAmount); - await stakingToken.transfer(votingLockup.address, fundAmount, { - from: rewardsDistributor, - }); - await expectSuccessfulStake(stakeAmount); - await time.increase(ONE_WEEK.addn(1)); - }); - it("should fail if the sender has no stake", async () => { - await expectRevert( - votingLockup.exit({ from: sa.dummy1 }), - "Must have something to withdraw", - ); - }); - it("should withdraw all senders stake and send outstanding rewards to the staker", async () => { - const beforeData = await snapshotStakingData(); - const rewardeeBalanceBefore = await stakingToken.balanceOf(sa.default); - - const tx = await votingLockup.exit(); - expectEvent(tx.receipt, "Withdraw", { - provider: sa.default, - value: stakeAmount, - }); - expectEvent(tx.receipt, "RewardPaid", { - user: sa.default, - }); - - const afterData = await snapshotStakingData(); - // Balance transferred to the rewardee - const rewardeeBalanceAfter = await stakingToken.balanceOf(sa.default); - assertBNClose( - rewardeeBalanceAfter.sub(rewardeeBalanceBefore), - fundAmount.add(stakeAmount), - simpleToExactAmount(1, 16), - ); - - // Expect Rewards to accrue to the beneficiary - // StakingToken balance of sender - await assertRewardsAssigned(beforeData, afterData, false, true); - - // Expect token transfer - // StakingToken balance of sender - expect( - beforeData.senderStakingTokenBalance - .add(stakeAmount) - .add(await votingLockup.rewardsPaid(sa.default)), - ).bignumber.eq(afterData.senderStakingTokenBalance); - - // Withdraws from the actual rewards wrapper token - expect(afterData.userStaticWeight).bignumber.eq(new BN(0)); - - // Updates total supply - expect(beforeData.totalStaticWeight.sub(beforeData.userStaticWeight)).bignumber.eq( - afterData.totalStaticWeight, - ); - - await expectRevert(votingLockup.exit(), "Must have something to withdraw"); - }); - }); - }); - context("running a full integration test", () => { - const fundAmount = simpleToExactAmount(100, 21); - const stakeAmount = simpleToExactAmount(100, 18); - let period; - - before(async () => { - votingLockup = await redeployRewards(); - }); - it("1. should allow the rewardsDistributor to fund the pool", async () => { - await stakingToken.transfer(votingLockup.address, fundAmount, { - from: rewardsDistributor, - }); - await expectSuccesfulFunding(fundAmount); - }); - it("2. should allow stakers to stake and earn rewards", async () => { - await expectSuccessfulStake(stakeAmount); - await time.increase(ONE_WEEK.addn(1)); - }); - it("3. should credit earnings directly to beneficiary", async () => { - const beforeData = await snapshotStakingData(); - const beneficiaryBalanceBefore = await stakingToken.balanceOf(sa.default); - - await votingLockup.exit(); - - const afterData = await snapshotStakingData(); - // Balance transferred to the rewardee - const beneficiaryBalanceAfter = await stakingToken.balanceOf(sa.default); - assertBNClose( - beneficiaryBalanceAfter.sub(beneficiaryBalanceBefore), - fundAmount.add(stakeAmount), - simpleToExactAmount(1, 16), - ); - - await assertRewardsAssigned(beforeData, afterData, false, true); - }); - }); -}); diff --git a/test/masset/TestBasketManager.spec.ts b/test/masset/TestBasketManager.spec.ts deleted file mode 100644 index 7bbd77f3..00000000 --- a/test/masset/TestBasketManager.spec.ts +++ /dev/null @@ -1,2260 +0,0 @@ -/* eslint-disable no-await-in-loop */ - -import envSetup from "@utils/env_setup"; - -import { BN } from "@utils/tools"; -import { - Basset, - BassetStatus, - equalBassets, - buildBasset, - equalBasset, - calculateRatio, -} from "@utils/mstable-objects.ts"; -import { percentToWeight, simpleToExactAmount } from "@utils/math"; -import { expectEvent, expectRevert } from "@openzeppelin/test-helpers"; -import * as t from "types/generated"; -import { MassetMachine, StandardAccounts, SystemMachine } from "@utils/machines"; -import { ZERO_ADDRESS, ZERO, ratioScale, fullScale, DEAD_ADDRESS } from "@utils/constants"; -import { BassetIntegrationDetails, Platform } from "../../types/machines"; - -import shouldBehaveLikeModule from "../shared/behaviours/Module.behaviour"; -import shouldBehaveLikePausableModule from "../shared/behaviours/PausableModule.behaviour"; - -const { expect } = envSetup.configure(); - -const BasketManager = artifacts.require("BasketManager"); -const AaveIntegration = artifacts.require("AaveV2Integration"); -const CompoundIntegration = artifacts.require("CompoundIntegration"); -const MockNexus = artifacts.require("MockNexus"); -const MockBasketManager = artifacts.require("MockBasketManager3"); -const MockERC20 = artifacts.require("MockERC20"); -const MockCompoundIntegration = artifacts.require("MockCompoundIntegration2"); -const MaliciousAaveIntegration = artifacts.require("MaliciousAaveIntegration"); - -contract("BasketManager", async (accounts) => { - let systemMachine: SystemMachine; - let massetMachine: MassetMachine; - - const sa = new StandardAccounts(accounts); - const ctx: { module?: t.BasketManagerInstance } = {}; - const masset = sa.dummy1; - const governance = sa.dummy2; - const manager = sa.dummy3; - - let integrationDetails: BassetIntegrationDetails; - let aaveIntegration: t.AaveV2IntegrationInstance; - let compoundIntegration: t.CompoundIntegrationInstance; - let basketManager: t.BasketManagerInstance; - let nexus: t.MockNexusInstance; - - async function createMockBasketManger(): Promise { - const mockBasketManager = await MockBasketManager.new(); - await mockBasketManager.initialize( - nexus.address, - masset, - integrationDetails.bAssets.map((b) => b.address), - integrationDetails.platforms.map((p) => - p === Platform.aave ? aaveIntegration.address : compoundIntegration.address, - ), - integrationDetails.bAssets.map(() => simpleToExactAmount(50, 16)), - [false, false, false, false], - ); - return mockBasketManager; - } - - const createMockERC20 = async (decimals = 18): Promise => { - const mockERC20 = await MockERC20.new("Mock", "MKT", decimals, sa.default, new BN(10000)); - await aaveIntegration.setPTokenAddress( - mockERC20.address, - integrationDetails.aTokens[0].aToken, - { - from: sa.governor, - }, - ); - return mockERC20; - }; - - async function createDefaultBassets(): Promise> { - const weight = simpleToExactAmount(50, 16); - const decimals = await Promise.all(integrationDetails.bAssets.map((b) => b.decimals())); - return integrationDetails.bAssets.map((b, i) => - buildBasset( - b.address, - BassetStatus.Normal, - false, - ratioScale.mul(new BN(10).pow(decimals[i].sub(new BN(18)))), - weight, - ZERO, - ), - ); - } - - async function expectBassets(bAssetsArr: Array, len: BN): Promise { - const [receivedBassets, receivedLen] = await basketManager.getBassets(); - equalBassets(bAssetsArr, receivedBassets); - expect(len).to.bignumber.equal(receivedLen); - } - - async function createNewBasketManager(): Promise { - aaveIntegration = await AaveIntegration.new(); - compoundIntegration = await CompoundIntegration.new(); - basketManager = await BasketManager.new(); - - await aaveIntegration.initialize( - nexus.address, - [masset, governance, basketManager.address], - integrationDetails.aavePlatformAddress, - integrationDetails.aTokens.map((a) => a.bAsset), - integrationDetails.aTokens.map((a) => a.aToken), - ); - await compoundIntegration.initialize( - nexus.address, - [masset, governance, basketManager.address], - sa.dummy1, - integrationDetails.cTokens.map((c) => c.bAsset), - integrationDetails.cTokens.map((c) => c.cToken), - ); - await basketManager.initialize( - nexus.address, - masset, - integrationDetails.bAssets.map((b) => b.address), - integrationDetails.platforms.map((p) => - p === Platform.aave ? aaveIntegration.address : compoundIntegration.address, - ), - integrationDetails.bAssets.map(() => simpleToExactAmount(50, 16)), - [false, false, false, false], - ); - - return basketManager; - } - - before(async () => { - systemMachine = new SystemMachine(sa.all); - massetMachine = systemMachine.massetMachine; - integrationDetails = await massetMachine.loadBassets(); - - nexus = await MockNexus.new(sa.governor, governance, manager); - - await createNewBasketManager(); - - ctx.module = basketManager; - }); - - describe("behaviours:", async () => { - describe("should behave like a Module", async () => { - beforeEach(async () => { - await createNewBasketManager(); - ctx.module = basketManager; - }); - shouldBehaveLikeModule(ctx as Required, sa); - shouldBehaveLikePausableModule(ctx as { module: t.PausableModuleInstance }, sa); - }); - }); - - describe("initialize()", () => { - describe("should fail", () => { - it("when already initialized", async () => { - await expectRevert( - basketManager.initialize( - nexus.address, - masset, - integrationDetails.aTokens.map((a) => a.bAsset), - [aaveIntegration.address, aaveIntegration.address], - [percentToWeight(50), percentToWeight(50)], - [false, false], - ), - "Contract instance has already been initialized", - ); - }); - - it("when nexus address is zero", async () => { - const bm = await BasketManager.new(); - await expectRevert( - bm.initialize( - ZERO_ADDRESS, - masset, - integrationDetails.aTokens.map((a) => a.bAsset), - [aaveIntegration.address, aaveIntegration.address], - [percentToWeight(50), percentToWeight(50)], - [false, false], - ), - "Nexus address is zero", - ); - }); - - it("when mAsset address is zero", async () => { - const bm = await BasketManager.new(); - await expectRevert( - bm.initialize( - nexus.address, - ZERO_ADDRESS, - integrationDetails.aTokens.map((a) => a.bAsset), - [aaveIntegration.address, aaveIntegration.address], - [percentToWeight(50), percentToWeight(50)], - [false, false], - ), - "mAsset address is zero", - ); - }); - - it("when bAsset array is empty", async () => { - const bm = await BasketManager.new(); - await expectRevert( - bm.initialize( - nexus.address, - masset, - [], - [aaveIntegration.address, aaveIntegration.address], - [percentToWeight(50), percentToWeight(50)], - [false, false], - ), - "Must initialise with some bAssets", - ); - }); - - it("when integration array is empty", async () => { - const bm = await BasketManager.new(); - await expectRevert.assertion( - bm.initialize( - nexus.address, - masset, - integrationDetails.aTokens.map((a) => a.bAsset), - [], - [percentToWeight(50), percentToWeight(50)], - [false, false], - ), - ); - }); - - it("when weight array is empty", async () => { - const bm = await BasketManager.new(); - await expectRevert( - bm.initialize( - nexus.address, - masset, - integrationDetails.aTokens.map((a) => a.bAsset), - [aaveIntegration.address, aaveIntegration.address], - [], - [false, false], - ), - "Must be matching bAsset arrays", - ); - }); - - it("when tokenFee array is empty", async () => { - const bm = await BasketManager.new(); - await expectRevert.assertion( - bm.initialize( - nexus.address, - masset, - integrationDetails.aTokens.map((a) => a.bAsset), - [aaveIntegration.address, aaveIntegration.address], - [percentToWeight(50), percentToWeight(50)], - [], - ), - ); - }); - - it("when a bAsset already exist", async () => { - const bm = await BasketManager.new(); - await expectRevert.unspecified( - bm.initialize( - nexus.address, - masset, - [sa.dummy1, sa.dummy1], - [aaveIntegration.address, aaveIntegration.address], - [percentToWeight(50), percentToWeight(50)], - [false, false], - ), - ); - }); - - it("when array not have equal length", async () => { - const bm = await BasketManager.new(); - await expectRevert.unspecified( - bm.initialize( - nexus.address, - masset, - [sa.dummy1, sa.dummy2, sa.dummy3], - [aaveIntegration.address, aaveIntegration.address], - [percentToWeight(50), percentToWeight(50)], - [false, false], - ), - ); - }); - }); - - describe("with valid parameters", async () => { - it("should have initialized with events", async () => { - const bm = await BasketManager.new(); - const tx = await bm.initialize( - nexus.address, - masset, - integrationDetails.aTokens.map((a) => a.bAsset), - [aaveIntegration.address, aaveIntegration.address], - [percentToWeight(50), percentToWeight(50)], - [false, false], - ); - - expectEvent.inLogs(tx.logs, "BassetAdded", { - bAsset: integrationDetails.aTokens[0].bAsset, - integrator: aaveIntegration.address, - }); - - expectEvent.inLogs(tx.logs, "BassetAdded", { - bAsset: integrationDetails.aTokens[1].bAsset, - integrator: aaveIntegration.address, - }); - - // test-helpers not supports `deep` array compare. Hence, need to test like below - expectEvent.inLogs(tx.logs, "BasketWeightsUpdated"); - const basketWeightUpdatedEvent = tx.logs[2]; - expect(integrationDetails.aTokens.map((a) => a.bAsset)).to.deep.equal( - basketWeightUpdatedEvent.args[0], - ); - basketWeightUpdatedEvent.args[1].map((a) => - expect(a).to.bignumber.equal(percentToWeight(50)), - ); - - // should have initialized with nexus - expect(nexus.address).to.equal(await basketManager.nexus()); - // should have mAsset address - expect(masset).to.equal(await basketManager.mAsset()); - - // should have default basket configurations - await expectBassets(await createDefaultBassets(), new BN(4)); - - // should have all bAsset's integrations addresses - await Promise.all( - integrationDetails.aTokens.map(async (a) => { - const aTokenAddr = await basketManager.getBassetIntegrator(a.bAsset); - expect(aaveIntegration.address).to.equal(aTokenAddr); - return null; - }), - ); - }); - }); - }); - - describe("increaseVaultBalance()", async () => { - it("should fail when called by other than masset contract", async () => { - await Promise.all( - integrationDetails.bAssets.map(async (b, index) => { - const bAssetBefore = await basketManager.getBasset(b.address); - await expectRevert( - basketManager.increaseVaultBalance(index, sa.dummy1, new BN(100), { - from: sa.other, - }), - "Must be called by mAsset", - ); - const bAssetAfter = await basketManager.getBasset(b.address); - expect(bAssetBefore.vaultBalance).to.bignumber.equal(bAssetAfter.vaultBalance); - return null; - }), - ); - }); - - it("should fail when basket is failed", async () => { - const mockBasketManager: t.MockBasketManager3Instance = await createMockBasketManger(); - await mockBasketManager.failBasket(); - await Promise.all( - integrationDetails.aTokens.map(async (a, index) => { - const bAssetBefore = await mockBasketManager.getBasset(a.bAsset); - await expectRevert( - mockBasketManager.increaseVaultBalance( - index, - aaveIntegration.address, - new BN(100), - { - from: masset, - }, - ), - "Basket must be alive", - ); - const bAssetAfter = await mockBasketManager.getBasset(a.bAsset); - expect(bAssetBefore.vaultBalance).to.bignumber.equal(bAssetAfter.vaultBalance); - return null; - }), - ); - }); - - it("should fail when invalid basket index", async () => { - await Promise.all( - integrationDetails.aTokens.map(async (a, index) => { - const invalidIndex = index + 5; - const bAssetBefore = await basketManager.getBasset(a.bAsset); - await expectRevert.assertion( - basketManager.increaseVaultBalance( - invalidIndex, - aaveIntegration.address, - new BN(100), - { - from: masset, - }, - ), - ); - const bAssetAfter = await basketManager.getBasset(a.bAsset); - expect(bAssetBefore.vaultBalance).to.bignumber.equal(bAssetAfter.vaultBalance); - return null; - }), - ); - }); - - it("should succeed for a valid bAsset", async () => { - await Promise.all( - integrationDetails.bAssets.map(async (b, index) => { - const bAssetBefore: Basset = await basketManager.getBasset(b.address); - await basketManager.increaseVaultBalance( - index, - aaveIntegration.address, - new BN(100), - { - from: masset, - }, - ); - const bAssetAfter = await basketManager.getBasset(b.address); - expect(new BN(bAssetBefore.vaultBalance).add(new BN(100))).to.bignumber.equal( - bAssetAfter.vaultBalance, - ); - return null; - }), - ); - }); - }); - - describe("increaseVaultBalances()", () => { - it("should fail when called by other than masset contract", async () => { - const indexes: Array = [0, 1, 2, 3]; - const increaseAmounts: Array = indexes.map(() => new BN(100)); - const integrators: Array = indexes.map(() => sa.dummy1); - const bAssetBeforeArr: Array = await Promise.all( - integrationDetails.aTokens.map((a) => basketManager.getBasset(a.bAsset)), - ); - - await expectRevert( - basketManager.increaseVaultBalances(indexes, integrators, increaseAmounts, { - from: sa.other, - }), - "Must be called by mAsset", - ); - - await Promise.all( - integrationDetails.aTokens.map(async (a, index) => { - expect(bAssetBeforeArr[index].vaultBalance).to.bignumber.equal( - (await basketManager.getBasset(a.bAsset)).vaultBalance, - ); - }), - ); - }); - - it("should fail when basket is failed", async () => { - const indexes: Array = [0, 1, 2, 3]; - const increaseAmounts: Array = indexes.map(() => new BN(100)); - const integrators: Array = indexes.map(() => sa.dummy1); - - const mockBasketManager = await createMockBasketManger(); - - const bAssetBeforeArr: Array = await Promise.all( - integrationDetails.aTokens.map((a) => basketManager.getBasset(a.bAsset)), - ); - - await mockBasketManager.failBasket(); - - await expectRevert( - mockBasketManager.increaseVaultBalances(indexes, integrators, increaseAmounts, { - from: masset, - }), - "Basket must be alive", - ); - - await Promise.all( - integrationDetails.aTokens.map(async (a, index) => { - expect(bAssetBeforeArr[index].vaultBalance).to.bignumber.equal( - (await basketManager.getBasset(a.bAsset)).vaultBalance, - ); - }), - ); - }); - - it("should succeed and increase vault balance", async () => { - const indexes: Array = [0, 1, 2, 3]; - const increaseAmounts: Array = indexes.map(() => new BN(100)); - const integrators: Array = indexes.map(() => sa.dummy1); - - const bAssetBeforeArr: Array = await Promise.all( - integrationDetails.aTokens.map((a) => basketManager.getBasset(a.bAsset)), - ); - await basketManager.increaseVaultBalances(indexes, integrators, increaseAmounts, { - from: masset, - }); - await Promise.all( - integrationDetails.aTokens.map(async (a, index) => { - expect( - new BN(bAssetBeforeArr[index].vaultBalance).add(new BN(100)), - ).to.bignumber.equal((await basketManager.getBasset(a.bAsset)).vaultBalance); - }), - ); - }); - }); - - describe("decreaseVaultBalance()", async () => { - it("should fail when called by other than masset contract", async () => { - await Promise.all( - integrationDetails.aTokens.map(async (a, index) => { - const bAssetBefore = await basketManager.getBasset(a.bAsset); - await expectRevert( - basketManager.decreaseVaultBalance( - index, - aaveIntegration.address, - new BN(100), - { - from: sa.other, - }, - ), - "Must be called by mAsset", - ); - const bAssetAfter = await basketManager.getBasset(a.bAsset); - expect(bAssetBefore.vaultBalance).to.bignumber.equal(bAssetAfter.vaultBalance); - return null; - }), - ); - }); - - it("should fail when invalid basket index", async () => { - await Promise.all( - integrationDetails.aTokens.map(async (a, index) => { - const invalidIndex = index + 5; - const bAssetBefore = await basketManager.getBasset(a.bAsset); - await expectRevert.assertion( - basketManager.decreaseVaultBalance( - invalidIndex, - aaveIntegration.address, - new BN(100), - { - from: masset, - }, - ), - ); - const bAssetAfter = await basketManager.getBasset(a.bAsset); - expect(bAssetBefore.vaultBalance).to.bignumber.equal(bAssetAfter.vaultBalance); - return null; - }), - ); - }); - - it("should succeed for a valid basket index", async () => { - await Promise.all( - integrationDetails.bAssets.map(async (b, index) => { - const bAssetBefore: Basset = await basketManager.getBasset(b.address); - await basketManager.increaseVaultBalance(index, sa.dummy1, new BN(100), { - from: masset, - }); - const bAssetAfter: Basset = await basketManager.getBasset(b.address); - expect(new BN(bAssetBefore.vaultBalance).add(new BN(100))).to.bignumber.equal( - bAssetAfter.vaultBalance, - ); - - await basketManager.decreaseVaultBalance(index, sa.dummy1, new BN(10), { - from: masset, - }); - const bAssetAfterDecrease: Basset = await basketManager.getBasset(b.address); - expect(new BN(bAssetAfter.vaultBalance).sub(new BN(10))).to.bignumber.equal( - bAssetAfterDecrease.vaultBalance, - ); - return null; - }), - ); - }); - }); - - describe("decreaseVaultBalances()", async () => { - it("should fail when called by other than masset contract", async () => { - const indexes: Array = [0, 1, 2, 3]; - const integrators: Array = indexes.map(() => sa.dummy1); - const increaseAmounts: Array = indexes.map(() => new BN(100)); - const decreaseAmounts: Array = indexes.map(() => new BN(100)); - - await basketManager.increaseVaultBalances(indexes, integrators, increaseAmounts, { - from: masset, - }); - - const bAssetBeforeArr: Array = await Promise.all( - integrationDetails.aTokens.map((a) => basketManager.getBasset(a.bAsset)), - ); - await expectRevert( - basketManager.decreaseVaultBalances(indexes, integrators, decreaseAmounts, { - from: sa.other, - }), - "Must be called by mAsset", - ); - - await Promise.all( - integrationDetails.aTokens.map(async (a, index) => { - expect(bAssetBeforeArr[index].vaultBalance).to.bignumber.equal( - (await basketManager.getBasset(a.bAsset)).vaultBalance, - ); - }), - ); - }); - - it("should fail when invalid bAsset index", async () => { - const indexes: Array = [0, 1]; - const invalidIndexes: Array = [5, 6]; - const integrators: Array = [aaveIntegration.address, aaveIntegration.address]; - const increaseAmounts: Array = [new BN(100), new BN(100)]; - const decreaseAmounts: Array = [new BN(100), new BN(100)]; - - await basketManager.increaseVaultBalances(indexes, integrators, increaseAmounts, { - from: masset, - }); - - const bAssetBeforeArr: Array = new Array(indexes.length); - await Promise.all( - integrationDetails.aTokens.map(async (a, index) => { - bAssetBeforeArr[index] = await basketManager.getBasset(a.bAsset); - }), - ); - - await expectRevert( - basketManager.decreaseVaultBalances(invalidIndexes, integrators, decreaseAmounts, { - from: sa.other, - }), - "Must be called by mAsset", - ); - - const bAssetAfterArr: Array = new Array(indexes.length); - await Promise.all( - integrationDetails.aTokens.map(async (a, index) => { - bAssetAfterArr[index] = await basketManager.getBasset(a.bAsset); - - expect(bAssetBeforeArr[index].vaultBalance).to.bignumber.equal( - bAssetAfterArr[index].vaultBalance, - ); - }), - ); - }); - - it("should succeed and decrease vault balance", async () => { - const indexes: Array = [0, 1, 2, 3]; - const integrators: Array = indexes.map(() => sa.dummy1); - const increaseAmounts: Array = indexes.map(() => new BN(100)); - const decreaseAmounts: Array = indexes.map(() => new BN(100)); - - await basketManager.increaseVaultBalances(indexes, integrators, increaseAmounts, { - from: masset, - }); - - const bAssetBeforeArr: Array = new Array(indexes.length); - await Promise.all( - integrationDetails.aTokens.map(async (a, index) => { - bAssetBeforeArr[index] = await basketManager.getBasset(a.bAsset); - }), - ); - - await basketManager.decreaseVaultBalances(indexes, integrators, decreaseAmounts, { - from: masset, - }); - - const bAssetAfterArr: Array = new Array(indexes.length); - await Promise.all( - integrationDetails.aTokens.map(async (a, index) => { - bAssetAfterArr[index] = await basketManager.getBasset(a.bAsset); - - expect( - new BN(bAssetBeforeArr[index].vaultBalance).sub(new BN(100)), - ).to.bignumber.equal(bAssetAfterArr[index].vaultBalance); - }), - ); - }); - }); - - describe("collectInterest()", async () => { - let mockCompound: t.MockCompoundIntegration2Instance; - - beforeEach(async () => { - // deposit to mock platforms - mockCompound = await MockCompoundIntegration.new(); - basketManager = await BasketManager.new(); - await basketManager.initialize( - nexus.address, - masset, - integrationDetails.aTokens.map((a) => a.bAsset), - [mockCompound.address, mockCompound.address], - [percentToWeight(50), percentToWeight(50)], - [false, false], - ); - }); - - describe("should fail", async () => { - it("when called from other than Masset", async () => { - await expectRevert( - basketManager.collectInterest({ from: sa.other }), - "Must be called by mAsset", - ); - }); - - it("when contract is Pasued", async () => { - await basketManager.pause({ from: sa.governor }); - await expectRevert( - basketManager.collectInterest({ from: masset }), - "Pausable: paused", - ); - }); - }); - - it("should have interest generated", async () => { - const existingVaultBal = new BN(10).pow(new BN(17)); - await Promise.all( - integrationDetails.aTokens.map(async (a, index) => { - await basketManager.increaseVaultBalance( - index, - mockCompound.address, - existingVaultBal, - { from: masset }, - ); - - const bAsset = await basketManager.getBasset(a.bAsset); - expect(existingVaultBal).to.bignumber.equal(bAsset.vaultBalance); - }), - ); - - const platformBalance = new BN(10).pow(new BN(18)); - const bAsset0 = await MockERC20.at(integrationDetails.aTokens[0].bAsset); - await bAsset0.transfer(mockCompound.address, new BN(2)); - - await mockCompound.setCustomBalance(platformBalance); - - await basketManager.collectInterest({ from: masset }); - - await Promise.all( - integrationDetails.aTokens.map(async (a, index) => { - const bAsset = await basketManager.getBasset(a.bAsset); - if (index === 0) { - expect(platformBalance.add(new BN(2))).to.bignumber.equal( - bAsset.vaultBalance, - ); - } else { - expect(platformBalance).to.bignumber.equal(bAsset.vaultBalance); - } - }), - ); - }); - - it("when no interest generated", async () => { - const existingValutBal = new BN(10).pow(new BN(18)); - await Promise.all( - integrationDetails.aTokens.map(async (a, index) => { - await basketManager.increaseVaultBalance( - index, - mockCompound.address, - existingValutBal, - { from: masset }, - ); - - const bAsset = await basketManager.getBasset(a.bAsset); - expect(existingValutBal).to.bignumber.equal(bAsset.vaultBalance); - }), - ); - - const platformBalance = new BN(10).pow(new BN(18)); - await mockCompound.setCustomBalance(platformBalance); - - await basketManager.collectInterest({ from: masset }); - - await Promise.all( - integrationDetails.aTokens.map(async (a, index) => { - const bAsset = await basketManager.getBasset(a.bAsset); - expect(existingValutBal).to.bignumber.equal(bAsset.vaultBalance); - }), - ); - }); - }); - - describe("migrating bAssets between platforms", () => { - let newMigration: t.AaveV2IntegrationInstance; - let maliciousIntegration: t.MaliciousAaveIntegrationInstance; - let transferringAsset: t.MockERC20Instance; - beforeEach(async () => { - await createNewBasketManager(); - [, , transferringAsset] = integrationDetails.bAssets; - newMigration = await AaveIntegration.new(); - await newMigration.initialize( - nexus.address, - [masset, basketManager.address], - integrationDetails.aavePlatformAddress, - integrationDetails.aTokens.map((a) => a.bAsset), - integrationDetails.aTokens.map((a) => a.aToken), - ); - maliciousIntegration = await MaliciousAaveIntegration.new(); - await maliciousIntegration.initialize( - nexus.address, - [masset, basketManager.address], - integrationDetails.aavePlatformAddress, - integrationDetails.aTokens.map((a) => a.bAsset), - integrationDetails.aTokens.map((a) => a.aToken), - ); - }); - it("should fail if passed 0 bAssets", async () => { - await expectRevert( - basketManager.migrateBassets([], newMigration.address, { from: sa.governor }), - "Must migrate some bAssets", - ); - }); - it("should fail if bAsset does not exist", async () => { - await expectRevert( - basketManager.migrateBassets([DEAD_ADDRESS], newMigration.address, { - from: sa.governor, - }), - "bAsset does not exist", - ); - }); - it("should fail if integrator address is the same", async () => { - await expectRevert( - basketManager.migrateBassets([transferringAsset.address], aaveIntegration.address, { - from: sa.governor, - }), - "Must transfer to new integrator", - ); - }); - it("should fail if new address is a dud", async () => { - await expectRevert.unspecified( - basketManager.migrateBassets([transferringAsset.address], DEAD_ADDRESS, { - from: sa.governor, - }), - ); - }); - it("should fail if the full amount is not transferred and deposited", async () => { - await transferringAsset.transfer(aaveIntegration.address, new BN(10000)); - await aaveIntegration.deposit(transferringAsset.address, new BN(9000), false, { - from: governance, - }); - await expectRevert( - basketManager.migrateBassets( - [transferringAsset.address], - maliciousIntegration.address, - { - from: sa.governor, - }, - ), - "Must transfer full amount", - ); - }); - it("should move all bAssets from a to b", async () => { - await transferringAsset.transfer(aaveIntegration.address, new BN(10000)); - await aaveIntegration.deposit(transferringAsset.address, new BN(9000), false, { - from: governance, - }); - // get balances before - const bal = await aaveIntegration.checkBalance.call(transferringAsset.address); - expect(bal).bignumber.eq(new BN(9000)); - const rawBal = await transferringAsset.balanceOf(aaveIntegration.address); - expect(rawBal).bignumber.eq(new BN(1000)); - let integratorAddress = await basketManager.getBassetIntegrator( - transferringAsset.address, - ); - expect(integratorAddress).eq(aaveIntegration.address); - // call migrate - const tx = await basketManager.migrateBassets( - [transferringAsset.address], - newMigration.address, - { - from: sa.governor, - }, - ); - // moves all bAssets from old to new - const migratedBal = await newMigration.checkBalance.call(transferringAsset.address); - expect(migratedBal).bignumber.eq(bal); - const migratedRawBal = await transferringAsset.balanceOf(newMigration.address); - expect(migratedRawBal).bignumber.eq(rawBal); - // old balances should be empty - const newRawBal = await transferringAsset.balanceOf(aaveIntegration.address); - expect(newRawBal).bignumber.eq(new BN(0)); - // updates the integrator address - integratorAddress = await basketManager.getBassetIntegrator(transferringAsset.address); - expect(integratorAddress).eq(newMigration.address); - // emits BassetsMigrated - await expectEvent(tx.receipt, "BassetsMigrated", { - bAssets: [transferringAsset.address], - newIntegrator: newMigration.address, - }); - }); - it("should pass if either rawBalance or balance are 0", async () => { - await transferringAsset.transfer(aaveIntegration.address, new BN(10000)); - await aaveIntegration.deposit(transferringAsset.address, new BN(10000), false, { - from: governance, - }); - // get balances before - const bal = await aaveIntegration.checkBalance.call(transferringAsset.address); - expect(bal).bignumber.eq(new BN(10000)); - const rawBal = await transferringAsset.balanceOf(aaveIntegration.address); - expect(rawBal).bignumber.eq(new BN(0)); - let integratorAddress = await basketManager.getBassetIntegrator( - transferringAsset.address, - ); - expect(integratorAddress).eq(aaveIntegration.address); - // call migrate - const tx = await basketManager.migrateBassets( - [transferringAsset.address], - newMigration.address, - { - from: sa.governor, - }, - ); - // moves all bAssets from old to new - const migratedBal = await newMigration.checkBalance.call(transferringAsset.address); - expect(migratedBal).bignumber.eq(bal); - const migratedRawBal = await transferringAsset.balanceOf(newMigration.address); - expect(migratedRawBal).bignumber.eq(rawBal); - // updates the integrator address - integratorAddress = await basketManager.getBassetIntegrator(transferringAsset.address); - expect(integratorAddress).eq(newMigration.address); - // emits BassetsMigrated - await expectEvent(tx.receipt, "BassetsMigrated", { - bAssets: [transferringAsset.address], - newIntegrator: newMigration.address, - }); - }); - }); - - describe("addBasset()", async () => { - let mockERC20: t.MockERC20Instance; - beforeEach(async () => { - await createNewBasketManager(); - mockERC20 = await createMockERC20(); - }); - - describe("should fail", async () => { - it("when called by other than governor", async () => { - await expectRevert( - basketManager.addBasset(mockERC20.address, aaveIntegration.address, false, { - from: sa.other, - }), - "Only governor can execute", - ); - }); - - it("when basket is failed", async () => { - const mockBasketManager = await createMockBasketManger(); - await mockBasketManager.failBasket(); - await expectRevert( - mockBasketManager.addBasset(mockERC20.address, aaveIntegration.address, false, { - from: sa.governor, - }), - "Basket must be alive", - ); - }); - - it("when bAsset address is zero", async () => { - await expectRevert( - basketManager.addBasset(ZERO_ADDRESS, aaveIntegration.address, false, { - from: sa.governor, - }), - "Asset address must be valid", - ); - }); - - it("when integration address is zero", async () => { - await expectRevert( - basketManager.addBasset(mockERC20.address, ZERO_ADDRESS, false, { - from: sa.governor, - }), - "Integration address must be valid", - ); - }); - - it("when bAsset already exist", async () => { - await Promise.all( - integrationDetails.aTokens.map(async (a) => { - await expectRevert( - basketManager.addBasset(a.bAsset, aaveIntegration.address, false, { - from: sa.governor, - }), - "bAsset already exists in Basket", - ); - }), - ); - }); - - it("when max bAssets reached", async () => { - const mockERC20s: Array = new Array(13); - for (let index = 0; index < 6; index += 1) { - const mock = await createMockERC20(); - mockERC20s.push(mock); - } - - let bAssets = await basketManager.getBassets(); - const lengthBefore = bAssets[0].length; - expect(4).to.equal(lengthBefore); - - await Promise.all( - mockERC20s.map((a) => - basketManager.addBasset(a.address, aaveIntegration.address, false, { - from: sa.governor, - }), - ), - ); - - bAssets = await basketManager.getBassets(); - const lengthAfter = bAssets[0].length; - expect(10).to.equal(lengthAfter); - - await expectRevert( - basketManager.addBasset(mockERC20.address, aaveIntegration.address, false, { - from: sa.governor, - }), - "Max bAssets in Basket", - ); - }); - }); - - it("should add a new bAsset with 18 decimals", async () => { - let bAssets = await basketManager.getBassets(); - const lengthBefore = bAssets[0].length; - expect(4).to.equal(lengthBefore); - - const tx = await basketManager.addBasset( - mockERC20.address, - aaveIntegration.address, - false, - { - from: sa.governor, - }, - ); - expectEvent.inLogs(tx.logs, "BassetAdded", { - bAsset: mockERC20.address, - integrator: aaveIntegration.address, - }); - - bAssets = await basketManager.getBassets(); - const lengthAfter = bAssets[0].length; - expect(5).to.equal(lengthAfter); - - const bAsset = await basketManager.getBasset(mockERC20.address); - const ratio = calculateRatio(ratioScale, await mockERC20.decimals()); - const expectedBasset = buildBasset( - mockERC20.address, - BassetStatus.Normal, - false, - ratio, - new BN(0), - new BN(0), - ); - equalBasset(expectedBasset, bAsset); - const integrator = await basketManager.getBassetIntegrator(mockERC20.address); - expect(integrator).eq(aaveIntegration.address); - }); - - it("should add a new bAsset with 10 decimals", async () => { - mockERC20 = await createMockERC20(10); - let bAssets = await basketManager.getBassets(); - const lengthBefore = bAssets[0].length; - expect(4).to.equal(lengthBefore); - - const tx = await basketManager.addBasset( - mockERC20.address, - aaveIntegration.address, - false, - { - from: sa.governor, - }, - ); - expectEvent.inLogs(tx.logs, "BassetAdded", { - bAsset: mockERC20.address, - integrator: aaveIntegration.address, - }); - - bAssets = await basketManager.getBassets(); - const lengthAfter = bAssets[0].length; - expect(5).to.equal(lengthAfter); - - const bAsset = await basketManager.getBasset(mockERC20.address); - const ratio = calculateRatio(ratioScale, await mockERC20.decimals()); - const expectedBasset = buildBasset( - mockERC20.address, - BassetStatus.Normal, - false, - ratio, - new BN(0), - new BN(0), - ); - equalBasset(expectedBasset, bAsset); - const integrator = await basketManager.getBassetIntegrator(mockERC20.address); - expect(integrator).eq(aaveIntegration.address); - }); - }); - - describe("setBasketWeights()", async () => { - let mockBasketManager: t.MockBasketManager3Instance; - beforeEach(async () => { - mockBasketManager = await createMockBasketManger(); - }); - - describe("should fail", async () => { - it("when not called by governor", async () => { - await expectRevert( - mockBasketManager.setBasketWeights( - integrationDetails.aTokens.map((a) => a.bAsset), - [percentToWeight(60), percentToWeight(40)], - { from: sa.other }, - ), - "Only governor can execute", - ); - }); - - it("should fail when empty array passed", async () => { - await expectRevert( - mockBasketManager.setBasketWeights([], [], { from: sa.governor }), - "Empty bAssets array passed", - ); - }); - - it("when basket is not healthy", async () => { - await mockBasketManager.failBasket(); - - await expectRevert( - mockBasketManager.setBasketWeights( - integrationDetails.aTokens.map((a) => a.bAsset), - [percentToWeight(60), percentToWeight(40)], - { from: sa.governor }, - ), - "Basket must be alive", - ); - }); - - it("when array length not matched", async () => { - await expectRevert( - mockBasketManager.setBasketWeights( - integrationDetails.aTokens.map((a) => a.bAsset), - [percentToWeight(100)], - { from: sa.governor }, - ), - "Must be matching bAsset arrays", - ); - }); - - it("when bAsset does not exist", async () => { - await expectRevert( - mockBasketManager.setBasketWeights([sa.other], [percentToWeight(100)], { - from: sa.governor, - }), - "bAsset must exist", - ); - }); - - it("when bAssetWeight is greater than 100%", async () => { - await expectRevert( - mockBasketManager.setBasketWeights( - integrationDetails.aTokens.map((a) => a.bAsset), - [percentToWeight(101), percentToWeight(45)], - { from: sa.governor }, - ), - "Asset weight must be <= 100%", - ); - }); - - it("when bAsset is not active", async () => { - const bAssetBelowPeg = integrationDetails.aTokens[0].bAsset; - await mockBasketManager.setBassetStatus( - bAssetBelowPeg, - BassetStatus.BrokenBelowPeg, - ); - - await expectRevert( - mockBasketManager.setBasketWeights( - integrationDetails.aTokens.map((a) => a.bAsset), - [percentToWeight(60), percentToWeight(40)], - { from: sa.governor }, - ), - "Affected bAssets must be static", - ); - }); - - it("when total weight is not valid", async () => { - const mockERC20 = await createMockERC20(); - await mockBasketManager.addBasset( - mockERC20.address, - aaveIntegration.address, - false, - { - from: sa.governor, - }, - ); - await expectRevert( - mockBasketManager.setBasketWeights( - [...integrationDetails.bAssets.map((b) => b.address), mockERC20.address], - [ - percentToWeight(80), - percentToWeight(70), - percentToWeight(80), - percentToWeight(90), - percentToWeight(90), - ], - { from: sa.governor }, - ), - "Basket weight must be >= 100 && <= 400%", - ); - }); - }); - - it("should update the weights", async () => { - await Promise.all( - integrationDetails.aTokens.map(async (a) => { - const bAsset: Basset = await mockBasketManager.getBasset(a.bAsset); - expect(percentToWeight(50)).to.bignumber.equal(bAsset.maxWeight); - }), - ); - - await mockBasketManager.setBasketWeights( - integrationDetails.aTokens.map((a) => a.bAsset), - [percentToWeight(50), percentToWeight(40)], - { from: sa.governor }, - ); - - const expectedWeight: Array = [percentToWeight(50), percentToWeight(40)]; - await Promise.all( - integrationDetails.aTokens.map(async (a, index) => { - const bAsset: Basset = await mockBasketManager.getBasset(a.bAsset); - expect(expectedWeight[index]).to.bignumber.equal(bAsset.maxWeight); - }), - ); - }); - it("should update the weights even with affected bAsset", async () => { - const { bAssets } = integrationDetails; - await Promise.all( - bAssets.map(async (b) => { - const bAsset: Basset = await mockBasketManager.getBasset(b.address); - expect(percentToWeight(50)).to.bignumber.equal(bAsset.maxWeight); - }), - ); - const mockERC20 = await createMockERC20(); - await mockBasketManager.addBasset(mockERC20.address, aaveIntegration.address, false, { - from: sa.governor, - }); - await mockBasketManager.setBassetStatus( - bAssets[1].address, - BassetStatus.BrokenBelowPeg, - ); - - await mockBasketManager.setBasketWeights( - [...bAssets.map((b) => b.address), mockERC20.address], - [ - percentToWeight(30), - percentToWeight(50), - percentToWeight(20), - percentToWeight(20), - percentToWeight(20), - ], - { from: sa.governor }, - ); - - const expectedWeight: Array = [ - percentToWeight(30), - percentToWeight(50), - percentToWeight(20), - percentToWeight(20), - percentToWeight(20), - ]; - const [bassets] = await mockBasketManager.getBassets(); - await Promise.all( - bassets.map(async (b, index) => { - expect(expectedWeight[index]).to.bignumber.equal(new BN(b.maxWeight)); - }), - ); - }); - }); - - describe("setTransferFeesFlag()", async () => { - beforeEach(async () => { - await createNewBasketManager(); - }); - it("should fail when not called by manager or governor", async () => { - await Promise.all( - integrationDetails.aTokens.map(async (a) => { - let bAsset: Basset = await basketManager.getBasset(a.bAsset); - expect(false).to.equal(bAsset.isTransferFeeCharged); - - await expectRevert( - basketManager.setTransferFeesFlag(a.bAsset, true, { from: sa.other }), - "Must be manager or governor", - ); - - bAsset = await basketManager.getBasset(a.bAsset); - expect(false).to.equal(bAsset.isTransferFeeCharged); - }), - ); - }); - - it("should fail when bAsset address is zero", async () => { - await expectRevert( - basketManager.setTransferFeesFlag(ZERO_ADDRESS, true, { from: manager }), - "bAsset does not exist", - ); - - await expectRevert( - basketManager.setTransferFeesFlag(ZERO_ADDRESS, true, { from: sa.governor }), - "bAsset does not exist", - ); - }); - - it("should fail when bAsset not exist", async () => { - await expectRevert( - basketManager.setTransferFeesFlag(sa.other, true, { from: manager }), - "bAsset does not exist", - ); - - await expectRevert( - basketManager.setTransferFeesFlag(sa.other, true, { from: sa.governor }), - "bAsset does not exist", - ); - }); - - it("should succeed when called by manager for a valid bAsset", async () => { - await Promise.all( - integrationDetails.aTokens.map(async (a) => { - let bAsset: Basset = await basketManager.getBasset(a.bAsset); - expect(false).to.equal(bAsset.isTransferFeeCharged); - - const tx = await basketManager.setTransferFeesFlag(a.bAsset, true, { - from: manager, - }); - expectEvent.inLogs(tx.logs, "TransferFeeEnabled", { - bAsset: a.bAsset, - enabled: true, - }); - - bAsset = await basketManager.getBasset(a.bAsset); - expect(true).to.equal(bAsset.isTransferFeeCharged); - }), - ); - }); - - it("should succeed and deposit outstanding bAsset when called by governor", async () => { - const { bAsset } = integrationDetails.aTokens[0]; - let details: Basset = await basketManager.getBasset(bAsset); - const contract = await MockERC20.at(bAsset); - const integrator = await basketManager.getBassetIntegrator(bAsset); - const integratorContract = await CompoundIntegration.at(integrator); - - await contract.transfer(integrator, new BN(100000)); - expect(false).to.equal(details.isTransferFeeCharged); - - const tx = await basketManager.setTransferFeesFlag(bAsset, true, { - from: sa.governor, - }); - expectEvent.inLogs(tx.logs, "TransferFeeEnabled", { - bAsset, - enabled: true, - }); - - expect(await integratorContract.checkBalance.call(bAsset)).bignumber.eq(new BN(100000)); - expect(await contract.balanceOf(integrator)).bignumber.eq(new BN(0)); - - details = await basketManager.getBasset(bAsset); - expect(true).to.equal(details.isTransferFeeCharged); - }); - - it("should allow enable fee for bAsset", async () => { - await Promise.all( - integrationDetails.aTokens.map(async (a) => { - let bAsset: Basset = await basketManager.getBasset(a.bAsset); - expect(false).to.equal(bAsset.isTransferFeeCharged); - - const tx = await basketManager.setTransferFeesFlag(a.bAsset, true, { - from: manager, - }); - expectEvent.inLogs(tx.logs, "TransferFeeEnabled", { - bAsset: a.bAsset, - enabled: true, - }); - - bAsset = await basketManager.getBasset(a.bAsset); - expect(true).to.equal(bAsset.isTransferFeeCharged); - }), - ); - }); - - it("should allow disable fee for bAsset", async () => { - await Promise.all( - integrationDetails.aTokens.map(async (a) => { - let bAsset: Basset = await basketManager.getBasset(a.bAsset); - expect(false).to.equal(bAsset.isTransferFeeCharged); - - let tx = await basketManager.setTransferFeesFlag(a.bAsset, true, { - from: manager, - }); - expectEvent.inLogs(tx.logs, "TransferFeeEnabled", { - bAsset: a.bAsset, - enabled: true, - }); - - bAsset = await basketManager.getBasset(a.bAsset); - expect(true).to.equal(bAsset.isTransferFeeCharged); - - tx = await basketManager.setTransferFeesFlag(a.bAsset, false, { - from: manager, - }); - expectEvent.inLogs(tx.logs, "TransferFeeEnabled", { - bAsset: a.bAsset, - enabled: false, - }); - - bAsset = await basketManager.getBasset(a.bAsset); - expect(false).to.equal(bAsset.isTransferFeeCharged); - }), - ); - }); - }); - - describe("removeBasset()", async () => { - beforeEach(async () => { - await createNewBasketManager(); - }); - - describe("should fail", async () => { - it("when basket is not healthy", async () => { - const mockBasketManager = await createMockBasketManger(); - mockBasketManager.failBasket(); - - await Promise.all( - integrationDetails.aTokens.map(async (a) => { - const lengthBefore = (await mockBasketManager.getBassets())[0].length; - - await expectRevert( - mockBasketManager.removeBasset(a.bAsset, { from: manager }), - "Basket must be alive", - ); - - const lengthAfter = (await mockBasketManager.getBassets())[0].length; - expect(lengthBefore).to.equal(lengthAfter); - }), - ); - }); - - it("when not called by manager or governor", async () => { - await Promise.all( - integrationDetails.aTokens.map(async (a) => { - const lengthBefore = (await basketManager.getBassets())[0].length; - - await expectRevert( - basketManager.removeBasset(a.bAsset, { from: sa.other }), - "Must be manager or governor", - ); - - const lengthAfter = (await basketManager.getBassets())[0].length; - expect(lengthBefore).to.equal(lengthAfter); - }), - ); - }); - - it("when bAsset address is zero", async () => { - const lengthBefore = (await basketManager.getBassets())[0].length; - - await expectRevert( - basketManager.removeBasset(ZERO_ADDRESS, { from: manager }), - "bAsset does not exist", - ); - - const lengthAfter = (await basketManager.getBassets())[0].length; - expect(lengthBefore).to.equal(lengthAfter); - }); - - it("when bAsset address not exist", async () => { - const lengthBefore = (await basketManager.getBassets())[0].length; - - await expectRevert( - basketManager.removeBasset(sa.other, { from: manager }), - "bAsset does not exist", - ); - - const lengthAfter = (await basketManager.getBassets())[0].length; - expect(lengthBefore).to.equal(lengthAfter); - }); - - it("when bAsset maxWeight is non zero (by governor)", async () => { - await Promise.all( - integrationDetails.aTokens.map(async (a) => { - const lengthBefore = (await basketManager.getBassets())[0].length; - - await expectRevert( - basketManager.removeBasset(a.bAsset, { from: sa.governor }), - "bAsset must have a target weight of 0", - ); - - const lengthAfter = (await basketManager.getBassets())[0].length; - expect(lengthBefore).to.equal(lengthAfter); - }), - ); - }); - - it("when bAsset vault balance is non zero (by governor)", async () => { - const { bAssets } = integrationDetails; - const bAssetToRemove = bAssets[0].address; - - const lengthBefore = (await basketManager.getBassets())[0].length; - - await basketManager.increaseVaultBalance(0, aaveIntegration.address, new BN(100), { - from: masset, - }); - - const newWeights = [ - percentToWeight(0), - percentToWeight(50), - percentToWeight(50), - percentToWeight(50), - ]; - await basketManager.setBasketWeights( - bAssets.map((b) => b.address), - newWeights, - { from: sa.governor }, - ); - await expectRevert( - basketManager.removeBasset(bAssetToRemove, { from: sa.governor }), - "bAsset vault must be empty", - ); - - const lengthAfter = (await basketManager.getBassets())[0].length; - expect(lengthBefore).to.equal(lengthAfter); - }); - - it("when bAsset status is not active (by governor)", async () => { - const mockBasketManager = await createMockBasketManger(); - const bAssetToRemove = integrationDetails.aTokens[0].bAsset; - - const lengthBefore = (await mockBasketManager.getBassets())[0].length; - - const bAssets = integrationDetails.aTokens.map((a) => a.bAsset); - const newWeights = [percentToWeight(0), percentToWeight(50)]; - await mockBasketManager.setBasketWeights(bAssets, newWeights, { - from: sa.governor, - }); - - await mockBasketManager.setBassetStatus(bAssetToRemove, BassetStatus.Liquidating); - - await expectRevert( - mockBasketManager.removeBasset(bAssetToRemove, { from: sa.governor }), - "bAsset must be active", - ); - - const lengthAfter = (await mockBasketManager.getBassets())[0].length; - expect(lengthBefore).to.equal(lengthAfter); - }); - }); - - it("should succeed when request is valid (by manager)", async () => { - const mockBasketManager = await createMockBasketManger(); - const bAssetToRemove = integrationDetails.bAssets[0].address; - const unMovedBasset = integrationDetails.bAssets[1].address; - const movedBasset = integrationDetails.bAssets[3].address; - - const lengthBefore = (await mockBasketManager.getBassets())[0].length; - - const bAssets = integrationDetails.bAssets.map((b) => b.address); - const newWeights = [ - percentToWeight(0), - percentToWeight(50), - percentToWeight(40), - percentToWeight(30), - ]; - await mockBasketManager.setBasketWeights(bAssets, newWeights, { - from: sa.governor, - }); - const unmovedBassetBefore = await mockBasketManager.getBasset(unMovedBasset); - const movedBassetBefore = await mockBasketManager.getBasset(movedBasset); - const unmovedBassetIntegratorBefore = await mockBasketManager.getBassetIntegrator( - unMovedBasset, - ); - const movedBassetIntegratorBefore = await mockBasketManager.getBassetIntegrator( - movedBasset, - ); - - const tx = await mockBasketManager.removeBasset(bAssetToRemove, { from: manager }); - expectEvent.inLogs(tx.logs, "BassetRemoved", { bAsset: bAssetToRemove }); - - // Basket should still behave as normal, getting the desired details and integrator - const unmovedBassetAfter = await mockBasketManager.getBasset(unMovedBasset); - const movedBassetAfter = await mockBasketManager.getBasset(movedBasset); - const unmovedBassetIntegratorAfter = await mockBasketManager.getBassetIntegrator( - unMovedBasset, - ); - const movedBassetIntegratorAfter = await mockBasketManager.getBassetIntegrator( - movedBasset, - ); - await expectRevert.assertion(mockBasketManager.integrations(3)); - - expect(unmovedBassetIntegratorBefore).eq(unmovedBassetIntegratorAfter); - expect(movedBassetIntegratorBefore).eq(movedBassetIntegratorAfter); - expect(unmovedBassetBefore.maxWeight).eq(unmovedBassetAfter.maxWeight); - expect(movedBassetBefore.maxWeight).eq(movedBassetAfter.maxWeight); - const lengthAfter = (await mockBasketManager.getBassets())[0].length; - expect(lengthBefore - 1).to.equal(lengthAfter); - - await expectRevert(mockBasketManager.getBasset(bAssetToRemove), "bAsset must exist"); - }); - it("should remove the last bAsset in the array", async () => { - const mockBasketManager = await createMockBasketManger(); - const bAssetToRemove = integrationDetails.bAssets[3].address; - const unMovedBasset = integrationDetails.bAssets[1].address; - - const lengthBefore = (await mockBasketManager.getBassets())[0].length; - - const bAssets = integrationDetails.bAssets.map((b) => b.address); - const newWeights = [ - percentToWeight(30), - percentToWeight(50), - percentToWeight(40), - percentToWeight(0), - ]; - await mockBasketManager.setBasketWeights(bAssets, newWeights, { - from: sa.governor, - }); - const unmovedBassetBefore = await mockBasketManager.getBasset(unMovedBasset); - const unmovedBassetIntegratorBefore = await mockBasketManager.getBassetIntegrator( - unMovedBasset, - ); - - const tx = await mockBasketManager.removeBasset(bAssetToRemove, { from: manager }); - expectEvent.inLogs(tx.logs, "BassetRemoved", { bAsset: bAssetToRemove }); - - // Basket should still behave as normal, getting the desired details and integrator - const unmovedBassetAfter = await mockBasketManager.getBasset(unMovedBasset); - const unmovedBassetIntegratorAfter = await mockBasketManager.getBassetIntegrator( - unMovedBasset, - ); - await expectRevert.assertion(mockBasketManager.integrations(3)); - - expect(unmovedBassetIntegratorBefore).eq(unmovedBassetIntegratorAfter); - expect(unmovedBassetBefore.maxWeight).eq(unmovedBassetAfter.maxWeight); - const lengthAfter = (await mockBasketManager.getBassets())[0].length; - expect(lengthBefore - 1).to.equal(lengthAfter); - - await expectRevert(mockBasketManager.getBasset(bAssetToRemove), "bAsset must exist"); - }); - }); - - describe("getBasket()", async () => { - it("gets the full basket with all parameters", async () => { - const basket = await basketManager.getBasket(); - const bAssets = basket.bassets; - equalBassets(bAssets, await createDefaultBassets()); - expect(false).to.equal(basket.failed); - expect(new BN(10)).to.bignumber.equal(basket.maxBassets); - expect(fullScale).to.bignumber.equal(basket.collateralisationRatio); - }); - }); - - describe("prepareForgeBasset()", async () => { - beforeEach(async () => { - await createNewBasketManager(); - }); - - it("should fail when contract is Paused", async () => { - await basketManager.pause({ from: sa.governor }); - - await Promise.all( - integrationDetails.aTokens.map(async (a) => { - await expectRevert( - basketManager.prepareForgeBasset(a.bAsset, 0, false), - "Pausable: paused", - ); - }), - ); - }); - - it("should fail when wrong token is passed", async () => { - await expectRevert( - basketManager.prepareForgeBasset(sa.other, 0, false), - "bAsset does not exist", - ); - }); - - it("should return ForgeProps", async () => { - await Promise.all( - integrationDetails.aTokens.map(async (a) => { - await basketManager.prepareForgeBasset(a.bAsset, 0, false); - }), - ); - }); - }); - - describe("prepareForgeBassets()", async () => { - beforeEach(async () => { - await createNewBasketManager(); - }); - - it("should fail when contract is Paused", async () => { - await basketManager.pause({ from: sa.governor }); - - await expectRevert( - basketManager.prepareForgeBassets( - [integrationDetails.aTokens[0].bAsset], - [], - false, - ), - "Pausable: paused", - ); - }); - - it("should fail when passed duplicate items", async () => { - await expectRevert( - basketManager.prepareForgeBassets( - [ - integrationDetails.aTokens[0].bAsset, - integrationDetails.aTokens[1].bAsset, - integrationDetails.aTokens[0].bAsset, - ], - [], - false, - ), - "Must have no duplicates", - ); - }); - - it("should fail when passed incorrect bAsset address", async () => { - await expectRevert( - basketManager.prepareForgeBassets([sa.dummy1], [], false), - "bAsset must exist", - ); - }); - - it("should return ForgePropsMulti", async () => { - // rely on integration tests from the mAsset to ensure that the forge props are being passed correctly - }); - }); - - describe("prepare redeem bAssets", async () => { - it("should fail when contract is Paused", async () => { - await basketManager.pause({ from: sa.governor }); - - await expectRevert( - basketManager.prepareRedeemBassets([integrationDetails.aTokens[0].bAsset]), - "Pausable: paused", - ); - await basketManager.unpause({ from: sa.governor }); - }); - - it("should fail when passed duplicate items", async () => { - await expectRevert( - basketManager.prepareRedeemBassets([ - integrationDetails.aTokens[0].bAsset, - integrationDetails.aTokens[1].bAsset, - integrationDetails.aTokens[0].bAsset, - ]), - "Must have no duplicates", - ); - }); - - it("should fail when passed incorrect bAsset address", async () => { - await expectRevert( - basketManager.prepareRedeemBassets([sa.dummy1]), - "bAsset must exist", - ); - }); - it("shold return redeemProps", async () => { - const { bAsset } = integrationDetails.aTokens[0]; - const response = await basketManager.prepareRedeemBassets([bAsset]); - expect(response.isValid).eq(true); - await expectBassets(response.allBassets, new BN(4)); - expect(response.bAssets.length).eq(1); - expect(response.bAssets[0].addr).eq(bAsset); - expect(response.indexes[0]).bignumber.eq(new BN(2)); - }); - }); - - describe("getBassets()", async () => { - it("should get all bAssets", async () => { - await expectBassets(await createDefaultBassets(), new BN(4)); - }); - }); - - describe("getBasset()", async () => { - it("should failed when wrong bAsset address is passed", async () => { - await expectRevert(basketManager.getBasset(sa.other), "bAsset must exist"); - }); - - it("should return bAsset", async () => { - await Promise.all( - integrationDetails.aTokens.map(async (a) => { - const bAsset: Basset = await basketManager.getBasset(a.bAsset); - const expectedBasset = buildBasset( - a.bAsset, - BassetStatus.Normal, - false, - ratioScale, - percentToWeight(50), - new BN(0), - ); - equalBasset(expectedBasset, bAsset); - }), - ); - }); - }); - - describe("getBassetIntegrator()", async () => { - it("should failed when wrong bAsset address is passed", async () => { - await expectRevert(basketManager.getBassetIntegrator(sa.other), "bAsset must exist"); - }); - - it("should return integrator address", async () => { - await Promise.all( - integrationDetails.aTokens.map(async (a) => { - const integrator = await basketManager.getBassetIntegrator(a.bAsset); - expect(aaveIntegration.address).to.equal(integrator); - }), - ); - }); - }); - - describe("handlePegLoss()", async () => { - let mockBasketManager: t.MockBasketManager3Instance; - - beforeEach(async () => { - mockBasketManager = await createMockBasketManger(); - }); - - describe("should fail", async () => { - it("when not called by manager or governor", async () => { - await Promise.all( - integrationDetails.aTokens.map(async (a) => { - await expectRevert( - mockBasketManager.handlePegLoss(a.bAsset, true, { from: sa.other }), - "Must be manager or governor", - ); - }), - ); - }); - - it("when basket is not healthy (by manager)", async () => { - await mockBasketManager.failBasket(); - - await Promise.all( - integrationDetails.aTokens.map(async (a) => { - await expectRevert( - mockBasketManager.handlePegLoss(a.bAsset, true, { from: manager }), - "Basket must be alive", - ); - }), - ); - }); - - it("when basket is not healthy (by governor)", async () => { - await mockBasketManager.failBasket(); - - await Promise.all( - integrationDetails.aTokens.map(async (a) => { - await expectRevert( - mockBasketManager.handlePegLoss(a.bAsset, true, { from: sa.governor }), - "Basket must be alive", - ); - }), - ); - }); - - it("when bAsset not exist", async () => { - await expectRevert( - mockBasketManager.handlePegLoss(sa.other, true, { from: sa.governor }), - "bAsset must exist in Basket", - ); - }); - }); - - it("should not change status when already BrokenBelowPeg (by governor)", async () => { - await Promise.all( - integrationDetails.aTokens.map(async (a) => { - const bAssetBefore = await mockBasketManager.getBasset(a.bAsset); - expect(bAssetBefore.status).to.bignumber.equal(new BN(BassetStatus.Normal)); - - await mockBasketManager.setBassetStatus(a.bAsset, BassetStatus.BrokenBelowPeg); - const bAssetAfterStatusChange = await mockBasketManager.getBasset(a.bAsset); - expect(bAssetAfterStatusChange.status).to.bignumber.equal( - new BN(BassetStatus.BrokenBelowPeg), - ); - - await mockBasketManager.handlePegLoss(a.bAsset, true, { from: sa.governor }); - const bAssetAfterHandlePegLoss = await mockBasketManager.getBasset(a.bAsset); - expect(bAssetAfterHandlePegLoss.status).to.bignumber.equal( - new BN(BassetStatus.BrokenBelowPeg), - ); - }), - ); - }); - - it("should not change status when already BrokenAbovePeg (by manager)", async () => { - await Promise.all( - integrationDetails.aTokens.map(async (a) => { - const bAssetBefore = await mockBasketManager.getBasset(a.bAsset); - expect(bAssetBefore.status).to.bignumber.equal(new BN(BassetStatus.Normal)); - - await mockBasketManager.setBassetStatus(a.bAsset, BassetStatus.BrokenAbovePeg); - const bAssetAfterStatusChange = await mockBasketManager.getBasset(a.bAsset); - expect(bAssetAfterStatusChange.status).to.bignumber.equal( - new BN(BassetStatus.BrokenAbovePeg), - ); - - await mockBasketManager.handlePegLoss(a.bAsset, false, { from: manager }); - const bAssetAfterHandlePegLoss = await mockBasketManager.getBasset(a.bAsset); - expect(bAssetAfterHandlePegLoss.status).to.bignumber.equal( - new BN(BassetStatus.BrokenAbovePeg), - ); - }), - ); - }); - - it("should not change status when bAsset has recolled - Liquidating (by manager)", async () => { - const belowPegBools: Array = [true, false]; - await Promise.all( - belowPegBools.map(async (flag) => { - await Promise.all( - integrationDetails.aTokens.map(async (a) => { - const bAssetBefore = await mockBasketManager.getBasset(a.bAsset); - expect(bAssetBefore.status).to.bignumber.equal( - new BN(BassetStatus.Normal), - ); - - await mockBasketManager.setBassetStatus( - a.bAsset, - BassetStatus.Liquidating, - ); - const bAssetAfterStatusChange = await mockBasketManager.getBasset( - a.bAsset, - ); - expect(bAssetAfterStatusChange.status).to.bignumber.equal( - new BN(BassetStatus.Liquidating), - ); - - await mockBasketManager.handlePegLoss(a.bAsset, flag, { - from: manager, - }); - const bAssetAfterHandlePegLoss = await mockBasketManager.getBasset( - a.bAsset, - ); - expect(bAssetAfterHandlePegLoss.status).to.bignumber.equal( - new BN(BassetStatus.Liquidating), - ); - }), - ); - return null; - }), - ); - }); - - it("should not change status when bAsset has recolled - Liquidated (by governor)", async () => { - const belowPegBools: Array = [true, false]; - await Promise.all( - belowPegBools.map(async (flag) => { - await Promise.all( - integrationDetails.aTokens.map(async (a) => { - const bAssetBefore = await mockBasketManager.getBasset(a.bAsset); - expect(bAssetBefore.status).to.bignumber.equal( - new BN(BassetStatus.Normal), - ); - - await mockBasketManager.setBassetStatus( - a.bAsset, - BassetStatus.Liquidated, - ); - const bAssetAfterStatusChange = await mockBasketManager.getBasset( - a.bAsset, - ); - expect(bAssetAfterStatusChange.status).to.bignumber.equal( - new BN(BassetStatus.Liquidated), - ); - - await mockBasketManager.handlePegLoss(a.bAsset, flag, { - from: sa.governor, - }); - const bAssetAfterHandlePegLoss = await mockBasketManager.getBasset( - a.bAsset, - ); - expect(bAssetAfterHandlePegLoss.status).to.bignumber.equal( - new BN(BassetStatus.Liquidated), - ); - }), - ); - return null; - }), - ); - }); - - it("should change status when (Normal, belowPeg) (by governor)", async () => { - await Promise.all( - integrationDetails.aTokens.map(async (a) => { - const bAssetBefore = await mockBasketManager.getBasset(a.bAsset); - expect(bAssetBefore.status).to.bignumber.equal(new BN(BassetStatus.Normal)); - - const tx = await mockBasketManager.handlePegLoss(a.bAsset, true, { - from: sa.governor, - }); - expectEvent.inLogs(tx.logs, "BassetStatusChanged", { - bAsset: a.bAsset, - status: new BN(BassetStatus.BrokenBelowPeg), - }); - - const bAssetAfterHandlePegLoss = await mockBasketManager.getBasset(a.bAsset); - expect(bAssetAfterHandlePegLoss.status).to.bignumber.equal( - new BN(BassetStatus.BrokenBelowPeg), - ); - }), - ); - }); - - it("should change status when (Normal, abovePeg) (by governor)", async () => { - await Promise.all( - integrationDetails.aTokens.map(async (a) => { - const bAssetBefore = await mockBasketManager.getBasset(a.bAsset); - expect(bAssetBefore.status).to.bignumber.equal(new BN(BassetStatus.Normal)); - - const tx = await mockBasketManager.handlePegLoss(a.bAsset, false, { - from: sa.governor, - }); - expectEvent.inLogs(tx.logs, "BassetStatusChanged", { - bAsset: a.bAsset, - status: new BN(BassetStatus.BrokenAbovePeg), - }); - - const bAssetAfterHandlePegLoss = await mockBasketManager.getBasset(a.bAsset); - expect(bAssetAfterHandlePegLoss.status).to.bignumber.equal( - new BN(BassetStatus.BrokenAbovePeg), - ); - }), - ); - }); - - it("should change status when (Blacklisted, belowPeg) (by governor)", async () => { - await Promise.all( - integrationDetails.aTokens.map(async (a) => { - const bAssetBefore = await mockBasketManager.getBasset(a.bAsset); - expect(bAssetBefore.status).to.bignumber.equal(new BN(BassetStatus.Normal)); - - await mockBasketManager.setBassetStatus(a.bAsset, BassetStatus.Blacklisted); - const bAssetAfterStatusChange = await mockBasketManager.getBasset(a.bAsset); - expect(bAssetAfterStatusChange.status).to.bignumber.equal( - new BN(BassetStatus.Blacklisted), - ); - - const tx = await mockBasketManager.handlePegLoss(a.bAsset, true, { - from: sa.governor, - }); - expectEvent.inLogs(tx.logs, "BassetStatusChanged", { - bAsset: a.bAsset, - status: new BN(BassetStatus.BrokenBelowPeg), - }); - - const bAssetAfterHandlePegLoss = await mockBasketManager.getBasset(a.bAsset); - expect(bAssetAfterHandlePegLoss.status).to.bignumber.equal( - new BN(BassetStatus.BrokenBelowPeg), - ); - }), - ); - }); - - it("should change status when (Blacklisted, abovePeg) (by governor)", async () => { - await Promise.all( - integrationDetails.aTokens.map(async (a) => { - const bAssetBefore = await mockBasketManager.getBasset(a.bAsset); - expect(bAssetBefore.status).to.bignumber.equal(new BN(BassetStatus.Normal)); - - await mockBasketManager.setBassetStatus(a.bAsset, BassetStatus.Blacklisted); - const bAssetAfterStatusChange = await mockBasketManager.getBasset(a.bAsset); - expect(bAssetAfterStatusChange.status).to.bignumber.equal( - new BN(BassetStatus.Blacklisted), - ); - - const tx = await mockBasketManager.handlePegLoss(a.bAsset, false, { - from: sa.governor, - }); - expectEvent.inLogs(tx.logs, "BassetStatusChanged", { - bAsset: a.bAsset, - status: new BN(BassetStatus.BrokenAbovePeg), - }); - - const bAssetAfterHandlePegLoss = await mockBasketManager.getBasset(a.bAsset); - expect(bAssetAfterHandlePegLoss.status).to.bignumber.equal( - new BN(BassetStatus.BrokenAbovePeg), - ); - }), - ); - }); - }); - - describe("negateIsolation()", async () => { - let mockBasketManager: t.MockBasketManager3Instance; - - beforeEach(async () => { - mockBasketManager = await createMockBasketManger(); - }); - - it("should skip when Normal (by manager)", async () => { - await Promise.all( - integrationDetails.aTokens.map((a) => - mockBasketManager.negateIsolation(a.bAsset, { from: manager }), - ), - ); - }); - - it("should skip when Normal (by governor)", async () => { - await Promise.all( - integrationDetails.aTokens.map((a) => - mockBasketManager.negateIsolation(a.bAsset, { from: sa.governor }), - ), - ); - }); - - it("should fail when not called by manager or governor", async () => { - await Promise.all( - integrationDetails.aTokens.map((a) => - expectRevert( - mockBasketManager.negateIsolation(a.bAsset, { from: sa.other }), - "Must be manager or governor", - ), - ), - ); - }); - - it("should fail when wrong bAsset address passed", async () => { - await expectRevert( - mockBasketManager.negateIsolation(sa.other, { from: manager }), - "bAsset must exist", - ); - }); - - it("should succeed when status is 'BrokenBelowPeg' (by manager)", async () => { - await Promise.all( - integrationDetails.aTokens.map(async (a) => { - const bAssetBefore = await mockBasketManager.getBasset(a.bAsset); - expect(new BN(BassetStatus.Normal)).to.bignumber.equal(bAssetBefore.status); - - await mockBasketManager.setBassetStatus(a.bAsset, BassetStatus.BrokenBelowPeg); - const bAssetAfter = await mockBasketManager.getBasset(a.bAsset); - expect(new BN(BassetStatus.BrokenBelowPeg)).to.bignumber.equal( - bAssetAfter.status, - ); - - const tx = await mockBasketManager.negateIsolation(a.bAsset, { from: manager }); - expectEvent.inLogs(tx.logs, "BassetStatusChanged", { - bAsset: a.bAsset, - status: new BN(BassetStatus.Normal), - }); - const bAssetAfterNegate = await mockBasketManager.getBasset(a.bAsset); - expect(new BN(BassetStatus.Normal)).to.bignumber.equal( - bAssetAfterNegate.status, - ); - }), - ); - }); - - it("should succeed when status is 'BrokenAbovePeg' (by governor)", async () => { - await Promise.all( - integrationDetails.aTokens.map(async (a) => { - const bAssetBefore = await mockBasketManager.getBasset(a.bAsset); - expect(new BN(BassetStatus.Normal)).to.bignumber.equal(bAssetBefore.status); - - await mockBasketManager.setBassetStatus(a.bAsset, BassetStatus.BrokenAbovePeg); - const bAssetAfter = await mockBasketManager.getBasset(a.bAsset); - expect(new BN(BassetStatus.BrokenAbovePeg)).to.bignumber.equal( - bAssetAfter.status, - ); - - const tx = await mockBasketManager.negateIsolation(a.bAsset, { - from: sa.governor, - }); - expectEvent.inLogs(tx.logs, "BassetStatusChanged", { - bAsset: a.bAsset, - status: new BN(BassetStatus.Normal), - }); - const bAssetAfterNegate = await mockBasketManager.getBasset(a.bAsset); - expect(new BN(BassetStatus.Normal)).to.bignumber.equal( - bAssetAfterNegate.status, - ); - }), - ); - }); - - it("should succeed when status is 'Blacklisted' (by governor)", async () => { - await Promise.all( - integrationDetails.aTokens.map(async (a) => { - const bAssetBefore = await mockBasketManager.getBasset(a.bAsset); - expect(new BN(BassetStatus.Normal)).to.bignumber.equal(bAssetBefore.status); - - await mockBasketManager.setBassetStatus(a.bAsset, BassetStatus.Blacklisted); - const bAssetAfter = await mockBasketManager.getBasset(a.bAsset); - expect(new BN(BassetStatus.Blacklisted)).to.bignumber.equal(bAssetAfter.status); - - const tx = await mockBasketManager.negateIsolation(a.bAsset, { - from: sa.governor, - }); - expectEvent.inLogs(tx.logs, "BassetStatusChanged", { - bAsset: a.bAsset, - status: new BN(BassetStatus.Normal), - }); - const bAssetAfterNegate = await mockBasketManager.getBasset(a.bAsset); - expect(new BN(BassetStatus.Normal)).to.bignumber.equal( - bAssetAfterNegate.status, - ); - }), - ); - }); - }); - describe("failBasset()", async () => { - beforeEach(async () => { - await createNewBasketManager(); - }); - context("when the bAsset doesn't exist", async () => { - it("should always fail", async () => { - expectRevert( - basketManager.failBasset(sa.dummy1, { from: sa.governor }), - "bAsset must exist", - ); - }); - }); - context("when there are no affected bAssets", async () => { - it("should always fail", async () => { - const { bAssets } = integrationDetails; - await Promise.all( - bAssets.map(async (b) => { - const bAsset = await basketManager.getBasset(b.address); - expect(bAsset.status.toString()).eq(BassetStatus.Normal.toString()); - return expectRevert( - basketManager.failBasset(bAsset.addr, { from: sa.governor }), - "bAsset must be affected", - ); - }), - ); - }); - }); - - context("when called by invalid account", async () => { - it("should always fail", async () => { - const { bAssets } = integrationDetails; - const bAsset = await basketManager.getBasset(bAssets[0].address); - expect(bAsset.status.toString()).eq(BassetStatus.Normal.toString()); - return expectRevert( - basketManager.failBasset(bAsset.addr, { from: sa.default }), - "Only governor can execute", - ); - }); - }); - context("when a bAsset has completely failed", async () => { - it("should set the failed prop on the basket", async () => { - const { bAssets } = integrationDetails; - - // Get current failed status - let basket = await basketManager.getBasket(); - expect(basket.failed).eq(false); - - // Prepare the bAsset - const targetBasset = bAssets[0].address; - await basketManager.handlePegLoss(targetBasset, true, { from: sa.governor }); - const bAsset = await basketManager.getBasset(targetBasset); - expect(bAsset.status.toString()).eq(BassetStatus.BrokenBelowPeg.toString()); - - // Failed - await basketManager.failBasset(targetBasset, { from: sa.governor }); - - // Assert props set - basket = await basketManager.getBasket(); - expect(basket.failed).eq(true); - }); - }); - }); -}); diff --git a/test/masset/TestMasset.spec.ts b/test/masset/TestMasset.spec.ts deleted file mode 100644 index d59de58a..00000000 --- a/test/masset/TestMasset.spec.ts +++ /dev/null @@ -1,279 +0,0 @@ -import { expectEvent, time, expectRevert } from "@openzeppelin/test-helpers"; -import { keccak256 } from "web3-utils"; - -import { MassetMachine, StandardAccounts, SystemMachine, MassetDetails } from "@utils/machines"; -import { simpleToExactAmount, applyRatio } from "@utils/math"; -import { assertBNSlightlyGTPercent } from "@utils/assertions"; -import { ZERO_ADDRESS, TEN_MINS, MAX_UINT256 } from "@utils/constants"; -import { BN } from "@utils/tools"; - -import envSetup from "@utils/env_setup"; -import * as t from "types/generated"; -import shouldBehaveLikeModule from "../shared/behaviours/Module.behaviour"; - -const Nexus = artifacts.require("Nexus"); - -const { expect } = envSetup.configure(); - -contract("Masset", async (accounts) => { - const ctx: { module?: t.ModuleInstance } = {}; - const sa = new StandardAccounts(accounts); - let systemMachine: SystemMachine; - let massetMachine: MassetMachine; - let massetDetails: MassetDetails; - - const runSetup = async (initBasket = false): Promise => { - massetDetails = initBasket - ? await massetMachine.deployMassetAndSeedBasket() - : await massetMachine.deployMasset(); - ctx.module = massetDetails.mAsset; - }; - - before("Init contract", async () => { - systemMachine = new SystemMachine(sa.all); - await systemMachine.initialiseMocks(false, true); - massetMachine = systemMachine.massetMachine; - await runSetup(); - }); - - describe("initializing mAsset", async () => { - describe("verifying Module initialization", async () => { - beforeEach("reset contracts", async () => { - await runSetup(); - }); - - shouldBehaveLikeModule(ctx as Required, sa); - - it("should properly store valid arguments", async () => { - // Check for nexus addr - expect(await massetDetails.mAsset.nexus()).eq(systemMachine.nexus.address); - }); - }); - describe("verifying default storage", async () => { - before("reset contracts", async () => { - await runSetup(); - }); - it("should set valid arguments", async () => { - expect(await massetDetails.mAsset.forgeValidator()).eq( - massetDetails.forgeValidator.address, - ); - expect(await massetDetails.mAsset.getBasketManager()).eq( - massetDetails.basketManager.address, - ); - expect(await massetDetails.mAsset.swapFee()).bignumber.eq( - simpleToExactAmount(6, 14), - ); - expect(await massetDetails.mAsset.redemptionFee()).bignumber.eq( - simpleToExactAmount(3, 14), - ); - expect(await massetDetails.mAsset.surplus()).bignumber.eq(new BN(0)); - expect(await massetDetails.mAsset.cacheSize()).bignumber.eq( - simpleToExactAmount(1, 17), - ); - expect(await massetDetails.mAsset.decimals()).bignumber.eq(new BN(18)); - expect(await massetDetails.mAsset.balanceOf(sa.dummy1)).bignumber.eq(new BN(0)); - expect(await massetDetails.mAsset.name()).eq("mStable Mock"); - expect(await massetDetails.mAsset.symbol()).eq("mMOCK"); - }); - }); - }); - describe("using basic setters", async () => { - it("should allow changing of the cache size", async () => { - // update by the governor - const oldSize = await massetDetails.mAsset.cacheSize(); - const newSize = simpleToExactAmount(1, 16); // 1% - expect(oldSize).bignumber.not.eq(newSize); - await massetDetails.mAsset.setCacheSize(newSize, { from: sa.governor }); - expect(await massetDetails.mAsset.cacheSize()).bignumber.eq(newSize); - // rejected if not governor - await expectRevert( - massetDetails.mAsset.setCacheSize(newSize, { from: sa.default }), - "Only governance can execute", - ); - // cannot exceed cap - const feeExceedingCap = simpleToExactAmount(21, 16); // 21% - await expectRevert( - massetDetails.mAsset.setCacheSize(feeExceedingCap, { from: sa.governor }), - "Must be <= 20%", - ); - // cannot exceed min - const feeExceedingMin = MAX_UINT256; - await expectRevert( - massetDetails.mAsset.setCacheSize(feeExceedingMin, { from: sa.governor }), - "Must be <= 20%", - ); - }); - it("should allow upgrades of the ForgeValidator by governor with valid params", async () => { - // update by the governor - await massetDetails.mAsset.upgradeForgeValidator(sa.other, { from: sa.governor }); - expect(sa.governor).eq(await systemMachine.nexus.governor()); - expect(await massetDetails.mAsset.forgeValidator()).eq(sa.other); - // rejected if not governor - await expectRevert( - massetDetails.mAsset.upgradeForgeValidator(sa.dummy2, { from: sa.default }), - "Only governor can execute", - ); - // rejected if invalid params - await expectRevert( - massetDetails.mAsset.upgradeForgeValidator(ZERO_ADDRESS, { from: sa.governor }), - "Must be non null address", - ); - }); - it("should allow locking of the ForgeValidator", async () => { - // rejected if not governor - await expectRevert( - massetDetails.mAsset.lockForgeValidator({ from: sa.default }), - "Only governor can execute", - ); - // Lock - await massetDetails.mAsset.lockForgeValidator({ from: sa.governor }); - // no setting when locked - await expectRevert( - massetDetails.mAsset.upgradeForgeValidator(sa.dummy2, { from: sa.governor }), - "Must be allowed to upgrade", - ); - }); - it("should allow the fee rate to be changed", async () => { - // update by the governor - const oldFee = await massetDetails.mAsset.swapFee(); - const newfee = simpleToExactAmount(1, 16); // 1% - expect(oldFee).bignumber.not.eq(newfee); - await massetDetails.mAsset.setSwapFee(newfee, { from: sa.governor }); - expect(await massetDetails.mAsset.swapFee()).bignumber.eq(newfee); - // rejected if not governor - await expectRevert( - massetDetails.mAsset.setSwapFee(newfee, { from: sa.default }), - "Only governor can execute", - ); - // cannot exceed cap - const feeExceedingCap = simpleToExactAmount(11, 16); // 11% - await expectRevert( - massetDetails.mAsset.setSwapFee(feeExceedingCap, { from: sa.governor }), - "Rate must be within bounds", - ); - // cannot exceed min - const feeExceedingMin = MAX_UINT256; - await expectRevert( - massetDetails.mAsset.setSwapFee(feeExceedingMin, { from: sa.governor }), - "Rate must be within bounds", - ); - }); - it("should allow the redemption fee rate to be changed", async () => { - // update by the governor - const oldFee = await massetDetails.mAsset.redemptionFee(); - const newfee = simpleToExactAmount(1, 16); // 1% - expect(oldFee).bignumber.not.eq(newfee); - await massetDetails.mAsset.setRedemptionFee(newfee, { from: sa.governor }); - expect(await massetDetails.mAsset.redemptionFee()).bignumber.eq(newfee); - // rejected if not governor - await expectRevert( - massetDetails.mAsset.setRedemptionFee(newfee, { from: sa.default }), - "Only governor can execute", - ); - // cannot exceed cap - const feeExceedingCap = simpleToExactAmount(11, 16); // 11% - await expectRevert( - massetDetails.mAsset.setRedemptionFee(feeExceedingCap, { from: sa.governor }), - "Rate must be within bounds", - ); - // cannot exceed min - const feeExceedingMin = MAX_UINT256; - await expectRevert( - massetDetails.mAsset.setRedemptionFee(feeExceedingMin, { from: sa.governor }), - "Rate must be within bounds", - ); - }); - }); - - describe("collecting interest", async () => { - beforeEach("init basset with vaults", async () => { - await runSetup(true); - }); - it("should collect interest, update the vaults and send to the manager", async () => { - // 1.0. Simulate some activity on the lending markets - // Fast forward a bit - await time.increase(TEN_MINS); - - // 1.1. Simulate some activity on the lending markets - // Mint with all bAssets - const { bAssets } = massetDetails; - const approvals = await massetMachine.approveMassetMulti( - bAssets, - massetDetails.mAsset, - 1, - sa.default, - ); - await massetDetails.mAsset.mintMulti( - bAssets.map((b) => b.address), - approvals, - sa.default, - ); - - // 2.0 Get all balances and data before - const mUSDBalBefore = await massetDetails.mAsset.balanceOf(sa.dummy1); - const bassetsBefore = await massetMachine.getBassetsInMasset(massetDetails); - const sumOfVaultsBefore = bassetsBefore.reduce( - (p, c) => p.add(applyRatio(c.vaultBalance, c.ratio)), - new BN(0), - ); - const totalSupplyBefore = await massetDetails.mAsset.totalSupply(); - - // 3.0 Collect the interest - const nexus = await Nexus.at(await massetDetails.mAsset.nexus()); - const [savingsManagerInNexus] = await nexus.modules(keccak256("SavingsManager")); - expect(sa.dummy1).eq(savingsManagerInNexus); - - await massetDetails.mAsset.collectInterest({ from: sa.dummy1 }); - const tx = await massetDetails.mAsset.collectPlatformInterest({ from: sa.dummy1 }); - - // 4.0 Check outputs - const mUSDBalAfter = await massetDetails.mAsset.balanceOf(sa.dummy1); - const bassetsAfter = await massetMachine.getBassetsInMasset(massetDetails); - - bassetsAfter.map((b, i) => - expect(b.vaultBalance).bignumber.gt(new BN(bassetsBefore[i].vaultBalance) as any), - ); - - const sumOfVaultsAfter = bassetsAfter.reduce( - (p, c) => p.add(applyRatio(c.vaultBalance, c.ratio)), - new BN(0), - ); - const totalSupplyAfter = await massetDetails.mAsset.totalSupply(); - - // 4.1 totalSupply should only increase by <= 0.0005% - assertBNSlightlyGTPercent( - totalSupplyAfter, - totalSupplyBefore, - systemMachine.isGanacheFork ? "0.001" : "0.01", - true, - ); - // 4.2 check that increase in vault balance is equivalent to total balance - const increasedTotalSupply = totalSupplyAfter.sub(totalSupplyBefore); - expect(sumOfVaultsAfter.sub(sumOfVaultsBefore)).bignumber.eq(increasedTotalSupply); - // 4.3 Ensure that the SavingsManager received the mAsset - expect(mUSDBalAfter).bignumber.eq(mUSDBalBefore.add(increasedTotalSupply)); - // 4.4 Event emits correct unit - expectEvent(tx.receipt, "MintedMulti", { mAssetQuantity: increasedTotalSupply }); - }); - it("should only allow the SavingsManager to collect interest when BasketManager unpaused", async () => { - const nexus = await Nexus.at(await massetDetails.mAsset.nexus()); - const [savingsManagerInNexus] = await nexus.modules(keccak256("SavingsManager")); - expect(sa.dummy1).eq(savingsManagerInNexus); - - await expectRevert( - massetDetails.mAsset.collectInterest({ from: sa.governor }), - "Must be savings manager", - ); - await expectRevert( - massetDetails.mAsset.collectPlatformInterest({ from: sa.default }), - "Must be savings manager", - ); - - await massetDetails.basketManager.pause({ from: sa.governor }); - await expectRevert( - massetDetails.mAsset.collectPlatformInterest({ from: sa.dummy1 }), - "Pausable: paused", - ); - }); - }); -}); diff --git a/test/masset/TestMassetCache.spec.ts b/test/masset/TestMassetCache.spec.ts deleted file mode 100644 index 27592676..00000000 --- a/test/masset/TestMassetCache.spec.ts +++ /dev/null @@ -1,767 +0,0 @@ -import { expectEvent } from "@openzeppelin/test-helpers"; - -import { assertBasketIsHealthy } from "@utils/assertions"; -import { simpleToExactAmount, applyRatio } from "@utils/math"; -import { MassetDetails, MassetMachine, StandardAccounts, SystemMachine } from "@utils/machines"; -import { BN } from "@utils/tools"; -import { Basset } from "@utils/mstable-objects"; -import { fullScale, ratioScale } from "@utils/constants"; -import envSetup from "@utils/env_setup"; -import * as t from "types/generated"; - -const { expect } = envSetup.configure(); - -const AaveIntegration = artifacts.require("AaveIntegration"); - -contract("Masset - Cache", async (accounts) => { - const sa = new StandardAccounts(accounts); - let systemMachine: SystemMachine; - let massetMachine: MassetMachine; - let massetDetails: MassetDetails; - - const runSetup = async (seedBasket = true, enableUSDTFee = false): Promise => { - await systemMachine.initialiseMocks(seedBasket, false, enableUSDTFee); - massetDetails = systemMachine.mUSD; - }; - - before("Init contract", async () => { - systemMachine = new SystemMachine(sa.all); - massetMachine = new MassetMachine(systemMachine); - - await runSetup(); - }); - - const seedWithWeightings = async ( - md: MassetDetails, - weights: Array, - ): Promise => { - const { mAsset, bAssets } = md; - const approvals = await Promise.all( - bAssets.map((b, i) => massetMachine.approveMasset(b, mAsset, weights[i], sa.default)), - ); - await mAsset.mintMulti( - bAssets.map((b) => b.address), - approvals, - sa.default, - { from: sa.default }, - ); - }; - - // Helper to assert basic minting conditions, i.e. balance before and after - const assertBasicMint = async ( - md: MassetDetails, - mAssetMintAmount: BN | number, - bAsset: t.MockERC20Instance, - ignoreHealthAssertions = false, - ): Promise => { - const { mAsset, basketManager } = md; - if (!ignoreHealthAssertions) await assertBasketIsHealthy(massetMachine, md); - - const minterBassetBalBefore = await bAsset.balanceOf(sa.default); - const recipientBalBefore = await mAsset.balanceOf(sa.default); - const bAssetBefore = await massetMachine.getBasset(basketManager, bAsset.address); - const integratorBalBefore = await bAssetBefore.contract.balanceOf( - bAssetBefore.integrator.address, - ); - - const approval0: BN = await massetMachine.approveMasset( - bAsset, - mAsset, - new BN(mAssetMintAmount), - ); - // Expect to be used in cache - const platformInteraction = await massetMachine.getPlatformInteraction( - mAsset, - "deposit", - approval0, - integratorBalBefore, - bAssetBefore, - ); - const tx = await mAsset.mint(bAsset.address, approval0); - - const mAssetQuantity = simpleToExactAmount(mAssetMintAmount, 18); - const bAssetQuantity = simpleToExactAmount(mAssetMintAmount, await bAsset.decimals()); - await expectEvent(tx.receipt, "Minted", { - minter: sa.default, - recipient: sa.default, - mAssetQuantity, - bAsset: bAsset.address, - bAssetQuantity, - }); - // Transfers to lending platform - await expectEvent(tx.receipt, "Transfer", { - from: sa.default, - to: bAssetBefore.integrator.address, - value: bAssetQuantity, - }); - // Deposits into lending platform - const emitter = await AaveIntegration.new(); - const integratorBalAfter = await bAssetBefore.contract.balanceOf( - bAssetBefore.integrator.address, - ); - expect(integratorBalAfter).bignumber.eq(platformInteraction.rawBalance); - if (platformInteraction.expectInteraction) { - expectEvent.inTransaction(tx.tx, emitter, "Deposit", { - _bAsset: bAsset.address, - _amount: platformInteraction.amount, - }); - } - // Recipient should have mAsset quantity after - const recipientBalAfter = await mAsset.balanceOf(sa.default); - expect(recipientBalAfter).bignumber.eq(recipientBalBefore.add(mAssetQuantity)); - // Sender should have less bAsset after - const minterBassetBalAfter = await bAsset.balanceOf(sa.default); - expect(minterBassetBalAfter).bignumber.eq(minterBassetBalBefore.sub(bAssetQuantity)); - // VaultBalance should update for this bAsset - const bAssetAfter = await basketManager.getBasset(bAsset.address); - expect(new BN(bAssetAfter.vaultBalance)).bignumber.eq( - new BN(bAssetBefore.vaultBalance).add(bAssetQuantity), - ); - - // Complete basket should remain in healthy state - if (!ignoreHealthAssertions) await assertBasketIsHealthy(massetMachine, md); - }; - - // Helper to assert basic redemption conditions, e.g. balance before and after - const assertBasicRedemption = async ( - md: MassetDetails, - bAssetRedeemAmount: BN | number, - bAsset: t.MockERC20Instance, - expectFee = true, - ignoreHealthAssertions = false, - ): Promise => { - const { mAsset, basketManager } = md; - if (!ignoreHealthAssertions) await assertBasketIsHealthy(massetMachine, md); - - // Get balances before - const senderMassetBalBefore = await mAsset.balanceOf(sa.default); - const mUSDSupplyBefore = await mAsset.totalSupply(); - const recipientBassetBalBefore = await bAsset.balanceOf(sa.default); - const bAssetBefore = await massetMachine.getBasset(basketManager, bAsset.address); - const bAssetDecimals = await bAsset.decimals(); - const bAssetExact = simpleToExactAmount(bAssetRedeemAmount, bAssetDecimals); - const surplusBefore = await mAsset.surplus(); - const hasTxFee = bAssetBefore.isTransferFeeCharged; - - const integratorBalBefore = await bAssetBefore.contract.balanceOf( - bAssetBefore.integrator.address, - ); - - let fee = new BN(0); - let scaledFee = new BN(0); - let feeRate = new BN(0); - // If there is a fee expected, then deduct it from output - if (expectFee) { - feeRate = await mAsset.swapFee(); - expect(feeRate).bignumber.gt(new BN(0) as any); - expect(feeRate).bignumber.lt(fullScale.div(new BN(50)) as any); - fee = bAssetExact.mul(feeRate).div(fullScale); - expect(fee).bignumber.gt(new BN(0) as any); - scaledFee = fee.mul(new BN(bAssetBefore.ratio)).div(simpleToExactAmount(1, 8)); - } - const platformInteraction = await massetMachine.getPlatformInteraction( - mAsset, - "withdrawal", - bAssetExact.sub(fee), - integratorBalBefore, - bAssetBefore, - ); - - // Execute the redemption - const tx = await mAsset.redeem(bAsset.address, bAssetExact); - - // Calc mAsset burn amounts based on bAsset quantities - const mAssetQuantity = applyRatio(bAssetExact, bAssetBefore.ratio); - - // Listen for the events - await expectEvent(tx.receipt, "Redeemed", { - redeemer: sa.default, - recipient: sa.default, - mAssetQuantity, - bAssets: [bAsset.address], - }); - if (expectFee) { - expectEvent(tx.receipt, "PaidFee", { - payer: sa.default, - asset: bAsset.address, - feeQuantity: fee, - }); - } - // - Withdraws from lending platform - const emitter = await AaveIntegration.new(); - if (platformInteraction.expectInteraction) { - await expectEvent.inTransaction(tx.tx, emitter, "PlatformWithdrawal", { - bAsset: bAsset.address, - totalAmount: platformInteraction.amount, - userAmount: bAssetExact.sub(fee), - }); - } else { - await expectEvent.inTransaction(tx.tx, emitter, "Withdrawal", { - _bAsset: bAsset.address, - _amount: bAssetExact.sub(fee), - }); - } - // VaultBalance should line up - const integratorBalAfter = await bAssetBefore.contract.balanceOf( - bAssetBefore.integrator.address, - ); - expect(integratorBalAfter).bignumber.eq(platformInteraction.rawBalance); - // Sender should have less mAsset - const senderMassetBalAfter = await mAsset.balanceOf(sa.default); - expect(senderMassetBalAfter).bignumber.eq(senderMassetBalBefore.sub(mAssetQuantity)); - // Total mUSD supply should be less - const mUSDSupplyAfter = await mAsset.totalSupply(); - expect(mUSDSupplyAfter).bignumber.eq(mUSDSupplyBefore.sub(mAssetQuantity)); - // Recipient should have more bAsset, minus fee - if (!hasTxFee) { - const recipientBassetBalAfter = await bAsset.balanceOf(sa.default); - expect(recipientBassetBalAfter).bignumber.eq( - recipientBassetBalBefore.add(bAssetExact).sub(fee), - ); - } - // VaultBalance should update for this bAsset, including fee - const bAssetAfter = await basketManager.getBasset(bAsset.address); - // 100, 0.6 - // 1000-(100-0.6) = 1000-(99.4) = 900.6 - expect(new BN(bAssetAfter.vaultBalance)).bignumber.eq( - new BN(bAssetBefore.vaultBalance).sub(bAssetExact.sub(fee)), - ); - const surplusAfter = await mAsset.surplus(); - expect(new BN(surplusAfter)).bignumber.eq(new BN(surplusBefore).add(scaledFee)); - - // Complete basket should remain in healthy state - if (!ignoreHealthAssertions) await assertBasketIsHealthy(massetMachine, md); - }; - - const assertSwap = async ( - md: MassetDetails, - inputBasset: t.MockERC20Instance, - outputAsset: t.MockERC20Instance, - swapQuantity: BN | number, - expectSwapFee: boolean, - recipient: string = sa.default, - sender: string = sa.default, - ignoreHealthAssertions = false, - swapQuantityIsBaseUnits = false, - ): Promise => { - const { mAsset, basketManager } = md; - - // 1. Assert all state is currently valid and prepare objects - // Assert that the basket is in a healthy state - if (!ignoreHealthAssertions) await assertBasketIsHealthy(massetMachine, md); - // Is this swap actually a single bAsset mint? - const isMint = mAsset.address === outputAsset.address; - - // Get basic before data about the actors balances - const swapperInputBalBefore = await inputBasset.balanceOf(sender); - const recipientOutputBalBefore = await outputAsset.balanceOf(recipient); - - // Get basic before data on the swap assets - const inputBassetBefore = await massetMachine.getBasset(basketManager, inputBasset.address); - const inputIntegratorBalBefore = await inputBassetBefore.contract.balanceOf( - inputBassetBefore.integrator.address, - ); - const outputBassetBefore = isMint - ? null - : await massetMachine.getBasset(basketManager, outputAsset.address); - const outputIntegratorBalBefore = isMint - ? new BN(0) - : await outputBassetBefore.contract.balanceOf(outputBassetBefore.integrator.address); - const surplusBefore = await mAsset.surplus(); - - // 2. Do the necessary approvals and make the calls - const approval0: BN = await massetMachine.approveMasset( - inputBasset, - mAsset, - new BN(swapQuantity), - sender, - swapQuantityIsBaseUnits, - ); - - // Call the swap output function to check if results match - const swapOutputResponse = await mAsset.getSwapOutput( - inputBasset.address, - outputAsset.address, - approval0, - { from: sender }, - ); - - // 3. Calculate expected responses - const inputQuantityExact = swapQuantityIsBaseUnits - ? new BN(swapQuantity) - : simpleToExactAmount(swapQuantity, await inputBasset.decimals()); - const scaledInputQuantity = swapQuantityIsBaseUnits - ? new BN(swapQuantity).mul(new BN(inputBassetBefore.ratio)).div(ratioScale) - : simpleToExactAmount(swapQuantity, 18); - const expectedOutputValue = isMint - ? scaledInputQuantity - : scaledInputQuantity.mul(ratioScale).div(new BN(outputBassetBefore.ratio)); - let fee = new BN(0); - let scaledFee = new BN(0); - let feeRate = new BN(0); - // If there is a fee expected, then deduct it from output - if (expectSwapFee && !isMint) { - feeRate = await mAsset.swapFee(); - expect(feeRate).bignumber.gt(new BN(0) as any); - expect(feeRate).bignumber.lt(fullScale.div(new BN(50)) as any); - fee = expectedOutputValue.mul(feeRate).div(fullScale); - expect(fee).bignumber.gt(new BN(0) as any); - scaledFee = fee.mul(new BN(outputBassetBefore.ratio)).div(ratioScale); - } - - // Expect to be used in cache - const platformInteractionIn = await massetMachine.getPlatformInteraction( - mAsset, - "deposit", - approval0, - inputIntegratorBalBefore, - inputBassetBefore, - ); - const platformInteractionOut = isMint - ? null - : await massetMachine.getPlatformInteraction( - mAsset, - "withdrawal", - expectedOutputValue.sub(fee), - outputIntegratorBalBefore, - outputBassetBefore, - ); - - const swapTx = await mAsset.swap( - inputBasset.address, - outputAsset.address, - approval0, - recipient, - { from: sender }, - ); - - // 4. Validate any basic events that should occur - if (isMint) { - await expectEvent(swapTx.receipt, "Minted", { - minter: sender, - recipient, - mAssetQuantity: expectedOutputValue, - bAsset: inputBasset.address, - bAssetQuantity: inputQuantityExact, - }); - } else { - await expectEvent(swapTx.receipt, "Swapped", { - swapper: sender, - input: inputBasset.address, - output: outputAsset.address, - outputAmount: expectedOutputValue.sub(fee), - recipient, - }); - if (expectSwapFee) { - await expectEvent(swapTx.receipt, "PaidFee", { - payer: sender, - asset: outputAsset.address, - feeQuantity: fee, - }); - } - - await expectEvent(swapTx.receipt, "Transfer", { - from: sender, - to: await basketManager.getBassetIntegrator(inputBasset.address), - value: inputQuantityExact, - }); - } - - const inputIntegratorBalAfter = await inputBassetBefore.contract.balanceOf( - inputBassetBefore.integrator.address, - ); - expect(inputIntegratorBalAfter).bignumber.eq(platformInteractionIn.rawBalance); - const outputIntegratorBalAfter = isMint - ? new BN(0) - : await outputBassetBefore.contract.balanceOf(outputBassetBefore.integrator.address); - if (!isMint) { - expect(outputIntegratorBalAfter).bignumber.eq(platformInteractionOut.rawBalance); - } - - // 5. Validate output state - // Swap estimation should match up - const [swapValid, swapReason, swapOutput] = swapOutputResponse; - expect(swapValid).eq(true); - expect(swapReason).eq(""); - expect(swapOutput).bignumber.eq(expectedOutputValue.sub(fee)); - - // Input - // Deposits into lending platform - const emitter = await AaveIntegration.new(); - if (platformInteractionIn.expectInteraction) { - await expectEvent.inTransaction(swapTx.tx, emitter, "Deposit", { - _bAsset: inputBasset.address, - _amount: platformInteractionIn.amount, - }); - } - // Sender should have less input bAsset after - const swapperBassetBalAfter = await inputBasset.balanceOf(sender); - expect(swapperBassetBalAfter).bignumber.eq(swapperInputBalBefore.sub(inputQuantityExact)); - // VaultBalance should update for input bAsset - const inputBassetAfter = await basketManager.getBasset(inputBasset.address); - expect(new BN(inputBassetAfter.vaultBalance)).bignumber.eq( - new BN(inputBassetBefore.vaultBalance).add(inputQuantityExact), - ); - - // Output - // Recipient should have output asset quantity after (minus fee) - const recipientBalAfter = await outputAsset.balanceOf(recipient); - expect(recipientBalAfter).bignumber.eq( - recipientOutputBalBefore.add(expectedOutputValue.sub(fee)), - ); - // VaultBalance should update for output bAsset - if (!isMint) { - const outputBassetAfter = await basketManager.getBasset(outputAsset.address); - // Should deduct the FULL amount, including fee, from the vault balance - expect(new BN(outputBassetAfter.vaultBalance)).bignumber.eq( - new BN(outputBassetBefore.vaultBalance).sub(expectedOutputValue.sub(fee)), - ); - - if (platformInteractionOut.expectInteraction) { - await expectEvent.inTransaction(swapTx.tx, emitter, "PlatformWithdrawal", { - bAsset: outputAsset.address, - totalAmount: platformInteractionOut.amount, - userAmount: expectedOutputValue.sub(fee), - }); - } else { - await expectEvent.inTransaction(swapTx.tx, emitter, "Withdrawal", { - _bAsset: outputAsset.address, - _amount: expectedOutputValue.sub(fee), - }); - } - const surplusAfter = await mAsset.surplus(); - expect(new BN(surplusAfter)).bignumber.eq(new BN(surplusBefore).add(scaledFee)); - } - - // Complete basket should remain in healthy state - if (!ignoreHealthAssertions) await assertBasketIsHealthy(massetMachine, md); - }; - - context("validating simple transactions with different cache sizes", () => { - beforeEach("reset", async () => { - await runSetup(); - }); - const runTxs = async () => { - const { bAssets } = massetDetails; - - // Series of mints and redemptions - await assertBasicRedemption(massetDetails, new BN(10), bAssets[1], true); - await assertBasicMint(massetDetails, new BN(10), bAssets[0]); - await assertBasicMint(massetDetails, new BN(20), bAssets[0]); - await assertBasicMint(massetDetails, new BN(12), bAssets[1]); - await assertBasicMint(massetDetails, new BN(3), bAssets[2]); - await assertBasicRedemption(massetDetails, new BN(1), bAssets[1], true); - await assertSwap(massetDetails, bAssets[0], bAssets[1], new BN(10), true, sa.dummy4); - await assertSwap(massetDetails, bAssets[0], bAssets[1], new BN(6), true); - await assertSwap(massetDetails, bAssets[1], bAssets[2], new BN(20), true); - await assertBasicMint(massetDetails, new BN(3), bAssets[2]); - await assertBasicMint(massetDetails, new BN(6), bAssets[0]); - await assertBasicMint(massetDetails, new BN(12), bAssets[0]); - await assertBasicRedemption(massetDetails, new BN(1), bAssets[0], true); - await assertBasicRedemption(massetDetails, new BN(14), bAssets[0], true); - await assertSwap(massetDetails, bAssets[2], bAssets[3], new BN(14), true); - - // Test savings deposit - await massetDetails.mAsset.approve(systemMachine.savingsContract.address, new BN(1), { - from: sa.default, - }); - await systemMachine.savingsContract.depositSavings(new BN(1), { - from: sa.default, - }); - await assertSwap(massetDetails, bAssets[1], bAssets[2], new BN(1), true); - await massetDetails.mAsset.approve(systemMachine.savingsContract.address, new BN(1)); - await systemMachine.savingsContract.depositSavings(new BN(1)); - }; - it("should exec with 0%", async () => { - await massetDetails.mAsset.setCacheSize(0, { - from: sa.governor, - }); - await runTxs(); - }); - it("should exec with 10%", async () => { - await massetDetails.mAsset.setCacheSize(simpleToExactAmount(1, 17), { - from: sa.governor, - }); - await runTxs(); - }); - it("should exec with 20%", async () => { - await massetDetails.mAsset.setCacheSize(simpleToExactAmount(2, 17), { - from: sa.governor, - }); - await runTxs(); - }); - it("should allow for changing cache sizes", async () => { - await massetDetails.mAsset.setCacheSize(simpleToExactAmount(2, 17), { - from: sa.governor, - }); - await runTxs(); - await massetDetails.mAsset.setCacheSize(simpleToExactAmount(2, 16), { - from: sa.governor, - }); - await runTxs(); - await massetDetails.mAsset.setCacheSize(simpleToExactAmount(1, 17), { - from: sa.governor, - }); - await runTxs(); - }); - context("lowering the cache size with assets in the cache", async () => {}); - }); - context("testing the fine tuning of cache limits", () => { - // start with a total supply of 100 and no cache - let bAssetsBefore: Basset[]; - beforeEach("reset", async () => { - await runSetup(false); - await seedWithWeightings(massetDetails, [ - new BN(25), - new BN(25), - new BN(25), - new BN(25), - ]); - const { basketManager, bAssets } = massetDetails; - // Refactor the weightings to push some overweight - await basketManager.setBasketWeights( - bAssets.map((b) => b.address), - bAssets.map(() => simpleToExactAmount(60, 16)), - { - from: sa.governor, - }, - ); - bAssetsBefore = await Promise.all( - bAssets.map((b) => massetMachine.getBasset(basketManager, b.address)), - ); - const integratorBalsBefore = await Promise.all( - bAssetsBefore.map((b) => b.contract.balanceOf(b.integrator.address)), - ); - integratorBalsBefore.map((b) => expect(b).bignumber.eq(new BN(0))); - }); - it("should deposit if it goes over", async () => { - const bAsset = bAssetsBefore[0]; - const bAssetDecimals = await bAsset.contract.decimals(); - const senderBalStart = await bAsset.contract.balanceOf(sa.default); - // first tx should move it to 5 units in cache - await assertBasicMint(massetDetails, 5, bAsset.contract, false); - // Total Supply = 105, cache = 5, vaultBalance = 30 - // second tx pushes above - await assertBasicMint(massetDetails, 6, bAsset.contract, false); - // Total Supply = 111, cache = 5.25, vaultBalance = 36 - const cacheBalAfter = await bAsset.contract.balanceOf(bAsset.integrator.address); - expect(cacheBalAfter).bignumber.eq(simpleToExactAmount("5.25", bAssetDecimals)); - // Sender should have 7 less - const senderBalAfter = await bAsset.contract.balanceOf(sa.default); - expect(senderBalAfter).bignumber.eq( - senderBalStart.sub(simpleToExactAmount(11, bAssetDecimals)), - ); - }); - it("should withdrawRaw if there is cache balance", async () => { - const bAsset = bAssetsBefore[0]; - const bAssetDecimals = await bAsset.contract.decimals(); - // first tx should move it to 5 units in cache - await assertBasicRedemption(massetDetails, 1, bAsset.contract, true); - // Total Supply = 99, cache = 5, vaultBalance = 24 - // second tx withdraws raw - await assertBasicRedemption(massetDetails, 4, bAsset.contract, true); - // Total Supply = 93, cache = 1, vaultBalance = 18 - - const cacheBalAfter = await bAsset.contract.balanceOf(bAsset.integrator.address); - expect(cacheBalAfter).bignumber.eq(simpleToExactAmount("1.0024", bAssetDecimals)); - }); - it("should withdraw to mean", async () => { - const { mAsset } = massetDetails; - const bAsset = bAssetsBefore[0]; - const bAssetDecimals = await bAsset.contract.decimals(); - const senderBalStart = await mAsset.balanceOf(sa.default); - // first tx should move it to 5 units in cache - await assertBasicRedemption(massetDetails, 1, bAsset.contract, true); - // Total Supply = 99, cache = 5, vaultBalance = 24 - // second tx resets the cache and withdraws - await assertBasicRedemption(massetDetails, 10, bAsset.contract, true); - // Total Supply = 89, cache = 5, vaultBalance = 25 - const cacheBalAfter = await bAsset.contract.balanceOf(bAsset.integrator.address); - expect(cacheBalAfter).bignumber.eq(simpleToExactAmount("4.95003", bAssetDecimals)); - // Sender should have 11 less mAsset - const senderBalAfter = await mAsset.balanceOf(sa.default); - expect(senderBalAfter).bignumber.eq(senderBalStart.sub(simpleToExactAmount(11, 18))); - }); - }); - context("with an asset with a txfee", () => { - let bAssetsBefore: Basset[]; - beforeEach("reset", async () => { - await runSetup(false, true); - await seedWithWeightings(massetDetails, [ - new BN(25), - new BN(25), - new BN(25), - new BN(25), - ]); - const { basketManager, bAssets } = massetDetails; - // Refactor the weightings to push some overweight - await basketManager.setBasketWeights( - bAssets.map((b) => b.address), - bAssets.map(() => simpleToExactAmount(60, 16)), - { - from: sa.governor, - }, - ); - bAssetsBefore = await Promise.all( - bAssets.map((b) => massetMachine.getBasset(basketManager, b.address)), - ); - const integratorBalsBefore = await Promise.all( - bAssetsBefore.map((b) => b.contract.balanceOf(b.integrator.address)), - ); - integratorBalsBefore.map((b) => expect(b).bignumber.eq(new BN(0))); - }); - it("should not store anything in the cache if there is a tx fee", async () => { - const { mAsset } = massetDetails; - const bAsset = bAssetsBefore[1]; - const senderBalStart = await mAsset.balanceOf(sa.default); - // first tx should move it to 5 units in cache - await assertBasicRedemption(massetDetails, 1, bAsset.contract, true); - // Total Supply = 99, cache = 0, vaultBalance = 24 - // second tx resets the cache and withdraws - await assertBasicRedemption(massetDetails, 10, bAsset.contract, true); - // Total Supply = 89, cache = 0, vaultBalance = 25 - const cacheBalAfter = await bAsset.contract.balanceOf(bAsset.integrator.address); - expect(cacheBalAfter).bignumber.eq(new BN(0)); - // Sender should have 11 less mAsset - const senderBalAfter = await mAsset.balanceOf(sa.default); - expect(senderBalAfter).bignumber.eq(senderBalStart.sub(simpleToExactAmount(11, 18))); - }); - }); - context("ensuring redeemMasset analyses max cache and surplus correctly", () => { - // start with a total supply of 100 and no cache - let bAssetsBefore: Basset[]; - beforeEach("reset", async () => { - await runSetup(false); - await seedWithWeightings(massetDetails, [ - new BN(25), - new BN(25), - new BN(25), - new BN(25), - ]); - const { basketManager, bAssets } = massetDetails; - // Refactor the weightings to push some overweight - await basketManager.setBasketWeights( - bAssets.map((b) => b.address), - bAssets.map(() => simpleToExactAmount(60, 16)), - { - from: sa.governor, - }, - ); - bAssetsBefore = await Promise.all( - bAssets.map((b) => massetMachine.getBasset(basketManager, b.address)), - ); - const integratorBalsBefore = await Promise.all( - bAssetsBefore.map((b) => b.contract.balanceOf(b.integrator.address)), - ); - integratorBalsBefore.map((b) => expect(b).bignumber.eq(new BN(0))); - }); - it("should reset all assets to cache mid point", async () => { - const { mAsset } = massetDetails; - const bAssetDecimals = await Promise.all( - bAssetsBefore.map((b) => b.contract.decimals()), - ); - const senderBalStart = await mAsset.balanceOf(sa.default); - // first tx should move it to 5 units in cache - await mAsset.redeemMasset(simpleToExactAmount(1, 18), sa.default); - // Total Supply = 99, cache = 5, vaultBalance = 99.0003 - // second tx resets the cache and withdraws - await mAsset.redeemMasset(simpleToExactAmount(22, 18), sa.default); - // Total Supply = 77, cache = 4.950015, vaultBalance = 79.0069 - const integratorBalsAfter = await Promise.all( - bAssetsBefore.map((b) => b.contract.balanceOf(b.integrator.address)), - ); - integratorBalsAfter.map((b, i) => - expect(b).bignumber.eq(simpleToExactAmount("4.950015", bAssetDecimals[i])), - ); - // Sender should have 2 less mAsset - const senderBalAfter = await mAsset.balanceOf(sa.default); - expect(senderBalAfter).bignumber.eq(senderBalStart.sub(simpleToExactAmount(23, 18))); - }); - it("should accumulate a surplus over multiple tx's", async () => { - const { mAsset } = massetDetails; - const surplusStart = await mAsset.surplus(); - const totalSupplyStart = await mAsset.totalSupply(); - // first tx should move it to 5 units in cache - await mAsset.redeemMasset(simpleToExactAmount(1, 18), sa.default); - // Total Supply = 99, cache = 5, vaultBalance = 99.0003 - // second tx resets the cache and withdraws - await mAsset.redeemMasset(simpleToExactAmount(1, 18), sa.default); - // Total Supply = 98, cache = 4.950015, vaultBalance = 98.0006 - const surplusEnd = await mAsset.surplus(); - expect(surplusEnd).bignumber.eq(surplusStart.add(simpleToExactAmount("0.0006", 18))); - const totalSupplyEnd = await mAsset.totalSupply(); - expect(totalSupplyEnd).bignumber.eq(totalSupplyStart.sub(simpleToExactAmount(2, 18))); - }); - }); - context("testing fee collection and distribution", () => { - before("generate some surplus and lending market interest", async () => { - await runSetup(true); - await massetDetails.mAsset.redeemMasset(simpleToExactAmount(20, 18), sa.default); - const surplus = await massetDetails.mAsset.surplus(); - expect(surplus).bignumber.eq(simpleToExactAmount("0.006", 18)); - }); - it("allows SM to collect surplus", async () => { - const { mAsset } = massetDetails; - const compositionBefore = await massetMachine.getBasketComposition(massetDetails); - const balBefore = await mAsset.balanceOf(systemMachine.savingsContract.address); - await massetDetails.mAsset.approve(systemMachine.savingsContract.address, new BN(1), { - from: sa.default, - }); - await systemMachine.savingsContract.depositSavings(new BN(1), { - from: sa.default, - }); - const compositionAfter = await massetMachine.getBasketComposition(massetDetails); - expect(compositionAfter.sumOfBassets).bignumber.eq(compositionBefore.sumOfBassets); - expect(compositionAfter.surplus).bignumber.eq(new BN(1)); - expect(compositionAfter.totalSupply).bignumber.eq( - compositionBefore.totalSupply.add(compositionBefore.surplus).subn(1), - ); - const balAfter = await mAsset.balanceOf(systemMachine.savingsContract.address); - expect(balAfter).bignumber.eq(balBefore.add(compositionBefore.surplus)); - - await massetDetails.mAsset.approve(systemMachine.savingsContract.address, new BN(1), { - from: sa.default, - }); - await systemMachine.savingsContract.depositSavings(new BN(1), { - from: sa.default, - }); - - const compositionEnd = await massetMachine.getBasketComposition(massetDetails); - expect(compositionEnd.sumOfBassets).bignumber.eq(compositionAfter.sumOfBassets); - expect(compositionEnd.surplus).bignumber.eq(new BN(1)); - expect(compositionEnd.totalSupply).bignumber.eq(compositionAfter.totalSupply); - const balEnd = await mAsset.balanceOf(systemMachine.savingsContract.address); - expect(balEnd).bignumber.eq(balAfter.add(new BN(1))); - }); - it("allows SM to collect platform interest", async () => { - const { mAsset } = massetDetails; - const compositionBefore = await massetMachine.getBasketComposition(massetDetails); - const balBefore = await mAsset.balanceOf(systemMachine.savingsManager.address); - const sumBefore = compositionBefore.bAssets.reduce( - (p, c, i) => p.add(applyRatio(c.actualBalance, c.ratio)), - new BN(0), - ); - - await systemMachine.savingsManager.collectAndStreamInterest(mAsset.address); - - const compositionAfter = await massetMachine.getBasketComposition(massetDetails); - const balAfter = await mAsset.balanceOf(systemMachine.savingsManager.address); - const sumAfter = compositionAfter.bAssets.reduce( - (p, c, i) => p.add(applyRatio(c.actualBalance, c.ratio)), - new BN(0), - ); - const vaultBalanceDiff = compositionAfter.sumOfBassets.sub( - compositionBefore.sumOfBassets, - ); - - expect(compositionAfter.sumOfBassets).bignumber.gt(compositionBefore.sumOfBassets); - expect(compositionAfter.surplus).bignumber.eq(compositionBefore.surplus); - expect(compositionAfter.totalSupply).bignumber.eq( - compositionBefore.totalSupply.add(vaultBalanceDiff), - ); - expect(sumAfter).bignumber.eq(sumBefore); - expect(sumBefore).bignumber.eq(compositionAfter.sumOfBassets); - expect(balAfter).bignumber.eq(balBefore.add(vaultBalanceDiff)); - }); - }); -}); diff --git a/test/masset/TestMassetMinting.spec.ts b/test/masset/TestMassetMinting.spec.ts deleted file mode 100644 index 26f1eca6..00000000 --- a/test/masset/TestMassetMinting.spec.ts +++ /dev/null @@ -1,1564 +0,0 @@ -/* eslint-disable @typescript-eslint/camelcase */ -/* eslint-disable no-await-in-loop */ - -import { expectEvent, expectRevert } from "@openzeppelin/test-helpers"; - -import { assertBasketIsHealthy, assertBNSlightlyGTPercent } from "@utils/assertions"; -import { simpleToExactAmount } from "@utils/math"; -import { MassetDetails, MassetMachine, StandardAccounts, SystemMachine } from "@utils/machines"; -import { BN } from "@utils/tools"; -import { BassetStatus } from "@utils/mstable-objects"; -import { ZERO_ADDRESS, fullScale, ratioScale } from "@utils/constants"; -import envSetup from "@utils/env_setup"; -import * as t from "types/generated"; -import { BasketComposition } from "../../types"; - -const { expect } = envSetup.configure(); - -const MockBasketManager1 = artifacts.require("MockBasketManager1"); -const MockBasketManager2 = artifacts.require("MockBasketManager2"); -const MockERC20 = artifacts.require("MockERC20"); -const MockAToken = artifacts.require("MockAToken"); -const MockAave = artifacts.require("MockAaveV2"); -const AaveIntegration = artifacts.require("AaveIntegration"); -const Masset = artifacts.require("Masset"); - -interface MintOutput { - minterBassetBalBefore: BN; - minterBassetBalAfter: BN; - recipientBalBefore: BN; - recipientBalAfter: BN; -} - -contract("Masset - Mint", async (accounts) => { - const sa = new StandardAccounts(accounts); - let systemMachine: SystemMachine; - let massetMachine: MassetMachine; - let massetDetails: MassetDetails; - - const runSetup = async (seedBasket = true, enableUSDTFee = false): Promise => { - massetDetails = seedBasket - ? await massetMachine.deployMassetAndSeedBasket(enableUSDTFee) - : await massetMachine.deployMasset(enableUSDTFee); - await assertBasketIsHealthy(massetMachine, massetDetails); - }; - - before("Init contract", async () => { - systemMachine = new SystemMachine(sa.all); - massetMachine = new MassetMachine(systemMachine); - - await runSetup(); - }); - - const assertFailedMint = async ( - mAsset: t.MassetInstance, - bAsset: t.MockERC20Instance, - amount: BN, - reason: string, - ): Promise => { - const approval: BN = await massetMachine.approveMasset(bAsset, mAsset, amount); - await expectRevert(mAsset.mint(bAsset.address, approval), reason); - }; - - // Helper to assert basic minting conditions, i.e. balance before and after - const assertBasicMint = async ( - md: MassetDetails, - mAssetMintAmount: BN | number, - bAsset: t.MockERC20Instance, - useMintTo = false, - recipient: string = sa.default, - sender: string = sa.default, - ignoreHealthAssertions = false, - ): Promise => { - const { mAsset, basketManager } = md; - if (!ignoreHealthAssertions) await assertBasketIsHealthy(massetMachine, md); - - const minterBassetBalBefore = await bAsset.balanceOf(sender); - const derivedRecipient = useMintTo ? recipient : sender; - const recipientBalBefore = await mAsset.balanceOf(derivedRecipient); - const bAssetBefore = await massetMachine.getBasset(basketManager, bAsset.address); - const integratorBalBefore = await bAssetBefore.contract.balanceOf( - bAssetBefore.integrator.address, - ); - - const approval0: BN = await massetMachine.approveMasset( - bAsset, - mAsset, - new BN(mAssetMintAmount), - ); - - // Expect to be used in cache - const platformInteraction = await massetMachine.getPlatformInteraction( - mAsset, - "deposit", - approval0, - integratorBalBefore, - bAssetBefore, - ); - - const tx = useMintTo - ? await mAsset.mintTo(bAsset.address, approval0, derivedRecipient, { from: sender }) - : await mAsset.mint(bAsset.address, approval0, { from: sender }); - - const mAssetQuantity = simpleToExactAmount(mAssetMintAmount, 18); - const bAssetQuantity = simpleToExactAmount(mAssetMintAmount, await bAsset.decimals()); - await expectEvent(tx.receipt, "Minted", { - minter: sender, - recipient: derivedRecipient, - mAssetQuantity, - bAsset: bAsset.address, - bAssetQuantity, - }); - // Transfers to lending platform - await expectEvent(tx.receipt, "Transfer", { - from: sender, - to: bAssetBefore.integrator.address, - value: bAssetQuantity, - }); - // Deposits into lending platform - const emitter = await AaveIntegration.new(); - const integratorBalAfter = await bAssetBefore.contract.balanceOf( - bAssetBefore.integrator.address, - ); - expect(integratorBalAfter).bignumber.eq(platformInteraction.rawBalance); - if (platformInteraction.expectInteraction) { - await expectEvent.inTransaction(tx.tx, emitter, "Deposit", { - _bAsset: bAsset.address, - _amount: platformInteraction.amount, - }); - } - // Recipient should have mAsset quantity after - const recipientBalAfter = await mAsset.balanceOf(derivedRecipient); - expect(recipientBalAfter).bignumber.eq(recipientBalBefore.add(mAssetQuantity)); - // Sender should have less bAsset after - const minterBassetBalAfter = await bAsset.balanceOf(sender); - expect(minterBassetBalAfter).bignumber.eq(minterBassetBalBefore.sub(bAssetQuantity)); - // VaultBalance should update for this bAsset - const bAssetAfter = await basketManager.getBasset(bAsset.address); - expect(new BN(bAssetAfter.vaultBalance)).bignumber.eq( - new BN(bAssetBefore.vaultBalance).add(bAssetQuantity), - ); - - // Complete basket should remain in healthy state - if (!ignoreHealthAssertions) await assertBasketIsHealthy(massetMachine, md); - return { - minterBassetBalBefore, - minterBassetBalAfter, - recipientBalBefore, - recipientBalAfter, - }; - }; - - const seedWithWeightings = async (md: MassetDetails, weights: Array): Promise => { - for (let i = 0; i < md.bAssets.length; i += 1) { - if (weights[i].gt(new BN(0))) { - await assertBasicMint( - md, - weights[i], - md.bAssets[i], - false, - undefined, - undefined, - true, - ); - } - } - }; - - describe("minting with a single bAsset", () => { - context("when the weights are within the ForgeValidator limit", () => { - before("reset", async () => { - await runSetup(); - }); - context("and sending to a specific recipient", async () => { - before(async () => { - await runSetup(); - }); - it("should fail if recipient is 0x0", async () => { - const { mAsset, bAssets } = massetDetails; - await expectRevert( - mAsset.mintTo(bAssets[0].address, new BN(1), ZERO_ADDRESS), - "Must be a valid recipient", - ); - }); - it("should send mUSD when recipient is a contract", async () => { - const { bAssets, forgeValidator } = massetDetails; - const recipient = forgeValidator.address; - await assertBasicMint(massetDetails, new BN(1), bAssets[0], true, recipient); - }); - it("should send mUSD when the recipient is an EOA", async () => { - const { bAssets } = massetDetails; - const recipient = sa.dummy1; - await assertBasicMint(massetDetails, new BN(1), bAssets[1], true, recipient); - }); - }); - context("and specifying one bAsset base unit", async () => { - before(async () => { - await runSetup(); - }); - it("should mint a higher q of mAsset base units when using bAsset with 12", async () => { - const { bAssets, mAsset } = massetDetails; - const bAsset = bAssets[0]; - // bAsset has 12 dp - const decimals = await bAsset.decimals(); - expect(decimals).bignumber.eq(new BN(12)); - - await bAsset.approve(mAsset.address, new BN(1)); - - const minterBassetBalBefore = await bAsset.balanceOf(sa.default); - const recipientBalBefore = await mAsset.balanceOf(sa.default); - - const tx = await mAsset.mint(bAsset.address, new BN(1)); - const expectedMasset = new BN(10).pow(new BN(18).sub(decimals)); - await expectEvent(tx.receipt, "Minted", { - minter: sa.default, - recipient: sa.default, - mAssetQuantity: expectedMasset, - bAsset: bAsset.address, - bAssetQuantity: new BN(1), - }); - // Recipient should have mAsset quantity after - const recipientBalAfter = await mAsset.balanceOf(sa.default); - expect(recipientBalAfter).bignumber.eq(recipientBalBefore.add(expectedMasset)); - // Sender should have less bAsset after - const minterBassetBalAfter = await bAsset.balanceOf(sa.default); - expect(minterBassetBalAfter).bignumber.eq(minterBassetBalBefore.sub(new BN(1))); - // Complete basket should remain in healthy state - await assertBasketIsHealthy(massetMachine, massetDetails); - }); - }); - context("and not defining recipient", async () => { - before(async () => { - await runSetup(); - }); - it("should mint to sender in basic mint func", async () => { - const { bAssets } = massetDetails; - await assertBasicMint(massetDetails, new BN(1), bAssets[1], false); - }); - }); - context("using bAssets with transfer fees", async () => { - before(async () => { - await runSetup(false, true); - }); - it("should handle tokens with transfer fees", async () => { - const { bAssets, mAsset, basketManager } = massetDetails; - await assertBasketIsHealthy(massetMachine, massetDetails); - - // 1.0 Assert bAsset has fee - const bAsset = bAssets[3]; - const basket = await massetMachine.getBasketComposition(massetDetails); - expect(basket.bAssets[3].isTransferFeeCharged).to.eq(true); - - // 2.0 Get balances - const minterBassetBalBefore = await bAsset.balanceOf(sa.default); - const recipient = sa.dummy3; - const recipientBalBefore = await mAsset.balanceOf(recipient); - expect(recipientBalBefore).bignumber.eq(new BN(0)); - const mAssetMintAmount = new BN(10); - const approval0: BN = await massetMachine.approveMasset( - bAsset, - mAsset, - new BN(mAssetMintAmount), - ); - // 3.0 Do the mint - const tx = await mAsset.mintTo(bAsset.address, approval0, recipient); - - const mAssetQuantity = simpleToExactAmount(mAssetMintAmount, 18); - const bAssetQuantity = simpleToExactAmount( - mAssetMintAmount, - await bAsset.decimals(), - ); - // 3.1 Check Transfers to lending platform - await expectEvent(tx.receipt, "Transfer", { - from: sa.default, - to: await basketManager.getBassetIntegrator(bAsset.address), - }); - // 3.2 Check Deposits into lending platform - const emitter = await AaveIntegration.new(); - await expectEvent.inTransaction(tx.tx, emitter, "Deposit", { - _bAsset: bAsset.address, - }); - // 4.0 Recipient should have mAsset quantity after - const recipientBalAfter = await mAsset.balanceOf(recipient); - // Assert that we minted gt 99% of the bAsset - assertBNSlightlyGTPercent( - recipientBalBefore.add(mAssetQuantity), - recipientBalAfter, - "0.3", - true, - ); - // Sender should have less bAsset after - const minterBassetBalAfter = await bAsset.balanceOf(sa.default); - expect(minterBassetBalAfter).bignumber.eq( - minterBassetBalBefore.sub(bAssetQuantity), - ); - // VaultBalance should update for this bAsset - const bAssetAfter = await basketManager.getBasset(bAsset.address); - expect(new BN(bAssetAfter.vaultBalance)).bignumber.eq(recipientBalAfter); - - // Complete basket should remain in healthy state - // await assertBasketIsHealthy(massetMachine, massetDetails); - }); - it("should fail if the token charges a fee but we dont know about it", async () => { - const { bAssets, mAsset, basketManager } = massetDetails; - await assertBasketIsHealthy(massetMachine, massetDetails); - - // 1.0 Assert bAsset has fee - const bAsset = bAssets[3]; - const basket = await massetMachine.getBasketComposition(massetDetails); - expect(basket.bAssets[3].isTransferFeeCharged).to.eq(true); - await basketManager.setTransferFeesFlag(bAsset.address, false, { - from: sa.governor, - }); - - // 2.0 Get balances - const mAssetMintAmount = new BN(10); - const approval0: BN = await massetMachine.approveMasset( - bAsset, - mAsset, - new BN(mAssetMintAmount), - ); - // 3.0 Do the mint - await expectRevert( - mAsset.mintTo(bAsset.address, approval0, sa.default), - "Asset not fully transferred", - ); - }); - }); - context("with an affected bAsset", async () => { - it("should fail if bAsset is broken below peg", async () => { - const { bAssets, mAsset, basketManager } = massetDetails; - await assertBasketIsHealthy(massetMachine, massetDetails); - - const bAsset = bAssets[0]; - await basketManager.handlePegLoss(bAsset.address, true, { - from: sa.governor, - }); - const newBasset = await basketManager.getBasset(bAsset.address); - expect(newBasset.status).to.eq(BassetStatus.BrokenBelowPeg.toString()); - await massetMachine.approveMasset(bAsset, mAsset, new BN(1)); - await expectRevert( - mAsset.mint(bAsset.address, new BN(1)), - "bAsset not allowed in mint", - ); - }); - }); - context("passing invalid arguments", async () => { - before(async () => { - await runSetup(); - }); - it("should revert when 0 quantities", async () => { - const { bAssets, mAsset } = massetDetails; - const bAsset = bAssets[0]; - await massetMachine.approveMasset(bAsset, mAsset, new BN(1)); - await expectRevert( - mAsset.mint(bAsset.address, new BN(0)), - "Quantity must not be 0", - ); - }); - it("should fail if sender doesn't have balance", async () => { - const { bAssets, mAsset } = massetDetails; - const bAsset = bAssets[0]; - const sender = sa.dummy1; - expect(await bAsset.balanceOf(sender)).bignumber.eq(new BN(0)); - await massetMachine.approveMasset(bAsset, mAsset, new BN(100), sender); - await expectRevert( - mAsset.mint(bAsset.address, new BN(100), { from: sender }), - "SafeERC20: low-level call failed", - ); - }); - it("should fail if sender doesn't give approval", async () => { - const { bAssets, mAsset } = massetDetails; - const bAsset = bAssets[0]; - const sender = sa.dummy2; - await bAsset.transfer(sender, new BN(10000)); - expect(await bAsset.allowance(sender, mAsset.address)).bignumber.eq(new BN(0)); - expect(await bAsset.balanceOf(sender)).bignumber.eq(new BN(10000)); - await expectRevert( - mAsset.mint(bAsset.address, new BN(100), { from: sender }), - "SafeERC20: low-level call failed", - ); - }); - it("should fail if the bAsset does not exist", async () => { - const { mAsset } = massetDetails; - const bAsset = await MockERC20.new("Mock", "MKK", 18, sa.default, 1000); - await expectRevert( - mAsset.mint(bAsset.address, new BN(100)), - "bAsset does not exist", - ); - }); - }); - context("pushing the weighting beyond the maximum limit", async () => { - before(async () => { - await runSetup(false, false); - }); - it("should succeed so long as we don't exceed the max weight", async () => { - const { bAssets, mAsset, basketManager } = massetDetails; - await assertBasketIsHealthy(massetMachine, massetDetails); - - const composition = await massetMachine.getBasketComposition(massetDetails); - // Expect 4 bAssets with 100 weightings - composition.bAssets.forEach((b) => { - expect(b.vaultBalance).bignumber.eq(new BN(0)); - expect(b.maxWeight).bignumber.eq(simpleToExactAmount(100, 16)); - }); - // Mint 25 of each bAsset, taking total to 100% - for (let i = 0; i < composition.bAssets.length; i += 1) { - await assertBasicMint( - massetDetails, - new BN(25), - composition.bAssets[i].contract, - false, - ); - } - // Set updated weightings - await basketManager.setBasketWeights( - bAssets.map((b) => b.address), - bAssets.map(() => simpleToExactAmount(25, 16)), - { - from: sa.governor, - }, - ); - - // Assert basket is still healthy with 25 weightings - await assertBasketIsHealthy(massetMachine, massetDetails); - - // Should revert since we would be pushing above target - const bAsset = bAssets[0]; - const approval: BN = await massetMachine.approveMasset( - bAsset, - mAsset, - new BN(2), - ); - await expectRevert( - mAsset.mint(bAsset.address, approval), - "bAssets used in mint cannot exceed their max weight", - ); - // Set sufficient weightings allowance - await basketManager.setBasketWeights( - [bAsset.address], - [simpleToExactAmount(27, 16)], - { - from: sa.governor, - }, - ); - - // Mint should pass now - await assertBasicMint(massetDetails, new BN(2), bAsset, false); - }); - }); - it("should mint with single bAsset", async () => { - const { bAssets, mAsset } = massetDetails; - const oneMasset = simpleToExactAmount(1, 18); - const mUSD_bal0 = await mAsset.balanceOf(sa.default); - - const approval0: BN = await massetMachine.approveMasset( - bAssets[0], - mAsset, - 1, - sa.default, - ); - await mAsset.mint(bAssets[0].address, approval0, { - from: sa.default, - }); - - const mUSD_bal1 = await mAsset.balanceOf(sa.default); - expect(mUSD_bal1).bignumber.eq(mUSD_bal0.add(oneMasset)); - - const approval1: BN = await massetMachine.approveMasset( - bAssets[1], - mAsset, - 1, - sa.default, - ); - await mAsset.mint(bAssets[1].address, approval1, { - from: sa.default, - }); - - const mUSD_bal2 = await mAsset.balanceOf(sa.default); - expect(mUSD_bal2).bignumber.eq(mUSD_bal1.add(oneMasset)); - - const approval2: BN = await massetMachine.approveMasset( - bAssets[2], - mAsset, - 1, - sa.default, - ); - await mAsset.mint(bAssets[2].address, approval2, { - from: sa.default, - }); - - const mUSD_bal3 = await mAsset.balanceOf(sa.default); - expect(mUSD_bal3).bignumber.eq(mUSD_bal2.add(oneMasset)); - - const approval3: BN = await massetMachine.approveMasset( - bAssets[3], - mAsset, - 1, - sa.default, - ); - await mAsset.mint(bAssets[3].address, approval3, { - from: sa.default, - }); - - const mUSD_bal4 = await mAsset.balanceOf(sa.default); - expect(mUSD_bal4).bignumber.eq(mUSD_bal3.add(oneMasset)); - }); - }); - context("with a fluctuating basket", async () => { - describe("minting when a bAsset has just been removed from the basket", async () => { - before(async () => { - await runSetup(false); - const { bAssets, basketManager } = massetDetails; - await seedWithWeightings(massetDetails, [ - new BN(50), - new BN(0), - new BN(50), - new BN(50), - ]); - // From [A, B, C, D], remove B, replacing it with D - await basketManager.setBasketWeights( - bAssets.map((b) => b.address), - [ - simpleToExactAmount(50, 16), - new BN(0), - simpleToExactAmount(50, 16), - simpleToExactAmount(50, 16), - ], - { from: sa.governor }, - ); - await basketManager.removeBasset(bAssets[1].address, { from: sa.governor }); - }); - it("should still deposit to the right lending platform", async () => { - const { bAssets } = massetDetails; - - const removedBassetBalBefore = await bAssets[1].balanceOf(sa.default); - await assertBasicMint(massetDetails, new BN(1), bAssets[3], false); - const removedBassetBalAfter = await bAssets[1].balanceOf(sa.default); - expect(removedBassetBalBefore).bignumber.eq(removedBassetBalAfter); - }); - it("should not be possible to mint with the removed bAsset", async () => { - const { bAssets, mAsset } = massetDetails; - await expectRevert( - mAsset.mint(bAssets[1].address, new BN(1)), - "bAsset does not exist", - ); - }); - }); - }); - context("when the weights exceeds the ForgeValidator limit", async () => { - let composition: BasketComposition; - beforeEach(async () => { - await runSetup(false, false); - const { bAssets, basketManager } = massetDetails; - composition = await massetMachine.getBasketComposition(massetDetails); - // Expect 4 bAssets with 100 weightings - composition.bAssets.forEach((b) => { - expect(b.vaultBalance).bignumber.eq(new BN(0)); - expect(b.maxWeight).bignumber.eq(simpleToExactAmount(100, 16)); - }); - // Mint 0, 50, 25, 25 of each bAsset, taking total to 100 - await seedWithWeightings(massetDetails, [ - new BN(0), - new BN(50), - new BN(25), - new BN(25), - ]); - // Refactor the weightings to push some overweight - await basketManager.setBasketWeights( - bAssets.map((b) => b.address), - bAssets.map(() => simpleToExactAmount(25, 16)), - { - from: sa.governor, - }, - ); - }); - // minting should work as long as the thing we mint with doesnt exceed max - it("should succeed if bAsset is underweight", async () => { - const { bAssets, mAsset } = massetDetails; - - // Assert bAssets are now classed as overweight/underweight - composition = await massetMachine.getBasketComposition(massetDetails); - expect(composition.bAssets[1].overweight).to.eq(true); - - // Should succeed since we would be pushing towards target - const bAsset0 = bAssets[0]; - await assertBasicMint( - massetDetails, - new BN(1), - bAsset0, - false, - undefined, - undefined, - true, - ); - // Should fail if we mint with something else that will go over - expect(composition.bAssets[2].overweight).to.eq(false); - const bAsset2 = bAssets[2]; - await assertFailedMint( - mAsset, - bAsset2, - new BN(2), - "bAssets used in mint cannot exceed their max weight", - ); - }); - it("should fail if bAsset already exceeds max", async () => { - const { bAssets, mAsset } = massetDetails; - // Assert bAssets are now classed as overweight/underweight - composition = await massetMachine.getBasketComposition(massetDetails); - expect(composition.bAssets[1].overweight).to.eq(true); - - // Should fail if we mint with something already overweight - const bAsset1 = bAssets[1]; - await assertFailedMint( - mAsset, - bAsset1, - new BN(1), - "bAssets used in mint cannot exceed their max weight", - ); - }); - }); - context("when there are a large number of bAssets in the basket", async () => { - // Create a basket filled with 16 bAssets, all hooked into the Mock intergation platform - before(async () => { - await runSetup(false); - const { aaveIntegration, basketManager } = massetDetails; - const aaveAddress = await aaveIntegration.platformAddress(); - const mockAave = await MockAave.at(aaveAddress); - await seedWithWeightings(massetDetails, [ - new BN(100), - new BN(0), - new BN(0), - new BN(0), - ]); - // Create 6 new bAssets - for (let i = 0; i < 6; i += 1) { - const mockBasset = await MockERC20.new( - `MKI${i}`, - `MI${i}`, - 18, - sa.default, - 100000000, - ); - const mockAToken = await MockAToken.new(aaveAddress, mockBasset.address); - // Add to the mock aave platform - await mockAave.addAToken(mockAToken.address, mockBasset.address); - // Add the pToken to our integration - await aaveIntegration.setPTokenAddress(mockBasset.address, mockAToken.address, { - from: sa.governor, - }); - // Add the bAsset to the basket - await basketManager.addBasset( - mockBasset.address, - aaveIntegration.address, - false, - { from: sa.governor }, - ); - } - }); - it("should still perform with 10 bAssets in the basket", async () => { - const { basketManager } = massetDetails; - // Assert that we have indeed 10 bAssets - const onChainBassets = await massetMachine.getBassetsInMasset(massetDetails); - expect(onChainBassets.length).to.eq(10); - // Set equal basket weightings - await basketManager.setBasketWeights( - onChainBassets.map((b) => b.addr), - onChainBassets.map(() => simpleToExactAmount(10, 16)), - { from: sa.governor }, - ); - for (let i = 1; i < onChainBassets.length; i += 1) { - await assertBasicMint( - massetDetails, - new BN(1), - onChainBassets[i].contract, - false, - undefined, - undefined, - true, - ); - } - }); - }); - context("when the basket manager returns invalid response", async () => { - before(async () => { - await runSetup(); - }); - it("should mint nothing if the preparation returns invalid from manager", async () => { - const { mAsset, forgeValidator } = massetDetails; - // mintSingle - const bAsset = await MockERC20.new("Mock", "MKK", 18, sa.default, 1000); - const newManager = await MockBasketManager1.new(bAsset.address); - const mockMasset = await Masset.new(); - await mockMasset.initialize( - "mMock", - "MK", - systemMachine.nexus.address, - forgeValidator.address, - newManager.address, - ); - await massetMachine.approveMasset(bAsset, mAsset, new BN(1000)); - - const bAssetBalBefore = await bAsset.balanceOf(sa.default); - const mAssetBalBefore = await mockMasset.balanceOf(sa.default); - const mAssetSupplyBefore = await mockMasset.totalSupply(); - - // Should mint nothing due to the forge preparation being invalid - await mockMasset.mint(bAsset.address, new BN(1000)); - - const bAssetBalAfter = await bAsset.balanceOf(sa.default); - expect(bAssetBalBefore).bignumber.eq(bAssetBalAfter); - const mAssetBalAfter = await mockMasset.balanceOf(sa.default); - expect(mAssetBalBefore).bignumber.eq(mAssetBalAfter); - const mAssetSupplyAfter = await mockMasset.totalSupply(); - expect(mAssetSupplyBefore).bignumber.eq(mAssetSupplyAfter); - }); - it("should fail if given an invalid integrator", async () => { - const { mAsset, forgeValidator } = massetDetails; - // mintSingle - const bAsset = await MockERC20.new("Mock2", "MKK", 18, sa.default, 1000); - const newManager = await MockBasketManager2.new(bAsset.address); - const mockMasset = await Masset.new(); - await mockMasset.initialize( - "mMock", - "MK", - systemMachine.nexus.address, - forgeValidator.address, - newManager.address, - ); - await massetMachine.approveMasset(bAsset, mAsset, new BN(1000)); - - const bAssetBalBefore = await bAsset.balanceOf(sa.default); - const mAssetBalBefore = await mockMasset.balanceOf(sa.default); - const mAssetSupplyBefore = await mockMasset.totalSupply(); - - // Should revert since we can't just call an invalid integrator - await expectRevert( - mockMasset.mint(bAsset.address, new BN(100)), - "SafeERC20: low-level call failed", - ); - - const bAssetBalAfter = await bAsset.balanceOf(sa.default); - expect(bAssetBalBefore).bignumber.eq(bAssetBalAfter); - const mAssetBalAfter = await mockMasset.balanceOf(sa.default); - expect(mAssetBalBefore).bignumber.eq(mAssetBalAfter); - const mAssetSupplyAfter = await mockMasset.totalSupply(); - expect(mAssetSupplyBefore).bignumber.eq(mAssetSupplyAfter); - }); - it("reverts if the BasketManager is paused", async () => { - const { bAssets, mAsset, basketManager } = massetDetails; - const bAsset = bAssets[0]; - await basketManager.pause({ from: sa.governor }); - expect(await basketManager.paused()).eq(true); - await expectRevert(mAsset.mint(bAsset.address, new BN(100)), "Pausable: paused"); - }); - }); - context("when the mAsset has failed", () => { - before(async () => { - await runSetup(true); - }); - it("should revert any mints", async () => { - const { bAssets, mAsset, basketManager } = massetDetails; - await assertBasketIsHealthy(massetMachine, massetDetails); - await basketManager.setBasket(true, fullScale); - const bAsset0 = bAssets[0]; - await assertFailedMint(mAsset, bAsset0, new BN(1), "Basket must be alive"); - }); - }); - context("when the mAsset is undergoing recol", () => { - before(async () => { - await runSetup(true); - }); - it("should revert any mints", async () => { - const { bAssets, mAsset, basketManager } = massetDetails; - await assertBasketIsHealthy(massetMachine, massetDetails); - await basketManager.setRecol(true); - const bAsset0 = bAssets[0]; - await assertFailedMint( - mAsset, - bAsset0, - new BN(1), - "No bAssets can be undergoing recol", - ); - }); - }); - }); - - describe("minting with multiple bAssets", () => { - // Helper to assert basic minting conditions, i.e. balance before and after - const assertMintMulti = async ( - md: MassetDetails, - mAssetMintAmounts: Array, - bAssets: Array, - recipient: string = sa.default, - sender: string = sa.default, - ignoreHealthAssertions = false, - ): Promise => { - const { mAsset, basketManager } = md; - - if (!ignoreHealthAssertions) await assertBasketIsHealthy(massetMachine, md); - - const minterBassetBalBefore = await Promise.all( - bAssets.map((b) => b.balanceOf(sender)), - ); - const recipientBalBefore = await mAsset.balanceOf(recipient); - const bAssetDecimals = await Promise.all(bAssets.map((b) => b.decimals())); - const bAssetBefore = await Promise.all( - bAssets.map((b) => basketManager.getBasset(b.address)), - ); - - const approvals: Array = await Promise.all( - bAssets.map((b, i) => - massetMachine.approveMasset(b, mAsset, new BN(mAssetMintAmounts[i])), - ), - ); - const tx = await mAsset.mintMulti( - bAssetBefore.map((b) => b.addr), - approvals, - recipient, - { from: sender }, - ); - - const mAssetQuantity = simpleToExactAmount( - mAssetMintAmounts.reduce((p, c, i) => new BN(p).add(new BN(c)), new BN(0)), - 18, - ); - const bAssetQuantities = mAssetMintAmounts.map((m, i) => - simpleToExactAmount(m, bAssetDecimals[i]), - ); - - expectEvent(tx.receipt, "MintedMulti", { - recipient, - mAssetQuantity, - }); - - // Recipient should have mAsset quantity after - const recipientBalAfter = await mAsset.balanceOf(recipient); - expect(recipientBalAfter).bignumber.eq(recipientBalBefore.add(mAssetQuantity)); - // Sender should have less bAsset after - const minterBassetBalAfter = await Promise.all(bAssets.map((b) => b.balanceOf(sender))); - minterBassetBalAfter.map((b, i) => - expect(b).bignumber.eq(minterBassetBalBefore[i].sub(bAssetQuantities[i])), - ); - // VaultBalance should updated for this bAsset - const bAssetAfter = await Promise.all( - bAssets.map((b) => basketManager.getBasset(b.address)), - ); - bAssetAfter.map((b, i) => - expect(new BN(b.vaultBalance)).bignumber.eq( - new BN(bAssetBefore[i].vaultBalance).add(bAssetQuantities[i]), - ), - ); - - // Complete basket should remain in healthy state - if (!ignoreHealthAssertions) await assertBasketIsHealthy(massetMachine, md); - }; - - before(async () => { - await runSetup(); - }); - context("when the weights are within the ForgeValidator limit", () => { - context("and sending to a specific recipient", async () => { - before(async () => { - await runSetup(); - }); - it("should mint selected bAssets only", async () => { - const comp = await massetMachine.getBasketComposition(massetDetails); - await assertMintMulti( - massetDetails, - [5, 10], - [massetDetails.bAssets[2], massetDetails.bAssets[0]], - ); - const compAfter = await massetMachine.getBasketComposition(massetDetails); - expect(comp.bAssets[1].vaultBalance).bignumber.eq( - compAfter.bAssets[1].vaultBalance, - ); - expect(comp.bAssets[3].vaultBalance).bignumber.eq( - compAfter.bAssets[3].vaultBalance, - ); - }); - it("should fail if recipient is 0x0", async () => { - const { mAsset, bAssets } = massetDetails; - await expectRevert( - mAsset.mintMulti([bAssets[0].address], [new BN(1)], ZERO_ADDRESS), - "Must be a valid recipient", - ); - }); - it("should send mUSD when recipient is a contract", async () => { - const { bAssets, forgeValidator } = massetDetails; - const recipient = forgeValidator.address; - await assertMintMulti(massetDetails, [new BN(1)], [bAssets[0]], recipient); - }); - it("should send mUSD when the recipient is an EOA", async () => { - const { bAssets } = massetDetails; - const recipient = sa.dummy1; - await assertMintMulti(massetDetails, [new BN(1)], [bAssets[0]], recipient); - }); - }); - context("and specifying one bAsset base unit", async () => { - before(async () => { - await runSetup(); - }); - it("should mint a higher q of mAsset base units when using bAsset with 12", async () => { - const { bAssets, mAsset } = massetDetails; - const bAsset = bAssets[0]; - // bAsset has 12 dp - const decimals = await bAsset.decimals(); - expect(decimals).bignumber.eq(new BN(12)); - - await bAsset.approve(mAsset.address, new BN(1)); - - const minterBassetBalBefore = await bAsset.balanceOf(sa.default); - const recipientBalBefore = await mAsset.balanceOf(sa.default); - - const tx = await mAsset.mintMulti([bAsset.address], [new BN(1)], sa.default); - const expectedMasset = new BN(10).pow(new BN(18).sub(decimals)); - await expectEvent(tx.receipt, "MintedMulti", { - recipient: sa.default, - mAssetQuantity: expectedMasset, - }); - // Recipient should have mAsset quantity after - const recipientBalAfter = await mAsset.balanceOf(sa.default); - expect(recipientBalAfter).bignumber.eq(recipientBalBefore.add(expectedMasset)); - // Sender should have less bAsset after - const minterBassetBalAfter = await bAsset.balanceOf(sa.default); - expect(minterBassetBalAfter).bignumber.eq(minterBassetBalBefore.sub(new BN(1))); - // Complete basket should remain in healthy state - await assertBasketIsHealthy(massetMachine, massetDetails); - }); - }); - context("using bAssets with transfer fees", async () => { - before(async () => { - await runSetup(false, true); - }); - it("should handle tokens with transfer fees", async () => { - const { bAssets, mAsset, basketManager } = massetDetails; - await assertBasketIsHealthy(massetMachine, massetDetails); - - // 1.0 Assert bAsset has fee - const bAsset = bAssets[3]; - const basket = await massetMachine.getBasketComposition(massetDetails); - expect(basket.bAssets[3].isTransferFeeCharged).to.eq(true); - - // 2.0 Get balances - const minterBassetBalBefore = await bAsset.balanceOf(sa.default); - const recipient = sa.dummy3; - const recipientBalBefore = await mAsset.balanceOf(recipient); - expect(recipientBalBefore).bignumber.eq(new BN(0)); - const mAssetMintAmount = new BN(10); - const approval0: BN = await massetMachine.approveMasset( - bAsset, - mAsset, - new BN(mAssetMintAmount), - ); - // 3.0 Do the mint - const tx = await mAsset.mintMulti([bAsset.address], [approval0], recipient); - - const mAssetQuantity = simpleToExactAmount(mAssetMintAmount, 18); - const bAssetQuantity = simpleToExactAmount( - mAssetMintAmount, - await bAsset.decimals(), - ); - // 3.1 Check Transfers to lending platform - await expectEvent(tx.receipt, "Transfer", { - from: sa.default, - to: await basketManager.getBassetIntegrator(bAsset.address), - }); - // 3.2 Check Deposits into lending platform - const emitter = await AaveIntegration.new(); - await expectEvent.inTransaction(tx.tx, emitter, "Deposit", { - _bAsset: bAsset.address, - }); - // 4.0 Recipient should have mAsset quantity after - const recipientBalAfter = await mAsset.balanceOf(recipient); - // Assert that we minted gt 99% of the bAsset - assertBNSlightlyGTPercent( - recipientBalBefore.add(mAssetQuantity), - recipientBalAfter, - "0.3", - ); - // Sender should have less bAsset afterz - const minterBassetBalAfter = await bAsset.balanceOf(sa.default); - expect(minterBassetBalAfter).bignumber.eq( - minterBassetBalBefore.sub(bAssetQuantity), - ); - // VaultBalance should update for this bAsset - const bAssetAfter = await basketManager.getBasset(bAsset.address); - expect(new BN(bAssetAfter.vaultBalance)).bignumber.eq(recipientBalAfter); - - // Complete basket should remain in healthy state - await assertBasketIsHealthy(massetMachine, massetDetails); - }); - it("should fail if the token charges a fee but we dont know about it", async () => { - const { bAssets, mAsset, basketManager } = massetDetails; - await assertBasketIsHealthy(massetMachine, massetDetails); - - // 1.0 Assert bAsset has fee - const bAsset = bAssets[3]; - const basket = await massetMachine.getBasketComposition(massetDetails); - expect(basket.bAssets[3].isTransferFeeCharged).to.eq(true); - await basketManager.setTransferFeesFlag(bAsset.address, false, { - from: sa.governor, - }); - - // 2.0 Get balances - const mAssetMintAmount = new BN(10); - const approval0: BN = await massetMachine.approveMasset( - bAsset, - mAsset, - new BN(mAssetMintAmount), - ); - // 3.0 Do the mint - await expectRevert( - mAsset.mintMulti([bAsset.address], [approval0], sa.default), - "Asset not fully transferred", - ); - }); - }); - context("with an affected bAsset", async () => { - it("should fail if bAsset is broken below peg", async () => { - const { bAssets, mAsset, basketManager } = massetDetails; - await assertBasketIsHealthy(massetMachine, massetDetails); - - const bAsset = bAssets[0]; - await basketManager.handlePegLoss(bAsset.address, true, { - from: sa.governor, - }); - const newBasset = await basketManager.getBasset(bAsset.address); - expect(newBasset.status).to.eq(BassetStatus.BrokenBelowPeg.toString()); - await massetMachine.approveMasset(bAsset, mAsset, new BN(1)); - await expectRevert( - mAsset.mintMulti([newBasset.addr], [new BN(1)], sa.default), - "bAsset not allowed in mint", - ); - }); - }); - context("passing invalid arguments", async () => { - before(async () => { - await runSetup(); - }); - describe("passing an incorrect bAsset array", async () => { - it("should error if the array is empty", async () => { - const { mAsset } = massetDetails; - await expectRevert( - mAsset.mintMulti([], [new BN(1)], sa.default), - "Input array mismatch", - ); - }); - it("should error if both inputs are null", async () => { - const { mAsset } = massetDetails; - await expectRevert( - mAsset.mintMulti([], [], sa.default), - "Input array mismatch", - ); - }); - it("should error if there is a length mismatch", async () => { - const { mAsset, bAssets } = massetDetails; - await expectRevert( - mAsset.mintMulti( - [bAssets[0].address], - [new BN(1), new BN(1)], - sa.default, - ), - "Input array mismatch", - ); - }); - it("should error if there is a length mismatch", async () => { - const { mAsset, bAssets } = massetDetails; - await expectRevert( - mAsset.mintMulti( - [bAssets[0].address], - [new BN(1), new BN(1), new BN(1), new BN(1)], - sa.default, - ), - "Input array mismatch", - ); - }); - it("should fail if there are duplicate bAsset addresses", async () => { - const { mAsset, bAssets } = massetDetails; - await expectRevert( - mAsset.mintMulti( - [bAssets[0].address, bAssets[0].address], - [new BN(1), new BN(1)], - sa.default, - ), - "Must have no duplicates", - ); - }); - }); - describe("minting with some 0 quantities", async () => { - it("should allow minting with some 0 quantities", async () => { - const { bAssets } = massetDetails; - const recipient = sa.dummy1; - await assertMintMulti( - massetDetails, - [new BN(1), new BN(0)], - [bAssets[0], bAssets[1]], - recipient, - ); - }); - it("should fail if output mAsset quantity is 0", async () => { - const { mAsset, bAssets, basketManager } = massetDetails; - // Get all before balances - const bAssetBefore = await Promise.all( - bAssets.map((b) => basketManager.getBasset(b.address)), - ); - // Approve spending of the bAssets - await Promise.all( - bAssets.map((b, i) => - massetMachine.approveMasset(b, mAsset, new BN(1)), - ), - ); - // Pass all 0's - await expectRevert( - mAsset.mintMulti( - bAssetBefore.map((b) => b.addr), - [new BN(0), new BN(0), new BN(0), new BN(0)], - sa.default, - ), - "No masset quantity to mint", - ); - }); - }); - it("should fail if sender doesn't have balance", async () => { - const { bAssets, mAsset } = massetDetails; - const bAsset = bAssets[0]; - const sender = sa.dummy1; - expect(await bAsset.balanceOf(sender)).bignumber.eq(new BN(0)); - await massetMachine.approveMasset(bAsset, mAsset, new BN(100), sender); - await expectRevert( - mAsset.mintMulti([bAsset.address], [new BN(100)], sa.default, { - from: sender, - }), - "SafeERC20: low-level call failed", - ); - }); - it("should fail if sender doesn't give approval", async () => { - const { bAssets, mAsset } = massetDetails; - const bAsset = bAssets[0]; - const sender = sa.dummy2; - await bAsset.transfer(sender, new BN(10000)); - expect(await bAsset.allowance(sender, mAsset.address)).bignumber.eq(new BN(0)); - expect(await bAsset.balanceOf(sender)).bignumber.eq(new BN(10000)); - await expectRevert( - mAsset.mintMulti([bAsset.address], [new BN(100)], sa.default, { - from: sender, - }), - "SafeERC20: low-level call failed", - ); - }); - it("should fail if the bAsset does not exist", async () => { - const { mAsset } = massetDetails; - await expectRevert( - mAsset.mintMulti([sa.dummy1], [new BN(100)], sa.default), - "bAsset must exist", - ); - }); - }); - context("pushing the weighting beyond the maximum limit", async () => { - before(async () => { - await runSetup(false, false); - }); - it("should succeed so long as we don't exceed the max weight", async () => { - const { bAssets, mAsset, basketManager } = massetDetails; - await assertBasketIsHealthy(massetMachine, massetDetails); - - const composition = await massetMachine.getBasketComposition(massetDetails); - // Expect 4 bAssets with 100 weightings - composition.bAssets.forEach((b) => { - expect(b.vaultBalance).bignumber.eq(new BN(0)); - expect(b.maxWeight).bignumber.eq(simpleToExactAmount(100, 16)); - }); - // Mint 25 of each bAsset, taking total to 100% - for (let i = 0; i < composition.bAssets.length; i += 1) { - await assertBasicMint( - massetDetails, - new BN(25), - composition.bAssets[i].contract, - false, - ); - } - // Set updated weightings - await basketManager.setBasketWeights( - bAssets.map((b) => b.address), - bAssets.map(() => simpleToExactAmount(25, 16)), - { - from: sa.governor, - }, - ); - - // Assert basket is still healthy with 25 weightings - await assertBasketIsHealthy(massetMachine, massetDetails); - - // Should revert since we would be pushing above max - const bAsset = bAssets[0]; - const approval: BN = await massetMachine.approveMasset( - bAsset, - mAsset, - new BN(2), - ); - await expectRevert( - mAsset.mintMulti([bAsset.address], [approval], sa.default), - "bAssets used in mint cannot exceed their max weight", - ); - // Set sufficient weightings allowance - await basketManager.setBasketWeights( - bAssets.map((b) => b.address), - bAssets.map(() => simpleToExactAmount(27, 16)), - { - from: sa.governor, - }, - ); - // Mint should pass now - await assertMintMulti(massetDetails, [new BN(2)], [bAsset]); - }); - }); - describe("minting with various orders", async () => { - before(async () => { - await runSetup(); - }); - - it("should mint quantities relating to the order of the bAsset indexes", async () => { - const { bAssets, mAsset } = massetDetails; - const compBefore = await massetMachine.getBasketComposition(massetDetails); - await massetMachine.approveMasset(bAssets[0], mAsset, new BN(100)); - await massetMachine.approveMasset(bAssets[1], mAsset, new BN(100)); - - // Minting with 2 and 1.. they should correspond to lowest index first - await mAsset.mintMulti( - [bAssets[0].address, bAssets[1].address], - [new BN(2), new BN(1)], - sa.default, - ); - const compAfter = await massetMachine.getBasketComposition(massetDetails); - expect(compAfter.bAssets[0].vaultBalance).bignumber.eq( - new BN(compBefore.bAssets[0].vaultBalance).add(new BN(2)), - ); - expect(compAfter.bAssets[1].vaultBalance).bignumber.eq( - new BN(compBefore.bAssets[1].vaultBalance).add(new BN(1)), - ); - }); - it("should mint using multiple bAssets", async () => { - const { bAssets, mAsset } = massetDetails; - // It's only possible to mint a single base unit of mAsset, if the bAsset also has 18 decimals - // For those tokens with 12 decimals, they can at minimum mint 1*10**6 mAsset base units. - // Thus, these basic calculations should work in whole mAsset units, with specific tests for - // low decimal bAssets - - const approvals = await massetMachine.approveMassetMulti( - [bAssets[0], bAssets[1], bAssets[2]], - mAsset, - 1, - sa.default, - ); - await mAsset.mintMulti( - [bAssets[0].address, bAssets[1].address, bAssets[2].address], - approvals, - sa.default, - ); - - const approvals2 = await massetMachine.approveMassetMulti( - [bAssets[0], bAssets[1], bAssets[2], bAssets[3]], - mAsset, - 1, - sa.default, - ); - const mUSD_balBefore = await mAsset.balanceOf(sa.default); - await mAsset.mintMulti( - [ - bAssets[0].address, - bAssets[1].address, - bAssets[2].address, - bAssets[3].address, - ], - approvals2, - sa.default, - ); - const mUSD_balAfter = await mAsset.balanceOf(sa.default); - expect(mUSD_balAfter, "Must mint 4 full units of mUSD").bignumber.eq( - mUSD_balBefore.add(simpleToExactAmount(4, 18)), - ); - }); - it("should mint using 2 bAssets", async () => { - const { bAssets, mAsset, basketManager } = massetDetails; - const approvals = await massetMachine.approveMassetMulti( - [bAssets[0], bAssets[2]], - mAsset, - 1, - sa.default, - ); - await mAsset.mintMulti( - [bAssets[0].address, bAssets[2].address], - approvals, - sa.default, - { - from: sa.default, - }, - ); - }); - }); - }); - context("with a fluctuating basket", async () => { - describe("minting when a bAsset has just been removed from the basket", async () => { - before(async () => { - await runSetup(false); - const { bAssets, basketManager } = massetDetails; - // From [A, B, C, D], remove B, replacing it with D - await basketManager.setBasketWeights( - [ - bAssets[0].address, - bAssets[1].address, - bAssets[2].address, - bAssets[3].address, - ], - [ - simpleToExactAmount(50, 16), - new BN(0), - simpleToExactAmount(50, 16), - simpleToExactAmount(50, 16), - ], - { from: sa.governor }, - ); - await basketManager.removeBasset(bAssets[1].address, { from: sa.governor }); - }); - it("should still deposit to the right lending platform", async () => { - const { bAssets } = massetDetails; - const removedBassetBalBefore = await bAssets[1].balanceOf(sa.default); - await assertMintMulti( - massetDetails, - [new BN(1), new BN(2), new BN(3)], - [bAssets[3], bAssets[0], bAssets[2]], - sa.default, - sa.default, - ); - const removedBassetBalAfter = await bAssets[1].balanceOf(sa.default); - expect(removedBassetBalBefore).bignumber.eq(removedBassetBalAfter); - }); - it("should not be possible to mint with the removed bAsset", async () => { - const { mAsset, bAssets } = massetDetails; - await expectRevert( - mAsset.mintMulti([bAssets[1].address], [new BN(1)], sa.default), - "bAsset must exist", - ); - }); - }); - }); - context("when the weights exceeds the ForgeValidator limit", async () => { - let composition: BasketComposition; - beforeEach(async () => { - await runSetup(false, false); - const { bAssets, basketManager } = massetDetails; - composition = await massetMachine.getBasketComposition(massetDetails); - // Expect 4 bAssets with 100 weightings - composition.bAssets.forEach((b) => { - expect(b.vaultBalance).bignumber.eq(new BN(0)); - expect(b.maxWeight).bignumber.eq(simpleToExactAmount(100, 16)); - }); - // Mint 0, 50, 25, 25 of each bAsset, taking total to 100 - await seedWithWeightings(massetDetails, [ - new BN(0), - new BN(50), - new BN(25), - new BN(25), - ]); - // Refactor the weightings to push some overweight - await basketManager.setBasketWeights( - bAssets.map((b) => b.address), - bAssets.map(() => simpleToExactAmount(25, 16)), - { - from: sa.governor, - }, - ); - }); - // minting should work as long as the thing we mint with doesnt exceed max - it("should succeed if bAsset is underweight", async () => { - const { bAssets, mAsset } = massetDetails; - // Assert bAssets are now classed as overweight/underweight - composition = await massetMachine.getBasketComposition(massetDetails); - expect(composition.bAssets[1].overweight).to.eq(true); - - // Should succeed since we would be pushing towards target - const bAsset0 = bAssets[0]; - await assertMintMulti( - massetDetails, - [new BN(1)], - [bAsset0], - sa.default, - sa.default, - true, - ); - // Should fail if we mint with something else that will go over - expect(composition.bAssets[2].overweight).to.eq(false); - const bAsset2 = bAssets[2]; - await massetMachine.approveMasset(bAsset2, mAsset, new BN(2)); - await expectRevert( - mAsset.mintMulti( - [bAsset2.address], - [simpleToExactAmount(2, await bAsset2.decimals())], - sa.default, - ), - "bAssets used in mint cannot exceed their max weight", - ); - }); - }); - context("when there are a large number of bAssets in the basket", async () => { - // Create a basket filled with 16 bAssets, all hooked into the Mock intergation platform - before(async () => { - await runSetup(false); - const { aaveIntegration, basketManager } = massetDetails; - const aaveAddress = await aaveIntegration.platformAddress(); - const mockAave = await MockAave.at(aaveAddress); - // Create 6 new bAssets - for (let i = 0; i < 6; i += 1) { - const mockBasset = await MockERC20.new( - `MKI${i}`, - `MI${i}`, - 18, - sa.default, - 100000000, - ); - const mockAToken = await MockAToken.new(aaveAddress, mockBasset.address); - // Add to the mock aave platform - await mockAave.addAToken(mockAToken.address, mockBasset.address); - // Add the pToken to our integration - await aaveIntegration.setPTokenAddress(mockBasset.address, mockAToken.address, { - from: sa.governor, - }); - // Add the bAsset to the basket - await basketManager.addBasset( - mockBasset.address, - aaveIntegration.address, - false, - { from: sa.governor }, - ); - } - }); - it("should still perform with 10 bAssets in the basket", async () => { - const { basketManager } = massetDetails; - // Assert that we have indeed 10 bAssets - const onChainBassets = await massetMachine.getBassetsInMasset(massetDetails); - expect(onChainBassets.length).to.eq(10); - // Set equal basket weightings - await basketManager.setBasketWeights( - onChainBassets.map((b) => b.addr), - onChainBassets.map(() => simpleToExactAmount(10, 16)), - { from: sa.governor }, - ); - await assertMintMulti( - massetDetails, - onChainBassets.map(() => 10), - onChainBassets.map((b) => b.contract), - ); - }); - }); - context("when the basket manager returns invalid response", async () => { - before(async () => { - await runSetup(); - }); - it("should mint nothing if the preparation returns invalid from manager", async () => { - const { mAsset, forgeValidator } = massetDetails; - // mintSingle - const bAsset = await MockERC20.new("Mock", "MKK", 18, sa.default, 1000); - const newManager = await MockBasketManager1.new(bAsset.address); - const mockMasset = await Masset.new(); - await mockMasset.initialize( - "mMock", - "MK", - systemMachine.nexus.address, - forgeValidator.address, - newManager.address, - ); - await massetMachine.approveMasset(bAsset, mAsset, new BN(1000)); - - const bAssetBalBefore = await bAsset.balanceOf(sa.default); - const mAssetBalBefore = await mockMasset.balanceOf(sa.default); - const mAssetSupplyBefore = await mockMasset.totalSupply(); - - // Should mint nothing due to the forge preparation being invalid - await mockMasset.mintMulti([bAsset.address], [new BN(1)], sa.default); - - const bAssetBalAfter = await bAsset.balanceOf(sa.default); - expect(bAssetBalBefore).bignumber.eq(bAssetBalAfter); - const mAssetBalAfter = await mockMasset.balanceOf(sa.default); - expect(mAssetBalBefore).bignumber.eq(mAssetBalAfter); - const mAssetSupplyAfter = await mockMasset.totalSupply(); - expect(mAssetSupplyBefore).bignumber.eq(mAssetSupplyAfter); - }); - it("should fail if given an invalid integrator", async () => { - const { mAsset, forgeValidator } = massetDetails; - // mintSingle - const bAsset = await MockERC20.new("Mock2", "MKK", 18, sa.default, 1000); - const newManager = await MockBasketManager2.new(bAsset.address); - const mockMasset = await Masset.new(); - await mockMasset.initialize( - "mMock", - "MK", - systemMachine.nexus.address, - forgeValidator.address, - newManager.address, - ); - await massetMachine.approveMasset(bAsset, mAsset, new BN(1000)); - - const bAssetBalBefore = await bAsset.balanceOf(sa.default); - const mAssetBalBefore = await mockMasset.balanceOf(sa.default); - const mAssetSupplyBefore = await mockMasset.totalSupply(); - - // Should revert since we can't just call an invalid integrator - await expectRevert( - mockMasset.mintMulti([bAsset.address], [new BN(1)], sa.default), - "SafeERC20: low-level call failed", - ); - - const bAssetBalAfter = await bAsset.balanceOf(sa.default); - expect(bAssetBalBefore).bignumber.eq(bAssetBalAfter); - const mAssetBalAfter = await mockMasset.balanceOf(sa.default); - expect(mAssetBalBefore).bignumber.eq(mAssetBalAfter); - const mAssetSupplyAfter = await mockMasset.totalSupply(); - expect(mAssetSupplyBefore).bignumber.eq(mAssetSupplyAfter); - }); - it("reverts if the BasketManager is paused", async () => { - const { mAsset, basketManager, bAssets } = massetDetails; - await basketManager.pause({ from: sa.governor }); - expect(await basketManager.paused()).eq(true); - await expectRevert( - mAsset.mintMulti([bAssets[0].address], [new BN(1)], sa.default), - "Pausable: paused", - ); - }); - }); - context("when the mAsset has failed", () => { - before(async () => { - await runSetup(true); - }); - it("should revert any mints", async () => { - const { bAssets, mAsset, basketManager } = massetDetails; - await assertBasketIsHealthy(massetMachine, massetDetails); - await basketManager.setBasket(true, fullScale); - const bAsset0 = bAssets[0]; - - await massetMachine.approveMasset(bAsset0, mAsset, new BN(2)); - await expectRevert( - mAsset.mintMulti([bAsset0.address], [new BN(1)], sa.default), - "Basket must be alive", - ); - }); - }); - context("when the mAsset is undergoing recol", () => { - before(async () => { - await runSetup(true); - }); - it("should revert any mints", async () => { - const { bAssets, mAsset, basketManager } = massetDetails; - await assertBasketIsHealthy(massetMachine, massetDetails); - await basketManager.setRecol(true); - const bAsset0 = bAssets[0]; - - await massetMachine.approveMasset(bAsset0, mAsset, new BN(2)); - await expectRevert( - mAsset.mintMulti([bAsset0.address], [new BN(1)], sa.default), - "No bAssets can be undergoing recol", - ); - }); - }); - }); -}); diff --git a/test/masset/TestMassetRedeemMulti.spec.ts b/test/masset/TestMassetRedeemMulti.spec.ts deleted file mode 100644 index 55c93875..00000000 --- a/test/masset/TestMassetRedeemMulti.spec.ts +++ /dev/null @@ -1,723 +0,0 @@ -/* eslint-disable @typescript-eslint/camelcase */ -/* eslint-disable no-await-in-loop */ - -import { expectEvent, expectRevert } from "@openzeppelin/test-helpers"; -import { assertBasketIsHealthy, assertBNSlightlyGTPercent } from "@utils/assertions"; -import { simpleToExactAmount, applyRatio, applyRatioCeil } from "@utils/math"; -import { MassetDetails, MassetMachine, StandardAccounts, SystemMachine } from "@utils/machines"; -import { BN } from "@utils/tools"; -import { BassetStatus } from "@utils/mstable-objects"; -import { ZERO_ADDRESS, fullScale, ratioScale, ZERO } from "@utils/constants"; -import envSetup from "@utils/env_setup"; -import * as t from "types/generated"; - -const { expect } = envSetup.configure(); - -const MockERC20 = artifacts.require("MockERC20"); -const MockAToken = artifacts.require("MockATokenV2"); -const MockAave = artifacts.require("MockAaveV2"); - -contract("Masset - RedeemMasset", async (accounts) => { - const sa = new StandardAccounts(accounts); - let systemMachine: SystemMachine; - let massetMachine: MassetMachine; - let massetDetails: MassetDetails; - - /** - * @dev (Re)Sets the local variables for this test file - * @param seedBasket Should we add base layer liquidity to the vault? - * @param enableUSDTFee Enable the bAssets with transfer fees? - */ - const runSetup = async (seedBasket = true, enableUSDTFee = false): Promise => { - massetDetails = seedBasket - ? await massetMachine.deployMassetAndSeedBasket(enableUSDTFee) - : await massetMachine.deployMasset(enableUSDTFee); - await assertBasketIsHealthy(massetMachine, massetDetails); - }; - - /** - * @dev Seeds the mAsset basket with custom weightings - * @param md Masset details object containing all deployed contracts - * @param weights Whole numbers of mAsset to mint for each given bAsset - */ - const seedWithWeightings = async ( - md: MassetDetails, - weights: Array, - ): Promise => { - const { mAsset, bAssets } = md; - const approvals = await Promise.all( - bAssets.map((b, i) => massetMachine.approveMasset(b, mAsset, weights[i], sa.default)), - ); - await mAsset.mintMulti( - bAssets.map((b) => b.address), - approvals, - sa.default, - { from: sa.default }, - ); - }; - - const assertFailedRedemption = async ( - mAsset: t.MassetInstance, - amount: BN, - reason: string, - recipient = sa.default, - ): Promise => { - const exactAmount = simpleToExactAmount(amount, 18); - await expectRevert(mAsset.redeemMasset(exactAmount, recipient), reason); - }; - - // Helper to assert basic redemption conditions, e.g. balance before and after - const assertRedemption = async ( - md: MassetDetails, - exactAmount: BN, - recipient: string = sa.default, - sender: string = sa.default, - ignoreHealthAssertions = false, - expectFee = true, - ): Promise => { - const { mAsset, basketManager, bAssets } = md; - - // 1. Assert all state is currently valid and prepare objects - // Assert that the basket is in a healthy state - if (!ignoreHealthAssertions) await assertBasketIsHealthy(massetMachine, md); - - const basketComp = await massetMachine.getBasketComposition(md); - // Get balances before - const senderMassetBalBefore = await mAsset.balanceOf(sender); - const mUSDSupplyBefore = await mAsset.totalSupply(); - // Get arrays of bAsset balances and bAssets - const recipientBassetBalsBefore = await Promise.all( - bAssets.map((b) => b.balanceOf(recipient)), - ); - - // 2. Execute the redemption - const tx = await mAsset.redeemMasset(exactAmount, recipient, { from: sender }); - - // 3. Calculate expected results - // Exact bAssets that should be received based on previous collateral levels - const expectedBassets = await Promise.all( - basketComp.bAssets.map((b) => { - const percentageOfBasket = b.mAssetUnits - .mul(fullScale) - .div(basketComp.sumOfBassets); - return percentageOfBasket - .mul(new BN(exactAmount).mul(new BN(basketComp.colRatio)).div(fullScale)) - .div(fullScale); - }), - ); - const expectedBassetsExact = expectedBassets.map((b, i) => - b.mul(ratioScale).div(new BN(basketComp.bAssets[i].ratio)), - ); - - let fees = bAssets.map(() => new BN(0)); - let feeRate = new BN(0); - - // If there is a fee expected, then deduct it from output - if (expectFee) { - feeRate = await mAsset.redemptionFee(); - expect(feeRate).bignumber.gt(new BN(0) as any); - expect(feeRate).bignumber.lt(fullScale.div(new BN(50)) as any); - fees = expectedBassetsExact.map((b) => b.mul(feeRate).div(fullScale)); - fees.map((f, i) => - expectedBassetsExact[i].gt(new BN(0) as any) - ? expect(f).bignumber.gt(new BN(0) as any) - : null, - ); - } - - // 4. Validate any basic events that should occur - // Listen for the events - await expectEvent(tx.receipt, "RedeemedMasset", { - redeemer: sender, - recipient, - mAssetQuantity: exactAmount, - }); - if (expectFee) { - bAssets.map((b, i) => - fees[i].gt(new BN(0)) - ? expectEvent(tx.receipt, "PaidFee", { - payer: sender, - asset: b.address, - feeQuantity: fees[i], - }) - : null, - ); - } - - // 5. Validate output state - // Sender should have less mAsset - const senderMassetBalAfter = await mAsset.balanceOf(sender); - expect(senderMassetBalAfter).bignumber.eq(senderMassetBalBefore.sub(new BN(exactAmount))); - // Total mUSD supply should be less - const mUSDSupplyAfter = await mAsset.totalSupply(); - expect(mUSDSupplyAfter).bignumber.eq( - mUSDSupplyBefore.sub(new BN(exactAmount)), - "Total mUSD supply should be less", - ); - // Recipient should have more bAsset - const recipientBassetBalsAfter = await Promise.all( - bAssets.map((b) => b.balanceOf(recipient)), - ); - recipientBassetBalsAfter.map((b, i) => { - return expect(b).bignumber.eq( - // Subtract the fee from the returned amount - recipientBassetBalsBefore[i].add(expectedBassetsExact[i]).sub(fees[i]), - `Recipient should have more bAsset[${i}]`, - ); - }); - // Basset payout should always be lte exactAmount in Masset terms - const sumOfRedemption = expectedBassets.reduce((p, c) => p.add(c), new BN(0)); - assertBNSlightlyGTPercent( - new BN(exactAmount).mul(new BN(basketComp.colRatio)).div(fullScale), - sumOfRedemption, - "0.0001", - false, - ); - - // VaultBalance should update for all bAssets - const bAssetsAfter = await Promise.all( - bAssets.map((b) => basketManager.getBasset(b.address)), - ); - bAssetsAfter.map((b, i) => - expect(new BN(b.vaultBalance)).bignumber.eq( - // Full amount including fee should be taken from vaultBalance - new BN(basketComp.bAssets[i].vaultBalance) - .sub(expectedBassetsExact[i]) - .add(fees[i]), - `Vault balance should reduce for bAsset[${i}]`, - ), - ); - - // Complete basket should remain in healthy state - if (!ignoreHealthAssertions) await assertBasketIsHealthy(massetMachine, md); - }; - - /** - * @dev (Re)Sets the local variables for this test file - * @param seedBasket Should we add base layer liquidity to the vault? - * @param enableUSDTFee Enable the bAssets with transfer fees? - */ - before("Init contract", async () => { - systemMachine = new SystemMachine(sa.all); - massetMachine = new MassetMachine(systemMachine); - - await runSetup(); - }); - - context("redeeming some mAssets", () => { - context("when the weights are within the ForgeValidator limit", () => { - context("and sending to a specific recipient", async () => { - before(async () => { - await runSetup(); - }); - it("should fail if recipient is 0x0", async () => { - const { mAsset } = massetDetails; - await assertFailedRedemption( - mAsset, - simpleToExactAmount(1, 18), - "Must be a valid recipient", - ZERO_ADDRESS, - ); - }); - it("should redeem mUSD when recipient is a contract", async () => { - const { basketManager } = massetDetails; - const recipient = basketManager.address; - await assertRedemption(massetDetails, simpleToExactAmount(1, 18), recipient); - }); - it("should redeem mUSD when the recipient is an EOA", async () => { - const recipient = sa.dummy1; - await assertRedemption(massetDetails, simpleToExactAmount(1, 18), recipient); - }); - }); - context("and specifying one mAsset base unit", async () => { - before(async () => { - await runSetup(); - }); - it("should redeem no bAssets due to rounding down", async () => { - const { bAssets, mAsset } = massetDetails; - const recipient = sa.dummy2; - const recipientBassetBalsBefore = await Promise.all( - bAssets.map((b) => b.balanceOf(recipient)), - ); - await mAsset.redeemMasset(new BN(1), recipient); - const recipientBassetBalsAfter = await Promise.all( - bAssets.map((b) => b.balanceOf(recipient)), - ); - recipientBassetBalsAfter.map((b, i) => - expect(b).bignumber.eq(recipientBassetBalsBefore[i]), - ); - }); - }); - context("and there is a non zero redemption fee", async () => { - beforeEach(async () => { - await runSetup(false, false); - // Just mint 100 of everything - await seedWithWeightings(massetDetails, [ - new BN(100), - new BN(100), - new BN(100), - new BN(100), - ]); - }); - it("should take the fee from the redeemed bAssets", async () => { - const { mAsset, bAssets } = massetDetails; - const recipient = sa.dummy1; - const basketComp = await massetMachine.getBasketComposition(massetDetails); - - // Set redemption fee to 1% - await mAsset.setRedemptionFee(simpleToExactAmount(1, 16), { - from: sa.governor, - }); - const recipientBassetBalsBefore = await Promise.all( - bAssets.map((b) => b.balanceOf(recipient)), - ); - const expectedBassetsExact = await Promise.all( - basketComp.bAssets.map((b) => - simpleToExactAmount(10, 18).mul(ratioScale).div(new BN(b.ratio)), - ), - ); - const bAssetFees = expectedBassetsExact.map((b, i) => - b.mul(simpleToExactAmount(1, 16)).div(fullScale), - ); - expect(bAssetFees.reduce((p, c) => p.add(c), new BN(0))).bignumber.gt( - new BN(0) as any, - ); - - await assertRedemption( - massetDetails, - simpleToExactAmount(40, 18), - recipient, - undefined, - undefined, - true, - ); - - const recipientBassetBalsAfter = await Promise.all( - bAssets.map((b) => b.balanceOf(recipient)), - ); - expectedBassetsExact.map((e, i) => - expect(recipientBassetBalsAfter[i]).bignumber.eq( - recipientBassetBalsBefore[i] - .add(expectedBassetsExact[i]) - .sub(bAssetFees[i]), - ), - ); - - const basketCompAfter = await massetMachine.getBasketComposition(massetDetails); - basketCompAfter.bAssets.map((b, i) => - expect(b.vaultBalance).bignumber.eq( - new BN(basketComp.bAssets[i].vaultBalance) - .sub(expectedBassetsExact[i]) - .add(bAssetFees[i]), - ), - ); - }); - }); - context("using bAssets with transfer fees", async () => { - beforeEach(async () => { - await runSetup(true, true); - }); - it("should handle tokens with transfer fees", async () => { - // It should burn the full amount of mAsset, but the fees deducted mean the redeemer receives less - const { mAsset, basketManager } = massetDetails; - await assertBasketIsHealthy(massetMachine, massetDetails); - const exactMassetQuantity = simpleToExactAmount(1, 18); - const recipient = sa.dummy3; - // 1.0 Assert bAsset has fee - const basketComp = await massetMachine.getBasketComposition(massetDetails); - const bAsset = basketComp.bAssets[3]; - const expectedBasset = bAsset.mAssetUnits - .mul(fullScale) - .div(basketComp.sumOfBassets) - .mul(new BN(exactMassetQuantity)) - .div(fullScale); - - expect(bAsset.isTransferFeeCharged).to.eq(true); - // 2.0 Get balances - const totalSupplyBefore = await mAsset.totalSupply(); - const recipientBassetBalBefore = await bAsset.contract.balanceOf(recipient); - expect(recipientBassetBalBefore).bignumber.eq(new BN(0)); - // 3.0 Do the redemption - await mAsset.redeemMasset(exactMassetQuantity, recipient); - // 4.0 Total supply goes down, and recipient bAsset goes up slightly - const recipientBassetBalAfter = await bAsset.contract.balanceOf(recipient); - // Assert that we redeemed gt 99% of the bAsset - assertBNSlightlyGTPercent( - recipientBassetBalBefore.add(expectedBasset), - recipientBassetBalAfter, - "0.3", - true, - ); - // Total supply goes down full amount - const totalSupplyAfter = await mAsset.totalSupply(); - expect(totalSupplyAfter).bignumber.eq( - totalSupplyBefore.sub(exactMassetQuantity), - ); - // VaultBalance should update for this bAsset - const bAssetAfter = await basketManager.getBasset(bAsset.address); - - const feeRate = await mAsset.redemptionFee(); - const fee = expectedBasset.mul(feeRate).div(fullScale); - expect(new BN(bAssetAfter.vaultBalance)).bignumber.eq( - new BN(bAsset.vaultBalance).sub(expectedBasset).add(fee), - ); - // Complete basket should remain in healthy state - await assertBasketIsHealthy(massetMachine, massetDetails); - }); - }); - context("passing invalid arguments", async () => { - before(async () => { - await runSetup(); - }); - it("should revert when 0 quantity", async () => { - await expectRevert( - massetDetails.mAsset.redeemMasset(new BN(0), sa.default), - "Invalid redemption quantity", - ); - }); - it("should fail if sender doesn't have mAsset balance", async () => { - const { mAsset } = massetDetails; - const sender = sa.dummy1; - expect(await mAsset.balanceOf(sender)).bignumber.eq(new BN(0)); - await expectRevert( - massetDetails.mAsset.redeemMasset(new BN(10), sa.default, { from: sender }), - "ERC20: burn amount exceeds balance", - ); - }); - }); - context("performing multiple actions in a row", async () => { - before("reset", async () => { - await runSetup(); - }); - it("should change output proportions with mints/redeems in between", async () => { - const { bAssets, mAsset } = massetDetails; - const recipient = sa.dummy1; - await assertRedemption(massetDetails, simpleToExactAmount(1, 18), recipient); - - const approval0: BN = await massetMachine.approveMasset( - bAssets[0], - mAsset, - new BN(15), - ); - await mAsset.mint(bAssets[0].address, approval0, { from: sa.default }); - await mAsset.redeem(bAssets[3].address, new BN(3), { from: sa.default }); - - await assertRedemption(massetDetails, simpleToExactAmount(4, 18), recipient); - }); - }); - }); - context("when there are affected bAssets in the basket", async () => { - before(async () => { - await runSetup(); - }); - describe("when there are blacklisted", async () => { - it("should fail", async () => { - const { bAssets, mAsset, basketManager } = massetDetails; - const bAsset = bAssets[0]; - await basketManager.setBassetStatus(bAsset.address, BassetStatus.Blacklisted, { - from: sa.governor, - }); - const newBasset = await basketManager.getBasset(bAsset.address); - expect(newBasset.status).to.eq(BassetStatus.Blacklisted.toString()); - await assertFailedRedemption( - mAsset, - new BN(1), - "Basket contains blacklisted bAsset", - sa.default, - ); - }); - }); - describe("when there are broken pegs", async () => { - it("should pass if anything but liquidating", async () => { - const { bAssets, basketManager } = massetDetails; - const bAsset = bAssets[0]; - const bAsset2 = bAssets[2]; - await basketManager.handlePegLoss(bAsset.address, false, { - from: sa.governor, - }); - await basketManager.handlePegLoss(bAsset2.address, true, { - from: sa.governor, - }); - const newBasset = await basketManager.getBasset(bAsset.address); - const newBasset2 = await basketManager.getBasset(bAsset2.address); - expect(newBasset.status).to.eq(BassetStatus.BrokenAbovePeg.toString()); - expect(newBasset2.status).to.eq(BassetStatus.BrokenBelowPeg.toString()); - await assertRedemption( - massetDetails, - simpleToExactAmount(1, 18), - sa.default, - sa.default, - true, - ); - }); - }); - describe("when one is liquidating", async () => { - it("should fail", async () => { - const { bAssets, mAsset, basketManager } = massetDetails; - const bAsset = bAssets[0]; - await basketManager.setBassetStatus(bAsset.address, BassetStatus.Liquidating, { - from: sa.governor, - }); - const newBasset = await basketManager.getBasset(bAsset.address); - expect(newBasset.status).to.eq(BassetStatus.Liquidating.toString()); - await assertFailedRedemption( - mAsset, - new BN(1), - "Basket contains liquidating bAsset", - ); - }); - }); - }); - context("when the basket weights are out of sync", async () => { - context("when some are above", async () => { - beforeEach(async () => { - await runSetup(false); - }); - it("should succeed like normal", async () => { - const { bAssets, basketManager } = massetDetails; - let composition = await massetMachine.getBasketComposition(massetDetails); - // Expect 4 bAssets with 100 weightings - composition.bAssets.forEach((b) => { - expect(b.vaultBalance).bignumber.eq(new BN(0)); - expect(b.maxWeight).bignumber.eq(simpleToExactAmount(100, 16)); - }); - // Mint 25 of each bAsset, taking total to 100% - await seedWithWeightings(massetDetails, [ - new BN(40), - new BN(20), - new BN(20), - new BN(20), - ]); - // Set updated weightings - await basketManager.setBasketWeights( - bAssets.map((b) => b.address), - bAssets.map(() => simpleToExactAmount(30, 16)), - { - from: sa.governor, - }, - ); - composition = await massetMachine.getBasketComposition(massetDetails); - expect(composition.bAssets[0].overweight).to.eq(true); - // Should succeed if we redeem this - await assertRedemption( - massetDetails, - simpleToExactAmount(1, 18), - sa.default, - sa.default, - true, - ); - }); - }); - context("when there is one breached", async () => { - beforeEach(async () => { - await runSetup(false); - }); - it("should succeed regardless", async () => { - const { bAssets, basketManager } = massetDetails; - const composition = await massetMachine.getBasketComposition(massetDetails); - // Expect 4 bAssets with 100 weightings - composition.bAssets.forEach((b) => { - expect(b.vaultBalance).bignumber.eq(new BN(0)); - expect(b.maxWeight).bignumber.eq(simpleToExactAmount(100, 16)); - }); - // Mint 25 of each bAsset, taking total to 100% - await seedWithWeightings(massetDetails, [ - "29.5", // breached given that it's within 1% - new BN(28), - new BN(23), - "19.5", - ]); - // Set updated weightings - await basketManager.setBasketWeights( - bAssets.map((b) => b.address), - bAssets.map(() => simpleToExactAmount(30, 16)), - { - from: sa.governor, - }, - ); - // Should succeed if we redeem this - await assertRedemption( - massetDetails, - simpleToExactAmount(1, 18), - sa.default, - sa.default, - true, - ); - }); - }); - context("when some are 0", async () => { - beforeEach(async () => { - await runSetup(false); - }); - it("should not care about maxweights", async () => { - const { bAssets, basketManager } = massetDetails; - const composition = await massetMachine.getBasketComposition(massetDetails); - // Expect 4 bAssets with 100 weightings - composition.bAssets.forEach((b) => { - expect(b.vaultBalance).bignumber.eq(new BN(0)); - expect(b.maxWeight).bignumber.eq(simpleToExactAmount(100, 16)); - }); - // Mint 25 of each bAsset, taking total to 100% - await seedWithWeightings(massetDetails, [ - new BN(40), - new BN(20), - new BN(20), - new BN(20), - ]); - // Set updated weightings - await basketManager.setBasketWeights( - bAssets.map((b) => b.address), - [ - simpleToExactAmount(40, 16), - simpleToExactAmount(40, 16), - simpleToExactAmount(40, 16), - new BN(0), - ], - { - from: sa.governor, - }, - ); - const bAssetAfter = await basketManager.getBasset(bAssets[3].address); - expect(bAssetAfter.maxWeight).bignumber.eq(new BN(0)); - - // Basset bal before - const recipient = sa.dummy1; - const recipientBassetBalBefore = await bAssets[3].balanceOf(recipient); - - // Should succeed if we redeem this - await assertRedemption( - massetDetails, - simpleToExactAmount(1, 18), - recipient, - sa.default, - true, - ); - - // Total supply goes down, and recipient bAsset goes up slightly - const recipientBassetBalAfter = await bAssets[3].balanceOf(recipient); - // Assert that we redeemed some of this bAsset - expect(recipientBassetBalAfter).bignumber.gt(recipientBassetBalBefore as any); - }); - it("should withdraw 0 if there is 0 collateral", async () => { - const { mAsset } = massetDetails; - await assertFailedRedemption( - mAsset, - new BN(10), - "Nothing in the basket to redeem", - ); - }); - }); - }); - context("when there are a large number of bAssets in the basket", async () => { - // Create a basket filled with 16 bAssets, all hooked into the Mock intergation platform - before(async () => { - await runSetup(false, false); - const { basketManager, aaveIntegration } = massetDetails; - const aaveAddress = await aaveIntegration.platformAddress(); - const mockAave = await MockAave.at(aaveAddress); - // Create 6 new bAssets - for (let i = 0; i < 6; i += 1) { - const mockBasset = await MockERC20.new( - `MKI${i}`, - `MI${i}`, - 18, - sa.default, - 100000000, - ); - const mockAToken = await MockAToken.new(aaveAddress, mockBasset.address); - // Add to the mock aave platform - await mockAave.addAToken(mockAToken.address, mockBasset.address); - // Add the pToken to our integration - await aaveIntegration.setPTokenAddress(mockBasset.address, mockAToken.address, { - from: sa.governor, - }); - // Add the bAsset to the basket - await basketManager.addBasset( - mockBasset.address, - aaveIntegration.address, - false, - { from: sa.governor }, - ); - } - }); - it("should still perform with 10 bAssets in the basket", async () => { - // Assert that we have indeed 10 bAssets - const { basketManager, mAsset } = massetDetails; - const onChainBassets = await massetMachine.getBassetsInMasset(massetDetails); - massetDetails.bAssets = onChainBassets.map((b) => b.contract); - expect(onChainBassets.length).to.eq(10); - // Set equal basket weightings - await basketManager.setBasketWeights( - onChainBassets.map((b) => b.addr), - onChainBassets.map(() => simpleToExactAmount(10, 16)), - { from: sa.governor }, - ); - // Mint 6.25 of each bAsset, taking total to 100% - const approvals = await Promise.all( - onChainBassets.map((b, i) => - massetMachine.approveMasset(b.contract, mAsset, new BN(10), sa.default), - ), - ); - await mAsset.mintMulti( - onChainBassets.map((b) => b.addr), - approvals, - sa.default, - { from: sa.default }, - ); - // Do the redemption - await assertRedemption(massetDetails, simpleToExactAmount(20, 18)); - }); - }); - context("when the mAsset has failed", () => { - beforeEach(async () => { - await runSetup(true); - const { basketManager } = massetDetails; - // Set the colRatio to 80%, which means that the mAsset is undercollateralised - // by 20%. TO compensate, redemption burns higher amount of mAsset, and totalSupply - // passed to the forgevalidator is affected to maintain accurate weightings - await basketManager.setBasket(true, simpleToExactAmount(8, 17)); - }); - it("should still allow redemption, apply the colRatio effectively", async () => { - const { basketManager } = massetDetails; - // should return less than a whole mAsset - const basket = await basketManager.getBasket(); - expect(basket.failed).eq(true); - await assertRedemption( - massetDetails, - simpleToExactAmount(1, 18), - sa.default, - sa.default, - true, - ); - const comp = await massetMachine.getBasketComposition(massetDetails); - expect(comp.sumOfBassets).bignumber.gte(comp.totalSupply as any); - }); - }); - context("when the mAsset is undergoing recol", () => { - beforeEach(async () => { - await runSetup(true); - }); - it("should block redemption", async () => { - const { mAsset, basketManager } = massetDetails; - await assertBasketIsHealthy(massetMachine, massetDetails); - await basketManager.setRecol(true); - await assertFailedRedemption( - mAsset, - new BN(1), - "No bAssets can be undergoing recol", - ); - }); - }); - context("when the BasketManager is paused", () => { - beforeEach(async () => { - await runSetup(true); - }); - it("should block redemption", async () => { - const { mAsset, basketManager } = massetDetails; - await assertBasketIsHealthy(massetMachine, massetDetails); - await basketManager.pause({ from: sa.governor }); - await assertFailedRedemption(mAsset, new BN(1), "Pausable: paused"); - }); - }); - }); -}); diff --git a/test/masset/TestMassetRedemption.spec.ts b/test/masset/TestMassetRedemption.spec.ts deleted file mode 100644 index a60256bb..00000000 --- a/test/masset/TestMassetRedemption.spec.ts +++ /dev/null @@ -1,1745 +0,0 @@ -/* eslint-disable @typescript-eslint/camelcase */ -/* eslint-disable no-await-in-loop */ - -import { expectEvent, expectRevert } from "@openzeppelin/test-helpers"; -import { assertBasketIsHealthy, assertBNSlightlyGTPercent } from "@utils/assertions"; -import { simpleToExactAmount, applyRatio, applyRatioCeil } from "@utils/math"; -import { MassetDetails, MassetMachine, StandardAccounts, SystemMachine } from "@utils/machines"; -import { BN } from "@utils/tools"; -import { BassetStatus } from "@utils/mstable-objects"; -import { ZERO_ADDRESS, fullScale, ratioScale } from "@utils/constants"; -import envSetup from "@utils/env_setup"; -import * as t from "types/generated"; - -const { expect } = envSetup.configure(); - -const MockBasketManager1 = artifacts.require("MockBasketManager1"); -const MockERC20 = artifacts.require("MockERC20"); -const MockAToken = artifacts.require("MockATokenV2"); -const MockAave = artifacts.require("MockAaveV2"); -const AaveIntegration = artifacts.require("AaveIntegration"); - -const Masset = artifacts.require("Masset"); - -contract("Masset - Redeem", async (accounts) => { - const sa = new StandardAccounts(accounts); - let systemMachine: SystemMachine; - let massetMachine: MassetMachine; - let massetDetails: MassetDetails; - - /** - * @dev (Re)Sets the local variables for this test file - * @param seedBasket Should we add base layer liquidity to the vault? - * @param enableUSDTFee Enable the bAssets with transfer fees? - */ - const runSetup = async (seedBasket = true, enableUSDTFee = false): Promise => { - massetDetails = seedBasket - ? await massetMachine.deployMassetAndSeedBasket(enableUSDTFee) - : await massetMachine.deployMasset(enableUSDTFee); - await assertBasketIsHealthy(massetMachine, massetDetails); - }; - - /** - * @dev Seeds the mAsset basket with custom weightings - * @param md Masset details object containing all deployed contracts - * @param weights Whole numbers of mAsset to mint for each given bAsset - */ - const seedWithWeightings = async ( - md: MassetDetails, - weights: Array, - ): Promise => { - const { mAsset, bAssets } = md; - const approvals = await Promise.all( - bAssets.map((b, i) => massetMachine.approveMasset(b, mAsset, weights[i], sa.default)), - ); - await mAsset.mintMulti( - bAssets.map((b) => b.address), - approvals, - sa.default, - { from: sa.default }, - ); - }; - - const assertFailedRedemption = async ( - mAsset: t.MassetInstance, - bAsset: t.MockERC20Instance, - amount: BN, - reason: string, - ): Promise => { - const bAssetDecimals: BN = await bAsset.decimals(); - // let decimalDifference: BN = bAssetDecimals.sub(new BN(18)); - const exactAmount = simpleToExactAmount(amount, bAssetDecimals.toNumber()); - await expectRevert(mAsset.redeem(bAsset.address, exactAmount), reason); - }; - - // Helper to assert basic redemption conditions, e.g. balance before and after - const assertBasicRedemption = async ( - md: MassetDetails, - bAssetRedeemAmount: BN | number, - bAsset: t.MockERC20Instance, - expectFee = true, - useRedeemTo = false, - recipient: string = sa.default, - sender: string = sa.default, - ignoreHealthAssertions = false, - ): Promise => { - const { mAsset, basketManager } = md; - if (!ignoreHealthAssertions) await assertBasketIsHealthy(massetMachine, md); - - // Get balances before - const senderMassetBalBefore = await mAsset.balanceOf(sender); - const mUSDSupplyBefore = await mAsset.totalSupply(); - const derivedRecipient = useRedeemTo ? recipient : sender; - const recipientBassetBalBefore = await bAsset.balanceOf(derivedRecipient); - const bAssetBefore = await massetMachine.getBasset(basketManager, bAsset.address); - const bAssetDecimals = await bAsset.decimals(); - const bAssetExact = simpleToExactAmount(bAssetRedeemAmount, bAssetDecimals); - const surplusBefore = await mAsset.surplus(); - - const integratorBalBefore = await bAssetBefore.contract.balanceOf( - bAssetBefore.integrator.address, - ); - - let fee = new BN(0); - let scaledFee = new BN(0); - let feeRate = new BN(0); - // If there is a fee expected, then deduct it from output - if (expectFee) { - feeRate = await mAsset.swapFee(); - expect(feeRate).bignumber.gt(new BN(0) as any); - expect(feeRate).bignumber.lt(fullScale.div(new BN(50)) as any); - fee = bAssetExact.mul(feeRate).div(fullScale); - expect(fee).bignumber.gt(new BN(0) as any); - scaledFee = fee.mul(new BN(bAssetBefore.ratio)).div(ratioScale); - } - - const platformInteraction = await massetMachine.getPlatformInteraction( - mAsset, - "withdrawal", - bAssetExact.sub(fee), - integratorBalBefore, - bAssetBefore, - ); - - // Execute the redemption - const tx = useRedeemTo - ? await mAsset.redeemTo(bAsset.address, bAssetExact, derivedRecipient) - : await mAsset.redeem(bAsset.address, bAssetExact); - - // Calc mAsset burn amounts based on bAsset quantities - const mAssetQuantity = applyRatio(bAssetExact, bAssetBefore.ratio); - - // Listen for the events - await expectEvent(tx.receipt, "Redeemed", { - redeemer: sender, - recipient: derivedRecipient, - mAssetQuantity, - bAssets: [bAsset.address], - }); - if (expectFee) { - expectEvent(tx.receipt, "PaidFee", { - payer: sender, - asset: bAsset.address, - feeQuantity: fee, - }); - } - // - Withdraws from lending platform - const emitter = await AaveIntegration.new(); - if (platformInteraction.expectInteraction) { - await expectEvent.inTransaction(tx.tx, emitter, "PlatformWithdrawal", { - bAsset: bAsset.address, - totalAmount: platformInteraction.amount, - userAmount: bAssetExact.sub(fee), - }); - } else { - await expectEvent.inTransaction(tx.tx, emitter, "Withdrawal", { - _bAsset: bAsset.address, - _amount: bAssetExact.sub(fee), - }); - } - // VaultBalance should line up - const integratorBalAfter = await bAssetBefore.contract.balanceOf( - bAssetBefore.integrator.address, - ); - expect(integratorBalAfter).bignumber.eq(platformInteraction.rawBalance); - // Sender should have less mAsset - const senderMassetBalAfter = await mAsset.balanceOf(sender); - expect(senderMassetBalAfter).bignumber.eq(senderMassetBalBefore.sub(mAssetQuantity)); - // Total mUSD supply should be less - const mUSDSupplyAfter = await mAsset.totalSupply(); - expect(mUSDSupplyAfter).bignumber.eq(mUSDSupplyBefore.sub(mAssetQuantity)); - // Recipient should have more bAsset, minus fee - const recipientBassetBalAfter = await bAsset.balanceOf(derivedRecipient); - expect(recipientBassetBalAfter).bignumber.eq( - recipientBassetBalBefore.add(bAssetExact).sub(fee), - ); - // VaultBalance should update for this bAsset, including fee - const bAssetAfter = await basketManager.getBasset(bAsset.address); - // 100, 0.6 - // 1000-(100-0.6) = 1000-(99.4) = 900.6 - expect(new BN(bAssetAfter.vaultBalance)).bignumber.eq( - new BN(bAssetBefore.vaultBalance).sub(bAssetExact.sub(fee)), - ); - const surplusAfter = await mAsset.surplus(); - expect(new BN(surplusAfter)).bignumber.eq(new BN(surplusBefore).add(scaledFee)); - - // Complete basket should remain in healthy state - if (!ignoreHealthAssertions) await assertBasketIsHealthy(massetMachine, md); - }; - - // Helper to assert basic redemption conditions, i.e. balance before and after - const assertRedeemMulti = async ( - md: MassetDetails, - bAssetRedeemAmounts: Array, - bAssets: Array, - expectFee = true, - recipient: string = sa.default, - sender: string = sa.default, - ignoreHealthAssertions = false, - ): Promise => { - const { mAsset, basketManager } = md; - if (!ignoreHealthAssertions) await assertBasketIsHealthy(massetMachine, md); - - // Get balances before - const senderMassetBalBefore = await mAsset.balanceOf(sender); - const mUSDSupplyBefore = await mAsset.totalSupply(); - // Get arrays of bAsset balances and bAssets - const recipientBassetBalsBefore = await Promise.all( - bAssets.map((b) => b.balanceOf(recipient)), - ); - const bAssetsBefore = await Promise.all( - bAssets.map((b) => massetMachine.getBasset(basketManager, b.address)), - ); - const bAssetsDecimals = await Promise.all(bAssets.map((b) => b.decimals())); - const bAssetsExact = await Promise.all( - bAssets.map((_, i) => simpleToExactAmount(bAssetRedeemAmounts[i], bAssetsDecimals[i])), - ); - const surplusBefore = await mAsset.surplus(); - - // Execute the redemption - const tx = await mAsset.redeemMulti( - bAssets.map((b) => b.address), - bAssetsExact, - recipient, - { from: sender }, - ); - - // Calc mAsset burn amounts based on bAsset quantities - const mAssetQuantity = bAssetsExact.reduce( - (p, c, i) => p.add(applyRatio(c, bAssetsBefore[i].ratio)), - new BN(0), - ); - let fees = bAssets.map(() => new BN(0)); - let scaledFees = bAssets.map(() => new BN(0)); - let feeRate = new BN(0); - // If there is a fee expected, then deduct it from output - if (expectFee) { - feeRate = await mAsset.swapFee(); - expect(feeRate).bignumber.gt(new BN(0) as any); - expect(feeRate).bignumber.lt(fullScale.div(new BN(50)) as any); - fees = bAssetsExact.map((b) => b.mul(feeRate).div(fullScale)); - fees.map((f, i) => - bAssetsExact[i].gt(new BN(0) as any) - ? expect(f).bignumber.gt(new BN(0) as any) - : null, - ); - scaledFees = fees.map((f, i) => f.mul(new BN(bAssetsBefore[i].ratio)).div(ratioScale)); - } - - // Listen for the events - await expectEvent(tx.receipt, "Redeemed", { - redeemer: sender, - recipient, - mAssetQuantity, - bAssets: bAssets.map((b) => b.address), - }); - if (expectFee) { - bAssets.map((b, i) => - fees[i].gt(new BN(0)) - ? expectEvent(tx.receipt, "PaidFee", { - payer: sender, - asset: b.address, - feeQuantity: fees[i], - }) - : null, - ); - } - const surplusAfter = await mAsset.surplus(); - expect(new BN(surplusAfter)).bignumber.eq( - new BN(surplusBefore).add(scaledFees.reduce((p, c) => p.add(c), new BN(0))), - ); - - // Sender should have less mAsset - const senderMassetBalAfter = await mAsset.balanceOf(sender); - expect(senderMassetBalAfter).bignumber.eq(senderMassetBalBefore.sub(mAssetQuantity)); - // Total mUSD supply should be less - const mUSDSupplyAfter = await mAsset.totalSupply(); - expect(mUSDSupplyAfter).bignumber.eq(mUSDSupplyBefore.sub(mAssetQuantity)); - // Recipient should have more bAsset - const recipientBassetBalsAfter = await Promise.all( - bAssets.map((b) => b.balanceOf(recipient)), - ); - recipientBassetBalsAfter.map((b, i) => - expect(b).bignumber.eq(recipientBassetBalsBefore[i].add(bAssetsExact[i]).sub(fees[i])), - ); - // VaultBalance should update for this bAsset - const bAssetsAfter = await Promise.all( - bAssets.map((b) => basketManager.getBasset(b.address)), - ); - bAssetsAfter.map((b, i) => - expect(new BN(b.vaultBalance)).bignumber.eq( - new BN(bAssetsBefore[i].vaultBalance).sub(bAssetsExact[i]).add(fees[i]), - ), - ); - - // Complete basket should remain in healthy state - if (!ignoreHealthAssertions) await assertBasketIsHealthy(massetMachine, md); - }; - - /** - * @dev (Re)Sets the local variables for this test file - * @param seedBasket Should we add base layer liquidity to the vault? - * @param enableUSDTFee Enable the bAssets with transfer fees? - */ - before("Init contract", async () => { - systemMachine = new SystemMachine(sa.all); - massetMachine = new MassetMachine(systemMachine); - - await runSetup(); - }); - - describe("redeeming with a single bAsset", () => { - context("when the weights are within the ForgeValidator limit", () => { - context("and sending to a specific recipient", async () => { - before(async () => { - await runSetup(); - }); - it("should fail if recipient is 0x0", async () => { - await expectRevert( - massetDetails.mAsset.redeemTo( - massetDetails.bAssets[0].address, - new BN(1), - ZERO_ADDRESS, - ), - "Must be a valid recipient", - ); - }); - it("should send mUSD when recipient is a contract", async () => { - const { bAssets } = massetDetails; - const recipient = massetDetails.forgeValidator.address; - await assertBasicRedemption( - massetDetails, - new BN(1), - bAssets[0], - true, - true, - recipient, - ); - }); - it("should send mUSD when the recipient is an EOA", async () => { - const { bAssets } = massetDetails; - const recipient = sa.dummy1; - await assertBasicRedemption( - massetDetails, - new BN(1), - bAssets[1], - true, - true, - recipient, - ); - }); - }); - context("and not defining recipient", async () => { - before(async () => { - await runSetup(); - }); - it("should redeem to sender in basic redeem func", async () => { - const { bAssets } = massetDetails; - await assertBasicRedemption(massetDetails, new BN(1), bAssets[1], true); - }); - }); - context("and specifying one bAsset base unit", async () => { - before(async () => { - await runSetup(); - }); - it("should redeem a higher q of mAsset base units when using bAsset with 12", async () => { - const { bAssets, mAsset } = massetDetails; - const bAsset = bAssets[0]; - // bAsset has 12 dp - const decimals = await bAsset.decimals(); - expect(decimals).bignumber.eq(new BN(12)); - - const totalSupplyBefore = await mAsset.totalSupply(); - const recipientBassetBalBefore = await bAsset.balanceOf(sa.default); - - const tx = await mAsset.redeem(bAsset.address, new BN(1)); - const expectedMasset = new BN(1000000); - await expectEvent(tx.receipt, "Redeemed", { - mAssetQuantity: expectedMasset, - bAssets: [bAsset.address], - }); - - const recipientBassetBalAfter = await bAsset.balanceOf(sa.default); - expect(recipientBassetBalAfter).bignumber.eq(recipientBassetBalBefore.addn(1)); - // Sender should have less mASset after - const totalSupplyAfter = await mAsset.totalSupply(); - expect(totalSupplyAfter).bignumber.eq(totalSupplyBefore.sub(new BN(1000000))); - // Complete basket should remain in healthy state - await assertBasketIsHealthy(massetMachine, massetDetails); - }); - }); - - context("and the feeRate changes", async () => { - before(async () => { - await runSetup(); - }); - it("should deduct the suitable fee", async () => { - const { bAssets, mAsset, basketManager } = massetDetails; - const bAsset = bAssets[0]; - const bAssetBefore = await basketManager.getBasset(bAsset.address); - // Set a new fee recipient - const newFee = simpleToExactAmount("5.234234", 15); - await mAsset.setSwapFee(newFee, { from: sa.governor }); - - // Calc mAsset burn amounts based on bAsset quantities - const bAssetQuantity = simpleToExactAmount(new BN(1), await bAsset.decimals()); - const mAssetQuantity = applyRatio(bAssetQuantity, bAssetBefore.ratio); - const bAssetFee = bAssetQuantity.mul(newFee).div(fullScale); - const massetBalBefore = await mAsset.balanceOf(sa.default); - const bassetBalBefore = await bAsset.balanceOf(sa.default); - // Run the redemption - await assertBasicRedemption(massetDetails, new BN(1), bAsset); - const massetBalAfter = await mAsset.balanceOf(sa.default); - const bassetBalAfter = await bAsset.balanceOf(sa.default); - // Assert balance increase - expect(massetBalAfter).bignumber.eq(massetBalBefore.sub(mAssetQuantity)); - expect(bassetBalAfter).bignumber.eq( - bassetBalBefore.add(bAssetQuantity).sub(bAssetFee), - ); - }); - it("should deduct nothing if the fee is 0", async () => { - const { bAssets, mAsset, basketManager } = massetDetails; - const bAsset = bAssets[0]; - const bAssetBefore = await basketManager.getBasset(bAsset.address); - // Set a new fee recipient - const newFee = new BN(0); - await mAsset.setSwapFee(newFee, { from: sa.governor }); - - // Calc mAsset burn amounts based on bAsset quantities - const bAssetQuantity = simpleToExactAmount(new BN(1), await bAsset.decimals()); - const mAssetQuantity = applyRatio(bAssetQuantity, bAssetBefore.ratio); - const massetBalBefore = await mAsset.balanceOf(sa.default); - const bassetBalBefore = await bAsset.balanceOf(sa.default); - // Run the redemption - await assertBasicRedemption(massetDetails, new BN(1), bAsset, false); - const massetBalAfter = await mAsset.balanceOf(sa.default); - const bassetBalAfter = await bAsset.balanceOf(sa.default); - // Assert balance increase - expect(massetBalAfter).bignumber.eq(massetBalBefore.sub(mAssetQuantity)); - expect(bassetBalAfter).bignumber.eq(bassetBalBefore.add(bAssetQuantity)); - }); - }); - context("and there is insufficient bAsset in the basket", async () => { - before(async () => { - await runSetup(); - }); - it("should throw if we request more than in vault", async () => { - const { bAssets, mAsset, basketManager } = massetDetails; - const bAsset = bAssets[0]; - // bAsset has 12 dp - const bAssetBefore = await basketManager.getBasset(bAsset.address); - const bAssetVault = new BN(bAssetBefore.vaultBalance); - const bAssetRedeemAmount = bAssetVault.add(new BN(1)); - - await assertFailedRedemption( - mAsset, - bAsset, - bAssetRedeemAmount, - "Cannot redeem more bAssets than are in the vault", - ); - }); - }); - context("using bAssets with transfer fees", async () => { - beforeEach(async () => { - await runSetup(true, true); - }); - it("should handle tokens with transfer fees", async () => { - // It should burn the full amount of mAsset, but the fees deducted mean the redeemer receives less - const { bAssets, mAsset, basketManager } = massetDetails; - await assertBasketIsHealthy(massetMachine, massetDetails); - const recipient = sa.dummy3; - // 1.0 Assert bAsset has fee - const bAsset = bAssets[3]; - const bAssetDecimals = await bAsset.decimals(); - const oneBasset = simpleToExactAmount(1, bAssetDecimals); - const bAssetBefore = await basketManager.getBasset(bAsset.address); - expect(bAssetBefore.isTransferFeeCharged).to.eq(true); - - // 2.0 Get balances - const totalSupplyBefore = await mAsset.totalSupply(); - const recipientBassetBalBefore = await bAsset.balanceOf(recipient); - expect(recipientBassetBalBefore).bignumber.eq(new BN(0)); - - // 3.0 Do the redemption - const tx = await mAsset.redeemTo(bAsset.address, oneBasset, recipient); - const expectedMassetQuantity = applyRatio(oneBasset, bAssetBefore.ratio); - const feeRate = await mAsset.swapFee(); - const bAssetFee = oneBasset.mul(feeRate).div(fullScale); - expectEvent(tx.receipt, "Redeemed", { - mAssetQuantity: expectedMassetQuantity, - bAssets: [bAsset.address], - }); - // 4.0 Total supply goes down, and recipient bAsset goes up slightly - const recipientBassetBalAfter = await bAsset.balanceOf(recipient); - // Assert that we redeemed gt 99% of the bAsset - assertBNSlightlyGTPercent( - recipientBassetBalBefore.add(oneBasset.sub(bAssetFee)), - recipientBassetBalAfter, - "0.4", - true, - ); - // Total supply goes down full amount - const totalSupplyAfter = await mAsset.totalSupply(); - expect(totalSupplyAfter).bignumber.eq( - totalSupplyBefore.sub(expectedMassetQuantity), - ); - // VaultBalance should update for this bAsset - const bAssetAfter = await basketManager.getBasset(bAsset.address); - expect(new BN(bAssetAfter.vaultBalance)).bignumber.eq( - new BN(bAssetBefore.vaultBalance).sub(oneBasset).add(bAssetFee), - ); - // Complete basket should remain in healthy state - await assertBasketIsHealthy(massetMachine, massetDetails); - }); - it("should send less output to user if fee unexpected", async () => { - // It should burn the full amount of mAsset, but the fees deducted mean the redeemer receives less - const { bAssets, mAsset, basketManager } = massetDetails; - await assertBasketIsHealthy(massetMachine, massetDetails); - const recipient = sa.dummy3; - // 1.0 Assert bAsset has fee - const bAsset = bAssets[3]; - const basket = await massetMachine.getBasketComposition(massetDetails); - const bAssetDecimals = await bAsset.decimals(); - const oneBasset = simpleToExactAmount(1, bAssetDecimals); - const feeRate = await mAsset.swapFee(); - const bAssetFee = oneBasset.mul(feeRate).div(fullScale); - expect(basket.bAssets[3].isTransferFeeCharged).to.eq(true); - await basketManager.setTransferFeesFlag(bAsset.address, false, { - from: sa.governor, - }); - - const recipientBassetBalBefore = await bAsset.balanceOf(recipient); - await mAsset.redeemTo(bAsset.address, oneBasset, recipient); - // 4.0 Total supply goes down, and recipient bAsset goes up slightly - const recipientBassetBalAfter = await bAsset.balanceOf(recipient); - // Assert that we redeemed gt 99% of the bAsset - assertBNSlightlyGTPercent( - recipientBassetBalBefore.add(oneBasset.sub(bAssetFee)), - recipientBassetBalAfter, - "0.4", - true, - ); - }); - }); - context("passing invalid arguments", async () => { - before(async () => { - await runSetup(); - }); - it("should revert when 0 quantity", async () => { - const bAsset = massetDetails.bAssets[0]; - await expectRevert( - massetDetails.mAsset.redeem(bAsset.address, new BN(0)), - "Must redeem some bAssets", - ); - }); - it("should fail if sender doesn't have mAsset balance", async () => { - const { bAssets, mAsset } = massetDetails; - const bAsset = bAssets[0]; - const sender = sa.dummy1; - expect(await mAsset.balanceOf(sender)).bignumber.eq(new BN(0)); - await expectRevert( - mAsset.redeem(bAsset.address, new BN(1), { from: sender }), - "ERC20: burn amount exceeds balance", - ); - }); - it("should fail if the bAsset does not exist", async () => { - const bAsset = await MockERC20.new("Mock", "MKK", 18, sa.default, 1000); - await expectRevert( - massetDetails.mAsset.redeem(bAsset.address, new BN(100)), - "bAsset must exist", - ); - }); - }); - context("with an affected bAsset", async () => { - before(async () => { - await runSetup(); - }); - it("should fail if bAsset is broken above peg", async () => { - const { bAssets, mAsset, basketManager } = massetDetails; - await assertBasketIsHealthy(massetMachine, massetDetails); - const bAsset = bAssets[0]; - await basketManager.handlePegLoss(bAsset.address, false, { - from: sa.governor, - }); - const newBasset = await basketManager.getBasset(bAsset.address); - expect(newBasset.status).to.eq(BassetStatus.BrokenAbovePeg.toString()); - await expectRevert( - mAsset.redeem(bAsset.address, new BN(1)), - "Must redeem proportionately", - ); - }); - it("should fail if any bAsset in basket is broken below peg", async () => { - const { bAssets, mAsset, basketManager } = massetDetails; - await assertBasketIsHealthy(massetMachine, massetDetails); - const bAsset = bAssets[1]; - await basketManager.setBassetStatus( - bAsset.address, - BassetStatus.BrokenBelowPeg, - ); - const newBasset = await basketManager.getBasset(bAsset.address); - expect(newBasset.status).to.eq(BassetStatus.BrokenBelowPeg.toString()); - await expectRevert( - mAsset.redeem(bAsset.address, new BN(1)), - "Must redeem proportionately", - ); - }); - it("should fail if any bAsset in basket is liquidating or blacklisted", async () => { - const { bAssets, mAsset, basketManager } = massetDetails; - await assertBasketIsHealthy(massetMachine, massetDetails); - const bAsset = bAssets[2]; - await basketManager.setBassetStatus(bAsset.address, BassetStatus.Liquidating); - const newBasset = await basketManager.getBasset(bAsset.address); - expect(newBasset.status).to.eq(BassetStatus.Liquidating.toString()); - await expectRevert( - mAsset.redeem(bAsset.address, new BN(1)), - "Must redeem proportionately", - ); - }); - }); - context("when the bAsset ratio needs to be ceil", async () => { - before(async () => { - await runSetup(true, false); - }); - it("should burn an extra base unit of mAsset per bAsset unit", async () => { - const { bAssets, mAsset, basketManager } = massetDetails; - const bAsset = bAssets[0]; - const bAssetDecimals = await bAsset.decimals(); - const oneBaseUnit = new BN(1); - const mUSDSupplyBefore = await mAsset.totalSupply(); - // Update ratio - const baseRatio = new BN(10).pow(new BN(18).sub(bAssetDecimals)); - const ratio = new BN(baseRatio).mul(new BN(100000001)); - await basketManager.setBassetRatio(bAsset.address, ratio); - // Calc mAsset burn amounts based on bAsset quantities - const mAssetQuantity = applyRatio(oneBaseUnit, ratio); - const mAssetQuantityCeil = applyRatioCeil(oneBaseUnit, ratio); - expect(mAssetQuantityCeil).bignumber.eq(mAssetQuantity.add(new BN(1))); - - // Send the TX - const tx = await mAsset.redeem(bAsset.address, oneBaseUnit); - - // Listen for the events - await expectEvent(tx.receipt, "Redeemed", { - mAssetQuantity: mAssetQuantityCeil, - bAssets: [bAsset.address], - }); - // Total mUSD supply should be less - const mUSDSupplyAfter = await mAsset.totalSupply(); - expect(mUSDSupplyAfter).bignumber.eq(mUSDSupplyBefore.sub(mAssetQuantityCeil)); - }); - }); - context("performing multiple redemptions in a row", async () => { - before("reset", async () => { - await runSetup(); - }); - it("should redeem with single bAsset", async () => { - const { bAssets, mAsset } = massetDetails; - const oneMasset = simpleToExactAmount(1, 18); - const mUSDSupplyBefore = await mAsset.totalSupply(); - - await Promise.all( - bAssets.map(async (b) => { - const bAssetDecimals = await b.decimals(); - const bAssetWhole = simpleToExactAmount(new BN(1), bAssetDecimals); - - return mAsset.redeem(b.address, bAssetWhole, { - from: sa.default, - }); - }), - ); - - const mUSDSupplyAfter = await mAsset.totalSupply(); - expect(mUSDSupplyAfter).bignumber.eq( - mUSDSupplyBefore.sub(new BN(bAssets.length).mul(oneMasset)), - ); - }); - }); - }); - - context("when the basket weights are out of sync", async () => { - context("when some are above", async () => { - beforeEach(async () => { - await runSetup(false); - }); - it("should succeed if we redeem all overweight bAssets, and fail otherwise", async () => { - const { bAssets, mAsset, basketManager } = massetDetails; - let composition = await massetMachine.getBasketComposition(massetDetails); - // Expect 4 bAssets with 100 weightings - composition.bAssets.forEach((b) => { - expect(b.vaultBalance).bignumber.eq(new BN(0)); - expect(b.maxWeight).bignumber.eq(simpleToExactAmount(100, 16)); - }); - // Mint 25 of each bAsset, taking total to 100% - await seedWithWeightings(massetDetails, [ - new BN(40), - new BN(20), - new BN(20), - new BN(20), - ]); - // Set updated weightings - await basketManager.setBasketWeights( - bAssets.map((b) => b.address), - bAssets.map(() => simpleToExactAmount(30, 16)), - { - from: sa.governor, - }, - ); - composition = await massetMachine.getBasketComposition(massetDetails); - expect(composition.bAssets[0].overweight).to.eq(true); - // Should succeed if we redeem this - let bAsset = bAssets[0]; - let bAssetDecimals = await bAsset.decimals(); - const totalSupplyBefore = await mAsset.totalSupply(); - await mAsset.redeem(bAsset.address, simpleToExactAmount(2, bAssetDecimals)); - const totalSupplyAfter = await mAsset.totalSupply(); - expect(totalSupplyAfter).bignumber.eq( - totalSupplyBefore.sub(simpleToExactAmount(2, 18)), - ); - // Should fail if we redeem anything but the overweight bAsset - /* eslint-disable-next-line prefer-destructuring */ - bAsset = bAssets[1]; - bAssetDecimals = await bAsset.decimals(); - await expectRevert( - mAsset.redeem(bAsset.address, simpleToExactAmount(1, bAssetDecimals)), - "Must redeem overweight bAssets", - ); - }); - it("should fail if there are multiple bAssets over", async () => { - const { bAssets, mAsset, basketManager } = massetDetails; - let composition = await massetMachine.getBasketComposition(massetDetails); - // Expect 4 bAssets with 100 weightings - composition.bAssets.forEach((b) => { - expect(b.vaultBalance).bignumber.eq(new BN(0)); - expect(b.maxWeight).bignumber.eq(simpleToExactAmount(100, 16)); - }); - // Mint 25 of each bAsset, taking total to 100% - await seedWithWeightings(massetDetails, [ - new BN(40), - new BN(20), - new BN(20), - new BN(40), - ]); - // Set updated weightings - await basketManager.setBasketWeights( - bAssets.map((b) => b.address), - bAssets.map(() => simpleToExactAmount(30, 16)), - { - from: sa.governor, - }, - ); - composition = await massetMachine.getBasketComposition(massetDetails); - expect(composition.bAssets[0].overweight).to.eq(true); - // Should succeed if we redeem this - const bAsset = bAssets[0]; - const bAssetDecimals = await bAsset.decimals(); - await expectRevert( - mAsset.redeem(bAsset.address, simpleToExactAmount(1, bAssetDecimals)), - "Redemption must contain all overweight bAssets", - ); - }); - it("should fail if redeeming overweight bAsset causes another to go overweight", async () => { - const { bAssets, mAsset, basketManager } = massetDetails; - let composition = await massetMachine.getBasketComposition(massetDetails); - // Expect 4 bAssets with 100 weightings - composition.bAssets.forEach((b) => { - expect(b.vaultBalance).bignumber.eq(new BN(0)); - expect(b.maxWeight).bignumber.eq(simpleToExactAmount(100, 16)); - }); - // Mint 25 of each bAsset, taking total to 100% - await seedWithWeightings(massetDetails, [ - new BN(31), - new BN(28), - new BN(21), - new BN(22), - ]); - // Set updated weightings - await basketManager.setBasketWeights( - bAssets.map((b) => b.address), - bAssets.map(() => simpleToExactAmount(30, 16)), - { - from: sa.governor, - }, - ); - composition = await massetMachine.getBasketComposition(massetDetails); - expect(composition.bAssets[0].overweight).to.eq(true); - // Should succeed if we redeem this - const bAsset = bAssets[0]; - const bAssetDecimals = await bAsset.decimals(); - await expectRevert( - mAsset.redeem(bAsset.address, simpleToExactAmount(10, bAssetDecimals)), - "bAssets must remain below max weight", - ); - }); - }); - context("when there is one breached", async () => { - beforeEach(async () => { - await runSetup(false); - }); - it("should allow redemption as long as nothing goes overweight", async () => { - const { bAssets, mAsset, basketManager } = massetDetails; - const composition = await massetMachine.getBasketComposition(massetDetails); - // Expect 4 bAssets with 100 weightings - composition.bAssets.forEach((b) => { - expect(b.vaultBalance).bignumber.eq(new BN(0)); - expect(b.maxWeight).bignumber.eq(simpleToExactAmount(100, 16)); - }); - // Mint some of each bAsset, taking total to 100% - await seedWithWeightings(massetDetails, [ - "29.5", // breached given that it's within 1% - new BN(28), - new BN(23), - "19.5", - ]); - // Set updated weightings - await basketManager.setBasketWeights( - bAssets.map((b) => b.address), - bAssets.map(() => simpleToExactAmount(30, 16)), - { - from: sa.governor, - }, - ); - // Should succeed if we redeem this - const bAsset = bAssets[0]; - const bAssetDecimals = await bAsset.decimals(); - await assertBasicRedemption(massetDetails, 2, bAsset, true); - // 30% * 93 = 27.8, meaning bAssets[1] is now overweight - await expectRevert( - mAsset.redeem(bAsset.address, simpleToExactAmount(5, bAssetDecimals)), - "bAssets must remain below max weight", - ); - }); - }); - context("if the redemption would push another overweight", async () => { - beforeEach(async () => { - await runSetup(false); - }); - it("should fail if any bAsset goes over", async () => { - const { bAssets, mAsset, basketManager } = massetDetails; - let composition = await massetMachine.getBasketComposition(massetDetails); - // Expect 4 bAssets with 100 weightings - composition.bAssets.forEach((b) => { - expect(b.vaultBalance).bignumber.eq(new BN(0)); - expect(b.maxWeight).bignumber.eq(simpleToExactAmount(100, 16)); - }); - // Mint some of each bAsset, taking total to 100% - await seedWithWeightings(massetDetails, [ - new BN(28), - new BN(28), - new BN(23), - new BN(23), - ]); - // Set updated weightings - await basketManager.setBasketWeights( - bAssets.map((b) => b.address), - bAssets.map(() => simpleToExactAmount(30, 16)), - { - from: sa.governor, - }, - ); - composition = await massetMachine.getBasketComposition(massetDetails); - // Should succeed if we redeem this - const bAsset = bAssets[0]; - const bAssetDecimals = await bAsset.decimals(); - await expectRevert( - mAsset.redeem(bAsset.address, simpleToExactAmount(10, bAssetDecimals)), - "bAssets must remain below max weight", - ); - // then do accepted one - await assertBasicRedemption(massetDetails, 6, bAsset, true); - }); - }); - }); - - context("when there are a large number of bAssets in the basket", async () => { - // Create a basket filled with 16 bAssets, all hooked into the Mock intergation platform - before(async () => { - await runSetup(false, false); - const { basketManager, aaveIntegration } = massetDetails; - const aaveAddress = await aaveIntegration.platformAddress(); - const mockAave = await MockAave.at(aaveAddress); - // Create 6 new bAssets - for (let i = 0; i < 6; i += 1) { - const mockBasset = await MockERC20.new( - `MKI${i}`, - `MI${i}`, - 18, - sa.default, - 100000000, - ); - const mockAToken = await MockAToken.new(aaveAddress, mockBasset.address); - // Add to the mock aave platform - await mockAave.addAToken(mockAToken.address, mockBasset.address); - // Add the pToken to our integration - await aaveIntegration.setPTokenAddress(mockBasset.address, mockAToken.address, { - from: sa.governor, - }); - // Add the bAsset to the basket - await basketManager.addBasset( - mockBasset.address, - aaveIntegration.address, - false, - { from: sa.governor }, - ); - } - }); - it("should still perform with 10 bAssets in the basket", async () => { - // Assert that we have indeed 10 bAssets - const { basketManager, mAsset } = massetDetails; - const onChainBassets = await massetMachine.getBassetsInMasset(massetDetails); - expect(onChainBassets.length).to.eq(10); - // Set equal basket weightings - await basketManager.setBasketWeights( - onChainBassets.map((b) => b.addr), - onChainBassets.map(() => simpleToExactAmount(20, 16)), - { from: sa.governor }, - ); - // Mint 6.25 of each bAsset, taking total to 100% - const approvals = await Promise.all( - onChainBassets.map((b, i) => - massetMachine.approveMasset(b.contract, mAsset, new BN(10), sa.default), - ), - ); - await mAsset.mintMulti( - onChainBassets.map((b) => b.addr), - approvals, - sa.default, - { from: sa.default }, - ); - // Do the redemption - for (let i = 0; i < 5; i += 1) { - await assertBasicRedemption( - massetDetails, - new BN(1), - onChainBassets[i].contract, - true, - ); - } - }); - }); - context("when the basket manager returns invalid response", async () => { - before(async () => { - await runSetup(); - }); - it("should redeem nothing if the preparation returns invalid from manager", async () => { - const { forgeValidator } = massetDetails; - // mintSingle - const bAsset = await MockERC20.new("Mock", "MKK", 18, sa.default, 1000); - const newManager = await MockBasketManager1.new(bAsset.address); - const mockMasset = await Masset.new(); - await mockMasset.initialize( - "mMock", - "MK", - systemMachine.nexus.address, - forgeValidator.address, - newManager.address, - ); - // Should redeem nothing due to the forge preparation being invalid - await expectRevert( - mockMasset.redeem(bAsset.address, new BN(1)), - "bAsset must exist", - ); - }); - it("reverts if the BasketManager is paused", async () => { - const { bAssets, mAsset, basketManager } = massetDetails; - const bAsset = bAssets[0]; - await basketManager.pause({ from: sa.governor }); - expect(await basketManager.paused()).eq(true); - await expectRevert(mAsset.redeem(bAsset.address, new BN(100)), "Pausable: paused"); - }); - }); - context("when the mAsset has failed", () => { - beforeEach(async () => { - await runSetup(true); - const { basketManager } = massetDetails; - await basketManager.setBasket(true, simpleToExactAmount(8, 17)); - }); - it("should force proportional redemption", async () => { - const { bAssets, mAsset, basketManager } = massetDetails; - // should burn more than is necessary - const bAsset = bAssets[0]; - const basket = await basketManager.getBasket(); - expect(basket.failed).eq(true); - await expectRevert( - mAsset.redeem(bAsset.address, new BN(1)), - "Basket must be alive", - ); - }); - }); - context("when the mAsset is undergoing recol", () => { - beforeEach(async () => { - await runSetup(true); - }); - it("should block redemption", async () => { - const { bAssets, mAsset, basketManager } = massetDetails; - await assertBasketIsHealthy(massetMachine, massetDetails); - await basketManager.setRecol(true); - const bAsset = bAssets[0]; - await expectRevert( - mAsset.redeem(bAsset.address, new BN(1)), - "No bAssets can be undergoing recol", - ); - }); - }); - }); - context("redeeming multiple bAssets", async () => { - before(async () => { - await runSetup(); - }); - context("when the weights are within the ForgeValidator limit", () => { - describe("minting with various orders", async () => { - before(async () => { - await runSetup(); - }); - - it("should redeem quantities relating to the order of the bAsset inputs", async () => { - const { bAssets, mAsset } = massetDetails; - const compBefore = await massetMachine.getBasketComposition(massetDetails); - // Redeeming 2 and 1.. they should match up the amounts - await mAsset.redeemMulti( - [bAssets[1].address, bAssets[0].address], - [new BN(2), new BN(1)], - sa.default, - ); - const compAfter = await massetMachine.getBasketComposition(massetDetails); - expect(compAfter.bAssets[1].vaultBalance).bignumber.eq( - new BN(compBefore.bAssets[1].vaultBalance).sub(new BN(2)), - ); - expect(compAfter.bAssets[0].vaultBalance).bignumber.eq( - new BN(compBefore.bAssets[0].vaultBalance).sub(new BN(1)), - ); - }); - it("Should redeem multiple bAssets", async () => { - // Calc bAsset redemption amounts - const { mAsset, bAssets } = massetDetails; - const chosenBassets = bAssets.slice(0, 2); - const fee = await mAsset.swapFee(); - const bAsset_redemption = await Promise.all( - chosenBassets.map(async (b) => simpleToExactAmount(1, await b.decimals())), - ); - const bAsset_fees = await Promise.all( - bAsset_redemption.map(async (b) => b.mul(fee).div(fullScale)), - ); - const bAsset_balBefore = await Promise.all( - chosenBassets.map((b) => b.balanceOf(sa.default)), - ); - const mUSD_supplyBefore = await mAsset.totalSupply(); - // Redeem - await mAsset.redeemMulti( - chosenBassets.map((b) => b.address), - bAsset_redemption, - sa.default, - { - from: sa.default, - }, - ); - // Assert balances - const mUSD_supplyAfter = await mAsset.totalSupply(); - const bAsset_balAfter = await Promise.all( - chosenBassets.map((b) => b.balanceOf(sa.default)), - ); - expect(mUSD_supplyAfter, "Must burn 2 full units of mUSD").bignumber.eq( - mUSD_supplyBefore.sub(simpleToExactAmount(2, 18)), - ); - expect( - bAsset_balAfter[0], - "Must redeem 1 full units of each bAsset", - ).bignumber.eq( - bAsset_balBefore[0].add(bAsset_redemption[0]).sub(bAsset_fees[0]), - ); - }); - it("should redeem selected bAssets only", async () => { - const { bAssets } = massetDetails; - const comp = await massetMachine.getBasketComposition(massetDetails); - await assertRedeemMulti(massetDetails, [5, 10], [bAssets[2], bAssets[0]]); - const compAfter = await massetMachine.getBasketComposition(massetDetails); - expect(comp.bAssets[1].vaultBalance).bignumber.eq( - compAfter.bAssets[1].vaultBalance, - ); - expect(comp.bAssets[3].vaultBalance).bignumber.eq( - compAfter.bAssets[3].vaultBalance, - ); - }); - }); - context("and sending to a specific recipient", async () => { - before(async () => { - await runSetup(); - }); - it("should fail if recipient is 0x0", async () => { - await expectRevert( - massetDetails.mAsset.redeemMulti( - [massetDetails.bAssets[0].address], - [new BN(1)], - ZERO_ADDRESS, - ), - "Must be a valid recipient", - ); - }); - it("should send mUSD when recipient is a contract", async () => { - const { bAssets } = massetDetails; - const recipient = massetDetails.forgeValidator.address; - await assertRedeemMulti( - massetDetails, - [new BN(1)], - [bAssets[0]], - true, - recipient, - ); - }); - it("should send mUSD when the recipient is an EOA", async () => { - const { bAssets } = massetDetails; - const recipient = sa.dummy1; - await assertRedeemMulti( - massetDetails, - [new BN(1)], - [bAssets[1]], - true, - recipient, - ); - }); - }); - context("and not defining recipient", async () => { - before(async () => { - await runSetup(); - }); - it("should redeem to sender in basic redeem func", async () => { - const { bAssets } = massetDetails; - await assertRedeemMulti(massetDetails, [new BN(1)], [bAssets[1]]); - }); - }); - context("and specifying one bAsset base unit", async () => { - before(async () => { - await runSetup(); - }); - it("should redeem a higher q of mAsset base units when using bAsset with 12", async () => { - const { bAssets, mAsset } = massetDetails; - const bAsset = bAssets[0]; - // bAsset has 12 dp - const decimals = await bAsset.decimals(); - expect(decimals).bignumber.eq(new BN(12)); - const totalSupplyBefore = await mAsset.totalSupply(); - const recipientBassetBalBefore = await bAsset.balanceOf(sa.default); - const tx = await mAsset.redeemMulti([bAsset.address], [new BN(1)], sa.default); - - const expectedMasset = new BN(1000000); - await expectEvent(tx.receipt, "Redeemed", { - mAssetQuantity: expectedMasset, - bAssets: [bAsset.address], - }); - // Recipient should not receive the bAsset because it equates to redeeming 0 cTokens - const recipientBassetBalAfter = await bAsset.balanceOf(sa.default); - expect(recipientBassetBalAfter).bignumber.eq(recipientBassetBalBefore.addn(1)); - // Sender should have less mAsset after - const totalSupplyAfter = await mAsset.totalSupply(); - expect(totalSupplyAfter).bignumber.eq(totalSupplyBefore.sub(new BN(1000000))); - // Complete basket should remain in healthy state - await assertBasketIsHealthy(massetMachine, massetDetails); - }); - }); - - context("and the feeRate changes", async () => { - before(async () => { - await runSetup(); - }); - it("should deduct the suitable fee", async () => { - const { bAssets, mAsset, basketManager } = massetDetails; - const bAsset = bAssets[0]; - const bAssetBefore = await basketManager.getBasset(bAsset.address); - // Sets a new Fee rate - const newFee = simpleToExactAmount("5.234234", 15); - await mAsset.setSwapFee(newFee, { from: sa.governor }); - // Calc mAsset burn amounts based on bAsset quantities - const bAssetQuantity = simpleToExactAmount(new BN(1), await bAsset.decimals()); - const mAssetQuantity = applyRatio(bAssetQuantity, bAssetBefore.ratio); - const bAssetFee = bAssetQuantity.mul(newFee).div(fullScale); - const massetBalBefore = await mAsset.balanceOf(sa.default); - const bassetBalBefore = await bAsset.balanceOf(sa.default); - // Run the redemption - await assertRedeemMulti(massetDetails, [new BN(1)], [bAsset]); - const massetBalAfter = await mAsset.balanceOf(sa.default); - const bassetBalAfter = await bAsset.balanceOf(sa.default); - // Assert balance increase - expect(massetBalAfter).bignumber.eq(massetBalBefore.sub(mAssetQuantity)); - expect(bassetBalAfter).bignumber.eq( - bassetBalBefore.add(bAssetQuantity).sub(bAssetFee), - ); - }); - it("should deduct nothing if the fee is 0", async () => { - const { bAssets, mAsset } = massetDetails; - const bAsset = bAssets[0]; - // Set a new fee rate - const newFee = new BN(0); - await mAsset.setSwapFee(newFee, { from: sa.governor }); - // Calc mAsset burn amounts based on bAsset quantities - const bAssetQuantity = simpleToExactAmount(new BN(1), await bAsset.decimals()); - const bassetBalBefore = await bAsset.balanceOf(sa.default); - // Run the redemption - await assertRedeemMulti(massetDetails, [new BN(1)], [bAsset], false); - const bassetBalAfter = await bAsset.balanceOf(sa.default); - // Assert balance increase - expect(bassetBalAfter).bignumber.eq(bassetBalBefore.add(bAssetQuantity)); - }); - }); - context("and there is insufficient bAsset in the basket", async () => { - before(async () => { - await runSetup(); - }); - it("should throw if we request more than in vault", async () => { - const { bAssets, mAsset, basketManager } = massetDetails; - const bAsset = bAssets[0]; - // bAsset has 12 dp - const bAssetBefore = await basketManager.getBasset(bAsset.address); - const bAssetVault = new BN(bAssetBefore.vaultBalance); - const bAssetRedeemAmount = bAssetVault.add(new BN(1)); - - await expectRevert( - mAsset.redeemMulti([bAsset.address], [bAssetRedeemAmount], sa.default), - "Cannot redeem more bAssets than are in the vault", - ); - }); - }); - context("using bAssets with transfer fees", async () => { - beforeEach(async () => { - await runSetup(true, true); - }); - it("should handle tokens with transfer fees", async () => { - // It should burn the full amount of mAsset, but the fees deducted mean the redeemer receives less - const { bAssets, mAsset, basketManager } = massetDetails; - await assertBasketIsHealthy(massetMachine, massetDetails); - const recipient = sa.dummy3; - // 1.0 Assert bAsset has fee - const bAsset = bAssets[3]; - const bAssetDecimals = await bAsset.decimals(); - const oneBasset = simpleToExactAmount(1, bAssetDecimals); - const bAssetBefore = await basketManager.getBasset(bAsset.address); - const feeRate = await mAsset.swapFee(); - const bAssetFee = oneBasset.mul(feeRate).div(fullScale); - expect(bAssetBefore.isTransferFeeCharged).to.eq(true); - // 2.0 Get balances - const totalSupplyBefore = await mAsset.totalSupply(); - const recipientBassetBalBefore = await bAsset.balanceOf(recipient); - expect(recipientBassetBalBefore).bignumber.eq(new BN(0)); - // 3.0 Do the redemption - const tx = await mAsset.redeemMulti([bAsset.address], [oneBasset], recipient); - const expectedMassetQuantity = applyRatio(oneBasset, bAssetBefore.ratio); - expectEvent(tx.receipt, "Redeemed", { - mAssetQuantity: expectedMassetQuantity, - bAssets: [bAsset.address], - }); - // 4.0 Total supply goes down, and recipient bAsset goes up slightly - const recipientBassetBalAfter = await bAsset.balanceOf(recipient); - // Assert that we redeemed gt 99% of the bAsset - assertBNSlightlyGTPercent( - recipientBassetBalBefore.add(oneBasset.sub(bAssetFee)), - recipientBassetBalAfter, - "0.4", - true, - ); - // Total supply goes down full amount - const totalSupplyAfter = await mAsset.totalSupply(); - expect(totalSupplyAfter).bignumber.eq( - totalSupplyBefore.sub(expectedMassetQuantity), - ); - // VaultBalance should update for this bAsset - const bAssetAfter = await basketManager.getBasset(bAsset.address); - expect(new BN(bAssetAfter.vaultBalance)).bignumber.eq( - new BN(bAssetBefore.vaultBalance).sub(oneBasset.sub(bAssetFee)), - ); - // Complete basket should remain in healthy state - await assertBasketIsHealthy(massetMachine, massetDetails); - }); - it("should fail if the token charges a fee but we dont know about it", async () => { - // It should burn the full amount of mAsset, but the fees deducted mean the redeemer receives less - const { bAssets, mAsset, basketManager } = massetDetails; - await assertBasketIsHealthy(massetMachine, massetDetails); - const recipient = sa.dummy3; - // 1.0 Assert bAsset has fee - const bAsset = bAssets[3]; - const basket = await massetMachine.getBasketComposition(massetDetails); - const bAssetDecimals = await bAsset.decimals(); - const oneBasset = simpleToExactAmount(1, bAssetDecimals); - const feeRate = await mAsset.swapFee(); - const bAssetFee = oneBasset.mul(feeRate).div(fullScale); - expect(basket.bAssets[3].isTransferFeeCharged).to.eq(true); - await basketManager.setTransferFeesFlag(bAsset.address, false, { - from: sa.governor, - }); - - const recipientBassetBalBefore = await bAsset.balanceOf(recipient); - await mAsset.redeemMulti([bAsset.address], [oneBasset], recipient); - // 4.0 Total supply goes down, and recipient bAsset goes up slightly - const recipientBassetBalAfter = await bAsset.balanceOf(recipient); - // Assert that we redeemed gt 99% of the bAsset - assertBNSlightlyGTPercent( - recipientBassetBalBefore.add(oneBasset.sub(bAssetFee)), - recipientBassetBalAfter, - "0.4", - true, - ); - }); - }); - context("passing invalid arguments", async () => { - before(async () => { - await runSetup(); - }); - describe("redeeming with some 0 quantities", async () => { - it("should allow redemption with some 0 quantities", async () => { - const { bAssets } = massetDetails; - const recipient = sa.dummy1; - await assertRedeemMulti( - massetDetails, - [new BN(1), new BN(0)], - [bAssets[0], bAssets[1]], - true, - recipient, - ); - }); - it("should fail if output mAsset quantity is 0", async () => { - const { mAsset, bAssets, basketManager } = massetDetails; - // Get all before balances - const bAssetBefore = await Promise.all( - bAssets.map((b) => basketManager.getBasset(b.address)), - ); - // Approve spending of the bAssets - await Promise.all( - bAssets.map((b, i) => - massetMachine.approveMasset(b, mAsset, new BN(1)), - ), - ); - // Pass all 0's - await expectRevert( - mAsset.redeemMulti( - bAssetBefore.map((b) => b.addr), - [new BN(0), new BN(0), new BN(0), new BN(0)], - sa.default, - ), - "Must redeem some bAssets", - ); - }); - }); - context("passing incorrect bAsset array", async () => { - it("should error if the array is empty", async () => { - const { mAsset } = massetDetails; - await expectRevert( - mAsset.redeemMulti([], [new BN(1)], sa.default), - "Input array mismatch", - ); - }); - it("should error if both inputs are null", async () => { - const { mAsset } = massetDetails; - await expectRevert( - mAsset.redeemMulti([], [], sa.default), - "Input array mismatch", - ); - }); - it("should error if there is a length mismatch", async () => { - const { mAsset, bAssets } = massetDetails; - await expectRevert( - mAsset.redeemMulti( - [bAssets[0].address], - [new BN(1), new BN(1)], - sa.default, - ), - "Input array mismatch", - ); - }); - it("should error if there is a length mismatch", async () => { - const { mAsset, bAssets } = massetDetails; - await expectRevert( - mAsset.redeemMulti( - [bAssets[0].address], - [new BN(1), new BN(1), new BN(1), new BN(1)], - sa.default, - ), - "Input array mismatch", - ); - }); - it("should fail if there are duplicate bAsset addresses", async () => { - const { mAsset, bAssets } = massetDetails; - await expectRevert( - mAsset.redeemMulti( - [bAssets[0].address, bAssets[0].address], - [new BN(1), new BN(1)], - sa.default, - ), - "Must have no duplicates", - ); - }); - }); - it("should fail if sender doesn't have mAsset balance", async () => { - const { bAssets, mAsset } = massetDetails; - const bAsset = bAssets[0]; - const sender = sa.dummy1; - expect(await mAsset.balanceOf(sender)).bignumber.eq(new BN(0)); - await expectRevert( - mAsset.redeemMulti( - [bAsset.address, bAssets[1].address], - [new BN(1), new BN(0)], - sa.default, - { from: sender }, - ), - "ERC20: burn amount exceeds balance", - ); - }); - it("should fail if the bAsset does not exist", async () => { - const { bAssets } = massetDetails; - const bAsset = await MockERC20.new("Mock", "MKK", 18, sa.default, 1000); - await expectRevert( - massetDetails.mAsset.redeemMulti( - [bAsset.address, bAssets[0].address], - [new BN(100), new BN(100)], - sa.default, - ), - "bAsset must exist", - ); - }); - }); - context("with an affected bAsset", async () => { - before(async () => { - await runSetup(); - }); - it("should fail if bAsset is broken above peg", async () => { - const { bAssets, mAsset, basketManager } = massetDetails; - await assertBasketIsHealthy(massetMachine, massetDetails); - const bAsset = bAssets[0]; - await basketManager.handlePegLoss(bAsset.address, false, { - from: sa.governor, - }); - const newBasset = await basketManager.getBasset(bAsset.address); - expect(newBasset.status).to.eq(BassetStatus.BrokenAbovePeg.toString()); - await expectRevert( - mAsset.redeemMulti([bAsset.address], [new BN(1)], sa.default), - "Must redeem proportionately", - ); - }); - it("should fail if any bAsset is blacklisted", async () => { - const { bAssets, mAsset, basketManager } = massetDetails; - await assertBasketIsHealthy(massetMachine, massetDetails); - const bAsset = bAssets[0]; - await basketManager.setBassetStatus( - bAssets[1].address, - BassetStatus.Blacklisted, - { - from: sa.governor, - }, - ); - const newBasset = await basketManager.getBasset(bAssets[1].address); - expect(newBasset.status).to.eq(BassetStatus.Blacklisted.toString()); - await expectRevert( - mAsset.redeemMulti([bAsset.address], [new BN(1)], sa.default), - "Basket contains blacklisted bAsset", - ); - }); - it("should fail if any bAsset in basket is broken below peg", async () => { - const { bAssets, mAsset, basketManager } = massetDetails; - await assertBasketIsHealthy(massetMachine, massetDetails); - const bAsset = bAssets[1]; - await basketManager.setBassetStatus( - bAsset.address, - BassetStatus.BrokenBelowPeg, - ); - const newBasset = await basketManager.getBasset(bAsset.address); - expect(newBasset.status).to.eq(BassetStatus.BrokenBelowPeg.toString()); - await expectRevert( - mAsset.redeemMulti([bAsset.address], [new BN(1)], sa.default), - "Must redeem proportionately", - ); - }); - it("should fail if any bAsset in basket is liquidating or blacklisted", async () => { - const { bAssets, mAsset, basketManager } = massetDetails; - await assertBasketIsHealthy(massetMachine, massetDetails); - const bAsset = bAssets[2]; - await basketManager.setBassetStatus(bAsset.address, BassetStatus.Liquidating); - const newBasset = await basketManager.getBasset(bAsset.address); - expect(newBasset.status).to.eq(BassetStatus.Liquidating.toString()); - await expectRevert( - mAsset.redeemMulti([bAsset.address], [new BN(1)], sa.default), - "Must redeem proportionately", - ); - }); - }); - context("when the bAsset ratio needs to be ceil", async () => { - before(async () => { - await runSetup(true, false); - }); - it("should burn an extra base unit of mAsset per bAsset unit", async () => { - const { bAssets, mAsset, basketManager } = massetDetails; - const bAsset = bAssets[0]; - const bAssetDecimals = await bAsset.decimals(); - const oneBaseUnit = new BN(1); - const mUSDSupplyBefore = await mAsset.totalSupply(); - // Update ratio - const baseRatio = new BN(10).pow(new BN(18).sub(bAssetDecimals)); - const ratio = new BN(baseRatio).mul(new BN(100000001)); - await basketManager.setBassetRatio(bAsset.address, ratio); - // Calc mAsset burn amounts based on bAsset quantities - const mAssetQuantity = applyRatio(oneBaseUnit, ratio); - const mAssetQuantityCeil = applyRatioCeil(oneBaseUnit, ratio); - expect(mAssetQuantityCeil).bignumber.eq(mAssetQuantity.add(new BN(1))); - // Send the TX - const tx = await mAsset.redeemMulti( - [bAsset.address], - [oneBaseUnit], - sa.default, - ); - // Listen for the events - await expectEvent(tx.receipt, "Redeemed", { - mAssetQuantity: mAssetQuantityCeil, - bAssets: [bAsset.address], - }); - // Total mUSD supply should be less - const mUSDSupplyAfter = await mAsset.totalSupply(); - expect(mUSDSupplyAfter).bignumber.eq(mUSDSupplyBefore.sub(mAssetQuantityCeil)); - }); - }); - context("performing multiple redemptions in a row", async () => { - before("reset", async () => { - await runSetup(); - }); - it("should redeem with single bAsset", async () => { - const { bAssets, mAsset } = massetDetails; - const oneMasset = simpleToExactAmount(1, 18); - const mUSDSupplyBefore = await mAsset.totalSupply(); - await Promise.all( - bAssets.map(async (b) => { - const bAssetDecimals = await b.decimals(); - const bAssetWhole = simpleToExactAmount(new BN(1), bAssetDecimals); - return mAsset.redeemMulti([b.address], [bAssetWhole], sa.default, { - from: sa.default, - }); - }), - ); - const mUSDSupplyAfter = await mAsset.totalSupply(); - expect(mUSDSupplyAfter).bignumber.eq( - mUSDSupplyBefore.sub(new BN(bAssets.length).mul(oneMasset)), - ); - }); - }); - }); - - context("when the basket weights are out of sync", async () => { - context("when some are above", async () => { - beforeEach(async () => { - await runSetup(false); - }); - it("should succeed if we redeem all the overweight bAssets, and fail otherwise", async () => { - const { bAssets, mAsset, basketManager } = massetDetails; - let composition = await massetMachine.getBasketComposition(massetDetails); - // Expect 4 bAssets with 100 - composition.bAssets.forEach((b) => { - expect(b.vaultBalance).bignumber.eq(new BN(0)); - expect(b.maxWeight).bignumber.eq(simpleToExactAmount(100, 16)); - }); - // Mint 25 of each bAsset, taking total to 100% - await seedWithWeightings(massetDetails, [ - new BN(40), - new BN(20), - new BN(20), - new BN(40), - ]); - // Set updated weightings - await basketManager.setBasketWeights( - bAssets.map((b) => b.address), - bAssets.map(() => simpleToExactAmount(25, 16)), - { - from: sa.governor, - }, - ); - composition = await massetMachine.getBasketComposition(massetDetails); - expect(composition.bAssets[0].overweight).to.eq(true); - // Should succeed if we redeem this - const bAsset = bAssets[0]; - const bAsset2 = bAssets[2]; - const bAsset3 = bAssets[3]; - const bAssetDecimals = await bAsset.decimals(); - const bAsset2Decimals = await bAsset2.decimals(); - const bAsset3Decimals = await bAsset3.decimals(); - const totalSupplyBefore = await mAsset.totalSupply(); - await mAsset.redeemMulti( - [bAsset.address, bAsset3.address], - [ - simpleToExactAmount(2, bAssetDecimals), - simpleToExactAmount(2, bAsset3Decimals), - ], - sa.default, - ); - const totalSupplyAfter = await mAsset.totalSupply(); - expect(totalSupplyAfter).bignumber.eq( - totalSupplyBefore.sub(simpleToExactAmount(4, 18)), - ); - // Should fail if we redeem anything but the overweight bAsset - /* eslint-disable-next-line prefer-destructuring */ - await expectRevert( - mAsset.redeemMulti( - [bAsset.address], - [simpleToExactAmount(1, bAssetDecimals)], - sa.default, - ), - "Redemption must contain all overweight bAssets", - ); - await expectRevert( - mAsset.redeemMulti( - [bAsset3.address, bAsset2.address], - [ - simpleToExactAmount(15, bAsset3Decimals), - simpleToExactAmount(1, bAsset2Decimals), - ], - sa.default, - ), - "Must redeem overweight bAssets", - ); - }); - }); - }); - - context("when there are a large number of bAssets in the basket", async () => { - // Create a basket filled with 16 bAssets, all hooked into the Mock intergation platform - before(async () => { - await runSetup(false, false); - const { basketManager, aaveIntegration } = massetDetails; - const aaveAddress = await aaveIntegration.platformAddress(); - const mockAave = await MockAave.at(aaveAddress); - // Create 6 new bAssets - for (let i = 0; i < 6; i += 1) { - const mockBasset = await MockERC20.new( - `MKI${i}`, - `MI${i}`, - 18, - sa.default, - 100000000, - ); - const mockAToken = await MockAToken.new(aaveAddress, mockBasset.address); - // Add to the mock aave platform - await mockAave.addAToken(mockAToken.address, mockBasset.address); - // Add the pToken to our integration - await aaveIntegration.setPTokenAddress(mockBasset.address, mockAToken.address, { - from: sa.governor, - }); - // Add the bAsset to the basket - await basketManager.addBasset( - mockBasset.address, - aaveIntegration.address, - false, - { from: sa.governor }, - ); - } - }); - it("should still perform with 10 bAssets in the basket", async () => { - // Assert that we have indeed 10 bAssets - const { basketManager, mAsset } = massetDetails; - const onChainBassets = await massetMachine.getBassetsInMasset(massetDetails); - expect(onChainBassets.length).to.eq(10); - // Set equal basket weightings - await basketManager.setBasketWeights( - onChainBassets.map((b) => b.addr), - onChainBassets.map(() => simpleToExactAmount(20, 16)), - { from: sa.governor }, - ); - // Mint 6.25 of each bAsset, taking total to 100% - const approvals = await Promise.all( - onChainBassets.map((b, i) => - massetMachine.approveMasset(b.contract, mAsset, new BN(10), sa.default), - ), - ); - await mAsset.mintMulti( - onChainBassets.map((b) => b.addr), - approvals, - sa.default, - { from: sa.default }, - ); - // Do the redemption with 16 - await assertRedeemMulti( - massetDetails, - onChainBassets.map(() => new BN(1)), - onChainBassets.map((b) => b.contract), - ); - }); - }); - context("when the basket manager returns invalid response", async () => { - before(async () => { - await runSetup(); - }); - it("should redeem nothing if the preparation returns invalid from manager", async () => { - const { forgeValidator } = massetDetails; - // mintSingle - const bAsset = await MockERC20.new("Mock", "MKK", 18, sa.default, 1000); - const newManager = await MockBasketManager1.new(bAsset.address); - const mockMasset = await Masset.new(); - await mockMasset.initialize( - "mMock", - "MK", - systemMachine.nexus.address, - forgeValidator.address, - newManager.address, - ); - // Should redeem nothing due to the forge preparation being invalid - await expectRevert( - mockMasset.redeemMulti([bAsset.address], [new BN(1)], sa.default), - "bAsset must exist", - ); - }); - it("reverts if the BasketManager is paused", async () => { - const { bAssets, mAsset, basketManager } = massetDetails; - const bAsset = bAssets[0]; - await basketManager.pause({ from: sa.governor }); - expect(await basketManager.paused()).eq(true); - await expectRevert( - mAsset.redeemMulti([bAsset.address], [new BN(100)], sa.default), - "Pausable: paused", - ); - }); - }); - context("when the mAsset has failed", () => { - beforeEach(async () => { - await runSetup(true); - const { basketManager } = massetDetails; - await basketManager.setBasket(true, simpleToExactAmount(8, 17)); - }); - it("should force proportional redemption", async () => { - const { bAssets, mAsset, basketManager } = massetDetails; - // should burn more than is necessary - const bAsset = bAssets[0]; - const basket = await basketManager.getBasket(); - expect(basket.failed).eq(true); - await expectRevert( - mAsset.redeemMulti([bAsset.address], [new BN(1)], sa.default), - "Basket must be alive", - ); - }); - }); - context("when the mAsset is undergoing recol", () => { - beforeEach(async () => { - await runSetup(true); - }); - it("should block redemption", async () => { - const { bAssets, mAsset, basketManager } = massetDetails; - await assertBasketIsHealthy(massetMachine, massetDetails); - await basketManager.setRecol(true); - const bAsset = bAssets[0]; - await expectRevert( - mAsset.redeemMulti([bAsset.address], [new BN(1)], sa.default), - "No bAssets can be undergoing recol", - ); - }); - }); - }); -}); diff --git a/test/masset/TestMassetSwap.spec.ts b/test/masset/TestMassetSwap.spec.ts deleted file mode 100644 index d57c22c1..00000000 --- a/test/masset/TestMassetSwap.spec.ts +++ /dev/null @@ -1,1193 +0,0 @@ -/* eslint-disable @typescript-eslint/camelcase */ -/* eslint-disable no-await-in-loop */ - -import { expectEvent, expectRevert } from "@openzeppelin/test-helpers"; - -import { assertBasketIsHealthy, assertBNSlightlyGTPercent } from "@utils/assertions"; -import { simpleToExactAmount } from "@utils/math"; -import { MassetDetails, MassetMachine, StandardAccounts, SystemMachine } from "@utils/machines"; -import { BN } from "@utils/tools"; -import { BassetStatus } from "@utils/mstable-objects"; -import { ZERO_ADDRESS, fullScale, ratioScale } from "@utils/constants"; -import envSetup from "@utils/env_setup"; -import * as t from "types/generated"; -import { BasketComposition } from "../../types"; - -const { expect } = envSetup.configure(); - -const MockERC20 = artifacts.require("MockERC20"); -const MockAToken = artifacts.require("MockAToken"); -const MockAave = artifacts.require("MockAaveV2"); -const AaveIntegration = artifacts.require("AaveIntegration"); - -interface SwapDetails { - swapOutput: BN; - feeRate: BN; -} - -contract("Masset - Swap", async (accounts) => { - const sa = new StandardAccounts(accounts); - let systemMachine: SystemMachine; - let massetMachine: MassetMachine; - let massetDetails: MassetDetails; - - /** - * @dev (Re)Sets the local variables for this test file - * @param seedBasket Should we add base layer liquidity to the vault? - * @param enableUSDTFee Enable the bAssets with transfer fees? - */ - const runSetup = async (seedBasket = true, enableUSDTFee = false): Promise => { - massetDetails = seedBasket - ? await massetMachine.deployMassetAndSeedBasket(enableUSDTFee) - : await massetMachine.deployMasset(enableUSDTFee); - await assertBasketIsHealthy(massetMachine, massetDetails); - }; - - /** - * @dev Asserts that both 'swap' and 'getSwapOutput' fail for a given reason - * @param mAsset Masset instance upon which to call swap - * @param inputBasset Basset to swap out of - * @param outputAsset Asset to swap in to - * @param amount Whole units to swap out of - * @param expectedReason What is the failure response of the contract? - * @param recipient Who should send the tx? Or default - * @param recipient Who should receive the output? Or default - * @param callSwapOutput Should this check be ran on 'getSwapOutput' too? - * @param swapOutputRevertExpected Should 'getSwapOutput' revert? If so, set this to true - */ - const assertFailedSwap = async ( - mAsset: t.MassetInstance, - inputBasset: t.MockERC20Instance, - outputAsset: t.MockERC20Instance, - amount: string | BN | number, - expectedReason: string, - sender = sa.default, - recipient = sa.default, - callSwapOutput = true, - swapOutputRevertExpected = false, - inputAmountIsExact = false, - ): Promise => { - const approval: BN = await massetMachine.approveMasset( - inputBasset, - mAsset, - amount, - sa.default, - inputAmountIsExact, - ); - - // Expect the swap to revert - await expectRevert( - mAsset.swap(inputBasset.address, outputAsset.address, approval, recipient, { - from: sender, - }), - expectedReason, - ); - - // If swap fails, then we would expect swap output to fail for the same reason, - // instead of reverting, it generally returns a response - if (callSwapOutput) { - if (swapOutputRevertExpected) { - await expectRevert( - mAsset.getSwapOutput(inputBasset.address, outputAsset.address, approval, { - from: sender, - }), - expectedReason, - ); - } else { - const swapOutputResponse = await mAsset.getSwapOutput( - inputBasset.address, - outputAsset.address, - approval, - ); - const [valid, actualReason, output] = swapOutputResponse; - expect(valid).eq(false); - expect(actualReason).eq(expectedReason); - expect(output).bignumber.eq(new BN(0)); - } - } - }; - - /** - * @dev Asserts that a swap meets the basic validation conditions, i.e. updates - * state and affects actors balances in the correct manner - * @param md Object containing relevant base level contract info on system - * @param inputBasset Asset to use as input - * @param outputAsset Asset to use as output - * @param swapQuantity Whole units to swap out of - * @param expectSwapFee Should this swap incur a fee? - * @param recipient Specify a recipient if desired, else default - * @param sender Specify a sender if desired, else default - * @param ignoreHealthAssertions Ignore deep basket state validation? - */ - const assertSwap = async ( - md: MassetDetails, - inputBasset: t.MockERC20Instance, - outputAsset: t.MockERC20Instance, - swapQuantity: BN | number, - expectSwapFee: boolean, - recipient: string = sa.default, - sender: string = sa.default, - ignoreHealthAssertions = false, - swapQuantityIsBaseUnits = false, - ): Promise => { - const { mAsset, basketManager } = md; - - // 1. Assert all state is currently valid and prepare objects - // Assert that the basket is in a healthy state - if (!ignoreHealthAssertions) await assertBasketIsHealthy(massetMachine, md); - // Is this swap actually a single bAsset mint? - const isMint = mAsset.address === outputAsset.address; - - // Get basic before data about the actors balances - const swapperInputBalBefore = await inputBasset.balanceOf(sender); - const recipientOutputBalBefore = await outputAsset.balanceOf(recipient); - - // Get basic before data on the swap assets - const inputBassetBefore = await massetMachine.getBasset(basketManager, inputBasset.address); - const inputIntegratorBalBefore = await inputBassetBefore.contract.balanceOf( - inputBassetBefore.integrator.address, - ); - const outputBassetBefore = isMint - ? null - : await massetMachine.getBasset(basketManager, outputAsset.address); - const outputIntegratorBalBefore = isMint - ? new BN(0) - : await outputBassetBefore.contract.balanceOf(outputBassetBefore.integrator.address); - const surplusBefore = await mAsset.surplus(); - - // 2. Do the necessary approvals and make the calls - const approval0: BN = await massetMachine.approveMasset( - inputBasset, - mAsset, - new BN(swapQuantity), - sender, - swapQuantityIsBaseUnits, - ); - - // Call the swap output function to check if results match - const swapOutputResponse = await mAsset.getSwapOutput( - inputBasset.address, - outputAsset.address, - approval0, - { from: sender }, - ); - - // 3. Calculate expected responses - const inputQuantityExact = swapQuantityIsBaseUnits - ? new BN(swapQuantity) - : simpleToExactAmount(swapQuantity, await inputBasset.decimals()); - const scaledInputQuantity = swapQuantityIsBaseUnits - ? new BN(swapQuantity).mul(new BN(inputBassetBefore.ratio)).div(ratioScale) - : simpleToExactAmount(swapQuantity, 18); - const expectedOutputValue = isMint - ? scaledInputQuantity - : scaledInputQuantity.mul(ratioScale).div(new BN(outputBassetBefore.ratio)); - let fee = new BN(0); - let scaledFee = new BN(0); - let feeRate = new BN(0); - // If there is a fee expected, then deduct it from output - if (expectSwapFee && !isMint) { - feeRate = await mAsset.swapFee(); - expect(feeRate).bignumber.gt(new BN(0) as any); - expect(feeRate).bignumber.lt(fullScale.div(new BN(50)) as any); - fee = expectedOutputValue.mul(feeRate).div(fullScale); - expect(fee).bignumber.gt(new BN(0) as any); - scaledFee = fee.mul(new BN(outputBassetBefore.ratio)).div(ratioScale); - } - - // Expect to be used in cache - const platformInteraction_in = await massetMachine.getPlatformInteraction( - mAsset, - "deposit", - approval0, - inputIntegratorBalBefore, - inputBassetBefore, - ); - const platformInteraction_out = isMint - ? null - : await massetMachine.getPlatformInteraction( - mAsset, - "withdrawal", - expectedOutputValue.sub(fee), - outputIntegratorBalBefore, - outputBassetBefore, - ); - - const swapTx = await mAsset.swap( - inputBasset.address, - outputAsset.address, - approval0, - recipient, - { from: sender }, - ); - - // 4. Validate any basic events that should occur - if (isMint) { - await expectEvent(swapTx.receipt, "Minted", { - minter: sender, - recipient, - mAssetQuantity: expectedOutputValue, - bAsset: inputBasset.address, - bAssetQuantity: inputQuantityExact, - }); - } else { - await expectEvent(swapTx.receipt, "Swapped", { - swapper: sender, - input: inputBasset.address, - output: outputAsset.address, - outputAmount: expectedOutputValue.sub(fee), - recipient, - }); - if (expectSwapFee) { - await expectEvent(swapTx.receipt, "PaidFee", { - payer: sender, - asset: outputAsset.address, - feeQuantity: fee, - }); - } - - await expectEvent(swapTx.receipt, "Transfer", { - from: sender, - to: await basketManager.getBassetIntegrator(inputBasset.address), - value: inputQuantityExact, - }); - } - - const inputIntegratorBalAfter = await inputBassetBefore.contract.balanceOf( - inputBassetBefore.integrator.address, - ); - expect(inputIntegratorBalAfter).bignumber.eq(platformInteraction_in.rawBalance); - const outputIntegratorBalAfter = isMint - ? new BN(0) - : await outputBassetBefore.contract.balanceOf(outputBassetBefore.integrator.address); - if (!isMint) { - expect(outputIntegratorBalAfter).bignumber.eq(platformInteraction_out.rawBalance); - } - - // 5. Validate output state - // Swap estimation should match up - const [swapValid, swapReason, swapOutput] = swapOutputResponse; - expect(swapValid).eq(true); - expect(swapReason).eq(""); - expect(swapOutput).bignumber.eq(expectedOutputValue.sub(fee)); - - // Input - // Deposits into lending platform - const emitter = await AaveIntegration.new(); - if (platformInteraction_in.expectInteraction) { - await expectEvent.inTransaction(swapTx.tx, emitter, "Deposit", { - _bAsset: inputBasset.address, - _amount: platformInteraction_in.amount, - }); - } - // Sender should have less input bAsset after - const swapperBassetBalAfter = await inputBasset.balanceOf(sender); - expect(swapperBassetBalAfter).bignumber.eq(swapperInputBalBefore.sub(inputQuantityExact)); - // VaultBalance should update for input bAsset - const inputBassetAfter = await basketManager.getBasset(inputBasset.address); - expect(new BN(inputBassetAfter.vaultBalance)).bignumber.eq( - new BN(inputBassetBefore.vaultBalance).add(inputQuantityExact), - ); - - // Output - // Recipient should have output asset quantity after (minus fee) - const recipientBalAfter = await outputAsset.balanceOf(recipient); - expect(recipientBalAfter).bignumber.eq( - recipientOutputBalBefore.add(expectedOutputValue.sub(fee)), - ); - // VaultBalance should update for output bAsset - if (!isMint) { - const outputBassetAfter = await basketManager.getBasset(outputAsset.address); - // Should deduct the FULL amount, including fee, from the vault balance - expect(new BN(outputBassetAfter.vaultBalance)).bignumber.eq( - new BN(outputBassetBefore.vaultBalance).sub(expectedOutputValue.sub(fee)), - ); - - if (platformInteraction_out.expectInteraction) { - await expectEvent.inTransaction(swapTx.tx, emitter, "PlatformWithdrawal", { - bAsset: outputAsset.address, - totalAmount: platformInteraction_out.amount, - userAmount: expectedOutputValue.sub(fee), - }); - } else { - await expectEvent.inTransaction(swapTx.tx, emitter, "Withdrawal", { - _bAsset: outputAsset.address, - _amount: expectedOutputValue.sub(fee), - }); - } - const surplusAfter = await mAsset.surplus(); - expect(new BN(surplusAfter)).bignumber.eq(new BN(surplusBefore).add(scaledFee)); - } - - // Complete basket should remain in healthy state - if (!ignoreHealthAssertions) await assertBasketIsHealthy(massetMachine, md); - return { - swapOutput, - feeRate, - }; - }; - - /** - * @dev Seeds the mAsset basket with custom weightings - * @param md Masset details object containing all deployed contracts - * @param weights Whole numbers of mAsset to mint for each given bAsset - */ - const seedWithWeightings = async (md: MassetDetails, weights: Array): Promise => { - const { mAsset, bAssets } = md; - const approvals = await Promise.all( - bAssets.map((b, i) => massetMachine.approveMasset(b, mAsset, weights[i], sa.default)), - ); - await mAsset.mintMulti( - bAssets.map((b) => b.address), - approvals, - sa.default, - { from: sa.default }, - ); - }; - - before("Init mock machines", async () => { - systemMachine = new SystemMachine(sa.all); - massetMachine = new MassetMachine(systemMachine); - }); - - describe("swapping assets", () => { - context("when the weights are within the ForgeValidator limit", () => { - context("and sending to a specific recipient", async () => { - before(async () => { - await runSetup(); - }); - it("should swap two bAssets", async () => { - const { bAssets } = massetDetails; - await assertSwap(massetDetails, bAssets[0], bAssets[1], 1, true, sa.dummy1); - }); - it("should fail if recipient is 0x0", async () => { - const { bAssets, mAsset } = massetDetails; - await assertFailedSwap( - mAsset, - bAssets[0], - bAssets[1], - 1, - "Missing recipient address", - sa.default, - ZERO_ADDRESS, - false, - ); - }); - it("should swap out asset when recipient is a contract", async () => { - const { bAssets, basketManager } = massetDetails; - await assertSwap( - massetDetails, - bAssets[0], - bAssets[1], - 1, - true, - basketManager.address, - ); - }); - it("should fail if there is insufficient liquidity", async () => { - const { bAssets, mAsset } = massetDetails; - await assertFailedSwap( - mAsset, - bAssets[0], - bAssets[1], - 1000, - "Not enough liquidity", - ); - }); - }); - context("and specifying one bAsset base unit", async () => { - before(async () => { - await runSetup(); - }); - it("should fail if output has less decimals", async () => { - const { bAssets, mAsset } = massetDetails; - const input = bAssets[0]; - const output = bAssets[1]; - expect(await input.decimals()).bignumber.eq(new BN(12)); - expect(await output.decimals()).bignumber.eq(new BN(6)); - await assertFailedSwap( - mAsset, - input, - output, - 1, - "Must withdraw something", - sa.default, - sa.default, - false, - false, - true, - ); - }); - it("should swap a higher q of bAsset base units if output has more decimals", async () => { - const { bAssets } = massetDetails; - const input = bAssets[1]; - const output = bAssets[0]; - expect(await input.decimals()).bignumber.eq(new BN(6)); - expect(await output.decimals()).bignumber.eq(new BN(12)); - const swapDetails = await assertSwap( - massetDetails, - input, - output, - 1, - true, - undefined, - undefined, - false, - true, - ); - expect(swapDetails.swapOutput).bignumber.eq( - simpleToExactAmount(1, 6) - .mul(fullScale.sub(swapDetails.feeRate)) - .div(fullScale), - ); - }); - }); - context("and using the mAsset as the output asset", async () => { - it("should mint mAssets instead of swapping", async () => { - const { bAssets, mAsset } = massetDetails; - await assertSwap( - massetDetails, - bAssets[0], - await MockERC20.at(mAsset.address), - 1, - true, - ); - }); - }); - context("and using the mAsset as the input asset", async () => { - it("should fail", async () => { - const { bAssets, mAsset } = massetDetails; - await assertFailedSwap( - mAsset, - await MockERC20.at(mAsset.address), - bAssets[0], - 1, - "Input asset does not exist", - ); - }); - }); - context("passing invalid arguments", async () => { - before(async () => { - await runSetup(); - }); - it("should revert when 0 quantity", async () => { - const { bAssets, mAsset } = massetDetails; - await assertFailedSwap( - mAsset, - bAssets[0], - bAssets[1], - 0, - "Invalid quantity", - sa.default, - sa.default, - false, - ); - const swapOutputResponse = await mAsset.getSwapOutput( - bAssets[0].address, - bAssets[1].address, - 0, - ); - const [valid, , output] = swapOutputResponse; - expect(valid).eq(true); - expect(output).bignumber.eq(new BN(0)); - }); - it("should fail if sender doesn't have balance", async () => { - const { bAssets, mAsset } = massetDetails; - await assertFailedSwap( - mAsset, - bAssets[0], - bAssets[1], - 1, - "SafeERC20: low-level call failed", - sa.dummy1, - sa.default, - false, - ); - }); - it("should fail if sender doesn't give approval", async () => { - const { bAssets, mAsset } = massetDetails; - const input = bAssets[0]; - const sender = sa.dummy2; - await input.transfer(sender, new BN(10000)); - expect(await input.allowance(sender, mAsset.address)).bignumber.eq(new BN(0)); - expect(await input.balanceOf(sender)).bignumber.eq(new BN(10000)); - await expectRevert( - mAsset.swap(input.address, bAssets[1].address, new BN(100), sa.default, { - from: sender, - }), - "SafeERC20: low-level call failed", - ); - }); - it("should fail if *either* bAsset does not exist", async () => { - const { bAssets, mAsset } = massetDetails; - const realBasset = bAssets[0].address; - const fakeBasset = sa.dummy1; - const recipient = sa.dummy1; - await expectRevert( - mAsset.swap(fakeBasset, realBasset, new BN(1), recipient), - "Input asset does not exist", - ); - await expectRevert( - mAsset.swap(realBasset, fakeBasset, new BN(1), recipient), - "Output asset does not exist", - ); - }); - it("should fail if *either* bAsset is ZERO", async () => { - const { bAssets, mAsset } = massetDetails; - const realBasset = bAssets[0]; - const fakeBasset = ZERO_ADDRESS; - const expectedReason = "Invalid swap asset addresses"; - await expectRevert( - mAsset.swap(realBasset.address, fakeBasset, new BN(1), sa.default), - expectedReason, - ); - await expectRevert( - mAsset.getSwapOutput(realBasset.address, fakeBasset, new BN(1)), - expectedReason, - ); - await expectRevert( - mAsset.swap(fakeBasset, realBasset.address, new BN(1), sa.default), - expectedReason, - ); - await expectRevert( - mAsset.getSwapOutput(fakeBasset, realBasset.address, new BN(1)), - expectedReason, - ); - }); - it("should fail if given identical bAssets", async () => { - const { bAssets, mAsset } = massetDetails; - const input = bAssets[0]; - const output = input; - await assertFailedSwap( - mAsset, - input, - output, - 1, - "Cannot swap the same asset", - sa.default, - sa.default, - true, - true, - ); - }); - }); - context("using bAssets with transfer fees", async () => { - // Fee is on USDT or bAssets[3] - describe("when input has xfer fee", async () => { - before(async () => { - await runSetup(true, true); - }); - it("should have lower input and proportionately lower output", async () => { - const { mAsset, basketManager, bAssets } = massetDetails; - const sender = sa.default; - const recipient = sa.default; - const inputBasset = bAssets[3]; - const outputAsset = bAssets[0]; - const swapQuantity = new BN(1); - - await assertBasketIsHealthy(massetMachine, massetDetails); - - // 1. Get basic before data about the actors balances - const swapperInputBalBefore = await inputBasset.balanceOf(sender); - const recipientOutputBalBefore = await outputAsset.balanceOf(recipient); - - // Get basic before data on the swap assets - const inputBassetBefore = await basketManager.getBasset( - inputBasset.address, - ); - const outputBassetBefore = await basketManager.getBasset( - outputAsset.address, - ); - - // 2. Do the necessary approvals and make the calls - const approval0: BN = await massetMachine.approveMasset( - inputBasset, - mAsset, - swapQuantity, - sender, - ); - await mAsset.swap( - inputBasset.address, - outputAsset.address, - approval0, - recipient, - { from: sender }, - ); - // Senders balance goes down but vaultbalance goes up by less - - // 3. Calculate expected responses - const inputQuantityExact = simpleToExactAmount( - swapQuantity, - await inputBasset.decimals(), - ); - const scaledInputQuantity = simpleToExactAmount(swapQuantity, 18); - const expectedOutputValue = scaledInputQuantity - .mul(ratioScale) - .div(new BN(outputBassetBefore.ratio)); - - const feeRate = await mAsset.swapFee(); - const fee = expectedOutputValue.mul(feeRate).div(fullScale); - - // Input - // Sender should have less input bAsset after - const swapperBassetBalAfter = await inputBasset.balanceOf(sender); - expect(swapperBassetBalAfter).bignumber.eq( - swapperInputBalBefore.sub(inputQuantityExact), - ); - // VaultBalance should update for input bAsset - const inputBassetAfter = await basketManager.getBasset(inputBasset.address); - // Assert that only >99.7 && <100% of the asset got added to the vault - assertBNSlightlyGTPercent( - inputQuantityExact, - new BN(inputBassetAfter.vaultBalance).sub( - new BN(inputBassetBefore.vaultBalance), - ), - "0.3", - true, - ); - // Output - // Recipient should have output asset quantity after (minus fee) - const recipientBalAfter = await outputAsset.balanceOf(recipient); - // Assert recipient only receives x amount - assertBNSlightlyGTPercent( - expectedOutputValue.sub(fee), - recipientBalAfter.sub(recipientOutputBalBefore), - "0.3", - true, - ); - - // Complete basket should remain in healthy state - await assertBasketIsHealthy(massetMachine, massetDetails); - }); - it("should fail if the system doesn't know about the fee", async () => { - const { bAssets, mAsset, basketManager } = massetDetails; - await basketManager.setTransferFeesFlag(bAssets[3].address, false, { - from: sa.governor, - }); - await assertFailedSwap( - mAsset, - bAssets[3], - bAssets[0], - 1, - "Asset not fully transferred", - sa.default, - sa.default, - false, - ); - }); - }); - describe("when output has xfer fee", async () => { - before(async () => { - await runSetup(true, true); - }); - it("should have same input but lower physical output", async () => { - const { mAsset, basketManager, bAssets } = massetDetails; - const sender = sa.default; - const recipient = sa.default; - const inputBasset = bAssets[0]; - const outputAsset = bAssets[3]; - const swapQuantity = new BN(1); - - await assertBasketIsHealthy(massetMachine, massetDetails); - - // 1. Get basic before data about the actors balances - const swapperInputBalBefore = await inputBasset.balanceOf(sender); - const recipientOutputBalBefore = await outputAsset.balanceOf(recipient); - - // Get basic before data on the swap assets - const inputBassetBefore = await basketManager.getBasset( - inputBasset.address, - ); - const outputBassetBefore = await basketManager.getBasset( - outputAsset.address, - ); - - // 2. Do the necessary approvals and make the calls - const approval0: BN = await massetMachine.approveMasset( - inputBasset, - mAsset, - swapQuantity, - sender, - ); - await mAsset.swap( - inputBasset.address, - outputAsset.address, - approval0, - recipient, - { from: sender }, - ); - // Senders balance goes down but vaultbalance goes up by less - - // 3. Calculate expected responses - const inputQuantityExact = simpleToExactAmount( - swapQuantity, - await inputBasset.decimals(), - ); - const scaledInputQuantity = simpleToExactAmount(swapQuantity, 18); - const expectedOutputValue = scaledInputQuantity - .mul(ratioScale) - .div(new BN(outputBassetBefore.ratio)); - - const feeRate = await mAsset.swapFee(); - const fee = expectedOutputValue.mul(feeRate).div(fullScale); - - // Input - // Sender should have less input bAsset after - const swapperBassetBalAfter = await inputBasset.balanceOf(sender); - expect(swapperBassetBalAfter).bignumber.eq( - swapperInputBalBefore.sub(inputQuantityExact), - ); - // VaultBalance should update for input bAsset - const inputBassetAfter = await basketManager.getBasset(inputBasset.address); - expect(new BN(inputBassetAfter.vaultBalance)).bignumber.eq( - new BN(inputBassetBefore.vaultBalance).add(inputQuantityExact), - ); - // Output - // Recipient should have output asset quantity after (minus fee) - const recipientBalAfter = await outputAsset.balanceOf(recipient); - // Assert recipient only receives x amount - assertBNSlightlyGTPercent( - expectedOutputValue.sub(fee), - recipientBalAfter.sub(recipientOutputBalBefore), - "0.3", - true, - ); - - // Complete basket should remain in healthy state - await assertBasketIsHealthy(massetMachine, massetDetails); - }); - it("should continue to pay out", async () => { - const { bAssets, mAsset, basketManager } = massetDetails; - const sender = sa.default; - const recipient = sa.dummy1; - const inputBasset = bAssets[0]; - const outputAsset = bAssets[3]; - const swapQuantity = new BN(1); - await basketManager.setTransferFeesFlag(outputAsset.address, false, { - from: sa.governor, - }); - - // 1. Get basic before data about the actors balances - const swapperInputBalBefore = await inputBasset.balanceOf(sender); - const recipientOutputBalBefore = await outputAsset.balanceOf(recipient); - - // Get basic before data on the swap assets - const inputBassetBefore = await basketManager.getBasset( - inputBasset.address, - ); - const outputBassetBefore = await basketManager.getBasset( - outputAsset.address, - ); - - // 2. Do the necessary approvals and make the calls - const approval0: BN = await massetMachine.approveMasset( - inputBasset, - mAsset, - swapQuantity, - sender, - ); - await mAsset.swap( - inputBasset.address, - outputAsset.address, - approval0, - recipient, - { from: sender }, - ); - // Senders balance goes down but vaultbalance goes up by less - - // 3. Calculate expected responses - const inputQuantityExact = simpleToExactAmount( - swapQuantity, - await inputBasset.decimals(), - ); - const scaledInputQuantity = simpleToExactAmount(swapQuantity, 18); - const expectedOutputValue = scaledInputQuantity - .mul(ratioScale) - .div(new BN(outputBassetBefore.ratio)); - - const feeRate = await mAsset.swapFee(); - const fee = expectedOutputValue.mul(feeRate).div(fullScale); - - // Input - // Sender should have less input bAsset after - const swapperBassetBalAfter = await inputBasset.balanceOf(sender); - expect(swapperBassetBalAfter).bignumber.eq( - swapperInputBalBefore.sub(inputQuantityExact), - ); - // VaultBalance should update for input bAsset - const inputBassetAfter = await basketManager.getBasset(inputBasset.address); - expect(new BN(inputBassetAfter.vaultBalance)).bignumber.eq( - new BN(inputBassetBefore.vaultBalance).add(inputQuantityExact), - ); - // Output - // Recipient should have output asset quantity after (minus fee) - const recipientBalAfter = await outputAsset.balanceOf(recipient); - // Assert recipient only receives x amount - assertBNSlightlyGTPercent( - expectedOutputValue.sub(fee), - recipientBalAfter.sub(recipientOutputBalBefore), - "0.3", - true, - ); - }); - }); - }); - context("with an affected bAsset", async () => { - beforeEach(async () => { - await runSetup(); - }); - it("should fail if input basset status is not Normal", async () => { - const { bAssets, mAsset, basketManager } = massetDetails; - await assertBasketIsHealthy(massetMachine, massetDetails); - - const input = bAssets[0]; - const output = bAssets[1]; - - await basketManager.handlePegLoss(input.address, true, { - from: sa.governor, - }); - const inputBasset = await basketManager.getBasset(input.address); - expect(inputBasset.status).to.eq(BassetStatus.BrokenBelowPeg.toString()); - const outputBasset = await basketManager.getBasset(output.address); - expect(outputBasset.status).to.eq(BassetStatus.Normal.toString()); - await assertFailedSwap(mAsset, input, output, 1, "bAsset not allowed in swap"); - }); - it("should fail if output basset status is not Normal", async () => { - const { bAssets, mAsset, basketManager } = massetDetails; - await assertBasketIsHealthy(massetMachine, massetDetails); - - const input = bAssets[0]; - const output = bAssets[1]; - - await basketManager.handlePegLoss(output.address, true, { - from: sa.governor, - }); - const inputBasset = await basketManager.getBasset(input.address); - expect(inputBasset.status).to.eq(BassetStatus.Normal.toString()); - const outputBasset = await basketManager.getBasset(output.address); - expect(outputBasset.status).to.eq(BassetStatus.BrokenBelowPeg.toString()); - await assertFailedSwap(mAsset, input, output, 1, "bAsset not allowed in swap"); - }); - }); - context("pushing the weighting beyond the maximum limit", async () => { - before(async () => { - await runSetup(false, false); - }); - it("should succeed so long as the input doesn't exceed max", async () => { - const { bAssets, mAsset, basketManager } = massetDetails; - await assertBasketIsHealthy(massetMachine, massetDetails); - - const composition = await massetMachine.getBasketComposition(massetDetails); - // Expect 4 bAssets with 100 weightings - composition.bAssets.forEach((b) => { - expect(b.vaultBalance).bignumber.eq(new BN(0)); - expect(b.maxWeight).bignumber.eq(simpleToExactAmount(100, 16)); - }); - // Mint 25 of each bAsset, taking total to 100% - await seedWithWeightings( - massetDetails, - composition.bAssets.map(() => new BN(25)), - ); - // Set updated weightings - await basketManager.setBasketWeights( - bAssets.map((b) => b.address), - bAssets.map(() => simpleToExactAmount(25, 16)), - { - from: sa.governor, - }, - ); - - // Assert basket is still healthy with 25 weightings - await assertBasketIsHealthy(massetMachine, massetDetails); - - // Should revert since we would be pushing above target - const input = bAssets[0]; - const output = bAssets[1]; - await assertFailedSwap( - mAsset, - input, - output, - 1, - "Input must remain below max weighting", - ); - await assertFailedSwap( - mAsset, - input, - mAsset as any, - 1, - "bAssets used in mint cannot exceed their max weight", - ); - // Set sufficient weightings allowance - await basketManager.setBasketWeights( - [input.address], - [simpleToExactAmount(27, 16)], - { - from: sa.governor, - }, - ); - - // Swap should pass now - await assertSwap(massetDetails, input, output, 1, true); - }); - }); - }); - context("with a fluctuating basket", async () => { - describe("swapping when a bAsset has just been removed from the basket", async () => { - before(async () => { - await runSetup(false); - const { bAssets, basketManager } = massetDetails; - await seedWithWeightings(massetDetails, [ - new BN(50), - new BN(0), - new BN(50), - new BN(50), - ]); - // From [A, B, C, D], remove B, replacing it with D - await basketManager.setBasketWeights( - bAssets.map((b) => b.address), - [ - simpleToExactAmount(50, 16), - new BN(0), - simpleToExactAmount(50, 16), - simpleToExactAmount(50, 16), - ], - { from: sa.governor }, - ); - await basketManager.removeBasset(bAssets[1].address, { from: sa.governor }); - }); - it("should still deposit to the right lending platform", async () => { - const { bAssets } = massetDetails; - const removedBasset = bAssets[1]; - const input = bAssets[0]; - const output = bAssets[3]; - const removedBassetBalBefore = await removedBasset.balanceOf(sa.default); - await assertSwap(massetDetails, input, output, 1, true, sa.default); - const removedBassetBalAfter = await removedBasset.balanceOf(sa.default); - expect(removedBassetBalBefore).bignumber.eq(removedBassetBalAfter); - }); - it("should not be possible to swap with the removed bAsset", async () => { - const { bAssets, mAsset } = massetDetails; - await assertFailedSwap( - mAsset, - bAssets[1], - bAssets[0], - 1, - "Input asset does not exist", - ); - }); - }); - }); - context("when the weights exceeds the ForgeValidator limit", async () => { - let composition: BasketComposition; - beforeEach(async () => { - await runSetup(false, false); - const { bAssets, basketManager } = massetDetails; - composition = await massetMachine.getBasketComposition(massetDetails); - // Expect 4 bAssets with 100 weightings - composition.bAssets.forEach((b) => { - expect(b.vaultBalance).bignumber.eq(new BN(0)); - expect(b.maxWeight).bignumber.eq(simpleToExactAmount(100, 16)); - }); - // Mint 0, 50, 25, 25 of each bAsset, taking total to 100 - await seedWithWeightings(massetDetails, [ - new BN(0), - new BN(50), - new BN(25), - new BN(25), - ]); - // Refactor the weightings to push some overweight - await basketManager.setBasketWeights( - bAssets.map((b) => b.address), - bAssets.map(() => simpleToExactAmount(25, 16)), - { - from: sa.governor, - }, - ); - }); - it("should succeed if input bAsset is underweight", async () => { - const { bAssets, mAsset } = massetDetails; - // Assert bAssets are now classed as overweight/underweight - composition = await massetMachine.getBasketComposition(massetDetails); - expect(composition.bAssets[1].overweight).to.eq(true); - // Should succeed since we would be pushing towards target - const underweightAsset = bAssets[0]; - const output = bAssets[2]; - await assertSwap( - massetDetails, - underweightAsset, - output, - 1, - true, - sa.default, - sa.default, - true, - ); - // Should fail if we swap in something else that will go over - expect(composition.bAssets[3].overweight).to.eq(false); - const borderlineAsset = bAssets[3]; - await assertFailedSwap( - mAsset, - borderlineAsset, - output, - 1, - "Input must remain below max weighting", - ); - }); - it("should charge no swap fee if output asset is overweight", async () => { - const { bAssets } = massetDetails; - // Assert bAssets are now classed as overweight/underweight - composition = await massetMachine.getBasketComposition(massetDetails); - expect(composition.bAssets[1].overweight).to.eq(true); - // Should succeed since we would be pushing towards target - const underweightAsset = bAssets[0]; - const overweightAsset = bAssets[1]; - await assertSwap( - massetDetails, - underweightAsset, - overweightAsset, - 1, - false, - sa.default, - sa.default, - true, - ); - }); - it("should fail if input bAsset exceeds max", async () => { - const { bAssets, mAsset } = massetDetails; - // Assert bAssets are now classed as overweight/underweight - composition = await massetMachine.getBasketComposition(massetDetails); - expect(composition.bAssets[1].overweight).to.eq(true); - // Should fail if we swap in something already overweight - const bAsset1 = bAssets[1]; - await assertFailedSwap( - mAsset, - bAsset1, - bAssets[2], - 1, - "Input must remain below max weighting", - ); - }); - }); - context("when there are a large number of bAssets in the basket", async () => { - // Create a basket filled with 16 bAssets, all hooked into the Mock intergation platform - before(async () => { - await runSetup(false); - const { aaveIntegration, basketManager } = massetDetails; - const aaveAddress = await aaveIntegration.platformAddress(); - const mockAave = await MockAave.at(aaveAddress); - await seedWithWeightings(massetDetails, [ - new BN(100), - new BN(0), - new BN(0), - new BN(0), - ]); - // Create 6 new bAssets - for (let i = 0; i < 6; i += 1) { - const mockBasset = await MockERC20.new( - `MKI${i}`, - `MI${i}`, - 18, - sa.default, - 100000000, - ); - const mockAToken = await MockAToken.new(aaveAddress, mockBasset.address); - // Add to the mock aave platform - await mockAave.addAToken(mockAToken.address, mockBasset.address); - // Add the pToken to our integration - await aaveIntegration.setPTokenAddress(mockBasset.address, mockAToken.address, { - from: sa.governor, - }); - // Add the bAsset to the basket - await basketManager.addBasset( - mockBasset.address, - aaveIntegration.address, - false, - { from: sa.governor }, - ); - } - }); - it("should still perform with 10 bAssets in the basket", async () => { - const { basketManager, mAsset } = massetDetails; - // Assert that we have indeed 10 bAssets - const onChainBassets = await massetMachine.getBassetsInMasset(massetDetails); - expect(onChainBassets.length).to.eq(10); - massetDetails.bAssets = onChainBassets.map((o) => o.contract); - // Set equal basket weightings - await basketManager.setBasketWeights( - onChainBassets.map((b) => b.addr), - onChainBassets.map(() => simpleToExactAmount(10, 16)), - { from: sa.governor }, - ); - const approvals = await Promise.all( - onChainBassets - .slice(1) - .map((b, i) => - massetMachine.approveMasset(b.contract, mAsset, new BN(8), sa.default), - ), - ); - await mAsset.mintMulti( - onChainBassets.slice(1).map((b) => b.contract.address), - approvals, - sa.default, - { from: sa.default }, - ); - for (let i = 1; i < onChainBassets.length - 1; i += 1) { - const input = onChainBassets[i].contract; - const output = onChainBassets[i + 1].contract; - const approval0: BN = await massetMachine.approveMasset( - input, - mAsset, - 1, - sa.default, - ); - await mAsset.swap(input.address, output.address, approval0, sa.default); - } - }); - }); - context("when the mAsset is undergoing change", () => { - beforeEach(async () => { - await runSetup(false); - }); - describe("when basket has failed", async () => { - it("should throw", async () => { - const { bAssets, mAsset, basketManager } = massetDetails; - await assertBasketIsHealthy(massetMachine, massetDetails); - await basketManager.setBasket(true, fullScale); - const input = bAssets[0]; - const output = bAssets[1]; - await assertFailedSwap(mAsset, input, output, 1, "Basket is undergoing change"); - }); - }); - describe("when basket is paused", async () => { - it("should throw", async () => { - const { bAssets, mAsset, basketManager } = massetDetails; - const input = bAssets[0]; - const output = bAssets[1]; - await basketManager.pause({ from: sa.governor }); - expect(await basketManager.paused()).eq(true); - await assertFailedSwap( - mAsset, - input, - output, - 1, - "Pausable: paused", - sa.default, - sa.default, - true, - true, - ); - }); - }); - describe("when basket undergoing recol", async () => { - it("should throw", async () => { - const { bAssets, mAsset, basketManager } = massetDetails; - await assertBasketIsHealthy(massetMachine, massetDetails); - await basketManager.setRecol(true); - const input = bAssets[0]; - const output = bAssets[1]; - await assertFailedSwap(mAsset, input, output, 1, "Basket is undergoing change"); - }); - }); - }); - }); -}); diff --git a/test/masset/admin.spec.ts b/test/masset/admin.spec.ts new file mode 100644 index 00000000..87a9f97c --- /dev/null +++ b/test/masset/admin.spec.ts @@ -0,0 +1,902 @@ +/* eslint-disable @typescript-eslint/no-loop-func */ +/* eslint-disable no-restricted-syntax */ +/* eslint-disable @typescript-eslint/no-unused-expressions */ +import { ethers } from "hardhat" +import { expect } from "chai" + +import { simpleToExactAmount, BN, applyRatio } from "@utils/math" +import { MassetDetails, MassetMachine, StandardAccounts } from "@utils/machines" + +import { DEAD_ADDRESS, MAX_UINT256, ONE_DAY, ONE_HOUR, ONE_WEEK, TEN_MINS, ZERO_ADDRESS } from "@utils/constants" +import { + Masset, + MockNexus, + MockPlatformIntegration, + MaliciousAaveIntegration, + MaliciousAaveIntegration__factory, + MockERC20, + MockPlatformIntegration__factory, +} from "types/generated" +import { assertBNSlightlyGTPercent } from "@utils/assertions" +import { keccak256, toUtf8Bytes } from "ethers/lib/utils" +import { BassetStatus } from "@utils/mstable-objects" +import { getTimestamp, increaseTime } from "@utils/time" + +describe("Masset Admin", () => { + let sa: StandardAccounts + let mAssetMachine: MassetMachine + let details: MassetDetails + + /** + * @dev (Re)Sets the local variables for this test file + * @param seedBasket mints 25 tokens for each bAsset + * @param useTransferFees enables transfer fees on bAssets [2,3] + */ + const runSetup = async ( + seedBasket = true, + useTransferFees = false, + useLendingMarkets = false, + useMockValidator = true, + weights: number[] = [25, 25, 25, 25], + ): Promise => { + details = await mAssetMachine.deployMasset(useMockValidator, useLendingMarkets, useTransferFees) + if (seedBasket) { + await mAssetMachine.seedWithWeightings(details, weights) + } + } + + before("Init contract", async () => { + const accounts = await ethers.getSigners() + mAssetMachine = await new MassetMachine().initAccounts(accounts) + sa = mAssetMachine.sa + + await runSetup() + }) + + describe("using basic setters", async () => { + const newSize = simpleToExactAmount(1, 16) // 1% + let mAsset: Masset + before("set up", async () => { + await runSetup(true) + mAsset = await details.mAsset.connect(sa.governor.signer) + }) + describe("should allow changing of the cache size to ", () => { + it("zero", async () => { + const tx = mAsset.setCacheSize(0) + await expect(tx).to.emit(mAsset, "CacheSizeChanged").withArgs(0) + expect(await mAsset.cacheSize()).eq(0) + }) + it("1%", async () => { + const oldSize = await mAsset.cacheSize() + expect(oldSize).not.eq(newSize) + const tx = mAsset.setCacheSize(newSize) + await expect(tx).to.emit(mAsset, "CacheSizeChanged").withArgs(newSize) + expect(await mAsset.cacheSize()).eq(newSize) + }) + it("20% (cap limit)", async () => { + const capLimit = simpleToExactAmount(20, 16) // 20% + const tx = mAsset.setCacheSize(capLimit) + await expect(tx).to.emit(mAsset, "CacheSizeChanged").withArgs(capLimit) + expect(await mAsset.cacheSize()).eq(capLimit) + }) + }) + describe("should fail changing the cache size if", () => { + it("not governor", async () => { + await expect(details.mAsset.connect(sa.default.signer).setCacheSize(newSize)).to.be.revertedWith( + "Only governor can execute", + ) + await expect(details.mAsset.connect(sa.dummy1.signer).setCacheSize(newSize)).to.be.revertedWith("Only governor can execute") + }) + it("just over cap", async () => { + const feeExceedingCap = BN.from("200000000000000001") + await expect(mAsset.setCacheSize(feeExceedingCap)).to.be.revertedWith("Must be <= 20%") + }) + it("exceed cap by 1%", async () => { + const feeExceedingCap = simpleToExactAmount(21, 16) // 21% + await expect(mAsset.setCacheSize(feeExceedingCap)).to.be.revertedWith("Must be <= 20%") + }) + it("exceeding cap with max number", async () => { + await expect(mAsset.setCacheSize(MAX_UINT256)).to.be.revertedWith("Must be <= 20%") + }) + }) + it("should allow upgrade of the ForgeValidator by governor", async () => { + const otherAddress = sa.other.address + const tx = mAsset.upgradeForgeValidator(otherAddress) + await expect(tx).to.emit(mAsset, "ForgeValidatorChanged").withArgs(otherAddress) + expect(await mAsset.forgeValidator()).eq(otherAddress) + }) + describe("should fail to upgrade the ForgeValidator if", () => { + it("not governor", async () => { + await expect(details.mAsset.upgradeForgeValidator(sa.dummy2.address)).to.be.revertedWith("Only governor can execute") + }) + it("zero contract address", async () => { + await expect(mAsset.upgradeForgeValidator(ZERO_ADDRESS)).to.be.revertedWith("Null address") + }) + }) + describe("should change swap and redemption fees to", () => { + it("0.5% and 0.25%", async () => { + const oldSwapFee = await mAsset.swapFee() + const oldRedemptionFee = await mAsset.redemptionFee() + const newSwapFee = simpleToExactAmount(0.5, 16) + const newRedemptionFee = simpleToExactAmount(0.25, 16) + expect(oldSwapFee).not.eq(newSwapFee) + expect(oldRedemptionFee).not.eq(newRedemptionFee) + const tx = mAsset.setFees(newSwapFee, newRedemptionFee) + await expect(tx).to.emit(mAsset, "FeesChanged").withArgs(newSwapFee, newRedemptionFee) + expect(await mAsset.swapFee()).eq(newSwapFee) + expect(await mAsset.redemptionFee()).eq(newRedemptionFee) + }) + it("2% (limit)", async () => { + const newFee = simpleToExactAmount(2, 16) + await mAsset.setFees(newFee, newFee) + const tx = mAsset.setFees(newFee, newFee) + await expect(tx).to.emit(mAsset, "FeesChanged").withArgs(newFee, newFee) + expect(await mAsset.swapFee()).eq(newFee) + expect(await mAsset.redemptionFee()).eq(newFee) + }) + }) + describe("should fail to change swap fee rate when", () => { + it("not governor", async () => { + const fee = simpleToExactAmount(2, 16) + await expect(details.mAsset.setFees(fee, fee)).to.be.revertedWith("Only governor can execute") + }) + it("Swap rate just exceeds 2% cap", async () => { + await expect(mAsset.setFees("20000000000000001", "20000000000000000")).to.be.revertedWith("Swap rate oob") + }) + it("Redemption rate just exceeds 2% cap", async () => { + await expect(mAsset.setFees("20000000000000000", "20000000000000001")).to.be.revertedWith("Redemption rate oob") + }) + it("3% rate exceeds 2% cap", async () => { + const fee = simpleToExactAmount(3, 16) // 3% + await expect(mAsset.setFees(fee, fee)).to.be.revertedWith("Swap rate oob") + }) + it("max rate", async () => { + const fee = MAX_UINT256 + await expect(mAsset.setFees(fee, fee)).to.be.revertedWith("Swap rate oob") + }) + }) + describe("should set transfer fee flag", async () => { + it("when no integration balance", async () => { + let personalData = await mAsset.bAssetPersonal(3) + expect(personalData.hasTxFee).to.be.false + + const tx = mAsset.connect(sa.governor.signer).setTransferFeesFlag(personalData.addr, true) + await expect(tx).to.emit(details.managerLib, "TransferFeeEnabled").withArgs(personalData.addr, true) + personalData = await mAsset.bAssetPersonal(3) + expect(personalData.hasTxFee).to.be.true + + // restore the flag back to false + const tx2 = mAsset.connect(sa.governor.signer).setTransferFeesFlag(personalData.addr, false) + await expect(tx2).to.emit(details.managerLib, "TransferFeeEnabled").withArgs(personalData.addr, false) + await tx2 + personalData = await mAsset.bAssetPersonal(3) + expect(personalData.hasTxFee).to.be.false + }) + it("when an integration balance", async () => { + await runSetup(true, false, true) + + const personalData = await details.mAsset.bAssetPersonal(2) + expect(personalData.hasTxFee).to.be.false + + const tx = details.mAsset.connect(sa.governor.signer).setTransferFeesFlag(personalData.addr, true) + await expect(tx).to.emit(details.managerLib, "TransferFeeEnabled").withArgs(personalData.addr, true) + const personalDataAfter = await details.mAsset.bAssetPersonal(2) + expect(personalDataAfter.hasTxFee).to.be.true + + // restore the flag back to false + const tx2 = details.mAsset.connect(sa.governor.signer).setTransferFeesFlag(personalData.addr, false) + await expect(tx2).to.emit(details.managerLib, "TransferFeeEnabled").withArgs(personalData.addr, false) + const personalDataAfterRestore = await details.mAsset.bAssetPersonal(2) + expect(personalDataAfterRestore.hasTxFee).to.be.false + }) + }) + it("should set max weight", async () => { + const beforeWeightLimits = await mAsset.weightLimits() + const newMinWeight = simpleToExactAmount(1, 16) + const newMaxWeight = simpleToExactAmount(334, 15) + const tx = mAsset.setWeightLimits(newMinWeight, newMaxWeight) + await expect(tx, "WeightLimitsChanged event").to.emit(mAsset, "WeightLimitsChanged").withArgs(newMinWeight, newMaxWeight) + await tx + const afterWeightLimits = await mAsset.weightLimits() + expect(afterWeightLimits.min, "before and after min weight not equal").not.to.eq(beforeWeightLimits.min) + expect(afterWeightLimits.max, "before and after max weight not equal").not.to.eq(beforeWeightLimits.max) + expect(afterWeightLimits.min, "min weight set").to.eq(newMinWeight) + expect(afterWeightLimits.max, "max weight set").to.eq(newMaxWeight) + }) + describe("failed set max weight", () => { + const newMinWeight = simpleToExactAmount(1, 16) + const newMaxWeight = simpleToExactAmount(620, 15) + it("should fail setWeightLimits with default signer", async () => { + await expect(mAsset.connect(sa.default.signer).setWeightLimits(newMinWeight, newMaxWeight)).to.revertedWith( + "Only governor can execute", + ) + }) + it("should fail setWeightLimits with dummy signer", async () => { + await expect(mAsset.connect(sa.dummy1.signer).setWeightLimits(newMinWeight, newMaxWeight)).to.revertedWith( + "Only governor can execute", + ) + }) + it("should fail setWeightLimits with max weight too small", async () => { + await expect(mAsset.setWeightLimits(newMinWeight, simpleToExactAmount(332, 15))).to.revertedWith("Max weight oob") + }) + it("should fail setWeightLimits with min weight too large", async () => { + await expect(mAsset.setWeightLimits(simpleToExactAmount(14, 16), newMaxWeight)).to.revertedWith("Min weight oob") + }) + }) + }) + context("getters without setters", () => { + before("init basset", async () => { + await runSetup() + }) + it("get config", async () => { + const { mAsset } = details + const config = await mAsset.getConfig() + expect(config.limits.min, "minWeight").to.eq(simpleToExactAmount(5, 16)) + expect(config.limits.max, "maxWeight").to.eq(simpleToExactAmount(55, 16)) + expect(config.a, "a value").to.eq(10000) + }) + it("should get bAsset", async () => { + const { mAsset, bAssets } = details + const bAsset = await mAsset.getBasset(bAssets[0].address) + expect(bAsset.personal.addr).to.eq(bAsset[0].addr) + expect(bAsset.personal.hasTxFee).to.false + expect(bAsset.personal.integrator).to.eq(bAsset[0].integrator) + expect(bAsset.personal.status).to.eq(BassetStatus.Normal) + }) + it("should fail to get bAsset with address 0x0", async () => { + await expect(details.mAsset.getBasset(ZERO_ADDRESS)).to.revertedWith("Invalid asset") + }) + it("should fail to get bAsset not in basket", async () => { + await expect(details.mAsset.getBasset(sa.dummy1.address)).to.revertedWith("Invalid asset") + }) + }) + context("collecting interest", async () => { + const unbalancedWeights = [0, 1, 200, 300] + beforeEach("init basset with vaults", async () => { + await runSetup(true, false, true, true, unbalancedWeights) + // 1.0 Simulate some activity on the lending markets + // Fast forward a bit so platform interest can be collected + await increaseTime(TEN_MINS.toNumber()) + }) + it("Collect interest before any fees have been generated", async () => { + const { mAsset } = details + + // 1.0 Get all balances and data before + expect(await mAsset.surplus()).to.eq(0) + const totalSupplyBefore = await mAsset.totalSupply() + + // 2.0 Static call collectInterest to validate the return values + const { mintAmount, newSupply } = await mAsset.connect(sa.mockSavingsManager.signer).callStatic.collectInterest() + expect(mintAmount, "mintAmount").to.eq(0) + expect(newSupply, "totalSupply").to.eq(totalSupplyBefore) + + // 3.0 Collect the interest + const tx = mAsset.connect(sa.mockSavingsManager.signer).collectInterest() + await expect(tx).to.not.emit(mAsset, "MintedMulti") + + // 4.0 Check outputs + expect(await mAsset.surplus()).to.eq(0) + }) + it("should collect interest after fees generated from swap", async () => { + const { bAssets, mAsset } = details + + // 1.0 Do the necessary approvals before swap + await mAssetMachine.approveMasset(bAssets[3], mAsset, 20) + // Do a swap to generate some fees + await mAsset.swap(bAssets[3].address, bAssets[2].address, simpleToExactAmount(20, 18), 0, sa.dummy1.address) + + // 2.0 Get all balances and data before + const surplus = await mAsset.surplus() + const mAssetBalBefore = await mAsset.balanceOf(sa.mockSavingsManager.address) + const totalSupplyBefore = await mAsset.totalSupply() + + // 3.0 Check the SavingsManager in the mock Nexus contract + const nexus = (await ethers.getContractAt("MockNexus", await mAsset.nexus())) as MockNexus + const savingsManagerInNexus = await nexus.getModule(keccak256(toUtf8Bytes("SavingsManager"))) + expect(savingsManagerInNexus, "savingsManagerInNexus").to.eq(sa.mockSavingsManager.address) + + // 4.0 Static call collectInterest to validate the return values + const { mintAmount, newSupply } = await mAsset.connect(sa.mockSavingsManager.signer).callStatic.collectInterest() + expect(mintAmount, "mintAmount").to.eq(surplus.sub(1)) + expect(newSupply, "totalSupply").to.eq(totalSupplyBefore.add(surplus).sub(1)) + + // 5.0 Collect the interest + const tx = mAsset.connect(sa.mockSavingsManager.signer).collectInterest() + + // 6.0 Event emits correct unit + await expect(tx, "MintedMulti event").to.emit(mAsset, "MintedMulti") + // .withArgs(mAsset.address, sa.mockSavingsManager.address, surplus.sub(1), [], []) + await tx + + // 7.0 Check outputs + expect(await mAsset.surplus(), "after surplus").to.eq(1) + expect(await mAsset.balanceOf(sa.mockSavingsManager.address), "after Saving Manager balance").eq( + mAssetBalBefore.add(surplus).sub(1), + ) + expect(await mAsset.totalSupply(), "after totalSupply").to.eq(totalSupplyBefore.add(surplus).sub(1)) + }) + it("should collect platform interest", async () => { + // 1.0 Another Mint to generate platform interest to collect + await mAssetMachine.seedWithWeightings(details, unbalancedWeights) + + // 2.0 Get all balances and data before + const mAssetBalBefore = await details.mAsset.balanceOf(sa.mockSavingsManager.address) + const bassetsBefore = await mAssetMachine.getBassetsInMasset(details) + const sumOfVaultsBefore = bassetsBefore.reduce((p, c) => p.add(applyRatio(c.vaultBalance, c.ratio)), BN.from(0)) + const totalSupplyBefore = await details.mAsset.totalSupply() + + // 3.0 Check the SavingsManager in the mock Nexus contract + const nexus = (await ethers.getContractAt("MockNexus", await details.mAsset.nexus())) as MockNexus + const savingsManagerInNexus = await nexus.getModule(keccak256(toUtf8Bytes("SavingsManager"))) + expect(savingsManagerInNexus, "savingsManagerInNexus").eq(sa.mockSavingsManager.address) + + // 4.0 Static call of collectPlatformInterest + const mAsset = details.mAsset.connect(sa.mockSavingsManager.signer) + const { mintAmount, newSupply } = await mAsset.callStatic.collectPlatformInterest() + + // 5.0 Collect platform interest + const collectPlatformInterestTx = mAsset.collectPlatformInterest() + + // 6.0 Event emits correct unit + await expect(collectPlatformInterestTx, "MintedMulti event on mAsset") + .to.emit(mAsset, "MintedMulti") + .withArgs( + mAsset.address, + sa.mockSavingsManager.address, + mintAmount, + [], + [0, 0, simpleToExactAmount(4, 9), simpleToExactAmount(6, 15)], + ) + await expect(collectPlatformInterestTx, "Transfer event on mAsset") + .to.emit(mAsset, "Transfer") + .withArgs(ZERO_ADDRESS, sa.mockSavingsManager.address, mintAmount) + + // 7.0 Check outputs + const mAssetBalAfter = await details.mAsset.balanceOf(sa.mockSavingsManager.address) + const bassetsAfter = await mAssetMachine.getBassetsInMasset(details) + bassetsAfter.forEach((b, i) => { + if (i > 1) { + expect(b.vaultBalance, `balance of bAsset[${i}] not increased`).gt(bassetsBefore[i].vaultBalance) + } + }) + const sumOfVaultsAfter = bassetsAfter.reduce((p, c) => p.add(applyRatio(c.vaultBalance, c.ratio)), BN.from(0)) + const totalSupplyAfter = await details.mAsset.totalSupply() + expect(newSupply).to.eq(totalSupplyAfter) + + // 6.1 totalSupply should only increase by <= 0.0005% + // assertBNSlightlyGTPercent(totalSupplyAfter, totalSupplyBefore, systemMachine.isGanacheFork ? "0.001" : "0.01", true) + assertBNSlightlyGTPercent(totalSupplyAfter, totalSupplyBefore, "0.01", true) + // 6.2 check that increase in vault balance is equivalent to total balance + const increasedTotalSupply = totalSupplyAfter.sub(totalSupplyBefore) + expect(increasedTotalSupply, "increasedTotalSupply").eq(sumOfVaultsAfter.sub(sumOfVaultsBefore)) + expect(mintAmount).to.eq(increasedTotalSupply) + // 6.3 Ensure that the SavingsManager received the mAsset + expect(mAssetBalAfter, "mAssetBalAfter").eq(mAssetBalBefore.add(increasedTotalSupply)) + }) + it("should fail to collect platform interest after no activity", async () => { + const mAsset = details.mAsset.connect(sa.mockSavingsManager.signer) + await expect(mAsset.callStatic.collectPlatformInterest()).to.revertedWith("Must collect something") + }) + context("only allow the SavingsManager to collect interest", () => { + it("should fail governor", async () => { + const { signer } = sa.governor + await expect(details.mAsset.connect(signer).collectInterest()).to.be.revertedWith("Must be savings manager") + await expect(details.mAsset.connect(signer).collectPlatformInterest()).to.be.revertedWith("Must be savings manager") + }) + it("should fail the default signer that deployed the contracts", async () => { + const { signer } = sa.default + await expect(details.mAsset.connect(signer).collectInterest()).to.be.revertedWith("Must be savings manager") + await expect(details.mAsset.connect(signer).collectPlatformInterest()).to.be.revertedWith("Must be savings manager") + }) + }) + }) + + describe("migrating bAssets between platforms", () => { + let newMigration: MockPlatformIntegration + let maliciousIntegration: MaliciousAaveIntegration + let transferringAsset: MockERC20 + beforeEach(async () => { + await runSetup(false, false, true, true) + ;[, , , transferringAsset] = details.bAssets + newMigration = await (await new MockPlatformIntegration__factory(sa.default.signer)).deploy( + DEAD_ADDRESS, + details.aavePlatformAddress, + details.bAssets.map((b) => b.address), + details.pTokens, + ) + await newMigration.addWhitelist([details.mAsset.address]) + maliciousIntegration = await (await new MaliciousAaveIntegration__factory(sa.default.signer)).deploy( + DEAD_ADDRESS, + details.aavePlatformAddress, + details.bAssets.map((b) => b.address), + details.pTokens, + ) + await maliciousIntegration.addWhitelist([details.mAsset.address]) + }) + it("should fail if passed 0 bAssets", async () => { + await expect(details.mAsset.connect(sa.governor.signer).migrateBassets([], newMigration.address)).to.be.revertedWith( + "Must migrate some bAssets", + ) + }) + it("should fail if bAsset does not exist", async () => { + await expect( + details.mAsset.connect(sa.governor.signer).migrateBassets([DEAD_ADDRESS], newMigration.address), + ).to.be.revertedWith("Invalid asset") + }) + it("should fail if integrator address is the same", async () => { + await expect( + details.mAsset.connect(sa.governor.signer).migrateBassets([transferringAsset.address], details.platform.address), + ).to.be.revertedWith("Must transfer to new integrator") + }) + it("should fail if new address is a dud", async () => { + await expect(details.mAsset.connect(sa.governor.signer).migrateBassets([transferringAsset.address], DEAD_ADDRESS)).to.be + .reverted + }) + it("should fail if the full amount is not transferred and deposited", async () => { + await transferringAsset.transfer(details.platform.address, 10000) + await details.platform.addWhitelist([sa.governor.address]) + await details.platform.connect(sa.governor.signer).deposit(transferringAsset.address, 9000, false) + await expect( + details.mAsset.connect(sa.governor.signer).migrateBassets([transferringAsset.address], maliciousIntegration.address), + ).to.be.revertedWith("Must transfer full amount") + }) + it("should move all bAssets from a to b", async () => { + await transferringAsset.transfer(details.platform.address, 10000) + await details.platform.addWhitelist([sa.governor.address]) + await details.platform.connect(sa.governor.signer).deposit(transferringAsset.address, 9000, false) + // get balances before + const bal = await details.platform.callStatic.checkBalance(transferringAsset.address) + expect(bal).eq(9000) + const rawBal = await transferringAsset.balanceOf(details.platform.address) + expect(rawBal).eq(1000) + const integratorAddress = (await details.mAsset.getBasset(transferringAsset.address))[0][1] + expect(integratorAddress).eq(details.platform.address) + // call migrate + const tx = details.mAsset.connect(sa.governor.signer).migrateBassets([transferringAsset.address], newMigration.address) + // emits BassetsMigrated + await expect(tx).to.emit(details.managerLib, "BassetsMigrated").withArgs([transferringAsset.address], newMigration.address) + // moves all bAssets from old to new + const migratedBal = await newMigration.callStatic.checkBalance(transferringAsset.address) + expect(migratedBal).eq(bal) + const migratedRawBal = await transferringAsset.balanceOf(newMigration.address) + expect(migratedRawBal).eq(rawBal) + // old balances should be empty + const newRawBal = await transferringAsset.balanceOf(details.platform.address) + expect(newRawBal).eq(0) + // updates the integrator address + const [[, newIntegratorAddress]] = await details.mAsset.getBasset(transferringAsset.address) + expect(newIntegratorAddress).eq(newMigration.address) + }) + it("should pass if either rawBalance or balance are 0", async () => { + await transferringAsset.transfer(details.platform.address, 10000) + await details.platform.addWhitelist([sa.governor.address]) + await details.platform.connect(sa.governor.signer).deposit(transferringAsset.address, 10000, false) + // get balances before + const bal = await details.platform.callStatic.checkBalance(transferringAsset.address) + expect(bal).eq(10000) + const rawBal = await transferringAsset.balanceOf(details.platform.address) + expect(rawBal).eq(0) + const integratorAddress = (await details.mAsset.getBasset(transferringAsset.address))[0][1] + expect(integratorAddress).eq(details.platform.address) + // call migrate + const tx = details.mAsset.connect(sa.governor.signer).migrateBassets([transferringAsset.address], newMigration.address) + // emits BassetsMigrated + await expect(tx).to.emit(details.managerLib, "BassetsMigrated").withArgs([transferringAsset.address], newMigration.address) + // moves all bAssets from old to new + const migratedBal = await newMigration.callStatic.checkBalance(transferringAsset.address) + expect(migratedBal).eq(bal) + const migratedRawBal = await transferringAsset.balanceOf(newMigration.address) + expect(migratedRawBal).eq(rawBal) + // updates the integrator address + const [[, newIntegratorAddress]] = await details.mAsset.getBasset(transferringAsset.address) + expect(newIntegratorAddress).eq(newMigration.address) + }) + }) + describe("when going from no platform to a platform", () => { + let newMigration: MockPlatformIntegration + let transferringAsset: MockERC20 + before(async () => { + await runSetup(true, false, false, true) + ;[, , , transferringAsset] = details.bAssets + newMigration = await (await new MockPlatformIntegration__factory(sa.default.signer)).deploy( + DEAD_ADDRESS, + details.aavePlatformAddress, + details.bAssets.map((b) => b.address), + details.pTokens, + ) + await newMigration.addWhitelist([details.mAsset.address]) + }) + it("should migrate everything correctly", async () => { + // get balances before + const rawBalBefore = await (await details.mAsset.getBasset(transferringAsset.address))[1][1] + const integratorAddress = (await details.mAsset.getBasset(transferringAsset.address))[0][1] + expect(integratorAddress).eq(ZERO_ADDRESS) + // call migrate + const tx = details.mAsset.connect(sa.governor.signer).migrateBassets([transferringAsset.address], newMigration.address) + // emits BassetsMigrated + await expect(tx).to.emit(details.managerLib, "BassetsMigrated").withArgs([transferringAsset.address], newMigration.address) + // moves all bAssets from old to new + const migratedBal = await newMigration.callStatic.checkBalance(transferringAsset.address) + expect(migratedBal).eq(0) + const migratedRawBal = await transferringAsset.balanceOf(newMigration.address) + expect(migratedRawBal).eq(rawBalBefore) + // old balances should be empty + const newRawBal = await transferringAsset.balanceOf(details.mAsset.address) + expect(newRawBal).eq(0) + // updates the integrator address + const [[, newIntegratorAddress]] = await details.mAsset.getBasset(transferringAsset.address) + expect(newIntegratorAddress).eq(newMigration.address) + }) + }) + + describe("negateIsolation()", async () => { + before("init basset with vaults", async () => { + await runSetup(true, false, true) + }) + it("should skip when Normal (by governor)", async () => { + const { bAssets, mAsset, managerLib } = details + const basketBefore = await mAsset.getBasket() + expect(basketBefore[0]).to.false + const tx = mAsset.connect(sa.governor.signer).negateIsolation(bAssets[0].address) + await expect(tx).to.emit(managerLib, "BassetStatusChanged").withArgs(bAssets[0].address, BassetStatus.Normal) + const afterBefore = await mAsset.getBasket() + expect(afterBefore[0]).to.false + }) + it("should fail when called by default", async () => { + const { bAssets, mAsset } = details + await expect(mAsset.connect(sa.default.signer).negateIsolation(bAssets[0].address)).to.revertedWith("Only governor can execute") + }) + it("should fail when not called by governor", async () => { + const { bAssets, mAsset } = details + await expect(mAsset.connect(sa.other.signer).negateIsolation(bAssets[0].address)).to.revertedWith("Only governor can execute") + }) + it("should fail when wrong bAsset address passed", async () => { + const { mAsset } = details + await expect(mAsset.connect(sa.governor.signer).negateIsolation(sa.other.address)).to.be.revertedWith("Invalid asset") + }) + it("should succeed when status is 'BrokenAbovePeg' (by governor)", async () => { + const { bAssets, mAsset, managerLib } = details + const bAsset = bAssets[1] + + const basketBefore = await mAsset.getBasket() + expect(basketBefore[0], "before undergoingRecol").to.false + const bAssetStateBefore = await mAsset.getBasset(bAsset.address) + expect(bAssetStateBefore.personal.status).to.eq(BassetStatus.Normal) + + await mAsset.connect(sa.governor.signer).handlePegLoss(bAsset.address, false) + + const basketAfterPegLoss = await mAsset.getBasket() + expect(basketAfterPegLoss[0], "after handlePegLoss undergoingRecol").to.true + const bAssetStateAfterPegLoss = await mAsset.getBasset(bAsset.address) + expect(bAssetStateAfterPegLoss.personal.status, "after handlePegLoss personal.status").to.eq(BassetStatus.BrokenAbovePeg) + + const tx = mAsset.connect(sa.governor.signer).negateIsolation(bAsset.address) + + await expect(tx).to.emit(managerLib, "BassetStatusChanged").withArgs(bAsset.address, BassetStatus.Normal) + await tx + const basketAfterNegateIsolation = await mAsset.getBasket() + expect(basketAfterNegateIsolation[0], "after negateIsolation undergoingRecol").to.false + const bAssetStateAfterNegateIsolation = await mAsset.getBasset(bAsset.address) + expect(bAssetStateAfterNegateIsolation.personal.status, "after negateIsolation personal.status").to.eq(BassetStatus.Normal) + }) + it("should succeed when two bAssets have BrokenBelowPeg", async () => { + const { bAssets, mAsset, managerLib } = details + + const basketBefore = await mAsset.getBasket() + expect(basketBefore[0], "before undergoingRecol").to.false + + await mAsset.connect(sa.governor.signer).handlePegLoss(bAssets[2].address, true) + await mAsset.connect(sa.governor.signer).handlePegLoss(bAssets[3].address, true) + + const basketAfterPegLoss = await mAsset.getBasket() + expect(basketAfterPegLoss[0], "after handlePegLoss undergoingRecol").to.true + const bAsset2StateAfterPegLoss = await mAsset.getBasset(bAssets[2].address) + expect(bAsset2StateAfterPegLoss.personal.status, "after handlePegLoss personal.status 2").to.eq(BassetStatus.BrokenBelowPeg) + const bAsset3StateAfterPegLoss = await mAsset.getBasset(bAssets[3].address) + expect(bAsset3StateAfterPegLoss.personal.status, "after handlePegLoss personal.status 3").to.eq(BassetStatus.BrokenBelowPeg) + + const tx = mAsset.connect(sa.governor.signer).negateIsolation(bAssets[3].address) + + await expect(tx).to.emit(managerLib, "BassetStatusChanged").withArgs(bAssets[3].address, BassetStatus.Normal) + await tx + const basketAfterNegateIsolation = await mAsset.getBasket() + expect(basketAfterNegateIsolation[0], "after negateIsolation undergoingRecol").to.true + const bAsset2AfterNegateIsolation = await mAsset.getBasset(bAssets[2].address) + expect(bAsset2AfterNegateIsolation.personal.status, "after negateIsolation personal.status 2").to.eq( + BassetStatus.BrokenBelowPeg, + ) + const bAsset3AfterNegateIsolation = await mAsset.getBasset(bAssets[3].address) + expect(bAsset3AfterNegateIsolation.personal.status, "after negateIsolation personal.status 3").to.eq(BassetStatus.Normal) + }) + }) + describe("Amplification coefficient", () => { + before(async () => { + await runSetup() + }) + it("should succeed in starting increase over 2 weeks", async () => { + const mAsset = details.mAsset.connect(sa.governor.signer) + const ampDataBefore = await mAsset.ampData() + + // default values + expect(ampDataBefore.initialA, "before initialA").to.eq(10000) + expect(ampDataBefore.targetA, "before targetA").to.eq(10000) + expect(ampDataBefore.rampStartTime, "before rampStartTime").to.eq(0) + expect(ampDataBefore.rampEndTime, "before rampEndTime").to.eq(0) + + const startTime = await getTimestamp() + const endTime = startTime.add(ONE_WEEK.mul(2)) + const tx = mAsset.startRampA(120, endTime) + await expect(tx).to.emit(details.managerLib, "StartRampA").withArgs(10000, 12000, startTime.add(1), endTime) + + // after values + const ampDataAfter = await mAsset.ampData() + expect(ampDataAfter.initialA, "after initialA").to.eq(10000) + expect(ampDataAfter.targetA, "after targetA").to.eq(12000) + expect(ampDataAfter.rampStartTime, "after rampStartTime").to.eq(startTime.add(1)) + expect(ampDataAfter.rampEndTime, "after rampEndTime").to.eq(endTime) + }) + context("increasing A by 20 over 10 day period", () => { + let startTime: BN + let endTime: BN + let mAsset: Masset + before(async () => { + await runSetup() + mAsset = details.mAsset.connect(sa.governor.signer) + startTime = await getTimestamp() + endTime = startTime.add(ONE_DAY.mul(10)) + await mAsset.startRampA(120, endTime) + }) + it("should succeed getting A just after start", async () => { + expect(await mAsset.getA()).to.eq(10000) + }) + const testsData = [ + { + // 60 * 60 * 24 * 10 / 2000 = 432 + desc: "just under before increment", + elapsedSeconds: 431, + expectedValaue: 10000, + }, + { + desc: "just under after increment", + elapsedSeconds: 434, + expectedValaue: 10001, + }, + { + desc: "after 1 day", + elapsedSeconds: ONE_DAY.add(1), + expectedValaue: 10200, + }, + { + desc: "after 9 days", + elapsedSeconds: ONE_DAY.mul(9).add(1), + expectedValaue: 11800, + }, + { + desc: "just under 10 days", + elapsedSeconds: ONE_DAY.mul(10).sub(2), + expectedValaue: 11999, + }, + { + desc: "after 10 days", + elapsedSeconds: ONE_DAY.mul(10), + expectedValaue: 12000, + }, + { + desc: "after 11 days", + elapsedSeconds: ONE_DAY.mul(11), + expectedValaue: 12000, + }, + ] + for (const testData of testsData) { + it(`should succeed getting A ${testData.desc}`, async () => { + const currentTime = await getTimestamp() + const incrementSeconds = startTime.add(testData.elapsedSeconds).sub(currentTime) + await increaseTime(incrementSeconds) + expect(await mAsset.getA()).to.eq(testData.expectedValaue) + }) + } + }) + context("A target changes just in range", () => { + let currentA: BN + let startTime: BN + let endTime: BN + beforeEach(async () => { + await runSetup() + currentA = await details.mAsset.getA() + startTime = await getTimestamp() + endTime = startTime.add(ONE_DAY.mul(7)) + }) + it("should increase target A 10x", async () => { + // target = current * 10 / 100 + // the 100 is the precision + const targetA = currentA.div(10) + details.mAsset.connect(sa.governor.signer).startRampA(targetA, endTime) + + const ampDataAfter = await details.mAsset.ampData() + expect(ampDataAfter.targetA, "after targetA").to.eq(targetA.mul(100)) + }) + it("should decrease target A 10x", async () => { + // target = current / 100 / 10 + // the 100 is the precision + const targetA = currentA.div(1000) + details.mAsset.connect(sa.governor.signer).startRampA(targetA, endTime) + + const ampDataAfter = await details.mAsset.ampData() + expect(ampDataAfter.targetA, "after targetA").to.eq(targetA.mul(100)) + }) + }) + context("decreasing A by 50 over 5 days", () => { + let startTime: BN + let endTime: BN + let mAsset: Masset + before(async () => { + await runSetup() + mAsset = details.mAsset.connect(sa.governor.signer) + startTime = await getTimestamp() + endTime = startTime.add(ONE_DAY.mul(5)) + await mAsset.startRampA(50, endTime) + }) + it("should succeed getting A just after start", async () => { + expect(await mAsset.getA()).to.eq(10000) + }) + const testsData = [ + { + // 60 * 60 * 24 * 5 / 5000 = 86 + desc: "just under before increment", + elapsedSeconds: 84, + expectedValaue: 10000, + }, + { + desc: "just under after increment", + elapsedSeconds: 88, + expectedValaue: 9999, + }, + { + desc: "after 1 day", + elapsedSeconds: ONE_DAY.add(1), + expectedValaue: 9000, + }, + { + desc: "after 4 days", + elapsedSeconds: ONE_DAY.mul(4).add(1), + expectedValaue: 6000, + }, + { + desc: "just under 5 days", + elapsedSeconds: ONE_DAY.mul(5).sub(2), + expectedValaue: 5001, + }, + { + desc: "after 5 days", + elapsedSeconds: ONE_DAY.mul(5), + expectedValaue: 5000, + }, + { + desc: "after 6 days", + elapsedSeconds: ONE_DAY.mul(6), + expectedValaue: 5000, + }, + ] + for (const testData of testsData) { + it(`should succeed getting A ${testData.desc}`, async () => { + const currentTime = await getTimestamp() + const incrementSeconds = startTime.add(testData.elapsedSeconds).sub(currentTime) + await increaseTime(incrementSeconds) + expect(await mAsset.getA()).to.eq(testData.expectedValaue) + }) + } + }) + describe("should fail to start ramp A", () => { + before(async () => { + await runSetup() + }) + it("when ramp up time only 1 hour", async () => { + await expect(details.mAsset.connect(sa.governor.signer).startRampA(12000, ONE_HOUR)).to.revertedWith("Ramp time too short") + }) + it("when ramp up time just less than 1 day", async () => { + await expect(details.mAsset.connect(sa.governor.signer).startRampA(12000, ONE_DAY.sub(1))).to.revertedWith( + "Ramp time too short", + ) + }) + it("when A target too big", async () => { + const startTime = await getTimestamp() + const endTime = startTime.add(ONE_DAY.mul(7)) + await expect(details.mAsset.connect(sa.governor.signer).startRampA(1000000, endTime)).to.revertedWith( + "A target out of bounds", + ) + }) + it("when A target increase greater than 10x", async () => { + const currentA = await details.mAsset.getA() + // target = current * 10 / 100 + // the 100 is the precision + const targetA = currentA.div(10).add(1) + const startTime = await getTimestamp() + const endTime = startTime.add(ONE_DAY.mul(7)) + await expect(details.mAsset.connect(sa.governor.signer).startRampA(targetA, endTime)).to.revertedWith( + "A target increase too big", + ) + }) + it("when A target decrease greater than 10x", async () => { + const currentA = await details.mAsset.getA() + // target = current / 100 / 10 + // the 100 is the precision + const targetA = currentA.div(1000).sub(1) + const startTime = await getTimestamp() + const endTime = startTime.add(ONE_DAY.mul(7)) + await expect(details.mAsset.connect(sa.governor.signer).startRampA(targetA, endTime)).to.revertedWith( + "A target decrease too big", + ) + }) + it("when A target is zero", async () => { + const startTime = await getTimestamp() + const endTime = startTime.add(ONE_DAY.mul(7)) + await expect(details.mAsset.connect(sa.governor.signer).startRampA(0, endTime)).to.revertedWith("A target out of bounds") + }) + it("when starting just less than a day after the last finished", async () => { + const mAsset = details.mAsset.connect(sa.governor.signer) + const startTime = await getTimestamp() + const endTime = startTime.add(ONE_DAY.mul(2)) + await mAsset.startRampA(130, endTime) + + // increment 1 day + await increaseTime(ONE_HOUR.mul(20)) + + const secondStartTime = await getTimestamp() + const secondEndTime = secondStartTime.add(ONE_DAY.mul(7)) + await expect(mAsset.startRampA(150, secondEndTime)).to.revertedWith("Sufficient period of previous ramp has not elapsed") + }) + }) + context("stop ramp A", () => { + let startTime: BN + let endTime: BN + let mAsset: Masset + before(async () => { + await runSetup() + mAsset = details.mAsset.connect(sa.governor.signer) + startTime = await getTimestamp() + endTime = startTime.add(ONE_DAY.mul(5)) + await mAsset.startRampA(50, endTime) + }) + it("should stop decreasing A after a day", async () => { + // increment 1 day + await increaseTime(ONE_DAY) + + const currentA = await mAsset.getA() + const currentTime = await getTimestamp() + const tx = mAsset.stopRampA() + await expect(tx).to.emit(details.managerLib, "StopRampA").withArgs(currentA, currentTime.add(1)) + expect(await mAsset.getA()).to.eq(currentA) + + const ampDataAfter = await mAsset.ampData() + expect(ampDataAfter.initialA, "after initialA").to.eq(currentA) + expect(ampDataAfter.targetA, "after targetA").to.eq(currentA) + expect(ampDataAfter.rampStartTime.toNumber(), "after rampStartTime").to.within( + currentTime.toNumber(), + currentTime.add(2).toNumber(), + ) + expect(ampDataAfter.rampEndTime.toNumber(), "after rampEndTime").to.within( + currentTime.toNumber(), + currentTime.add(2).toNumber(), + ) + + // increment another 2 days + await increaseTime(ONE_DAY.mul(2)) + expect(await mAsset.getA()).to.eq(currentA) + }) + }) + describe("should fail to stop ramp A", () => { + before(async () => { + await runSetup() + const mAsset = details.mAsset.connect(sa.governor.signer) + const startTime = await getTimestamp() + const endTime = startTime.add(ONE_DAY.mul(2)) + await mAsset.startRampA(50, endTime) + }) + it("After ramp has complete", async () => { + // increment 2 days + await increaseTime(ONE_DAY.mul(2).add(1)) + await expect(details.mAsset.connect(sa.governor.signer).stopRampA()).to.revertedWith("Amplification not changing") + }) + }) + }) +}) diff --git a/test/masset/extra/erc20.spec.ts b/test/masset/extra/erc20.spec.ts new file mode 100644 index 00000000..4447790c --- /dev/null +++ b/test/masset/extra/erc20.spec.ts @@ -0,0 +1,29 @@ +import { MassetMachine, MassetDetails, Account } from "@utils/machines" +import { simpleToExactAmount } from "@utils/math" +import { ethers } from "hardhat" +import { ERC20 } from "types/generated/ERC20" +import { IERC20BehaviourContext, shouldBehaveLikeERC20 } from "../../shared/ERC20.behaviour" + +describe("Masset - ERC20", () => { + const ctx: Partial = {} + + const runSetup = async (seedBasket = false): Promise => { + ctx.details = await ctx.mAssetMachine.deployMasset() + if (seedBasket) { + await ctx.mAssetMachine.seedWithWeightings(ctx.details, [25, 25, 25, 25]) + } + } + before("Init contract", async () => { + const accounts = await ethers.getSigners() + ctx.mAssetMachine = await new MassetMachine().initAccounts(accounts) + ctx.initialHolder = ctx.mAssetMachine.sa.default + ctx.recipient = ctx.mAssetMachine.sa.dummy1 + ctx.anotherAccount = ctx.mAssetMachine.sa.dummy2 + }) + beforeEach("reset contracts", async () => { + await runSetup(true) + ctx.token = ctx.details.mAsset as ERC20 + }) + + shouldBehaveLikeERC20(ctx as IERC20BehaviourContext, "ERC20", simpleToExactAmount(100, 18)) +}) diff --git a/test/masset/extra/large-basket.spec.ts b/test/masset/extra/large-basket.spec.ts new file mode 100644 index 00000000..58a9fa41 --- /dev/null +++ b/test/masset/extra/large-basket.spec.ts @@ -0,0 +1,355 @@ +import { ethers } from "hardhat" +import { expect } from "chai" + +import { simpleToExactAmount } from "@utils/math" +import { MassetDetails, MassetMachine, StandardAccounts } from "@utils/machines" + +import { DEAD_ADDRESS, ZERO_ADDRESS } from "@utils/constants" +import { BasketComposition } from "types" +import { InvariantValidator__factory, Masset__factory, AssetProxy__factory, ExposedMasset__factory } from "types/generated" +import { assertBNClosePercent } from "@utils/assertions" + +describe("Many asset Masset", () => { + let sa: StandardAccounts + let mAssetMachine: MassetMachine + let details: MassetDetails + + const runSetup = async (): Promise => { + const renBtc = await mAssetMachine.loadBassetProxy("Ren BTC", "renBTC", 18) + const sbtc = await mAssetMachine.loadBassetProxy("Synthetix BTC", "sBTC", 18) + const wbtc = await mAssetMachine.loadBassetProxy("Wrapped BTC", "wBTC", 12) + const btc4 = await mAssetMachine.loadBassetProxy("BTC4", "BTC4", 18) + const btc5 = await mAssetMachine.loadBassetProxy("BTC5", "BTC5", 18) + const bAssets = [renBtc, sbtc, wbtc, btc4, btc5] + const forgeVal = await new InvariantValidator__factory(sa.default.signer).deploy( + simpleToExactAmount(1, 24), + simpleToExactAmount(1, 24), + ) + const Manager = await ethers.getContractFactory("Manager") + const managerLib = await Manager.deploy() + const linkedAddress = { + __$1a38b0db2bd175b310a9a3f8697d44eb75$__: managerLib.address, + } + const impl = await new Masset__factory(linkedAddress, sa.default.signer).deploy(DEAD_ADDRESS) + const data = impl.interface.encodeFunctionData("initialize", [ + "mStable BTC", + "mBTC", + forgeVal.address, + bAssets.map((b) => ({ + addr: b.address, + integrator: ZERO_ADDRESS, + hasTxFee: false, + status: 0, + })), + { + a: simpleToExactAmount(1, 2), + limits: { + min: simpleToExactAmount(5, 16), + max: simpleToExactAmount(37, 16), + }, + }, + ]) + const mAsset = await new AssetProxy__factory(sa.default.signer).deploy(impl.address, DEAD_ADDRESS, data) + details = { + mAsset: await new ExposedMasset__factory(linkedAddress, sa.default.signer).attach(mAsset.address), + bAssets, + } + } + + before("Init contract", async () => { + const accounts = await ethers.getSigners() + mAssetMachine = await new MassetMachine().initAccounts(accounts) + sa = mAssetMachine.sa + + await runSetup() + }) + + describe("testing some mints", () => { + before("reset", async () => { + await runSetup() + }) + it("should mint some bAssets", async () => { + const { bAssets, mAsset } = details + const approvals = await Promise.all(details.bAssets.map((b) => mAssetMachine.approveMasset(b, mAsset, 100))) + await mAsset.mintMulti( + bAssets.map((b) => b.address), + approvals, + simpleToExactAmount(99), + sa.default.address, + ) + const dataEnd = await mAssetMachine.getBasketComposition(details) + + expect(dataEnd.totalSupply).eq(simpleToExactAmount(500, 18)) + }) + it("should mint less when going into penalty zone", async () => { + // soft max is 30%, currently all are at 20% with 300 tvl + // adding 90 units pushes tvl to 590 and weight to 32.2% + const { bAssets, mAsset } = details + + const dataBefore = await mAssetMachine.getBasketComposition(details) + + const approval = await mAssetMachine.approveMasset(bAssets[0], mAsset, 90) + await mAsset["mint(address,uint256,uint256,address)"](bAssets[0].address, approval, simpleToExactAmount(89), sa.default.address) + + const dataEnd = await mAssetMachine.getBasketComposition(details) + const minted = dataEnd.totalSupply.sub(dataBefore.totalSupply) + + expect(minted).lt(simpleToExactAmount(90, 18)) + expect(minted).gt(simpleToExactAmount("89.6", 18)) + }) + it("should apply close to 5% penalty near hard max", async () => { + // hard max is 37%, currently at 32.2% with 590 tvl + // adding 40 units pushes tvl to 630 and weight to 36.5% + // other weights then are 15.8% + const { bAssets, mAsset } = details + + const dataBefore = await mAssetMachine.getBasketComposition(details) + + const approval = await mAssetMachine.approveMasset(bAssets[0], mAsset, 40) + await mAsset["mint(address,uint256,uint256,address)"](bAssets[0].address, approval, simpleToExactAmount(37), sa.default.address) + + const dataEnd = await mAssetMachine.getBasketComposition(details) + const minted = dataEnd.totalSupply.sub(dataBefore.totalSupply) + + expect(minted).lt(simpleToExactAmount(40, 18)) + expect(minted).gt(simpleToExactAmount("39.3", 18)) + }) + it("should fail if we go over max", async () => { + const { bAssets, mAsset } = details + const approval = await mAssetMachine.approveMasset(bAssets[0], mAsset, 30) + await expect( + mAsset["mint(address,uint256,uint256,address)"](bAssets[0].address, approval, simpleToExactAmount(10), sa.default.address), + ).to.be.revertedWith("Exceeds weight limits") + }) + it("should allow lots of minting", async () => { + const { bAssets, mAsset } = details + const approval = await mAssetMachine.approveMasset(bAssets[1], mAsset, 80) + await mAsset["mint(address,uint256,uint256,address)"](bAssets[1].address, approval.div(80), 0, sa.default.address) + await mAsset["mint(address,uint256,uint256,address)"](bAssets[1].address, approval.div(80), 0, sa.default.address) + await mAsset["mint(address,uint256,uint256,address)"](bAssets[1].address, approval.div(80), 0, sa.default.address) + await bAssets[2].transfer(sa.dummy2.address, simpleToExactAmount(50, await bAssets[2].decimals())) + const approval2 = await mAssetMachine.approveMasset(bAssets[2], mAsset, 50, sa.dummy2.signer) + await mAsset + .connect(sa.dummy2.signer) + ["mint(address,uint256,uint256,address)"](bAssets[2].address, approval2.div(5), 0, sa.default.address) + await mAsset + .connect(sa.dummy2.signer) + ["mint(address,uint256,uint256,address)"](bAssets[2].address, approval2.div(5), 0, sa.default.address) + await mAsset + .connect(sa.dummy2.signer) + ["mint(address,uint256,uint256,address)"](bAssets[2].address, approval2.div(5), 0, sa.default.address) + await mAsset + .connect(sa.dummy2.signer) + ["mint(address,uint256,uint256,address)"](bAssets[2].address, approval2.div(5), 0, sa.default.address) + await mAsset + .connect(sa.dummy2.signer) + ["mint(address,uint256,uint256,address)"](bAssets[2].address, approval2.div(5), 0, sa.default.address) + }) + }) + describe("testing some swaps", () => { + let dataStart: BasketComposition + before("set up basket", async () => { + await runSetup() + const { bAssets, mAsset } = details + const approvals = await Promise.all(details.bAssets.map((b) => mAssetMachine.approveMasset(b, mAsset, 100))) + await mAsset.mintMulti( + bAssets.map((b) => b.address), + approvals, + 99, + sa.default.address, + ) + dataStart = await mAssetMachine.getBasketComposition(details) + + expect(dataStart.totalSupply).eq(simpleToExactAmount(500, 18)) + }) + it("should swap almost 1:1(-fee) within normal range", async () => { + // soft max is 30%, currently all are at 20% with 500 tvl + // adding 10 units should result in 9.9994 output and 22% + const { bAssets, mAsset } = details + + const approval = await mAssetMachine.approveMasset(bAssets[0], mAsset, 10) + await mAsset["swap(address,address,uint256,uint256,address)"]( + bAssets[0].address, + bAssets[1].address, + approval, + simpleToExactAmount("9.95"), + sa.default.address, + ) + + const dataAfter = await mAssetMachine.getBasketComposition(details) + + const swappedOut = dataStart.bAssets[1].mAssetUnits.sub(dataAfter.bAssets[1].mAssetUnits) + assertBNClosePercent(swappedOut, simpleToExactAmount("9.994", 18), "0.1") + + expect(dataAfter.bAssets[0].mAssetUnits.sub(dataStart.bAssets[0].mAssetUnits)).eq(simpleToExactAmount(10, 18)) + + expect(dataAfter.totalSupply).eq(dataStart.totalSupply) + }) + it("should apply minute fee when 2% over soft max ", async () => { + // soft max is 30%, currently at 22% with 110/500 tvl + // adding 50 units pushes to 160/500 and weight to 32% + const { bAssets, mAsset } = details + + const dataBefore = await mAssetMachine.getBasketComposition(details) + + const approval = await mAssetMachine.approveMasset(bAssets[0], mAsset, 50) + await mAsset["swap(address,address,uint256,uint256,address)"]( + bAssets[0].address, + bAssets[2].address, + approval, + simpleToExactAmount(49, 12), + sa.default.address, + ) + + const dataAfter = await mAssetMachine.getBasketComposition(details) + + const swappedOut = dataBefore.bAssets[2].mAssetUnits.sub(dataAfter.bAssets[2].mAssetUnits) + // sum of fee is 0.5% (incl 0.06% swap fee) + expect(swappedOut).gt(simpleToExactAmount("49.6", 18)) + expect(swappedOut).lt(simpleToExactAmount(50, 18)) + }) + it("should apply close to 5% penalty near hard max", async () => { + // hard max is 37%, currently at 32% with 160/500 tvl + // adding 24 units pushes to 184/500 and weight to 36.8% + const { bAssets, mAsset } = details + + const dataBefore = await mAssetMachine.getBasketComposition(details) + + const approval = await mAssetMachine.approveMasset(bAssets[0], mAsset, 24) + await mAsset["swap(address,address,uint256,uint256,address)"]( + bAssets[0].address, + bAssets[1].address, + approval, + simpleToExactAmount(22), + sa.default.address, + ) + + const dataAfter = await mAssetMachine.getBasketComposition(details) + + const swappedOut = dataBefore.bAssets[1].mAssetUnits.sub(dataAfter.bAssets[1].mAssetUnits) + // sum of fee is 0.5% (incl 0.06% swap fee) + expect(swappedOut).lt(simpleToExactAmount(24, 18)) + expect(swappedOut).gt(simpleToExactAmount("22.8", 18)) + }) + it("should fail if we go over max", async () => { + const { bAssets, mAsset } = details + const approval = await mAssetMachine.approveMasset(bAssets[0], mAsset, 10) + await expect( + mAsset["swap(address,address,uint256,uint256,address)"]( + bAssets[0].address, + bAssets[2].address, + approval, + simpleToExactAmount(9, 12), + sa.default.address, + ), + ).to.be.revertedWith("Exceeds weight limits") + }) + }) + + describe("testing redeem exact mAsset", () => { + let dataStart: BasketComposition + before("set up basket", async () => { + await runSetup() + const { bAssets, mAsset } = details + const approvals = await Promise.all(details.bAssets.map((b) => mAssetMachine.approveMasset(b, mAsset, 100))) + await mAsset.mintMulti( + bAssets.map((b) => b.address), + approvals, + 99, + sa.default.address, + ) + dataStart = await mAssetMachine.getBasketComposition(details) + + expect(dataStart.totalSupply).eq(simpleToExactAmount(500, 18)) + }) + it("should redeem almost 1:1(-fee) within normal range", async () => { + // soft min is 10%, currently all are at 20% with 500 tvl + const { bAssets, mAsset } = details + + const mAssetRedeemAmount = simpleToExactAmount(10, 18) + const minBassetAmount = simpleToExactAmount(9, 18) + await mAsset["redeem(address,uint256,uint256,address)"]( + bAssets[0].address, + mAssetRedeemAmount, + minBassetAmount, + sa.default.address, + ) + + const dataAfter = await mAssetMachine.getBasketComposition(details) + + const redeemed = dataStart.bAssets[0].mAssetUnits.sub(dataAfter.bAssets[0].mAssetUnits) + assertBNClosePercent(redeemed, simpleToExactAmount("9.994", 18), "0.1") + + expect(dataAfter.totalSupply).eq(dataStart.totalSupply.sub(mAssetRedeemAmount)) + }) + it("should apply minute fee when 2% under soft min ", async () => { + // soft min is 20%, currently at 90/490 tvl + // withdrawing 50 units pushes to 40/440 and weight to 9.1% + const { bAssets, mAsset } = details + + const dataBefore = await mAssetMachine.getBasketComposition(details) + + const mAssetRedeemAmount = simpleToExactAmount(50, 18) + const minBassetAmount = simpleToExactAmount(49, 18) + await mAsset["redeem(address,uint256,uint256,address)"]( + bAssets[0].address, + mAssetRedeemAmount, + minBassetAmount, + sa.default.address, + ) + + const dataAfter = await mAssetMachine.getBasketComposition(details) + + const redeemed = dataBefore.bAssets[0].mAssetUnits.sub(dataAfter.bAssets[0].mAssetUnits) + // sum of slippage is max 0.33% (incl 0.06% swap fee) + expect(redeemed).gt(simpleToExactAmount("49.6", 18)) + expect(redeemed).lt(simpleToExactAmount("49.95", 18)) + + expect(dataAfter.totalSupply).eq(dataBefore.totalSupply.sub(mAssetRedeemAmount)) + expect(dataAfter.surplus.sub(dataBefore.surplus)).eq(simpleToExactAmount(30, 15)) + }) + it("should apply close to 5% penalty near hard min", async () => { + // hard min is 5%, currently at 9.1% with 40/440 tvl + // redeeming 18 units pushes to 22/422 and weight to 5.2% + const { bAssets, mAsset } = details + + const dataBefore = await mAssetMachine.getBasketComposition(details) + + const mAssetRedeemAmount = simpleToExactAmount(18, 18) + const minBassetAmount = simpleToExactAmount(14, 18) + await mAsset["redeem(address,uint256,uint256,address)"]( + bAssets[0].address, + mAssetRedeemAmount, + minBassetAmount, + sa.default.address, + ) + + const dataAfter = await mAssetMachine.getBasketComposition(details) + + const bAssetRedeemed = dataBefore.bAssets[0].mAssetUnits.sub(dataAfter.bAssets[0].mAssetUnits) + // max slippage around 9% + expect(bAssetRedeemed).gt(simpleToExactAmount("16.6", 18)) + expect(bAssetRedeemed).lt(simpleToExactAmount("17.52", 18)) + + expect(dataAfter.totalSupply).eq(dataBefore.totalSupply.sub(mAssetRedeemAmount)) + }) + }) + + describe("testing redeem exact bAsset(s)", () => { + let dataStart: BasketComposition + before("set up basket", async () => { + await runSetup() + const { bAssets, mAsset } = details + const approvals = await Promise.all(details.bAssets.map((b) => mAssetMachine.approveMasset(b, mAsset, 100))) + await mAsset.mintMulti( + bAssets.map((b) => b.address), + approvals, + 99, + sa.default.address, + ) + dataStart = await mAssetMachine.getBasketComposition(details) + + expect(dataStart.totalSupply).eq(simpleToExactAmount(300, 18)) + }) + }) +}) diff --git a/test/masset/extra/mint-swap-redeem.spec.ts b/test/masset/extra/mint-swap-redeem.spec.ts new file mode 100644 index 00000000..a3e2d61b --- /dev/null +++ b/test/masset/extra/mint-swap-redeem.spec.ts @@ -0,0 +1,438 @@ +import { ethers } from "hardhat" +import { expect } from "chai" + +import { assertBNClosePercent } from "@utils/assertions" +import { simpleToExactAmount } from "@utils/math" +import { MassetDetails, MassetMachine, StandardAccounts } from "@utils/machines" + +import { DEAD_ADDRESS, ZERO_ADDRESS } from "@utils/constants" +import { Masset__factory, InvariantValidator__factory, AssetProxy__factory, ExposedMasset__factory } from "types/generated" +import { BasketComposition } from "types" + +describe("Masset", () => { + let sa: StandardAccounts + let mAssetMachine: MassetMachine + let details: MassetDetails + + const runSetup = async (): Promise => { + const renBtc = await mAssetMachine.loadBassetProxy("Ren BTC", "renBTC", 18) + const sbtc = await mAssetMachine.loadBassetProxy("Synthetix BTC", "sBTC", 18) + const wbtc = await mAssetMachine.loadBassetProxy("Wrapped BTC", "wBTC", 12) + const bAssets = [renBtc, sbtc, wbtc] + const forgeVal = await new InvariantValidator__factory(sa.default.signer).deploy( + simpleToExactAmount(1, 24), + simpleToExactAmount(1, 24), + ) + const Manager = await ethers.getContractFactory("Manager") + const managerLib = await Manager.deploy() + const linkedAddress = { + __$1a38b0db2bd175b310a9a3f8697d44eb75$__: managerLib.address, + } + const impl = await new Masset__factory(linkedAddress, sa.default.signer).deploy(DEAD_ADDRESS) + const data = impl.interface.encodeFunctionData("initialize", [ + "mStable BTC", + "mBTC", + forgeVal.address, + bAssets.map((b) => ({ + addr: b.address, + integrator: ZERO_ADDRESS, + hasTxFee: false, + status: 0, + })), + { + a: simpleToExactAmount(1, 2), + limits: { + min: simpleToExactAmount(5, 16), + max: simpleToExactAmount(55, 16), + }, + }, + ]) + const mAsset = await new AssetProxy__factory(sa.default.signer).deploy(impl.address, DEAD_ADDRESS, data) + details = { + mAsset: await new ExposedMasset__factory(linkedAddress, sa.default.signer).attach(mAsset.address), + bAssets, + } + } + + before("Init contract", async () => { + const accounts = await ethers.getSigners() + mAssetMachine = await new MassetMachine().initAccounts(accounts) + sa = mAssetMachine.sa + + await runSetup() + }) + + describe("testing some mints", () => { + before("reset", async () => { + await runSetup() + }) + it("should mint some bAssets", async () => { + const { bAssets, mAsset } = details + const approvals = await Promise.all(details.bAssets.map((b) => mAssetMachine.approveMasset(b, mAsset, 100))) + await mAsset.mintMulti( + bAssets.map((b) => b.address), + approvals, + 99, + sa.default.address, + ) + const dataEnd = await mAssetMachine.getBasketComposition(details) + + expect(dataEnd.totalSupply).to.eq(simpleToExactAmount(300, 18)) + }) + it("should mint less when going into penalty zone", async () => { + // soft max is 50%, currently all are at 33% with 300 tvl + // adding 50 units pushes tvl to 350 and weight to 42.8% + const { bAssets, mAsset } = details + + const dataBefore = await mAssetMachine.getBasketComposition(details) + + const approval = await mAssetMachine.approveMasset(bAssets[0], mAsset, 50) + await expect(mAsset.mint(bAssets[0].address, approval, simpleToExactAmount(51), sa.default.address)).to.be.revertedWith( + "Mint quantity < min qty", + ) + await mAsset.mint(bAssets[0].address, approval, simpleToExactAmount(49), sa.default.address) + + const dataEnd = await mAssetMachine.getBasketComposition(details) + const minted = dataEnd.totalSupply.sub(dataBefore.totalSupply) + + expect(minted).to.lt(simpleToExactAmount(50, 18)) + expect(minted).to.gt(simpleToExactAmount("49.7", 18)) + }) + it("should apply close to 5% penalty near hard max", async () => { + // hard max is 55%, currently at 42.86% with 350 tvl + // adding 80 units pushes tvl to 430 and weight to 53.4% + // other weights then are 23.3% + const { bAssets, mAsset } = details + + const dataBefore = await mAssetMachine.getBasketComposition(details) + + const approval = await mAssetMachine.approveMasset(bAssets[0], mAsset, 80) + await expect(mAsset.mint(bAssets[0].address, approval, simpleToExactAmount("79.9"), sa.default.address)).to.be.revertedWith( + "Mint quantity < min qty", + ) + await mAsset.mint(bAssets[0].address, approval, simpleToExactAmount(76), sa.default.address) + + const dataEnd = await mAssetMachine.getBasketComposition(details) + const minted = dataEnd.totalSupply.sub(dataBefore.totalSupply) + + expect(minted).to.lt(simpleToExactAmount(80, 18)) + expect(minted).to.gt(simpleToExactAmount(77, 18)) + }) + it("should fail if we go over max", async () => { + const { bAssets, mAsset } = details + const approval = await mAssetMachine.approveMasset(bAssets[0], mAsset, 80) + await expect(mAsset.mint(bAssets[0].address, approval, simpleToExactAmount(87), sa.default.address)).to.be.revertedWith( + "Exceeds weight limits", + ) + }) + it("should allow lots of minting", async () => { + const { bAssets, mAsset } = details + const approval = await mAssetMachine.approveMasset(bAssets[1], mAsset, 80) + await mAsset.mint(bAssets[1].address, approval.div(80), 0, sa.default.address) + await mAsset.mint(bAssets[1].address, approval.div(80), 0, sa.default.address) + await mAsset.mint(bAssets[1].address, approval.div(80), 0, sa.default.address) + await bAssets[2].transfer(sa.dummy2.address, simpleToExactAmount(50, await bAssets[2].decimals())) + const approval2 = await mAssetMachine.approveMasset(bAssets[2], mAsset, 50, sa.dummy2.signer) + await mAsset.connect(sa.dummy2.signer).mint(bAssets[2].address, approval2.div(5), 0, sa.default.address) + await mAsset.connect(sa.dummy2.signer).mint(bAssets[2].address, approval2.div(5), 0, sa.default.address) + await mAsset.connect(sa.dummy2.signer).mint(bAssets[2].address, approval2.div(5), 0, sa.default.address) + await mAsset.connect(sa.dummy2.signer).mint(bAssets[2].address, approval2.div(5), 0, sa.default.address) + await mAsset.connect(sa.dummy2.signer).mint(bAssets[2].address, approval2.div(5), 0, sa.default.address) + }) + }) + describe("testing some swaps", () => { + let dataStart: BasketComposition + before("set up basket", async () => { + await runSetup() + const { bAssets, mAsset } = details + const approvals = await Promise.all(details.bAssets.map((b) => mAssetMachine.approveMasset(b, mAsset, 100))) + await mAsset.mintMulti( + bAssets.map((b) => b.address), + approvals, + simpleToExactAmount(99), + sa.default.address, + ) + dataStart = await mAssetMachine.getBasketComposition(details) + + expect(dataStart.totalSupply).to.eq(simpleToExactAmount(300, 18)) + }) + it("should swap 1:1(-fee) within normal range", async () => { + // soft max is 41%, currently all are at 33% with 300 tvl + // adding 10 units should result in 9.9994 output and 36.66% + const { bAssets, mAsset } = details + + const approval = await mAssetMachine.approveMasset(bAssets[0], mAsset, 10) + await expect( + mAsset.swap( + bAssets[0].address, // renBTC + bAssets[1].address, // sBTC + approval, + simpleToExactAmount(11), + sa.default.address, + ), + ).to.be.revertedWith("Output qty < minimum qty") + await mAsset.swap( + bAssets[0].address, // renBTC + bAssets[1].address, // sBTC + approval, + simpleToExactAmount("9.9"), + sa.default.address, + ) + + const dataAfter = await mAssetMachine.getBasketComposition(details) + + const swappedOut = dataStart.bAssets[1].mAssetUnits.sub(dataAfter.bAssets[1].mAssetUnits) + assertBNClosePercent(swappedOut, simpleToExactAmount("9.994", 18), "0.1") + + expect(dataAfter.bAssets[0].mAssetUnits.sub(dataStart.bAssets[0].mAssetUnits)).to.eq(simpleToExactAmount(10, 18)) + + expect(dataAfter.totalSupply).to.eq(dataStart.totalSupply) + }) + it("should apply minute fee when 2% over soft max ", async () => { + // soft max is 41%, currently at 36.66% with 110/300 tvl + // adding 20 units pushes to 130/300 and weight to 43.2% + const { bAssets, mAsset } = details + + const dataBefore = await mAssetMachine.getBasketComposition(details) + + const approval = await mAssetMachine.approveMasset(bAssets[0], mAsset, 20) + await mAsset.swap( + bAssets[0].address, // renBTC + bAssets[2].address, // wBTC + approval, + simpleToExactAmount(19, 12), + sa.default.address, + ) + + const dataAfter = await mAssetMachine.getBasketComposition(details) + + const swappedOut = dataBefore.bAssets[2].mAssetUnits.sub(dataAfter.bAssets[2].mAssetUnits) + // sum of fee is 0.5% (incl 0.06% swap fee) + expect(swappedOut).to.gt(simpleToExactAmount("19.9", 18)) + expect(swappedOut).to.lt(simpleToExactAmount(20, 18)) + }) + it("should apply close to 5% penalty near hard max", async () => { + // hard max is 56%, currently at 43.2% with 130/300 tvl + // adding 35 units pushes to 165/300 and weight to 55% + const { bAssets, mAsset } = details + + const dataBefore = await mAssetMachine.getBasketComposition(details) + + const approval = await mAssetMachine.approveMasset(bAssets[0], mAsset, 35) + await expect( + mAsset.swap( + bAssets[0].address, // renBTC + bAssets[1].address, // sBTC + approval, + simpleToExactAmount("34.9"), + sa.default.address, + ), + ).to.be.revertedWith("Output qty < minimum qty") + await mAsset.swap( + bAssets[0].address, // renBTC + bAssets[1].address, // sBTC + approval, + simpleToExactAmount(31), + sa.default.address, + ) + + const dataAfter = await mAssetMachine.getBasketComposition(details) + + const swappedOut = dataBefore.bAssets[1].mAssetUnits.sub(dataAfter.bAssets[1].mAssetUnits) + // sum of fee is 0.5% (incl 0.06% swap fee) + expect(swappedOut).to.gt(simpleToExactAmount(33, 18)) + expect(swappedOut).to.lt(simpleToExactAmount("34.7", 18)) + }) + it("should fail if we go over max", async () => { + const { bAssets, mAsset } = details + const approval = await mAssetMachine.approveMasset(bAssets[0], mAsset, 10) + await expect( + mAsset.swap( + bAssets[0].address, // renBTC + bAssets[2].address, // wBTC + approval, + simpleToExactAmount(9, 12), + sa.default.address, + ), + ).to.be.revertedWith("Exceeds weight limits") + }) + }) + + describe("testing redeem exact mAsset", () => { + let dataStart: BasketComposition + before("set up basket", async () => { + await runSetup() + const { bAssets, mAsset } = details + const approvals = await Promise.all(details.bAssets.map((b) => mAssetMachine.approveMasset(b, mAsset, 100))) + await mAsset.mintMulti( + bAssets.map((b) => b.address), + approvals, + 99, + sa.default.address, + ) + dataStart = await mAssetMachine.getBasketComposition(details) + + expect(dataStart.totalSupply).to.eq(simpleToExactAmount(300, 18)) + }) + it("should redeem 1:1(-fee) within normal range", async () => { + // soft min is 25%, currently all are at 33% with 300 tvl + // redeeming 10 units should result in 9.9994 output and 31% + const { bAssets, mAsset } = details + + const mAssetRedeemAmount = simpleToExactAmount(10, 18) + const minBassetAmount = simpleToExactAmount(9, 18) + await expect( + mAsset.redeem( + bAssets[0].address, // renBTC, + mAssetRedeemAmount, + mAssetRedeemAmount, + sa.default.address, + ), + ).to.be.revertedWith("bAsset qty < min qty") + await mAsset.redeem( + bAssets[0].address, // renBTC, + mAssetRedeemAmount, + minBassetAmount, + sa.default.address, + ) + + const dataAfter = await mAssetMachine.getBasketComposition(details) + + const redeemed = dataStart.bAssets[0].mAssetUnits.sub(dataAfter.bAssets[0].mAssetUnits) + assertBNClosePercent(redeemed, simpleToExactAmount("9.994", 18), "0.1") + + expect(dataAfter.totalSupply).to.eq(dataStart.totalSupply.sub(mAssetRedeemAmount)) + }) + it("should apply minute fee when 2% under soft min ", async () => { + // soft min is 25%, currently at 31% with 90/290 tvl + // withdrawing 30 units pushes to 60/260 and weight to 23.07% + const { bAssets, mAsset } = details + + const dataBefore = await mAssetMachine.getBasketComposition(details) + + const mAssetRedeemAmount = simpleToExactAmount(30, 18) + const minBassetAmount = simpleToExactAmount(29, 18) + await mAsset.redeem( + bAssets[0].address, // renBTC + mAssetRedeemAmount, + minBassetAmount, + sa.default.address, + ) + + const dataAfter = await mAssetMachine.getBasketComposition(details) + + const redeemed = dataBefore.bAssets[0].mAssetUnits.sub(dataAfter.bAssets[0].mAssetUnits) + // sum of slippage is max 0.33% (incl 0.06% swap fee) + expect(redeemed).to.gt(simpleToExactAmount("29.9", 18)) + expect(redeemed).to.lt(simpleToExactAmount(30, 18)) + + expect(dataAfter.totalSupply).to.eq(dataBefore.totalSupply.sub(mAssetRedeemAmount)) + expect(dataAfter.surplus.sub(dataBefore.surplus)).to.eq(simpleToExactAmount(18, 15)) + }) + it("should apply close to 5% penalty near hard min", async () => { + // hard min is 10%, currently at 23.07% with 60/260 tvl + // adding 37 units pushes to 23/223 and weight to 10.3% + const { bAssets, mAsset } = details + + const dataBefore = await mAssetMachine.getBasketComposition(details) + + const mAssetRedeemAmount = simpleToExactAmount(37, 18) + const minBassetAmount = simpleToExactAmount(30, 18) + await mAsset.redeem( + bAssets[0].address, // renBTC + mAssetRedeemAmount, + minBassetAmount, + sa.default.address, + ) + + const dataAfter = await mAssetMachine.getBasketComposition(details) + + const bAssetRedeemed = dataBefore.bAssets[0].mAssetUnits.sub(dataAfter.bAssets[0].mAssetUnits) + // max slippage around 9% + expect(bAssetRedeemed).to.gt(simpleToExactAmount("34", 18)) + expect(bAssetRedeemed).to.lt(simpleToExactAmount("36.5", 18)) + + expect(dataAfter.totalSupply).to.eq(dataBefore.totalSupply.sub(mAssetRedeemAmount)) + }) + }) + + describe("testing redeem exact bAsset(s)", () => { + let dataStart: BasketComposition + before("set up basket", async () => { + await runSetup() + const { bAssets, mAsset } = details + const approvals = await Promise.all(details.bAssets.map((b) => mAssetMachine.approveMasset(b, mAsset, 100))) + await mAsset.mintMulti( + bAssets.map((b) => b.address), + approvals, + 99, + sa.default.address, + ) + dataStart = await mAssetMachine.getBasketComposition(details) + + expect(dataStart.totalSupply).to.eq(simpleToExactAmount(300, 18)) + }) + it("should redeem 1:1(-fee) within normal range", async () => { + // soft min is 25%, currently all are at 33% with 300 tvl + // redeeming 10 units should result in 10.006 burned and 31% + const { bAssets, mAsset } = details + + const bAssetAmount = simpleToExactAmount(10, 18) + const maxMasset = simpleToExactAmount("10.01", 18) + await mAsset.redeemExactBassets([bAssets[0].address], [bAssetAmount], maxMasset, sa.default.address) + + const dataAfter = await mAssetMachine.getBasketComposition(details) + + const mAssetBurned = dataStart.totalSupply.sub(dataAfter.totalSupply) + assertBNClosePercent(mAssetBurned, simpleToExactAmount("10.006003602161296778", 18), "0.1") + + expect(dataAfter.bAssets[0].vaultBalance).to.eq(dataStart.bAssets[0].vaultBalance.sub(simpleToExactAmount(10, 18))) + }) + it("should apply minute fee when 2% under soft min ", async () => { + // soft min is 25%, currently at 31% with 90/290 tvl + // withdrawing 30 units pushes to 60/260 and weight to 23.07% + const { bAssets, mAsset } = details + + const dataBefore = await mAssetMachine.getBasketComposition(details) + + const bAssetRedeemAmount = simpleToExactAmount(30, 18) + const maxMasset = simpleToExactAmount(31, 18) + await mAsset.redeemExactBassets([bAssets[0].address], [bAssetRedeemAmount], maxMasset, sa.default.address) + + const dataAfter = await mAssetMachine.getBasketComposition(details) + + const redeemed = dataBefore.bAssets[0].mAssetUnits.sub(dataAfter.bAssets[0].mAssetUnits) + // sum of slippage is max 0.33% (incl 0.06% swap fee) + expect(redeemed).to.eq(simpleToExactAmount(30, 18)) + + const mAssetBurned = dataBefore.totalSupply.sub(dataAfter.totalSupply) + expect(mAssetBurned).to.gt(simpleToExactAmount(30, 18)) + expect(mAssetBurned).to.lt(simpleToExactAmount(31, 18)) + + assertBNClosePercent(dataAfter.surplus.sub(dataBefore.surplus), simpleToExactAmount(18, 15), 2) + }) + it("should apply close to 5% penalty near hard min", async () => { + // hard min is 10%, currently at 23.07% with 60/260 tvl + // adding 37 units pushes to 23/223 and weight to 10.3% + const { bAssets, mAsset } = details + + const dataBefore = await mAssetMachine.getBasketComposition(details) + + const bAssetRedeemAmount = simpleToExactAmount(35, 18) + const maxMasset = simpleToExactAmount(39, 18) + await expect( + mAsset.redeemExactBassets([bAssets[0].address], [bAssetRedeemAmount], simpleToExactAmount("35.3", 18), sa.default.address), + ).to.be.revertedWith("Redeem mAsset qty > max quantity") + await mAsset.redeemExactBassets([bAssets[0].address], [bAssetRedeemAmount], maxMasset, sa.default.address) + + const dataAfter = await mAssetMachine.getBasketComposition(details) + + const redeemed = dataBefore.bAssets[0].mAssetUnits.sub(dataAfter.bAssets[0].mAssetUnits) + expect(redeemed).to.eq(simpleToExactAmount(35, 18)) + + const mAssetBurned = dataBefore.totalSupply.sub(dataAfter.totalSupply) + expect(mAssetBurned).to.gt(simpleToExactAmount("35.4", 18)) + expect(mAssetBurned).to.lt(simpleToExactAmount(39, 18)) + }) + }) +}) diff --git a/test/masset/forge-validator/TestForgeValidatorM.spec.ts b/test/masset/forge-validator/TestForgeValidatorM.spec.ts deleted file mode 100644 index e125f064..00000000 --- a/test/masset/forge-validator/TestForgeValidatorM.spec.ts +++ /dev/null @@ -1,836 +0,0 @@ -import { simpleToExactAmount } from "@utils/math"; -import { createBasset, BassetStatus } from "@utils/mstable-objects"; -import envSetup from "@utils/env_setup"; -import * as t from "types/generated"; - -const { expect } = envSetup.configure(); - -const ForgeValidatorArtifact = artifacts.require("ForgeValidator"); - -interface BasketDeets { - totalSupply: number | string; -} -const setBasket = (totalSupply: number | string): BasketDeets => { - return { - totalSupply, - }; -}; -interface BassetDeets { - maxWeight: number | string; - vaultUnits: number | string; - decimals: number; - status: BassetStatus; -} -const setBasset = ( - maxWeight: number | string, - vaultUnits: number | string, - decimals = 18, - status: BassetStatus = BassetStatus.Normal, -): BassetDeets => { - return { - maxWeight, - vaultUnits, - decimals, - status, - }; -}; -interface Result { - expectedValidity: boolean; - expectedReason: string; -} -const setResult = (expectedValidity: boolean, expectedReason = ""): Result => { - return { - expectedValidity, - expectedReason, - }; -}; - -contract("ForgeValidator", async (accounts) => { - let forgeValidator: t.ForgeValidatorInstance; - - before("Init contract", async () => { - forgeValidator = await ForgeValidatorArtifact.new(); - }); - - context("validating a single mint", async () => { - const assertSingleMint = async ( - basket: BasketDeets, - basset: BassetDeets, - quantity: number | string, - result: Result, - sender: string = accounts[0], - ): Promise => { - const [isValid, reason] = await forgeValidator.validateMint( - simpleToExactAmount(basket.totalSupply, 18), - createBasset(basset.maxWeight, basset.vaultUnits, basset.decimals, basset.status), - simpleToExactAmount(quantity, basset.decimals), - { from: sender }, - ); - expect(result.expectedValidity).to.eq(isValid); - expect(result.expectedReason).to.eq(reason); - }; - - // At target weight is defined when bAssetVaultUnits == (totalSupply * bAssetTarget) - context("with a basset at its target weight", async () => { - it("returns valid for a simple validation that remains within the max weight", async () => { - // 100 total supply - // bAsset 24 vaultBalance, 25 maxWeighting - // new weighting now 25/100 - await assertSingleMint(setBasket(100), setBasset(25, 24), 1, setResult(true)); - }); - it("should work for any sender", async () => { - await assertSingleMint( - setBasket(100), - setBasset(25, 24), - 1, - setResult(true), - accounts[1], - ); - await assertSingleMint( - setBasket(100), - setBasset(25, 24), - 1, - setResult(true), - accounts[2], - ); - }); - it("returns inValid if mint pushes bAsset overweight", async () => { - // 100 total supply - // bAsset 24 vaultBalance, 25 maxWeighting - // 1 deviation allowance but 2 mint units - pushing above threshold - await assertSingleMint( - setBasket(100), - setBasset(25, 24, 6), - 2, - setResult(false, "bAssets used in mint cannot exceed their max weight"), - ); - }); - describe("with large basket supply", async () => { - it("should succeed with sufficient max weight", async () => { - // 10,000,000 total supply - // 250,000 vaultBalance, 2.65% maxWeighting - // new weighting now 260k/1010k - // max weight = 265k - await assertSingleMint( - setBasket(10000000), - setBasset("2.65", 250000, 12), - 10000, - setResult(true), - ); - }); - it("should fail if we exceed the max weight", async () => { - // 10,000,000 total supply - // 250,000 vaultBalance, 2.55% maxWeighting - // new weighting now 260k/1010k - // max weight = 255k - await assertSingleMint( - setBasket(10000000), - setBasset("2.55", 250000, 12), - 10000, - setResult(false, "bAssets used in mint cannot exceed their max weight"), - ); - }); - }); - describe("with a variable max weight", async () => { - it("should succeed with sufficient allowance", async () => { - // 1000 total supply - // 150 vaultBalance, 15% maxWeighting - // new weighting now 250/1100 - // max weight in units = 165 - await assertSingleMint( - setBasket(1000), - setBasset(25, 150), - 100, - setResult(true), - ); - await assertSingleMint( - setBasket(1000), - setBasset(23, 150), - 100, - setResult(true), - ); - await assertSingleMint( - setBasket(1000), - setBasset(20, 150), - 100, - setResult(false, "bAssets used in mint cannot exceed their max weight"), - ); - }); - it("should always fail with 0 max weight", async () => { - await assertSingleMint( - setBasket(100), - setBasset(0, 0), - 1, - setResult(false, "bAssets used in mint cannot exceed their max weight"), - ); - }); - it("should allow anything at a high max weight", async () => { - // 70% - let maxWeight = 70; - await assertSingleMint( - setBasket(1000000), - setBasset(maxWeight, 250000), - 1000000, - setResult(true), - ); - await assertSingleMint( - setBasket(1000000), - setBasset(maxWeight, 250000), - 1500001, - setResult(false, "bAssets used in mint cannot exceed their max weight"), - ); - // 95% - maxWeight = 95; - await assertSingleMint( - setBasket(1000000), - setBasset(maxWeight, 250000), - 1500000, - setResult(true), - ); - await assertSingleMint( - setBasket(1000000), - setBasset(maxWeight, 250000), - 12500000, - setResult(true), - ); - await assertSingleMint( - setBasket(1000000), - setBasset(maxWeight, 250000), - 14000001, - setResult(false, "bAssets used in mint cannot exceed their max weight"), - ); - }); - }); - describe("and various decimals", async () => { - it("returns valid with custom ratio", async () => { - // 100 total supply - // bAsset 25 vaultBalance, 30 maxWeighting, 6 decimals - await assertSingleMint( - setBasket(100), - setBasset(30, 25, 6), - 1, - setResult(true), - ); - }); - }); - describe("and various mint volumes", async () => { - // should be ok with 0 - it("should be ok with 0 at all times", async () => { - // 100 total supply - // bAsset 25 vaultBalance, 30 maxWeighting, 18 decimals - await assertSingleMint( - setBasket(100), - setBasset(30, 25, 6), - 0, - setResult(true), - ); - // bAsset 25 vaultBalance, 30 maxWeighting, 6 decimals - await assertSingleMint( - setBasket(100), - setBasset(30, 25, 6), - 0, - setResult(true), - ); - // bAsset 25 vaultBalance, 30 maxWeighting, 18 decimals - await assertSingleMint( - setBasket(100), - setBasset(30, 25, 18), - 0, - setResult(true), - ); - }); - it("should fail once mint volume triggers max weight", async () => { - // 100 total supply - // bAsset 25 vaultBalance, 30 maxWeighting, 6 decimals - await assertSingleMint( - setBasket(100), - setBasset(35, 25, 6), - 13, - setResult(true), - ); - // bAsset 25 vaultBalance, 30 maxWeighting, 6 decimals - await assertSingleMint( - setBasket(100), - setBasset(30, 25, 6), - 14, - setResult(false, "bAssets used in mint cannot exceed their max weight"), - ); - }); - }); - }); - // Overweight is defined when bAssetVaultUnits > (totalSupply * bAssetMax) - context("with a basset overweight", async () => { - it("returns inValid for a simple validation", async () => { - // 100 total supply - // bAsset 40 vaultBalance, 25 maxWeighting, 18 decimals - await assertSingleMint( - setBasket(100), - setBasset(25, 40), - 1, - setResult(false, "bAssets used in mint cannot exceed their max weight"), - ); - }); - describe("with large basket supply", async () => { - it("always returns invalid until weight is increased", async () => { - // 1,000,000 total supply - // bAsset 120,000 vaultBalance, 10% maxWeighting, 18 decimals - await assertSingleMint( - setBasket(1000000), - setBasset(10, 120000), - 1, - setResult(false, "bAssets used in mint cannot exceed their max weight"), - ); - // 5,000,000 total supply - // bAsset 2,000,000 vaultBalance, 25% maxWeighting, 18 decimals - await assertSingleMint( - setBasket(5000000), - setBasset(35, 2000000), - 100, - setResult(false, "bAssets used in mint cannot exceed their max weight"), - ); - // 5,000,000 total supply - // bAsset 2,000,000 vaultBalance, 40% maxWeighting, 18 decimals - await assertSingleMint( - setBasket(5000000), - setBasset(41, 2000000), - 100, - setResult(true), - ); - }); - }); - describe("and various mint volumes", async () => { - // should be ok with 0 - // should fail with lots - it("returns invalid with a 0 quantity input", async () => { - // 100 total supply - // bAsset 26.1 vaultBalance, 25% maxWeighting, 18 decimals - // making it 1.1 units gt target - await assertSingleMint( - setBasket(100), - setBasset(25, "26.1"), - 0, - setResult(false, "bAssets used in mint cannot exceed their max weight"), - ); - }); - it("returns invalid with a all quantities", async () => { - // 100 total supply - // bAsset 26.1 vaultBalance, 25% maxWeighting, 18 decimals - // making it 1.1 units gt target - await assertSingleMint( - setBasket(100), - setBasset(25, "26.1"), - 2, - setResult(false, "bAssets used in mint cannot exceed their max weight"), - ); - await assertSingleMint( - setBasket(100), - setBasset(25, "26.1"), - 10, - setResult(false, "bAssets used in mint cannot exceed their max weight"), - ); - await assertSingleMint( - setBasket(100), - setBasset(25, "26.1"), - 10000000, - setResult(false, "bAssets used in mint cannot exceed their max weight"), - ); - }); - }); - }); - // Affected bAssets have been excluded from the basket temporarily or permanently due to circumstance - context("with an affected bAsset", async () => { - it("returns inValid for a simple validation", async () => { - // 100 total supply - // bAsset 25 vaultBalance, 25 maxWeighting, 18 decimals - // Assert normal mint works - await assertSingleMint( - setBasket(100), - setBasset(25, 25, 18, BassetStatus.BrokenBelowPeg), - 0, - setResult(false, "bAsset not allowed in mint"), - ); - await assertSingleMint( - setBasket(100), - setBasset(25, 25, 18, BassetStatus.Blacklisted), - 0, - setResult(false, "bAsset not allowed in mint"), - ); - await assertSingleMint( - setBasket(100), - setBasset(25, 25, 18, BassetStatus.Liquidating), - 0, - setResult(false, "bAsset not allowed in mint"), - ); - }); - }); - }); - context("validating a mint with multiple bAssets", async () => { - const assertMintMulti = async ( - basket: BasketDeets, - bassets: Array, - quantities: Array, - result: Result, - sender: string = accounts[0], - ): Promise => { - const [isValid, reason] = await forgeValidator.validateMintMulti( - simpleToExactAmount(basket.totalSupply, 18), - bassets.map((b) => createBasset(b.maxWeight, b.vaultUnits, b.decimals, b.status)), - quantities.map((q, i) => - simpleToExactAmount(q, bassets[i] ? bassets[i].decimals : 18), - ), - { from: sender }, - ); - expect(result.expectedValidity).to.eq(isValid); - expect(result.expectedReason).to.eq(reason); - }; - - // At target weight is defined when bAssetVaultUnits <= (totalSupply * bAssetTarget) - context("with a basset under its max weight", async () => { - it("returns valid for a simple validation that remains within the max weight", async () => { - /** - * TotalSupply: 100e18 - * BassetMax: [25] - * BassetVaults: [24] - * MintAmts: [1] - * new weighting now 25/100, on the threshold - */ - await assertMintMulti(setBasket(100), [setBasset(25, 24)], [1], setResult(true)); - }); - it("should work for any sender", async () => { - await assertMintMulti( - setBasket(100), - [setBasset(25, 24), setBasset(25, 24)], - [1, 1], - setResult(true), - accounts[1], - ); - await assertMintMulti( - setBasket(100), - [setBasset(25, 24), setBasset(25, 24), setBasset(25, 24)], - [1, 1, 1], - setResult(true), - accounts[2], - ); - }); - it("returns inValid if mint pushes bAsset overweight", async () => { - /** - * TotalSupply: 100e18 - * Grace: 1e18 - * BassetMax: [25] - * BassetVaults: [24] - * MintAmts: [2] - * 1 deviation allowance but 2 mint units - pushing above threshold - */ - await assertMintMulti( - setBasket(100), - [setBasset(25, 24, 6)], - [2], - setResult(false, "bAssets used in mint cannot exceed their max weight"), - ); - }); - describe("using unexpected arguments", async () => { - it("should return valid if there are no bAssets passed", async () => { - await assertMintMulti(setBasket(100), [], [], setResult(true)); - }); - it("should fail if inputs are of unequal length", async () => { - await assertMintMulti( - setBasket(100), - [setBasset(25, 25), setBasset(25, 25)], - [5], - setResult(false, "Input length should be equal"), - ); - await assertMintMulti( - setBasket(100), - [setBasset(25, 25)], - [5, 5], - setResult(false, "Input length should be equal"), - ); - }); - }); - describe("using multiple bAssets as input", async () => { - it("should succeed when using may inputs", async () => { - /** - * TotalSupply: 100e18 - * Grace: 1e18 - * BassetMax: [15, 15, 15, 15...] - * BassetVaults: [10, 10, 10, 10...] - * MintAmts: [5, 6, 5, 5, 4,...] - * Mints cause weights to deviate *within* the allowance - */ - await assertMintMulti( - setBasket(100), - [ - setBasset(15, 10), - setBasset(15, 10), - setBasset(15, 10), - setBasset(15, 10), - setBasset(15, 10), - setBasset(15, 10), - setBasset(15, 10), - setBasset(15, 10), - setBasset(15, 10), - setBasset(15, 10), - ], - [5, 6, 5, 4, 6, 5, 5, 5, 6, 5], - setResult(true), - ); - }); - it("should calculate the new total supply correctly and apply conditions", async () => { - /** - * TotalSupply: 100e18 - * BassetMax: [25, 25, 25] - * BassetVaults: [23, 23, 23] - * MintAmts: [ 4, 4, 4] - * Mints cause total supply to go up, causing what would have been - * over weight exceptions to now be valid - */ - await assertMintMulti( - setBasket(100), - [setBasset(25, 23), setBasset(25, 23), setBasset(25, 23)], - [4, 4, 4], - setResult(true), - ); - }); - it("should fail if the inputs are of unequal length", async () => { - await assertMintMulti( - setBasket(100), - [setBasset(25, 25), setBasset(25, 25), setBasset(25, 25)], - [4, 4], - setResult(false, "Input length should be equal"), - ); - await assertMintMulti( - setBasket(100), - [setBasset(25, 25), setBasset(25, 25)], - [4, 4, 4], - setResult(false, "Input length should be equal"), - ); - }); - it("should fail if any bAsset goes above max weight", async () => { - /** - * TotalSupply: 100e18 - * BassetMax: [25, 25, 25] - * BassetVaults: [24, 24, 24] - * MintAmts: [ 2, 6, 2] - * Mints cause total supply to go up, causing B to go overweight - */ - await assertMintMulti( - setBasket(100), - [setBasset(25, 24), setBasset(25, 24), setBasset(25, 24)], - [2, 6, 2], - setResult(false, "bAssets used in mint cannot exceed their max weight"), - ); - }); - }); - describe("with large basket supply", async () => { - it("should succeed with sufficient max weight", async () => { - /** - * TotalSupply: 1e25 - * BassetMax: [2.65] - * BassetVaults: [250k] - * MintAmts: [ 10k] - */ - await assertMintMulti( - setBasket(10000000), - [setBasset("2.65", 250000, 12)], - [10000], - setResult(true), - ); - }); - it("should fail if we exceed the max weight", async () => { - /** - * TotalSupply: 1e25 - * BassetMax: [2.55] - * BassetVaults: [250k] - * MintAmts: [ 10k] - */ - await assertMintMulti( - setBasket(10000000), - [setBasset("2.55", 250000, 12)], - [10000], - setResult(false, "bAssets used in mint cannot exceed their max weight"), - ); - }); - }); - describe("with a variable max weight", async () => { - it("should succeed with sufficient allowance", async () => { - /** - * TotalSupply: 1000e18 - * BassetMax: [15] - * BassetVaults: [150] - * MintAmts: [100] - * New weighting now 250/1100, or 22.7% - * target weight in units = 165, so 85 grace needed - */ - let maxWeight = 30; - await assertMintMulti( - setBasket(1000), - [setBasset(maxWeight, 150)], - [100], - setResult(true), - ); - maxWeight = 23; - await assertMintMulti( - setBasket(1000), - [setBasset(maxWeight, 150)], - [100], - setResult(true), - ); - maxWeight = 22; - await assertMintMulti( - setBasket(1000), - [setBasset(maxWeight, 150)], - [100], - setResult(false, "bAssets used in mint cannot exceed their max weight"), - ); - }); - it("should always fail with 0 max weight", async () => { - /** - * BassetMax: [0] - * BassetVaults: [150] - * MintAmts: [100] - */ - await assertMintMulti( - setBasket(100), - [setBasset(0, 25)], - [1], - setResult(false, "bAssets used in mint cannot exceed their max weight"), - ); - }); - it("should allow anything at a high weight", async () => { - /** - * BassetMax: [65] - * BassetVaults: [250k] - * MintAmts: [1m] - */ - let maxWeight = 65; - await assertMintMulti( - setBasket(1000000), - [setBasset(maxWeight, 250000)], - [1000000], - setResult(true), - ); - await assertMintMulti( - setBasket(1000000), - [setBasset(maxWeight, 250000)], - [1500000], - setResult(false, "bAssets used in mint cannot exceed their max weight"), - ); - maxWeight = 95; - await assertMintMulti( - setBasket(1000000), - [setBasset(maxWeight, 250000)], - [1500000], - setResult(true), - ); - await assertMintMulti( - setBasket(1000000), - [setBasset(maxWeight, 250000)], - [12500000], - setResult(true), - ); - await assertMintMulti( - setBasket(1000000), - [setBasset(maxWeight, 250000)], - [14000001], - setResult(false, "bAssets used in mint cannot exceed their max weight"), - ); - }); - }); - describe("and various decimals", async () => { - it("returns valid with custom ratio", async () => { - /** - * TotalSupply: 100e18 - * BassetMax: [30] - * BassetVaults: [25] - * MintAmts: [1] - */ - await assertMintMulti( - setBasket(100), - [setBasset(30, 25, 6)], - [1], - setResult(true), - ); - }); - }); - describe("and various mint volumes", async () => { - // should be ok with 0 - it("should be ok with 0 at all times", async () => { - /** - * TotalSupply: 100e18 - * BassetMax: [25] - * BassetVaults: [25] - * MintAmts: [0] - */ - await assertMintMulti( - setBasket(100), - [setBasset(25, 25, 6)], - [0], - setResult(true), - ); - // bAsset 25 vaultBalance, 30 maxWeighting, 6 decimals - await assertMintMulti( - setBasket(100), - [setBasset(30, 25, 6)], - [0], - setResult(true), - ); - // bAsset 45 vaultBalance, 45 maxWeighting, 18 decimals - await assertMintMulti( - setBasket(100), - [setBasset(45, 45, 18)], - [0], - setResult(true), - ); - }); - it("should fail once mint volume triggers threshold", async () => { - /** - * TotalSupply: 100e18 - * BassetMax: [35] - * BassetVaults: [25] - * MintAmts: [0] - */ - await assertMintMulti( - setBasket(100), - [setBasset(35, 25, 6)], - [13], - setResult(true), - ); - // bAsset 25 vaultBalance, 35 maxWeighting, 6 decimals - await assertMintMulti( - setBasket(100), - [setBasset(35, 25, 6)], - [16], - setResult(false, "bAssets used in mint cannot exceed their max weight"), - ); - }); - }); - }); - // Overweight is defined when bAssetVaultUnits > (totalSupply * bAssetTarget) - context("with a basset overweight", async () => { - it("returns inValid for a simple validation", async () => { - /** - * TotalSupply: 100e18 - * BassetMax: [25] - * BassetVaults: [40] - * MintAmts: [1] - */ - await assertMintMulti( - setBasket(100), - [setBasset(25, 40)], - [1], - setResult(false, "bAssets used in mint cannot exceed their max weight"), - ); - }); - describe("with large basket supply", async () => { - it("always returns invalid until max weight is increased", async () => { - /** - * TotalSupply: 1e24 - * BassetMax: [10] - * BassetVaults: [120k] - * MintAmts: [1] - * Basset is already 20k units overweight - */ - await assertMintMulti( - setBasket(1000000), - [setBasset(10, 120000)], - [1], - setResult(false, "bAssets used in mint cannot exceed their max weight"), - ); - // 5,000,000 total supply - // bAsset 2,000,000 vaultBalance, 40% maxWeighting, 18 decimals - await assertMintMulti( - setBasket(5000000), - [setBasset(40, 2000000)], - [100], - setResult(false, "bAssets used in mint cannot exceed their max weight"), - ); - // 5,000,000 total supply - // bAsset 2,000,000 vaultBalance, 41% maxWeighting, 18 decimals - // passed now due to 41 max - await assertMintMulti( - setBasket(5000000), - [setBasset(41, 2000000)], - [100], - setResult(true), - ); - }); - }); - describe("and various mint volumes", async () => { - // should be ok with 0 - // should fail with lots - it("returns invalid with a 0 quantity input", async () => { - /** - * TotalSupply: 100e18 - * BassetMax: [25] - * BassetVaults: [26] - * MintAmts: [0] - * Basset is already overweight - */ - await assertMintMulti( - setBasket(100), - [setBasset(25, 26)], - [0], - setResult(false, "bAssets used in mint cannot exceed their max weight"), - ); - }); - it("returns invalid with a all quantities", async () => { - /** - * TotalSupply: 100e18 - * BassetMax: [25] - * BassetVaults: [25] - * MintAmts: [0] - * Basset is already overweight - */ - await assertMintMulti( - setBasket(100), - [setBasset(25, 25)], - [2], - setResult(false, "bAssets used in mint cannot exceed their max weight"), - ); - await assertMintMulti( - setBasket(100), - [setBasset(25, 25)], - [10], - setResult(false, "bAssets used in mint cannot exceed their max weight"), - ); - await assertMintMulti( - setBasket(100), - [setBasset(40, 25)], - [10000000], - setResult(false, "bAssets used in mint cannot exceed their max weight"), - ); - }); - }); - }); - // Affected bAssets have been excluded from the basket temporarily or permanently due to circumstance - context("with an affected bAsset", async () => { - it("returns inValid for a simple validation", async () => { - /** - * TotalSupply: 100e18 - * BassetMax: [25] - * BassetVaults: [25] - * MintAmts: [0] - * Fails since bAssets used are invalid - */ - await assertMintMulti( - setBasket(100), - [setBasset(25, 25, 18, BassetStatus.BrokenBelowPeg)], - [0], - setResult(false, "bAsset not allowed in mint"), - ); - await assertMintMulti( - setBasket(100), - [setBasset(25, 25, 18, BassetStatus.Blacklisted)], - [0], - setResult(false, "bAsset not allowed in mint"), - ); - await assertMintMulti( - setBasket(100), - [setBasset(25, 25, 18, BassetStatus.Liquidating)], - [0], - setResult(false, "bAsset not allowed in mint"), - ); - }); - }); - }); -}); diff --git a/test/masset/forge-validator/TestForgeValidatorR.spec.ts b/test/masset/forge-validator/TestForgeValidatorR.spec.ts deleted file mode 100644 index 3daacef9..00000000 --- a/test/masset/forge-validator/TestForgeValidatorR.spec.ts +++ /dev/null @@ -1,1111 +0,0 @@ -import { simpleToExactAmount } from "@utils/math"; -import { BN } from "@utils/tools"; -import { createBasset, BassetStatus } from "@utils/mstable-objects"; -import envSetup from "@utils/env_setup"; -import * as t from "types/generated"; -import { ratioScale } from "@utils/constants"; - -const { expect } = envSetup.configure(); - -const ForgeValidatorArtifact = artifacts.require("ForgeValidator"); - -interface BasketDeets { - failed: boolean; - totalSupply: number | string; -} -const setBasket = (failed: boolean, totalSupply: number | string): BasketDeets => { - return { - failed, - totalSupply, - }; -}; - -interface BassetDeets { - maxWeight: number | string; - vaultUnits: number | string; - decimals: number; - status: BassetStatus; -} -const setBasset = ( - maxWeight: number | string, - vaultUnits: number | string, - decimals = 18, - status: BassetStatus = BassetStatus.Normal, -): BassetDeets => { - return { - maxWeight, - vaultUnits, - decimals, - status, - }; -}; - -interface Args { - indexToRedeem: number; - redeemAmountUnits: number | string; -} -const setArgs = (indexToRedeem: number, redeemAmountUnits: number | string): Args => { - return { - indexToRedeem, - redeemAmountUnits, - }; -}; - -interface CalcResult { - expectedValidity: boolean; - expectedReason: string; - expectedQs: Array; - exact: boolean; -} -const setCalcResult = ( - expectedValidity: boolean, - expectedReason = "", - expectedQs: Array = [], - exact = false, -): CalcResult => { - return { - expectedValidity, - expectedReason, - expectedQs, - exact, - }; -}; - -interface Result { - expectedValidity: boolean; - expectedReason: string; - expectFee: boolean; -} -const setResult = ( - expectedValidity: boolean, - expectedReason = "", - expectFee = expectedValidity, -): Result => { - return { - expectedValidity, - expectedReason, - expectFee, - }; -}; - -contract("ForgeValidator", async (accounts) => { - let forgeValidator: t.ForgeValidatorInstance; - - before("Init contract", async () => { - forgeValidator = await ForgeValidatorArtifact.new(); - }); - - const assertRedeem = async ( - basket: BasketDeets, - bAssets: BassetDeets[], - args: Array, - result: Result, - sender: string = accounts[0], - ): Promise => { - const [isValid, reason, applyFee] = await forgeValidator.validateRedemption( - basket.failed, - simpleToExactAmount(basket.totalSupply, 18), - bAssets.map((b) => - createBasset( - b.maxWeight, - b.vaultUnits, - b.decimals, - b.status || BassetStatus.Normal, - ), - ), - args.filter((a) => a.indexToRedeem !== undefined).map((a) => a.indexToRedeem), - args.map((a) => - simpleToExactAmount( - a.redeemAmountUnits, - a.indexToRedeem === undefined || a.indexToRedeem >= bAssets.length - ? 18 - : bAssets[a.indexToRedeem].decimals, - ), - ), - { from: sender }, - ); - expect(result.expectedValidity).to.eq(isValid); - expect(result.expectedReason).to.eq(reason); - expect(result.expectFee).to.eq(applyFee); - }; - - context("validating a single redeem", async () => { - // At target weight is defined when bAssetVaultUnits == (totalSupply * bAssetTarget) - context("in a basket with no bAssets over max", async () => { - it("returns valid for a simple validation", async () => { - /** - * TotalSupply: 100e18 - * MaxWeights: [50, 50, 50, 50] - * BassetVaults: [25, 25, 25, 25] - * RedeemIndex: [ 0] - * RedeemAmt: [ 10] - */ - await assertRedeem( - setBasket(false, 100), - [setBasset(50, 25), setBasset(50, 25), setBasset(50, 25), setBasset(50, 25)], - [setArgs(0, 10)], - setResult(true), - ); - }); - it("should work for any sender", async () => { - /** - * TotalSupply: 100e18 - * MaxWeights: [50, 50, 50, 50] - * BassetVaults: [25, 25, 25, 25] - * RedeemIndex: [ 0] - * RedeemAmt: [ 10] - */ - await assertRedeem( - setBasket(false, 100), - [setBasset(50, 25), setBasset(50, 25), setBasset(50, 25), setBasset(50, 25)], - [setArgs(0, 10)], - setResult(true), - accounts[4], - ); - }); - it("returns inValid if the bAsset does not exist", async () => { - /** - * TotalSupply: 100e18 - * MaxWeights: [50, 50, 50, 50] - * BassetVaults: [25, 25, 25, 25] - * RedeemIndex: [ 0] - * RedeemAmt: [ 10] - */ - await assertRedeem( - setBasket(false, 100), - [setBasset(50, 25), setBasset(50, 25), setBasset(50, 25), setBasset(50, 25)], - [setArgs(4, 10)], - setResult(false, "Basset does not exist"), - ); - }); - it("returns inValid if the bAsset vaultBalance is 0", async () => { - /** - * TotalSupply: 100e18 - * MaxWeights: [50, 50] - * BassetVaults: [ 0, 0] - * RedeemIndex: [ 0] - * RedeemAmt: [ 1] - */ - await assertRedeem( - setBasket(false, 100), - [setBasset(50, 0), setBasset(50, 0)], - [setArgs(0, 1)], - setResult(false, "Cannot redeem more bAssets than are in the vault"), - ); - }); - describe("and the redemption causes other bAssets to go overweight", async () => { - it("should fail", async () => { - /** - * TotalSupply: 100e18 - * MaxWeights: [50, 50, 50, 50] - * BassetVaults: [48, 30, 20, 2] - * RedeemIndex: [ 1] - * RedeemAmt: [ 15] - */ - await assertRedeem( - setBasket(false, 100), - [setBasset(50, 48), setBasset(50, 30), setBasset(50, 20), setBasset(50, 2)], - [setArgs(1, 15)], - setResult(false, "bAssets must remain below max weight"), - ); - }); - }); - describe("using unexpected arguments", async () => { - it("should return valid if there are no bAssets passed", async () => { - await assertRedeem( - setBasket(false, 100), - [ - setBasset(50, 25), - setBasset(50, 25), - setBasset(50, 25), - setBasset(50, 25), - ], - [], - setResult(true), - ); - }); - it("should fail if inputs are of unequal length", async () => { - await assertRedeem( - setBasket(false, 100), - [ - setBasset(25, 25), - setBasset(25, 25), - setBasset(25, 25), - setBasset(25, 25), - setBasset(25, 25), - setBasset(25, 25), - ], - [setArgs(undefined, 5), setArgs(1, 5)], - setResult(false, "Input arrays must have equal length"), - ); - }); - }); - describe("redeeming relatively largely amount of a bAsset", async () => { - it("returns inValid if the bAsset quantity is greater than vault balance", async () => { - /** - * TotalSupply: 100e18 - * MaxWeights: [50, 50, 50, 50] - * BassetVaults: [40, 5, 15, 40] - * RedeemIndex: 1 - * RedeemAmt: 6 - */ - await assertRedeem( - setBasket(false, 100), - [setBasset(50, 40), setBasset(50, 5), setBasset(50, 15), setBasset(50, 40)], - [setArgs(1, 6)], - setResult(false, "Cannot redeem more bAssets than are in the vault"), - ); - await assertRedeem( - setBasket(false, 100), - [setBasset(50, 40), setBasset(50, 5), setBasset(50, 15), setBasset(50, 40)], - [setArgs(0, 10), setArgs(2, 21)], - setResult(false, "Cannot redeem more bAssets than are in the vault"), - ); - }); - }); - describe("using multiple bAssets as input", async () => { - it("should succeed when using may inputs", async () => { - /** - * TotalSupply: 100e18 - * MaxWeights: [10, 10, 10, 10...] - * BassetVaults: [10, 10, 10, 10...] - * RedeemAmts: [5, 6, 5, 5, 4,...] - * Redemption cause weights to deviate *within* the allowance - */ - await assertRedeem( - setBasket(false, 100), - [ - setBasset(15, 10), - setBasset(15, 10), - setBasset(15, 10), - setBasset(15, 10), - setBasset(15, 10), - setBasset(15, 10), - setBasset(15, 10), - setBasset(15, 10), - setBasset(15, 10), - setBasset(15, 10), - ], - [ - setArgs(0, 5), - setArgs(1, 6), - setArgs(2, 5), - setArgs(3, 4), - setArgs(4, 6), - setArgs(5, 5), - setArgs(6, 5), - setArgs(7, 5), - setArgs(8, 5), - setArgs(9, 5), - ], - setResult(true), - ); - }); - it("should fail if the inputs are of unequal length", async () => { - await assertRedeem( - setBasket(false, 100), - [ - setBasset(25, 25), - setBasset(25, 25), - setBasset(25, 25), - setBasset(25, 25), - ], - [setArgs(0, 1), setArgs(undefined, 6)], - setResult(false, "Input arrays must have equal length"), - ); - }); - }); - describe("and various decimals", async () => { - it("returns valid with custom ratio", async () => { - /** - * TotalSupply: 100e18 - * MaxWeights: [ 50, 50, 50] - * BassetVaults: [ 48, 48, 4] - * RedeemIndex: 0 - * RedeemAmt: 1 - */ - await assertRedeem( - setBasket(false, 100), - [setBasset(50, 48, 6), setBasset(50, 48, 12), setBasset(50, 4)], - [setArgs(0, 3)], - setResult(true), - ); - // Pushes index 1 over it's implicit max - await assertRedeem( - setBasket(false, 100), - [setBasset(50, 48, 6), setBasset(50, 48, 12), setBasset(50, 4)], - [setArgs(0, 10)], - setResult(false, "bAssets must remain below max weight"), - ); - }); - }); - describe("and various redemption volumes", async () => { - it("should be ok with 0 at all times", async () => { - /** - * TotalSupply: 114 - * MaxWeights: [50, 50, 50] - * BassetVaults: [30, 44, 40] - * RedeemIndex: 0 - * RedeemAmt: 0 - * Doesn't change the basket composition at all - */ - await assertRedeem( - setBasket(false, 114), - [setBasset(50, 30), setBasset(50, 44), setBasset(50, 40)], - [setArgs(0, 0)], - setResult(true), - ); - }); - }); - }); - context("in a basket with lots of bAssets (14)", async () => { - it("should execute some basic validations", async () => { - /** - * TotalSupply: 4000 - * MaxWeights: [40, 40, 20, 1....] - * BassetVaults: [880, 800, 400, ...] - * RedeemIndex: 9 - * RedeemAmt: 10 - */ - await assertRedeem( - setBasket(false, 4000), - [ - setBasset(40, 880), - setBasset(40, 800), - setBasset(20, 400), - setBasset(20, 400), - setBasset(20, 400), - setBasset(20, 400), - setBasset(10, 200), - setBasset(10, 200), - setBasset(5, 80), - setBasset(5, 80), - setBasset(5, 80), - setBasset(5, 80), - ], - [setArgs(9, 10)], - setResult(true), - ); - await assertRedeem( - setBasket(false, 4000), - [ - setBasset(40, 880), - setBasset(40, 800), - setBasset(20, 400), - setBasset(20, 400), - setBasset(20, 400), - setBasset(20, 400), - setBasset(10, 200), - setBasset(10, 200), - setBasset(5, 80), - setBasset(5, 80), - setBasset(5, 80), - setBasset(5, 80), - ], - [setArgs(0, 400)], - setResult(true), - ); - }); - }); - context("in a basket with some bAssets overweight", async () => { - describe("redeeming a non overweight bAsset", async () => { - it("should always return invalid", async () => { - /** - * TotalSupply: 100e18 - * MaxWeights: [20, 40, 40, 40] - * BassetVaults: [37, 21, 21, 21] - * RedeemIndex: 0 - * RedeemAmt: 10 - */ - await assertRedeem( - setBasket(false, 100), - [ - setBasset(20, 37), - setBasset(40, 21), - setBasset(40, 21), - setBasset(40, 21), - ], - [setArgs(1, 1)], - setResult(false, "Must redeem overweight bAssets"), - ); - await assertRedeem( - setBasket(false, 100), - [ - setBasset(20, 37), - setBasset(40, 21), - setBasset(40, 21), - setBasset(40, 21), - ], - [setArgs(2, 1)], - setResult(false, "Must redeem overweight bAssets"), - ); - }); - }); - describe("redeeming some overweight bAssets", async () => { - it("should fail if we don't redeem all overweight", async () => { - /** - * TotalSupply: 100e18 - * MaxWeights: [40, 40, 40, 40] - * BassetVaults: [48, 45, 5, 2] - * RedeemIndex: [ 0] - * RedeemAmt: [ 5] - */ - await assertRedeem( - setBasket(false, 100), - [setBasset(40, 48), setBasset(40, 45), setBasset(40, 5), setBasset(40, 2)], - [setArgs(0, 5)], - setResult(false, "Redemption must contain all overweight bAssets"), - ); - }); - it("should fail if we redeem the same count but some aren't overweight", async () => { - /** - * TotalSupply: 100e18 - * MaxWeights: [40, 40, 40, 40] - * BassetVaults: [48, 45, 5, 2] - * RedeemIndex: [ 0] - * RedeemAmt: [ 5] - */ - await assertRedeem( - setBasket(false, 100), - [setBasset(40, 48), setBasset(40, 45), setBasset(40, 5), setBasset(40, 2)], - [setArgs(0, 5), setArgs(2, 1)], - setResult(false, "Must redeem overweight bAssets"), - ); - }); - }); - describe("redeeming ALL overweight bAssets", async () => { - it("should return valid, so long as others don't go overweight", async () => { - /** - * TotalSupply: 100e18 - * MaxWeights: [40, 40, 40, 40] - * BassetVaults: [48, 45, 5, 2] - * RedeemIndex: [ 0, 1] - * RedeemAmt: [ 2, 3] - */ - await assertRedeem( - setBasket(false, 100), - [setBasset(40, 48), setBasset(40, 45), setBasset(40, 5), setBasset(40, 2)], - [setArgs(0, 2), setArgs(1, 3)], - setResult(true, "", false), - ); - await assertRedeem( - setBasket(false, 100), - [setBasset(40, 48), setBasset(20, 21), setBasset(30, 29), setBasset(40, 2)], - [setArgs(0, 20), setArgs(1, 10)], - setResult(false, "bAssets must remain below max weight"), - ); - }); - it("should still allow the redemption if some other bAsset is breached", async () => { - /** - * TotalSupply: 100e18 - * MaxWeights: [40, 20, 30, 40] - * BassetVaults: [48, 21, 29, 2] - * RedeemIndex: [ 0, 1] - * RedeemAmt: [ .001, .001] - */ - await assertRedeem( - setBasket(false, 100), - [setBasset(40, 48), setBasset(20, 21), setBasset(30, 29), setBasset(40, 2)], - [setArgs(0, "0.001"), setArgs(1, "0.001")], - setResult(true, "", false), - ); - }); - }); - }); - context("in a basket with bAssets nearing threshold (max weight breached)", async () => { - it("allows redemption as long as nothing goes overweight", async () => { - /** - * TotalSupply: 100e18 - * MaxWeights: [ 40, 40, 40, 40] - * BassetVaults: [39.5, 30, 10.5, 20] - * RedeemIndex: [ 0] - * RedeemAmt: [ 1] - * bAsset 0 is breached as it is within 1% of max - */ - await assertRedeem( - setBasket(false, 100), - [ - setBasset(40, "39.5"), - setBasset(40, 30), - setBasset(40, "10.5"), - setBasset(40, 20), - ], - [setArgs(0, 10)], - setResult(true, "", true), - ); - await assertRedeem( - setBasket(false, 100), - [ - setBasset(40, "39.5"), - setBasset(40, 30), - setBasset(40, "10.5"), - setBasset(40, 20), - ], - [setArgs(1, 3)], - setResult(false, "bAssets must remain below max weight"), - ); - }); - describe("and using multiple inputs", async () => { - it("still fails", async () => { - /** - * TotalSupply: 100e18 - * MaxWeights: [ 40, 40, 40, 40] - * BassetVaults: [39.5, 30, 10.5, 20] - * RedeemIndex: [ 0, 3] - * RedeemAmt: [ 1, 3] - * bAsset 0 is breached as it is within 1% of max - */ - await assertRedeem( - setBasket(false, 100), - [ - setBasset(40, "39.5"), - setBasset(40, 30), - setBasset(40, "10.5"), - setBasset(40, 20), - ], - [setArgs(0, 5), setArgs(3, 3)], - setResult(true, "", true), - ); - await assertRedeem( - setBasket(false, 100), - [ - setBasset(40, "39.5"), - setBasset(40, 30), - setBasset(40, "10.5"), - setBasset(40, 20), - ], - [setArgs(0, 1), setArgs(1, 7)], - setResult(false, "bAssets must remain below max weight"), - ); - }); - }); - }); - context("in a basket with some affected bAssets", async () => { - context("where some bAssets are liquidating, above or below peg", async () => { - it("forces proportional using multiple bAssets", async () => { - /** - * TotalSupply: 100 - * MaxWeights: [ 40, 40, 40, 40] - * BassetVaults: [ 30, 30, 20, 20] - * RedeemIndex: [ 0] - * RedeemAmt: [ 1] - */ - await assertRedeem( - setBasket(false, 100), - [ - setBasset(40, 30), - setBasset(40, 30, 18, BassetStatus.Liquidating), - setBasset(40, 20), - setBasset(40, 20), - ], - [setArgs(0, 1)], - setResult(false, "Must redeem proportionately"), - ); - await assertRedeem( - setBasket(false, 100), - [ - setBasset(40, 30, 12, BassetStatus.BrokenAbovePeg), - setBasset(40, 30, 6), - setBasset(40, 20), - setBasset(40, 20), - ], - [setArgs(0, 1)], - setResult(false, "Must redeem proportionately"), - ); - await assertRedeem( - setBasket(false, 100), - [ - setBasset(40, 30), - setBasset(40, 30, 6), - setBasset(40, 20), - setBasset(40, 20, 12, BassetStatus.BrokenBelowPeg), - ], - [setArgs(0, 1)], - setResult(false, "Must redeem proportionately"), - ); - }); - }); - context("where some bAsset is blacklisted", async () => { - it("fails if we try to redeem anything", async () => { - /** - * TotalSupply: 100 - * MaxWeights: [ 40, 40, 40, 40] - * BassetVaults: [ 30, 30, 20, 20] - * RedeemIndex: [ 0] - * RedeemAmt: [ 1] - */ - await assertRedeem( - setBasket(false, 100), - [ - setBasset(40, 30), - setBasset(40, 30, 18, BassetStatus.Blacklisted), - setBasset(40, 20), - setBasset(40, 20), - ], - [setArgs(0, 1)], - setResult(false, "Basket contains blacklisted bAsset"), - ); - }); - }); - }); - context("in an affected basket", async () => { - describe("when the basket has failed", async () => { - it("always enforces proportional redemption", async () => { - /** - * TotalSupply: 100 - * MaxWeights: [ 40, 40, 40, 40] - * BassetVaults: [ 30, 30, 20, 20] - * RedeemIndex: [ 0] - * RedeemAmt: [ 1] - */ - await assertRedeem( - setBasket(true, 100), - [ - setBasset(40, 30), - setBasset(40, 30), - setBasset(40, 20), - setBasset(40, 20), - ], - [setArgs(0, 1)], - setResult(false, "Must redeem proportionately"), - ); - }); - }); - }); - }); - - context("calculating a multi redeem", async () => { - const assertRedeemCalc = async ( - exactMassetQ: BN, - bAssets: BassetDeets[], - result: CalcResult, - sender: string = accounts[0], - ): Promise => { - // Calculate the exact expected amounts from a simple amount - // If result is expected false, just stub the array with 0s - const exactExpectedQs = !result.expectedValidity - ? bAssets.map(() => new BN(0)) - : result.expectedQs.map((q, i) => - result.exact ? new BN(q) : simpleToExactAmount(q, bAssets[i].decimals), - ); - const bAssetObj = bAssets.map((b) => - createBasset( - b.maxWeight, - b.vaultUnits, - b.decimals, - b.status || BassetStatus.Normal, - ), - ); - const [isValid, reason, bassetQs] = await forgeValidator.calculateRedemptionMulti( - exactMassetQ, - bAssetObj, - { - from: sender, - }, - ); - expect(result.expectedValidity).to.eq(isValid); - expect(result.expectedReason).to.eq(reason); - const expectedLen = exactExpectedQs.length; - expect(expectedLen).to.eq(exactExpectedQs.length); - if (expectedLen > 0) { - exactExpectedQs.map((q, i) => expect(q).bignumber.eq(new BN(bassetQs[i]))); - const sumOfRatioedBassets = exactExpectedQs.reduce( - (p, c, i) => p.add(c.mul(new BN(bAssetObj[i].ratio)).div(ratioScale)), - new BN(0), - ); - // Important - assert that the sum of the returned values is LT massetQ input - expect(exactMassetQ).bignumber.gte(sumOfRatioedBassets as any); - } - }; - - context("in a basket with normal collateral levels", async () => { - it("returns proportional quantities", async () => { - /** - * MassetQ: 10 - * MaxWeights: [50, 50, 50, 50] - * BassetVaults: [25, 25, 25, 25] - * TotalSupply: 100 - */ - await assertRedeemCalc( - simpleToExactAmount(10, 18), - [setBasset(50, 25), setBasset(50, 25), setBasset(50, 25), setBasset(50, 25)], - setCalcResult(true, "", [2.5, 2.5, 2.5, 2.5]), - ); - }); - it("returns 100% if there is only 1 asset", async () => { - /** - * MassetQ: 10 - * MaxWeights: [100] - * BassetVaults: [100] - * TotalSupply: 100 - */ - await assertRedeemCalc( - simpleToExactAmount(10, 18), - [setBasset(100, 100, 6)], - setCalcResult(true, "", [10]), - ); - }); - it("should work for any sender", async () => { - /** - * MassetQ: 10 - * MaxWeights: [50, 50, 50, 50] - * BassetVaults: [25, 25, 25, 25] - * TotalSupply: 100 - */ - await assertRedeemCalc( - simpleToExactAmount(10, 18), - [setBasset(50, 25), setBasset(50, 25), setBasset(50, 25), setBasset(50, 25)], - setCalcResult(true, "", [2.5, 2.5, 2.5, 2.5]), - accounts[4], - ); - }); - describe("using unexpected arguments", async () => { - it("should return 0 if 0 mAsset is passed", async () => { - /** - * MassetQ: 0 - * MaxWeights: [50, 50, 50, 50] - * BassetVaults: [25, 25, 25, 25] - * TotalSupply: 100 - */ - await assertRedeemCalc( - new BN(0), - [ - setBasset(50, 25), - setBasset(50, 25), - setBasset(50, 25), - setBasset(50, 25), - ], - setCalcResult(true, "", [0, 0, 0, 0]), - ); - }); - it("should fail if mAsset Q is greater than sum of bAssets", async () => { - /** - * MassetQ: 105 - * MaxWeights: [50, 50, 50, 50] - * BassetVaults: [25, 25, 25, 25] - * TotalSupply: 100 - */ - await assertRedeemCalc( - simpleToExactAmount(105, 18), - [ - setBasset(50, 25), - setBasset(50, 25), - setBasset(50, 25), - setBasset(50, 25), - ], - setCalcResult(false, "Not enough liquidity"), - ); - }); - it("should fail if no bAssets are passed", async () => { - /** - * MassetQ: 1 - * MaxWeights: [] - * BassetVaults: [] - */ - await assertRedeemCalc( - simpleToExactAmount(1, 18), - [], - setCalcResult(false, "Nothing in the basket to redeem"), - ); - }); - }); - describe("redeeming relatively largely amount of mAsset", async () => { - it("returns proportional quantities", async () => { - /** - * MassetQ: 220 - * MaxWeights: [ 50, 50, 50, 50] - * BassetVaults: [100, 150, 125, 125] - * TotalSupply: 500 - */ - await assertRedeemCalc( - simpleToExactAmount(220, 18), - [ - setBasset(50, 100, 6), - setBasset(50, 150), - setBasset(50, 125, 12), - setBasset(50, 125), - ], - setCalcResult(true, "", [44, 66, 55, 55]), - ); - }); - it("returns inValid if the mAsset quantity is greater than vault balance", async () => { - /** - * MassetQ: 501 - * MaxWeights: [ 50, 50, 50, 50] - * BassetVaults: [100, 150, 125, 125] - * TotalSupply: 500 - */ - await assertRedeemCalc( - simpleToExactAmount(501, 18), - [ - setBasset(50, 100, 6), - setBasset(50, 150), - setBasset(50, 125, 12), - setBasset(50, 125), - ], - setCalcResult(false, "Not enough liquidity"), - ); - }); - }); - describe("and various decimals", async () => { - it("should still calculate accurately", async () => { - /** - * MassetQ: 12345 - * MaxWeights: [ 50, 50, 50, 50] - * BassetVaults: [300k, 400k, 50k, 650k] - * TotalSupply: 1400000 - */ - await assertRedeemCalc( - simpleToExactAmount(12345, 18), - [ - setBasset(50, 300000), - setBasset(50, 400000, 6), - setBasset(50, 50000, 12), - setBasset(50, 650000), - ], - setCalcResult( - true, - "", - [ - new BN("2645357142857142848325"), - new BN("3527142857"), - new BN("440892857142857"), - new BN("5731607142857142848325"), - ], - true, - ), - ); - }); - it("should round down everything if the return amounts are low", async () => { - /** - * MassetQ: 1 - * MaxWeights: [ 50, 50, 50, 50] - * BassetVaults: [100, 100, 100, 100] - * TotalSupply: 400 - */ - await assertRedeemCalc( - new BN(1), - [ - setBasset(50, 100, 6), - setBasset(50, 100), - setBasset(50, 100, 12), - setBasset(50, 100), - ], - setCalcResult(true, "", [0, 0, 0, 0]), - ); - }); - it("should round down if the return amount has a fraction", async () => { - /** - * MassetQ: 5 - * MaxWeights: [50, 50, 50, 50] - * BassetVaults: [25, 25, 25, 25] - * TotalSupply: 100 - */ - await assertRedeemCalc( - new BN(5), - [ - setBasset(50, 25, 6), - setBasset(50, 25), - setBasset(50, 25, 12), - setBasset(50, 25), - ], - setCalcResult(true, "", [0, 1, 0, 1], true), - ); - }); - }); - }); - context("in a fresh basket", async () => { - it("returns inValid if the total bAsset vaultBalance is 0", async () => { - /** - * MassetQ: 1 - * MaxWeights: [50, 50, 50, 50] - * BassetVaults: [0, 0, 0, 0] - * TotalSupply: 100 - */ - await assertRedeemCalc( - new BN(1), - [setBasset(50, 0), setBasset(50, 0), setBasset(50, 0), setBasset(50, 0)], - setCalcResult(false, "Nothing in the basket to redeem"), - ); - }); - }); - context("in a basket with lots of bAssets (14)", async () => { - it("should do normal calculations", async () => { - /** - * MassetQ: 100e18 - * MaxWeights: [20, 20, ... (10)] - * BassetVaults: [100, 100, ... (10)] - * TotalSupply: 1000 - */ - await assertRedeemCalc( - simpleToExactAmount(100, 18), - [ - setBasset(20, 100, 8), - setBasset(20, 100), - setBasset(20, 100, 16), - setBasset(20, 100), - setBasset(20, 100, 4), - setBasset(20, 100), - setBasset(20, 100), - setBasset(20, 100, 14), - setBasset(20, 100), - setBasset(20, 100), - ], - setCalcResult(true, "", [10, 10, 10, 10, 10, 10, 10, 10, 10, 10]), - ); - }); - it("should do normal calculations", async () => { - /** - * MassetQ: 140 - * BassetVaults: [200, 150, 150, 150, 75, 50, 25, 10] - * TotalSupply: 810 - */ - await assertRedeemCalc( - simpleToExactAmount(140, 18), - [ - setBasset(20, 200, 8), - setBasset(20, 150), - setBasset(20, 150, 16), - setBasset(20, 150), - setBasset(20, 75, 4), - setBasset(20, 50), - setBasset(20, 25), - setBasset(20, 10, 14), - setBasset(20, 0, 14), - ], - setCalcResult( - true, - "", - [ - new BN("3456790123"), - new BN("25925925925925925900"), - new BN("259259259259259259"), - new BN("25925925925925925900"), - new BN("129629"), - new BN("8641975308641975300"), - new BN("4320987654320987580"), - new BN("172839506172839"), - new BN("0"), - ], - true, - ), - ); - }); - }); - - context("in a basket with high collateral levels", async () => { - it("returns proportional quantities", async () => { - /** - * MassetQ: 100k - * BassetVaults: [2.5m, 2.5m, 4m, 1m] - * TotalSupply: 10m - */ - await assertRedeemCalc( - simpleToExactAmount(100000, 18), - [ - setBasset(50, 2500000), - setBasset(50, 2500000), - setBasset(50, 4000000), - setBasset(50, 1000000), - ], - setCalcResult(true, "", [25000, 25000, 40000, 10000]), - ); - }); - it("returns proportional quantities", async () => { - /** - * MassetQ: 500k - * BassetVaults: [6m, 4m, 5.5m, 7m, 2.5m, 0] - * TotalSupply: 25m - */ - await assertRedeemCalc( - simpleToExactAmount(500000, 18), - [ - setBasset(50, 6000000), - setBasset(50, 4000000), - setBasset(50, 5500000), - setBasset(50, 7000000), - setBasset(50, 2500000), - setBasset(50, 0), - ], - setCalcResult( - true, - "", - [ - simpleToExactAmount("1.2", 23), - simpleToExactAmount("0.8", 23), - simpleToExactAmount("1.1", 23), - simpleToExactAmount("1.4", 23), - simpleToExactAmount("5", 22), - 0, - ], - true, - ), - ); - }); - }); - context("in a basket with some affected bAssets", async () => { - context("where some bAssets are liquidating", async () => { - it("fails", async () => { - await assertRedeemCalc( - simpleToExactAmount(10, 18), - [ - setBasset(50, 25, 6, BassetStatus.Liquidating), - setBasset(50, 25), - setBasset(50, 25), - setBasset(50, 25), - ], - setCalcResult(false, "Basket contains liquidating bAsset"), - ); - }); - }); - context("where some bAsset is blacklisted", async () => { - it("fails", async () => { - await assertRedeemCalc( - simpleToExactAmount(10, 18), - [ - setBasset(50, 25), - setBasset(50, 25), - setBasset(50, 25, 6, BassetStatus.Blacklisted), - setBasset(50, 25), - ], - setCalcResult(false, "Basket contains blacklisted bAsset"), - ); - }); - }); - context("where some bAsset has another status", async () => { - it("returns proportional amounts", async () => { - await assertRedeemCalc( - simpleToExactAmount(10, 18), - [ - setBasset(50, 25), - setBasset(50, 25), - setBasset(50, 25, 6, BassetStatus.BrokenAbovePeg), - setBasset(50, 25), - ], - setCalcResult(true, "", [2.5, 2.5, 2.5, 2.5]), - ); - await assertRedeemCalc( - simpleToExactAmount(10, 18), - [ - setBasset(50, 25), - setBasset(50, 25, 12, BassetStatus.BrokenAbovePeg), - setBasset(50, 25), - setBasset(50, 25), - ], - setCalcResult(true, "", [2.5, 2.5, 2.5, 2.5]), - ); - await assertRedeemCalc( - simpleToExactAmount(10, 18), - [ - setBasset(50, 25), - setBasset(50, 25, 12, BassetStatus.Liquidated), - setBasset(50, 25), - setBasset(50, 25), - ], - setCalcResult(true, "", [2.5, 2.5, 2.5, 2.5]), - ); - }); - }); - }); - }); -}); diff --git a/test/masset/forge-validator/TestForgeValidatorS.spec.ts b/test/masset/forge-validator/TestForgeValidatorS.spec.ts deleted file mode 100644 index 796a6469..00000000 --- a/test/masset/forge-validator/TestForgeValidatorS.spec.ts +++ /dev/null @@ -1,545 +0,0 @@ -import { simpleToExactAmount } from "@utils/math"; -import { createBasset, BassetStatus } from "@utils/mstable-objects"; -import envSetup from "@utils/env_setup"; -import * as t from "types/generated"; -import { ratioScale } from "@utils/constants"; -import { BN } from "@utils/tools"; - -const { expect } = envSetup.configure(); - -const ForgeValidatorArtifact = artifacts.require("ForgeValidator"); - -interface BasketDeets { - totalSupply: number | string; -} -const setBasket = (totalSupply: number | string): BasketDeets => { - return { - totalSupply, - }; -}; -interface BassetDeets { - maxWeight: number | string; - vaultUnits: number | string; - decimals: number; - status: BassetStatus; -} -const setBasset = ( - maxWeight: number | string, - vaultUnits: number | string, - decimals = 18, - status: BassetStatus = BassetStatus.Normal, -): BassetDeets => { - return { - maxWeight, - vaultUnits, - decimals, - status, - }; -}; -interface Result { - expectedValidity: boolean; - expectedReason: string; - applySwapFee: boolean; -} -const setResult = ( - expectedValidity: boolean, - expectedReason = "", - applySwapFee = expectedValidity, -): Result => { - return { - expectedValidity, - expectedReason, - applySwapFee, - }; -}; - -contract("ForgeValidator", async (accounts) => { - let forgeValidator: t.ForgeValidatorInstance; - - before("Init contract", async () => { - forgeValidator = await ForgeValidatorArtifact.new(); - }); - - context("validating a swap", async () => { - const assertSwap = async ( - basket: BasketDeets, - input: BassetDeets, - output: BassetDeets, - quantity: number | string, - result: Result, - sender: string = accounts[0], - ): Promise => { - const inputBasset = createBasset( - input.maxWeight, - input.vaultUnits, - input.decimals, - input.status, - ); - const outputBasset = createBasset( - output.maxWeight, - output.vaultUnits, - output.decimals, - output.status, - ); - const scaledQuantity = simpleToExactAmount(quantity, input.decimals); - const [ - isValid, - reason, - swapOutput, - applyFee, - ] = await forgeValidator.validateSwap( - simpleToExactAmount(basket.totalSupply, 18), - inputBasset, - outputBasset, - scaledQuantity, - { from: sender }, - ); - expect(result.expectedValidity).to.eq(isValid); - expect(result.expectedReason).to.eq(reason); - expect(result.applySwapFee).to.eq(applyFee); - if (result.expectedValidity === true && new BN(quantity).gt(new BN(0))) { - const scaledBasset = scaledQuantity.mul(new BN(inputBasset.ratio)).div(ratioScale); - const outputExact = scaledBasset.mul(ratioScale).div(new BN(outputBasset.ratio)); - expect(outputExact).bignumber.eq(swapOutput); - } else { - expect(new BN(0)).bignumber.eq(swapOutput); - } - }; - - context("with an input basset under its max weight", async () => { - it("returns valid for a simple validation that remains within the max weight", async () => { - /** - * TotalSupply: 100e18 - * Input: [m: 25, v: 24] - * Output: [m: 25, v: 25] - * Quantity: [1] - * New weighting now 25/101 - */ - await assertSwap( - setBasket(100), - setBasset(25, 24), - setBasset(25, 25), - 1, - setResult(true), - ); - }); - it("should work for any sender", async () => { - await assertSwap( - setBasket(100), - setBasset(25, 24), - setBasset(25, 25), - 1, - setResult(true), - accounts[1], - ); - await assertSwap( - setBasket(100), - setBasset(25, 24), - setBasset(25, 25), - 1, - setResult(true), - accounts[2], - ); - }); - it("returns inValid if mint pushes bAsset overweight", async () => { - /** - * TotalSupply: 100e18 - * Input: [m: 25, v: 24] - * Output: [m: 25, v: 25] - * Quantity: [1] - * New weighting now 26/102 - */ - await assertSwap( - setBasket(100), - setBasset(25, 24), - setBasset(25, 25), - 2, - setResult(false, "Input must remain below max weighting"), - ); - }); - describe("with large basket supply", async () => { - it("should succeed with sufficient max weight", async () => { - /** - * TotalSupply: 1e25 - * Input: [m: 2.65, v: 250k] - * Output: [m: 10, v: 1m] - * Quantity: [10000] - * New weighting now 260k/10,010k - */ - await assertSwap( - setBasket(10000000), - setBasset("2.65", 250000, 12), - setBasset(10, 1000000, 16), - 10000, - setResult(true), - ); - }); - it("should fail if we exceed the max weight", async () => { - /** - * TotalSupply: 1e25 - * Input: [m: 2.55, v: 250k] - * Output: [m: 10, v: 1m] - * Quantity: [10000] - * New weighting now 260k/10,010k - */ - await assertSwap( - setBasket(10000000), - setBasset("2.55", 250000, 12), - setBasset(10, 1000000, 16), - 10000, - setResult(false, "Input must remain below max weighting"), - ); - }); - }); - describe("with a variable max weight", async () => { - it("should succeed with sufficient allowance", async () => { - /** - * TotalSupply: 1000e18 - * Input: [m: X, v: 150] - * Output: [m: 25, v: 200] - * Quantity: [100] - */ - let x = 25; - await assertSwap( - setBasket(1000), - setBasset(x, 150), - setBasset(25, 200), - 100, - setResult(true), - ); - x = 23; - await assertSwap( - setBasket(1000), - setBasset(x, 150), - setBasset(25, 200), - 100, - setResult(false, "Input must remain below max weighting"), - ); - }); - it("should always fail with 0 max weight", async () => { - /** - * TotalSupply: 100 - * Input: [m: 0, v: X] - * Output: [m: 25, v: 200] - * Quantity: [1] - */ - let x = 0; - await assertSwap( - setBasket(100), - setBasset(0, x), - setBasset(25, 200), - 1, - setResult(false, "Input must remain below max weighting"), - ); - x = 5; - await assertSwap( - setBasket(100), - setBasset(0, x), - setBasset(25, 200), - 1, - setResult(false, "Input must remain below max weighting"), - ); - }); - }); - describe("and various decimals", async () => { - it("returns valid with custom ratio", async () => { - /** - * TotalSupply: 100 - * Input: [m: 30, v: 25, d: 6] - * Output: [m: 25, v: 20] - * Quantity: [1] - */ - await assertSwap( - setBasket(100), - setBasset(30, 25, 6), - setBasset(25, 20, 14), - 1, - setResult(true), - ); - }); - }); - describe("and various mint volumes", async () => { - // should be ok with 0 - it("should be ok with 0 at all times", async () => { - /** - * TotalSupply: 100 - * Input: [m: 30, v: 25, d: 6] - * Output: [m: 25, v: 20] - * Quantity: [0] - */ - await assertSwap( - setBasket(100), - setBasset(30, 25, 6), - setBasset(30, 25), - 0, - setResult(true), - ); - await assertSwap( - setBasket(100), - setBasset(10, 9, 6), - setBasset(40, 4), - 0, - setResult(true), - ); - await assertSwap( - setBasket(100), - setBasset(30, 25), - setBasset(20, 20), - 0, - setResult(true), - ); - }); - it("should fail once mint volume triggers max weight", async () => { - /** - * TotalSupply: 100 - * Input: [m: 30, v: 25] - * Output: [m: 25, v: 20] - * Quantity: [13] - */ - await assertSwap( - setBasket(100), - setBasset(30, 25), - setBasset(25, 20), - 5, - setResult(true), - ); - await assertSwap( - setBasket(100), - setBasset(30, 25), - setBasset(25, 20), - 6, - setResult(false, "Input must remain below max weighting"), - ); - }); - }); - }); - context("with a basket with low liquidity", async () => { - describe("swapping out more than is in the basket", async () => { - it("should throw if there is nothing to redeem", async () => { - /** - * TotalSupply: 100 - * Input: [m: 30, v: 25] - * Output: [m: 25, v: 0] - * Quantity: [1] - */ - await assertSwap( - setBasket(100), - setBasset(30, 25), - setBasset(25, 0), - 1, - setResult(false, "Not enough liquidity"), - ); - }); - it("should throw if there is not enough to redeem", async () => { - /** - * TotalSupply: 100 - * Input: [m: 30, v: 25] - * Output: [m: 25, v: 9] - * Quantity: [10] - */ - await assertSwap( - setBasket(100), - setBasset(30, 25), - setBasset(25, 9), - 10, - setResult(false, "Not enough liquidity"), - ); - }); - }); - }); - context("in a basket with overweight bAssets", async () => { - describe("with an input basset overweight", async () => { - it("should always fail", async () => { - /** - * TotalSupply: 100 - * Input: [m: 50, v: 51] - * Output: [m: 50, v: 30] - * Quantity: [1] - */ - await assertSwap( - setBasket(100), - setBasset(50, 51), - setBasset(50, 30), - 1, - setResult(false, "Input must remain below max weighting"), - ); - }); - it("returns invalid with a 0 quantity input", async () => { - /** - * TotalSupply: 100 - * Input: [m: 50, v: 51] - * Output: [m: 50, v: 30] - * Quantity: [1] - */ - await assertSwap( - setBasket(100), - setBasset(50, 51), - setBasset(50, 30), - 0, - setResult(false, "Input must remain below max weighting"), - ); - }); - it("always returns invalid until weight is increased", async () => { - /** - * TotalSupply: 1m - * Input: [m: X, v: 120k] - * Output: [m: 40, v: 300k] - * Quantity: [1] - */ - let x = 10; - await assertSwap( - setBasket(1000000), - setBasset(x, 120000), - setBasset(40, 300000), - 1, - setResult(false, "Input must remain below max weighting"), - ); - x = 12; - await assertSwap( - setBasket(1000000), - setBasset(x, 120000), - setBasset(40, 300000), - 1, - setResult(false, "Input must remain below max weighting"), - ); - x = 13; - await assertSwap( - setBasket(1000000), - setBasset(x, 120000), - setBasset(40, 300000), - 1, - setResult(true), - ); - }); - }); - describe("with an output basset overweight", async () => { - it("should not charge a swap fee", async () => { - /** - * TotalSupply: 100 - * Input: [m: 30, v: 10] - * Output: [m: 50, v: 51] - * Quantity: [X] - */ - let x = 1; - await assertSwap( - setBasket(100), - setBasset(30, 10, 6), - setBasset(50, 51, 18), - x, - setResult(true, "", false), - ); - x = 10; - await assertSwap( - setBasket(100), - setBasset(30, 10, 6), - setBasset(50, 51, 18), - x, - setResult(true, "", false), - ); - }); - it("should allow redemption to 0", async () => { - /** - * TotalSupply: 200k - * Input: [m: 75, v: 50k] - * Output: [m: 10, v: 100k] - * Quantity: [X] - */ - let x = 50000; - await assertSwap( - setBasket(200000), - setBasset(75, 50000, 6), - setBasset(10, 100000, 18), - x, - setResult(true, "", false), - ); - x = 100000; - await assertSwap( - setBasket(200000), - setBasset(75, 50000, 6), - setBasset(10, 100000, 18), - x, - setResult(true, "", false), - ); - x = 100001; - await assertSwap( - setBasket(200000), - setBasset(75, 50000, 6), - setBasset(10, 100000, 18), - x, - setResult(false, "Not enough liquidity"), - ); - }); - it("should throw if input bAsset ends up overweight", async () => { - /** - * TotalSupply: 200k - * Input: [m: 30, v: 50k] - * Output: [m: 10, v: 100k] - * Quantity: [x] - */ - let x = 10000; - await assertSwap( - setBasket(200000), - setBasset(30, 50000), - setBasset(10, 100000, 12), - x, - setResult(true, "", false), - ); - x = 10001; - await assertSwap( - setBasket(200000), - setBasset(30, 50000), - setBasset(10, 100000, 12), - x, - setResult(false, "Input must remain below max weighting"), - ); - }); - }); - }); - // Affected bAssets have been excluded from the basket temporarily or permanently due to circumstance - context("with an affected bAsset", async () => { - it("returns inValid for a simple validation", async () => { - /** - * TotalSupply: 100 - * Input: [m: 25, v: 20] - * Output: [m: 40, v: 30] - * Quantity: [5] - */ - await assertSwap( - setBasket(100), - setBasset(25, 20, 18, BassetStatus.BrokenBelowPeg), - setBasset(40, 30, 18, BassetStatus.Normal), - 5, - setResult(false, "bAsset not allowed in swap"), - ); - await assertSwap( - setBasket(100), - setBasset(25, 20, 18, BassetStatus.Normal), - setBasset(40, 30, 18, BassetStatus.Blacklisted), - 5, - setResult(false, "bAsset not allowed in swap"), - ); - await assertSwap( - setBasket(100), - setBasset(25, 20, 18, BassetStatus.Normal), - setBasset(40, 30, 18, BassetStatus.Default), - 5, - setResult(false, "bAsset not allowed in swap"), - ); - await assertSwap( - setBasket(100), - setBasset(25, 20, 18, BassetStatus.Liquidated), - setBasset(40, 30, 18, BassetStatus.Normal), - 5, - setResult(false, "bAsset not allowed in swap"), - ); - await assertSwap( - setBasket(100), - setBasset(25, 20, 18, BassetStatus.Normal), - setBasset(40, 30, 18, BassetStatus.Normal), - 5, - setResult(true), - ); - }); - }); - }); -}); diff --git a/test/masset/liquidator/TestLiquidatorContract.spec.ts b/test/masset/liquidator/TestLiquidatorContract.spec.ts deleted file mode 100644 index 6c661444..00000000 --- a/test/masset/liquidator/TestLiquidatorContract.spec.ts +++ /dev/null @@ -1,505 +0,0 @@ -import { expectEvent, expectRevert, time } from "@openzeppelin/test-helpers"; -import { StandardAccounts } from "@utils/machines"; -import { simpleToExactAmount } from "@utils/math"; -import { BN } from "@utils/tools"; -import envSetup from "@utils/env_setup"; -import { ZERO_ADDRESS, ONE_WEEK, ONE_DAY } from "@utils/constants"; -import * as t from "types/generated"; - -import shouldBehaveLikeModule from "../../shared/behaviours/Module.behaviour"; - -const MockTrigger = artifacts.require("MockTrigger"); -const Liquidator = artifacts.require("Liquidator"); -const MockCompoundIntegration = artifacts.require("MockCompoundIntegration1"); -const SavingsManager = artifacts.require("SavingsManager"); -const SavingsContract = artifacts.require("SavingsContract"); -const MockERC20 = artifacts.require("MockERC20"); -const MockMasset = artifacts.require("MockMasset"); -const MockNexus = artifacts.require("MockNexus"); -const MockCurve = artifacts.require("MockCurveMetaPool"); -const MockUniswap = artifacts.require("MockUniswap"); -const MockProxy = artifacts.require("MockProxy"); - -const { expect } = envSetup.configure(); - -contract("Liquidator", async (accounts) => { - const sa = new StandardAccounts(accounts); - const ctx: { module?: t.ModuleInstance } = {}; - - let nexus: t.MockNexusInstance; - let liquidator: t.LiquidatorInstance; - let bAsset: t.MockERC20Instance; - let bAsset2: t.MockERC20Instance; - let mUSD: t.MockMassetInstance; - let compIntegration: t.MockCompoundIntegration1Instance; - let compToken: t.MockERC20Instance; - let savings: t.SavingsManagerInstance; - let uniswap: t.MockUniswapInstance; - let curve: t.MockCurveMetaPoolInstance; - - interface Liquidation { - sellToken: string; - bAsset: string; - curvePosition: BN; - uniswapPath?: string[]; - lastTriggered: BN; - sellTranche: BN; - minReturn: BN; - } - - interface Balance { - integration: BN; - liquidator: BN; - } - - interface Data { - sellTokenBalance: Balance; - savingsManagerBal: BN; - liquidation: Liquidation; - } - - // Real deployment steps: - // - Deploy Liquidator & add Liquidation - // - Add to modules - // - Upgrade COMP - const redeployLiquidator = async () => { - // Fake mUSD & uniswap - mUSD = await MockMasset.new("mStable USD", "mUSD", 18, sa.fundManager, 100000000); - uniswap = await MockUniswap.new(); - - // Set up Comp Integration - compIntegration = await MockCompoundIntegration.new(); - bAsset = await MockERC20.new("Mock1", "MK1", 18, sa.fundManager, 100000000); - await bAsset.transfer(uniswap.address, simpleToExactAmount(100000, 18), { - from: sa.fundManager, - }); - bAsset2 = await MockERC20.new("Mock2", "MK2", 18, sa.fundManager, 100000000); - await bAsset2.transfer(uniswap.address, simpleToExactAmount(100000, 18), { - from: sa.fundManager, - }); - await compIntegration.initialize( - nexus.address, - [sa.fundManager], - ZERO_ADDRESS, - [bAsset.address, bAsset2.address], - [sa.other, sa.other], - ); - - // Set up Curve - curve = await MockCurve.new([mUSD.address, bAsset.address, bAsset2.address], mUSD.address); - await mUSD.transfer(curve.address, simpleToExactAmount(100000, 18), { - from: sa.fundManager, - }); - - // Create COMP token and assign, then approve the liquidator - compToken = await MockERC20.new("Compound Gov", "COMP", 18, sa.fundManager, 100000000); - await compIntegration.setRewardToken(compToken.address); - await compToken.transfer(compIntegration.address, simpleToExactAmount(10, 18), { - from: sa.fundManager, - }); - - // Add the module - // Liquidator - const proxy = await MockProxy.new(); - const impl = await Liquidator.new(); - - const data: string = impl.contract.methods - .initialize(nexus.address, uniswap.address, curve.address, mUSD.address) - .encodeABI(); - await proxy.methods["initialize(address,address,bytes)"](impl.address, sa.other, data); - liquidator = await Liquidator.at(proxy.address); - - const save = await SavingsContract.new(nexus.address, mUSD.address); - savings = await SavingsManager.new(nexus.address, mUSD.address, save.address, { - from: sa.default, - }); - await nexus.setSavingsManager(savings.address); - await nexus.setLiquidator(liquidator.address); - }; - - before(async () => { - nexus = await MockNexus.new(sa.governor, sa.governor, sa.dummy1); - - await redeployLiquidator(); - ctx.module = (liquidator as any) as t.ModuleInstance; - }); - - describe("verifying initialization", async () => { - shouldBehaveLikeModule(ctx as Required, sa); - - it("should properly store valid arguments", async () => { - expect(await liquidator.nexus()).eq(nexus.address); - expect(await liquidator.uniswap()).eq(uniswap.address); - expect(await liquidator.curve()).eq(curve.address); - expect(await liquidator.mUSD()).eq(mUSD.address); - }); - }); - - const getLiquidation = async (addr: string): Promise => { - const liquidation = await liquidator.liquidations(addr); - const minReturn = await liquidator.minReturn(addr); - return { - sellToken: liquidation[0], - bAsset: liquidation[1], - curvePosition: liquidation[2], - lastTriggered: liquidation[3], - sellTranche: liquidation[4], - minReturn, - }; - }; - const snapshotData = async (): Promise => { - const liquidation = await getLiquidation(liquidator.address); - const sellBalIntegration = await compToken.balanceOf(compIntegration.address); - const sellBalLiquidator = await compToken.balanceOf(liquidator.address); - const savingsManagerBal = await mUSD.balanceOf(savings.address); - return { - sellTokenBalance: { - integration: sellBalIntegration, - liquidator: sellBalLiquidator, - }, - savingsManagerBal, - liquidation, - }; - }; - - context("performing basic system flow", async () => { - describe("creating a new liquidation", () => { - it("should set up all args", async () => { - await liquidator.createLiquidation( - compIntegration.address, - compToken.address, - bAsset.address, - 1, - [compToken.address, ZERO_ADDRESS, bAsset.address], - simpleToExactAmount(1000, 18), - simpleToExactAmount(70, 18), - { from: sa.governor }, - ); - const liquidation = await getLiquidation(compIntegration.address); - expect(liquidation.sellToken).eq(compToken.address); - expect(liquidation.bAsset).eq(bAsset.address); - expect(liquidation.curvePosition).bignumber.eq(new BN(1)); - expect(liquidation.lastTriggered).bignumber.eq(new BN(0)); - expect(liquidation.sellTranche).bignumber.eq(simpleToExactAmount(1000, 18)); - expect(liquidation.minReturn).bignumber.eq(simpleToExactAmount(70, 18)); - }); - }); - describe("triggering a liquidation", () => { - it("should sell COMP for bAsset and deposit to SavingsManager", async () => { - const before = await snapshotData(); - await compIntegration.approveRewardToken({ from: sa.governor }); - await liquidator.triggerLiquidation(compIntegration.address); - const after = await snapshotData(); - expect(after.savingsManagerBal).bignumber.gt(before.savingsManagerBal as any); - }); - }); - }); - context("calling constructor", () => { - it("should fail if any inputs are null", async () => { - const lq = await Liquidator.new(); - await expectRevert( - lq.initialize(ZERO_ADDRESS, uniswap.address, curve.address, mUSD.address), - "Nexus address is zero", - ); - await expectRevert( - lq.initialize(nexus.address, ZERO_ADDRESS, curve.address, mUSD.address), - "Invalid uniswap address", - ); - await expectRevert( - lq.initialize(nexus.address, uniswap.address, ZERO_ADDRESS, mUSD.address), - "Invalid curve address", - ); - await expectRevert( - lq.initialize(nexus.address, uniswap.address, curve.address, ZERO_ADDRESS), - "Invalid mUSD address", - ); - }); - }); - context("creating a new liquidation", () => { - before(async () => { - await redeployLiquidator(); - }); - it("should fail if any inputs are null", async () => { - await expectRevert( - liquidator.createLiquidation( - ZERO_ADDRESS, - compToken.address, - bAsset.address, - 1, - [compToken.address, ZERO_ADDRESS, bAsset.address], - simpleToExactAmount(1, 18), - simpleToExactAmount(70, 18), - { from: sa.governor }, - ), - "Invalid inputs", - ); - }); - it("should fail if uniswap path is invalid", async () => { - await expectRevert( - liquidator.createLiquidation( - compIntegration.address, - compToken.address, - bAsset.address, - 1, - [compToken.address, ZERO_ADDRESS, bAsset2.address], - simpleToExactAmount(1, 18), - simpleToExactAmount(70, 18), - { from: sa.governor }, - ), - "Invalid uniswap path", - ); - - await expectRevert( - liquidator.createLiquidation( - compIntegration.address, - compToken.address, - bAsset.address, - 1, - [compToken.address, ZERO_ADDRESS], - simpleToExactAmount(1, 18), - simpleToExactAmount(70, 18), - { from: sa.governor }, - ), - "Invalid uniswap path", - ); - }); - it("should fail if liquidation already exists", async () => { - await liquidator.createLiquidation( - compIntegration.address, - compToken.address, - bAsset.address, - 1, - [compToken.address, ZERO_ADDRESS, bAsset.address], - simpleToExactAmount(1000, 18), - simpleToExactAmount(70, 18), - { from: sa.governor }, - ); - const liquidation = await getLiquidation(compIntegration.address); - expect(liquidation.sellToken).eq(compToken.address); - expect(liquidation.bAsset).eq(bAsset.address); - expect(liquidation.curvePosition).bignumber.eq(new BN(1)); - expect(liquidation.lastTriggered).bignumber.eq(new BN(0)); - expect(liquidation.sellTranche).bignumber.eq(simpleToExactAmount(1000, 18)); - expect(liquidation.minReturn).bignumber.eq(simpleToExactAmount(70, 18)); - await expectRevert( - liquidator.createLiquidation( - compIntegration.address, - compToken.address, - bAsset.address, - 1, - [compToken.address, ZERO_ADDRESS, bAsset.address], - simpleToExactAmount(1000, 18), - simpleToExactAmount(70, 18), - { from: sa.governor }, - ), - "Liquidation exists for this bAsset", - ); - }); - }); - context("updating an existing liquidation", () => { - beforeEach(async () => { - await redeployLiquidator(); - await liquidator.createLiquidation( - compIntegration.address, - compToken.address, - bAsset.address, - 1, - [compToken.address, ZERO_ADDRESS, bAsset.address], - simpleToExactAmount(1000, 18), - simpleToExactAmount(70, 18), - { from: sa.governor }, - ); - }); - describe("changing the bAsset", () => { - it("should fail if liquidation does not exist", async () => { - await expectRevert( - liquidator.updateBasset( - sa.dummy2, - bAsset.address, - 1, - [], - simpleToExactAmount(1, 18), - simpleToExactAmount(70, 18), - { - from: sa.governor, - }, - ), - "Liquidation does not exist", - ); - }); - it("should fail if bAsset is null", async () => { - await expectRevert( - liquidator.updateBasset( - compIntegration.address, - ZERO_ADDRESS, - 1, - [], - simpleToExactAmount(1, 18), - simpleToExactAmount(70, 18), - { - from: sa.governor, - }, - ), - "Invalid bAsset", - ); - }); - it("should fail if uniswap path is invalid", async () => { - await expectRevert( - liquidator.updateBasset( - compIntegration.address, - bAsset.address, - 1, - [bAsset2.address], - simpleToExactAmount(1, 18), - simpleToExactAmount(70, 18), - { - from: sa.governor, - }, - ), - "Invalid uniswap path", - ); - }); - it("should update the bAsset successfully", async () => { - // update uniswap path, bAsset, tranch amount - const tx = await liquidator.updateBasset( - compIntegration.address, - bAsset2.address, - 2, - [compToken.address, ZERO_ADDRESS, bAsset2.address], - simpleToExactAmount(123, 18), - simpleToExactAmount(70, 18), - { from: sa.governor }, - ); - expectEvent(tx.receipt, "LiquidationModified", { - integration: compIntegration.address, - }); - const liquidation = await getLiquidation(compIntegration.address); - expect(liquidation.sellToken).eq(compToken.address); - expect(liquidation.bAsset).eq(bAsset2.address); - expect(liquidation.curvePosition).bignumber.eq(new BN(2)); - expect(liquidation.sellTranche).bignumber.eq(simpleToExactAmount(123, 18)); - }); - }); - describe("removing the liquidation altogether", () => { - it("should fail if liquidation doesn't exist", async () => { - await expectRevert( - liquidator.deleteLiquidation(sa.dummy2, { - from: sa.governor, - }), - "Liquidation does not exist", - ); - }); - it("should delete the liquidation", async () => { - // update uniswap path, bAsset, tranch amount - const tx = await liquidator.deleteLiquidation(compIntegration.address, { - from: sa.governor, - }); - expectEvent(tx.receipt, "LiquidationEnded", { - integration: compIntegration.address, - }); - const oldLiq = await getLiquidation(compIntegration.address); - expect(oldLiq.bAsset).eq("0x0000000000000000000000000000000000000000"); - expect(oldLiq.curvePosition).bignumber.eq(new BN(0)); - }); - }); - }); - context("triggering a liquidation", () => { - beforeEach(async () => { - await redeployLiquidator(); - await liquidator.createLiquidation( - compIntegration.address, - compToken.address, - bAsset.address, - 1, - [compToken.address, ZERO_ADDRESS, bAsset.address], - simpleToExactAmount(1000, 18), - simpleToExactAmount(70, 18), - { from: sa.governor }, - ); - await compIntegration.approveRewardToken({ from: sa.governor }); - }); - it("should fail if called via contract", async () => { - const mock = await MockTrigger.new(); - await expectRevert( - mock.trigger(liquidator.address, compIntegration.address), - "Must be EOA", - ); - }); - it("should fail if liquidation does not exist", async () => { - await expectRevert( - liquidator.triggerLiquidation(sa.dummy2), - "Liquidation does not exist", - ); - }); - it("should fail if Uniswap price is below the floor", async () => { - await uniswap.setRatio(69); - await expectRevert( - liquidator.triggerLiquidation(compIntegration.address), - "UNI: Output amount not enough", - ); - await uniswap.setRatio(71); - await liquidator.triggerLiquidation(compIntegration.address); - }); - - it("should fail if Curve price is below the floor", async () => { - await curve.setRatio(simpleToExactAmount(9, 17)); - await expectRevert( - liquidator.triggerLiquidation(compIntegration.address), - "CRV: Output amount not enough", - ); - await curve.setRatio(simpleToExactAmount(96, 16)); - await liquidator.triggerLiquidation(compIntegration.address); - }); - it("should sell everything if the liquidator has less balance than tranche size", async () => { - const s0 = await snapshotData(); - await liquidator.updateBasset( - compIntegration.address, - bAsset.address, - 1, - [compToken.address, ZERO_ADDRESS, bAsset.address], - simpleToExactAmount(1, 30), - simpleToExactAmount(70, 18), - { from: sa.governor }, - ); - // set tranche size to 1e30 - await liquidator.triggerLiquidation(compIntegration.address); - - const s1 = await snapshotData(); - // 10 COMP liquidated for > 1000 mUSD - expect(s1.savingsManagerBal.sub(s0.savingsManagerBal)).bignumber.gt( - simpleToExactAmount(1000, 18), - ); - - await time.increase(ONE_WEEK.addn(1)); - await expectRevert( - liquidator.triggerLiquidation(compIntegration.address), - "No sell tokens to liquidate", - ); - }); - it("should pause liquidations if set to 0", async () => { - await liquidator.updateBasset( - compIntegration.address, - bAsset.address, - 1, - [compToken.address, ZERO_ADDRESS, bAsset.address], - new BN(0), - simpleToExactAmount(70, 18), - { from: sa.governor }, - ); - await expectRevert( - liquidator.triggerLiquidation(compIntegration.address), - "Liquidation has been paused", - ); - }); - it("should fail if called within 7 days of the previous", async () => { - await liquidator.triggerLiquidation(compIntegration.address); - await time.increase(ONE_DAY.muln(5)); - await expectRevert( - liquidator.triggerLiquidation(compIntegration.address), - "Must wait for interval", - ); - await time.increase(ONE_DAY.muln(3)); - await liquidator.triggerLiquidation(compIntegration.address); - }); - }); -}); diff --git a/test/masset/mint.spec.ts b/test/masset/mint.spec.ts new file mode 100644 index 00000000..8a103d4a --- /dev/null +++ b/test/masset/mint.spec.ts @@ -0,0 +1,797 @@ +/* eslint-disable no-await-in-loop */ + +import { expect } from "chai" +import { Signer } from "ethers" +import { ethers } from "hardhat" + +import { assertBasketIsHealthy, assertBNSlightlyGTPercent } from "@utils/assertions" +import { applyRatio, BN, simpleToExactAmount } from "@utils/math" +import { Account, MassetDetails, MassetMachine, StandardAccounts } from "@utils/machines" +import { BassetStatus } from "@utils/mstable-objects" +import { ZERO_ADDRESS } from "@utils/constants" +import { Masset, MockERC20 } from "types/generated" + +interface MintOutput { + mAssets: BN + senderBassetBalBefore: BN + senderBassetBalAfter: BN + recipientBalBefore: BN + recipientBalAfter: BN +} + +describe("Masset - Mint", () => { + let sa: StandardAccounts + let mAssetMachine: MassetMachine + + let details: MassetDetails + + const runSetup = async (seedBasket = true, useTransferFees = false, useLendingMarkets = false): Promise => { + details = await mAssetMachine.deployMasset(true, useLendingMarkets, useTransferFees) + if (seedBasket) { + await mAssetMachine.seedWithWeightings(details, [25, 25, 25, 25]) + } + } + + before("Init contract", async () => { + const accounts = await ethers.getSigners() + mAssetMachine = await new MassetMachine().initAccounts(accounts) + sa = mAssetMachine.sa + + await runSetup() + }) + + const assertFailedMint = async ( + expectedReason: string, + mAssetContract: Masset, + bAsset: MockERC20, + bAssetQuantity: BN | number | string, + minMassetQuantity: BN | number | string = 0, + approval = true, + sender: Signer = sa.default.signer, + recipient: string = sa.default.address, + mintOutputRevertExpected = true, + mintOutputExpected: BN | number | string = 0, + quantitiesAreExact = false, + ): Promise => { + const mAsset = mAssetContract.connect(sender) + if (approval) { + await mAssetMachine.approveMasset(bAsset, mAsset, bAssetQuantity, sender, quantitiesAreExact) + } + + const bAssetDecimals = await bAsset.decimals() + const bAssetQuantityExact = quantitiesAreExact ? BN.from(bAssetQuantity) : simpleToExactAmount(bAssetQuantity, bAssetDecimals) + const minMassetQuantityExact = quantitiesAreExact ? BN.from(minMassetQuantity) : simpleToExactAmount(minMassetQuantity, 18) + + await expect( + mAsset.mint(bAsset.address, bAssetQuantityExact, minMassetQuantityExact, recipient), + `mint tx should revert with "${expectedReason}"`, + ).to.be.revertedWith(expectedReason) + + if (mintOutputRevertExpected) { + await expect( + mAsset.getMintOutput(bAsset.address, bAssetQuantityExact), + `getMintOutput call should revert with "${expectedReason}"`, + ).to.be.revertedWith(expectedReason) + } else { + const mintOutputExpectedExact = quantitiesAreExact ? BN.from(mintOutputExpected) : simpleToExactAmount(mintOutputExpected, 18) + const output = await mAsset.getMintOutput(bAsset.address, bAssetQuantityExact) + expect(output, "getMintOutput call output").eq(mintOutputExpectedExact) + } + } + + const assertFailedMintMulti = async ( + expectedReason: string, + mAssetContract: Masset, + bAssets: (MockERC20 | string)[], + bAssetRedeemQuantities: (BN | number | string)[], + minMassetQuantity: BN | number | string = 0, + approval = true, + sender: Signer = sa.default.signer, + recipient: string = sa.default.address, + mintMultiOutputRevertExpected = true, + outputExpected: BN | number | string = 0, + quantitiesAreExact = false, + ): Promise => { + const mAsset = mAssetContract.connect(sender) + if (approval) { + const approvePromises = bAssets.map((b, i) => + typeof b === "string" + ? Promise.resolve(BN.from(0)) + : mAssetMachine.approveMasset(b, mAsset, bAssetRedeemQuantities[i], sender, quantitiesAreExact), + ) + await Promise.all(approvePromises) + } + + const bAssetAddresses = bAssets.map((bAsset) => (typeof bAsset === "string" ? bAsset : bAsset.address)) + const bAssetsDecimals = await Promise.all( + bAssets.map((bAsset) => (typeof bAsset === "string" ? Promise.resolve(18) : bAsset.decimals())), + ) + + // Convert to exact quantities + const bAssetRedeemQuantitiesExact = quantitiesAreExact + ? bAssetRedeemQuantities.map((q) => BN.from(q)) + : bAssetRedeemQuantities.map((q, i) => simpleToExactAmount(q, bAssetsDecimals[i])) + const minMassetQuantityExact = quantitiesAreExact ? BN.from(minMassetQuantity) : simpleToExactAmount(minMassetQuantity, 18) + + await expect( + mAsset.mintMulti(bAssetAddresses, bAssetRedeemQuantitiesExact, minMassetQuantityExact, recipient), + `mintMulti tx should revert with "${expectedReason}"`, + ).to.be.revertedWith(expectedReason) + + if (mintMultiOutputRevertExpected) { + await expect( + mAsset.getMintMultiOutput(bAssetAddresses, bAssetRedeemQuantitiesExact), + `getMintMultiOutput call should revert with "${expectedReason}"`, + ).to.be.revertedWith(expectedReason) + } else { + const outputExpectedExact = quantitiesAreExact ? BN.from(outputExpected) : simpleToExactAmount(outputExpected, 18) + const output = await mAsset.getMintMultiOutput(bAssetAddresses, bAssetRedeemQuantitiesExact) + expect(output, "getMintMultiOutput call output").eq(outputExpectedExact) + } + } + + // Helper to assert basic minting conditions, i.e. balance before and after + const assertBasicMint = async ( + md: MassetDetails, + bAsset: MockERC20, + bAssetQuantity: BN | number | string, + minMassetQuantity: BN | number | string = 0, + recipient: string = sa.default.address, + sender: Account = sa.default, + ignoreHealthAssertions = true, + quantitiesAreExact = false, + ): Promise => { + const { platform } = md + const mAsset = md.mAsset.connect(sender.signer) + if (!ignoreHealthAssertions) await assertBasketIsHealthy(mAssetMachine, md) + + // Get before balances + const senderBassetBalBefore = await bAsset.balanceOf(sender.address) + const recipientBalBefore = await mAsset.balanceOf(recipient) + const bAssetBefore = await mAssetMachine.getBasset(details, bAsset.address) + + // Convert to exact quantities + const bAssetQuantityExact = quantitiesAreExact + ? BN.from(bAssetQuantity) + : simpleToExactAmount(bAssetQuantity, await bAsset.decimals()) + const minMassetQuantityExact = quantitiesAreExact ? BN.from(minMassetQuantity) : simpleToExactAmount(minMassetQuantity, 18) + const mAssetQuantityExact = applyRatio(bAssetQuantityExact, bAssetBefore.ratio) + + const platformInteraction = await mAssetMachine.getPlatformInteraction(mAsset, "deposit", bAssetQuantityExact, bAssetBefore) + const integratorBalBefore = await bAssetBefore.contract.balanceOf( + bAssetBefore.integrator ? bAssetBefore.integratorAddr : mAsset.address, + ) + + await mAssetMachine.approveMasset(bAsset, mAsset, bAssetQuantityExact, sender.signer, quantitiesAreExact) + + const mAssetOutput = await mAsset.getMintOutput(bAsset.address, bAssetQuantityExact) + expect(mAssetOutput, "mAssetOutput").to.eq(mAssetQuantityExact) + + const tx = mAsset.mint(bAsset.address, bAssetQuantityExact, minMassetQuantityExact, recipient) + + await expect(tx, "Minted event") + .to.emit(mAsset, "Minted") + .withArgs(sender.address, recipient, mAssetQuantityExact, bAsset.address, bAssetQuantityExact) + // Transfers to lending platform + await expect(tx, "Transfer event") + .to.emit(bAsset, "Transfer") + .withArgs(sender.address, bAssetBefore.integrator ? bAssetBefore.integratorAddr : mAsset.address, bAssetQuantityExact) + + // Deposits into lending platform + const integratorBalAfter = await bAssetBefore.contract.balanceOf( + bAssetBefore.integrator ? bAssetBefore.integratorAddr : mAsset.address, + ) + expect(integratorBalAfter, "integratorBalAfter").eq(integratorBalBefore.add(bAssetQuantityExact)) + if (platformInteraction.expectInteraction) { + await expect(tx).to.emit(platform, "Deposit").withArgs(bAsset.address, bAssetBefore.pToken, platformInteraction.amount) + } + + // Recipient should have mAsset quantity after + const recipientBalAfter = await mAsset.balanceOf(recipient) + expect(recipientBalAfter, "recipientBal after").eq(recipientBalBefore.add(mAssetQuantityExact)) + // Sender should have less bAsset after + const senderBassetBalAfter = await bAsset.balanceOf(sender.address) + expect(senderBassetBalAfter, "senderBassetBal after").eq(senderBassetBalBefore.sub(bAssetQuantityExact)) + // VaultBalance should update for this bAsset + const bAssetAfter = await mAsset.getBasset(bAsset.address) + expect(BN.from(bAssetAfter.data.vaultBalance), "vaultBalance after").eq(BN.from(bAssetBefore.vaultBalance).add(bAssetQuantityExact)) + + // Complete basket should remain in healthy state + if (!ignoreHealthAssertions) await assertBasketIsHealthy(mAssetMachine, md) + return { + mAssets: mAssetQuantityExact, + senderBassetBalBefore, + senderBassetBalAfter, + recipientBalBefore, + recipientBalAfter, + } + } + + describe("minting with a single bAsset", () => { + context("when the weights are within the ForgeValidator limit", () => { + context("using bAssets with no transfer fees", async () => { + before("reset", async () => { + await runSetup() + }) + it("should send mUSD when recipient is a contract", async () => { + const { bAssets, forgeValidator } = details + const recipient = forgeValidator.address + await assertBasicMint(details, bAssets[0], 1, 0, recipient) + }) + it("should send mUSD when the recipient is an EOA", async () => { + const { bAssets } = details + const recipient = sa.dummy1.address + await assertBasicMint(details, bAssets[1], 1, 0, recipient) + }) + it("should mint mAssets to 18 decimals from 1 base bAsset unit with 12 decimals", async () => { + const bAsset = details.bAssets[2] + const decimals = await bAsset.decimals() + expect(decimals).eq(12) + + const result = await assertBasicMint(details, bAsset, 1, 0, sa.default.address, sa.default, false, true) + expect(result.mAssets).to.eq("1000000") // 18 - 12 = 6 decimals + }) + it("should mint mAssets to 18 decimals from 2 base bAsset units with 6 decimals", async () => { + const bAsset = details.bAssets[1] + const decimals = await bAsset.decimals() + expect(decimals).eq(6) + + const result = await assertBasicMint(details, bAsset, 2, 0, sa.default.address, sa.default, false, true) + expect(result.mAssets).to.eq("2000000000000") // 18 - 6 = 12 decimals + }) + }) + context("using bAssets with transfer fees", async () => { + before(async () => { + await runSetup(false, true, true) + }) + it("should handle tokens with transfer fees", async () => { + const { bAssets, mAsset, platform } = details + await assertBasketIsHealthy(mAssetMachine, details) + + // 1.0 Assert bAsset has fee + const bAsset = bAssets[3] + const basket = await mAssetMachine.getBasketComposition(details) + expect(basket.bAssets[3].isTransferFeeCharged).to.eq(true) + + // 2.0 Get balances + const minterBassetBalBefore = await bAsset.balanceOf(sa.default.address) + const recipient = sa.dummy3 + const recipientBalBefore = await mAsset.balanceOf(recipient.address) + expect(recipientBalBefore).eq(0) + const mAssetMintAmount = 10 + const approval0: BN = await mAssetMachine.approveMasset(bAsset, mAsset, mAssetMintAmount) + // 3.0 Do the mint + const tx = mAsset.mint(bAsset.address, approval0, 0, recipient.address) + + const mAssetQuantity = simpleToExactAmount(mAssetMintAmount, 18) + const bAssetQuantity = simpleToExactAmount(mAssetMintAmount, await bAsset.decimals()) + + // take 0.1% off for the transfer fee = amount * (1 - 0.001) + const bAssetAmountLessFee = bAssetQuantity.mul(999).div(1000) + // 3.1 Check Transfers to lending platform + await expect(tx).to.emit(bAsset, "Transfer").withArgs(sa.default.address, platform.address, bAssetAmountLessFee) + // 3.2 Check Deposits into lending platform + await expect(tx) + .to.emit(platform, "Deposit") + .withArgs(bAsset.address, await platform.bAssetToPToken(bAsset.address), bAssetAmountLessFee) + // 4.0 Recipient should have mAsset quantity after + const recipientBalAfter = await mAsset.balanceOf(recipient.address) + // Assert that we minted gt 99% of the bAsset + assertBNSlightlyGTPercent(recipientBalBefore.add(mAssetQuantity), recipientBalAfter, "0.3", true) + // Sender should have less bAsset after + const minterBassetBalAfter = await bAsset.balanceOf(sa.default.address) + expect(minterBassetBalAfter).eq(minterBassetBalBefore.sub(bAssetQuantity)) + // VaultBalance should update for this bAsset + const bAssetAfter = await mAsset.getBasset(bAsset.address) + expect(BN.from(bAssetAfter.data.vaultBalance)).eq(recipientBalAfter) + + // Complete basket should remain in healthy state + // await assertBasketIsHealthy(mAssetMachine, details); + }) + it("should fail if the token charges a fee but we don't know about it", async () => { + const { bAssets, mAsset } = details + await assertBasketIsHealthy(mAssetMachine, details) + + // 1.0 Assert bAsset has fee + const bAsset = bAssets[3] + const basket = await mAssetMachine.getBasketComposition(details) + expect(basket.bAssets[3].isTransferFeeCharged).to.eq(true) + await mAsset.connect(sa.governor.signer).setTransferFeesFlag(bAsset.address, false) + + // 2.0 Get balances + const mAssetMintAmount = 10 + const approval0: BN = await mAssetMachine.approveMasset(bAsset, mAsset, mAssetMintAmount) + // 3.0 Do the mint + await expect(mAsset.mint(bAsset.address, approval0, 0, sa.default.address)).to.revertedWith( + "Asset not fully transferred", + ) + }) + }) + context("with an affected bAsset", async () => { + it("should fail if bAsset is broken below peg", async () => { + const { bAssets, mAsset } = details + await assertBasketIsHealthy(mAssetMachine, details) + + const bAsset = bAssets[0] + await mAsset.connect(sa.governor.signer).handlePegLoss(bAsset.address, true) + const newBasset = await mAsset.getBasset(bAsset.address) + expect(newBasset.personal.status).to.eq(BassetStatus.BrokenBelowPeg) + await assertFailedMint("Unhealthy", mAsset, bAsset, 1, 0, true, sa.default.signer, sa.default.address, false, 1) + }) + }) + context("passing invalid arguments", async () => { + before(async () => { + await runSetup() + }) + it("should fail if recipient is 0x0", async () => { + const { mAsset, bAssets } = details + await assertFailedMint("Invalid recipient", mAsset, bAssets[0], 1, 0, true, sa.default.signer, ZERO_ADDRESS, false, 1) + }) + it("should revert when 0 quantities", async () => { + const { bAssets, mAsset } = details + await assertFailedMint("Qty==0", mAsset, bAssets[0], 0) + }) + it("should fail if sender doesn't have balance", async () => { + const { bAssets, mAsset } = details + const bAsset = bAssets[0] + const sender = sa.dummy1 + expect(await bAsset.balanceOf(sender.address)).eq(0) + await assertFailedMint( + "VM Exception while processing transaction: revert", + mAsset, + bAsset, + 100, + 99, + true, + sender.signer, + sender.address, + false, + 100, + ) + }) + it("should fail if sender doesn't give approval", async () => { + const { bAssets, mAsset } = details + const bAsset = bAssets[0] + const sender = sa.dummy2 + await bAsset.transfer(sender.address, 10000) + expect(await bAsset.allowance(sender.address, mAsset.address)).eq(0) + expect(await bAsset.balanceOf(sender.address)).eq(10000) + await assertFailedMint( + "VM Exception while processing transaction: revert", + mAsset, + bAsset, + 100, + 99, + true, + sender.signer, + sender.address, + false, + 100, + ) + }) + it("should fail if the bAsset does not exist", async () => { + const { mAsset } = details + const newBasset = await mAssetMachine.loadBassetProxy("Mock", "MKK", 18, sa.default.address, 1000) + await assertFailedMint("Invalid asset", mAsset, newBasset, 1) + }) + }) + context("should mint single bAsset", () => { + const indexes = [0, 1, 2, 3] + indexes.forEach((i) => { + it(`should mint single bAsset[${i}]`, async () => { + await assertBasicMint(details, details.bAssets[i], 1) + }) + }) + }) + }) + }) + describe("minting with multiple bAssets", () => { + // Helper to assert basic minting conditions, i.e. balance before and after + const assertMintMulti = async ( + md: MassetDetails, + mAssetMintAmounts: Array, + bAssets: Array, + recipient: string = sa.default.address, + sender: Account = sa.default, + ignoreHealthAssertions = false, + ): Promise => { + const { mAsset } = md + + if (!ignoreHealthAssertions) await assertBasketIsHealthy(mAssetMachine, md) + + const minterBassetBalBefore = await Promise.all(bAssets.map((b) => b.balanceOf(sender.address))) + const recipientBalBefore = await mAsset.balanceOf(recipient) + const bAssetDecimals = await Promise.all(bAssets.map((b) => b.decimals())) + const bAssetBefore = await Promise.all(bAssets.map((b) => mAsset.getBasset(b.address))) + const approvals: Array = await Promise.all( + bAssets.map((b, i) => mAssetMachine.approveMasset(b, mAsset, mAssetMintAmounts[i])), + ) + const tx = mAsset.connect(sender.signer).mintMulti( + bAssetBefore.map((b) => b.personal.addr), + approvals, + 0, + recipient, + ) + + const mAssetQuantity = simpleToExactAmount( + mAssetMintAmounts.reduce((p, c) => BN.from(p).add(BN.from(c)), BN.from(0)), + 18, + ) + await expect(tx) + .to.emit(mAsset, "MintedMulti") + .withArgs( + sender.address, + recipient, + mAssetQuantity, + bAssetBefore.map((b) => b.personal.addr), + approvals, + ) + + const bAssetQuantities = mAssetMintAmounts.map((m, i) => simpleToExactAmount(m, bAssetDecimals[i])) + // Recipient should have mAsset quantity after + const recipientBalAfter = await mAsset.balanceOf(recipient) + expect(recipientBalAfter).eq(recipientBalBefore.add(mAssetQuantity)) + // Sender should have less bAsset after + const minterBassetBalAfter = await Promise.all(bAssets.map((b) => b.balanceOf(sender.address))) + minterBassetBalAfter.map((b, i) => expect(b).eq(minterBassetBalBefore[i].sub(bAssetQuantities[i]))) + // VaultBalance should updated for this bAsset + const bAssetAfter = await Promise.all(bAssets.map((b) => mAsset.getBasset(b.address))) + bAssetAfter.map((b, i) => + expect(BN.from(b.data.vaultBalance)).eq(BN.from(bAssetBefore[i].data.vaultBalance).add(bAssetQuantities[i])), + ) + + // Complete basket should remain in healthy state + if (!ignoreHealthAssertions) await assertBasketIsHealthy(mAssetMachine, md) + } + + before(async () => { + await runSetup() + }) + context("when the weights are within the ForgeValidator limit", () => { + context("and sending to a specific recipient", async () => { + before(async () => { + await runSetup() + }) + it("should mint selected bAssets only", async () => { + const comp = await mAssetMachine.getBasketComposition(details) + await assertMintMulti(details, [5, 10], [details.bAssets[2], details.bAssets[0]]) + const compAfter = await mAssetMachine.getBasketComposition(details) + expect(comp.bAssets[1].vaultBalance).eq(compAfter.bAssets[1].vaultBalance) + expect(comp.bAssets[3].vaultBalance).eq(compAfter.bAssets[3].vaultBalance) + }) + it("should send mUSD when recipient is a contract", async () => { + const { bAssets, forgeValidator } = details + const recipient = forgeValidator.address + await assertMintMulti(details, [1], [bAssets[0]], recipient) + }) + it("should send mUSD when the recipient is an EOA", async () => { + const { bAssets } = details + const recipient = sa.dummy1 + await assertMintMulti(details, [1], [bAssets[0]], recipient.address) + }) + }) + context("and specifying one bAsset base unit", async () => { + before(async () => { + await runSetup() + }) + it("should mint a higher q of mAsset base units when using bAsset with 18", async () => { + const { bAssets, mAsset } = details + const bAsset = bAssets[0] + const decimals = await bAsset.decimals() + expect(decimals).eq(18) + + await bAsset.approve(mAsset.address, 1) + + const minterBassetBalBefore = await bAsset.balanceOf(sa.default.address) + const recipientBalBefore = await mAsset.balanceOf(sa.default.address) + + const tx = mAsset.mintMulti([bAsset.address], [1], 0, sa.default.address) + const expectedMasset = BN.from(10).pow(BN.from(18).sub(decimals)) + await expect(tx) + .to.emit(mAsset, "MintedMulti") + .withArgs(sa.default.address, sa.default.address, expectedMasset, [bAsset.address], [1]) + // Recipient should have mAsset quantity after + const recipientBalAfter = await mAsset.balanceOf(sa.default.address) + expect(recipientBalAfter).eq(recipientBalBefore.add(expectedMasset)) + // Sender should have less bAsset after + const minterBassetBalAfter = await bAsset.balanceOf(sa.default.address) + expect(minterBassetBalAfter).eq(minterBassetBalBefore.sub(1)) + // Complete basket should remain in healthy state + await assertBasketIsHealthy(mAssetMachine, details) + }) + }) + context("using bAssets with transfer fees", async () => { + before(async () => { + await runSetup(false, true, true) + }) + it("should handle tokens with transfer fees", async () => { + const { bAssets, mAsset, platform } = details + await assertBasketIsHealthy(mAssetMachine, details) + + // 1.0 Assert bAsset has fee + const bAsset = bAssets[3] + const basket = await mAssetMachine.getBasketComposition(details) + expect(basket.bAssets[3].isTransferFeeCharged).to.eq(true) + + // 2.0 Get balances + const minterBassetBalBefore = await bAsset.balanceOf(sa.default.address) + const recipient = sa.dummy3 + const recipientBalBefore = await mAsset.balanceOf(recipient.address) + expect(recipientBalBefore).eq(0) + const mAssetMintAmount = 10 + const approval0: BN = await mAssetMachine.approveMasset(bAsset, mAsset, mAssetMintAmount) + // 3.0 Do the mint + const tx = mAsset.mintMulti([bAsset.address], [approval0], 0, recipient.address) + + const mAssetQuantity = simpleToExactAmount(mAssetMintAmount, 18) + const bAssetQuantity = simpleToExactAmount(mAssetMintAmount, await bAsset.decimals()) + // take 0.1% off for the transfer fee = amount * (1 - 0.001) + const bAssetAmountLessFee = bAssetQuantity.mul(999).div(1000) + const platformToken = await platform.bAssetToPToken(bAsset.address) + const lendingPlatform = await platform.platformAddress() + // 3.1 Check Transfers from sender to platform integration + await expect(tx).to.emit(bAsset, "Transfer").withArgs(sa.default.address, platform.address, bAssetAmountLessFee) + // 3.2 Check Transfers from platform integration to lending platform + await expect(tx).to.emit(bAsset, "Transfer").withArgs( + platform.address, + lendingPlatform, + bAssetAmountLessFee.mul(999).div(1000), // Take another 0.1% off the transfer value + ) + // 3.3 Check Deposits into lending platform + await expect(tx).to.emit(platform, "Deposit").withArgs(bAsset.address, platformToken, bAssetAmountLessFee) + // 4.0 Recipient should have mAsset quantity after + const recipientBalAfter = await mAsset.balanceOf(recipient.address) + // Assert that we minted gt 99% of the bAsset + assertBNSlightlyGTPercent(recipientBalBefore.add(mAssetQuantity), recipientBalAfter, "0.3") + // Sender should have less bAsset afterz + const minterBassetBalAfter = await bAsset.balanceOf(sa.default.address) + expect(minterBassetBalAfter).eq(minterBassetBalBefore.sub(bAssetQuantity)) + // VaultBalance should update for this bAsset + const bAssetAfter = await mAsset.getBasset(bAsset.address) + expect(BN.from(bAssetAfter.data.vaultBalance)).eq(recipientBalAfter) + + // Complete basket should remain in healthy state + await assertBasketIsHealthy(mAssetMachine, details) + }) + it("should fail if the token charges a fee but we don't know about it", async () => { + const { bAssets, mAsset } = details + await assertBasketIsHealthy(mAssetMachine, details) + + // 1.0 Assert bAsset has fee + const bAsset = bAssets[3] + const basket = await mAssetMachine.getBasketComposition(details) + expect(basket.bAssets[3].isTransferFeeCharged).to.eq(true) + await mAsset.connect(sa.governor.signer).setTransferFeesFlag(bAsset.address, false) + + // 2.0 Get balances + const mAssetMintAmount = 10 + const approval0: BN = await mAssetMachine.approveMasset(bAsset, mAsset, mAssetMintAmount) + // 3.0 Do the mint + await expect(mAsset.mintMulti([bAsset.address], [approval0], 0, sa.default.address)).to.revertedWith( + "Asset not fully transferred", + ) + }) + }) + context("with an affected bAsset", async () => { + it("should fail if bAsset is broken below peg", async () => { + const { bAssets, mAsset } = details + await assertBasketIsHealthy(mAssetMachine, details) + + const bAsset = bAssets[0] + await mAsset.connect(sa.governor.signer).handlePegLoss(bAsset.address, true) + const newBasset = await mAsset.getBasset(bAsset.address) + expect(newBasset.personal.status).to.eq(BassetStatus.BrokenBelowPeg) + await mAssetMachine.approveMasset(bAsset, mAsset, 1) + await assertFailedMintMulti( + "Unhealthy", + mAsset, + [bAsset.address], + [1], + 0, + true, + sa.default.signer, + sa.default.address, + false, + 1, + ) + }) + }) + context("passing invalid arguments", async () => { + before(async () => { + await runSetup() + }) + it("should fail if recipient is 0x0", async () => { + const { mAsset, bAssets } = details + await assertFailedMintMulti( + "Invalid recipient", + mAsset, + [bAssets[0].address], + [1], + 0, + true, + sa.default.signer, + ZERO_ADDRESS, + false, + 1, + ) + }) + context("with incorrect bAsset array", async () => { + it("should fail if both input arrays are empty", async () => { + const { mAsset } = details + await assertFailedMintMulti("Input array mismatch", mAsset, [], []) + }) + it("should fail if the bAsset input array is empty", async () => { + const { mAsset } = details + await assertFailedMintMulti("Input array mismatch", mAsset, [], [1]) + }) + it("should fail if there is a length mismatch", async () => { + const { mAsset, bAssets } = details + await assertFailedMintMulti("Input array mismatch", mAsset, [bAssets[0].address], [1, 1]) + }) + it("should fail if there is a length mismatch", async () => { + const { mAsset, bAssets } = details + await assertFailedMintMulti("Input array mismatch", mAsset, [bAssets[0].address], [1, 1, 1, 1]) + }) + it("should fail if there are duplicate bAsset addresses", async () => { + const { mAsset, bAssets } = details + await assertFailedMintMulti("Duplicate asset", mAsset, [bAssets[0].address, bAssets[0].address], [1, 1]) + }) + }) + describe("minting with some 0 quantities", async () => { + it("should allow minting with some 0 quantities", async () => { + const { bAssets } = details + const recipient = sa.dummy1 + await assertMintMulti(details, [1, 0], [bAssets[0], bAssets[1]], recipient.address) + }) + it("should fail if output mAsset quantity is 0", async () => { + const { mAsset, bAssets } = details + // Get all before balances + const bAssetBefore = await Promise.all(bAssets.map((b) => mAsset.getBasset(b.address))) + // Approve spending of the bAssets + await Promise.all(bAssets.map((b) => mAssetMachine.approveMasset(b, mAsset, 1))) + // Pass all 0's + await assertFailedMintMulti( + "Zero mAsset quantity", + mAsset, + bAssetBefore.map((b) => b.personal.addr), + [0, 0, 0, 0], + 0, + true, + sa.default.signer, + sa.default.address, + false, + 0, + ) + }) + }) + it("should fail if slippage just too big", async () => { + const { bAssets, mAsset } = details + const bAsset = bAssets[0] + const sender = sa.default + await mAssetMachine.approveMasset(bAsset, mAsset, 101, sender.signer) + await assertFailedMintMulti( + "Mint quantity < min qty", + mAsset, + [bAsset.address], + ["100000000000000000000"], // 100 + "100000000000000000001", // just over 100 + true, + sender.signer, + sender.address, + false, + "100000000000000000000", // 100 + true, + ) + }) + it("should fail if sender doesn't have balance", async () => { + const { bAssets, mAsset } = details + const bAsset = bAssets[0] + const sender = sa.dummy2 + expect(await bAsset.balanceOf(sender.address)).eq(0) + await assertFailedMintMulti( + "VM Exception while processing transaction: revert", + mAsset, + [bAsset.address], + [100], + 0, + false, + sender.signer, + sender.address, + false, + 100, + ) + }) + it("should fail if sender doesn't give approval", async () => { + const { bAssets, mAsset } = details + const bAsset = bAssets[0] + const sender = sa.dummy3 + await bAsset.transfer(sender.address, 10000) + expect(await bAsset.allowance(sender.address, mAsset.address)).eq(0) + expect(await bAsset.balanceOf(sender.address)).eq(10000) + await assertFailedMintMulti( + "VM Exception while processing transaction: revert", + mAsset, + [bAsset.address], + [100], + 0, + false, + sender.signer, + sa.default.address, + false, + 100, + ) + }) + it("should fail if the bAsset does not exist", async () => { + const { mAsset } = details + await assertFailedMintMulti("Invalid asset", mAsset, [sa.dummy4.address], [100]) + }) + }) + describe("minting with various orders", async () => { + before(async () => { + await runSetup() + }) + + it("should mint quantities relating to the order of the bAsset indexes", async () => { + const { bAssets, mAsset } = details + const compBefore = await mAssetMachine.getBasketComposition(details) + await mAssetMachine.approveMasset(bAssets[0], mAsset, 100) + await mAssetMachine.approveMasset(bAssets[1], mAsset, 100) + + // Minting with 2 and 1.. they should correspond to lowest index first + await mAsset.mintMulti([bAssets[0].address, bAssets[1].address], [2, 1], 0, sa.default.address) + const compAfter = await mAssetMachine.getBasketComposition(details) + expect(compAfter.bAssets[0].vaultBalance).eq(BN.from(compBefore.bAssets[0].vaultBalance).add(BN.from(2))) + expect(compAfter.bAssets[1].vaultBalance).eq(BN.from(compBefore.bAssets[1].vaultBalance).add(BN.from(1))) + }) + it("should mint using multiple bAssets", async () => { + const { bAssets, mAsset } = details + // It's only possible to mint a single base unit of mAsset, if the bAsset also has 18 decimals + // For those tokens with 12 decimals, they can at minimum mint 1*10**6 mAsset base units. + // Thus, these basic calculations should work in whole mAsset units, with specific tests for + // low decimal bAssets + const approvals = await mAssetMachine.approveMassetMulti( + [bAssets[0], bAssets[1], bAssets[2]], + mAsset, + 1, + sa.default.signer, + ) + await mAsset.mintMulti([bAssets[0].address, bAssets[1].address, bAssets[2].address], approvals, 0, sa.default.address) + const approvals2 = await mAssetMachine.approveMassetMulti( + [bAssets[0], bAssets[1], bAssets[2], bAssets[3]], + mAsset, + 1, + sa.default.signer, + ) + const mUsdBalBefore = await mAsset.balanceOf(sa.default.address) + await mAsset.mintMulti( + [bAssets[0].address, bAssets[1].address, bAssets[2].address, bAssets[3].address], + approvals2, + 0, + sa.default.address, + ) + const mUsdBalAfter = await mAsset.balanceOf(sa.default.address) + expect(mUsdBalAfter, "Must mint 4 full units of mUSD").eq(mUsdBalBefore.add(simpleToExactAmount(4, 18))) + }) + it("should mint using 2 bAssets", async () => { + const { bAssets, mAsset } = details + const approvals = await mAssetMachine.approveMassetMulti([bAssets[0], bAssets[2]], mAsset, 1, sa.default.signer) + await mAsset.mintMulti([bAssets[0].address, bAssets[2].address], approvals, 0, sa.default.address) + }) + }) + }) + context("when the mAsset is undergoing re-collateralisation", () => { + before(async () => { + await runSetup(true) + }) + it("should revert any mints", async () => { + const { bAssets, mAsset } = details + await assertBasketIsHealthy(mAssetMachine, details) + const bAsset0 = bAssets[0] + await mAsset.connect(sa.governor.signer).handlePegLoss(bAsset0.address, true) + + await mAssetMachine.approveMasset(bAsset0, mAsset, 2) + await expect(mAsset.mintMulti([bAsset0.address], [1], 0, sa.default.address)).to.revertedWith("Unhealthy") + }) + }) + }) +}) diff --git a/test/masset/platform-integrations/TestAaveIntegration.spec.ts b/test/masset/platform-integrations/TestAaveIntegration.spec.ts deleted file mode 100644 index 5c3d675a..00000000 --- a/test/masset/platform-integrations/TestAaveIntegration.spec.ts +++ /dev/null @@ -1,1099 +0,0 @@ -/* eslint-disable @typescript-eslint/camelcase */ -/* eslint-disable consistent-return */ - -import { expectEvent, expectRevert, time } from "@openzeppelin/test-helpers"; -import { BN } from "@utils/tools"; -import { assertBNClose, assertBNSlightlyGT, assertBNSlightlyGTPercent } from "@utils/assertions"; -import { StandardAccounts, SystemMachine, MassetMachine } from "@utils/machines"; -import { - MainnetAccounts, - ZERO_ADDRESS, - MAX_UINT256, - fullScale, - ONE_WEEK, - TEN_MINS, -} from "@utils/constants"; -import { simpleToExactAmount } from "@utils/math"; - -import envSetup from "@utils/env_setup"; -import * as t from "types/generated"; -import { BassetIntegrationDetails } from "../../../types"; -import shouldBehaveLikeModule from "../../shared/behaviours/Module.behaviour"; - -const { expect } = envSetup.configure(); - -const c_MockERC20 = artifacts.require("MockERC20"); -const c_MockAaveAToken = artifacts.require("MockAToken"); -const c_MockAave = artifacts.require("MockAaveV1"); -const c_Nexus = artifacts.require("Nexus"); -const c_AaveLendingPoolAddressProvider = artifacts.require("ILendingPoolAddressesProviderV1"); -const c_AaveLendingPool = artifacts.require("IAaveLendingPoolV1"); -const c_ERC20 = artifacts.require("ERC20Detailed"); -const c_AaveAToken = artifacts.require("IAaveATokenV1"); -const c_DelayedProxyAdmin = artifacts.require("DelayedProxyAdmin"); -const c_InitializableProxy = artifacts.require("InitializableAdminUpgradeabilityProxy"); -const c_AaveIntegration = artifacts.require("MockAaveIntegration"); - -contract("AaveIntegration", async (accounts) => { - const sa = new StandardAccounts(accounts); - const ma = new MainnetAccounts(); - - let systemMachine: SystemMachine; - let nexus: t.NexusInstance; - let massetMachine: MassetMachine; - - let integrationDetails: BassetIntegrationDetails; - let d_DelayedProxyAdmin: t.DelayedProxyAdminInstance; - let d_AaveIntegrationProxy: t.InitializableAdminUpgradeabilityProxyInstance; - let d_AaveIntegration: t.MockAaveIntegrationInstance; - - const ctx: { module?: t.ModuleInstance } = {}; - - before("base init", async () => { - systemMachine = new SystemMachine(sa.all); - massetMachine = systemMachine.massetMachine; - - await runSetup(false, false); - }); - - const runSetup = async (enableUSDTFee = false, simulateMint = false) => { - // SETUP - // ====== - nexus = await c_Nexus.new(sa.governor); - // Init proxyAdmin - d_DelayedProxyAdmin = await c_DelayedProxyAdmin.new(nexus.address); - // Initialize the proxy - d_AaveIntegrationProxy = await c_InitializableProxy.new(); - d_AaveIntegration = await c_AaveIntegration.at(d_AaveIntegrationProxy.address); - - // Load network specific integration data - integrationDetails = await massetMachine.loadBassets(enableUSDTFee, true); - - // Initialize the proxy storage - const aaveImplementation = await c_AaveIntegration.new(); - - const initializationData_AaveIntegration: string = aaveImplementation.contract.methods - .initialize( - nexus.address, - [sa.default], - integrationDetails.aavePlatformAddress, - integrationDetails.aTokens.map((a) => a.bAsset), - integrationDetails.aTokens.map((a) => a.aToken), - ) - .encodeABI(); - await d_AaveIntegrationProxy.methods["initialize(address,address,bytes)"]( - aaveImplementation.address, - d_DelayedProxyAdmin.address, - initializationData_AaveIntegration, - ); - - await nexus.initialize( - [web3.utils.keccak256("ProxyAdmin")], - [d_DelayedProxyAdmin.address], - [true], - sa.governor, - { from: sa.governor }, - ); - - if (simulateMint) { - await Promise.all( - integrationDetails.aTokens.map(async ({ bAsset, aToken }) => { - // Step 0. Choose tokens - const d_bAsset = await c_ERC20.at(bAsset); - const bAsset_decimals = await d_bAsset.decimals(); - const amount = new BN(enableUSDTFee ? 101 : 100).mul( - new BN(10).pow(bAsset_decimals.sub(new BN(1))), - ); - const amount_dep = new BN(100).mul( - new BN(10).pow(bAsset_decimals.sub(new BN(1))), - ); - // Step 1. xfer tokens to integration - await d_bAsset.transfer(d_AaveIntegration.address, amount.toString()); - // Step 2. call deposit - return d_AaveIntegration.deposit(bAsset, amount_dep.toString(), true); - }), - ); - } - - ctx.module = d_AaveIntegration as t.ModuleInstance; - }; - - describe("initializing AaveIntegration", async () => { - describe("verifying GovernableWhitelist initialization", async () => { - describe("verifying InitializableModule initialization", async () => { - shouldBehaveLikeModule(ctx as Required, sa); - - it("should properly store valid arguments", async () => { - // Check for nexus addr - expect(await d_AaveIntegration.nexus()).eq(nexus.address); - }); - }); - - it("should properly store valid arguments", async () => { - // check for whitelisted accs - const whitelisted = await d_AaveIntegration.whitelist(sa.default); - expect(whitelisted).eq(true); - // check for non whitelisted accs - const notWhitelisted = await d_AaveIntegration.whitelist(sa.dummy4); - expect(notWhitelisted).eq(false); - const notWhitelisted2 = await d_AaveIntegration.whitelist(sa.governor); - expect(notWhitelisted2).eq(false); - }); - it("should fail when empty whitelisted array", async () => { - const tempImpl = await c_AaveIntegration.new(); - const erc20Mock = await c_MockERC20.new("TMP", "TMP", 18, sa.default, "1000000"); - const aTokenMock = await c_MockAaveAToken.new(sa.other, erc20Mock.address); - await expectRevert( - tempImpl.initialize( - nexus.address, - [], - sa.other, - [erc20Mock.address], - [aTokenMock.address], - ), - "Empty whitelist array", - ); - }); - it("should fail when whitelisted address is zero or duplicate", async () => { - const tempImpl = await c_AaveIntegration.new(); - const erc20Mock = await c_MockERC20.new("TMP", "TMP", 18, sa.default, "1000000"); - const aTokenMock = await c_MockAaveAToken.new(sa.other, erc20Mock.address); - await expectRevert( - tempImpl.initialize( - nexus.address, - [sa.dummy1, sa.dummy1], - sa.other, - [erc20Mock.address], - [aTokenMock.address], - ), - "Already whitelisted", - ); - await expectRevert( - tempImpl.initialize( - nexus.address, - [ZERO_ADDRESS], - sa.other, - [erc20Mock.address], - [aTokenMock.address], - ), - "Address is zero", - ); - }); - }); - - it("should properly store valid arguments", async () => { - // check for platform addr - expect(integrationDetails.aavePlatformAddress).eq( - await d_AaveIntegration.platformAddress(), - ); - // check for pTokens added & events - expect(integrationDetails.aTokens[0].aToken).eq( - await d_AaveIntegration.bAssetToPToken(integrationDetails.aTokens[0].bAsset), - ); - expect(integrationDetails.aTokens[1].aToken).eq( - await d_AaveIntegration.bAssetToPToken(integrationDetails.aTokens[1].bAsset), - ); - }); - - it("should approve spending of the passed bAssets", async () => { - const bAsset = await c_MockERC20.at(integrationDetails.aTokens[0].bAsset); - const addressProvider = await c_AaveLendingPoolAddressProvider.at( - integrationDetails.aavePlatformAddress, - ); - const approvedAddress = await addressProvider.getLendingPoolCore(); - const balance = await bAsset.allowance(d_AaveIntegration.address, approvedAddress); - expect(balance).bignumber.eq(MAX_UINT256 as any); - }); - - it("should fail when called again", async () => { - const tempImpl = await c_AaveIntegration.new(); - const erc20Mock = await c_MockERC20.new("TMP", "TMP", 18, sa.default, "1000000"); - const aTokenMock = await c_MockAaveAToken.new(sa.other, erc20Mock.address); - await tempImpl.initialize( - nexus.address, - [sa.dummy1], - integrationDetails.aavePlatformAddress, - [erc20Mock.address], - [aTokenMock.address], - ); - await expectRevert( - tempImpl.initialize( - nexus.address, - [sa.dummy1], - sa.other, - [erc20Mock.address], - [aTokenMock.address], - ), - "Contract instance has already been initialized", - ); - }); - - it("should fail if passed incorrect data", async () => { - const tempImpl = await c_AaveIntegration.new(); - const erc20Mock = await c_MockERC20.new("TMP", "TMP", 18, sa.default, "1000000"); - const aTokenMock = await c_MockAaveAToken.new(sa.other, erc20Mock.address); - // platformAddress is invalid - await expectRevert.unspecified( - tempImpl.initialize( - nexus.address, - [sa.dummy1], - ZERO_ADDRESS, - [erc20Mock.address], - [aTokenMock.address], - ), - ); - // bAsset and pToken array length are different - await expectRevert( - tempImpl.initialize( - nexus.address, - [sa.dummy1, sa.dummy2], - integrationDetails.aavePlatformAddress, - [erc20Mock.address], - [aTokenMock.address, aTokenMock.address], - ), - "Invalid input arrays", - ); - // pToken address is zero - await expectRevert( - tempImpl.initialize( - nexus.address, - [sa.dummy1, sa.dummy2], - integrationDetails.aavePlatformAddress, - [erc20Mock.address], - [ZERO_ADDRESS], - ), - "Invalid addresses", - ); - // duplicate pToken or bAsset - await expectRevert( - tempImpl.initialize( - nexus.address, - [sa.dummy1, sa.dummy2], - integrationDetails.aavePlatformAddress, - [erc20Mock.address, erc20Mock.address], - [aTokenMock.address, sa.default], - ), - "pToken already set", - ); - // invalid bAsset addresses - await expectRevert.unspecified( - tempImpl.initialize( - nexus.address, - [sa.dummy1, sa.dummy2], - integrationDetails.aavePlatformAddress, - [sa.default], - [aTokenMock.address], - ), - ); - }); - }); - - describe("setting P Token Address", async () => { - let erc20Mock: t.MockERC20Instance; - let aTokenMock: t.MockATokenInstance; - beforeEach("init mocks", async () => { - erc20Mock = await c_MockERC20.new("TMP", "TMP", 18, sa.default, "1000000"); - aTokenMock = await c_MockAaveAToken.new(sa.other, erc20Mock.address); - await runSetup(); - }); - it("should pass only when function called by the Governor", async () => { - await expectRevert( - d_AaveIntegration.setPTokenAddress(erc20Mock.address, aTokenMock.address, { - from: sa.default, - }), - "Only governor can execute", - ); - await d_AaveIntegration.setPTokenAddress(erc20Mock.address, aTokenMock.address, { - from: sa.governor, - }); - expect(aTokenMock.address).eq( - await d_AaveIntegration.bAssetToPToken(erc20Mock.address), - ); - }); - it("should approve the spending of the bAsset correctly and emit event", async () => { - await d_AaveIntegration.setPTokenAddress(erc20Mock.address, aTokenMock.address, { - from: sa.governor, - }); - expect(aTokenMock.address).eq( - await d_AaveIntegration.bAssetToPToken(erc20Mock.address), - ); - const addressProvider = await c_AaveLendingPoolAddressProvider.at( - integrationDetails.aavePlatformAddress, - ); - const approvedAddress = await addressProvider.getLendingPoolCore(); - const balance = await erc20Mock.allowance(d_AaveIntegration.address, approvedAddress); - expect(balance).bignumber.eq(MAX_UINT256 as any); - }); - it("should fail when passed invalid args", async () => { - // bAsset address is zero - await expectRevert( - d_AaveIntegration.setPTokenAddress(ZERO_ADDRESS, aTokenMock.address, { - from: sa.governor, - }), - "Invalid addresses", - ); - // pToken address is zero - await expectRevert( - d_AaveIntegration.setPTokenAddress(erc20Mock.address, ZERO_ADDRESS, { - from: sa.governor, - }), - "Invalid addresses", - ); - // pToken address already assigned for a bAsset - await d_AaveIntegration.setPTokenAddress(erc20Mock.address, aTokenMock.address, { - from: sa.governor, - }); - await expectRevert( - d_AaveIntegration.setPTokenAddress(erc20Mock.address, sa.default, { - from: sa.governor, - }), - "pToken already set", - ); - }); - }); - - describe("calling deposit", async () => { - beforeEach("init mocks", async () => { - await runSetup(); - }); - it("should deposit tokens to Aave", async () => { - // Step 0. Choose tokens - const bAsset = await c_ERC20.at(integrationDetails.aTokens[0].bAsset); - const bAsset_decimals = await bAsset.decimals(); - const amount = new BN(10).pow(bAsset_decimals); - const aToken = await c_AaveAToken.at(integrationDetails.aTokens[0].aToken); - // 0.1 Get balance before - const addressProvider = await c_AaveLendingPoolAddressProvider.at( - integrationDetails.aavePlatformAddress, - ); - const bAssetRecipient = await addressProvider.getLendingPoolCore(); - const bAssetRecipient_balBefore = await bAsset.balanceOf(bAssetRecipient); - const aaveIntegration_balBefore = await aToken.balanceOf(d_AaveIntegration.address); - // Cross that match with the `checkBalance` call - let directBalance = await d_AaveIntegration.checkBalance.call(bAsset.address); - expect(directBalance).bignumber.eq(aaveIntegration_balBefore); - - // Step 1. xfer tokens to integration - await bAsset.transfer(d_AaveIntegration.address, amount.toString()); - - // Step 2. call deposit - const tx = await d_AaveIntegration.deposit(bAsset.address, amount.toString(), false); - - // Step 3. Check for things: - // 3.1 Check that lending pool core has bAssets - expect(await bAsset.balanceOf(bAssetRecipient)).bignumber.eq( - bAssetRecipient_balBefore.add(amount), - ); - // 3.2 Check that aave integration has aTokens - const expectedBalance = aaveIntegration_balBefore.add(amount); - const actualBalance = await aToken.balanceOf(d_AaveIntegration.address); - assertBNSlightlyGTPercent(actualBalance, expectedBalance); - // Cross that match with the `checkBalance` call - directBalance = await d_AaveIntegration.checkBalance.call(bAsset.address); - expect(directBalance).bignumber.eq(actualBalance); - // Assert that Balance goes up over time - await time.increase(TEN_MINS); - const newBalance = await d_AaveIntegration.checkBalance.call(bAsset.address); - assertBNSlightlyGTPercent( - newBalance, - directBalance, - "0.0001", - systemMachine.isGanacheFork, - ); - // 3.3 Check that return value is cool (via event) - expectEvent(tx.receipt, "Deposit", { _amount: amount }); - }); - - it("should handle the fee calculations", async () => { - // Step 0. Choose tokens and set up env - await runSetup(true); - - const addressProvider = await c_AaveLendingPoolAddressProvider.at( - integrationDetails.aavePlatformAddress, - ); - const bAsset = await c_ERC20.at(integrationDetails.aTokens[1].bAsset); - const bAsset_decimals = await bAsset.decimals(); - const amount = new BN(10).pow(bAsset_decimals); - const aToken = await c_AaveAToken.at(integrationDetails.aTokens[1].aToken); - - // 0.1 Get balance before - const bAssetRecipient = await addressProvider.getLendingPoolCore(); - const bAssetRecipient_balBefore = await bAsset.balanceOf(bAssetRecipient); - const aaveIntegration_balBefore = await aToken.balanceOf(d_AaveIntegration.address); - // Cross that match with the `checkBalance` call - let directBalance = await d_AaveIntegration.checkBalance.call(bAsset.address); - expect(directBalance).bignumber.eq(aaveIntegration_balBefore); - - // Step 1. xfer tokens to integration - const bal1 = await bAsset.balanceOf(d_AaveIntegration.address); - await bAsset.transfer(d_AaveIntegration.address, amount.toString()); - - const bal2 = await bAsset.balanceOf(d_AaveIntegration.address); - const receivedAmount = bal2.sub(bal1); - // Ensure fee is being deducted - expect(receivedAmount).bignumber.lt(amount as any); - // fee = initialAmount - receivedAmount - const fee = amount.sub(receivedAmount); - // feeRate = fee/amount (base 1e18) - const feeRate = fee.mul(fullScale).div(amount); - // expectedDepoit = receivedAmount - (receivedAmount*feeRate) - const expectedDeposit = receivedAmount.sub(receivedAmount.mul(feeRate).div(fullScale)); - - // Step 2. call deposit - const tx = await d_AaveIntegration.deposit( - bAsset.address, - receivedAmount.toString(), - true, - ); - - // Step 3. Check for things: - // 3.1 Check that lending pool core has bAssets - expect(await bAsset.balanceOf(bAssetRecipient)).bignumber.eq( - bAssetRecipient_balBefore.add(expectedDeposit), - ); - // 3.2 Check that aave integration has aTokens - const aaveIntegration_balAfter = await aToken.balanceOf(d_AaveIntegration.address); - assertBNClose( - aaveIntegration_balAfter, - aaveIntegration_balBefore.add(expectedDeposit), - fee, - ); - // Cross that match with the `checkBalance` call - directBalance = await d_AaveIntegration.checkBalance.call(bAsset.address); - expect(directBalance).bignumber.eq(aaveIntegration_balAfter); - - // 3.3 Check that return value is cool (via event) - const receivedATokens = aaveIntegration_balAfter.sub(aaveIntegration_balBefore); - const min = receivedATokens.lt(receivedAmount) ? receivedATokens : receivedAmount; - expectEvent(tx.receipt, "Deposit", { _amount: min }); - }); - it("should only allow a whitelisted user to call function", async () => { - // Step 0. Choose tokens - const bAsset = await c_ERC20.at(integrationDetails.aTokens[1].bAsset); - const amount = new BN(10).pow(new BN(12)); - - // Step 1. call deposit - await expectRevert( - d_AaveIntegration.deposit(bAsset.address, amount.toString(), false, { - from: sa.dummy1, - }), - "Not a whitelisted address", - ); - }); - it("should fail if the bAsset is not supported", async () => { - // Step 0. Choose tokens - const bAsset = await c_ERC20.at(integrationDetails.cTokens[0].bAsset); - const amount = new BN(10).pow(new BN(12)); - - // Step 1. call deposit - await expectRevert( - d_AaveIntegration.deposit(bAsset.address, amount.toString(), false), - "aToken does not exist", - ); - }); - it("should fail if we do not first pass the required bAsset", async () => { - // Step 0. Choose tokens - const bAsset = await c_ERC20.at(integrationDetails.aTokens[0].bAsset); - const amount = new BN(10).pow(new BN(12)); - const aToken = await c_AaveAToken.at(integrationDetails.aTokens[0].aToken); - - // Step 2. call deposit - await expectRevert( - d_AaveIntegration.deposit(bAsset.address, amount.toString(), false), - "SafeERC20: low-level call failed", - ); - }); - it("should fail if we try to deposit too much", async () => { - // Step 0. Choose tokens - const bAsset = await c_ERC20.at(integrationDetails.aTokens[1].bAsset); - const bAsset_decimals = await bAsset.decimals(); - const amount = new BN(10).mul(new BN(10).pow(bAsset_decimals)); - const amount_high = new BN(11).mul(new BN(10).pow(bAsset_decimals)); - const aToken = await c_AaveAToken.at(integrationDetails.aTokens[1].aToken); - - // Step 1. xfer low tokens to integration - await bAsset.transfer(d_AaveIntegration.address, amount.toString()); - expect(await bAsset.balanceOf(d_AaveIntegration.address)).bignumber.lte(amount as any); - // Step 2. call deposit with high tokens - await expectRevert( - d_AaveIntegration.deposit(bAsset.address, amount_high.toString(), false), - "SafeERC20: low-level call failed", - ); - }); - it("should fail with broken arguments", async () => { - // Step 0. Choose tokens - const bAsset = await c_ERC20.at(integrationDetails.aTokens[0].bAsset); - const bAsset_decimals = await bAsset.decimals(); - const amount = new BN(10).pow(bAsset_decimals); - const aToken = await c_AaveAToken.at(integrationDetails.aTokens[0].aToken); - - // 0.1 Get balance before - const addressProvider = await c_AaveLendingPoolAddressProvider.at( - integrationDetails.aavePlatformAddress, - ); - const bAssetRecipient = await addressProvider.getLendingPoolCore(); - const bAssetRecipient_balBefore = await bAsset.balanceOf(bAssetRecipient); - const aaveIntegration_balBefore = await aToken.balanceOf(d_AaveIntegration.address); - - // Step 1. xfer low tokens to integration - await bAsset.transfer(d_AaveIntegration.address, amount.toString()); - - // Fails with ZERO bAsset Address - await expectRevert( - d_AaveIntegration.deposit(ZERO_ADDRESS, amount.toString(), false), - "aToken does not exist", - ); - // Fails with ZERO Amount - await expectRevert( - d_AaveIntegration.deposit(bAsset.address, "0", false), - "Must deposit something", - ); - // Succeeds with Incorrect bool (defaults to false) - const tx = await d_AaveIntegration.deposit( - bAsset.address, - amount.toString(), - undefined, - ); - - // Step 3. Check for things: - // 3.1 Check that lending pool core has bAssets - expect(await bAsset.balanceOf(bAssetRecipient)).bignumber.eq( - bAssetRecipient_balBefore.add(amount), - ); - // 3.2 Check that aave integration has aTokens - const newBal = await aToken.balanceOf(d_AaveIntegration.address); - assertBNSlightlyGT(newBal, aaveIntegration_balBefore.add(amount), new BN("1000")); - // Cross that match with the `checkBalance` call - const directBalance = await d_AaveIntegration.checkBalance.call(bAsset.address); - expect(directBalance).bignumber.eq(newBal); - - // 3.3 Check that return value is cool (via event) - expectEvent(tx.receipt, "Deposit", { _amount: amount }); - }); - it("should fail if lending pool or core does not exist (skip on fork)", async () => { - // Can only run on local, due to constraints from Aave - if (systemMachine.isGanacheFork) return; - const mockAave = await c_MockAave.at(integrationDetails.aavePlatformAddress); - await mockAave.breakLendingPools(); - const bAsset = await c_ERC20.at(integrationDetails.aTokens[1].bAsset); - await bAsset.transfer(d_AaveIntegration.address, "1"); - // Fails with ZERO Amount - await expectRevert( - d_AaveIntegration.deposit(bAsset.address, "1", false), - "Lending pool does not exist", - ); - // Fails with ZERO Amount - await expectRevert( - d_AaveIntegration.reApproveAllTokens({ from: sa.governor }), - "Lending pool core does not exist", - ); - }); - }); - - describe("withdraw", async () => { - beforeEach("init mocks", async () => { - await runSetup(false, true); - }); - it("should withdraw tokens from Aave", async () => { - // Step 0. Choose tokens - const bAsset = await c_ERC20.at(integrationDetails.aTokens[0].bAsset); - const bAsset_decimals = await bAsset.decimals(); - const amount = new BN(10).pow(bAsset_decimals); - const aToken = await c_AaveAToken.at(integrationDetails.aTokens[0].aToken); - // 0.1 Get balance before - const bAssetRecipient = sa.dummy1; - const bAssetRecipient_balBefore = await bAsset.balanceOf(bAssetRecipient); - const aaveIntegration_balBefore = await aToken.balanceOf(d_AaveIntegration.address); - - // Step 1. call withdraw - const tx = await d_AaveIntegration.methods["withdraw(address,address,uint256,bool)"]( - bAssetRecipient, - bAsset.address, - amount.toString(), - false, - ); - - // Step 2. Check for things: - // 2.1 Check that the recipient receives the tokens - expect(await bAsset.balanceOf(bAssetRecipient)).bignumber.eq( - bAssetRecipient_balBefore.add(amount), - ); - // 2.2 Check that integration aToken balance has gone down - const actualBalance = await aToken.balanceOf(d_AaveIntegration.address); - const expectedBalance = aaveIntegration_balBefore.sub(amount); - assertBNSlightlyGTPercent( - actualBalance, - expectedBalance, - "0.001", - systemMachine.isGanacheFork, - ); - // Cross that match with the `checkBalance` call - const directBalance = await d_AaveIntegration.checkBalance.call(bAsset.address); - expect(directBalance).bignumber.eq(actualBalance); - // Assert that Balance goes up over time - await time.increase(TEN_MINS); - const newBalance = await d_AaveIntegration.checkBalance.call(bAsset.address); - assertBNSlightlyGTPercent( - newBalance, - directBalance, - "0.001", - systemMachine.isGanacheFork, - ); - // 2.3 Should give accurate return value - expectEvent(tx.receipt, "PlatformWithdrawal", { - bAsset: bAsset.address, - totalAmount: amount, - userAmount: amount, - }); - }); - - it("should handle the fee calculations", async () => { - await runSetup(true, true); - // should deduct the transfer fee from the return value - const bAsset = await c_ERC20.at(integrationDetails.aTokens[1].bAsset); - const bAsset_decimals = await bAsset.decimals(); - const amount = new BN(10).pow(bAsset_decimals); - const aToken = await c_AaveAToken.at(integrationDetails.aTokens[1].aToken); - - // 0.1 Get balance before - const bAssetRecipient = sa.dummy1; - const bAssetRecipient_balBefore = await bAsset.balanceOf(bAssetRecipient); - const aaveIntegration_balBefore = await aToken.balanceOf(d_AaveIntegration.address); - - // Step 1. call withdraw - const tx = await d_AaveIntegration.methods["withdraw(address,address,uint256,bool)"]( - bAssetRecipient, - bAsset.address, - amount.toString(), - true, - ); - const bAssetRecipient_balAfter = await bAsset.balanceOf(bAssetRecipient); - const aaveIntegration_balAfter = await aToken.balanceOf(d_AaveIntegration.address); - - // 99% of amt - const scale = simpleToExactAmount("0.99", 18); - const amountScaled = amount.mul(scale); - const expectedAmount = amountScaled.div(fullScale); - // Step 2. Validate recipient - expect(bAssetRecipient_balAfter).bignumber.gte( - bAssetRecipient_balBefore.add(expectedAmount) as any, - ); - expect(bAssetRecipient_balAfter).bignumber.lte( - bAssetRecipient_balBefore.add(amount) as any, - ); - expect(aaveIntegration_balAfter).bignumber.eq( - aaveIntegration_balBefore.sub(amount) as any, - ); - const expectedBalance = aaveIntegration_balBefore.sub(amount); - assertBNSlightlyGT(aaveIntegration_balAfter, expectedBalance, new BN("100")); - // Cross that match with the `checkBalance` call - const directBalance = await d_AaveIntegration.checkBalance.call(bAsset.address); - expect(directBalance).bignumber.eq(expectedBalance); - }); - - it("should only allow a whitelisted user to call function", async () => { - // Step 0. Choose tokens - const bAsset = await c_ERC20.at(integrationDetails.aTokens[0].bAsset); - const bAsset_decimals = await bAsset.decimals(); - const amount = new BN(10).pow(bAsset_decimals); - - // Step 1. call deposit - await expectRevert( - d_AaveIntegration.methods["withdraw(address,address,uint256,bool)"]( - sa.dummy1, - bAsset.address, - amount.toString(), - false, - { - from: sa.dummy1, - }, - ), - "Not a whitelisted address", - ); - }); - it("should fail if there is insufficient balance", async () => { - // Step 0. Choose tokens - const bAsset = await c_ERC20.at(integrationDetails.aTokens[0].bAsset); - const bAsset_decimals = await bAsset.decimals(); - const amount = new BN(1000).mul(new BN(10).pow(bAsset_decimals)); - - // Step 1. call deposit - await expectRevert( - d_AaveIntegration.methods["withdraw(address,address,uint256,bool)"]( - sa.default, - bAsset.address, - amount.toString(), - false, - ), - systemMachine.isGanacheFork - ? "User cannot redeem more than the available balance" - : "ERC20: burn amount exceeds balance", - ); - }); - it("should fail with broken arguments", async () => { - // Step 0. Choose tokens - const bAsset = await c_ERC20.at(integrationDetails.aTokens[0].bAsset); - const bAsset_decimals = await bAsset.decimals(); - const amount = new BN(10).pow(bAsset_decimals); - const aToken = await c_AaveAToken.at(integrationDetails.aTokens[0].aToken); - - // 0.1 Get balance before - const bAssetRecipient = sa.dummy1; - const bAssetRecipient_balBefore = await bAsset.balanceOf(bAssetRecipient); - const aaveIntegration_balBefore = await aToken.balanceOf(d_AaveIntegration.address); - - // Fails with ZERO bAsset Address - await expectRevert( - d_AaveIntegration.methods["withdraw(address,address,uint256,bool)"]( - sa.dummy1, - ZERO_ADDRESS, - amount.toString(), - false, - ), - "aToken does not exist", - ); - // Fails with ZERO recipient address - await expectRevert.unspecified( - d_AaveIntegration.methods["withdraw(address,address,uint256,bool)"]( - ZERO_ADDRESS, - bAsset.address, - new BN(1), - false, - ), - ); - // Fails with ZERO Amount - await expectRevert( - d_AaveIntegration.methods["withdraw(address,address,uint256,bool)"]( - sa.dummy1, - bAsset.address, - "0", - false, - ), - "Must withdraw something", - ); - // Succeeds with Incorrect bool (defaults to false) - const tx = await d_AaveIntegration.methods["withdraw(address,address,uint256,bool)"]( - sa.dummy1, - bAsset.address, - amount.toString(), - undefined, - ); - - // 2.1 Check that the recipient receives the tokens - expect(await bAsset.balanceOf(bAssetRecipient)).bignumber.eq( - bAssetRecipient_balBefore.add(amount), - ); - // 2.2 Check that integration aToken balance has gone down - const currentBalance = await aToken.balanceOf(d_AaveIntegration.address); - assertBNSlightlyGTPercent( - currentBalance, - aaveIntegration_balBefore.sub(amount), - "0.0001", - systemMachine.isGanacheFork, - ); - // 2.3 Should give accurate return value - expectEvent(tx.receipt, "PlatformWithdrawal", { - bAsset: bAsset.address, - totalAmount: amount, - userAmount: amount, - }); - }); - it("should fail if the bAsset is not supported", async () => { - // Step 0. Choose tokens - const bAsset = await c_ERC20.at(integrationDetails.cTokens[0].bAsset); - const amount = new BN(10).pow(new BN(12)); - - // Step 1. call withdraw - await expectRevert( - d_AaveIntegration.methods["withdraw(address,address,uint256,bool)"]( - sa.dummy1, - bAsset.address, - amount.toString(), - false, - ), - "aToken does not exist", - ); - }); - }); - - describe("withdraw specific amount", async () => { - describe("and the token does not have transfer fee", async () => { - beforeEach("init mocks", async () => { - await runSetup(false, true); - }); - it("should allow withdrawal of X and give Y to the caller", async () => { - // Step 0. Choose tokens - const bAsset = await c_ERC20.at(integrationDetails.aTokens[0].bAsset); - const bAsset_decimals = await bAsset.decimals(); - const amount = simpleToExactAmount(5, bAsset_decimals); - const totalAmount = amount.muln(2); - const aToken = await c_AaveAToken.at(integrationDetails.aTokens[0].aToken); - // 0.1 Get balance before - const bAssetRecipient = sa.dummy1; - const bAssetRecipient_balBefore = await bAsset.balanceOf(bAssetRecipient); - const aaveIntegration_balBefore = await bAsset.balanceOf(d_AaveIntegration.address); - const aaveBalanceBefore = await d_AaveIntegration.checkBalance.call(bAsset.address); - - // fail if called by non Bm or mAsset - await expectRevert( - d_AaveIntegration.methods["withdraw(address,address,uint256,uint256,bool)"]( - bAssetRecipient, - bAsset.address, - amount, - totalAmount, - false, - { - from: sa.dummy1, - }, - ), - "Not a whitelisted address", - ); - // send the amount - const tx = await d_AaveIntegration.methods[ - "withdraw(address,address,uint256,uint256,bool)" - ](bAssetRecipient, bAsset.address, amount, totalAmount, false); - const bAssetRecipient_balAfter = await bAsset.balanceOf(bAssetRecipient); - const aaveIntegration_balAfter = await bAsset.balanceOf(d_AaveIntegration.address); - const aaveBalanceAfter = await d_AaveIntegration.checkBalance.call(bAsset.address); - expect(bAssetRecipient_balAfter).bignumber.eq( - bAssetRecipient_balBefore.add(amount), - ); - expect(aaveIntegration_balAfter).bignumber.eq( - aaveIntegration_balBefore.add(totalAmount.sub(amount)), - ); - expect(aaveBalanceAfter).bignumber.eq(aaveBalanceBefore.sub(totalAmount)); - // emit the event - expectEvent(tx.receipt, "PlatformWithdrawal", { - bAsset: bAsset.address, - pToken: aToken.address, - totalAmount: totalAmount, - userAmount: amount, - }); - }); - }); - describe("and the token has transfer fees", async () => { - beforeEach("init mocks", async () => { - await runSetup(true, true); - }); - it("should fail if totalAmount != userAmount", async () => { - const bAsset = await c_ERC20.at(integrationDetails.aTokens[1].bAsset); - const bAsset_decimals = await bAsset.decimals(); - const amount = simpleToExactAmount(5, bAsset_decimals); - const totalAmount = amount.muln(2); - await expectRevert( - d_AaveIntegration.methods["withdraw(address,address,uint256,uint256,bool)"]( - sa.dummy1, - bAsset.address, - amount, - totalAmount, - true, - ), - "Cache inactive for assets with fee", - ); - }); - }); - }); - - describe("withdrawRaw", async () => { - beforeEach("init mocks", async () => { - await runSetup(false, true); - }); - it("should fail if caller is not whitelisetd", async () => { - const bAsset = await c_ERC20.at(integrationDetails.aTokens[0].bAsset); - await expectRevert( - d_AaveIntegration.withdrawRaw(sa.dummy3, bAsset.address, new BN(1), { - from: sa.dummy1, - }), - "Not a whitelisted address", - ); - }); - it("should allow the mAsset or BM to withdraw a given bAsset", async () => { - const bAsset = await c_ERC20.at(integrationDetails.aTokens[0].bAsset); - const bAsset_decimals = await bAsset.decimals(); - const amount = simpleToExactAmount(5, bAsset_decimals); - - await bAsset.transfer(d_AaveIntegration.address, amount); - - const bAssetRecipient = sa.dummy1; - const bAssetRecipient_balBefore = await bAsset.balanceOf(bAssetRecipient); - const aaveIntegration_balBefore = await bAsset.balanceOf(d_AaveIntegration.address); - const aaveBalanceBefore = await d_AaveIntegration.checkBalance.call(bAsset.address); - - const tx = await d_AaveIntegration.withdrawRaw(bAssetRecipient, bAsset.address, amount); - - const bAssetRecipient_balAfter = await bAsset.balanceOf(bAssetRecipient); - const aaveIntegration_balAfter = await bAsset.balanceOf(d_AaveIntegration.address); - const aaveBalanceAfter = await d_AaveIntegration.checkBalance.call(bAsset.address); - - // Balances remain the same - expect(bAssetRecipient_balAfter).bignumber.eq(bAssetRecipient_balBefore.add(amount)); - expect(aaveIntegration_balAfter).bignumber.eq(aaveIntegration_balBefore.sub(amount)); - expect(aaveBalanceAfter).bignumber.eq(aaveBalanceBefore); - - // Emits expected event - expectEvent(tx.receipt, "Withdrawal", { - _bAsset: bAsset.address, - _pToken: ZERO_ADDRESS, - _amount: amount, - }); - }); - it("should fail if there is no balance in a given asset", async () => { - const bAsset = await c_ERC20.at(integrationDetails.aTokens[0].bAsset); - await expectRevert( - d_AaveIntegration.withdrawRaw(sa.dummy3, bAsset.address, new BN(1)), - "SafeERC20: low-level call failed", - ); - }); - it("should fail if specified a 0 amount", async () => { - const bAsset = await c_ERC20.at(integrationDetails.aTokens[0].bAsset); - await expectRevert( - d_AaveIntegration.withdrawRaw(sa.dummy3, bAsset.address, new BN(0)), - "Must withdraw something", - ); - }); - }); - - // See deposit and withdraw tests for basic balance checking - describe("checkBalance", async () => { - it("should return balance for any caller when supported token address passed", async () => { - const bAsset = await c_ERC20.at(integrationDetails.aTokens[0].bAsset); - const aToken = await c_AaveAToken.at(integrationDetails.aTokens[0].aToken); - - const aaveIntegration_bal = await aToken.balanceOf(d_AaveIntegration.address); - // Cross that match with the `checkBalance` call - const directBalance = await d_AaveIntegration.checkBalance.call(bAsset.address); - expect(directBalance).bignumber.eq(aaveIntegration_bal); - }); - - // it("should return balance with same precision as bAsset", async () => {}); - // By checking that the aToken balance == balBefore + deposit amount, we are implicitly checking - // that the number of decimals returned from checkbalance is the same - - it("should increase our balance over time and activity", async () => { - // Simulating activity on mainnet only, as our mocks are not capable - if (!systemMachine.isGanacheFork) return; - - // Load things up and do some mints - await runSetup(false, true); - - // 1. Load up our target tokens and get the balances now - const bAsset = await c_ERC20.at(integrationDetails.aTokens[0].bAsset); - const bAsset_decimals = await bAsset.decimals(); - const amount = new BN(10).pow(bAsset_decimals); - const aToken = await c_AaveAToken.at(integrationDetails.aTokens[0].aToken); - // 1.1 Get balance before - const addressProvider = await c_AaveLendingPoolAddressProvider.at( - integrationDetails.aavePlatformAddress, - ); - const aaveIntegration_balBefore = await aToken.balanceOf(d_AaveIntegration.address); - expect(aaveIntegration_balBefore).bignumber.gt(new BN(0) as any); - // Cross that match with the `checkBalance` call - let directBalance = await d_AaveIntegration.checkBalance.call(bAsset.address); - expect(directBalance).bignumber.eq(aaveIntegration_balBefore); - - // 2. Simulate some external activity by depositing or redeeming - // DIRECTlY to the LendingPool. - // Doing this activity should raise our aToken balances slightly - // 2.1. Approve the LendingPool Core - await bAsset.approve(await addressProvider.getLendingPoolCore(), amount); - const d_lendingPool = await c_AaveLendingPool.at( - await addressProvider.getLendingPool(), - ); - // 2.2. Call the deposit func - await d_lendingPool.deposit(bAsset.address, amount, 9999); - // 2.3. Fast forward some time - await time.increase(ONE_WEEK); - // 2.4. Do a redemption - await aToken.redeem(amount); - - // 3. Analyse our new balances - const aaveIntegration_balAfter = await aToken.balanceOf(d_AaveIntegration.address); - // Should not go up by more than 2% during this period - assertBNSlightlyGTPercent( - aaveIntegration_balAfter, - aaveIntegration_balBefore, - "1", - true, - ); - // Cross that match with the `checkBalance` call - directBalance = await d_AaveIntegration.checkBalance.call(bAsset.address); - expect(directBalance).bignumber.eq(aaveIntegration_balAfter); - - // 4. Withdraw our new interest - we worked hard for it! - await d_AaveIntegration.methods["withdraw(address,address,uint256,bool)"]( - sa.default, - bAsset.address, - aaveIntegration_balAfter, - false, - ); - }); - it("should fail if called with inactive token", async () => { - const bAsset = await c_ERC20.at(integrationDetails.cTokens[0].bAsset); - - await expectRevert( - d_AaveIntegration.checkBalance(bAsset.address), - "aToken does not exist", - ); - }); - }); - - describe("reApproveAllTokens", async () => { - before("init mocks", async () => { - // Do some mints to mess up the allowances - await runSetup(false, true); - }); - it("should re-approve ALL bAssets with aTokens", async () => { - const bassetsMapped = await d_AaveIntegration.getBassetsMapped(); - expect(bassetsMapped.length).to.be.gt(0 as any); - - const addressProvider = await c_AaveLendingPoolAddressProvider.at( - integrationDetails.aavePlatformAddress, - ); - const approvedAddress = await addressProvider.getLendingPoolCore(); - - await d_AaveIntegration.reApproveAllTokens({ - from: sa.governor, - }); - bassetsMapped.forEach(async (b) => { - const bAsset = await c_MockERC20.at(b); - const balance = await bAsset.allowance(d_AaveIntegration.address, approvedAddress); - expect(balance).bignumber.eq(MAX_UINT256); - const balanceOfSender = await bAsset.allowance( - d_AaveIntegration.address, - sa.governor, - ); - expect(balanceOfSender).bignumber.eq(new BN(0)); - }); - }); - it("should be able to be called multiple times", async () => { - const bassetsMapped = await d_AaveIntegration.getBassetsMapped(); - expect(bassetsMapped.length).to.be.gt(0 as any); - - await d_AaveIntegration.reApproveAllTokens({ - from: sa.governor, - }); - await d_AaveIntegration.reApproveAllTokens({ - from: sa.governor, - }); - }); - it("should only be callable by the Governor", async () => { - await expectRevert( - d_AaveIntegration.reApproveAllTokens({ - from: sa.dummy1, - }), - "Only governor can execute", - ); - }); - it("should fail if lending pool core does not exist (mock)", async () => { - // Can only run on local, due to constraints from Aave - if (systemMachine.isGanacheFork) return; - const mockAave = await c_MockAave.at(integrationDetails.aavePlatformAddress); - await mockAave.breakLendingPools(); - // Fails with ZERO Amount - await expectRevert( - d_AaveIntegration.reApproveAllTokens({ from: sa.governor }), - "Lending pool core does not exist", - ); - }); - }); -}); diff --git a/test/masset/platform-integrations/TestAaveV2Integration.spec.ts b/test/masset/platform-integrations/TestAaveV2Integration.spec.ts deleted file mode 100644 index 31e11670..00000000 --- a/test/masset/platform-integrations/TestAaveV2Integration.spec.ts +++ /dev/null @@ -1,1105 +0,0 @@ -/* eslint-disable @typescript-eslint/camelcase */ -/* eslint-disable consistent-return */ - -import { expectEvent, expectRevert, time } from "@openzeppelin/test-helpers"; -import { BN } from "@utils/tools"; -import { - assertBNClose, - assertBNClosePercent, - assertBNSlightlyGT, - assertBNSlightlyGTPercent, -} from "@utils/assertions"; -import { StandardAccounts, SystemMachine, MassetMachine } from "@utils/machines"; -import { - MainnetAccounts, - ZERO_ADDRESS, - MAX_UINT256, - fullScale, - ONE_WEEK, - TEN_MINS, -} from "@utils/constants"; -import { simpleToExactAmount } from "@utils/math"; - -import envSetup from "@utils/env_setup"; -import * as t from "types/generated"; -import { BassetIntegrationDetails } from "../../../types"; -import shouldBehaveLikeModule from "../../shared/behaviours/Module.behaviour"; - -const { expect } = envSetup.configure(); - -const c_MockERC20 = artifacts.require("MockERC20"); -const c_Nexus = artifacts.require("Nexus"); -const c_ERC20 = artifacts.require("ERC20Detailed"); -const c_DelayedProxyAdmin = artifacts.require("DelayedProxyAdmin"); -const c_InitializableProxy = artifacts.require("InitializableAdminUpgradeabilityProxy"); - -const c_AaveIntegration = artifacts.require("MockAaveV2Integration"); -const c_MockAaveAToken = artifacts.require("MockATokenV2"); -const c_MockAave = artifacts.require("MockAaveV2"); -const c_AaveLendingPoolAddressProvider = artifacts.require("ILendingPoolAddressesProviderV2"); -const c_AaveLendingPool = artifacts.require("IAaveLendingPoolV2"); -const c_AaveAToken = artifacts.require("IAaveATokenV2"); - -contract("AaveIntegration", async (accounts) => { - const sa = new StandardAccounts(accounts); - const ma = new MainnetAccounts(); - - let systemMachine: SystemMachine; - let nexus: t.NexusInstance; - let massetMachine: MassetMachine; - - let integrationDetails: BassetIntegrationDetails; - let d_DelayedProxyAdmin: t.DelayedProxyAdminInstance; - let d_AaveIntegrationProxy: t.InitializableAdminUpgradeabilityProxyInstance; - let d_AaveIntegration: t.MockAaveV2IntegrationInstance; - - const ctx: { module?: t.ModuleInstance } = {}; - - before("base init", async () => { - systemMachine = new SystemMachine(sa.all); - massetMachine = systemMachine.massetMachine; - - await runSetup(false, false); - }); - - const runSetup = async (enableUSDTFee = false, simulateMint = false) => { - // SETUP - // ====== - nexus = await c_Nexus.new(sa.governor); - // Init proxyAdmin - d_DelayedProxyAdmin = await c_DelayedProxyAdmin.new(nexus.address); - // Initialize the proxy - d_AaveIntegrationProxy = await c_InitializableProxy.new(); - d_AaveIntegration = await c_AaveIntegration.at(d_AaveIntegrationProxy.address); - - // Load network specific integration data - integrationDetails = await massetMachine.loadBassets(enableUSDTFee, false); - - // Initialize the proxy storage - const aaveImplementation = await c_AaveIntegration.new(); - - const initializationData_AaveIntegration: string = aaveImplementation.contract.methods - .initialize( - nexus.address, - [sa.default], - integrationDetails.aavePlatformAddress, - integrationDetails.aTokens.map((a) => a.bAsset), - integrationDetails.aTokens.map((a) => a.aToken), - ) - .encodeABI(); - await d_AaveIntegrationProxy.methods["initialize(address,address,bytes)"]( - aaveImplementation.address, - d_DelayedProxyAdmin.address, - initializationData_AaveIntegration, - ); - - await nexus.initialize( - [web3.utils.keccak256("ProxyAdmin")], - [d_DelayedProxyAdmin.address], - [true], - sa.governor, - { from: sa.governor }, - ); - - if (simulateMint) { - await Promise.all( - integrationDetails.aTokens.map(async ({ bAsset, aToken }) => { - // Step 0. Choose tokens - const d_bAsset = await c_ERC20.at(bAsset); - const bAsset_decimals = await d_bAsset.decimals(); - const amount = new BN(enableUSDTFee ? 101 : 100).mul( - new BN(10).pow(bAsset_decimals.sub(new BN(1))), - ); - const amount_dep = new BN(100).mul( - new BN(10).pow(bAsset_decimals.sub(new BN(1))), - ); - // Step 1. xfer tokens to integration - await d_bAsset.transfer(d_AaveIntegration.address, amount.toString()); - // Step 2. call deposit - return d_AaveIntegration.deposit(bAsset, amount_dep.toString(), true); - }), - ); - } - - ctx.module = d_AaveIntegration as t.ModuleInstance; - }; - - describe("initializing AaveIntegration", async () => { - describe("verifying GovernableWhitelist initialization", async () => { - describe("verifying InitializableModule initialization", async () => { - shouldBehaveLikeModule(ctx as Required, sa); - - it("should properly store valid arguments", async () => { - // Check for nexus addr - expect(await d_AaveIntegration.nexus()).eq(nexus.address); - }); - }); - - it("should properly store valid arguments", async () => { - // check for whitelisted accs - const whitelisted = await d_AaveIntegration.whitelist(sa.default); - expect(whitelisted).eq(true); - // check for non whitelisted accs - const notWhitelisted = await d_AaveIntegration.whitelist(sa.dummy4); - expect(notWhitelisted).eq(false); - const notWhitelisted2 = await d_AaveIntegration.whitelist(sa.governor); - expect(notWhitelisted2).eq(false); - }); - it("should fail when empty whitelisted array", async () => { - const tempImpl = await c_AaveIntegration.new(); - const erc20Mock = await c_MockERC20.new("TMP", "TMP", 18, sa.default, "1000000"); - const aTokenMock = await c_MockAaveAToken.new(sa.other, erc20Mock.address); - await expectRevert( - tempImpl.initialize( - nexus.address, - [], - sa.other, - [erc20Mock.address], - [aTokenMock.address], - ), - "Empty whitelist array", - ); - }); - it("should fail when whitelisted address is zero or duplicate", async () => { - const tempImpl = await c_AaveIntegration.new(); - const erc20Mock = await c_MockERC20.new("TMP", "TMP", 18, sa.default, "1000000"); - const aTokenMock = await c_MockAaveAToken.new(sa.other, erc20Mock.address); - await expectRevert( - tempImpl.initialize( - nexus.address, - [sa.dummy1, sa.dummy1], - sa.other, - [erc20Mock.address], - [aTokenMock.address], - ), - "Already whitelisted", - ); - await expectRevert( - tempImpl.initialize( - nexus.address, - [ZERO_ADDRESS], - sa.other, - [erc20Mock.address], - [aTokenMock.address], - ), - "Address is zero", - ); - }); - }); - - it("should properly store valid arguments", async () => { - // check for platform addr - expect(integrationDetails.aavePlatformAddress).eq( - await d_AaveIntegration.platformAddress(), - ); - // check for pTokens added & events - expect(integrationDetails.aTokens[0].aToken).eq( - await d_AaveIntegration.bAssetToPToken(integrationDetails.aTokens[0].bAsset), - ); - expect(integrationDetails.aTokens[1].aToken).eq( - await d_AaveIntegration.bAssetToPToken(integrationDetails.aTokens[1].bAsset), - ); - }); - - it("should approve spending of the passed bAssets", async () => { - const bAsset = await c_MockERC20.at(integrationDetails.aTokens[0].bAsset); - const addressProvider = await c_AaveLendingPoolAddressProvider.at( - integrationDetails.aavePlatformAddress, - ); - const approvedAddress = await addressProvider.getLendingPool(); - const balance = await bAsset.allowance(d_AaveIntegration.address, approvedAddress); - expect(balance).bignumber.eq(MAX_UINT256 as any); - }); - - it("should fail when called again", async () => { - const tempImpl = await c_AaveIntegration.new(); - const erc20Mock = await c_MockERC20.new("TMP", "TMP", 18, sa.default, "1000000"); - const aTokenMock = await c_MockAaveAToken.new(sa.other, erc20Mock.address); - await tempImpl.initialize( - nexus.address, - [sa.dummy1], - integrationDetails.aavePlatformAddress, - [erc20Mock.address], - [aTokenMock.address], - ); - await expectRevert( - tempImpl.initialize( - nexus.address, - [sa.dummy1], - sa.other, - [erc20Mock.address], - [aTokenMock.address], - ), - "Contract instance has already been initialized", - ); - }); - - it("should fail if passed incorrect data", async () => { - const tempImpl = await c_AaveIntegration.new(); - const erc20Mock = await c_MockERC20.new("TMP", "TMP", 18, sa.default, "1000000"); - const aTokenMock = await c_MockAaveAToken.new(sa.other, erc20Mock.address); - // platformAddress is invalid - await expectRevert.unspecified( - tempImpl.initialize( - nexus.address, - [sa.dummy1], - ZERO_ADDRESS, - [erc20Mock.address], - [aTokenMock.address], - ), - ); - // bAsset and pToken array length are different - await expectRevert( - tempImpl.initialize( - nexus.address, - [sa.dummy1, sa.dummy2], - integrationDetails.aavePlatformAddress, - [erc20Mock.address], - [aTokenMock.address, aTokenMock.address], - ), - "Invalid input arrays", - ); - // pToken address is zero - await expectRevert( - tempImpl.initialize( - nexus.address, - [sa.dummy1, sa.dummy2], - integrationDetails.aavePlatformAddress, - [erc20Mock.address], - [ZERO_ADDRESS], - ), - "Invalid addresses", - ); - // duplicate pToken or bAsset - await expectRevert( - tempImpl.initialize( - nexus.address, - [sa.dummy1, sa.dummy2], - integrationDetails.aavePlatformAddress, - [erc20Mock.address, erc20Mock.address], - [aTokenMock.address, sa.default], - ), - "pToken already set", - ); - // invalid bAsset addresses - await expectRevert.unspecified( - tempImpl.initialize( - nexus.address, - [sa.dummy1, sa.dummy2], - integrationDetails.aavePlatformAddress, - [sa.default], - [aTokenMock.address], - ), - ); - }); - }); - - describe("setting P Token Address", async () => { - let erc20Mock: t.MockERC20Instance; - let aTokenMock: t.MockATokenV2Instance; - beforeEach("init mocks", async () => { - erc20Mock = await c_MockERC20.new("TMP", "TMP", 18, sa.default, "1000000"); - aTokenMock = await c_MockAaveAToken.new(sa.other, erc20Mock.address); - await runSetup(); - }); - it("should pass only when function called by the Governor", async () => { - await expectRevert( - d_AaveIntegration.setPTokenAddress(erc20Mock.address, aTokenMock.address, { - from: sa.default, - }), - "Only governor can execute", - ); - await d_AaveIntegration.setPTokenAddress(erc20Mock.address, aTokenMock.address, { - from: sa.governor, - }); - expect(aTokenMock.address).eq( - await d_AaveIntegration.bAssetToPToken(erc20Mock.address), - ); - }); - it("should approve the spending of the bAsset correctly and emit event", async () => { - await d_AaveIntegration.setPTokenAddress(erc20Mock.address, aTokenMock.address, { - from: sa.governor, - }); - expect(aTokenMock.address).eq( - await d_AaveIntegration.bAssetToPToken(erc20Mock.address), - ); - const addressProvider = await c_AaveLendingPoolAddressProvider.at( - integrationDetails.aavePlatformAddress, - ); - const approvedAddress = await addressProvider.getLendingPool(); - const balance = await erc20Mock.allowance(d_AaveIntegration.address, approvedAddress); - expect(balance).bignumber.eq(MAX_UINT256 as any); - }); - it("should fail when passed invalid args", async () => { - // bAsset address is zero - await expectRevert( - d_AaveIntegration.setPTokenAddress(ZERO_ADDRESS, aTokenMock.address, { - from: sa.governor, - }), - "Invalid addresses", - ); - // pToken address is zero - await expectRevert( - d_AaveIntegration.setPTokenAddress(erc20Mock.address, ZERO_ADDRESS, { - from: sa.governor, - }), - "Invalid addresses", - ); - // pToken address already assigned for a bAsset - await d_AaveIntegration.setPTokenAddress(erc20Mock.address, aTokenMock.address, { - from: sa.governor, - }); - await expectRevert( - d_AaveIntegration.setPTokenAddress(erc20Mock.address, sa.default, { - from: sa.governor, - }), - "pToken already set", - ); - }); - }); - - describe("calling deposit", async () => { - beforeEach("init mocks", async () => { - await runSetup(); - }); - it("should deposit tokens to Aave", async () => { - // Step 0. Choose tokens - const bAsset = await c_ERC20.at(integrationDetails.aTokens[0].bAsset); - const bAsset_decimals = await bAsset.decimals(); - const amount = new BN(10).pow(bAsset_decimals); - const aToken = await c_AaveAToken.at(integrationDetails.aTokens[0].aToken); - // 0.1 Get balance before - const addressProvider = await c_AaveLendingPoolAddressProvider.at( - integrationDetails.aavePlatformAddress, - ); - const bAssetRecipient = await addressProvider.getLendingPool(); - const bAssetRecipient_balBefore = await bAsset.balanceOf(bAssetRecipient); - const aaveIntegration_balBefore = await aToken.balanceOf(d_AaveIntegration.address); - // Cross that match with the `checkBalance` call - let directBalance = await d_AaveIntegration.checkBalance.call(bAsset.address); - expect(directBalance).bignumber.eq(aaveIntegration_balBefore); - - // Step 1. xfer tokens to integration - await bAsset.transfer(d_AaveIntegration.address, amount.toString()); - - // Step 2. call deposit - const tx = await d_AaveIntegration.deposit(bAsset.address, amount.toString(), false); - - // Step 3. Check for things: - // 3.1 Check that lending pool has bAssets - expect(await bAsset.balanceOf(bAssetRecipient)).bignumber.eq( - bAssetRecipient_balBefore.add(amount), - ); - // 3.2 Check that aave integration has aTokens - const expectedBalance = aaveIntegration_balBefore.add(amount); - const actualBalance = await aToken.balanceOf(d_AaveIntegration.address); - assertBNSlightlyGTPercent(actualBalance, expectedBalance); - // Cross that match with the `checkBalance` call - directBalance = await d_AaveIntegration.checkBalance.call(bAsset.address); - expect(directBalance).bignumber.eq(actualBalance); - // Assert that Balance goes up over time - await time.increase(TEN_MINS); - const newBalance = await d_AaveIntegration.checkBalance.call(bAsset.address); - assertBNSlightlyGTPercent( - newBalance, - directBalance, - "0.0001", - systemMachine.isGanacheFork, - ); - // 3.3 Check that return value is cool (via event) - expectEvent(tx.receipt, "Deposit", { _amount: amount }); - }); - - it("should handle the fee calculations", async () => { - // Step 0. Choose tokens and set up env - await runSetup(true); - - const addressProvider = await c_AaveLendingPoolAddressProvider.at( - integrationDetails.aavePlatformAddress, - ); - const bAsset = await c_ERC20.at(integrationDetails.aTokens[1].bAsset); - const bAsset_decimals = await bAsset.decimals(); - const amount = new BN(10).pow(bAsset_decimals); - const aToken = await c_AaveAToken.at(integrationDetails.aTokens[1].aToken); - - // 0.1 Get balance before - const bAssetRecipient = await addressProvider.getLendingPool(); - const bAssetRecipient_balBefore = await bAsset.balanceOf(bAssetRecipient); - const aaveIntegration_balBefore = await aToken.balanceOf(d_AaveIntegration.address); - // Cross that match with the `checkBalance` call - let directBalance = await d_AaveIntegration.checkBalance.call(bAsset.address); - expect(directBalance).bignumber.eq(aaveIntegration_balBefore); - - // Step 1. xfer tokens to integration - const bal1 = await bAsset.balanceOf(d_AaveIntegration.address); - await bAsset.transfer(d_AaveIntegration.address, amount.toString()); - - const bal2 = await bAsset.balanceOf(d_AaveIntegration.address); - const receivedAmount = bal2.sub(bal1); - // Ensure fee is being deducted - expect(receivedAmount).bignumber.lt(amount as any); - // fee = initialAmount - receivedAmount - const fee = amount.sub(receivedAmount); - // feeRate = fee/amount (base 1e18) - const feeRate = fee.mul(fullScale).div(amount); - // expectedDepoit = receivedAmount - (receivedAmount*feeRate) - const expectedDeposit = receivedAmount.sub(receivedAmount.mul(feeRate).div(fullScale)); - - // Step 2. call deposit - const tx = await d_AaveIntegration.deposit( - bAsset.address, - receivedAmount.toString(), - true, - ); - - // Step 3. Check for things: - // 3.1 Check that lending pool has bAssets - expect(await bAsset.balanceOf(bAssetRecipient)).bignumber.eq( - bAssetRecipient_balBefore.add(expectedDeposit), - ); - // 3.2 Check that aave integration has aTokens - const aaveIntegration_balAfter = await aToken.balanceOf(d_AaveIntegration.address); - assertBNClose( - aaveIntegration_balAfter, - aaveIntegration_balBefore.add(expectedDeposit), - fee, - ); - // Cross that match with the `checkBalance` call - directBalance = await d_AaveIntegration.checkBalance.call(bAsset.address); - expect(directBalance).bignumber.eq(aaveIntegration_balAfter); - - // 3.3 Check that return value is cool (via event) - const receivedATokens = aaveIntegration_balAfter.sub(aaveIntegration_balBefore); - const min = receivedATokens.lt(receivedAmount) ? receivedATokens : receivedAmount; - expectEvent(tx.receipt, "Deposit", { _amount: min }); - }); - it("should only allow a whitelisted user to call function", async () => { - // Step 0. Choose tokens - const bAsset = await c_ERC20.at(integrationDetails.aTokens[1].bAsset); - const amount = new BN(10).pow(new BN(12)); - - // Step 1. call deposit - await expectRevert( - d_AaveIntegration.deposit(bAsset.address, amount.toString(), false, { - from: sa.dummy1, - }), - "Not a whitelisted address", - ); - }); - it("should fail if the bAsset is not supported", async () => { - // Step 0. Choose tokens - const bAsset = await c_ERC20.at(integrationDetails.cTokens[0].bAsset); - const amount = new BN(10).pow(new BN(12)); - - // Step 1. call deposit - await expectRevert( - d_AaveIntegration.deposit(bAsset.address, amount.toString(), false), - "aToken does not exist", - ); - }); - it("should fail if we do not first pass the required bAsset", async () => { - // Step 0. Choose tokens - const bAsset = await c_ERC20.at(integrationDetails.aTokens[0].bAsset); - const amount = new BN(10).pow(new BN(12)); - const aToken = await c_AaveAToken.at(integrationDetails.aTokens[0].aToken); - - // Step 2. call deposit - await expectRevert( - d_AaveIntegration.deposit(bAsset.address, amount.toString(), false), - "SafeERC20: low-level call failed", - ); - }); - it("should fail if we try to deposit too much", async () => { - // Step 0. Choose tokens - const bAsset = await c_ERC20.at(integrationDetails.aTokens[1].bAsset); - const bAsset_decimals = await bAsset.decimals(); - const amount = new BN(10).mul(new BN(10).pow(bAsset_decimals)); - const amount_high = new BN(11).mul(new BN(10).pow(bAsset_decimals)); - const aToken = await c_AaveAToken.at(integrationDetails.aTokens[1].aToken); - - // Step 1. xfer low tokens to integration - await bAsset.transfer(d_AaveIntegration.address, amount.toString()); - expect(await bAsset.balanceOf(d_AaveIntegration.address)).bignumber.lte(amount as any); - // Step 2. call deposit with high tokens - await expectRevert( - d_AaveIntegration.deposit(bAsset.address, amount_high.toString(), false), - "SafeERC20: low-level call failed", - ); - }); - it("should fail with broken arguments", async () => { - // Step 0. Choose tokens - const bAsset = await c_ERC20.at(integrationDetails.aTokens[0].bAsset); - const bAsset_decimals = await bAsset.decimals(); - const amount = new BN(10).pow(bAsset_decimals); - const aToken = await c_AaveAToken.at(integrationDetails.aTokens[0].aToken); - - // 0.1 Get balance before - const addressProvider = await c_AaveLendingPoolAddressProvider.at( - integrationDetails.aavePlatformAddress, - ); - const bAssetRecipient = await addressProvider.getLendingPool(); - const bAssetRecipient_balBefore = await bAsset.balanceOf(bAssetRecipient); - const aaveIntegration_balBefore = await aToken.balanceOf(d_AaveIntegration.address); - - // Step 1. xfer low tokens to integration - await bAsset.transfer(d_AaveIntegration.address, amount.toString()); - - // Fails with ZERO bAsset Address - await expectRevert( - d_AaveIntegration.deposit(ZERO_ADDRESS, amount.toString(), false), - "aToken does not exist", - ); - // Fails with ZERO Amount - await expectRevert( - d_AaveIntegration.deposit(bAsset.address, "0", false), - "Must deposit something", - ); - // Succeeds with Incorrect bool (defaults to false) - const tx = await d_AaveIntegration.deposit( - bAsset.address, - amount.toString(), - undefined, - ); - - // Step 3. Check for things: - // 3.1 Check that lending pool has bAssets - expect(await bAsset.balanceOf(bAssetRecipient)).bignumber.eq( - bAssetRecipient_balBefore.add(amount), - ); - // 3.2 Check that aave integration has aTokens - const newBal = await aToken.balanceOf(d_AaveIntegration.address); - assertBNSlightlyGT(newBal, aaveIntegration_balBefore.add(amount), new BN("1000")); - // Cross that match with the `checkBalance` call - const directBalance = await d_AaveIntegration.checkBalance.call(bAsset.address); - expect(directBalance).bignumber.eq(newBal); - - // 3.3 Check that return value is cool (via event) - expectEvent(tx.receipt, "Deposit", { _amount: amount }); - }); - it("should fail if lending pool does not exist (skip on fork)", async () => { - // Can only run on local, due to constraints from Aave - if (systemMachine.isGanacheFork) return; - const mockAave = await c_MockAave.at(integrationDetails.aavePlatformAddress); - await mockAave.breakLendingPools(); - const bAsset = await c_ERC20.at(integrationDetails.aTokens[1].bAsset); - await bAsset.transfer(d_AaveIntegration.address, "1"); - // Fails with ZERO Amount - await expectRevert( - d_AaveIntegration.deposit(bAsset.address, "1", false), - "Lending pool does not exist", - ); - // Fails with ZERO Amount - await expectRevert( - d_AaveIntegration.reApproveAllTokens({ from: sa.governor }), - "Lending pool does not exist", - ); - }); - }); - - describe("withdraw", async () => { - beforeEach("init mocks", async () => { - await runSetup(false, true); - }); - it("should withdraw tokens from Aave", async () => { - // Step 0. Choose tokens - const bAsset = await c_ERC20.at(integrationDetails.aTokens[0].bAsset); - const bAsset_decimals = await bAsset.decimals(); - const amount = new BN(10).pow(bAsset_decimals); - const aToken = await c_AaveAToken.at(integrationDetails.aTokens[0].aToken); - // 0.1 Get balance before - const bAssetRecipient = sa.dummy1; - const bAssetRecipient_balBefore = await bAsset.balanceOf(bAssetRecipient); - const aaveIntegration_balBefore = await aToken.balanceOf(d_AaveIntegration.address); - - // Step 1. call withdraw - const tx = await d_AaveIntegration.methods["withdraw(address,address,uint256,bool)"]( - bAssetRecipient, - bAsset.address, - amount.toString(), - false, - ); - - // Step 2. Check for things: - // 2.1 Check that the recipient receives the tokens - expect(await bAsset.balanceOf(bAssetRecipient)).bignumber.eq( - bAssetRecipient_balBefore.add(amount), - ); - // 2.2 Check that integration aToken balance has gone down - const actualBalance = await aToken.balanceOf(d_AaveIntegration.address); - const expectedBalance = aaveIntegration_balBefore.sub(amount); - assertBNSlightlyGTPercent( - actualBalance, - expectedBalance, - "0.001", - systemMachine.isGanacheFork, - ); - // Cross that match with the `checkBalance` call - const directBalance = await d_AaveIntegration.checkBalance.call(bAsset.address); - expect(directBalance).bignumber.eq(actualBalance); - // Assert that Balance goes up over time - await time.increase(TEN_MINS); - const newBalance = await d_AaveIntegration.checkBalance.call(bAsset.address); - assertBNSlightlyGTPercent( - newBalance, - directBalance, - "0.001", - systemMachine.isGanacheFork, - ); - // 2.3 Should give accurate return value - expectEvent(tx.receipt, "PlatformWithdrawal", { - bAsset: bAsset.address, - totalAmount: amount, - userAmount: amount, - }); - }); - - it("should handle the fee calculations", async () => { - await runSetup(true, true); - // should deduct the transfer fee from the return value - const bAsset = await c_ERC20.at(integrationDetails.aTokens[1].bAsset); - const bAsset_decimals = await bAsset.decimals(); - const amount = new BN(10).pow(bAsset_decimals); - const aToken = await c_AaveAToken.at(integrationDetails.aTokens[1].aToken); - - // 0.1 Get balance before - const bAssetRecipient = sa.dummy1; - const bAssetRecipient_balBefore = await bAsset.balanceOf(bAssetRecipient); - const aaveIntegration_balBefore = await aToken.balanceOf(d_AaveIntegration.address); - - // Step 1. call withdraw - const tx = await d_AaveIntegration.methods["withdraw(address,address,uint256,bool)"]( - bAssetRecipient, - bAsset.address, - amount.toString(), - true, - ); - const bAssetRecipient_balAfter = await bAsset.balanceOf(bAssetRecipient); - const aaveIntegration_balAfter = await aToken.balanceOf(d_AaveIntegration.address); - - // 99% of amt - const scale = simpleToExactAmount("0.99", 18); - const amountScaled = amount.mul(scale); - const expectedAmount = amountScaled.div(fullScale); - // Step 2. Validate recipient - expect(bAssetRecipient_balAfter).bignumber.gte( - bAssetRecipient_balBefore.add(expectedAmount) as any, - ); - expect(bAssetRecipient_balAfter).bignumber.lte( - bAssetRecipient_balBefore.add(amount) as any, - ); - expect(aaveIntegration_balAfter).bignumber.eq( - aaveIntegration_balBefore.sub(amount) as any, - ); - const expectedBalance = aaveIntegration_balBefore.sub(amount); - assertBNSlightlyGT(aaveIntegration_balAfter, expectedBalance, new BN("100")); - // Cross that match with the `checkBalance` call - const directBalance = await d_AaveIntegration.checkBalance.call(bAsset.address); - expect(directBalance).bignumber.eq(expectedBalance); - }); - - it("should only allow a whitelisted user to call function", async () => { - // Step 0. Choose tokens - const bAsset = await c_ERC20.at(integrationDetails.aTokens[0].bAsset); - const bAsset_decimals = await bAsset.decimals(); - const amount = new BN(10).pow(bAsset_decimals); - - // Step 1. call deposit - await expectRevert( - d_AaveIntegration.methods["withdraw(address,address,uint256,bool)"]( - sa.dummy1, - bAsset.address, - amount.toString(), - false, - { - from: sa.dummy1, - }, - ), - "Not a whitelisted address", - ); - }); - it("should fail if there is insufficient balance", async () => { - // Step 0. Choose tokens - const bAsset = await c_ERC20.at(integrationDetails.aTokens[0].bAsset); - const bAsset_decimals = await bAsset.decimals(); - const amount = new BN(1000).mul(new BN(10).pow(bAsset_decimals)); - - // Step 1. call deposit - await expectRevert( - d_AaveIntegration.methods["withdraw(address,address,uint256,bool)"]( - sa.default, - bAsset.address, - amount.toString(), - false, - ), - systemMachine.isGanacheFork - ? "User cannot redeem more than the available balance" - : "ERC20: burn amount exceeds balance", - ); - }); - it("should fail with broken arguments", async () => { - // Step 0. Choose tokens - const bAsset = await c_ERC20.at(integrationDetails.aTokens[0].bAsset); - const bAsset_decimals = await bAsset.decimals(); - const amount = new BN(10).pow(bAsset_decimals); - const aToken = await c_AaveAToken.at(integrationDetails.aTokens[0].aToken); - - // 0.1 Get balance before - const bAssetRecipient = sa.dummy1; - const bAssetRecipient_balBefore = await bAsset.balanceOf(bAssetRecipient); - const aaveIntegration_balBefore = await aToken.balanceOf(d_AaveIntegration.address); - - // Fails with ZERO bAsset Address - await expectRevert( - d_AaveIntegration.methods["withdraw(address,address,uint256,bool)"]( - sa.dummy1, - ZERO_ADDRESS, - amount.toString(), - false, - ), - "aToken does not exist", - ); - // Fails with ZERO recipient address - await expectRevert.unspecified( - d_AaveIntegration.methods["withdraw(address,address,uint256,bool)"]( - ZERO_ADDRESS, - bAsset.address, - new BN(1), - false, - ), - ); - // Fails with ZERO Amount - await expectRevert( - d_AaveIntegration.methods["withdraw(address,address,uint256,bool)"]( - sa.dummy1, - bAsset.address, - "0", - false, - ), - "Must withdraw something", - ); - // Succeeds with Incorrect bool (defaults to false) - const tx = await d_AaveIntegration.methods["withdraw(address,address,uint256,bool)"]( - sa.dummy1, - bAsset.address, - amount.toString(), - undefined, - ); - - // 2.1 Check that the recipient receives the tokens - expect(await bAsset.balanceOf(bAssetRecipient)).bignumber.eq( - bAssetRecipient_balBefore.add(amount), - ); - // 2.2 Check that integration aToken balance has gone down - const currentBalance = await aToken.balanceOf(d_AaveIntegration.address); - assertBNSlightlyGTPercent( - currentBalance, - aaveIntegration_balBefore.sub(amount), - "0.0001", - systemMachine.isGanacheFork, - ); - // 2.3 Should give accurate return value - expectEvent(tx.receipt, "PlatformWithdrawal", { - bAsset: bAsset.address, - totalAmount: amount, - userAmount: amount, - }); - }); - it("should fail if the bAsset is not supported", async () => { - // Step 0. Choose tokens - const bAsset = await c_ERC20.at(integrationDetails.cTokens[0].bAsset); - const amount = new BN(10).pow(new BN(12)); - - // Step 1. call withdraw - await expectRevert( - d_AaveIntegration.methods["withdraw(address,address,uint256,bool)"]( - sa.dummy1, - bAsset.address, - amount.toString(), - false, - ), - "aToken does not exist", - ); - }); - }); - - describe("withdraw specific amount", async () => { - describe("and the token does not have transfer fee", async () => { - beforeEach("init mocks", async () => { - await runSetup(false, true); - }); - it("should allow withdrawal of X and give Y to the caller", async () => { - // Step 0. Choose tokens - const bAsset = await c_ERC20.at(integrationDetails.aTokens[0].bAsset); - const bAsset_decimals = await bAsset.decimals(); - const amount = simpleToExactAmount(5, bAsset_decimals); - const totalAmount = amount.muln(2); - const aToken = await c_AaveAToken.at(integrationDetails.aTokens[0].aToken); - // 0.1 Get balance before - const bAssetRecipient = sa.dummy1; - const bAssetRecipient_balBefore = await bAsset.balanceOf(bAssetRecipient); - const aaveIntegration_balBefore = await bAsset.balanceOf(d_AaveIntegration.address); - const aaveBalanceBefore = await d_AaveIntegration.checkBalance.call(bAsset.address); - - // fail if called by non Bm or mAsset - await expectRevert( - d_AaveIntegration.methods["withdraw(address,address,uint256,uint256,bool)"]( - bAssetRecipient, - bAsset.address, - amount, - totalAmount, - false, - { - from: sa.dummy1, - }, - ), - "Not a whitelisted address", - ); - // send the amount - const tx = await d_AaveIntegration.methods[ - "withdraw(address,address,uint256,uint256,bool)" - ](bAssetRecipient, bAsset.address, amount, totalAmount, false); - const bAssetRecipient_balAfter = await bAsset.balanceOf(bAssetRecipient); - const aaveIntegration_balAfter = await bAsset.balanceOf(d_AaveIntegration.address); - const aaveBalanceAfter = await d_AaveIntegration.checkBalance.call(bAsset.address); - expect(bAssetRecipient_balAfter).bignumber.eq( - bAssetRecipient_balBefore.add(amount), - ); - expect(aaveIntegration_balAfter).bignumber.eq( - aaveIntegration_balBefore.add(totalAmount.sub(amount)), - ); - expect(aaveBalanceAfter).bignumber.eq(aaveBalanceBefore.sub(totalAmount)); - // emit the event - expectEvent(tx.receipt, "PlatformWithdrawal", { - bAsset: bAsset.address, - pToken: aToken.address, - totalAmount: totalAmount, - userAmount: amount, - }); - }); - }); - describe("and the token has transfer fees", async () => { - beforeEach("init mocks", async () => { - await runSetup(true, true); - }); - it("should fail if totalAmount != userAmount", async () => { - const bAsset = await c_ERC20.at(integrationDetails.aTokens[1].bAsset); - const bAsset_decimals = await bAsset.decimals(); - const amount = simpleToExactAmount(5, bAsset_decimals); - const totalAmount = amount.muln(2); - await expectRevert( - d_AaveIntegration.methods["withdraw(address,address,uint256,uint256,bool)"]( - sa.dummy1, - bAsset.address, - amount, - totalAmount, - true, - ), - "Cache inactive for assets with fee", - ); - }); - }); - }); - - describe("withdrawRaw", async () => { - beforeEach("init mocks", async () => { - await runSetup(false, true); - }); - it("should fail if caller is not whitelisetd", async () => { - const bAsset = await c_ERC20.at(integrationDetails.aTokens[0].bAsset); - await expectRevert( - d_AaveIntegration.withdrawRaw(sa.dummy3, bAsset.address, new BN(1), { - from: sa.dummy1, - }), - "Not a whitelisted address", - ); - }); - it("should allow the mAsset or BM to withdraw a given bAsset", async () => { - const bAsset = await c_ERC20.at(integrationDetails.aTokens[0].bAsset); - const bAsset_decimals = await bAsset.decimals(); - const amount = simpleToExactAmount(5, bAsset_decimals); - - await bAsset.transfer(d_AaveIntegration.address, amount); - - const bAssetRecipient = sa.dummy1; - const bAssetRecipient_balBefore = await bAsset.balanceOf(bAssetRecipient); - const aaveIntegration_balBefore = await bAsset.balanceOf(d_AaveIntegration.address); - const aaveBalanceBefore = await d_AaveIntegration.checkBalance.call(bAsset.address); - - const tx = await d_AaveIntegration.withdrawRaw(bAssetRecipient, bAsset.address, amount); - - const bAssetRecipient_balAfter = await bAsset.balanceOf(bAssetRecipient); - const aaveIntegration_balAfter = await bAsset.balanceOf(d_AaveIntegration.address); - const aaveBalanceAfter = await d_AaveIntegration.checkBalance.call(bAsset.address); - - // Balances remain the same - expect(bAssetRecipient_balAfter).bignumber.eq(bAssetRecipient_balBefore.add(amount)); - expect(aaveIntegration_balAfter).bignumber.eq(aaveIntegration_balBefore.sub(amount)); - expect(aaveBalanceAfter).bignumber.eq(aaveBalanceBefore); - - // Emits expected event - expectEvent(tx.receipt, "Withdrawal", { - _bAsset: bAsset.address, - _pToken: ZERO_ADDRESS, - _amount: amount, - }); - }); - it("should fail if there is no balance in a given asset", async () => { - const bAsset = await c_ERC20.at(integrationDetails.aTokens[0].bAsset); - await expectRevert( - d_AaveIntegration.withdrawRaw(sa.dummy3, bAsset.address, new BN(1)), - "SafeERC20: low-level call failed", - ); - }); - it("should fail if specified a 0 amount", async () => { - const bAsset = await c_ERC20.at(integrationDetails.aTokens[0].bAsset); - await expectRevert( - d_AaveIntegration.withdrawRaw(sa.dummy3, bAsset.address, new BN(0)), - "Must withdraw something", - ); - }); - }); - - // See deposit and withdraw tests for basic balance checking - describe("checkBalance", async () => { - it("should return balance for any caller when supported token address passed", async () => { - const bAsset = await c_ERC20.at(integrationDetails.aTokens[0].bAsset); - const aToken = await c_AaveAToken.at(integrationDetails.aTokens[0].aToken); - - const aaveIntegration_bal = await aToken.balanceOf(d_AaveIntegration.address); - // Cross that match with the `checkBalance` call - const directBalance = await d_AaveIntegration.checkBalance.call(bAsset.address); - expect(directBalance).bignumber.eq(aaveIntegration_bal); - }); - - // it("should return balance with same precision as bAsset", async () => {}); - // By checking that the aToken balance == balBefore + deposit amount, we are implicitly checking - // that the number of decimals returned from checkbalance is the same - - it("should increase our balance over time and activity", async () => { - // Simulating activity on mainnet only, as our mocks are not capable - if (!systemMachine.isGanacheFork) return; - - // Load things up and do some mints - await runSetup(false, true); - - // 1. Load up our target tokens and get the balances now - const bAsset = await c_ERC20.at(integrationDetails.aTokens[0].bAsset); - const bAsset_decimals = await bAsset.decimals(); - const amount = new BN(10).pow(bAsset_decimals); - const aToken = await c_AaveAToken.at(integrationDetails.aTokens[0].aToken); - // 1.1 Get balance before - const addressProvider = await c_AaveLendingPoolAddressProvider.at( - integrationDetails.aavePlatformAddress, - ); - const aaveIntegration_balBefore = await aToken.balanceOf(d_AaveIntegration.address); - expect(aaveIntegration_balBefore).bignumber.gt(new BN(0) as any); - // Cross that match with the `checkBalance` call - let directBalance = await d_AaveIntegration.checkBalance.call(bAsset.address); - expect(directBalance).bignumber.eq(aaveIntegration_balBefore); - - // 2. Simulate some external activity by depositing or redeeming - // DIRECTlY to the LendingPool. - // Doing this activity should raise our aToken balances slightly - // 2.1. Approve the LendingPool - await bAsset.approve(await addressProvider.getLendingPool(), amount); - const d_lendingPool = await c_AaveLendingPool.at( - await addressProvider.getLendingPool(), - ); - // 2.2. Call the deposit func - await d_lendingPool.deposit(bAsset.address, amount, sa.default, 9999); - // 2.3. Fast forward some time - await time.increase(ONE_WEEK); - // 2.4. Do a redemption - await d_lendingPool.withdraw(bAsset.address, amount, sa.default); - - // 3. Analyse our new balances - const aaveIntegration_balAfter = await aToken.balanceOf(d_AaveIntegration.address); - // Should not go up by more than 2% during this period - assertBNSlightlyGTPercent( - aaveIntegration_balAfter, - aaveIntegration_balBefore, - "1", - true, - ); - // Cross that match with the `checkBalance` call - directBalance = await d_AaveIntegration.checkBalance.call(bAsset.address); - expect(directBalance).bignumber.eq(aaveIntegration_balAfter); - - // 4. Withdraw our new interest - we worked hard for it! - await d_AaveIntegration.methods["withdraw(address,address,uint256,bool)"]( - sa.default, - bAsset.address, - aaveIntegration_balAfter, - false, - ); - }); - it("should fail if called with inactive token", async () => { - const bAsset = await c_ERC20.at(integrationDetails.cTokens[0].bAsset); - - await expectRevert( - d_AaveIntegration.checkBalance(bAsset.address), - "aToken does not exist", - ); - }); - }); - - describe("reApproveAllTokens", async () => { - before("init mocks", async () => { - // Do some mints to mess up the allowances - await runSetup(false, true); - }); - it("should re-approve ALL bAssets with aTokens", async () => { - const bassetsMapped = await d_AaveIntegration.getBassetsMapped(); - expect(bassetsMapped.length).to.be.gt(0 as any); - - const addressProvider = await c_AaveLendingPoolAddressProvider.at( - integrationDetails.aavePlatformAddress, - ); - const approvedAddress = await addressProvider.getLendingPool(); - - await d_AaveIntegration.reApproveAllTokens({ - from: sa.governor, - }); - bassetsMapped.forEach(async (b) => { - const bAsset = await c_MockERC20.at(b); - const balance = await bAsset.allowance(d_AaveIntegration.address, approvedAddress); - expect(balance).bignumber.eq(MAX_UINT256); - const balanceOfSender = await bAsset.allowance( - d_AaveIntegration.address, - sa.governor, - ); - expect(balanceOfSender).bignumber.eq(new BN(0)); - }); - }); - it("should be able to be called multiple times", async () => { - const bassetsMapped = await d_AaveIntegration.getBassetsMapped(); - expect(bassetsMapped.length).to.be.gt(0 as any); - - await d_AaveIntegration.reApproveAllTokens({ - from: sa.governor, - }); - await d_AaveIntegration.reApproveAllTokens({ - from: sa.governor, - }); - }); - it("should only be callable by the Governor", async () => { - await expectRevert( - d_AaveIntegration.reApproveAllTokens({ - from: sa.dummy1, - }), - "Only governor can execute", - ); - }); - it("should fail if lending pool does not exist (mock)", async () => { - // Can only run on local, due to constraints from Aave - if (systemMachine.isGanacheFork) return; - const mockAave = await c_MockAave.at(integrationDetails.aavePlatformAddress); - await mockAave.breakLendingPools(); - // Fails with ZERO Amount - await expectRevert( - d_AaveIntegration.reApproveAllTokens({ from: sa.governor }), - "Lending pool does not exist", - ); - }); - }); -}); diff --git a/test/masset/platform-integrations/TestCompoundIntegration.spec.ts b/test/masset/platform-integrations/TestCompoundIntegration.spec.ts deleted file mode 100644 index cfd8582a..00000000 --- a/test/masset/platform-integrations/TestCompoundIntegration.spec.ts +++ /dev/null @@ -1,1188 +0,0 @@ -/* eslint-disable @typescript-eslint/camelcase */ -/* eslint-disable consistent-return */ - -import { expectEvent, expectRevert, time } from "@openzeppelin/test-helpers"; -import { BN } from "@utils/tools"; -import { assertBNSlightlyGTPercent, assertBNClose, assertBNSlightlyGT } from "@utils/assertions"; -import { StandardAccounts, SystemMachine, MassetMachine } from "@utils/machines"; -import { - MainnetAccounts, - ZERO_ADDRESS, - MAX_UINT256, - fullScale, - ZERO, - ONE_WEEK, -} from "@utils/constants"; - -import envSetup from "@utils/env_setup"; -import { simpleToExactAmount } from "@utils/math"; -import * as t from "types/generated"; -import { BassetIntegrationDetails } from "../../../types"; -import shouldBehaveLikeModule from "../../shared/behaviours/Module.behaviour"; - -const { expect } = envSetup.configure(); - -const c_ERC20 = artifacts.require("ERC20Detailed"); -const c_CERC20 = artifacts.require("ICERC20"); - -const c_MockERC20 = artifacts.require("MockERC20"); -const c_MockCToken = artifacts.require("MockCToken"); - -const c_Nexus = artifacts.require("Nexus"); -const c_DelayedProxyAdmin = artifacts.require("DelayedProxyAdmin"); - -const c_InitializableProxy = artifacts.require("InitializableAdminUpgradeabilityProxy"); -const c_CompoundIntegration = artifacts.require("CompoundIntegration"); - -const convertUnderlyingToCToken = async ( - cToken: t.ICERC20Instance, - underlyingAmount: BN, -): Promise => { - const exchangeRate = await cToken.exchangeRateStored(); - return underlyingAmount.addn(1).mul(fullScale).div(exchangeRate); -}; -const convertCTokenToUnderlying = async ( - cToken: t.ICERC20Instance, - cTokenAmount: BN, -): Promise => { - const exchangeRate = await cToken.exchangeRateStored(); - return cTokenAmount.mul(exchangeRate).div(fullScale); -}; - -contract("CompoundIntegration", async (accounts) => { - const sa = new StandardAccounts(accounts); - const ma = new MainnetAccounts(); - - // No platform specific address for Compound, hence using ZERO_ADDRESS - const compoundPlatformAddress = ZERO_ADDRESS; - - let systemMachine: SystemMachine; - let nexus: t.NexusInstance; - let massetMachine: MassetMachine; - - let integrationDetails: BassetIntegrationDetails; - let d_DelayedProxyAdmin: t.DelayedProxyAdminInstance; - let d_CompoundIntegrationProxy: t.InitializableAdminUpgradeabilityProxyInstance; - let d_CompoundIntegration: t.CompoundIntegrationInstance; - - const ctx: { module?: t.InitializableModuleInstance } = {}; - - before("base init", async () => { - systemMachine = new SystemMachine(sa.all); - massetMachine = systemMachine.massetMachine; - - await runSetup(); - }); - - const runSetup = async (enableUSDTFee = false, simulateMint = false) => { - // SETUP - // ====== - nexus = await c_Nexus.new(sa.governor); - // Init proxyAdmin - d_DelayedProxyAdmin = await c_DelayedProxyAdmin.new(nexus.address); - // Initialize the proxy - d_CompoundIntegrationProxy = await c_InitializableProxy.new(); - d_CompoundIntegration = await c_CompoundIntegration.at(d_CompoundIntegrationProxy.address); - - // Load network specific integration data - integrationDetails = await massetMachine.loadBassets(enableUSDTFee); - - // Initialize the proxy storage - const compoundImplementation = await c_CompoundIntegration.new(); - - const initializationData_CompoundIntegration: string = compoundImplementation.contract.methods - .initialize( - nexus.address, - [sa.default], - compoundPlatformAddress, - integrationDetails.cTokens.map((c) => c.bAsset), - integrationDetails.cTokens.map((c) => c.cToken), - ) - .encodeABI(); - await d_CompoundIntegrationProxy.methods["initialize(address,address,bytes)"]( - compoundImplementation.address, - d_DelayedProxyAdmin.address, - initializationData_CompoundIntegration, - ); - - await nexus.initialize( - [web3.utils.keccak256("ProxyAdmin")], - [d_DelayedProxyAdmin.address], - [true], - sa.governor, - { from: sa.governor }, - ); - - if (simulateMint) { - await Promise.all( - integrationDetails.cTokens.map(async ({ bAsset, cToken }) => { - // Step 0. Choose tokens - const d_bAsset = await c_ERC20.at(bAsset); - const bAsset_decimals = await d_bAsset.decimals(); - const amount = new BN(enableUSDTFee ? 101 : 100).mul( - new BN(10).pow(bAsset_decimals.sub(new BN(1))), - ); - const amount_dep = new BN(10).mul(new BN(10).pow(bAsset_decimals)); - - // Step 1. xfer tokens to integration - await d_bAsset.transfer(d_CompoundIntegration.address, amount); - - // Step 2. call deposit - return d_CompoundIntegration.deposit(bAsset, amount_dep, true); - }), - ); - } - - ctx.module = d_CompoundIntegration; - }; - - describe("initializing CompoundIntegration", async () => { - describe("verifying GovernableWhitelist initialization", async () => { - describe("verifying InitializableModule initialization", async () => { - shouldBehaveLikeModule(ctx as Required, sa); - - it("should properly store valid arguments", async () => { - // Check for nexus addr - expect(await d_CompoundIntegration.nexus()).eq(nexus.address); - }); - }); - - it("should properly store valid arguments", async () => { - // check for whitelisted accs - const whitelisted = await d_CompoundIntegration.whitelist(sa.default); - expect(whitelisted).eq(true); - // check for non whitelisted accs - const notWhitelisted = await d_CompoundIntegration.whitelist(sa.dummy4); - expect(notWhitelisted).eq(false); - const notWhitelisted2 = await d_CompoundIntegration.whitelist(sa.governor); - expect(notWhitelisted2).eq(false); - }); - it("should fail when empty whitelisted array", async () => { - const tempImpl = await c_CompoundIntegration.new(); - const erc20Mock = await c_MockERC20.new("TMP", "TMP", 18, sa.default, "1000000"); - const aTokenMock = await c_MockCToken.new(erc20Mock.address); - await expectRevert( - tempImpl.initialize( - nexus.address, - [], - sa.other, - [erc20Mock.address], - [aTokenMock.address], - ), - "Empty whitelist array", - ); - }); - - it("should fail when whitelisted address is zero or duplicate", async () => { - const tempImpl = await c_CompoundIntegration.new(); - const erc20Mock = await c_MockERC20.new("TMP", "TMP", 18, sa.default, "1000000"); - const aTokenMock = await c_MockCToken.new(erc20Mock.address); - await expectRevert( - tempImpl.initialize( - nexus.address, - [sa.dummy1, sa.dummy1], - compoundPlatformAddress, - [erc20Mock.address], - [aTokenMock.address], - ), - "Already whitelisted", - ); - await expectRevert( - tempImpl.initialize( - nexus.address, - [ZERO_ADDRESS], - compoundPlatformAddress, - [erc20Mock.address], - [aTokenMock.address], - ), - "Address is zero", - ); - }); - }); - - it("should properly store valid arguments", async () => { - // check for platform addr - expect(compoundPlatformAddress).eq(await d_CompoundIntegration.platformAddress()); - - // check for pTokens added & events - expect(integrationDetails.cTokens[0].cToken).eq( - await d_CompoundIntegration.bAssetToPToken(integrationDetails.cTokens[0].bAsset), - ); - - expect(integrationDetails.cTokens[1].cToken).eq( - await d_CompoundIntegration.bAssetToPToken(integrationDetails.cTokens[1].bAsset), - ); - }); - - it("should pre-approve spending of the passed bAssets", async () => { - await Promise.all( - integrationDetails.cTokens.map(async ({ bAsset, cToken }) => { - const d_bAsset = await c_ERC20.at(bAsset); - const balance = await d_bAsset.allowance(d_CompoundIntegration.address, cToken); - expect(balance).bignumber.eq(MAX_UINT256); - }), - ); - }); - - it("should fail when called again", async () => { - const tempImpl = await c_CompoundIntegration.new(); - const erc20Mock = await c_MockERC20.new("TMP", "TMP", 18, sa.default, "1000000"); - const aTokenMock = await c_MockCToken.new(erc20Mock.address); - await tempImpl.initialize( - nexus.address, - [sa.dummy1], - compoundPlatformAddress, - [erc20Mock.address], - [aTokenMock.address], - ); - await expectRevert( - tempImpl.initialize( - nexus.address, - [sa.dummy1], - compoundPlatformAddress, - [erc20Mock.address], - [aTokenMock.address], - ), - "Contract instance has already been initialized", - ); - }); - - it("should fail if passed incorrect data", async () => { - const tempImpl = await c_CompoundIntegration.new(); - const erc20Mock = await c_MockERC20.new("TMP", "TMP", 18, sa.default, "1000000"); - const aTokenMock = await c_MockCToken.new(erc20Mock.address); - - // bAsset and pToken array length are different - await expectRevert( - tempImpl.initialize( - nexus.address, - [sa.dummy1, sa.dummy2], - compoundPlatformAddress, - [erc20Mock.address], - [aTokenMock.address, aTokenMock.address], - ), - "Invalid input arrays", - ); - // pToken address is zero - await expectRevert( - tempImpl.initialize( - nexus.address, - [sa.dummy1, sa.dummy2], - compoundPlatformAddress, - [erc20Mock.address], - [ZERO_ADDRESS], - ), - "Invalid addresses", - ); - // duplicate pToken or bAsset - await expectRevert( - tempImpl.initialize( - nexus.address, - [sa.dummy1, sa.dummy2], - compoundPlatformAddress, - [erc20Mock.address, erc20Mock.address], - [aTokenMock.address, sa.default], - ), - "pToken already set", - ); - // invalid bAsset addresses - await expectRevert.unspecified( - tempImpl.initialize( - nexus.address, - [sa.dummy1, sa.dummy2], - compoundPlatformAddress, - [sa.default], - [aTokenMock.address], - ), - ); - }); - }); - - describe("setting P Token Address", async () => { - let erc20Mock: t.MockERC20Instance; - let cTokenMock: t.MockCTokenInstance; - beforeEach("init mocks", async () => { - erc20Mock = await c_MockERC20.new("TMP", "TMP", 18, sa.default, "1000000"); - cTokenMock = await c_MockCToken.new(erc20Mock.address); - await runSetup(); - }); - - it("should pass only when function called by the Governor", async () => { - await expectRevert( - d_CompoundIntegration.setPTokenAddress(erc20Mock.address, cTokenMock.address, { - from: sa.default, - }), - "Only governor can execute", - ); - await d_CompoundIntegration.setPTokenAddress(erc20Mock.address, cTokenMock.address, { - from: sa.governor, - }); - expect(cTokenMock.address).eq( - await d_CompoundIntegration.bAssetToPToken(erc20Mock.address), - ); - }); - - it("should approve the spending of the bAsset correctly and emit event", async () => { - await d_CompoundIntegration.setPTokenAddress(erc20Mock.address, cTokenMock.address, { - from: sa.governor, - }); - expect(cTokenMock.address).eq( - await d_CompoundIntegration.bAssetToPToken(erc20Mock.address), - ); - - const approvedAddress = cTokenMock.address; - const balance = await erc20Mock.allowance( - d_CompoundIntegration.address, - approvedAddress, - ); - expect(balance).bignumber.eq(MAX_UINT256 as any); - }); - - it("should fail when passed invalid args", async () => { - // bAsset address is zero - await expectRevert( - d_CompoundIntegration.setPTokenAddress(ZERO_ADDRESS, cTokenMock.address, { - from: sa.governor, - }), - "Invalid addresses", - ); - // pToken address is zero - await expectRevert( - d_CompoundIntegration.setPTokenAddress(erc20Mock.address, ZERO_ADDRESS, { - from: sa.governor, - }), - "Invalid addresses", - ); - // pToken address already assigned for a bAsset - await d_CompoundIntegration.setPTokenAddress(erc20Mock.address, cTokenMock.address, { - from: sa.governor, - }); - await expectRevert( - d_CompoundIntegration.setPTokenAddress(erc20Mock.address, sa.default, { - from: sa.governor, - }), - "pToken already set", - ); - }); - }); - - describe("calling deposit", async () => { - beforeEach("init mocks", async () => { - await runSetup(); - }); - - it("should deposit tokens to Compound", async () => { - // Step 0. Choose tokens - const bAsset = await c_ERC20.at(integrationDetails.cTokens[0].bAsset); - const amount = new BN(10).pow(await bAsset.decimals()); - const cToken = await c_CERC20.at(integrationDetails.cTokens[0].cToken); - - const user_bAsset_balanceBefore = await bAsset.balanceOf(sa.default); - const bAssetRecipient_balBefore = await bAsset.balanceOf(cToken.address); - - // Step 1. xfer tokens to integration - await bAsset.transfer(d_CompoundIntegration.address, amount); - expect(user_bAsset_balanceBefore.sub(amount)).to.bignumber.equal( - await bAsset.balanceOf(sa.default), - ); - - // Step 2. call deposit - const tx = await d_CompoundIntegration.deposit(bAsset.address, amount, false); - - // Step 3. Check for things: - // 3.1 Check that compound integration has cTokens - const cToken_balanceOfIntegration = await cToken.balanceOf( - d_CompoundIntegration.address, - ); - expect(await convertUnderlyingToCToken(cToken, amount)).to.bignumber.equal( - cToken_balanceOfIntegration, - ); - // 3.2 Check that cToken has bAssets - expect(await bAsset.balanceOf(cToken.address)).bignumber.eq( - bAssetRecipient_balBefore.add(amount), - ); - - expectEvent(tx.receipt, "Deposit", { _amount: amount }); - }); - - it("should handle the fee calculations", async () => { - // Step 0. Choose tokens and set up env - await runSetup(true); - - const bAsset = await c_ERC20.at(integrationDetails.cTokens[1].bAsset); - const bAsset_decimals = await bAsset.decimals(); - const amount = new BN(10).pow(bAsset_decimals); - const cToken = await c_CERC20.at(integrationDetails.cTokens[1].cToken); - - // 0.1 Get balance before - const bAssetRecipient = cToken.address; - const bAssetRecipient_balBefore = await bAsset.balanceOf(bAssetRecipient); - const compoundIntegration_balBefore = await cToken.balanceOf( - d_CompoundIntegration.address, - ); - - // Step 1. xfer tokens to integration - const bal1 = await bAsset.balanceOf(d_CompoundIntegration.address); - const transferTx = await bAsset.transfer(d_CompoundIntegration.address, amount); - - const bal2 = await bAsset.balanceOf(d_CompoundIntegration.address); - const receivedAmount = bal2.sub(bal1); - // Ensure fee is being deducted - expect(receivedAmount).bignumber.lt(amount as any); - // fee = initialAmount - receivedAmount - const fee = amount.sub(receivedAmount); - // feeRate = fee/amount (base 1e18) - const feeRate = fee.mul(fullScale).div(amount); - // expectedDepoit = receivedAmount - (receivedAmount*feeRate) - const expectedDeposit = receivedAmount.sub(receivedAmount.mul(feeRate).div(fullScale)); - - // Step 2. call deposit - const depositTx = await d_CompoundIntegration.deposit( - bAsset.address, - receivedAmount, - true, - ); - - // Step 3. Check for things: - // 3.1 Check that cToken has bAssets - expect(await bAsset.balanceOf(bAssetRecipient)).bignumber.eq( - bAssetRecipient_balBefore.add(expectedDeposit), - ); - // 3.2 Check that compound integration has cTokens - const compoundIntegration_balAfter = await cToken.balanceOf( - d_CompoundIntegration.address, - ); - const expected_cTokens = await convertUnderlyingToCToken(cToken, receivedAmount); - assertBNSlightlyGTPercent(compoundIntegration_balAfter, expected_cTokens, "0.01"); - - // 3.3 Check that return value is cool (via event) - const receivedUnderlying = await convertCTokenToUnderlying( - cToken, - compoundIntegration_balAfter, - ); - - const min = receivedAmount.lt(receivedUnderlying) ? receivedAmount : receivedUnderlying; - expectEvent(depositTx.receipt, "Deposit", { _amount: min }); - }); - - it("should only allow a whitelisted user to call function", async () => { - // Step 0. Choose tokens - const bAsset = await c_ERC20.at(integrationDetails.aTokens[1].bAsset); - const amount = new BN(10).pow(new BN(await bAsset.decimals())); - - // Step 1. call deposit - await expectRevert( - d_CompoundIntegration.deposit(bAsset.address, amount, false, { - from: sa.dummy1, - }), - "Not a whitelisted address", - ); - }); - - it("should fail if the bAsset is not supported", async () => { - // Step 0. Choose tokens - const bAsset = await c_ERC20.at(integrationDetails.aTokens[0].bAsset); - const amount = new BN(10).pow(await bAsset.decimals()); - - // Step 1. call deposit - await expectRevert( - d_CompoundIntegration.deposit(bAsset.address, amount, false), - "cToken does not exist", - ); - }); - - it("should fail if we do not first pass the required bAsset", async () => { - // Step 0. Choose tokens - const bAsset = await c_ERC20.at(integrationDetails.cTokens[0].bAsset); - const amount = new BN(10).pow(new BN(await bAsset.decimals())); - - // Step 2. call deposit - await expectRevert( - d_CompoundIntegration.deposit(bAsset.address, amount, false), - "ERC20: transfer amount exceeds balance", - ); - }); - - it("should fail if we try to deposit too much", async () => { - const bAsset = await c_ERC20.at(integrationDetails.cTokens[1].bAsset); - const bAsset_decimals = await bAsset.decimals(); - const amount = new BN(10).mul(new BN(10).pow(bAsset_decimals)); - const amount_high = new BN(11).mul(new BN(10).pow(bAsset_decimals)); - - // Step 1. xfer low tokens to integration - await bAsset.transfer(d_CompoundIntegration.address, amount.toString()); - expect(await bAsset.balanceOf(d_CompoundIntegration.address)).bignumber.lte( - amount as any, - ); - // Step 2. call deposit with high tokens - await expectRevert( - d_CompoundIntegration.deposit(bAsset.address, amount_high.toString(), false), - "ERC20: transfer amount exceeds balance", - ); - }); - - it("should fail with broken arguments", async () => { - // Step 0. Choose tokens - const bAsset = await c_ERC20.at(integrationDetails.cTokens[0].bAsset); - const bAsset_decimals = await bAsset.decimals(); - const amount = new BN(10).pow(bAsset_decimals); - const cToken = await c_CERC20.at(integrationDetails.cTokens[0].cToken); - - // 0.1 Get balance before - const bAssetRecipient = cToken.address; - const bAssetRecipient_balBefore = await bAsset.balanceOf(bAssetRecipient); - const compoundIntegration_balBefore = await cToken.balanceOf( - d_CompoundIntegration.address, - ); - - // Step 1. xfer low tokens to integration - await bAsset.transfer(d_CompoundIntegration.address, amount); - - // Fails with ZERO bAsset Address - await expectRevert( - d_CompoundIntegration.deposit(ZERO_ADDRESS, amount, false), - "cToken does not exist", - ); - // Fails with ZERO Amount - await expectRevert( - d_CompoundIntegration.deposit(bAsset.address, "0", false), - "Must deposit something", - ); - // Succeeds with Incorrect bool (defaults to false) - const tx = await d_CompoundIntegration.deposit(bAsset.address, amount, undefined); - - // Step 3. Check for things: - // 3.1 Check that cToken has bAssets - expect(await bAsset.balanceOf(bAssetRecipient)).bignumber.eq( - bAssetRecipient_balBefore.add(amount), - ); - // 3.2 Check that compound integration has cTokens - const cToken_balanceOfIntegration = await cToken.balanceOf( - d_CompoundIntegration.address, - ); - const expected_cTokens = await convertUnderlyingToCToken(cToken, amount); - expect(expected_cTokens).to.bignumber.equal(cToken_balanceOfIntegration); - - // 3.3 Check that return value is cool (via event) - expectEvent(tx.receipt, "Deposit", { _amount: amount }); - }); - }); - - describe("withdraw", () => { - beforeEach("init mocks", async () => { - await runSetup(); - }); - - it("should withdraw tokens from Compound", async () => { - // Step 0. Choose tokens - const bAsset = await c_ERC20.at(integrationDetails.cTokens[0].bAsset); - const amount = new BN(10).pow(await bAsset.decimals()); - const cToken = await c_CERC20.at(integrationDetails.cTokens[0].cToken); - - const user_bAsset_balanceBefore = await bAsset.balanceOf(sa.default); - const bAssetRecipient_balBefore = await bAsset.balanceOf(cToken.address); - - // Step 1. xfer tokens to integration - await bAsset.transfer(d_CompoundIntegration.address, amount); - - expect(user_bAsset_balanceBefore.sub(amount)).to.bignumber.equal( - await bAsset.balanceOf(sa.default), - ); - - // Step 2. call deposit - const tx = await d_CompoundIntegration.deposit(bAsset.address, amount, false); - - // Step 3. Check for things: - // 3.1 Check that cToken has bAssets - expect(await bAsset.balanceOf(cToken.address)).bignumber.eq( - bAssetRecipient_balBefore.add(amount), - ); - // 3.2 Check that compound integration has cTokens - const cToken_balanceOfIntegration = await cToken.balanceOf( - d_CompoundIntegration.address, - ); - const exchangeRate = await cToken.exchangeRateStored(); - const expected_cTokens = amount - .addn(1) - .mul(fullScale) - .div(exchangeRate); - expect(expected_cTokens).to.bignumber.equal(cToken_balanceOfIntegration); - - expectEvent(tx.receipt, "Deposit", { _amount: amount }); - - // 4. Call withdraw - await d_CompoundIntegration.methods["withdraw(address,address,uint256,bool)"]( - sa.default, - bAsset.address, - amount, - false, - ); - const expected_cTokenWithdrawal = await convertUnderlyingToCToken(cToken, amount); - - // 5. Check stuff - // 5.1 Check that bAsset has returned to the user - const user_bAsset_balanceAfter = await bAsset.balanceOf(sa.default); - expect(user_bAsset_balanceAfter).to.bignumber.equal(user_bAsset_balanceBefore); - - // 5.2 Check that bAsset has returned to the user - const cToken_balanceOfIntegrationAfter = await cToken.balanceOf( - d_CompoundIntegration.address, - ); - expect(cToken_balanceOfIntegrationAfter).bignumber.eq( - cToken_balanceOfIntegration.sub(expected_cTokenWithdrawal), - ); - }); - context("and specifying a minute amount of bAsset", () => { - beforeEach(async () => { - await runSetup(false, true); - }); - it("should withdraw 0 if the cToken amount is 0", async () => { - // Step 0. Choose tokens - const bAsset = await c_ERC20.at(integrationDetails.cTokens[0].bAsset); - const amount = new BN(1); - const cToken = await c_CERC20.at(integrationDetails.cTokens[0].cToken); - - const recipientBassetBalBefore = await bAsset.balanceOf(sa.default); - const integrationCTokenBalanceBefore = await cToken.balanceOf( - d_CompoundIntegration.address, - ); - - const cTokenAmount = await convertUnderlyingToCToken(cToken, amount); - expect(cTokenAmount).bignumber.eq(new BN(0), "cToken amount is not 0"); - - const tx = await d_CompoundIntegration.methods[ - "withdraw(address,address,uint256,bool)" - ](sa.default, bAsset.address, amount, false); - - expectEvent(tx.receipt, "SkippedWithdrawal", { - bAsset: bAsset.address, - amount, - }); - - // recipient bAsset bal is the same - const recipientBassetBalAfter = await bAsset.balanceOf(sa.default); - expect(recipientBassetBalBefore).bignumber.eq(recipientBassetBalAfter); - // compoundIntegration cTokenBal is the same - const integrationCTokenBalanceAfter = await cToken.balanceOf( - d_CompoundIntegration.address, - ); - expect(integrationCTokenBalanceBefore).bignumber.eq(integrationCTokenBalanceAfter); - }); - it("should function normally if bAsset decimals are low", async () => { - // Step 0. Choose tokens - const bAsset = await c_ERC20.at(integrationDetails.cTokens[1].bAsset); - const amount = new BN(1); - const cToken = await c_CERC20.at(integrationDetails.cTokens[1].cToken); - - expect(await bAsset.decimals()).bignumber.eq(new BN(6)); - - const recipientBassetBalBefore = await bAsset.balanceOf(sa.default); - const integrationCTokenBalanceBefore = await cToken.balanceOf( - d_CompoundIntegration.address, - ); - - const cTokenAmount = await convertUnderlyingToCToken(cToken, amount); - expect(cTokenAmount).bignumber.gt(new BN(0) as any, "cToken amount is 0"); - - const tx = await d_CompoundIntegration.methods[ - "withdraw(address,address,uint256,bool)" - ](sa.default, bAsset.address, amount, false); - - expectEvent(tx.receipt, "PlatformWithdrawal", { - bAsset: bAsset.address, - pToken: cToken.address, - totalAmount: amount, - userAmount: amount, - }); - - // recipient bAsset bal is the same - const recipientBassetBalAfter = await bAsset.balanceOf(sa.default); - expect(recipientBassetBalAfter).bignumber.eq(recipientBassetBalBefore.add(amount)); - // compoundIntegration cTokenBal is the same - const integrationCTokenBalanceAfter = await cToken.balanceOf( - d_CompoundIntegration.address, - ); - expect(integrationCTokenBalanceAfter).bignumber.eq( - integrationCTokenBalanceBefore.sub(cTokenAmount), - ); - }); - }); - - it("should handle the fee calculations", async () => { - await runSetup(true, true); - - // should deduct the transfer fee from the return value - const bAsset = await c_ERC20.at(integrationDetails.cTokens[1].bAsset); - const bAsset_decimals = await bAsset.decimals(); - const amount = new BN(10).pow(bAsset_decimals); - const cToken = await c_CERC20.at(integrationDetails.cTokens[1].cToken); - - // 0.1 Get balance before - const bAssetRecipient = sa.dummy1; - const bAssetRecipient_balBefore = await bAsset.balanceOf(bAssetRecipient); - const compoundIntegration_balBefore = await cToken.balanceOf( - d_CompoundIntegration.address, - ); - - // Step 1. call withdraw - const tx = await d_CompoundIntegration.methods[ - "withdraw(address,address,uint256,bool)" - ](bAssetRecipient, bAsset.address, amount, true); - const bAssetRecipient_balAfter = await bAsset.balanceOf(bAssetRecipient); - const compoundIntegration_balAfter = await cToken.balanceOf( - d_CompoundIntegration.address, - ); - - // 99% of amt - const scale = simpleToExactAmount("0.99", 18); - const amountScaled = amount.mul(scale); - const expectedAmount = amountScaled.div(fullScale); - // Step 2. Validate recipient - expect(bAssetRecipient_balAfter).bignumber.gte( - bAssetRecipient_balBefore.add(expectedAmount) as any, - ); - expect(bAssetRecipient_balAfter).bignumber.lte( - bAssetRecipient_balBefore.add(amount) as any, - ); - expect(compoundIntegration_balAfter).bignumber.eq( - compoundIntegration_balBefore.sub( - await convertUnderlyingToCToken(cToken, amount), - ) as any, - ); - const expectedBalance = compoundIntegration_balBefore.sub( - await convertUnderlyingToCToken(cToken, amount), - ); - assertBNSlightlyGTPercent(compoundIntegration_balAfter, expectedBalance, "0.1"); - const underlyingBalance = await convertCTokenToUnderlying( - cToken, - compoundIntegration_balAfter, - ); - // Cross that match with the `checkBalance` call - const fetchedBalance = await d_CompoundIntegration.checkBalance.call(bAsset.address); - expect(fetchedBalance).bignumber.eq(underlyingBalance); - }); - - it("should only allow a whitelisted user to call function", async () => { - // Step 0. Choose tokens - const bAsset = await c_ERC20.at(integrationDetails.cTokens[0].bAsset); - const amount = new BN(10).pow(await bAsset.decimals()); - - // Step 1. call deposit - await expectRevert( - d_CompoundIntegration.methods["withdraw(address,address,uint256,bool)"]( - sa.dummy1, - bAsset.address, - amount, - false, - { - from: sa.dummy1, - }, - ), - "Not a whitelisted address", - ); - }); - - it("should fail if there is insufficient balance", async () => { - // Step 0. Choose tokens - const bAsset = await c_ERC20.at(integrationDetails.cTokens[0].bAsset); - const bAsset_decimals = await bAsset.decimals(); - const amount = new BN(1000).mul(new BN(10).pow(bAsset_decimals)); - - // Step 1. call deposit - await expectRevert( - d_CompoundIntegration.methods["withdraw(address,address,uint256,bool)"]( - sa.default, - bAsset.address, - amount, - false, - ), - "ERC20: burn amount exceeds balance", - ); - }); - - it("should fail with broken arguments", async () => { - // Step 0. Choose tokens - const bAsset = await c_ERC20.at(integrationDetails.cTokens[0].bAsset); - const bAsset_decimals = await bAsset.decimals(); - const amount = new BN(10).pow(bAsset_decimals); - const cToken = await c_CERC20.at(integrationDetails.cTokens[0].cToken); - - // 0.1 Get balance before - const bAssetRecipient = sa.dummy1; - - // Fails with ZERO bAsset Address - await expectRevert( - d_CompoundIntegration.methods["withdraw(address,address,uint256,bool)"]( - sa.dummy1, - ZERO_ADDRESS, - amount, - false, - ), - "cToken does not exist", - ); - - // Fails with ZERO recipient address - await expectRevert( - d_CompoundIntegration.methods["withdraw(address,address,uint256,bool)"]( - ZERO_ADDRESS, - bAsset.address, - new BN(1), - false, - ), - "Must specify recipient", - ); - - // Fails with ZERO Amount - await expectRevert( - d_CompoundIntegration.methods["withdraw(address,address,uint256,bool)"]( - sa.dummy1, - bAsset.address, - "0", - false, - ), - "Must withdraw something", - ); - - expect(ZERO).to.bignumber.equal(await bAsset.balanceOf(bAssetRecipient)); - - expect(ZERO).to.bignumber.equal(await cToken.balanceOf(d_CompoundIntegration.address)); - }); - - it("should fail if the bAsset is not supported", async () => { - // Step 0. Choose tokens - const bAsset = await c_ERC20.at(integrationDetails.aTokens[0].bAsset); - const amount = new BN(10).pow(await bAsset.decimals()); - - // Step 1. call withdraw - await expectRevert( - d_CompoundIntegration.methods["withdraw(address,address,uint256,bool)"]( - sa.dummy1, - bAsset.address, - amount, - false, - ), - "cToken does not exist", - ); - }); - }); - - describe("withdraw specific amount", async () => { - describe("and the token does not have transfer fee", async () => { - beforeEach("init mocks", async () => { - await runSetup(false, true); - }); - it("should allow withdrawal of X and give Y to the caller", async () => { - // Step 0. Choose tokens - const bAsset = await c_ERC20.at(integrationDetails.cTokens[0].bAsset); - const bAsset_decimals = await bAsset.decimals(); - const amount = simpleToExactAmount(5, bAsset_decimals); - const totalAmount = amount.muln(2); - const aToken = await c_MockCToken.at(integrationDetails.cTokens[0].cToken); - // 0.1 Get balance before - const bAssetRecipient = sa.dummy1; - const bAssetRecipient_balBefore = await bAsset.balanceOf(bAssetRecipient); - const compoundIntegration_balBefore = await bAsset.balanceOf( - d_CompoundIntegration.address, - ); - const compoundBalanceBefore = await d_CompoundIntegration.checkBalance.call( - bAsset.address, - ); - - // fail if called by non Bm or mAsset - await expectRevert( - d_CompoundIntegration.methods["withdraw(address,address,uint256,uint256,bool)"]( - bAssetRecipient, - bAsset.address, - amount, - totalAmount, - false, - { - from: sa.dummy1, - }, - ), - "Not a whitelisted address", - ); - // send the amount - const tx = await d_CompoundIntegration.methods[ - "withdraw(address,address,uint256,uint256,bool)" - ](bAssetRecipient, bAsset.address, amount, totalAmount, false); - const bAssetRecipient_balAfter = await bAsset.balanceOf(bAssetRecipient); - const compoundIntegration_balAfter = await bAsset.balanceOf( - d_CompoundIntegration.address, - ); - const compoundBalanceAfter = await d_CompoundIntegration.checkBalance.call( - bAsset.address, - ); - expect(bAssetRecipient_balAfter).bignumber.eq( - bAssetRecipient_balBefore.add(amount), - ); - expect(compoundIntegration_balAfter).bignumber.eq( - compoundIntegration_balBefore.add(totalAmount.sub(amount)), - ); - const dust = compoundBalanceBefore.muln(1).divn(1000); - assertBNSlightlyGT( - compoundBalanceAfter, - compoundBalanceBefore.sub(totalAmount), - dust, - false, - ); - // emit the event - expectEvent(tx.receipt, "PlatformWithdrawal", { - bAsset: bAsset.address, - pToken: aToken.address, - totalAmount: totalAmount, - userAmount: amount, - }); - }); - }); - describe("and the token has transfer fees", async () => { - beforeEach("init mocks", async () => { - await runSetup(true, true); - }); - it("should fail if totalAmount != userAmount", async () => { - const bAsset = await c_ERC20.at(integrationDetails.cTokens[1].bAsset); - const bAsset_decimals = await bAsset.decimals(); - const amount = simpleToExactAmount(5, bAsset_decimals); - const totalAmount = amount.muln(2); - await expectRevert( - d_CompoundIntegration.methods["withdraw(address,address,uint256,uint256,bool)"]( - sa.dummy1, - bAsset.address, - amount, - totalAmount, - true, - ), - "Cache inactive for assets with fee", - ); - }); - }); - }); - - describe("withdrawRaw", async () => { - beforeEach("init mocks", async () => { - await runSetup(false, true); - }); - it("should fail if caller is not whitelisetd", async () => { - const bAsset = await c_ERC20.at(integrationDetails.cTokens[0].bAsset); - await expectRevert( - d_CompoundIntegration.withdrawRaw(sa.dummy3, bAsset.address, new BN(1), { - from: sa.dummy1, - }), - "Not a whitelisted address", - ); - }); - it("should allow the mAsset or BM to withdraw a given bAsset", async () => { - const bAsset = await c_ERC20.at(integrationDetails.cTokens[0].bAsset); - const bAsset_decimals = await bAsset.decimals(); - const amount = simpleToExactAmount(5, bAsset_decimals); - - await bAsset.transfer(d_CompoundIntegration.address, amount); - - const bAssetRecipient = sa.dummy1; - const bAssetRecipient_balBefore = await bAsset.balanceOf(bAssetRecipient); - const compoundIntegration_balBefore = await bAsset.balanceOf( - d_CompoundIntegration.address, - ); - const compoundBalanceBefore = await d_CompoundIntegration.checkBalance.call( - bAsset.address, - ); - - const tx = await d_CompoundIntegration.withdrawRaw( - bAssetRecipient, - bAsset.address, - amount, - ); - - const bAssetRecipient_balAfter = await bAsset.balanceOf(bAssetRecipient); - const compoundIntegration_balAfter = await bAsset.balanceOf( - d_CompoundIntegration.address, - ); - const compoundBalanceAfter = await d_CompoundIntegration.checkBalance.call( - bAsset.address, - ); - - // Balances remain the same - expect(bAssetRecipient_balAfter).bignumber.eq(bAssetRecipient_balBefore.add(amount)); - expect(compoundIntegration_balAfter).bignumber.eq( - compoundIntegration_balBefore.sub(amount), - ); - expect(compoundBalanceAfter).bignumber.eq(compoundBalanceBefore); - - // Emits expected event - expectEvent(tx.receipt, "Withdrawal", { - _bAsset: bAsset.address, - _pToken: ZERO_ADDRESS, - _amount: amount, - }); - }); - it("should fail if there is no balance in a given asset", async () => { - const bAsset = await c_ERC20.at(integrationDetails.cTokens[0].bAsset); - await expectRevert( - d_CompoundIntegration.withdrawRaw(sa.dummy3, bAsset.address, new BN(1)), - "SafeERC20: low-level call failed", - ); - }); - it("should fail if specified a 0 amount", async () => { - const bAsset = await c_ERC20.at(integrationDetails.cTokens[0].bAsset); - await expectRevert( - d_CompoundIntegration.withdrawRaw(sa.dummy3, bAsset.address, new BN(0)), - "Must withdraw something", - ); - }); - }); - - describe("checkBalance", async () => { - beforeEach(async () => { - await runSetup(false, true); - }); - it("should return balance for any caller when supported token address passed", async () => { - const bAsset = await c_ERC20.at(integrationDetails.cTokens[0].bAsset); - - const expectedBal = new BN(10).mul(new BN(10).pow(await bAsset.decimals())); - - const fetchedBalance = await d_CompoundIntegration.checkBalance.call(bAsset.address); - - assertBNClose(fetchedBalance, expectedBal, new BN(100)); - }); - - it("should increase our balance over time and activity", async () => { - // Simulating activity on mainnet only, as our mocks are not capable - if (!systemMachine.isGanacheFork) return; - - // Load things up and do some mints - await runSetup(false, true); - - // 1. Load up our target tokens and get the balances now - const bAsset = await c_ERC20.at(integrationDetails.cTokens[0].bAsset); - const bAsset_decimals = await bAsset.decimals(); - const amount = new BN(10).pow(bAsset_decimals); - const cToken = await c_CERC20.at(integrationDetails.cTokens[0].cToken); - - const compoundIntegration_balBefore = await cToken.balanceOf( - d_CompoundIntegration.address, - ); - expect(compoundIntegration_balBefore).bignumber.gt(new BN(0) as any); - const underlyingBalanceBefore = await convertCTokenToUnderlying( - cToken, - compoundIntegration_balBefore, - ); - // Cross that match with the `checkBalance` call - const fetchedBalanceBefore = await d_CompoundIntegration.checkBalance.call( - bAsset.address, - ); - expect(fetchedBalanceBefore).bignumber.eq(underlyingBalanceBefore); - - // 2. Simulate some external activity by depositing or redeeming - // DIRECTlY to the LendingPool. - // Doing this activity should raise our aToken balances slightly - // 2.1. Approve the LendingPool Core - await bAsset.approve(cToken.address, amount); - - // 2.2. Call the deposit func - await cToken.mint(amount); - // 2.3. Fast forward some time - await time.increase(ONE_WEEK); - // 2.4. Do a redemption - await cToken.redeemUnderlying(amount); - - // 3. Analyse our new balances - const compoundIntegration_balAfter = await cToken.balanceOf( - d_CompoundIntegration.address, - ); - // Should not go up by more than 2% during this period - const underlyingBalanceAfter = await convertCTokenToUnderlying( - cToken, - compoundIntegration_balAfter, - ); - assertBNSlightlyGTPercent(underlyingBalanceAfter, underlyingBalanceBefore, "2", true); - // Cross that match with the `checkBalance` call - const fetchedBalance = await d_CompoundIntegration.checkBalance.call(bAsset.address); - expect(fetchedBalance).bignumber.eq(underlyingBalanceAfter); - expect(fetchedBalance).bignumber.gt(fetchedBalanceBefore as any); - - // 4. Withdraw our new interested - we worked hard for it! - await d_CompoundIntegration.methods["withdraw(address,address,uint256,bool)"]( - sa.default, - bAsset.address, - underlyingBalanceAfter, - false, - ); - }); - - it("should fail if called with inactive token", async () => { - const bAsset = await c_ERC20.at(integrationDetails.aTokens[0].bAsset); - - await expectRevert( - d_CompoundIntegration.checkBalance(bAsset.address), - "cToken does not exist", - ); - }); - }); - - describe("reApproveAllTokens", async () => { - before(async () => { - await runSetup(); - }); - it("should re-approve ALL bAssets with aTokens", async () => { - const bAsset1 = await c_ERC20.at(integrationDetails.cTokens[0].bAsset); - const cToken1 = await c_CERC20.at(integrationDetails.cTokens[0].cToken); - let allowance = await bAsset1.allowance(d_CompoundIntegration.address, cToken1.address); - expect(MAX_UINT256).to.bignumber.equal(allowance); - - const bAsset2 = await c_ERC20.at(integrationDetails.cTokens[0].bAsset); - const cToken2 = await c_CERC20.at(integrationDetails.cTokens[0].cToken); - allowance = await bAsset2.allowance(d_CompoundIntegration.address, cToken2.address); - expect(MAX_UINT256).to.bignumber.equal(allowance); - - await d_CompoundIntegration.reApproveAllTokens({ - from: sa.governor, - }); - - allowance = await bAsset1.allowance(d_CompoundIntegration.address, cToken1.address); - expect(MAX_UINT256).to.bignumber.equal(allowance); - - allowance = await bAsset2.allowance(d_CompoundIntegration.address, cToken2.address); - expect(MAX_UINT256).to.bignumber.equal(allowance); - }); - - it("should only be callable by the Governor", async () => { - // Fail when not called by the Governor - await expectRevert( - d_CompoundIntegration.reApproveAllTokens({ - from: sa.dummy1, - }), - "Only governor can execute", - ); - - // Succeed when called by the Governor - d_CompoundIntegration.reApproveAllTokens({ - from: sa.governor, - }); - }); - - it("should be able to be called multiple times", async () => { - const bAsset1 = await c_ERC20.at(integrationDetails.cTokens[0].bAsset); - const cToken1 = await c_CERC20.at(integrationDetails.cTokens[0].cToken); - const bAsset2 = await c_ERC20.at(integrationDetails.cTokens[0].bAsset); - const cToken2 = await c_CERC20.at(integrationDetails.cTokens[0].cToken); - - let allowance = await bAsset1.allowance(d_CompoundIntegration.address, cToken1.address); - expect(MAX_UINT256).to.bignumber.equal(allowance); - allowance = await bAsset2.allowance(d_CompoundIntegration.address, cToken2.address); - expect(MAX_UINT256).to.bignumber.equal(allowance); - - d_CompoundIntegration.reApproveAllTokens({ - from: sa.governor, - }); - - d_CompoundIntegration.reApproveAllTokens({ - from: sa.governor, - }); - - allowance = await bAsset1.allowance(d_CompoundIntegration.address, cToken1.address); - expect(MAX_UINT256).to.bignumber.equal(allowance); - allowance = await bAsset2.allowance(d_CompoundIntegration.address, cToken2.address); - expect(MAX_UINT256).to.bignumber.equal(allowance); - }); - }); -}); diff --git a/test/masset/platform-integrations/TestPlatformIntegrationUpgradability.spec.ts b/test/masset/platform-integrations/TestPlatformIntegrationUpgradability.spec.ts deleted file mode 100644 index 1a243e0b..00000000 --- a/test/masset/platform-integrations/TestPlatformIntegrationUpgradability.spec.ts +++ /dev/null @@ -1,244 +0,0 @@ -/* eslint-disable @typescript-eslint/camelcase */ -/* eslint-disable @typescript-eslint/explicit-function-return-type */ -/* eslint-disable @typescript-eslint/no-use-before-define */ -import { expectRevert, time } from "@openzeppelin/test-helpers"; -import { StandardAccounts } from "@utils/machines"; -import { BN } from "@utils/tools"; -import envSetup from "@utils/env_setup"; -import * as t from "types/generated"; - -const { expect } = envSetup.configure(); -const DelayedProxyAdmin = artifacts.require("DelayedProxyAdmin"); -const InitializableProxy = artifacts.require( - // eslint-disable-next-line @typescript-eslint/ban-ts-ignore - // @ts-ignore - "@openzeppelin/upgrades/InitializableAdminUpgradeabilityProxy", -) as t.InitializableAdminUpgradeabilityProxyContract; -const c_MockNexus = artifacts.require("MockNexus"); -const c_AaveIntegration = artifacts.require("AaveIntegration"); -const c_AaveIntegrationV2 = artifacts.require("AaveIntegrationV2"); -const c_AaveIntegrationV3 = artifacts.require("AaveIntegrationV3"); - -const c_MockAToken = artifacts.require("MockAToken"); -const c_MockAave = artifacts.require("MockAaveV1"); -const c_MockErc20 = artifacts.require("MockERC20"); - -contract("PlatformIntegrationUpgradability", async (accounts) => { - let d_Nexus: t.MockNexusInstance; - const sa = new StandardAccounts(accounts); - const governanceAddr = sa.governor; - const managerAddr = sa.dummy1; - const ONE_DAY = new BN(60 * 60 * 24); - const ONE_WEEK = ONE_DAY.mul(new BN(7)); - - let d_DelayedProxyAdmin: t.DelayedProxyAdminInstance; - let d_AaveIntegrationProxy: t.InitializableAdminUpgradeabilityProxyInstance; - let d_AaveIntegrationV1: t.AaveIntegrationInstance; - let d_AaveIntegrationV2: t.AaveIntegrationV2Instance; - let d_AaveIntegrationV3: t.AaveIntegrationV3Instance; - - let d_MockAave: t.MockAaveV1Instance; - let d_mockBasset1: t.MockERC20Instance; - let d_mockAToken1: t.MockATokenInstance; - - let proxyToImplV2: t.AaveIntegrationV2Instance; - let proxyToImplV3: t.AaveIntegrationV3Instance; - - before("before all", async () => { - // create New Nexus - d_Nexus = await c_MockNexus.new(sa.governor, governanceAddr, managerAddr); - - // 1. Deploy DelayedProxyAdmin - d_DelayedProxyAdmin = await DelayedProxyAdmin.new(d_Nexus.address); - await d_Nexus.setProxyAdmin(d_DelayedProxyAdmin.address); - - // 2 Deploy a proxy contract - d_AaveIntegrationProxy = await InitializableProxy.new(); - - // 3. Deploy AaveIntegration version 1.0 - // Any data we pass to this contract, it does not matter, as all the call to this contract - // will be via Proxy - d_AaveIntegrationV1 = await c_AaveIntegration.new(); - - // Initialize AaveIntegration - d_mockBasset1 = await c_MockErc20.new("Mock1", "MK1", 12, sa.default, 100000000); - - // Mock Aave instance - d_MockAave = await c_MockAave.new({ from: sa.default }); - - d_mockAToken1 = await c_MockAToken.new(d_MockAave.address, d_mockBasset1.address); - - const initializationData_AaveIntegration: string = d_AaveIntegrationV1.contract.methods - .initialize( - d_Nexus.address, - [sa.dummy3, sa.dummy4], - d_MockAave.address, - [d_mockBasset1.address], - [d_mockAToken1.address], - ) - .encodeABI(); - - await d_AaveIntegrationProxy.methods["initialize(address,address,bytes)"]( - d_AaveIntegrationV1.address, - d_DelayedProxyAdmin.address, - initializationData_AaveIntegration, - ); - - // Ensure that setup is correct and AaveIntegration V1 is deployed via Proxy - // ======================================================================== - const proxyToImplV1 = await c_AaveIntegration.at(d_AaveIntegrationProxy.address); - - const pToken = await proxyToImplV1.bAssetToPToken(d_mockBasset1.address); - expect(pToken).to.equal(d_mockAToken1.address); - const platformAddress = await proxyToImplV1.platformAddress(); - expect(d_MockAave.address).to.equal(platformAddress); - - await d_MockAave.addAToken(d_mockAToken1.address, d_mockBasset1.address); - - // Perform some operation to have storage updated - // ============================================== - // Ensure that storage updated as expected - const amount = new BN(100); - await d_mockBasset1.transfer(proxyToImplV1.address, amount); - // const referralCode = new BN(9999); - await proxyToImplV1.deposit(d_mockBasset1.address, amount, false, { from: sa.dummy3 }); - const bal = await d_mockAToken1.balanceOf(proxyToImplV1.address); - expect(new BN(100)).to.bignumber.equal(bal); - - // Upgrade to new version of AaveIntegration v2 via ProxyAdmin - // ======================================================== - d_AaveIntegrationV2 = await c_AaveIntegrationV2.new(); - const initializationData_AaveIntegrationV2: string = d_AaveIntegrationV2.contract.methods - .initializeNewUint() - .encodeABI(); - await d_DelayedProxyAdmin.proposeUpgrade( - d_AaveIntegrationProxy.address, - d_AaveIntegrationV2.address, - initializationData_AaveIntegrationV2, - { from: sa.governor }, - ); - await time.increase(ONE_WEEK); - await d_DelayedProxyAdmin.acceptUpgradeRequest(d_AaveIntegrationProxy.address, { - from: sa.governor, - }); - - proxyToImplV2 = await c_AaveIntegrationV2.at(d_AaveIntegrationProxy.address); - }); - - describe("Upgraded AaveIntegration", async () => { - it("should have old storage intact", async () => { - const pToken = await proxyToImplV2.bAssetToPToken(d_mockBasset1.address); - expect(pToken).to.equal(d_mockAToken1.address); - - const platformAddress = await proxyToImplV2.platformAddress(); - expect(d_MockAave.address).to.equal(platformAddress); - - const nexusAddr = await proxyToImplV2.nexus(); - expect(d_Nexus.address).to.equal(nexusAddr); - - let whitelisted = await proxyToImplV2.whitelist(sa.dummy3); - expect(true).to.equals(whitelisted); - whitelisted = await proxyToImplV2.whitelist(sa.dummy4); - expect(true).to.equals(whitelisted); - - // let key: string; - // key = await proxyToImplV2.governance(); - // expect(key).to.equal(web3.utils.keccak256("Governance")); - - // key = await proxyToImplV2.KEY_STAKING(); - // expect(key).to.equal(web3.utils.keccak256("Staking")); - - // key = await proxyToImplV2.KEY_ORACLE_HUB(); - // expect(key).to.equal(web3.utils.keccak256("OracleHub")); - - // key = await proxyToImplV2.KEY_MANAGER(); - // expect(key).to.equal(web3.utils.keccak256("Manager")); - - // key = await proxyToImplV2.KEY_RECOLLATERALISER(); - // expect(key).to.equal(web3.utils.keccak256("Recollateraliser")); - - // key = await proxyToImplV2.KEY_META_TOKEN(); - // expect(key).to.equal(web3.utils.keccak256("MetaToken")); - - // key = await proxyToImplV2.KEY_SAVINGS_MANAGER(); - // expect(key).to.equal(web3.utils.keccak256("SavingsManager")); - }); - - it("should have initialized with new variables", async () => { - const newUint = await proxyToImplV2.newUint(); - expect(new BN(1)).to.bignumber.equal(newUint); - }); - - it("should have new functions", async () => { - const result = await proxyToImplV2.newMethod(); - expect(true).to.equal(result); - }); - - it("should have modified functions", async () => { - await expectRevert( - proxyToImplV2.setPTokenAddress(sa.dummy1, sa.dummy2, { from: sa.governor }), - "Not allowed to add more pTokens", - ); - }); - - it("should fail initializeNewUint() when called by Other", async () => { - d_AaveIntegrationV3 = await c_AaveIntegrationV3.new(); - // This will just revert as Nexus is not available - await expectRevert.unspecified( - d_AaveIntegrationV3.initializeNewUint({ from: sa.other }), - ); - }); - - it("should not have removed functions in upgraded contract", async () => { - // Upgrade to new version of AaveIntegration v3 via ProxyAdmin - // ======================================================== - d_AaveIntegrationV3 = await c_AaveIntegrationV3.new(); - const initializationData_AaveIntegrationV3: string = d_AaveIntegrationV3.contract.methods - .initializeNewUint() - .encodeABI(); - await d_DelayedProxyAdmin.proposeUpgrade( - d_AaveIntegrationProxy.address, - d_AaveIntegrationV3.address, - initializationData_AaveIntegrationV3, - { from: sa.governor }, - ); - await time.increase(ONE_WEEK); - await d_DelayedProxyAdmin.acceptUpgradeRequest(d_AaveIntegrationProxy.address, { - from: sa.governor, - }); - - // We are taking V2's code so that `newMethod()` function can be called - // However, we know that implementation is on V3 - await expectRevert.unspecified(proxyToImplV2.newMethod()); - }); - - it("should allow calling old function", async () => { - // Upgrade to new version of AaveIntegration v3 via ProxyAdmin - // ======================================================== - d_AaveIntegrationV3 = await c_AaveIntegrationV3.new(); - const initializationData_AaveIntegrationV3: string = d_AaveIntegrationV3.contract.methods - .initializeNewUint() - .encodeABI(); - await d_DelayedProxyAdmin.proposeUpgrade( - d_AaveIntegrationProxy.address, - d_AaveIntegrationV3.address, - initializationData_AaveIntegrationV3, - { from: sa.governor }, - ); - await time.increase(ONE_WEEK); - await d_DelayedProxyAdmin.acceptUpgradeRequest(d_AaveIntegrationProxy.address, { - from: sa.governor, - }); - - proxyToImplV3 = await c_AaveIntegrationV3.at(d_AaveIntegrationProxy.address); - await expectRevert( - proxyToImplV3.setPTokenAddress(sa.dummy1, sa.dummy2, { from: sa.governor }), - "Not allowed to add more pTokens", - ); - }); - it("should have aToken balance intact", async () => { - const bal = await proxyToImplV3.checkBalanceView(d_mockBasset1.address); - expect(new BN(100)).to.bignumber.equal(bal); - }); - }); -}); diff --git a/test/masset/redeem.spec.ts b/test/masset/redeem.spec.ts new file mode 100644 index 00000000..f7078c61 --- /dev/null +++ b/test/masset/redeem.spec.ts @@ -0,0 +1,1157 @@ +import { expect } from "chai" +import { ethers } from "hardhat" +import { Signer } from "ethers" + +import { simpleToExactAmount, BN, applyRatio } from "@utils/math" +import { MassetDetails, MassetMachine, StandardAccounts, Account } from "@utils/machines" +import { MockERC20, Masset } from "types/generated" +import { fullScale, ZERO_ADDRESS } from "@utils/constants" +import { assertBasketIsHealthy, assertBNSlightlyGTPercent } from "@utils/assertions" +import { BassetStatus } from "@utils/mstable-objects" + +describe("Masset - Redeem", () => { + let sa: StandardAccounts + let mAssetMachine: MassetMachine + let details: MassetDetails + + /** + * @dev (Re)Sets the local variables for this test file + * @param seedBasket mints 25 tokens for each bAsset + * @param useTransferFees enables transfer fees on bAssets [2,3] + */ + const runSetup = async ( + seedBasket = true, + useTransferFees = false, + useLendingMarkets = false, + useMockValidator = true, + weights: number[] = [25, 25, 25, 25], + ): Promise => { + details = await mAssetMachine.deployMasset(useMockValidator, useLendingMarkets, useTransferFees) + if (seedBasket) { + await mAssetMachine.seedWithWeightings(details, weights) + } + } + + before("Init contract", async () => { + const accounts = await ethers.getSigners() + mAssetMachine = await new MassetMachine().initAccounts(accounts) + sa = mAssetMachine.sa + await runSetup() + }) + + const assertFailedBasicRedemption = async ( + expectedReason: string, + mAssetContract: Masset, + bAsset: MockERC20 | string, + mAssetRedeemQuantity: BN | number | string, + minBassetOutput: BN | number | string = BN.from(0), + sender: Signer = sa.default.signer, + recipient: string = sa.default.address, + quantitiesAreExact = false, + redeemOutputRevertExpected = true, + expectedBassetQuantity: BN | number | string = BN.from(0), + ): Promise => { + const mAsset = mAssetContract.connect(sender) + const bAssetAddress = typeof bAsset === "string" ? bAsset : bAsset.address + const bAssetDecimals = typeof bAsset === "string" ? 18 : await bAsset.decimals() + const mAssetRedeemQuantityExact = quantitiesAreExact ? BN.from(mAssetRedeemQuantity) : simpleToExactAmount(mAssetRedeemQuantity, 18) + const minBassetOutputExact = quantitiesAreExact ? BN.from(minBassetOutput) : simpleToExactAmount(minBassetOutput, bAssetDecimals) + const expectedBassetQuantityExact = quantitiesAreExact + ? BN.from(expectedBassetQuantity) + : simpleToExactAmount(expectedBassetQuantity, bAssetDecimals) + await expect( + mAsset.redeem(bAssetAddress, mAssetRedeemQuantityExact, minBassetOutputExact, recipient), + `redeem tx should revert with "${expectedReason}"`, + ).to.be.revertedWith(expectedReason) + + if (redeemOutputRevertExpected) { + await expect( + mAsset.getRedeemOutput(bAssetAddress, mAssetRedeemQuantityExact), + `getRedeemOutput call should revert with "${expectedReason}"`, + ).to.be.revertedWith(expectedReason) + } else { + const redeemedBassetQuantity = await mAsset.getRedeemOutput(bAssetAddress, mAssetRedeemQuantityExact) + expect(redeemedBassetQuantity, "getRedeemOutput call output").eq(expectedBassetQuantityExact) + } + } + const assertFailedMassetRedemption = async ( + expectedReason: string, + mAssetContract: Masset, + mAssetQuantity: BN | number | string, + minBassetQuantitiesNet: (BN | number | string)[] = [0, 0, 0, 0], + bAssets: MockERC20[], + sender: Signer = sa.default.signer, + recipient: string = sa.default.address, + quantitiesAreExact = false, + ): Promise => { + const mAsset = mAssetContract.connect(sender) + const bAssetsDecimals = await Promise.all(bAssets.map((bAsset) => bAsset.decimals())) + const mAssetQuantityExact = quantitiesAreExact ? BN.from(mAssetQuantity) : simpleToExactAmount(mAssetQuantity, 18) + const minBassetQuantitiesExact = quantitiesAreExact + ? minBassetQuantitiesNet.map((q) => BN.from(q)) + : minBassetQuantitiesNet.map((q, i) => simpleToExactAmount(q, bAssetsDecimals[i])) + await expect( + mAsset.redeemMasset(mAssetQuantityExact, minBassetQuantitiesExact, recipient), + `redeem tx should revert with "${expectedReason}"`, + ).to.be.revertedWith(expectedReason) + } + const assertFailedExactBassetsRedemption = async ( + expectedReason: string, + mAssetContract: Masset, + bAssets: (MockERC20 | string)[], + bAssetRedeemQuantities: (BN | number | string)[], + maxMassetBurntQuantity: BN | number | string = 100, + sender: Signer = sa.default.signer, + recipient: string = sa.default.address, + quantitiesAreExact = false, + redeemOutputRevertExpected = true, + expectedMassetQuantityExact: BN | number | string = BN.from(1), + ): Promise => { + const mAsset = mAssetContract.connect(sender) + const bAssetAddresses = bAssets.map((bAsset) => (typeof bAsset === "string" ? bAsset : bAsset.address)) + const bAssetsDecimals = await Promise.all( + bAssets.map((bAsset) => (typeof bAsset === "string" ? Promise.resolve(18) : bAsset.decimals())), + ) + // Convert to exact quantities + const bAssetRedeemQuantitiesExact = quantitiesAreExact + ? bAssetRedeemQuantities.map((q) => BN.from(q)) + : bAssetRedeemQuantities.map((q, i) => simpleToExactAmount(q, bAssetsDecimals[i])) + const maxMassetBurntQuantityExact = quantitiesAreExact + ? BN.from(maxMassetBurntQuantity) + : simpleToExactAmount(maxMassetBurntQuantity, 18) + + await expect( + mAsset.redeemExactBassets(bAssetAddresses, bAssetRedeemQuantitiesExact, maxMassetBurntQuantityExact, recipient), + `redeem tx should revert with "${expectedReason}"`, + ).to.be.revertedWith(expectedReason) + + if (redeemOutputRevertExpected) { + await expect( + mAsset.getRedeemExactBassetsOutput(bAssetAddresses, bAssetRedeemQuantitiesExact), + `getRedeemExactBassetsOutput call should revert with "${expectedReason}"`, + ).to.be.revertedWith(expectedReason) + } else { + const redeemedMassetQuantity = await mAsset.getRedeemExactBassetsOutput(bAssetAddresses, bAssetRedeemQuantitiesExact) + expect(redeemedMassetQuantity, "getRedeemExactBassetsOutput call output").eq(expectedMassetQuantityExact) + } + } + + // Helper to assert basic redemption conditions, e.g. balance before and after + // redeem takes mAsset input and returns bAsset amount + const assertBasicRedemption = async ( + md: MassetDetails, + bAsset: MockERC20, + mAssetBurnQuantity: BN | number | string, + minBassetOutput: BN | number | string = 0, + expectFee = true, + recipient: string = sa.default.address, + sender: Account = sa.default, + ignoreHealthAssertions = false, + quantitiesAreExact = false, + hasTransferFee = false, + ): Promise => { + const { platform } = md + const mAsset = md.mAsset.connect(sender.signer) + if (!ignoreHealthAssertions) await assertBasketIsHealthy(mAssetMachine, md) + + // Get balances before + const senderMassetBalBefore = await mAsset.balanceOf(sender.address) + const mAssetSupplyBefore = await mAsset.totalSupply() + const recipientBassetBalBefore = await bAsset.balanceOf(recipient) + const bAssetBefore = await mAssetMachine.getBasset(details, bAsset.address) + const bAssetDecimals = await bAsset.decimals() + const mAssetQuantityExact = quantitiesAreExact ? BN.from(mAssetBurnQuantity) : simpleToExactAmount(mAssetBurnQuantity, 18) + const minBassetOutputExact = quantitiesAreExact ? BN.from(minBassetOutput) : simpleToExactAmount(minBassetOutput, bAssetDecimals) + const surplusBefore = await mAsset.surplus() + + let scaledFee = BN.from(0) + let feeRate = BN.from(0) + // If there is a fee expected, then deduct it from output + if (expectFee) { + feeRate = await mAsset.swapFee() + expect(feeRate, "fee rate > 0").gt(0) + expect(feeRate, "fee rate < fullScale / 50").lt(fullScale.div(50)) + scaledFee = mAssetQuantityExact.mul(feeRate).div(fullScale) + } + + const bAssetQuantityExact = await mAsset.getRedeemOutput(bAsset.address, mAssetQuantityExact) + + const platformInteraction = await mAssetMachine.getPlatformInteraction(mAsset, "withdrawal", bAssetQuantityExact, bAssetBefore) + + // Execute the redemption + const tx = mAsset.redeem(bAsset.address, mAssetQuantityExact, minBassetOutputExact, recipient) + const integratorBalBefore = await bAssetBefore.contract.balanceOf( + bAssetBefore.integrator ? bAssetBefore.integratorAddr : mAsset.address, + ) + + // Check the emitted events + await expect(tx) + .to.emit(mAsset, "Redeemed") + .withArgs(sender.address, recipient, mAssetQuantityExact, bAsset.address, bAssetQuantityExact, scaledFee) + // - Withdraws from lending platform or mAsset + if (platformInteraction.expectInteraction) { + await expect(tx, "PlatformWithdrawal event").to.emit(platform, "PlatformWithdrawal") + // .withArgs(bAsset.address, bAssetBefore.pToken, platformInteraction.amount, bAssetQuantityExact) + } else if (platformInteraction.hasLendingMarket) { + await expect(tx, "Withdrawal event").to.emit(platform, "Withdrawal").withArgs(bAsset.address, bAssetQuantityExact) + } + // Transfer events + await expect(tx, "Transfer event to burn the redeemed mAssets") + .to.emit(mAsset, "Transfer") + .withArgs(sender.address, ZERO_ADDRESS, mAssetQuantityExact) + if (!hasTransferFee) { + await expect(tx, "Transfer event for bAsset from platform integration or mAsset to recipient") + .to.emit(bAsset, "Transfer") + .withArgs(bAssetBefore.integrator ? bAssetBefore.integratorAddr : mAsset.address, recipient, bAssetQuantityExact) + } + await tx + + // VaultBalance should line up + const integratorBalAfter = await bAssetBefore.contract.balanceOf( + bAssetBefore.integrator ? bAssetBefore.integratorAddr : mAsset.address, + ) + // Calculate after balance + // expect(integratorBalAfter, "integratorBalAfter").eq(integratorBalBefore.sub(bAssetQuantityExact)) + // Sender should have less mAsset + const senderMassetBalAfter = await mAsset.balanceOf(sender.address) + expect(senderMassetBalAfter, "senderMassetBalAfter").eq(senderMassetBalBefore.sub(mAssetQuantityExact)) + // Total mAsset supply should be less + const mAssetSupplyAfter = await mAsset.totalSupply() + expect(mAssetSupplyAfter, "mAssetSupplyAfter").eq(mAssetSupplyBefore.sub(mAssetQuantityExact)) + // Recipient should have more bAsset, minus fee + + if (!hasTransferFee) { + const recipientBassetBalAfter = await bAsset.balanceOf(recipient) + expect(recipientBassetBalAfter, "recipientBassetBalAfter").eq(recipientBassetBalBefore.add(bAssetQuantityExact)) + } + // VaultBalance should update for this bAsset, including fee + const bAssetAfter = await mAssetMachine.getBasset(details, bAsset.address) + expect(BN.from(bAssetAfter.vaultBalance), "bAssetAfter.vaultBalance").eq( + BN.from(bAssetBefore.vaultBalance).sub(bAssetQuantityExact), + ) + const surplusAfter = await mAsset.surplus() + expect(surplusAfter, "surplusAfter").eq(surplusBefore.add(scaledFee)) + + // Complete basket should remain in healthy state + if (!ignoreHealthAssertions) await assertBasketIsHealthy(mAssetMachine, md) + + return bAssetQuantityExact + } + + const assertExactBassetsRedemption = async ( + md: MassetDetails, + bAssets: MockERC20[], + bAssetRedeemQuantities: (BN | number | string)[], + maxMassetBurntQuantity: BN | number | string = 0, + expectFee = true, + recipient: string = sa.default.address, + sender: Account = sa.default, + ignoreHealthAssertions = false, + quantitiesAreExact = false, + ): Promise => { + const { mAsset } = md + if (!ignoreHealthAssertions) await assertBasketIsHealthy(mAssetMachine, md) + + // Get bAsset details + const bAssetsBefore = await mAssetMachine.getBassetsInMasset(details) + const bAssetAddresses = bAssets.map((b) => b.address) + const bAssetsDecimals = await Promise.all(bAssets.map((b) => b.decimals())) + + // Convert to exact quantities + const bAssetRedeemQuantitiesExact = quantitiesAreExact + ? bAssetRedeemQuantities.map((q) => BN.from(q)) + : bAssetRedeemQuantities.map((q, i) => simpleToExactAmount(q, bAssetsDecimals[i])) + const maxMassetBurntQuantityExact = quantitiesAreExact + ? BN.from(maxMassetBurntQuantity) + : simpleToExactAmount(maxMassetBurntQuantity, 18) + + // Get balances before + const senderMassetBalBefore = await mAsset.balanceOf(sender.address) + const mAssetSupplyBefore = await mAsset.totalSupply() + const recipientBassetBalsBefore: BN[] = await Promise.all(bAssets.map((b) => b.balanceOf(recipient))) + const surplusBefore = await mAsset.surplus() + + // Convert mBasset quantities to mAsset quantity + const mAssetsBurnt = bAssetRedeemQuantitiesExact.reduce((acc, bAssetRedeemQuantityExact, i) => { + const mAssetQuantity = applyRatio(bAssetRedeemQuantityExact, bAssetsBefore[i].ratio) + return acc.add(mAssetQuantity) + }, BN.from(0)) + + // Calculate redemption fee + let scaledFee = BN.from(0) + let feeRate = BN.from(0) + // If there is a fee expected, then deduct it from output + if (expectFee) { + feeRate = await mAsset.swapFee() + expect(feeRate, "fee rate > 0").gt(BN.from(0)) + expect(feeRate, "fee rate < fullScale / 50").lt(fullScale.div(BN.from(50))) + // fee = mAsset qty * feeRate / (1 - feeRate) + scaledFee = mAssetsBurnt.mul(feeRate).div(fullScale.sub(feeRate)) + expect(scaledFee, "scaled fee > 0").gt(BN.from(0)) + } + + const mAssetQuantityExact = await mAsset.getRedeemExactBassetsOutput(bAssetAddresses, bAssetRedeemQuantitiesExact) + expect(mAssetQuantityExact, "mAssetQuantityExact").to.eq(mAssetsBurnt.add(scaledFee).add(1)) + + // Execute the redemption + const tx = mAsset.redeemExactBassets(bAssetAddresses, bAssetRedeemQuantitiesExact, maxMassetBurntQuantityExact, recipient) + + // Check the emitted events + await expect(tx) + .to.emit(mAsset, "RedeemedMulti") + .withArgs( + sender.address, + recipient, + mAssetsBurnt.add(scaledFee).add(1), + bAssetAddresses, + bAssetRedeemQuantitiesExact, + scaledFee, + ) + // Transfer events + await expect(tx, "Transfer event to burn the redeemed mAssets") + .to.emit(mAsset, "Transfer") + .withArgs(sender.address, ZERO_ADDRESS, mAssetQuantityExact) + // Check all the bAsset transfers + await Promise.all( + bAssets.map((bAsset, i) => { + if (bAssetRedeemQuantitiesExact[i].gt(0)) { + return expect(tx, `Transfer event for bAsset[${i}] from platform integration or mAsset to recipient`) + .to.emit(bAsset, "Transfer") + .withArgs( + bAssetsBefore[i].integrator ? bAssetsBefore[i].integratorAddr : mAsset.address, + recipient, + bAssetRedeemQuantitiesExact[i], + ) + } + return Promise.resolve() + }), + ) + await tx + + // Sender should have less mAsset + const senderMassetBalAfter = await mAsset.balanceOf(sender.address) + expect(senderMassetBalAfter, "senderMassetBalAfter").eq(senderMassetBalBefore.sub(mAssetQuantityExact)) + // Total mAsset supply should be less + const mAssetSupplyAfter = await mAsset.totalSupply() + expect(mAssetSupplyAfter, "mAssetSupplyAfter").eq(mAssetSupplyBefore.sub(mAssetQuantityExact)) + // Recipient should have more bAsset, minus fee + const recipientBassetBalsAfter = await Promise.all(bAssets.map((b) => b.balanceOf(recipient))) + recipientBassetBalsAfter.forEach((recipientBassetBalAfter, i) => { + expect(recipientBassetBalAfter, `recipientBassetBalAfter[${i}]`).eq( + recipientBassetBalsBefore[i].add(bAssetRedeemQuantitiesExact[i]), + ) + }) + + // VaultBalance should update for this bAsset, including fee + const bAssetsAfter = await mAssetMachine.getBassetsInMasset(details) + bAssetsAfter.forEach((bAssetAfter, i) => { + expect(BN.from(bAssetAfter.vaultBalance), `bAssetAfter[${i}].vaultBalance`).eq( + BN.from(bAssetsBefore[i].vaultBalance).sub(bAssetRedeemQuantitiesExact[i]), + ) + }) + const surplusAfter = await mAsset.surplus() + expect(surplusAfter, "surplusAfter").eq(surplusBefore.add(scaledFee)) + + // Complete basket should remain in healthy state + if (!ignoreHealthAssertions) await assertBasketIsHealthy(mAssetMachine, md) + + return mAssetQuantityExact + } + + const assertMassetRedemption = async ( + md: MassetDetails, + mAssetQuantityGross: BN | number | string, + minBassetQuantitiesNet: (BN | number | string)[] = [0, 0, 0, 0], + expectFee = true, + recipient: string = sa.default.address, + sender: Account = sa.default, + ignoreHealthAssertions = false, + quantitiesAreExact = false, + ): Promise => { + const { mAsset, bAssets } = md + if (!ignoreHealthAssertions) await assertBasketIsHealthy(mAssetMachine, md) + + // Get bAsset details + const bAssetsBefore = await mAssetMachine.getBassetsInMasset(details) + const bAssetAddresses = bAssets.map((b) => b.address) + const bAssetsDecimals = await Promise.all(bAssets.map((b) => b.decimals())) + + // Convert to exact quantities + const mAssetQuantityExact = quantitiesAreExact ? BN.from(mAssetQuantityGross) : simpleToExactAmount(mAssetQuantityGross, 18) + const minBassetQuantitiesExact = quantitiesAreExact + ? minBassetQuantitiesNet.map((q) => BN.from(q)) + : minBassetQuantitiesNet.map((q, i) => simpleToExactAmount(q, bAssetsDecimals[i])) + + // Get balances before + const senderMassetBalBefore = await mAsset.balanceOf(sender.address) + const mAssetSupplyBefore = await mAsset.totalSupply() + const recipientBassetBalsBefore: BN[] = await Promise.all(bAssets.map((b) => b.balanceOf(recipient))) + const surplusBefore = await mAsset.surplus() + + // Calculate redemption fee + let scaledFee = BN.from(0) + let feeRate = BN.from(0) + // If there is a fee expected, then deduct it from output + if (expectFee) { + feeRate = await mAsset.redemptionFee() + expect(feeRate, "fee rate > 0").gt(BN.from(0)) + expect(feeRate, "fee rate < fullScale / 50").lt(fullScale.div(BN.from(50))) + // fee = mAsset qty * fee rate + scaledFee = mAssetQuantityExact.mul(feeRate).div(fullScale) + expect(scaledFee, "scaled fee > 0").gt(BN.from(0)) + } + + // Execute the redemption + const tx = mAsset.redeemMasset(mAssetQuantityExact, minBassetQuantitiesExact, recipient) + + // (mAsset qty / 4) * (1 - redemption fee) + const mAssetRedemptionAmountNet = mAssetQuantityExact.sub(mAssetQuantityExact.mul(feeRate).div(fullScale)) + const bAssetRedeemQuantitiesExact = bAssets.map((b, i) => { + // netBassetRedemptionAmount = bAsset vault balance * mAsset quantity to be burnt / (total mAsset mAsset + surplus) + const netBassetRedemptionAmount = BN.from(bAssetsBefore[i].vaultBalance) + .mul(mAssetRedemptionAmountNet) + .div(mAssetSupplyBefore.add(surplusBefore)) + return netBassetRedemptionAmount.eq(0) ? netBassetRedemptionAmount : netBassetRedemptionAmount.sub(1) + }) + // Check the emitted events + await expect(tx) + .to.emit(mAsset, "RedeemedMulti") + .withArgs(sender.address, recipient, mAssetQuantityExact, bAssetAddresses, bAssetRedeemQuantitiesExact, scaledFee) + // Transfer events + await expect(tx, "Transfer event to burn the redeemed mAssets") + .to.emit(mAsset, "Transfer") + .withArgs(sender.address, ZERO_ADDRESS, mAssetQuantityExact) + // Check all the bAsset transfers + await Promise.all( + bAssets.map((bAsset, i) => { + if (bAssetRedeemQuantitiesExact[i].gt(0)) { + return expect(tx, `Transfer event for bAsset[${i}] from platform integration or mAsset to recipient`) + .to.emit(bAsset, "Transfer") + .withArgs( + bAssetsBefore[i].integrator ? bAssetsBefore[i].integratorAddr : mAsset.address, + recipient, + bAssetRedeemQuantitiesExact[i], + ) + } + return Promise.resolve() + }), + ) + await tx + + // Sender should have less mAsset + const senderMassetBalAfter = await mAsset.balanceOf(sender.address) + expect(senderMassetBalAfter, "senderMassetBalAfter").eq(senderMassetBalBefore.sub(mAssetQuantityExact)) + // Total mAsset supply should be less + const mAssetSupplyAfter = await mAsset.totalSupply() + expect(mAssetSupplyAfter, "mAssetSupplyAfter").eq(mAssetSupplyBefore.sub(mAssetQuantityExact)) + // Recipient should have more bAsset, minus fee + const recipientBassetBalsAfter = await Promise.all(bAssets.map((b) => b.balanceOf(recipient))) + recipientBassetBalsAfter.forEach((recipientBassetBalAfter, i) => { + expect(recipientBassetBalAfter, `recipientBassetBalAfter[${i}]`).eq( + recipientBassetBalsBefore[i].add(bAssetRedeemQuantitiesExact[i]), + ) + }) + + // VaultBalance should update for this bAsset, including fee + const bAssetsAfter = await mAssetMachine.getBassetsInMasset(details) + bAssetsAfter.forEach((bAssetAfter, i) => { + expect(BN.from(bAssetAfter.vaultBalance), `bAssetAfter[${i}].vaultBalance`).eq( + BN.from(bAssetsBefore[i].vaultBalance).sub(bAssetRedeemQuantitiesExact[i]), + ) + }) + const surplusAfter = await mAsset.surplus() + expect(surplusAfter, "surplusAfter").eq(surplusBefore.add(scaledFee)) + + // Complete basket should remain in healthy state + if (!ignoreHealthAssertions) await assertBasketIsHealthy(mAssetMachine, md) + + return mAssetQuantityExact + } + + describe("redeeming with a single bAsset", () => { + context("when the weights are within the validator limit", () => { + context("and no lending market integration", async () => { + before(async () => { + await runSetup(true, false, false) + }) + it("should redeem 1 bAsset[0] to a contract", async () => { + const { bAssets } = details + const recipient = details.forgeValidator.address + await assertBasicRedemption(details, bAssets[0], 1, 0.9, true, recipient) + }) + it("should redeem 1 bAsset[1]", async () => { + const { bAssets } = details + const recipient = sa.dummy1 + await assertBasicRedemption(details, bAssets[1], 1, 0.9, true, recipient.address) + }) + it("should redeem 12 bAsset[1]", async () => { + const { bAssets } = details + const recipient = sa.dummy1 + await assertBasicRedemption(details, bAssets[1], 12, 9, true, recipient.address) + }) + it("should redeem smallest number of bAsset[0] with 18 decimals", async () => { + const { bAssets } = details + expect(await bAssets[0].decimals()).eq(18) + await assertBasicRedemption(details, bAssets[0], 2, 1, true, undefined, undefined, undefined, true) + }) + it("should redeem smallest number of bAsset[2] with 12 decimals", async () => { + const { bAssets } = details + expect(await bAssets[2].decimals()).eq(12) + await assertFailedBasicRedemption( + "Output == 0", + details.mAsset, + bAssets[2], + 1, + 0, + sa.default.signer, + sa.default.address, + true, + false, + 0, + ) + }) + }) + context("and lending market integration", async () => { + before(async () => { + await runSetup(true, false, true) + }) + it("should redeem 1 bAsset[0] to a contract", async () => { + const { bAssets } = details + const recipient = details.forgeValidator.address + await assertBasicRedemption(details, bAssets[0], 1, 0.9, true, recipient) + }) + it("should send 1 bAsset[1] to EOA", async () => { + const { bAssets } = details + const recipient = sa.dummy1 + await assertBasicRedemption(details, bAssets[1], 1, 0.9, true, recipient.address) + }) + it("should send 12 bAsset[1] to EOA", async () => { + const { bAssets } = details + const recipient = sa.dummy1 + await assertBasicRedemption(details, bAssets[1], 12, 9, true, recipient.address) + }) + it("should send 16 bAsset[0] to EOA", async () => { + const { bAssets } = details + const recipient = sa.dummy1 + await assertBasicRedemption(details, bAssets[0], 16, 9, true, recipient.address) + }) + }) + context("and the feeRate changes", async () => { + before(async () => { + await runSetup() + }) + it("should deduct the suitable fee", async () => { + const { bAssets, mAsset } = details + const bAsset = bAssets[0] + const bAssetBefore = await mAsset.getBasset(bAsset.address) + // Set a new fee recipient + const newSwapFee = simpleToExactAmount("8.1", 15) + const newRedemptionFee = simpleToExactAmount("5.234234", 15) + await mAsset.connect(sa.governor.signer).setFees(newSwapFee, newRedemptionFee) + // Calc mAsset burn amounts based on bAsset quantities + const bAssetQuantity = simpleToExactAmount(BN.from(1), await bAsset.decimals()) + const mAssetQuantity = applyRatio(bAssetQuantity, bAssetBefore.data.ratio) + const bAssetFee = bAssetQuantity.mul(newSwapFee).div(fullScale) + const massetBalBefore = await mAsset.balanceOf(sa.default.address) + const bassetBalBefore = await bAsset.balanceOf(sa.default.address) + // Run the redemption + await assertBasicRedemption(details, bAsset, BN.from(1), BN.from(0)) + const massetBalAfter = await mAsset.balanceOf(sa.default.address) + const bassetBalAfter = await bAsset.balanceOf(sa.default.address) + // Assert balance increase + expect(massetBalAfter).eq(massetBalBefore.sub(mAssetQuantity)) + expect(bassetBalAfter).eq(bassetBalBefore.add(bAssetQuantity).sub(bAssetFee)) + }) + it("should deduct nothing if the fee is 0", async () => { + const { bAssets, mAsset } = details + const bAsset = bAssets[0] + const bAssetBefore = await mAsset.getBasset(bAsset.address) + // Set a new fee recipient + const newFee = BN.from(0) + await mAsset.connect(sa.governor.signer).setFees(newFee, newFee) + // Calc mAsset burn amounts based on bAsset quantities + const bAssetQuantity = simpleToExactAmount(BN.from(1), await bAsset.decimals()) + const mAssetQuantity = applyRatio(bAssetQuantity, bAssetBefore.data.ratio) + const massetBalBefore = await mAsset.balanceOf(sa.default.address) + const bassetBalBefore = await bAsset.balanceOf(sa.default.address) + // Run the redemption + await assertBasicRedemption(details, bAsset, BN.from(1), BN.from(0), false) + const massetBalAfter = await mAsset.balanceOf(sa.default.address) + const bassetBalAfter = await bAsset.balanceOf(sa.default.address) + // Assert balance increase + expect(massetBalAfter).eq(massetBalBefore.sub(mAssetQuantity)) + expect(bassetBalAfter).eq(bassetBalBefore.add(bAssetQuantity)) + }) + }) + context("passing invalid arguments", async () => { + before(async () => { + await runSetup() + }) + it("should revert when bAsset is 0x0", async () => { + const { mAsset } = details + await assertFailedBasicRedemption("Invalid asset", mAsset, ZERO_ADDRESS, 1) + }) + it("should fail if the bAsset does not exist", async () => { + const { mAsset } = details + const invalidBasset = await mAssetMachine.loadBassetProxy("Wrapped ETH", "WETH", 18) + await assertFailedBasicRedemption("Invalid asset", mAsset, invalidBasset, 1) + }) + it("should revert when 0 quantity", async () => { + const { bAssets, mAsset } = details + await assertFailedBasicRedemption("Qty==0", mAsset, bAssets[0], 0) + }) + it("should revert when quantity < min quantity", async () => { + const { bAssets, mAsset } = details + await assertFailedBasicRedemption( + "bAsset qty < min qty", + mAsset, + bAssets[0], + "10000000000000000000", + "9995000000000000000", + undefined, + undefined, + true, + false, + // Assuming 0.06% swap fee = 6 bps + // 10 * (1 - 0.06 / 100) = 9.994 + "9994000000000000000", + ) + }) + it("should fail if recipient is 0x0", async () => { + const { bAssets, mAsset } = details + await assertFailedBasicRedemption( + "Invalid recipient", + mAsset, + bAssets[0], + "10000000000000000000", + "9994000000000000000", + undefined, + ZERO_ADDRESS, + true, + false, + // Assuming 0.06% swap fee = 6 bps + // 10 * (1 - 0.06 / 100) = 9.994 + "9994000000000000000", + ) + }) + it("should fail if sender doesn't have mAsset balance", async () => { + const { bAssets, mAsset } = details + const sender = sa.dummy1 + expect(await mAsset.balanceOf(sender.address)).eq(0) + await assertFailedBasicRedemption( + "VM Exception while processing transaction: revert", + mAsset, + bAssets[0], + "10000000000000000000", + "9900000000000000000", + sender.signer, + undefined, + false, + false, + "9994000000000000000", + ) + }) + }) + context("with an affected bAsset", async () => { + beforeEach(async () => { + await runSetup() + }) + it("should fail if bAsset is broken above peg", async () => { + const { bAssets, mAsset } = details + const bAsset = bAssets[0] + await mAsset.connect(sa.governor.signer).handlePegLoss(bAsset.address, false) + const newBasset = await mAsset.getBasset(bAsset.address) + expect(newBasset.personal.status, "bAsset broken above peg").to.eq(BassetStatus.BrokenAbovePeg) + await assertFailedBasicRedemption( + "In recol", + mAsset, + bAsset, + 1, + 0, + sa.default.signer, + sa.default.address, + false, + false, + 0.9994, + ) + }) + it("should fail if bAsset in basket is broken below peg", async () => { + const { bAssets, mAsset } = details + await assertBasketIsHealthy(mAssetMachine, details) + const bAsset = bAssets[1] + await mAsset.connect(sa.governor.signer).handlePegLoss(bAsset.address, true) + const newBasset = await mAsset.getBasset(bAsset.address) + expect(newBasset.personal.status, "bAsset broken below peg").to.eq(BassetStatus.BrokenBelowPeg) + await assertFailedBasicRedemption( + "In recol", + mAsset, + bAsset, + 1, + 0, + sa.default.signer, + sa.default.address, + false, + false, + 0.9994, + ) + }) + it("should fail if other bAssets in basket have broken peg", async () => { + const { bAssets, mAsset } = details + await assertBasketIsHealthy(mAssetMachine, details) + await mAsset.connect(sa.governor.signer).handlePegLoss(bAssets[0].address, false) + const abovePegBasset = await mAsset.getBasset(bAssets[0].address) + await mAsset.connect(sa.governor.signer).handlePegLoss(bAssets[1].address, true) + const belowPegBasset = await mAsset.getBasset(bAssets[1].address) + expect(abovePegBasset.personal.status, "bAsset broken above peg").to.eq(BassetStatus.BrokenAbovePeg) + expect(belowPegBasset.personal.status, "bAsset broken below peg").to.eq(BassetStatus.BrokenBelowPeg) + await assertFailedBasicRedemption( + "In recol", + mAsset, + bAssets[2], + 1, + 0, + sa.default.signer, + sa.default.address, + false, + false, + 0.9994, + ) + }) + }) + context("performing multiple redemptions in a row", async () => { + before("reset", async () => { + await runSetup(true) + }) + it("should redeem with single bAsset", async () => { + const { bAssets, mAsset } = details + const oneMasset = simpleToExactAmount(1, 18) + const mAssetSupplyBefore = await mAsset.totalSupply() + await Promise.all( + bAssets.map(async (b) => { + const bAssetDecimals = await b.decimals() + return mAsset.redeem( + b.address, + simpleToExactAmount(1, 18), + simpleToExactAmount("0.9", bAssetDecimals), + sa.default.address, + ) + }), + ) + const mAssetSupplyAfter = await mAsset.totalSupply() + expect(mAssetSupplyAfter).eq(mAssetSupplyBefore.sub(BN.from(bAssets.length).mul(oneMasset))) + }) + }) + context("using bAssets with transfer fees", async () => { + beforeEach(async () => { + await runSetup(true, true) + }) + it("should handle tokens with transfer fees", async () => { + // // It should burn the full amount of mAsset, but the fees deducted mean the redeemer receives less + const { bAssets, mAsset } = details + + const recipient = sa.dummy3 + // 1.0 Assert bAsset has fee + const bAsset = bAssets[3] + const bAssetDecimals = await bAsset.decimals() + const oneBasset = simpleToExactAmount(1, bAssetDecimals) + const bAssetBefore = await mAsset.getBasset(bAsset.address) + expect(bAssetBefore.personal.hasTxFee).to.eq(true) + + // 2.0 Get balances + const totalSupplyBefore = await mAsset.totalSupply() + const recipientBassetBalBefore = await bAsset.balanceOf(recipient.address) + expect(recipientBassetBalBefore).eq(0) + + // 3.0 Do the redemption + await assertBasicRedemption(details, bAsset, 1, BN.from(0), true, recipient.address, sa.default, false, false, true) + // const tx = await mAsset.redeemTo(bAsset.address, oneBasset, recipient) + const expectedBassetQuantity = applyRatio(oneBasset, bAssetBefore.data.ratio) + // expect(actualBassetQuantity, "bAsset quantity").to.eq(expectedBassetQuantity) + const feeRate = await mAsset.swapFee() + const bAssetFee = oneBasset.mul(feeRate).div(fullScale) + + // 4.0 Total supply goes down, and recipient bAsset goes up slightly + const recipientBassetBalAfter = await bAsset.balanceOf(recipient.address) + // Assert that we redeemed gt 99% of the bAsset + assertBNSlightlyGTPercent(recipientBassetBalBefore.add(oneBasset.sub(bAssetFee)), recipientBassetBalAfter, "0.4", true) + // Total supply goes down full amount + const totalSupplyAfter = await mAsset.totalSupply() + expect(totalSupplyAfter, "after total supply").eq(totalSupplyBefore.sub(expectedBassetQuantity)) + + // VaultBalance should update for this bAsset + const bAssetAfter = await mAsset.getBasset(bAsset.address) + expect(BN.from(bAssetAfter.data.vaultBalance), "before != after + fee").eq( + BN.from(bAssetBefore.data.vaultBalance).sub(oneBasset).add(bAssetFee), + ) + }) + it("should send less output to user if fee unexpected", async () => { + // It should burn the full amount of mAsset, but the fees deducted mean the redeemer receives less + const { bAssets, mAsset } = details + await assertBasketIsHealthy(mAssetMachine, details) + const recipient = sa.dummy3 + // 1.0 Assert bAsset has fee + const bAsset = bAssets[3] + const basket = await mAssetMachine.getBasketComposition(details) + const bAssetDecimals = await bAsset.decimals() + const oneBasset = simpleToExactAmount(1, bAssetDecimals) + const feeRate = await mAsset.swapFee() + const bAssetFee = oneBasset.mul(feeRate).div(fullScale) + expect(basket.bAssets[3].isTransferFeeCharged).to.eq(true) + await mAsset.connect(sa.governor.signer).setTransferFeesFlag(bAsset.address, false) + const recipientBassetBalBefore = await bAsset.balanceOf(recipient.address) + await mAsset.redeem(bAsset.address, oneBasset, 0, recipient.address) + // 4.0 Total supply goes down, and recipient bAsset goes up slightly + const recipientBassetBalAfter = await bAsset.balanceOf(recipient.address) + // Assert that we redeemed gt 99% of the bAsset + assertBNSlightlyGTPercent(recipientBassetBalBefore.add(oneBasset.sub(bAssetFee)), recipientBassetBalAfter, "0.4", true) + }) + }) + }) + }) + describe("redeeming multiple exact bAssets", () => { + context("when the weights are within the validator limit", () => { + before(async () => { + await runSetup() + }) + it("should redeem with all different bAsset quantities", async () => { + const { bAssets } = details + const recipient = details.forgeValidator.address + await assertExactBassetsRedemption(details, bAssets, [1, 2, 3, 4], 11, true, recipient) + }) + it("should redeem with only one bAsset quantity", async () => { + const { bAssets } = details + const recipient = details.forgeValidator.address + await assertExactBassetsRedemption(details, bAssets, [0, 0, 0, 10], 11, true, recipient) + }) + it("should redeem when max equals mAsset redeem quantity", async () => { + const { bAssets } = details + const recipient = details.forgeValidator.address + await assertExactBassetsRedemption( + details, + bAssets, + ["1000000000000000000", "2000000", "3000000000000", "4000000000000000000"], + // mAsset = 10 / (1 - 0.06 / 100) = 10.00600360216129677807 + // but solidity calculate its to be 10.006003602161296778 + // and then 1 is added to give 10.006003602161296779 + "10006003602161296779", + true, + recipient, + undefined, + undefined, + true, + ) + }) + }) + context("passing invalid arguments", async () => { + before(async () => { + await runSetup() + }) + context("when invalid bAssets", () => { + let invalidBassets: (MockERC20 | string)[] + before(() => { + invalidBassets = [...details.bAssets] + }) + it("should fail when empty bAsset and quantities arrays", async () => { + const { mAsset } = details + await assertFailedExactBassetsRedemption("Invalid array input", mAsset, [], [], 1) + }) + it("should fail when empty bAsset and some quantities array input", async () => { + const { mAsset } = details + await assertFailedExactBassetsRedemption("Invalid array input", mAsset, [], [1, 2], 4) + }) + it("should fail when some bAssets and empty quantities arrays", async () => { + const { mAsset } = details + await assertFailedExactBassetsRedemption("Invalid array input", mAsset, details.bAssets, [], 4) + }) + it("should fail when bAssets to quantities array len do not match", async () => { + const { mAsset } = details + await assertFailedExactBassetsRedemption("Invalid array input", mAsset, details.bAssets, [1, 2], 4) + }) + it("should fail when first bAsset is 0x0", async () => { + const { mAsset } = details + invalidBassets[0] = ZERO_ADDRESS + await assertFailedExactBassetsRedemption("Invalid asset", mAsset, invalidBassets, [1, 2, 3, 4], 11) + }) + it("should fail when last bAsset is 0x0", async () => { + const { mAsset } = details + invalidBassets[3] = ZERO_ADDRESS + await assertFailedExactBassetsRedemption("Invalid asset", mAsset, invalidBassets, [1, 2, 3, 4], 11) + }) + it("should fail if first bAsset does not exist", async () => { + const { mAsset } = details + const invalidBasset = await mAssetMachine.loadBassetProxy("Wrapped ETH", "WETH", 18) + invalidBassets[0] = invalidBasset + await assertFailedExactBassetsRedemption("Invalid asset", mAsset, invalidBassets, [1, 2, 3, 4], 11) + }) + it("should fail if last bAsset does not exist", async () => { + const { mAsset } = details + const invalidBasset = await mAssetMachine.loadBassetProxy("Wrapped ETH", "WETH", 18) + invalidBassets[3] = invalidBasset + await assertFailedExactBassetsRedemption("Invalid asset", mAsset, invalidBassets, [1, 2, 3, 4], 11) + }) + }) + it("should fail when all quantities are 0", async () => { + const { bAssets, mAsset } = details + await assertFailedExactBassetsRedemption( + "Must redeem some mAssets", + mAsset, + bAssets, + [0, 0, 0, 0], + 11, + undefined, + undefined, + false, + false, + ) + }) + it("should fail when max quantity is 0", async () => { + const { bAssets, mAsset } = details + await assertFailedExactBassetsRedemption( + "Qty==0", + mAsset, + bAssets, + ["1000000000000000000", "2000000", "3000000000000", "4000000000000000000"], + 0, + sa.default.signer, + sa.default.address, + true, + false, + "10006003602161296779", + ) + }) + it("should revert when redeemed mAsset quantity > max mAsset quantity", async () => { + const { bAssets, mAsset } = details + await assertFailedExactBassetsRedemption( + "Redeem mAsset qty > max quantity", + mAsset, + bAssets, + ["1000000000000000000", "2000000", "3000000000000", "4000000000000000000"], + "10000000000000000000", + sa.default.signer, + sa.default.address, + true, + false, + "10006003602161296779", + ) + }) + context("when redeemed mAsset quantity just greater than max mAsset quantity", () => { + it("should revert with high rounded number", async () => { + const { bAssets, mAsset } = details + await assertFailedExactBassetsRedemption( + "Redeem mAsset qty > max quantity", + mAsset, + bAssets, + ["1000000000000000000", "2000000", "3000000000000", "4000000000000000000"], + // mAsset = 10 / (1 - 0.06 / 100) = 10.00600360216129677807 + // 1 - 0.06 / 100 = 0.9994 + // but solidity calculate its to be 10.006003602161296777 + // and then 1 is added to give 10.006003602161296778 + "10006003602161296778", + sa.default.signer, + sa.default.address, + true, + false, + "10006003602161296779", + ) + }) + it("should revert when low rounded number", async () => { + const { bAssets, mAsset } = details + await assertFailedExactBassetsRedemption( + "Redeem mAsset qty > max quantity", + mAsset, + bAssets, + ["1000000000000000000", "2000000", "3000000000000", "7000000000000000000"], + // 13 * (1 - 0.06 / 100) = 13.00780468280968581149 + "13007804682809685811", + undefined, + undefined, + true, + false, + "13007804682809685812", + ) + }) + }) + it("should fail if recipient is 0x0", async () => { + const { bAssets, mAsset } = details + await assertFailedExactBassetsRedemption( + "Invalid recipient", + mAsset, + bAssets, + [1, 2, 3, 4], + 10, + undefined, + ZERO_ADDRESS, + false, + false, + "10006003602161296779", + ) + }) + it("should fail if sender doesn't have mAsset balance", async () => { + const { bAssets, mAsset } = details + const sender = sa.dummy1 + expect(await mAsset.balanceOf(sender.address)).eq(0) + await assertFailedExactBassetsRedemption( + "VM Exception while processing transaction: revert", + mAsset, + bAssets, + [1, 2, 3, 4], + 11, + sender.signer, + undefined, + false, + false, + "10006003602161296779", + ) + }) + }) + }) + describe("redeeming mAssets for multiple proportional bAssets", () => { + context("even bAsset weights", () => { + before(async () => { + await runSetup() + }) + it("should redeem with all different bAsset quantities", async () => { + const recipient = details.forgeValidator.address + await assertMassetRedemption(details, 10, [2, 2, 2, 2], true, recipient) + }) + it("should redeem with bAsset minimums exactly equal", async () => { + const recipient = details.forgeValidator.address + await assertMassetRedemption( + details, + "10000000000000000000", + ["2499249999999999999", "2499249", "2499249999999", "2499249999999999999"], + true, + recipient, + undefined, + false, + true, + ) + }) + }) + context("uneven bAsset weights", () => { + before(async () => { + await runSetup(true, false, false, true, [1, 4, 30, 15]) + }) + it("should redeem", async () => { + const recipient = details.forgeValidator.address + await assertMassetRedemption(details, 10, [0, 0, 5, 2], true, recipient) + }) + }) + context("when most of basket in second bAsset", () => { + beforeEach(async () => { + await runSetup(true, false, false, true, [25, 125, 25, 25]) + }) + it("should redeem some of the bAssets", async () => { + const recipient = details.forgeValidator.address + // 10 * (1 - 0.03 / 100) - 0.000001 = 9996999 + await assertMassetRedemption( + details, + simpleToExactAmount(8, 18), + [simpleToExactAmount(9, 17), "4800000", simpleToExactAmount(9, 11), simpleToExactAmount(9, 17)], + true, + recipient, + undefined, + false, + true, + ) + }) + }) + describe("passing invalid arguments", async () => { + before(async () => { + await runSetup() + }) + it("should revert when mAsset quantity is zero", async () => { + const { bAssets, mAsset } = details + await assertFailedMassetRedemption("Qty==0", mAsset, 0, [2, 2, 2, 2], bAssets) + }) + it("should fail if recipient is 0x0", async () => { + const { bAssets, mAsset } = details + await assertFailedMassetRedemption("Invalid recipient", mAsset, 0, [2, 2, 2, 2], bAssets, undefined, ZERO_ADDRESS) + }) + }) + describe("failures other than invalid arguments", () => { + before(async () => { + await runSetup() + }) + context("when a bAsset minimum is not reached", () => { + const testData = [ + { + desc: "first bAsset < min", + minBassetQuantities: [3, 2, 2, 2], + }, + { + desc: "last bAsset < min", + minBassetQuantities: [2, 2, 2, 3], + }, + { + desc: "all bAsset < min", + minBassetQuantities: [3, 3, 3, 3], + }, + { + desc: "all zero except last bAsset < min", + minBassetQuantities: [0, 0, 0, 3], + }, + { + desc: "first bAsset just below min", + minBassetQuantities: ["2499250000000000000", "2499249", "2499249999999", "2499249999999999999"], + mAssetQuantity: "10000000000000000000", + quantitiesAreExact: true, + }, + { + desc: "second bAsset just below min", + minBassetQuantities: ["2499249999999999999", "2499250", "2499249999999", "2499249999999999999"], + mAssetQuantity: "10000000000000000000", + quantitiesAreExact: true, + }, + ] + testData.forEach((data) => { + it(`should revert when ${data.desc}`, async () => { + const { bAssets, mAsset } = details + await assertFailedMassetRedemption( + "bAsset qty < min qty", + mAsset, + data.mAssetQuantity || 10, + data.minBassetQuantities, + bAssets, + undefined, + undefined, + data.quantitiesAreExact, + ) + }) + }) + }) + it("should fail if sender doesn't have mAsset balance", async () => { + const { bAssets, mAsset } = details + const sender = sa.dummy1 + expect(await mAsset.balanceOf(sender.address)).eq(0) + await assertFailedMassetRedemption( + "VM Exception while processing transaction: revert", + mAsset, + 10, + [2, 2, 2, 2], + bAssets, + sender.signer, + ) + }) + context("when a bAsset has broken its peg", () => { + it("should fail if broken below peg", async () => { + const { bAssets, mAsset } = details + await assertBasketIsHealthy(mAssetMachine, details) + const bAsset = bAssets[1] + await mAsset.connect(sa.governor.signer).handlePegLoss(bAsset.address, true) + const newBasset = await mAsset.getBasset(bAsset.address) + expect(newBasset.personal.status, "bAsset broken below peg").to.eq(BassetStatus.BrokenBelowPeg) + await assertFailedMassetRedemption("In recol", mAsset, 10, [2, 2, 2, 2], bAssets) + }) + it("should fail if broken above peg", async () => { + const { bAssets, mAsset } = details + const bAsset = bAssets[0] + await mAsset.connect(sa.governor.signer).handlePegLoss(bAsset.address, false) + const newBasset = await mAsset.getBasset(bAsset.address) + expect(newBasset.personal.status, "bAsset broken above peg").to.eq(BassetStatus.BrokenAbovePeg) + await assertFailedMassetRedemption("In recol", mAsset, 10, [2, 2, 2, 2], bAssets) + }) + }) + }) + }) +}) diff --git a/test/masset/swap.spec.ts b/test/masset/swap.spec.ts new file mode 100644 index 00000000..b24547c7 --- /dev/null +++ b/test/masset/swap.spec.ts @@ -0,0 +1,755 @@ +import { Signer } from "ethers" +import { ethers } from "hardhat" +import { expect } from "chai" + +import { simpleToExactAmount, BN } from "@utils/math" +import { MassetDetails, MassetMachine, StandardAccounts, Account } from "@utils/machines" +import { Masset, MockERC20 } from "types/generated" +import { fullScale, ratioScale, ZERO_ADDRESS } from "@utils/constants" +import { assertBNSlightlyGTPercent, assertBasketIsHealthy } from "@utils/assertions" +import { BassetStatus } from "@utils/mstable-objects" + +// (AS) - test cases to add: +// - whenHealthy flag +// - asserting swapoutput < min qty by setting `multiplier` on MockValidator +describe("Masset - Swap", () => { + let sa: StandardAccounts + let mAssetMachine: MassetMachine + + let details: MassetDetails + + /** + * @dev (Re)Sets the local variables for this test file + * @param seedBasket mints 25 tokens for each bAsset + * @param useTransferFees enables transfer fees on bAssets [2,3]. + */ + const runSetup = async ( + seedBasket = true, + useTransferFees = false, + useLendingMarkets = false, + useMockValidator = true, + weights: number[] = [25, 25, 25, 25], + ): Promise => { + details = await mAssetMachine.deployMasset(useMockValidator, useLendingMarkets, useTransferFees) + if (seedBasket) { + await mAssetMachine.seedWithWeightings(details, weights) + } + } + + before("Init contract", async () => { + const accounts = await ethers.getSigners() + mAssetMachine = await new MassetMachine().initAccounts(accounts) + sa = mAssetMachine.sa + + await runSetup() + }) + + /** + * @dev Asserts that both 'swap' and 'getSwapOutput' fail for a given reason + * @param mAsset Masset instance upon which to call swap + * @param inputBasset Basset to swap out of + * @param outputAsset Asset to swap in to + * @param inputQuantity Whole units to swap out of + * @param expectedReason What is the failure response of the contract? + * @param sender Who should send the tx? Or default + * @param recipient Who should receive the output? Or default + * @param callSwapOutput Should this check be ran on 'getSwapOutput' too? + * @param swapOutputRevertExpected Should 'getSwapOutput' revert? If so, set this to true + * @param quantitiesAreExact false (default) if the input and min output quantities need to be converted to base units + */ + const assertFailedSwap = async ( + mAssetContract: Masset, + inputBasset: MockERC20, + outputAsset: MockERC20, + inputQuantity: string | BN | number, + minOutputQuantity: string | BN | number, + expectedReason: string, + sender: Signer = sa.default.signer, + recipient: string = sa.default.address, + callSwapOutput = true, + swapOutputRevertExpected = false, + swapOutputExpected: string | BN | number = 0, + quantitiesAreExact = false, + ): Promise => { + const mAsset = mAssetContract.connect(sender) + const approval: BN = await mAssetMachine.approveMasset(inputBasset, mAsset, inputQuantity, sa.default.signer, quantitiesAreExact) + + const outputDecimals = await outputAsset.decimals() + const minOutputQuantityExact = quantitiesAreExact + ? BN.from(minOutputQuantity) + : simpleToExactAmount(minOutputQuantity, outputDecimals) + + // Expect the swap to revert + await expect( + mAsset.swap(inputBasset.address, outputAsset.address, approval, minOutputQuantityExact, recipient), + `swap tx should revert with "${expectedReason}"`, + ).to.be.revertedWith(expectedReason) + + // If swap fails, then we would expect swap output to fail for the same reason, + // instead of reverting, it generally returns a response + if (callSwapOutput) { + if (swapOutputRevertExpected) { + await expect( + mAsset.getSwapOutput(inputBasset.address, outputAsset.address, approval), + `getSwapOutput call should revert with "${expectedReason}"`, + ).to.be.revertedWith(expectedReason) + } else { + const swapOutputExpectedExact = quantitiesAreExact + ? BN.from(swapOutputExpected) + : simpleToExactAmount(swapOutputExpected, outputDecimals) + const output = await mAsset.getSwapOutput(inputBasset.address, outputAsset.address, approval) + expect(output, "getSwapOutput call output").eq(swapOutputExpectedExact) + } + } + } + + /** + * @dev Asserts that a swap meets the basic validation conditions, i.e. updates + * state and affects actors balances in the correct manner + * @param md Object containing relevant base level contract info on system + * @param inputBasset Asset to use as input + * @param outputAsset Asset to use as output + * @param inputQuantity Whole units to swap out of + * @param expectSwapFee Should this swap incur a fee? + * @param recipient Specify a recipient if desired, else default + * @param sender Specify a sender if desired, else default + * @param ignoreHealthAssertions Ignore deep basket state validation? + * @param swapQuantityIsExact true if the inputQuantity does not been to be converted to base units + */ + const assertSwap = async ( + md: MassetDetails, + inputBasset: MockERC20, + outputAsset: MockERC20, + inputQuantity: BN | number, + expectSwapFee = true, + recipient: string = sa.default.address, + sender: Account = sa.default, + ignoreHealthAssertions = false, + swapQuantityIsExact = false, + minOutputQuantity: BN | number = 1, + ): Promise => { + const { platform } = md + const mAsset = md.mAsset.connect(sender.signer) + + // 1. Assert all state is currently valid and prepare objects + if (!ignoreHealthAssertions) await assertBasketIsHealthy(mAssetMachine, md) + + // Get basic before data about the actors balances + const swapperInputBalBefore = await inputBasset.balanceOf(sender.address) + const recipientOutputBalBefore = await outputAsset.balanceOf(recipient) + + // Get basic before data on the swap assets + const inputBassetBefore = await mAssetMachine.getBasset(details, inputBasset.address) + const outputBassetBefore = await mAssetMachine.getBasset(details, outputAsset.address) + const surplusBefore = await mAsset.surplus() + + // 2. Do the necessary approvals and make the calls + const approval0: BN = await mAssetMachine.approveMasset( + inputBasset, + mAsset, + BN.from(inputQuantity), + sender.signer, + swapQuantityIsExact, + ) + + // Call the swap output function to check if results match + const expectedOutputValue = await mAsset.getSwapOutput(inputBasset.address, outputAsset.address, approval0) + + // 3. Calculate expected responses + const inputQuantityExact = approval0 + + let fee = BN.from(0) + let scaledFee = BN.from(0) + let feeRate = BN.from(0) + // If there is a fee expected, then deduct it from output + if (expectSwapFee) { + feeRate = await mAsset.swapFee() + expect(feeRate, "fee rate > 0").gt(BN.from(0)) + expect(feeRate, "fee rate < fullScale / 50").lt(fullScale.div(BN.from(50))) + fee = expectedOutputValue.mul(fullScale).div(fullScale.sub(feeRate)).sub(expectedOutputValue) + expect(fee, "fee > 0").gt(BN.from(0)) + scaledFee = fee.mul(BN.from(outputBassetBefore.ratio)).div(ratioScale) + } + // Expect to be used in cache + const platformInteractionIn = await mAssetMachine.getPlatformInteraction(mAsset, "deposit", approval0, inputBassetBefore) + const platformInteractionOut = await mAssetMachine.getPlatformInteraction( + mAsset, + "withdrawal", + expectedOutputValue, + outputBassetBefore, + ) + + // FIXME can await when Waffle 3.2.2 is included in @nomiclabs/hardhat-waffle + // https://github.com/EthWorks/Waffle/issues/119 + const swapTx = mAsset.swap(inputBasset.address, outputAsset.address, approval0, minOutputQuantity, recipient) + // 4. Validate any basic events that should occur + await expect(swapTx) + .to.emit(mAsset, "Swapped") + .withArgs(sender.address, inputBasset.address, outputAsset.address, expectedOutputValue, scaledFee, recipient) + // Input Transfer event + await expect(swapTx, "Transfer event for input bAsset from sender to platform integration or mAsset") + .to.emit(inputBasset, "Transfer") + .withArgs(sender.address, inputBassetBefore.integrator ? inputBassetBefore.integratorAddr : mAsset.address, inputQuantityExact) + await expect(swapTx, "Transfer event for output bAsset from platform integration or mAsset to recipient") + .to.emit(outputAsset, "Transfer") + .withArgs(outputBassetBefore.integrator ? outputBassetBefore.integratorAddr : mAsset.address, recipient, expectedOutputValue) + await swapTx + + const inputIntegratorBalAfter = await inputBassetBefore.contract.balanceOf( + inputBassetBefore.integrator ? inputBassetBefore.integratorAddr : mAsset.address, + ) + expect(inputIntegratorBalAfter, "Input destination raw balance").eq(platformInteractionIn.rawBalance) + const outputIntegratorBalAfter = await outputBassetBefore.contract.balanceOf( + outputBassetBefore.integrator ? outputBassetBefore.integratorAddr : mAsset.address, + ) + expect(outputIntegratorBalAfter, "Output source raw balance").eq(platformInteractionOut.rawBalance) + + // 5. Validate output state + // Input + // Lending market + if (platformInteractionIn.expectInteraction) { + await expect(swapTx) + .to.emit(platform, "Deposit") + .withArgs(inputBasset.address, inputBassetBefore.pToken, platformInteractionIn.amount) + } + // Sender should have less input bAsset after + const swapperBassetBalAfter = await inputBasset.balanceOf(sender.address) + expect(swapperBassetBalAfter, "swapperBassetBalAfter incorrect").eq(swapperInputBalBefore.sub(inputQuantityExact)) + // VaultBalance should update for input bAsset + const inputBassetAfter = await mAsset.getBasset(inputBasset.address) + expect(BN.from(inputBassetAfter.data.vaultBalance), "inputBassetAfter incorrect").eq( + BN.from(inputBassetBefore.vaultBalance).add(inputQuantityExact), + ) + + // Output + // Lending market + if (platformInteractionOut.expectInteraction) { + await expect(swapTx) + .to.emit(platform, "PlatformWithdrawal") + .withArgs(outputAsset.address, outputBassetBefore.pToken, platformInteractionOut.amount, expectedOutputValue) + } else if (platformInteractionOut.hasLendingMarket) { + await expect(swapTx).to.emit(platform, "Withdrawal").withArgs(outputAsset.address, ZERO_ADDRESS, expectedOutputValue) + } + // Recipient should have output asset quantity after (minus fee) + const recipientBalAfter = await outputAsset.balanceOf(recipient) + expect(recipientBalAfter, "recipientBalAfter incorrect").eq(recipientOutputBalBefore.add(expectedOutputValue)) + // Swap estimation should match up + expect(expectedOutputValue, "expectedOutputValue incorrect").eq(recipientBalAfter.sub(recipientOutputBalBefore)) + // VaultBalance should update for output bAsset + const outputBassetAfter = await mAsset.getBasset(outputAsset.address) + expect(BN.from(outputBassetAfter.data.vaultBalance), "outputBassetAfter incorrect").eq( + BN.from(outputBassetBefore.vaultBalance).sub(expectedOutputValue), + ) + + // Global + // Fees should accrue to surplus + const surplusAfter = await mAsset.surplus() + expect(BN.from(surplusAfter), "surplusAfter incorrect").eq(BN.from(surplusBefore).add(scaledFee)) + + if (!ignoreHealthAssertions) await assertBasketIsHealthy(mAssetMachine, md) + + return expectedOutputValue + } + + describe("swapping assets", () => { + context("when within the invariant validator limits", () => { + context("and different quantities", () => { + before(async () => { + await runSetup() + }) + const testQuantities = [1, 10, 14] + testQuantities.forEach((qty) => { + it(`should swap using ${qty} quantity`, async () => { + const { bAssets } = details + await assertSwap(details, bAssets[1], bAssets[0], qty) + }) + }) + }) + it("should swap using a different recipient to the sender", async () => { + const { bAssets } = details + await assertSwap(details, bAssets[0], bAssets[1], 2, true, sa.dummy1.address) + }) + it("should swap out asset when recipient is a contract", async () => { + const { bAssets } = details + await assertSwap(details, bAssets[0], bAssets[1], 3, true, details.forgeValidator.address) + }) + it("should swap with min qty same as qty less swap fee", async () => { + const { bAssets, mAsset } = details + const inputBasset = bAssets[2] // wBTC 12 decimal places + const outputBasset = bAssets[1] // sBTC 6 decimal places + const inputQty = simpleToExactAmount(5, 12) // wBTC input qty + const expectedOutputQty = simpleToExactAmount(4.997, 6) // min output qty = 0.06% of input + const outputQty = await mAsset.getSwapOutput(inputBasset.address, outputBasset.address, inputQty) + expect(outputQty, "incorrect swap output quantity").to.eq(expectedOutputQty) + await assertSwap( + details, + inputBasset, + outputBasset, + inputQty, + true, + undefined, + undefined, + undefined, + true, // exact units + expectedOutputQty, // min output qty + ) + }) + it("should fail if min qty < output qty", async () => { + const { bAssets, mAsset } = details + await assertFailedSwap( + mAsset, + bAssets[2], // wBTC 12 decimal places + bAssets[1], // sBTC 6 decimal places + simpleToExactAmount(5, 12), // sBTC input qty + simpleToExactAmount(4.9971, 6), // min output qty = 0.06% of input + a bit + "Output qty < minimum qty", + sa.default.signer, + sa.default.address, + false, + false, + undefined, + true, // exact units + ) + }) + context("and specifying one bAsset base unit", async () => { + before(async () => { + await runSetup() + }) + it("should fail if output has less decimals", async () => { + const { bAssets, mAsset } = details + const input = bAssets[0] + const output = bAssets[1] + expect(await input.decimals()).eq(18) + expect(await output.decimals()).eq(6) + const outputQuantity = await mAsset.getSwapOutput(input.address, output.address, 1) + expect(outputQuantity, "output quantity not zero").to.eq(0) + await assertFailedSwap( + mAsset, + input, + output, + 1, + 0, + "Zero output quantity", + sa.default.signer, + sa.default.address, + false, + false, + undefined, + true, + ) + }) + it("should swap a higher q of bAsset base units if output has more decimals", async () => { + const { bAssets } = details + const input = bAssets[1] + const output = bAssets[0] + expect(await input.decimals()).eq(6) + expect(await output.decimals()).eq(18) + await assertSwap(details, input, output, 1, true, undefined, undefined, false, true) + }) + }) + context("passing invalid arguments", async () => { + before(async () => { + await runSetup() + }) + it("should fail if identical bAssets", async () => { + const { bAssets, mAsset } = details + const input = bAssets[0] + const output = input + await assertFailedSwap(mAsset, input, output, 1, 0, "Invalid pair", sa.default.signer, sa.default.address, true, true) + }) + it("should fail when 0 quantity", async () => { + const { bAssets, mAsset } = details + await assertFailedSwap( + mAsset, + bAssets[0], + bAssets[1], + 0, + 0, + "Invalid swap quantity", + sa.default.signer, + sa.default.address, + true, + true, + ) + }) + it("should fail if recipient is 0x0", async () => { + const { bAssets, mAsset } = details + await assertFailedSwap( + mAsset, + bAssets[0], + bAssets[1], + 1, + 0, + "Invalid recipient", + sa.default.signer, + ZERO_ADDRESS, + true, + false, + 0.9994, + ) + }) + it("should fail if sender doesn't have sufficient liquidity", async () => { + const { bAssets, mAsset } = details + await assertFailedSwap( + mAsset, + bAssets[0], + bAssets[1], + 1, + 0, + "VM Exception while processing transaction: revert", + sa.dummy1.signer, + sa.dummy1.address, + true, + false, + 0.9994, + ) + }) + it("should fail if sender doesn't give approval", async () => { + const { bAssets, mAsset } = details + const input = bAssets[0] + const sender = sa.dummy2 + await input.transfer(sender.address, 10000) + expect(await input.allowance(sender.address, mAsset.address)).eq(0) + expect(await input.balanceOf(sender.address)).eq(10000) + await expect( + mAsset.connect(sender.signer).swap(input.address, bAssets[1].address, 5, 1, sa.default.address), + ).to.revertedWith("VM Exception while processing transaction: revert") + }) + it("should fail if *either* bAsset does not exist", async () => { + const { bAssets, mAsset } = details + const realBasset = bAssets[0].address + const fakeBasset = sa.dummy1.address + const recipient = sa.dummy2.address + const expectedReason = "Invalid asset" + await expect(mAsset.swap(fakeBasset, realBasset, 1, 0, recipient)).to.revertedWith(expectedReason) + await expect(mAsset.swap(realBasset, fakeBasset, 1, 0, recipient)).to.revertedWith(expectedReason) + }) + it("should fail if *either* bAsset is ZERO", async () => { + const { bAssets, mAsset } = details + const realBasset = bAssets[0] + const fakeBasset = ZERO_ADDRESS + const recipient = sa.default.address + const expectedReason = "Invalid asset" + await expect(mAsset.swap(realBasset.address, fakeBasset, 1, 0, recipient)).to.revertedWith(expectedReason) + await expect(mAsset.getSwapOutput(realBasset.address, fakeBasset, 1)).to.revertedWith(expectedReason) + await expect(mAsset.swap(fakeBasset, realBasset.address, 1, 0, recipient)).to.revertedWith(expectedReason) + await expect(mAsset.getSwapOutput(fakeBasset, realBasset.address, 1)).to.revertedWith(expectedReason) + }) + it("should fail using the mAsset as the input asset", async () => { + const { bAssets, mAsset } = details + await assertFailedSwap(mAsset, mAsset, bAssets[0], 1, 0, "Invalid asset", undefined, undefined, true, true) + }) + it("should fail using an input asset not in the basket", async () => { + const { bAssets, mAsset } = details + const invalidBasset = await mAssetMachine.loadBassetProxy("Wrapped ETH", "WETH", 18) + await assertFailedSwap(mAsset, invalidBasset, bAssets[0], 1, 0, "Invalid asset", undefined, undefined, true, true) + }) + }) + context("using bAssets with transfer fees", async () => { + context("when no lending market", async () => { + before(async () => { + await runSetup(true, true) + }) + context("and input has xfer fee", () => { + it("should have lower input and proportionately lower output", async () => { + const { mAsset, bAssets } = details + const sender = sa.default.address + const recipient = sa.default.address + const inputBasset = bAssets[3] + const outputAsset = bAssets[0] + const swapQuantity = 1 + + await assertBasketIsHealthy(mAssetMachine, details) + + // 1. Get basic before data about the actors balances + const swapperInputBalBefore = await inputBasset.balanceOf(sender) + const recipientOutputBalBefore = await outputAsset.balanceOf(recipient) + + // Get basic before data on the swap assets + const inputBassetBefore = await mAsset.getBasset(inputBasset.address) + const outputBassetBefore = await mAsset.getBasset(outputAsset.address) + + // 2. Do the necessary approvals and make the calls + const approval0: BN = await mAssetMachine.approveMasset(inputBasset, mAsset, swapQuantity, sa.default.signer) + await mAsset.swap(inputBasset.address, outputAsset.address, approval0, 0, recipient) + // Senders balance goes down but vaultbalance goes up by less + + // 3. Calculate expected responses + const inputQuantityExact = simpleToExactAmount(swapQuantity, await inputBasset.decimals()) + const scaledInputQuantity = simpleToExactAmount(swapQuantity, 18) + const expectedOutputValue = scaledInputQuantity.mul(ratioScale).div(outputBassetBefore.data.ratio) + + const feeRate = await mAsset.swapFee() + const fee = expectedOutputValue.mul(feeRate).div(fullScale) + + // Input + // Sender should have less input bAsset after + const swapperBassetBalAfter = await inputBasset.balanceOf(sender) + expect(swapperBassetBalAfter).eq(swapperInputBalBefore.sub(inputQuantityExact)) + // VaultBalance should update for input bAsset + const inputBassetAfter = await mAsset.getBasset(inputBasset.address) + // Assert that only >99.7 && <100% of the asset got added to the vault + assertBNSlightlyGTPercent( + inputQuantityExact, + BN.from(inputBassetAfter.data.vaultBalance).sub(inputBassetBefore.data.vaultBalance), + "0.3", + true, + ) + // Output + // Recipient should have output asset quantity after (minus fee) + const recipientBalAfter = await outputAsset.balanceOf(recipient) + // Assert recipient only receives x amount + assertBNSlightlyGTPercent( + expectedOutputValue.sub(fee), + recipientBalAfter.sub(recipientOutputBalBefore), + "0.3", + true, + ) + + // Complete basket should remain in healthy state + await assertBasketIsHealthy(mAssetMachine, details) + }) + }) + }) + context("when a lending market integration", async () => { + before(async () => { + await runSetup(true, true, true) + }) + context("and input has xfer fee", () => { + it("should pass but return less output that input", async () => { + const { mAsset, bAssets } = details + const sender = sa.default.address + const recipient = sa.default.address + const inputBasset = bAssets[3] + const outputAsset = bAssets[0] + const swapQuantity = 1 + + await assertBasketIsHealthy(mAssetMachine, details) + + // 1. Get basic before data about the actors balances + const swapperInputBalBefore = await inputBasset.balanceOf(sender) + const recipientOutputBalBefore = await outputAsset.balanceOf(recipient) + + // Get basic before data on the swap assets + const inputBassetBefore = await mAsset.getBasset(inputBasset.address) + const outputBassetBefore = await mAsset.getBasset(outputAsset.address) + + // 2. Do the necessary approvals and make the calls + const approval0: BN = await mAssetMachine.approveMasset(inputBasset, mAsset, swapQuantity, sa.default.signer) + await mAsset.swap(inputBasset.address, outputAsset.address, approval0, 0, recipient) + // Senders balance goes down but vaultbalance goes up by less + + // 3. Calculate expected responses + const inputQuantityExact = simpleToExactAmount(swapQuantity, await inputBasset.decimals()) + const scaledInputQuantity = simpleToExactAmount(swapQuantity, 18) + const expectedOutputValue = scaledInputQuantity.mul(ratioScale).div(outputBassetBefore.data.ratio) + + const feeRate = await mAsset.swapFee() + const fee = expectedOutputValue.mul(feeRate).div(fullScale) + + // Input + // Sender should have less input bAsset after + const swapperBassetBalAfter = await inputBasset.balanceOf(sender) + expect(swapperBassetBalAfter).eq(swapperInputBalBefore.sub(inputQuantityExact)) + // VaultBalance should update for input bAsset + const inputBassetAfter = await mAsset.getBasset(inputBasset.address) + // Assert that only >99.7 && <100% of the asset got added to the vault + assertBNSlightlyGTPercent( + inputQuantityExact, + BN.from(inputBassetAfter.data.vaultBalance).sub(inputBassetBefore.data.vaultBalance), + "0.3", + true, + ) + // Output + // Recipient should have output asset quantity after (minus fee) + const recipientBalAfter = await outputAsset.balanceOf(recipient) + // Assert recipient only receives x amount + assertBNSlightlyGTPercent( + expectedOutputValue.sub(fee), + recipientBalAfter.sub(recipientOutputBalBefore), + "0.3", + true, + ) + + // Complete basket should remain in healthy state + await assertBasketIsHealthy(mAssetMachine, details) + }) + it("should fail if the system doesn't know about the fee", async () => { + const { bAssets, mAsset } = details + await mAsset.connect(sa.governor.signer).setTransferFeesFlag(bAssets[3].address, false) + await assertFailedSwap( + mAsset, + bAssets[3], + bAssets[0], + 1, + 0, + "Asset not fully transferred", + sa.default.signer, + sa.default.address, + false, + ) + }) + }) + }) + describe("when output has xfer fee", async () => { + before(async () => { + await runSetup(true, true) + }) + it("should have same input but lower physical output", async () => { + const { mAsset, bAssets } = details + const sender = sa.default.address + const recipient = sa.default.address + const inputBasset = bAssets[0] + const outputAsset = bAssets[3] + const swapQuantity = 1 + + await assertBasketIsHealthy(mAssetMachine, details) + + // 1. Get basic before data about the actors balances + const swapperInputBalBefore = await inputBasset.balanceOf(sender) + const recipientOutputBalBefore = await outputAsset.balanceOf(recipient) + + // Get basic before data on the swap assets + const inputBassetBefore = await mAsset.getBasset(inputBasset.address) + const outputBassetBefore = await mAsset.getBasset(outputAsset.address) + + // 2. Do the necessary approvals and make the calls + const approval0: BN = await mAssetMachine.approveMasset(inputBasset, mAsset, swapQuantity, sa.default.signer) + await mAsset.swap(inputBasset.address, outputAsset.address, approval0, 0, recipient) + // Senders balance goes down but vaultbalance goes up by less + + // 3. Calculate expected responses + const inputQuantityExact = simpleToExactAmount(swapQuantity, await inputBasset.decimals()) + const scaledInputQuantity = simpleToExactAmount(swapQuantity, 18) + const expectedOutputValue = scaledInputQuantity.mul(ratioScale).div(outputBassetBefore.data.ratio) + + const feeRate = await mAsset.swapFee() + const fee = expectedOutputValue.mul(feeRate).div(fullScale) + + // Input + // Sender should have less input bAsset after + const swapperBassetBalAfter = await inputBasset.balanceOf(sender) + expect(swapperBassetBalAfter).eq(swapperInputBalBefore.sub(inputQuantityExact)) + // VaultBalance should update for input bAsset + const inputBassetAfter = await mAsset.getBasset(inputBasset.address) + expect(BN.from(inputBassetAfter.data.vaultBalance)).eq( + BN.from(inputBassetBefore.data.vaultBalance).add(inputQuantityExact), + ) + // Output + // Recipient should have output asset quantity after (minus fee) + const recipientBalAfter = await outputAsset.balanceOf(recipient) + // Assert recipient only receives x amount + assertBNSlightlyGTPercent( + expectedOutputValue.sub(fee), + recipientBalAfter.sub(recipientOutputBalBefore), + "0.3", + true, + ) + + // Complete basket should remain in healthy state + await assertBasketIsHealthy(mAssetMachine, details) + }) + it("should continue to pay out", async () => { + const { bAssets, mAsset } = details + const sender = sa.default.address + const recipient = sa.dummy1.address + const inputBasset = bAssets[0] + const outputAsset = bAssets[3] + const swapQuantity = 1 + await mAsset.connect(sa.governor.signer).setTransferFeesFlag(outputAsset.address, false) + + // 1. Get basic before data about the actors balances + const swapperInputBalBefore = await inputBasset.balanceOf(sender) + const recipientOutputBalBefore = await outputAsset.balanceOf(recipient) + + // Get basic before data on the swap assets + const inputBassetBefore = await mAsset.getBasset(inputBasset.address) + const outputBassetBefore = await mAsset.getBasset(outputAsset.address) + + // 2. Do the necessary approvals and make the calls + const approval0: BN = await mAssetMachine.approveMasset(inputBasset, mAsset, swapQuantity, sa.default.signer) + await mAsset.swap(inputBasset.address, outputAsset.address, approval0, 0, recipient) + // Senders balance goes down but vaultbalance goes up by less + + // 3. Calculate expected responses + const inputQuantityExact = simpleToExactAmount(swapQuantity, await inputBasset.decimals()) + const scaledInputQuantity = simpleToExactAmount(swapQuantity, 18) + const expectedOutputValue = scaledInputQuantity.mul(ratioScale).div(outputBassetBefore.data.ratio) + + const feeRate = await mAsset.swapFee() + const fee = expectedOutputValue.mul(feeRate).div(fullScale) + + // Input + // Sender should have less input bAsset after + const swapperBassetBalAfter = await inputBasset.balanceOf(sender) + expect(swapperBassetBalAfter).eq(swapperInputBalBefore.sub(inputQuantityExact)) + // VaultBalance should update for input bAsset + const inputBassetAfter = await mAsset.getBasset(inputBasset.address) + expect(BN.from(inputBassetAfter.data.vaultBalance)).eq( + BN.from(inputBassetBefore.data.vaultBalance).add(inputQuantityExact), + ) + // Output + // Recipient should have output asset quantity after (minus fee) + const recipientBalAfter = await outputAsset.balanceOf(recipient) + // Assert recipient only receives x amount + assertBNSlightlyGTPercent( + expectedOutputValue.sub(fee), + recipientBalAfter.sub(recipientOutputBalBefore), + "0.3", + true, + ) + }) + }) + }) + context("with an affected bAsset", async () => { + beforeEach(async () => { + await runSetup() + }) + it("should fail if input basset has lost its peg", async () => { + const { bAssets, mAsset } = details + await assertBasketIsHealthy(mAssetMachine, details) + + const input = bAssets[0] + const output = bAssets[1] + + await mAsset.connect(sa.governor.signer).handlePegLoss(input.address, true) + const inputBasset = await mAsset.getBasset(input.address) + expect(inputBasset.personal.status).to.eq(BassetStatus.BrokenBelowPeg) + const outputBasset = await mAsset.getBasset(output.address) + expect(outputBasset.personal.status).to.eq(BassetStatus.Normal) + await assertFailedSwap(mAsset, input, output, 1, 0, "Unhealthy", undefined, undefined, true, false, 0.9994) + }) + it("should fail if output basset has lost its peg", async () => { + const { bAssets, mAsset } = details + await assertBasketIsHealthy(mAssetMachine, details) + + const input = bAssets[0] + const output = bAssets[1] + + await mAsset.connect(sa.governor.signer).handlePegLoss(output.address, true) + const inputBasset = await mAsset.getBasset(input.address) + expect(inputBasset.personal.status).to.eq(BassetStatus.Normal) + const outputBasset = await mAsset.getBasset(output.address) + expect(outputBasset.personal.status).to.eq(BassetStatus.BrokenBelowPeg) + await assertFailedSwap(mAsset, input, output, 1, 0, "Unhealthy", undefined, undefined, true, false, 0.9994) + }) + }) + }) + context("with assets connected to lending markets", async () => { + before(async () => { + await runSetup(true, false, true) + }) + it("should deposit into and withdraw from the lending market", async () => { + const { bAssets } = details + const [input, output] = bAssets + // On setup, 25 of each bAsset, none of which in lending markets + // Calling seedWithWeightings will deposit 5 of each into lending market + await mAssetMachine.seedWithWeightings(details, [1, 1, 1, 1]) + // Swap in 7 and out 7, and it will do a deposit into lending market, and withdrawal + await assertSwap(details, input, output, 7) + // Swap in 1 and out 1, and it will do no deposit, but simply withdrawRaw + await assertSwap(details, input, output, 1) + }) + }) + }) +}) diff --git a/test/masset/validator-etc.spec.ts b/test/masset/validator-etc.spec.ts new file mode 100644 index 00000000..9ebcb6b7 --- /dev/null +++ b/test/masset/validator-etc.spec.ts @@ -0,0 +1,210 @@ +import { ethers } from "hardhat" +import { expect } from "chai" + +import { simpleToExactAmount, BN } from "@utils/math" +import { ONE_WEEK } from "@utils/constants" +import { MassetMachine, StandardAccounts } from "@utils/machines" +import { increaseTime } from "@utils/time" +import { InvariantValidator, InvariantValidator__factory } from "types/generated" + +const config = { + a: BN.from(10000), + limits: { + min: simpleToExactAmount(5, 16), + max: simpleToExactAmount(55, 16), + }, +} +const looseConfig = { + a: BN.from(10000), + limits: { + min: simpleToExactAmount(1, 16), + max: simpleToExactAmount(99, 16), + }, +} +const startingCap = simpleToExactAmount(100, 24) // 100 million * 1e18 +const capFactor = simpleToExactAmount(1, 18) +const fee = simpleToExactAmount(6, 15) + +const getReserves = (simpleUnits: number[], decimals: number[] = simpleUnits.map(() => 18)) => + simpleUnits.map((s, i) => ({ + ratio: simpleToExactAmount(1, 8 + (18 - decimals[i])), + vaultBalance: simpleToExactAmount(s, decimals[i]), + })) + +describe("Invariant Validator", () => { + let validator: InvariantValidator + let sa: StandardAccounts + + before(async () => { + const accounts = await ethers.getSigners() + const mAssetMachine = await new MassetMachine().initAccounts(accounts) + sa = mAssetMachine.sa + validator = await new InvariantValidator__factory(sa.default.signer).deploy(startingCap, capFactor) + }) + + const redeployValidator = async (starting: BN, factor: BN) => { + validator = await new InvariantValidator__factory(sa.default.signer).deploy(starting, factor) + } + + // Cap = startingCap + (capFactor * weeksSinceLaunch^2) + describe("Enforcing the TVL cap", () => { + describe("before 7 weeks", () => { + it("should revert if we exceed the cap", async () => { + await redeployValidator(simpleToExactAmount(400000), simpleToExactAmount(900000)) + + await validator.computeMint(getReserves([90000, 90000, 90000, 90000]), 0, simpleToExactAmount(10000), looseConfig) + await expect( + validator.computeMint(getReserves([90000, 90000, 90000, 90000]), 0, simpleToExactAmount(45000), looseConfig), + ).to.be.revertedWith("Cannot exceed TVL cap") + + await increaseTime(ONE_WEEK) + + // After 1 week the cap should be 1300e21 + await validator.computeMint(getReserves([300000, 300000, 300000, 300000]), 0, simpleToExactAmount(50000), looseConfig) + await expect( + validator.computeMint(getReserves([300000, 300000, 300000, 300000]), 0, simpleToExactAmount(150000), looseConfig), + ).to.be.revertedWith("Cannot exceed TVL cap") + }) + it("should handle configurable parameters", async () => { + // Consider Bitcoin has value of ~45k + // 400e21 = 9e18, 900e21 = 2e19 + await redeployValidator(simpleToExactAmount(9, 18), simpleToExactAmount(2, 19)) + + await validator.computeMint(getReserves([2, 2, 2, 2]), 0, simpleToExactAmount(1), looseConfig) + await expect(validator.computeMint(getReserves([2, 2, 2, 2]), 0, simpleToExactAmount(3), looseConfig)).to.be.revertedWith( + "Cannot exceed TVL cap", + ) + + await increaseTime(ONE_WEEK) + + // After 1 week the cap should be ~29e18 + await validator.computeMint(getReserves([6, 6, 6, 6]), 0, simpleToExactAmount(3), looseConfig) + await expect(validator.computeMint(getReserves([6, 6, 6, 6]), 0, simpleToExactAmount(10), looseConfig)).to.be.revertedWith( + "Cannot exceed TVL cap", + ) + }) + }) + describe("after 7 weeks", () => { + it("always passes", async () => { + await redeployValidator(simpleToExactAmount(1, 19), simpleToExactAmount(1, 19)) + await validator.computeMint(getReserves([2, 2, 2, 2]), 0, simpleToExactAmount(1), looseConfig) + await expect(validator.computeMint(getReserves([2, 2, 2, 2]), 0, simpleToExactAmount(4), looseConfig)).to.be.revertedWith( + "Cannot exceed TVL cap", + ) + + await increaseTime(ONE_WEEK.mul(7).sub(20)) + + // After 7 weeks the cap should be 1e19 + (1e19 * 49) = 5e20 + await validator.computeMint(getReserves([120, 120, 120, 120]), 0, simpleToExactAmount(1), looseConfig) + await expect( + validator.computeMint(getReserves([120, 120, 120, 120]), 0, simpleToExactAmount(100), looseConfig), + ).to.be.revertedWith("Cannot exceed TVL cap") + + // Increase 30 seconds, weeksSinceLaunch > 7, and test passes + await increaseTime(30) + + await validator.computeMint(getReserves([120, 120, 120, 120]), 0, simpleToExactAmount(100), looseConfig) + }) + it("passes even with huge amount", async () => { + await redeployValidator(simpleToExactAmount(1, 19), simpleToExactAmount(1, 19)) + + await increaseTime(ONE_WEEK.mul(7).add(5)) + + await validator.computeMint(getReserves([1000, 1000, 1000, 1000]), 0, simpleToExactAmount(1000), looseConfig) + }) + }) + }) + + describe("Validating bAssets with different ratios", () => { + const x1 = getReserves([10, 10, 10, 10], [10, 18, 6, 18]) + const x2 = getReserves([10, 10, 10, 10], [18, 18, 6, 18]) + + before(async () => { + await redeployValidator(simpleToExactAmount(100, 19), simpleToExactAmount(1, 19)) + }) + it("should treat them equally in mint", async () => { + const r1 = await validator.computeMint(x1, 0, simpleToExactAmount(1, 10), looseConfig) + const r2 = await validator.computeMint(x2, 0, simpleToExactAmount(1, 18), looseConfig) + + expect(r1).eq(r2) + }) + it("should treat them equally in mint multi", async () => { + const r1 = await validator.computeMintMulti(x1, [0, 1], [simpleToExactAmount(1, 10), simpleToExactAmount(1, 18)], looseConfig) + const r2 = await validator.computeMintMulti(x2, [0, 1], [simpleToExactAmount(1, 18), simpleToExactAmount(1, 18)], looseConfig) + + expect(r1).eq(r2) + }) + it("should treat them equally in swap", async () => { + const r1 = await validator.computeSwap(x1, 0, 1, simpleToExactAmount(1, 10), fee, looseConfig) + const r2 = await validator.computeSwap(x2, 0, 1, simpleToExactAmount(1, 18), fee, looseConfig) + + expect(r1[0]).eq(r2[0]) + expect(r1[1]).eq(r2[1]) + }) + it("should treat them equally in redeem", async () => { + const r1 = await validator.computeRedeem(x1, 0, simpleToExactAmount(1, 18), looseConfig) + const r2 = await validator.computeRedeem(x2, 0, simpleToExactAmount(1, 18), looseConfig) + + expect(r1).eq(r2.div(simpleToExactAmount(1, 8))) + }) + it("should treat them equally in redeem multi", async () => { + const r1 = await validator.computeRedeemExact(x1, [0, 1], [simpleToExactAmount(1, 10), simpleToExactAmount(1, 18)], looseConfig) + const r2 = await validator.computeRedeemExact(x2, [0, 1], [simpleToExactAmount(1, 18), simpleToExactAmount(1, 18)], looseConfig) + + expect(r1).eq(r2) + }) + }) + + describe("With params in different orders", () => { + const x = getReserves([10, 10, 10, 10], [10, 18, 6, 18]) + before(async () => { + await redeployValidator(simpleToExactAmount(100, 19), simpleToExactAmount(1, 19)) + }) + it("should treat them equally in mint multi", async () => { + const r1 = await validator.computeMintMulti(x, [0, 1], [simpleToExactAmount(1, 10), simpleToExactAmount(1, 18)], looseConfig) + const r2 = await validator.computeMintMulti(x, [1, 0], [simpleToExactAmount(1, 18), simpleToExactAmount(1, 10)], looseConfig) + + expect(r1).eq(r2) + }) + it("should treat them equally in redeem multi", async () => { + const r1 = await validator.computeRedeemExact(x, [0, 1], [simpleToExactAmount(1, 10), simpleToExactAmount(1, 18)], looseConfig) + const r2 = await validator.computeRedeemExact(x, [1, 0], [simpleToExactAmount(1, 18), simpleToExactAmount(1, 10)], looseConfig) + + expect(r1).eq(r2) + }) + }) + + describe("Exceeding max weights", () => { + const x = getReserves([30, 10, 10, 10]) + before(async () => { + await redeployValidator(simpleToExactAmount(100, 19), simpleToExactAmount(1, 19)) + }) + it("should throw in mint multi", async () => { + // max weight is 55% + await expect( + validator.computeMintMulti(x, [0, 1], [simpleToExactAmount(9, 18), simpleToExactAmount(1, 18)], config), + ).to.be.revertedWith("Exceeds weight limits") + }) + }) + + describe("Using invalid args", () => { + const x = getReserves([10, 10, 10, 10], [10, 18, 6, 18]) + it("should throw in mint", async () => { + await expect(validator.computeMint(x, 4, simpleToExactAmount(1, 18), config)).to.be.reverted + }) + it("should throw in mint multi", async () => { + await expect(validator.computeMintMulti(x, [4, 5], [simpleToExactAmount(1, 18), simpleToExactAmount(1, 18)], config)).to.be + .reverted + }) + it("should throw in swap", async () => { + await expect(validator.computeSwap(x, 4, 1, simpleToExactAmount(1, 18), fee, config)).to.be.reverted + }) + it("should throw in redeem", async () => { + await expect(validator.computeRedeem(x, 4, simpleToExactAmount(1, 18), config)).to.be.reverted + }) + it("should throw in redeem multi", async () => { + await expect(validator.computeRedeemExact(x, [1, 4], [simpleToExactAmount(1, 18), simpleToExactAmount(1, 18)], config)).to.be + .reverted + }) + }) +}) diff --git a/test/masset/validator-multi.spec.ts b/test/masset/validator-multi.spec.ts new file mode 100644 index 00000000..9216c53d --- /dev/null +++ b/test/masset/validator-multi.spec.ts @@ -0,0 +1,351 @@ +/* eslint-disable @typescript-eslint/no-loop-func */ +/* eslint-disable no-await-in-loop */ +/* eslint-disable no-restricted-syntax */ +import { ethers } from "hardhat" +import { expect } from "chai" + +import { simpleToExactAmount, BN } from "@utils/math" +import { DEAD_ADDRESS, MAX_UINT256, ZERO_ADDRESS } from "@utils/constants" +import { ExposedInvariantValidator__factory, ExposedMasset } from "types/generated" +import { assertBNClose, assertBNSlightlyGT } from "@utils/assertions" +import { MassetMachine, StandardAccounts } from "@utils/machines" +import fullTestData from "@utils/validator-data/full/integrationData.json" +import sampleTestData from "@utils/validator-data/sample/integrationData.json" + +const config = { + a: BN.from(120), + limits: { + min: simpleToExactAmount(5, 16), + max: simpleToExactAmount(75, 16), + }, +} +const startingCap = simpleToExactAmount(1, 29) +const capFactor = simpleToExactAmount(1, 18) + +const ratio = simpleToExactAmount(1, 8) +const tolerance = BN.from(10) + +const cv = (n: number | string): BN => BN.from(BigInt(n).toString()) +const getReserves = (data: any) => + [0, 1, 2, 3, 4, 5] + .filter((i) => data[`reserve${i}`]) + .map((i) => ({ + ratio, + vaultBalance: cv(data[`reserve${i}`]), + })) + +const chosenTestData = process.env.LONG_TESTS === "true" ? fullTestData : sampleTestData + +describe("Invariant Validator - One basket many tests", () => { + let mAsset: ExposedMasset + let sa: StandardAccounts + let recipient: string + let bAssetAddresses: string[] + before(async () => { + const accounts = await ethers.getSigners() + const mAssetMachine = await new MassetMachine().initAccounts(accounts) + sa = mAssetMachine.sa + recipient = await sa.default.address + + const renBTC = await mAssetMachine.loadBassetProxy("Ren BTC", "renBTC", 18) + const sBTC = await mAssetMachine.loadBassetProxy("Synthetix BTC", "sBTC", 18) + const wBTC = await mAssetMachine.loadBassetProxy("Wrapped BTC", "wBTC", 18) + const bAssets = [renBTC, sBTC, wBTC] + bAssetAddresses = bAssets.map((b) => b.address) + const forgeVal = await new ExposedInvariantValidator__factory(sa.default.signer).deploy(startingCap, capFactor) + + const ManagerFactory = await ethers.getContractFactory("Manager") + const managerLib = await ManagerFactory.deploy() + + const MassetFactory = ( + await ethers.getContractFactory("ExposedMasset", { + libraries: { + Manager: managerLib.address, + }, + }) + ).connect(sa.default.signer) + mAsset = (await MassetFactory.deploy(DEAD_ADDRESS)) as ExposedMasset + await mAsset.initialize( + "mStable Asset", + "mAsset", + forgeVal.address, + bAssets.map((b) => ({ + addr: b.address, + integrator: ZERO_ADDRESS, + hasTxFee: false, + status: 0, + })), + config, + ) + + await Promise.all(bAssets.map((b) => b.approve(mAsset.address, MAX_UINT256))) + + const reserves = getReserves(chosenTestData) + + await mAsset.mintMulti( + bAssetAddresses, + reserves.map((r) => r.vaultBalance), + 0, + recipient, + ) + }) + + interface Data { + totalSupply: BN + surplus: BN + vaultBalances: BN[] + k: BN + } + const getData = async (_mAsset: ExposedMasset): Promise => ({ + totalSupply: await _mAsset.totalSupply(), + surplus: await _mAsset.surplus(), + vaultBalances: (await _mAsset.getBassets())[1].map((b) => b[1]), + k: await _mAsset.getK(), + }) + + describe("Run all the data", () => { + let dataBefore: Data + let lastKDiff = BN.from(0) + let count = 0 + + for (const testData of chosenTestData.actions) { + describe(`Action ${(count += 1)}`, () => { + before(async () => { + dataBefore = await getData(mAsset) + }) + switch (testData.type) { + case "mint": + if (testData.hardLimitError) { + it(`throws Max Weight error when minting ${testData.inputQty.toString()} bAssets with index ${ + testData.inputIndex + }`, async () => { + await expect( + mAsset.mint(bAssetAddresses[testData.inputIndex], cv(testData.inputQty), 0, recipient), + ).to.be.revertedWith("Exceeds weight limits") + + await expect( + mAsset.getMintOutput(bAssetAddresses[testData.inputIndex], cv(testData.inputQty)), + ).to.be.revertedWith("Exceeds weight limits") + }) + } else { + it(`should deposit ${testData.inputQty.toString()} bAssets with index ${testData.inputIndex}`, async () => { + const expectedOutput = await mAsset.getMintOutput( + bAssetAddresses[testData.inputIndex], + cv(testData.inputQty), + ) + assertBNClose(expectedOutput, cv(testData.expectedQty), tolerance) + + await mAsset.mint( + bAssetAddresses[testData.inputIndex], + cv(testData.inputQty), + cv(testData.expectedQty).sub(tolerance), + recipient, + ) + + const dataMid = await getData(mAsset) + assertBNClose(dataMid.totalSupply.sub(dataBefore.totalSupply), expectedOutput, tolerance) + }) + } + break + case "mintMulti": + { + const qtys = testData.inputQtys.map((b) => cv(b)) + if (testData.hardLimitError) { + it(`throws Max Weight error when minting ${qtys} bAssets with index ${testData.inputIndex}`, async () => { + await expect(mAsset.mintMulti(bAssetAddresses, qtys, 0, recipient)).to.be.revertedWith( + "Exceeds weight limits", + ) + + await expect(mAsset.getMintMultiOutput(bAssetAddresses, qtys)).to.be.revertedWith( + "Exceeds weight limits", + ) + }) + } else { + it(`should mintMulti ${qtys} bAssets`, async () => { + const expectedOutput = await mAsset.getMintMultiOutput(bAssetAddresses, qtys) + assertBNClose(expectedOutput, cv(testData.expectedQty), tolerance) + + await mAsset.mintMulti(bAssetAddresses, qtys, cv(testData.expectedQty).sub(tolerance), recipient) + + const dataMid = await getData(mAsset) + assertBNClose(dataMid.totalSupply.sub(dataBefore.totalSupply), expectedOutput, tolerance) + }) + } + } + break + case "swap": + if (testData.hardLimitError) { + it(`throws Max Weight error when swapping ${testData.inputQty.toString()} ${testData.inputIndex} for ${ + testData.outputIndex + }`, async () => { + await expect( + mAsset.swap( + bAssetAddresses[testData.inputIndex], + bAssetAddresses[testData.outputIndex], + cv(testData.inputQty), + 0, + recipient, + ), + ).to.be.revertedWith("Exceeds weight limits") + await expect( + mAsset.getSwapOutput( + bAssetAddresses[testData.inputIndex], + bAssetAddresses[testData.outputIndex], + cv(testData.inputQty), + ), + ).to.be.revertedWith("Exceeds weight limits") + }) + } else { + it(`swaps ${testData.inputQty.toString()} ${testData.inputIndex} for ${testData.outputIndex}`, async () => { + const expectedOutput = await mAsset.getSwapOutput( + bAssetAddresses[testData.inputIndex], + bAssetAddresses[testData.outputIndex], + cv(testData.inputQty), + ) + assertBNClose(expectedOutput, cv(testData.expectedQty), tolerance) + + await mAsset.swap( + bAssetAddresses[testData.inputIndex], + bAssetAddresses[testData.outputIndex], + cv(testData.inputQty), + cv(testData.expectedQty).sub(tolerance), + recipient, + ) + }) + } + break + case "redeem": + if (testData.hardLimitError) { + it(`throws Max Weight error when redeeming ${testData.inputQty} mAssets for bAsset ${testData.inputIndex}`, async () => { + await expect( + mAsset.redeem(bAssetAddresses[testData.inputIndex], testData.inputQty, 0, recipient), + ).to.be.revertedWith("Exceeds weight limits") + await expect( + mAsset.getRedeemOutput(bAssetAddresses[testData.inputIndex], testData.inputQty), + ).to.be.revertedWith("Exceeds weight limits") + }) + } else if (testData.insufficientLiquidityError) { + it(`throws insufficient liquidity error when redeeming ${testData.inputQty} mAssets for bAsset ${testData.inputIndex}`, async () => { + await expect( + mAsset.redeem(bAssetAddresses[testData.inputIndex], testData.inputQty, 0, recipient), + ).to.be.revertedWith("VM Exception") + await expect( + mAsset.getRedeemOutput(bAssetAddresses[testData.inputIndex], testData.inputQty), + ).to.be.revertedWith("VM Exception") + }) + } else { + it(`redeem ${testData.inputQty} mAssets for bAsset ${testData.inputIndex}`, async () => { + const expectedOutput = await mAsset.getRedeemOutput(bAssetAddresses[testData.inputIndex], testData.inputQty) + assertBNClose(expectedOutput, cv(testData.expectedQty), tolerance) + + await mAsset.redeem( + bAssetAddresses[testData.inputIndex], + testData.inputQty, + cv(testData.expectedQty).sub(tolerance), + recipient, + ) + }) + } + break + case "redeemMasset": + { + const qtys = testData.expectedQtys.map((b) => cv(b).sub(5)) + if (testData.insufficientLiquidityError) { + it(`throws throw insufficient liquidity error when redeeming ${testData.inputQty} mAsset`, async () => { + await expect(mAsset.redeemMasset(cv(testData.inputQty), qtys, recipient)).to.be.revertedWith( + "VM Exception", + ) + }) + } else if (testData.hardLimitError) { + it(`throws Max Weight error when redeeming ${qtys} bAssets`, async () => { + await expect(mAsset.redeemMasset(cv(testData.inputQty), qtys, recipient)).to.be.revertedWith( + "Exceeds weight limits", + ) + throw new Error("invalid exception") + }) + } else { + it(`redeem ${testData.inputQty} mAssets for proportionate bAssets`, async () => { + await mAsset.redeemMasset(cv(testData.inputQty), qtys, recipient) + }) + } + } + break + case "redeemBassets": + { + const qtys = testData.inputQtys.map((b) => cv(b)) + + if (testData.insufficientLiquidityError) { + it(`throws throw insufficient liquidity error when redeeming ${qtys} bAssets`, async () => { + await expect(mAsset.redeemExactBassets(bAssetAddresses, qtys, 100, recipient)).to.be.revertedWith( + "VM Exception", + ) + await expect(mAsset.getRedeemExactBassetsOutput(bAssetAddresses, qtys)).to.be.revertedWith( + "VM Exception", + ) + }) + } else if (testData.hardLimitError) { + it(`throws Max Weight error when redeeming ${qtys} bAssets`, async () => { + await expect(mAsset.redeemExactBassets(bAssetAddresses, qtys, 100, recipient)).to.be.revertedWith( + "Exceeds weight limits", + ) + await expect(mAsset.getRedeemExactBassetsOutput(bAssetAddresses, qtys)).to.be.revertedWith( + "Exceeds weight limits", + ) + }) + } else { + it(`redeem ${qtys} bAssets`, async () => { + const expectedOutput = await mAsset.getRedeemExactBassetsOutput(bAssetAddresses, qtys) + const testDataOutput = cv(testData.expectedQty).add(cv(testData.swapFee)) + assertBNClose(expectedOutput, testDataOutput, tolerance) + + await mAsset.redeemExactBassets(bAssetAddresses, qtys, testDataOutput.add(tolerance), recipient) + + const dataMid = await getData(mAsset) + assertBNClose(dataBefore.totalSupply.sub(dataMid.totalSupply), expectedOutput, tolerance) + }) + } + } + break + default: + throw Error("unknown action") + } + + it("holds invariant after action", async () => { + const dataEnd = await getData(mAsset) + // 1. Check resulting reserves + if (testData.reserves) { + dataEnd.vaultBalances.map((vb, i) => assertBNClose(vb, cv(testData.reserves[i]), BN.from(1000))) + } + // 2. Check swap fee accrual + if (testData.swapFee) { + assertBNClose( + dataEnd.surplus, + dataBefore.surplus.add(cv(testData.swapFee)), + 2, + "Swap fees should accrue accurately after each action", + ) + } + // 3. Check that invariant holds: `totalSupply + surplus = k = invariant(reserves)` + // After each action, this property should hold true, proving 100% that mint/swap/redeem hold, + // and fees are being paid 100% accurately. This should show that the redeemBasset holds. + assertBNSlightlyGT( + dataEnd.k, + dataEnd.surplus.add(dataEnd.totalSupply), + BN.from(1000000000000), + false, + "K does not hold", + ) + // The dust collected should always increase in favour of the system + const newKDiff = dataEnd.k.sub(dataEnd.surplus.add(dataEnd.totalSupply)) + const cachedLastDiff = lastKDiff + lastKDiff = newKDiff + if (testData.type !== "redeemMasset") { + expect(newKDiff, "Dust can only accumulate in favour of the system").gte(cachedLastDiff) + } else if (newKDiff < cachedLastDiff) { + assertBNClose(newKDiff, cachedLastDiff, BN.from(200), "K dust accrues on redeemMasset") + } + }) + }) + } + }) +}) diff --git a/test/masset/validator-single.spec.ts b/test/masset/validator-single.spec.ts new file mode 100644 index 00000000..db7eea0c --- /dev/null +++ b/test/masset/validator-single.spec.ts @@ -0,0 +1,289 @@ +/* eslint-disable @typescript-eslint/no-loop-func */ +/* eslint-disable no-restricted-syntax */ +import { assertBNClose } from "@utils/assertions" +import { DEAD_ADDRESS, fullScale, MAX_UINT256, ZERO_ADDRESS } from "@utils/constants" +import { MassetMachine, StandardAccounts } from "@utils/machines" +import { BN, simpleToExactAmount } from "@utils/math" +import { mintData, mintMultiData, redeemData, redeemExactData, redeemMassetData, swapData } from "@utils/validator-data" + +import { expect } from "chai" +import { ethers } from "hardhat" +import { InvariantValidator, InvariantValidator__factory, Masset, Masset__factory, MockERC20 } from "types/generated" + +const config = { + a: BN.from(12000), + limits: { + min: simpleToExactAmount(5, 16), + max: simpleToExactAmount(75, 16), + }, +} +const startingCap = simpleToExactAmount(100, 24) // 100 million * 1e18 +const capFactor = simpleToExactAmount(1, 18) + +const ratio = simpleToExactAmount(1, 8) +const swapFeeRate = simpleToExactAmount(6, 14) +const tolerance = 1 + +const cv = (n: number | string): BN => BN.from(BigInt(n).toString()) +const getReserves = (data: any) => + [0, 1, 2, 3, 4] + .filter((i) => data[`reserve${i}`]) + .map((i) => ({ + ratio, + vaultBalance: cv(data[`reserve${i}`]), + })) + +const runLongTests = process.env.LONG_TESTS === "true" + +describe("Invariant Validator - One basket one test", () => { + let validator: InvariantValidator + let sa: StandardAccounts + + before(async () => { + const accounts = await ethers.getSigners() + const mAssetMachine = await new MassetMachine().initAccounts(accounts) + sa = mAssetMachine.sa + validator = await new InvariantValidator__factory(sa.default.signer).deploy(startingCap, capFactor) + }) + describe("Compute Mint", () => { + let count = 0 + const testMintData = runLongTests ? mintData.full : mintData.sample + for (const testData of testMintData) { + const reserves = getReserves(testData) + + describe(`reserves: ${testData.reserve0}, ${testData.reserve1}, ${testData.reserve2}`, () => { + for (const testMint of testData.mints) { + if (testMint.hardLimitError) { + it(`${(count += 1)} throws Max Weight error when minting ${testMint.bAssetQty.toString()} bAssets with index ${ + testMint.bAssetIndex + }`, async () => { + await expect( + validator.computeMint(reserves, testMint.bAssetIndex, cv(testMint.bAssetQty), config), + ).to.be.revertedWith("Exceeds weight limits") + }) + } else { + it(`${(count += 1)} deposit ${testMint.bAssetQty.toString()} bAssets with index ${ + testMint.bAssetIndex + }`, async () => { + const mAssetQty = await validator.computeMint(reserves, testMint.bAssetIndex, cv(testMint.bAssetQty), config) + expect(mAssetQty).eq(cv(testMint.expectedQty)) + }) + } + } + }) + } + }) + describe("Compute Multi Mint", () => { + let count = 0 + const testMultiMintData = runLongTests ? mintMultiData.full : mintMultiData.sample + for (const testData of testMultiMintData) { + const reserves = getReserves(testData) + describe(`reserves: ${testData.reserve0}, ${testData.reserve1}, ${testData.reserve2}`, () => { + for (const testMint of testData.mints) { + const qtys = testMint.bAssetQtys.map((b) => cv(b)) + it(`${(count += 1)} deposit ${qtys} bAssets`, async () => { + const mAssetQty = await validator.computeMintMulti(reserves, [0, 1, 2], qtys, config) + expect(mAssetQty).eq(cv(testMint.expectedQty)) + }) + } + }) + } + }) + describe("Compute Swap", () => { + let count = 0 + const testSwapData = runLongTests ? swapData.full : swapData.sample + for (const testData of testSwapData) { + const reserves = getReserves(testData) + describe(`reserves: ${testData.reserve0}, ${testData.reserve1}, ${testData.reserve2}`, () => { + for (const testSwap of testData.swaps) { + if (testSwap.hardLimitError) { + it(`${(count += 1)} throws Max Weight error when swapping ${testSwap.inputQty.toString()} ${ + testSwap.inputIndex + } for ${testSwap.outputIndex}`, async () => { + await expect( + validator.computeSwap( + reserves, + testSwap.inputIndex, + testSwap.outputIndex, + cv(testSwap.inputQty), + swapFeeRate, + config, + ), + ).to.be.revertedWith("Exceeds weight limits") + }) + } else { + it(`${(count += 1)} swaps ${testSwap.inputQty.toString()} ${testSwap.inputIndex} for ${ + testSwap.outputIndex + }`, async () => { + const result = await validator.computeSwap( + reserves, + testSwap.inputIndex, + testSwap.outputIndex, + cv(testSwap.inputQty), + swapFeeRate, + config, + ) + assertBNClose(result.bAssetOutputQuantity, cv(testSwap.outputQty), tolerance) + }) + } + } + }) + } + }) + describe("Compute Redeem", () => { + let count = 0 + const testRedeemData = runLongTests ? redeemData.full : redeemData.sample + for (const testData of testRedeemData) { + const reserves = getReserves(testData) + describe(`reserves: ${testData.reserve0}, ${testData.reserve1}, ${testData.reserve2}`, () => { + for (const testRedeem of testData.redeems) { + // Deduct swap fee before performing redemption + const netInput = cv(testRedeem.mAssetQty) + .mul(fullScale.sub(swapFeeRate)) + .div(fullScale) + + if (testRedeem.hardLimitError) { + it(`${(count += 1)} throws Max Weight error when redeeming ${testRedeem.mAssetQty} mAssets for bAsset ${ + testRedeem.bAssetIndex + }`, async () => { + await expect(validator.computeRedeem(reserves, testRedeem.bAssetIndex, netInput, config)).to.be.revertedWith( + "Exceeds weight limits", + ) + }) + } else { + it(`${(count += 1)} redeem ${testRedeem.mAssetQty} mAssets for bAsset ${testRedeem.bAssetIndex}`, async () => { + const bAssetQty = await validator.computeRedeem(reserves, testRedeem.bAssetIndex, netInput, config) + assertBNClose(bAssetQty, cv(testRedeem.outputQty), 2) + }) + } + } + }) + } + }) + describe("Compute Exact Redeem", () => { + let count = 0 + const testRedeemExactData = runLongTests ? redeemExactData.full : redeemExactData.sample + for (const testData of testRedeemExactData) { + const reserves = getReserves(testData) + + describe(`reserves: ${testData.reserve0}, ${testData.reserve1}, ${testData.reserve2}`, () => { + for (const testRedeem of testData.redeems) { + // Deduct swap fee after performing redemption + const applyFee = (m: BN): BN => m.mul(fullScale).div(fullScale.sub(swapFeeRate)) + const qtys = testRedeem.bAssetQtys.map((b) => cv(b)) + + if (testRedeem.insufficientLiquidityError) { + it(`${(count += 1)} throws throw insufficient liquidity error when redeeming ${qtys} bAssets`, async () => { + await expect(validator.computeRedeemExact(reserves, [0, 1, 2], qtys, config)).to.be.revertedWith("VM Exception") + }) + } else if (testRedeem.hardLimitError) { + it(`${(count += 1)} throws Max Weight error when redeeming ${qtys} bAssets`, async () => { + await expect(validator.computeRedeemExact(reserves, [0, 1, 2], qtys, config)).to.be.revertedWith( + "Exceeds weight limits", + ) + }) + } else { + it(`${(count += 1)} redeem ${qtys} bAssets`, async () => { + const mAssetQty = await validator.computeRedeemExact(reserves, [0, 1, 2], qtys, config) + assertBNClose(applyFee(mAssetQty), cv(testRedeem.mAssetQty), tolerance) + }) + } + } + }) + } + }) + + // Test data seems to be incorrect + // After minting with the given reserves, we receive more mAsset back than is calculated in the cases. + // This causes the redeem amounts to be lower, because we are redeeming a lower proportion of the basket + describe("Compute Redeem Masset", () => { + let count = 0 + const testRedeemData = runLongTests ? redeemMassetData.full : redeemMassetData.sample + for (const testData of testRedeemData) { + const reserves = getReserves(testData) + describe(`reserves: ${testData.reserve0}, ${testData.reserve1}, ${testData.reserve2}`, () => { + let mAsset: Masset + let recipient: string + let bAssetAddresses: string[] + let bAssets: MockERC20[] + let massetFactory: Masset__factory + let forgeValAddr: string + before(async () => { + const accounts = await ethers.getSigners() + const mAssetMachine = await new MassetMachine().initAccounts(accounts) + sa = mAssetMachine.sa + recipient = await sa.default.address + + const renBTC = await mAssetMachine.loadBassetProxy("Ren BTC", "renBTC", 18) + const sBTC = await mAssetMachine.loadBassetProxy("Synthetix BTC", "sBTC", 18) + const wBTC = await mAssetMachine.loadBassetProxy("Wrapped BTC", "wBTC", 18) + bAssets = [renBTC, sBTC, wBTC] + bAssetAddresses = bAssets.map((b) => b.address) + const forgeVal = await new InvariantValidator__factory(sa.default.signer).deploy(startingCap, capFactor) + forgeValAddr = forgeVal.address + const ManagerFactory = await ethers.getContractFactory("Manager") + const managerLib = await ManagerFactory.deploy() + + massetFactory = ( + await ethers.getContractFactory("Masset", { + libraries: { + Manager: managerLib.address, + }, + }) + ).connect(sa.default.signer) as Masset__factory + }) + + beforeEach(async () => { + mAsset = (await massetFactory.deploy(DEAD_ADDRESS)) as Masset + await mAsset.initialize( + "mStable Asset", + "mAsset", + forgeValAddr, + bAssets.map((b) => ({ + addr: b.address, + integrator: ZERO_ADDRESS, + hasTxFee: false, + status: 0, + })), + { + a: BN.from(120), + limits: { + min: simpleToExactAmount(5, 16), + max: simpleToExactAmount(75, 16), + }, + }, + ) + await Promise.all(bAssets.map((b) => b.approve(mAsset.address, MAX_UINT256))) + await mAsset.mintMulti( + bAssetAddresses, + reserves.map((r) => r.vaultBalance), + 0, + recipient, + ) + }) + + for (const testRedeem of testData.redeems) { + const qtys = testRedeem.bAssetQtys.map((b) => cv(b)) + if (testRedeem.insufficientLiquidityError) { + it(`${(count += 1)} throws throw insufficient liquidity error when redeeming ${ + testRedeem.mAssetQty + } mAsset`, async () => { + await expect(mAsset.redeemMasset(cv(testRedeem.mAssetQty), qtys, recipient)).to.be.revertedWith("VM Exception") + }) + } else if (testRedeem.hardLimitError) { + it(`${(count += 1)} throws Max Weight error when redeeming ${qtys} bAssets`, async () => { + await expect(mAsset.redeemMasset(cv(testRedeem.mAssetQty), qtys, recipient)).to.be.revertedWith( + "Exceeds weight limits", + ) + throw new Error("invalid exception") + }) + } else { + it(`${(count += 1)} redeem ${testRedeem.mAssetQty} mAssets for proportionate bAssets`, async () => { + await mAsset.redeemMasset(cv(testRedeem.mAssetQty), qtys, recipient) + }) + } + } + }) + } + }) +}) diff --git a/test/meta-token/TestMetaToken.spec.ts b/test/meta-token/TestMetaToken.spec.ts deleted file mode 100644 index 9ba2f0a9..00000000 --- a/test/meta-token/TestMetaToken.spec.ts +++ /dev/null @@ -1,200 +0,0 @@ -import { expectEvent, expectRevert } from "@openzeppelin/test-helpers"; - -import { StandardAccounts, SystemMachine } from "@utils/machines"; -import { simpleToExactAmount } from "@utils/math"; -import { BN } from "@utils/tools"; - -import envSetup from "@utils/env_setup"; -import * as t from "types/generated"; -import shouldBehaveLikeModule from "../shared/behaviours/Module.behaviour"; -import shouldBehaveLikeERC20 from "../shared/behaviours/ERC20.behaviour"; -import shouldBehaveLikeERC20Burnable from "../shared/behaviours/ERC20Burnable.behaviour"; - -const MetaToken = artifacts.require("MetaToken"); - -const { expect } = envSetup.configure(); - -contract("MetaToken", async (accounts) => { - const ctx: { - module?: t.ModuleInstance; - token?: t.ERC20Instance; - burnableToken?: t.ERC20BurnableInstance; - } = {}; - const sa = new StandardAccounts(accounts); - let systemMachine: SystemMachine; - let meta: t.MetaTokenInstance; - - const redeployMeta = async ( - nexusAddress = systemMachine.nexus.address, - fundRecipient = sa.fundManager, - ): Promise => { - return MetaToken.new(nexusAddress, fundRecipient); - }; - - before(async () => { - systemMachine = new SystemMachine(sa.all); - await systemMachine.initialiseMocks(false, false); - meta = await redeployMeta(); - }); - - describe("verifying Module initialization", async () => { - before("reset contracts", async () => { - meta = await redeployMeta(); - ctx.module = meta as t.ModuleInstance; - }); - - shouldBehaveLikeModule(ctx as Required, sa); - - it("should properly store valid arguments", async () => { - expect(await meta.nexus()).eq(systemMachine.nexus.address); - }); - }); - - describe("verifying ERC20 properties", async () => { - beforeEach("reset contracts", async () => { - meta = await redeployMeta(); - ctx.token = meta as t.ERC20Instance; - ctx.burnableToken = meta as t.ERC20BurnableInstance; - }); - - shouldBehaveLikeERC20( - ctx as Required, - "ERC20", - simpleToExactAmount(100000000, 18), - sa.fundManager, - sa.dummy1, - sa.dummy2, - ); - - shouldBehaveLikeERC20Burnable( - ctx as Required, - sa.fundManager, - simpleToExactAmount(100000000, 18), - [sa.dummy1], - ); - - it("should properly store valid arguments", async () => { - expect(await meta.name()).eq("Meta"); - expect(await meta.symbol()).eq("MTA"); - expect(await meta.decimals()).bignumber.eq(new BN(18)); - }); - }); - - describe("custom ERC20Mintable", async () => { - beforeEach("reset contracts", async () => { - meta = await redeployMeta(); - }); - describe("managing minters", () => { - it("should not allow minters to add minters", async () => { - await expectRevert( - meta.addMinter(sa.dummy2, { from: sa.dummy1 }), - "Only governor can execute", - ); - await expectRevert( - meta.addMinter(sa.dummy2, { from: sa.dummy2 }), - "Only governor can execute", - ); - }); - it("should allow the governor to add a minter", async () => { - expect(await meta.isMinter(sa.dummy1)).eq(false); - const tx = await meta.addMinter(sa.dummy1, { from: sa.governor }); - expectEvent(tx.receipt, "MinterAdded", { - account: sa.dummy1, - }); - expect(await meta.isMinter(sa.dummy1)).eq(true); - }); - it("should not allow minters to remove minters", async () => { - // Add minter role - expect(await meta.isMinter(sa.dummy1)).eq(false); - await meta.addMinter(sa.dummy1, { from: sa.governor }); - expect(await meta.isMinter(sa.dummy1)).eq(true); - // Minter or other cannot remove role - await expectRevert( - meta.removeMinter(sa.dummy1, { from: sa.dummy1 }), - "Only governor can execute", - ); - await expectRevert( - meta.removeMinter(sa.dummy1, { from: sa.dummy2 }), - "Only governor can execute", - ); - }); - it("should allow the governor to remove a minter", async () => { - // Add minter role - expect(await meta.isMinter(sa.dummy1)).eq(false); - await meta.addMinter(sa.dummy1, { from: sa.governor }); - expect(await meta.isMinter(sa.dummy1)).eq(true); - // Minter or other cannot remove role - const tx = await meta.removeMinter(sa.dummy1, { from: sa.governor }); - expectEvent(tx.receipt, "MinterRemoved", { - account: sa.dummy1, - }); - expect(await meta.isMinter(sa.dummy1)).eq(false); - }); - it("should allow a minter to renounce their minting ability", async () => { - expect(await meta.isMinter(sa.dummy1)).eq(false); - await meta.addMinter(sa.dummy1, { from: sa.governor }); - expect(await meta.isMinter(sa.dummy1)).eq(true); - // Minter or other cannot remove role - await meta.renounceMinter({ from: sa.dummy1 }); - expect(await meta.isMinter(sa.dummy1)).eq(false); - await expectRevert( - meta.renounceMinter({ from: sa.dummy1 }), - "Roles: account does not have role", - ); - }); - }); - describe("minting Meta", () => { - it("should not allow a EOA to mint", async () => { - await expectRevert( - meta.mint(sa.dummy1, 1, { from: sa.default }), - "MinterRole: caller does not have the Minter role", - ); - }); - it("should not allow the governor to mint directly", async () => { - await expectRevert( - meta.mint(sa.dummy1, 1, { from: sa.governor }), - "MinterRole: caller does not have the Minter role", - ); - }); - it("should allow a minter to mint", async () => { - // Assign minting privs - await meta.addMinter(sa.dummy1, { from: sa.governor }); - expect(await meta.isMinter(sa.dummy1)).eq(true); - - // Get balance - const balBefore = await meta.balanceOf(sa.dummy1); - - // Mint - await meta.mint(sa.dummy1, 1, { from: sa.dummy1 }); - - // Check output bal - const balAfter = await meta.balanceOf(sa.dummy1); - expect(balAfter).bignumber.eq(balBefore.add(new BN(1))); - }); - it("should not allow a removed minter", async () => { - // Assign minting privs - await meta.addMinter(sa.dummy1, { from: sa.governor }); - expect(await meta.isMinter(sa.dummy1)).eq(true); - - // Get balance - const balBefore = await meta.balanceOf(sa.dummy1); - - // Mint - await meta.mint(sa.dummy1, 1, { from: sa.dummy1 }); - - // Check output bal - const balAfter = await meta.balanceOf(sa.dummy1); - expect(balAfter).bignumber.eq(balBefore.add(new BN(1))); - - // Remove minter privs - await meta.removeMinter(sa.dummy1, { from: sa.governor }); - expect(await meta.isMinter(sa.dummy1)).eq(false); - - await expectRevert( - meta.mint(sa.dummy1, 1, { from: sa.dummy1 }), - "MinterRole: caller does not have the Minter role", - ); - }); - }); - }); -}); diff --git a/test/nexus/TestNexus.spec.ts b/test/nexus/TestNexus.spec.ts deleted file mode 100644 index 8a8f0332..00000000 --- a/test/nexus/TestNexus.spec.ts +++ /dev/null @@ -1,842 +0,0 @@ -import { expectEvent, expectRevert, time } from "@openzeppelin/test-helpers"; -import { StandardAccounts, SystemMachine } from "@utils/machines"; -import { padRight, BN } from "@utils/tools"; -import { ZERO_ADDRESS, ZERO, ONE_DAY, ONE_WEEK } from "@utils/constants"; -import { keccak256 } from "web3-utils"; - -import envSetup from "@utils/env_setup"; -import * as t from "types/generated"; - -import shouldBehaveLikeClaimable from "../governance/ClaimableGovernor.behaviour"; -import shouldBehaveLikeDelayedClaimable from "../governance/DelayedClaimableGovernor.behaviour"; - -const { expect } = envSetup.configure(); - -/** @dev Uses generic module getter to validate that a module exists with the specified properties */ -async function expectInModules( - nexus: t.NexusInstance, - _key: string, - _addr: string, - _isLocked: boolean, -): Promise { - /* eslint-disable prefer-const */ - let addr: string; - let isLocked: boolean; - [addr, isLocked] = await nexus.modules(keccak256(_key)); - expect(addr, "Module address not matched").to.equal(_addr); - expect(isLocked, "Module isLocked not matched").to.equal(_isLocked); - const exists = await nexus.moduleExists(keccak256(_key)); - if (addr !== ZERO_ADDRESS) { - expect(exists).to.equal(true); - } else { - expect(exists).to.equal(false); - } -} - -async function expectInProposedModules( - nexus: t.NexusInstance, - _key: string, - _newAddress: string, - _timestamp: BN, -): Promise { - let newAddress: string; - let timestamp: BN; - [newAddress, timestamp] = await nexus.proposedModules(keccak256(_key)); - /* eslint-enable prefer-const */ - expect(newAddress, "New address not matched in proposed modules").to.equal(_newAddress); - expect(timestamp, "The timestamp not matched in proposed modules").to.bignumber.equal( - _timestamp, - ); -} - -async function expectInProposedLockModules( - nexus: t.NexusInstance, - _key: string, - _timestamp: BN, -): Promise { - const timestamp: BN = await nexus.proposedLockModules(keccak256(_key)); - expect(timestamp, "The timestamp not matched in proposed lock modules").to.bignumber.equal( - _timestamp, - ); -} - -contract("Nexus", async (accounts) => { - const sa = new StandardAccounts(accounts); - let systemMachine: SystemMachine; - let nexus: t.NexusInstance; - - describe("Behavior like...", () => { - const ctx: { claimable?: t.DelayedClaimableGovernorInstance } = {}; - before("", async () => { - systemMachine = new SystemMachine(sa.all); - }); - beforeEach("Init contract", async () => { - ctx.claimable = await systemMachine.deployNexus() as t.DelayedClaimableGovernorInstance; - }); - context("should behave like ClaimableGovernor", () => { - shouldBehaveLikeClaimable(ctx as Required, sa); - }); - - context("should behave like DelayedClaimableGovernor", () => { - beforeEach("", async () => { - const { other } = sa; - await ctx.claimable.requestGovernorChange(other, { from: sa.governor }); - }); - - shouldBehaveLikeDelayedClaimable(ctx as Required, sa); - }); - }); - - describe("Before initialize", () => { - it("should have correct default parameters", async () => { - // Deploy new nexus - nexus = await systemMachine.deployNexus(); - const governor = await nexus.governor(); - const initialized = await nexus.initialized(); - const upgradeDelay = await nexus.UPGRADE_DELAY(); - expect(governor).to.equal(sa.governor); - expect(initialized).to.equal(false); - expect(upgradeDelay).to.bignumber.equals(ONE_WEEK); - }); - }); - - describe("initialize()", () => { - beforeEach("deploy nexus instance", async () => { - // Deploy new nexus, to override - nexus = await systemMachine.deployNexus(); - }); - context("should succeed", () => { - it("with default modules", async () => { - await systemMachine.initialiseMocks(); - nexus = systemMachine.nexus; - // initialized - const initialized = await nexus.initialized(); - expect(initialized).to.equal(true); - - // validate modules - await expectInModules( - nexus, - "SavingsManager", - systemMachine.savingsManager.address, - false, - ); - }); - it("when current governor called the function", async () => { - await nexus.initialize([keccak256("dummy1")], [sa.dummy1], [true], sa.governor, { - from: sa.governor, - }); - await expectInModules(nexus, "dummy1", sa.dummy1, true); - }); - it("when different governor address passed", async () => { - const govBefore = await nexus.governor(); - await nexus.initialize([keccak256("dummy")], [sa.default], [true], sa.other, { - from: sa.governor, - }); - await expectInModules(nexus, "dummy", sa.default, true); - const govAfter = await nexus.governor(); - expect(govBefore).to.not.equal(govAfter); - expect(govBefore).to.equal(sa.governor); - expect(govAfter).to.equal(sa.other); - }); - }); - context("should fail", () => { - it("when called by other than governor", async () => { - await expectRevert( - nexus.initialize([], [], [], sa.governor), - "GOV: caller is not the Governor", - ); - }); - it("when initialized with same address for different modules", async () => { - await expectRevert( - nexus.initialize( - [keccak256("dummy1"), keccak256("dummy2")], - [sa.dummy1, sa.dummy1], - [false, false], - sa.governor, - { from: sa.governor }, - ), - "Modules must have unique addr", - ); - await expectInModules(nexus, "dummy1", ZERO_ADDRESS, false); - await expectInModules(nexus, "dummy2", ZERO_ADDRESS, false); - }); - it("when initialized with an empty array", async () => { - await expectRevert( - nexus.initialize([], [], [], sa.governor, { from: sa.governor }), - "No keys provided", - ); - }); - it("when initialized with wrong array length for addresses array", async () => { - await expectRevert( - nexus.initialize( - [keccak256("dummy")], - [sa.default, sa.other], - [true], - sa.governor, - { - from: sa.governor, - }, - ), - "Insufficient address data", - ); - await expectInModules(nexus, "dummy", ZERO_ADDRESS, false); - }); - it("when initialized with wrong array length for isLocked array", async () => { - await expectRevert( - nexus.initialize( - [keccak256("dummy")], - [sa.default], - [true, false], - sa.governor, - { - from: sa.governor, - }, - ), - "Insufficient locked statuses", - ); - await expectInModules(nexus, "dummy", ZERO_ADDRESS, false); - }); - - it("when already initialized", async () => { - await nexus.initialize([keccak256("dummy1")], [sa.dummy1], [true], sa.governor, { - from: sa.governor, - }); - await expectInModules(nexus, "dummy1", sa.dummy1, true); - // must fail - await expectRevert( - nexus.initialize([keccak256("dummy")], [sa.default], [true], sa.governor, { - from: sa.governor, - }), - "Nexus is already initialized", - ); - await expectInModules(nexus, "dummy1", sa.dummy1, true); - }); - }); - }); - - beforeEach("Init contract", async () => { - nexus = await systemMachine.deployNexus(); - await nexus.initialize( - [keccak256("dummy3"), keccak256("dummy4")], - [sa.dummy3, sa.dummy4], - [true, false], - sa.governor, - { from: sa.governor }, - ); - await expectInModules(nexus, "dummy3", sa.dummy3, true); - await expectInModules(nexus, "dummy4", sa.dummy4, false); - }); - - describe("proposeModule()", () => { - context("should fail", () => { - it("when not initialized", async () => { - const initialized = await nexus.initialized(); - expect(initialized).to.equal(true); - }); - it("when not called by Governor", async () => { - await expectRevert( - nexus.proposeModule(keccak256("dummy"), sa.default, { from: sa.other }), - "GOV: caller is not the Governor", - ); - await expectInProposedModules(nexus, "dummy", ZERO_ADDRESS, ZERO); - }); - it("when empty key", async () => { - await expectRevert( - nexus.proposeModule("0x00", sa.default, { from: sa.governor }), - "Key must not be zero", - ); - await expectInProposedModules(nexus, "0x00", ZERO_ADDRESS, ZERO); - }); - it("when zero address", async () => { - await expectRevert( - nexus.proposeModule(keccak256("dummy"), ZERO_ADDRESS, { from: sa.governor }), - "Module address must not be 0", - ); - await expectInProposedModules(nexus, "dummy", ZERO_ADDRESS, ZERO); - }); - it("when module key & address are same", async () => { - await expectInModules(nexus, "dummy4", sa.dummy4, false); - await expectRevert( - nexus.proposeModule(keccak256("dummy4"), sa.dummy4, { from: sa.governor }), - "Module already has same address", - ); - await expectInProposedModules(nexus, "dummy4", ZERO_ADDRESS, ZERO); - }); - it("when module is locked (update for existing module)", async () => { - await expectInModules(nexus, "dummy3", sa.dummy3, true); - await expectRevert( - nexus.proposeModule(keccak256("dummy3"), sa.other, { from: sa.governor }), - "Module must be unlocked", - ); - await expectInProposedModules(nexus, "dummy3", ZERO_ADDRESS, ZERO); - }); - it("when module already proposed", async () => { - await nexus.proposeModule(keccak256("dummy2"), sa.dummy2, { from: sa.governor }); - const timestamp = await time.latest(); - await expectInProposedModules(nexus, "dummy2", sa.dummy2, timestamp); - - await expectRevert( - nexus.proposeModule(keccak256("dummy2"), sa.dummy3, { from: sa.governor }), - "Module already proposed", - ); - await expectInProposedModules(nexus, "dummy2", sa.dummy2, timestamp); - }); - }); - context("should succeed", () => { - it("when a new module is proposed", async () => { - await nexus.proposeModule(keccak256("dummy1"), sa.dummy1, { from: sa.governor }); - const lastTimestamp = await time.latest(); - - await expectInProposedModules(nexus, "dummy1", sa.dummy1, lastTimestamp); - }); - it("when an existing module address is updated", async () => { - await expectInModules(nexus, "dummy4", sa.dummy4, false); - - // propose new address - await nexus.proposeModule(keccak256("dummy4"), sa.other, { from: sa.governor }); - const lastTimestamp = await time.latest(); - - await expectInProposedModules(nexus, "dummy4", sa.other, lastTimestamp); - - // address is not updated in modules mapping - await expectInModules(nexus, "dummy4", sa.dummy4, false); - }); - }); - }); - - describe("cancelProposedModule()", () => { - context("should fail", () => { - it("when not initialized", async () => { - const initialized = await nexus.initialized(); - expect(initialized).to.equal(true); - }); - it("when not called by Governor", async () => { - await expectRevert( - nexus.cancelProposedModule(keccak256("dummy"), { from: sa.other }), - "GOV: caller is not the Governor", - ); - }); - it("when proposed module not found", async () => { - await expectRevert( - nexus.cancelProposedModule(keccak256("dummy"), { from: sa.governor }), - "Proposed module not found", - ); - }); - }); - context("should succeed", () => { - it("when cancelling existing proposed module", async () => { - // propose a new module - // ===================== - await nexus.proposeModule(keccak256("dummy1"), sa.dummy1, { from: sa.governor }); - // validate proposed module - - // validate dummy1 added - const latestTimestamp = await time.latest(); - await expectInProposedModules(nexus, "dummy1", sa.dummy1, latestTimestamp); - - // validate dummy3 still exist - await expectInModules(nexus, "dummy3", sa.dummy3, true); - - // cancel the module - // ================== - const tx = await nexus.cancelProposedModule(keccak256("dummy1"), { - from: sa.governor, - }); - // validate cancelled - await expectInProposedModules(nexus, "dummy1", ZERO_ADDRESS, ZERO); - - // expect event - expectEvent(tx.receipt, "ModuleCancelled", { - key: padRight(keccak256("dummy1"), 64), - }); - - // validate dummy3 still exist - await expectInModules(nexus, "dummy3", sa.dummy3, true); - }); - }); - }); - - describe("acceptProposedModule()", () => { - context("should fail", () => { - it("when not initialized", async () => { - const initialized = await nexus.initialized(); - expect(initialized).to.equal(true); - }); - it("when not called by Governor", async () => { - await expectRevert( - nexus.acceptProposedModule(keccak256("dummy"), { from: sa.other }), - "GOV: caller is not the Governor", - ); - }); - it("when non existing key passed", async () => { - await expectRevert( - nexus.acceptProposedModule(keccak256("dummy"), { from: sa.governor }), - "Module upgrade delay not over", - ); - }); - it("when delay not over", async () => { - await nexus.proposeModule(keccak256("dummy1"), sa.dummy1, { from: sa.governor }); - const timeWhenModuleProposed = await time.latest(); - await time.increase(ONE_DAY); - await expectRevert( - nexus.acceptProposedModule(keccak256("dummy1"), { from: sa.governor }), - "Module upgrade delay not over", - ); - - // validate - await expectInProposedModules(nexus, "dummy1", sa.dummy1, timeWhenModuleProposed); - - // validate module still not accepted - await expectInModules(nexus, "dummy1", ZERO_ADDRESS, false); - }); - }); - context("should succeed", () => { - it("when accepted after delay is over", async () => { - await nexus.proposeModule(keccak256("dummy1"), sa.dummy1, { from: sa.governor }); - const timeWhenModuleProposed = await time.latest(); - - // validate - await expectInProposedModules(nexus, "dummy1", sa.dummy1, timeWhenModuleProposed); - - await time.increase(ONE_WEEK); - await nexus.acceptProposedModule(keccak256("dummy1"), { from: sa.governor }); - - // validate module accepted - await expectInModules(nexus, "dummy1", sa.dummy1, false); - - // validate data deleted from proposedModules map - await expectInProposedModules(nexus, "dummy1", ZERO_ADDRESS, ZERO); - }); - }); - }); - - describe("acceptProposedModules()", () => { - context("should fail", () => { - it("when not initialized", async () => { - const initialized = await nexus.initialized(); - expect(initialized).to.equal(true); - }); - it("when not called by Governor", async () => { - await expectRevert( - nexus.acceptProposedModules([keccak256("dummy")], { from: sa.other }), - "GOV: caller is not the Governor", - ); - }); - it("when empty array", async () => { - await expectRevert( - nexus.acceptProposedModules([], { from: sa.governor }), - "Keys array empty", - ); - }); - it("when non existing key passed", async () => { - await expectRevert( - nexus.acceptProposedModules([keccak256("dummy")], { from: sa.governor }), - "Module upgrade delay not over", - ); - }); - it("when module not proposed", async () => { - await expectRevert( - nexus.acceptProposedModules([keccak256("dummy1")], { from: sa.governor }), - "Module upgrade delay not over", - ); - }); - it("when module is locked", async () => { - // update address request - await expectInModules(nexus, "dummy4", sa.dummy4, false); - await nexus.proposeModule(keccak256("dummy4"), sa.other, { from: sa.governor }); - const timestampWhenProposed = await time.latest(); - await expectInProposedModules(nexus, "dummy4", sa.other, timestampWhenProposed); - await time.increase(ONE_DAY); - // lock request - await nexus.requestLockModule(keccak256("dummy4"), { from: sa.governor }); - await expectInProposedLockModules(nexus, "dummy4", await time.latest()); - - await time.increase(ONE_WEEK); - // module locked - await nexus.lockModule(keccak256("dummy4"), { from: sa.governor }); - await expectInModules(nexus, "dummy4", sa.dummy4, true); - - // now accpet update request - must fail - await expectRevert( - nexus.acceptProposedModules([keccak256("dummy4")], { from: sa.governor }), - "Module must be unlocked", - ); - await expectInProposedModules(nexus, "dummy4", sa.other, timestampWhenProposed); - }); - it("when address is already used by another module", async () => { - // proposed new module - dummy1 - await nexus.proposeModule(keccak256("dummy1"), sa.dummy1, { from: sa.governor }); - await expectInProposedModules(nexus, "dummy1", sa.dummy1, await time.latest()); - - // propose new module - dummy2 with dummy1 as address - await nexus.proposeModule(keccak256("dummy2"), sa.dummy1, { from: sa.governor }); - await expectInProposedModules(nexus, "dummy2", sa.dummy1, await time.latest()); - - await time.increase(ONE_WEEK); - - // dummy1 accepted - await nexus.acceptProposedModules([keccak256("dummy1")], { from: sa.governor }); - await expectInModules(nexus, "dummy1", sa.dummy1, false); - - // dummy2 must be rejected - await expectRevert( - nexus.acceptProposedModules([keccak256("dummy2")], { from: sa.governor }), - "Modules must have unique addr", - ); - }); - it("when delay is not over", async () => { - await nexus.proposeModule(keccak256("dummy1"), sa.dummy1, { from: sa.governor }); - await time.increase(ONE_DAY); - await expectRevert( - nexus.acceptProposedModules([keccak256("dummy1")], { from: sa.governor }), - "Module upgrade delay not over", - ); - - // not present in modules - await expectInModules(nexus, "dummy1", ZERO_ADDRESS, false); - }); - it("when delay is less then 10 second of opt out period", async () => { - await nexus.proposeModule(keccak256("dummy1"), sa.dummy1, { from: sa.governor }); - await time.increase(ONE_WEEK.sub(new BN(10))); - await expectRevert( - nexus.acceptProposedModules([keccak256("dummy1")], { from: sa.governor }), - "Module upgrade delay not over", - ); - - // not present in modules - await expectInModules(nexus, "dummy1", ZERO_ADDRESS, false); - }); - }); - context("should succeed", () => { - it("when accepted a proposed Module", async () => { - await nexus.proposeModule(keccak256("dummy1"), sa.dummy1, { from: sa.governor }); - await time.increase(ONE_WEEK); - const tx = await nexus.acceptProposedModules([keccak256("dummy1")], { - from: sa.governor, - }); - - // validate event - await expectEvent(tx.receipt, "ModuleAdded", { - key: padRight(keccak256("dummy1"), 64), - addr: sa.dummy1, - isLocked: false, - }); - - // validate - added in "modules" mapping - await expectInModules(nexus, "dummy1", sa.dummy1, false); - - // validate - removed from "proposedModules" mapping - await expectInProposedModules(nexus, "dummy1", ZERO_ADDRESS, ZERO); - }); - it("when delay is more then 10 second of opt out period", async () => { - await nexus.proposeModule(keccak256("dummy1"), sa.dummy1, { from: sa.governor }); - await time.increase(ONE_WEEK.add(new BN(10))); - const tx = await nexus.acceptProposedModules([keccak256("dummy1")], { - from: sa.governor, - }); - - // validate event - await expectEvent(tx.receipt, "ModuleAdded", { - key: padRight(keccak256("dummy1"), 64), - addr: sa.dummy1, - isLocked: false, - }); - }); - it("when module address update request accepted", async () => { - // validate - existing module present in "modules" mapping - await expectInModules(nexus, "dummy4", sa.dummy4, false); - - await nexus.proposeModule(keccak256("dummy4"), sa.other, { from: sa.governor }); - - await time.increase(ONE_WEEK); - - const tx = await nexus.acceptProposedModules([keccak256("dummy4")], { - from: sa.governor, - }); - - // validate event - await expectEvent(tx.receipt, "ModuleAdded", { - key: padRight(keccak256("dummy4"), 64), - addr: sa.other, - isLocked: false, - }); - - // validate - added in "modules" mapping - await expectInModules(nexus, "dummy4", sa.other, false); - - // validate - removed from "proposedModules" mapping - await expectInProposedModules(nexus, "dummy4", ZERO_ADDRESS, ZERO); - }); - }); - }); - - describe("requestLockModule()", () => { - context("should fail", () => { - it("when not initialized", async () => { - const initialized = await nexus.initialized(); - expect(initialized).to.equal(true); - }); - it("when not called by the Governor", async () => { - await expectRevert( - nexus.requestLockModule(keccak256("dummy"), { from: sa.other }), - "GOV: caller is not the Governor", - ); - }); - it("when module not exist", async () => { - await expectRevert( - nexus.requestLockModule(keccak256("dummy"), { from: sa.governor }), - "Module must exist", - ); - }); - it("when module key is zero", async () => { - await expectRevert( - nexus.requestLockModule("0x00", { from: sa.governor }), - "Module must exist", - ); - }); - it("when module already locked", async () => { - await expectRevert( - nexus.requestLockModule(keccak256("dummy3"), { from: sa.governor }), - "Module must be unlocked", - ); - }); - it("when locked already proposed", async () => { - // lock proposed - nexus.requestLockModule(keccak256("dummy4"), { from: sa.governor }); - await expectRevert( - nexus.requestLockModule(keccak256("dummy4"), { from: sa.governor }), - "Lock already proposed", - ); - }); - }); - context("should succeed", () => { - it("when a fresh lock request initiated", async () => { - // lock proposed - const tx = await nexus.requestLockModule(keccak256("dummy4"), { - from: sa.governor, - }); - const latestTimestamp = await time.latest(); - expectEvent(tx.receipt, "ModuleLockRequested", { - key: padRight(keccak256("dummy4"), 64), - timestamp: latestTimestamp, - }); - const requestTimestamp = await nexus.proposedLockModules(keccak256("dummy4")); - expect(requestTimestamp).to.bignumber.equal(latestTimestamp); - }); - }); - }); - - describe("cancelLockModule()", () => { - context("should fail", () => { - it("when not initialized", async () => { - const initialized = await nexus.initialized(); - expect(initialized).to.equal(true); - }); - it("when not called by Governor", async () => { - await expectRevert( - nexus.cancelLockModule(keccak256("dummy"), { from: sa.other }), - "GOV: caller is not the Governor", - ); - }); - it("when not proposed lock before", async () => { - await expectRevert( - nexus.cancelLockModule(keccak256("dummy"), { from: sa.governor }), - "Module lock request not found", - ); - }); - it("when zero key", async () => { - await expectRevert( - nexus.cancelLockModule("0x00", { from: sa.governor }), - "Module lock request not found", - ); - }); - it("when lock request not found", async () => { - await expectRevert( - nexus.cancelLockModule(keccak256("dummy4"), { from: sa.governor }), - "Module lock request not found", - ); - }); - }); - context("should succeed", () => { - it("when a valid cancel lock request", async () => { - await expectInProposedLockModules(nexus, "dummy4", ZERO); - - await nexus.requestLockModule(keccak256("dummy4"), { from: sa.governor }); - - const latestTimestamp = await time.latest(); - await expectInProposedLockModules(nexus, "dummy4", latestTimestamp); - - const tx = await nexus.cancelLockModule(keccak256("dummy4"), { from: sa.governor }); - - // validate event - expectEvent(tx.receipt, "ModuleLockCancelled", { - key: padRight(keccak256("dummy4"), 64), - }); - - await expectInProposedLockModules(nexus, "dummy4", ZERO); - - await expectInModules(nexus, "dummy4", sa.dummy4, false); - }); - }); - }); - - describe("lockModule()", () => { - context("should fail", () => { - it("when not initialized", async () => { - const initialized = await nexus.initialized(); - expect(initialized).to.equal(true); - }); - it("when not called by Governor", async () => { - await expectRevert( - nexus.lockModule(keccak256("dummy"), { from: sa.other }), - "GOV: caller is not the Governor", - ); - }); - it("when not existing key passed", async () => { - await expectRevert( - nexus.lockModule(keccak256("dummy"), { from: sa.governor }), - "Delay not over", - ); - }); - it("when delay not over", async () => { - await nexus.requestLockModule(keccak256("dummy4"), { from: sa.governor }); - await time.increase(ONE_DAY); - await expectRevert( - nexus.lockModule(keccak256("dummy4"), { from: sa.governor }), - "Delay not over", - ); - }); - it("when delay is less then 10 second of opt out period", async () => { - await nexus.requestLockModule(keccak256("dummy4"), { from: sa.governor }); - await time.increase(ONE_WEEK.sub(new BN(10))); - await expectRevert( - nexus.lockModule(keccak256("dummy4"), { from: sa.governor }), - "Delay not over", - ); - }); - }); - context("should succeed", () => { - it("when a valid lock Module", async () => { - await expectInModules(nexus, "dummy4", sa.dummy4, false); - - await nexus.requestLockModule(keccak256("dummy4"), { from: sa.governor }); - await expectInProposedLockModules(nexus, "dummy4", await time.latest()); - - await time.increase(ONE_WEEK); - - const tx = await nexus.lockModule(keccak256("dummy4"), { from: sa.governor }); - // validate event - expectEvent(tx.receipt, "ModuleLockEnabled", { - key: padRight(keccak256("dummy4"), 64), - }); - - await expectInModules(nexus, "dummy4", sa.dummy4, true); - }); - it("when delay is more then 10 second of opt out period", async () => { - await expectInModules(nexus, "dummy4", sa.dummy4, false); - - await nexus.requestLockModule(keccak256("dummy4"), { from: sa.governor }); - await expectInProposedLockModules(nexus, "dummy4", await time.latest()); - - await time.increase(ONE_WEEK.add(new BN(10))); - - const tx = await nexus.lockModule(keccak256("dummy4"), { from: sa.governor }); - await expectInProposedLockModules(nexus, "dummy4", ZERO); - // validate event - expectEvent(tx.receipt, "ModuleLockEnabled", { - key: padRight(keccak256("dummy4"), 64), - }); - - await expectInModules(nexus, "dummy4", sa.dummy4, true); - }); - }); - }); - - describe("moduleExists()", () => { - context("should return false", () => { - it("when key not exist", async () => { - const result = await nexus.moduleExists(keccak256("dummy")); - expect(result).to.equal(false); - }); - it("when key is zero", async () => { - const result = await nexus.moduleExists("0x00"); - expect(result).to.equal(false); - }); - }); - context("should return true", () => { - it("when a valid module key", async () => { - const result = await nexus.moduleExists(keccak256("dummy3")); - expect(result).to.equal(true); - }); - }); - }); - - describe("Extra tests", () => { - context("should not allow", () => { - it("proposeModule + requestLockModule for a same key", async () => { - await nexus.proposeModule(keccak256("dummy1"), sa.dummy1, { from: sa.governor }); - await expectInProposedModules(nexus, "dummy1", sa.dummy1, await time.latest()); - await expectInModules(nexus, "dummy1", ZERO_ADDRESS, false); - - await time.increase(ONE_WEEK); - - await nexus.acceptProposedModule(keccak256("dummy1"), { from: sa.governor }); - await expectInModules(nexus, "dummy1", sa.dummy1, false); - - await nexus.requestLockModule(keccak256("dummy1"), { from: sa.governor }); - await expectInProposedLockModules(nexus, "dummy1", await time.latest()); - - await time.increase(ONE_WEEK); - - await nexus.lockModule(keccak256("dummy1"), { from: sa.governor }); - await expectInProposedLockModules(nexus, "dummy1", ZERO); - await expectInModules(nexus, "dummy1", sa.dummy1, true); - }); - }); - context("should succeed", () => { - it("when propose a module, cancel it and then propose the same module it again", async () => { - await nexus.proposeModule(keccak256("dummy1"), sa.dummy1, { from: sa.governor }); - await expectInProposedModules(nexus, "dummy1", sa.dummy1, await time.latest()); - await expectInModules(nexus, "dummy1", ZERO_ADDRESS, false); - - await nexus.cancelProposedModule(keccak256("dummy1"), { from: sa.governor }); - await expectInProposedModules(nexus, "dummy1", ZERO_ADDRESS, ZERO); - await expectInModules(nexus, "dummy1", ZERO_ADDRESS, false); - - await nexus.proposeModule(keccak256("dummy1"), sa.dummy1, { from: sa.governor }); - await expectInProposedModules(nexus, "dummy1", sa.dummy1, await time.latest()); - await expectInModules(nexus, "dummy1", ZERO_ADDRESS, false); - }); - it("can propose multiple modules and cancel one, and accept one, and leave one", async () => { - await nexus.proposeModule(keccak256("dummy1"), sa.dummy1, { from: sa.governor }); - await expectInProposedModules(nexus, "dummy1", sa.dummy1, await time.latest()); - await expectInModules(nexus, "dummy1", ZERO_ADDRESS, false); - - await nexus.proposeModule(keccak256("dummy2"), sa.dummy2, { from: sa.governor }); - await expectInProposedModules(nexus, "dummy2", sa.dummy2, await time.latest()); - await expectInModules(nexus, "dummy2", ZERO_ADDRESS, false); - - await nexus.proposeModule(keccak256("other"), sa.other, { from: sa.governor }); - const timestampOther = await time.latest(); - await expectInProposedModules(nexus, "other", sa.other, timestampOther); - await expectInModules(nexus, "other", ZERO_ADDRESS, false); - - await time.increase(ONE_WEEK); - - // accept - await nexus.acceptProposedModule(keccak256("dummy1"), { from: sa.governor }); - await expectInProposedModules(nexus, "dummy1", ZERO_ADDRESS, ZERO); - await expectInModules(nexus, "dummy1", sa.dummy1, false); - - // cancel - await nexus.cancelProposedModule(keccak256("dummy2"), { from: sa.governor }); - await expectInProposedModules(nexus, "dummy2", ZERO_ADDRESS, ZERO); - await expectInModules(nexus, "dummy2", ZERO_ADDRESS, false); - - // "other" is un-affected - await expectInProposedModules(nexus, "other", sa.other, timestampOther); - await expectInModules(nexus, "other", ZERO_ADDRESS, false); - }); - }); - }); -}); diff --git a/test/rewards/RewardsDistributionRecipient.behaviour.ts b/test/rewards/RewardsDistributionRecipient.behaviour.ts deleted file mode 100644 index c9b1d29a..00000000 --- a/test/rewards/RewardsDistributionRecipient.behaviour.ts +++ /dev/null @@ -1,48 +0,0 @@ -import * as t from "types/generated"; -import { StandardAccounts } from "@utils/machines"; -import { constants, expectRevert } from "@openzeppelin/test-helpers"; -import shouldBehaveLikeModule from "../shared/behaviours/Module.behaviour"; - -const { ZERO_ADDRESS } = constants; - -function behaveLikeAModule( - ctx: { - module: t.ModuleInstance; - }, - sa: StandardAccounts, -): void { - return shouldBehaveLikeModule(ctx, sa); -} - -export default function shouldBehaveLikeDistributionRecipient( - ctx: { - recipient: t.RewardsDistributionRecipientInstance; - }, - moduleCtx: { - module: t.ModuleInstance; - }, - sa: StandardAccounts, -): void { - behaveLikeAModule(moduleCtx, sa); - - it("should have a distributor", async () => { - const distributor = await ctx.recipient.rewardsDistributor(); - assert.isTrue(distributor !== ZERO_ADDRESS); - }); - - it("should allow governor to change the distributor", async () => { - const newDistributor = sa.other; - await ctx.recipient.setRewardsDistribution(newDistributor, { from: sa.governor }); - assert.isTrue((await ctx.recipient.rewardsDistributor()) === newDistributor); - }); - - it("should prevent change from non-governor", async () => { - const newDistributor = sa.other; - const oldDistributor = await ctx.recipient.rewardsDistributor(); - await expectRevert( - ctx.recipient.setRewardsDistribution(newDistributor, { from: sa.default }), - "Only governor can execute", - ); - assert.isTrue((await ctx.recipient.rewardsDistributor()) === oldDistributor); - }); -} diff --git a/test/rewards/TestRewardsDistributor.spec.ts b/test/rewards/TestRewardsDistributor.spec.ts deleted file mode 100644 index ab8b85c5..00000000 --- a/test/rewards/TestRewardsDistributor.spec.ts +++ /dev/null @@ -1,432 +0,0 @@ -import { expectRevert, expectEvent } from "@openzeppelin/test-helpers"; - -import { StandardAccounts, SystemMachine } from "@utils/machines"; -import { simpleToExactAmount } from "@utils/math"; -import { BN } from "@utils/tools"; - -import { ZERO_ADDRESS } from "@utils/constants"; -import envSetup from "@utils/env_setup"; -import * as t from "types/generated"; -import shouldBehaveLikeModule from "../shared/behaviours/Module.behaviour"; - -const MockERC20 = artifacts.require("MockERC20"); -const MockRewardsDistributionRecipient = artifacts.require("MockRewardsDistributionRecipient"); -const RewardsDistributor = artifacts.require("RewardsDistributor"); - -const { expect } = envSetup.configure(); - -contract("RewardsDistributor", async (accounts) => { - const ctx: { - module?: t.ModuleInstance; - } = {}; - const sa = new StandardAccounts(accounts); - let systemMachine: SystemMachine; - - let rewardsDistributor: t.RewardsDistributorInstance; - - const redeployRewards = async ( - nexusAddress = systemMachine.nexus.address, - ): Promise => { - return RewardsDistributor.new(nexusAddress, [sa.fundManager]); - }; - - before(async () => { - systemMachine = new SystemMachine(sa.all); - await systemMachine.initialiseMocks(false, false); - rewardsDistributor = await redeployRewards(); - }); - - describe("verifying Module initialization", async () => { - before(async () => { - rewardsDistributor = await redeployRewards(); - ctx.module = rewardsDistributor as t.ModuleInstance; - }); - - shouldBehaveLikeModule(ctx as Required, sa); - - it("should properly store valid arguments", async () => { - expect(await rewardsDistributor.nexus()).eq(systemMachine.nexus.address); - // check for whitelisted accs - const whitelisted = await rewardsDistributor.whitelist(sa.fundManager); - expect(whitelisted).eq(true); - // check for non whitelisted accs - const whitelisted2 = await rewardsDistributor.whitelist(sa.default); - expect(whitelisted2).eq(false); - const whitelisted3 = await rewardsDistributor.whitelist(sa.governor); - expect(whitelisted3).eq(false); - }); - }); - describe("adding FundManagers", async () => { - beforeEach(async () => { - rewardsDistributor = await redeployRewards(); - }); - context("governor trying to add FundManager", async () => { - it("should add the address to whitelisted", async () => { - let whitelisted = await rewardsDistributor.whitelist(sa.dummy1); - expect(whitelisted).eq(false); - - const tx = await rewardsDistributor.addFundManager(sa.dummy1, { - from: sa.governor, - }); - expectEvent(tx.receipt, "Whitelisted", { - _address: sa.dummy1, - }); - - whitelisted = await rewardsDistributor.whitelist(sa.dummy1); - expect(whitelisted).eq(true); - - await expectRevert( - rewardsDistributor.addFundManager(sa.dummy1, { from: sa.governor }), - "Already whitelisted", - ); - }); - it("should revert if 0 address", async () => { - const whitelisted = await rewardsDistributor.whitelist(ZERO_ADDRESS); - expect(whitelisted).eq(false); - - await expectRevert( - rewardsDistributor.addFundManager(ZERO_ADDRESS, { from: sa.governor }), - "Address is zero", - ); - }); - }); - context("non-governor trying to add FundManager", async () => { - it("should always fail", async () => { - await expectRevert( - rewardsDistributor.addFundManager(sa.dummy2, { from: sa.default }), - "Only governor can execute", - ); - await expectRevert( - rewardsDistributor.addFundManager(sa.dummy2, { from: sa.dummy1 }), - "Only governor can execute", - ); - }); - }); - context("FundManager trying to add FundManager", async () => { - it("should always fail", async () => { - await rewardsDistributor.addFundManager(sa.dummy3, { - from: sa.governor, - }); - const whitelisted = await rewardsDistributor.whitelist(sa.dummy3); - expect(whitelisted).eq(true); - - await expectRevert( - rewardsDistributor.addFundManager(sa.dummy1, { from: sa.dummy3 }), - "Only governor can execute", - ); - }); - }); - }); - describe("removing FundManagers", async () => { - beforeEach(async () => { - rewardsDistributor = await redeployRewards(); - }); - context("governor trying to remove FundManager", async () => { - it("should remove the address from whitelisted", async () => { - // Set up the state - await rewardsDistributor.addFundManager(sa.dummy1, { - from: sa.governor, - }); - let whitelisted = await rewardsDistributor.whitelist(sa.dummy1); - expect(whitelisted).eq(true); - - // Now remove the whitelist - const tx = await rewardsDistributor.removeFundManager(sa.dummy1, { - from: sa.governor, - }); - expectEvent(tx.receipt, "RemovedFundManager", { - _address: sa.dummy1, - }); - - whitelisted = await rewardsDistributor.whitelist(sa.dummy1); - expect(whitelisted).eq(false); - }); - it("should revert if address is not whitelisted", async () => { - await expectRevert( - rewardsDistributor.removeFundManager(sa.dummy1, { from: sa.governor }), - "Address is not whitelisted", - ); - }); - it("should revert if 0 address", async () => { - await expectRevert( - rewardsDistributor.removeFundManager(ZERO_ADDRESS, { from: sa.governor }), - "Address is zero", - ); - }); - }); - context("non-governor trying to remove FundManager", async () => { - it("should always fail", async () => { - await expectRevert( - rewardsDistributor.removeFundManager(sa.dummy2, { from: sa.default }), - "Only governor can execute", - ); - await expectRevert( - rewardsDistributor.removeFundManager(sa.dummy2, { from: sa.dummy1 }), - "Only governor can execute", - ); - }); - }); - context("FundManager trying to remove FundManager", async () => { - it("should always fail", async () => { - await rewardsDistributor.addFundManager(sa.dummy3, { - from: sa.governor, - }); - await rewardsDistributor.addFundManager(sa.dummy4, { - from: sa.governor, - }); - expect(await rewardsDistributor.whitelist(sa.dummy3)).eq(true); - expect(await rewardsDistributor.whitelist(sa.dummy4)).eq(true); - - await expectRevert( - rewardsDistributor.removeFundManager(sa.dummy3, { from: sa.dummy4 }), - "Only governor can execute", - ); - - await expectRevert( - rewardsDistributor.removeFundManager(sa.dummy3, { from: sa.dummy3 }), - "Only governor can execute", - ); - }); - }); - }); - describe("distributing rewards", async () => { - context("when called by a fundManager", async () => { - context("and passed invalid args", async () => { - beforeEach(async () => { - rewardsDistributor = await redeployRewards(); - }); - it("should fail if arrays are empty", async () => { - await expectRevert( - rewardsDistributor.distributeRewards([], [], { from: sa.fundManager }), - "Must choose recipients", - ); - }); - it("should fail if arrays are mismatched", async () => { - await expectRevert( - rewardsDistributor.distributeRewards([sa.dummy1, sa.dummy2], [1], { - from: sa.fundManager, - }), - "Mismatching inputs", - ); - await expectRevert( - rewardsDistributor.distributeRewards([sa.dummy1], [1, 2], { - from: sa.fundManager, - }), - "Mismatching inputs", - ); - }); - }); - context("and passed expected args", async () => { - let rewardToken1: t.MockERC20Instance; - let rewardToken2: t.MockERC20Instance; - let rewardRecipient1: t.MockRewardsDistributionRecipientInstance; - let rewardRecipient2: t.MockRewardsDistributionRecipientInstance; - let rewardRecipient3: t.MockRewardsDistributionRecipientInstance; - beforeEach(async () => { - rewardToken1 = await MockERC20.new("R1", "R1", 18, sa.fundManager, 1000000); - rewardToken2 = await MockERC20.new("R1", "R1", 18, sa.dummy1, 1000000); - rewardRecipient1 = await MockRewardsDistributionRecipient.new( - rewardToken1.address, - ); - rewardRecipient2 = await MockRewardsDistributionRecipient.new( - rewardToken1.address, - ); - rewardRecipient3 = await MockRewardsDistributionRecipient.new( - rewardToken2.address, - ); - rewardsDistributor = await redeployRewards(); - }); - it("should still notify if amount is 0", async () => { - const tx = await rewardsDistributor.distributeRewards( - [rewardRecipient1.address], - [0], - { from: sa.fundManager }, - ); - expectEvent(tx.receipt, "DistributedReward", { - funder: sa.fundManager, - recipient: rewardRecipient1.address, - rewardToken: rewardToken1.address, - amount: new BN(0), - }); - }); - it("should transfer the rewardToken to all recipients", async () => { - const oneToken = simpleToExactAmount(1, 18); - const twoToken = simpleToExactAmount(2, 18); - await rewardToken1.approve(rewardsDistributor.address, twoToken, { - from: sa.fundManager, - }); - const funderBalBefore = await rewardToken1.balanceOf(sa.fundManager); - const recipient1BalBefore = await rewardToken1.balanceOf( - rewardRecipient1.address, - ); - const recipient2BalBefore = await rewardToken1.balanceOf( - rewardRecipient2.address, - ); - const tx = await rewardsDistributor.distributeRewards( - [rewardRecipient1.address, rewardRecipient2.address], - [oneToken, oneToken], - { from: sa.fundManager }, - ); - expectEvent(tx.receipt, "DistributedReward", { - funder: sa.fundManager, - recipient: rewardRecipient1.address, - rewardToken: rewardToken1.address, - amount: oneToken, - }); - expectEvent(tx.receipt, "DistributedReward", { - funder: sa.fundManager, - recipient: rewardRecipient2.address, - rewardToken: rewardToken1.address, - amount: oneToken, - }); - const funderBalAfter = await rewardToken1.balanceOf(sa.fundManager); - const recipient1BalAfter = await rewardToken1.balanceOf( - rewardRecipient1.address, - ); - const recipient2BalAfter = await rewardToken1.balanceOf( - rewardRecipient2.address, - ); - expect(funderBalAfter).bignumber.eq(funderBalBefore.sub(twoToken)); - expect(recipient1BalAfter).bignumber.eq(recipient1BalBefore.add(oneToken)); - expect(recipient2BalAfter).bignumber.eq(recipient2BalBefore.add(oneToken)); - }); - it("should fail if funder has insufficient rewardToken balance", async () => { - const oneToken = simpleToExactAmount(1, 18); - await rewardToken2.approve(rewardsDistributor.address, oneToken, { - from: sa.fundManager, - }); - const funderBalBefore = await rewardToken2.balanceOf(sa.fundManager); - expect(funderBalBefore).bignumber.eq(new BN(0)); - await expectRevert( - rewardsDistributor.distributeRewards( - [rewardRecipient3.address], - [oneToken], - { from: sa.fundManager }, - ), - "SafeERC20: low-level call failed", - ); - }); - it("should fail if sender doesn't give approval", async () => { - const oneToken = simpleToExactAmount(1, 18); - const funderBalBefore = await rewardToken1.balanceOf(sa.fundManager); - expect(funderBalBefore).bignumber.gte(oneToken as any); - await expectRevert( - rewardsDistributor.distributeRewards( - [rewardRecipient1.address, rewardRecipient2.address], - [oneToken, oneToken], - { from: sa.fundManager }, - ), - "SafeERC20: low-level call failed", - ); - }); - it("should fail if recipient doesn't implement IRewardsDistributionRecipient interface", async () => { - const oneToken = simpleToExactAmount(1, 18); - await rewardToken1.approve(rewardsDistributor.address, oneToken, { - from: sa.fundManager, - }); - const funderBalBefore = await rewardToken1.balanceOf(sa.fundManager); - expect(funderBalBefore).bignumber.gte(oneToken as any); - await expectRevert.unspecified( - rewardsDistributor.distributeRewards([sa.dummy1], [oneToken], { - from: sa.fundManager, - }), - ); - }); - }); - context("and passed valid array with duplicate address", async () => { - let rewardToken1: t.MockERC20Instance; - let rewardRecipient1: t.MockRewardsDistributionRecipientInstance; - beforeEach(async () => { - rewardToken1 = await MockERC20.new("R1", "R1", 18, sa.fundManager, 1000000); - rewardRecipient1 = await MockRewardsDistributionRecipient.new( - rewardToken1.address, - ); - rewardsDistributor = await redeployRewards(); - }); - it("should send out reward to duplicate address", async () => { - const oneToken = simpleToExactAmount(1, 18); - const twoToken = simpleToExactAmount(2, 18); - await rewardToken1.approve(rewardsDistributor.address, twoToken, { - from: sa.fundManager, - }); - const funderBalBefore = await rewardToken1.balanceOf(sa.fundManager); - const recipient1BalBefore = await rewardToken1.balanceOf( - rewardRecipient1.address, - ); - const tx = await rewardsDistributor.distributeRewards( - [rewardRecipient1.address, rewardRecipient1.address], - [oneToken, oneToken], - { from: sa.fundManager }, - ); - expectEvent(tx.receipt, "DistributedReward", { - funder: sa.fundManager, - recipient: rewardRecipient1.address, - rewardToken: rewardToken1.address, - amount: oneToken, - }); - const funderBalAfter = await rewardToken1.balanceOf(sa.fundManager); - const recipient1BalAfter = await rewardToken1.balanceOf( - rewardRecipient1.address, - ); - expect(funderBalAfter).bignumber.eq(funderBalBefore.sub(twoToken)); - expect(recipient1BalAfter).bignumber.eq(recipient1BalBefore.add(twoToken)); - }); - }); - context("and passed some null addresses", async () => { - let rewardToken1: t.MockERC20Instance; - let rewardRecipient1: t.MockRewardsDistributionRecipientInstance; - beforeEach(async () => { - rewardToken1 = await MockERC20.new("R1", "R1", 18, sa.fundManager, 1000000); - rewardRecipient1 = await MockRewardsDistributionRecipient.new( - rewardToken1.address, - ); - rewardsDistributor = await redeployRewards(); - }); - it("should fail", async () => { - const oneToken = simpleToExactAmount(1, 18); - const twoToken = simpleToExactAmount(2, 18); - await rewardToken1.approve(rewardsDistributor.address, twoToken, { - from: sa.fundManager, - }); - const funderBalBefore = await rewardToken1.balanceOf(sa.fundManager); - expect(funderBalBefore).bignumber.gte(simpleToExactAmount(2, 18) as any); - await expectRevert.unspecified( - rewardsDistributor.distributeRewards( - [rewardRecipient1.address, ZERO_ADDRESS], - [oneToken, oneToken], - { from: sa.fundManager }, - ), - ); - }); - }); - }); - context("when called by other", async () => { - it("should not allow governor to distribute", async () => { - await expectRevert( - rewardsDistributor.distributeRewards([sa.default], [1], { from: sa.governor }), - "Not a whitelisted address", - ); - }); - it("should not allow old fund managers to distribute", async () => { - await rewardsDistributor.removeFundManager(sa.fundManager, { from: sa.governor }); - expect(await rewardsDistributor.whitelist(sa.governor)).eq(false); - await expectRevert( - rewardsDistributor.distributeRewards([sa.default], [1], { - from: sa.fundManager, - }), - "Not a whitelisted address", - ); - }); - it("should not allow others to distribute", async () => { - await expectRevert( - rewardsDistributor.distributeRewards([sa.default], [1], { from: sa.dummy1 }), - "Not a whitelisted address", - ); - await expectRevert( - rewardsDistributor.distributeRewards([sa.default], [1], { from: sa.default }), - "Not a whitelisted address", - ); - }); - }); - }); -}); diff --git a/test/rewards/TestStakingRewards.spec.ts b/test/rewards/TestStakingRewards.spec.ts deleted file mode 100644 index dbcb1138..00000000 --- a/test/rewards/TestStakingRewards.spec.ts +++ /dev/null @@ -1,961 +0,0 @@ -/* eslint-disable no-nested-ternary */ - -import * as t from "types/generated"; -import { expectEvent, expectRevert, time } from "@openzeppelin/test-helpers"; -import { StandardAccounts, SystemMachine } from "@utils/machines"; -import { assertBNClose, assertBNSlightlyGT } from "@utils/assertions"; -import { simpleToExactAmount } from "@utils/math"; -import { BN } from "@utils/tools"; -import { ONE_WEEK, ONE_DAY, FIVE_DAYS, fullScale } from "@utils/constants"; -import envSetup from "@utils/env_setup"; - -import shouldBehaveLikeRecipient from "./RewardsDistributionRecipient.behaviour"; - -const MockERC20 = artifacts.require("MockERC20"); -const StakingRewards = artifacts.require("StakingRewards"); - -const { expect } = envSetup.configure(); - -contract("StakingRewards", async (accounts) => { - const recipientCtx: { - recipient?: t.RewardsDistributionRecipientInstance; - } = {}; - const moduleCtx: { - module?: t.ModuleInstance; - } = {}; - const sa = new StandardAccounts(accounts); - let systemMachine: SystemMachine; - - const rewardsDistributor = sa.fundManager; - let rewardToken: t.MockERC20Instance; - let stakingToken: t.MockERC20Instance; - let stakingRewards: t.StakingRewardsInstance; - - const redeployRewards = async ( - nexusAddress = systemMachine.nexus.address, - ): Promise => { - rewardToken = await MockERC20.new("Reward", "RWD", 18, rewardsDistributor, 1000000); - stakingToken = await MockERC20.new("Staking", "ST8k", 18, sa.default, 1000000); - return StakingRewards.new( - nexusAddress, - stakingToken.address, - rewardToken.address, - rewardsDistributor, - ); - }; - - interface StakingData { - totalSupply: BN; - userStakingBalance: BN; - senderStakingTokenBalance: BN; - contractStakingTokenBalance: BN; - userRewardPerTokenPaid: BN; - beneficiaryRewardsEarned: BN; - rewardPerTokenStored: BN; - rewardRate: BN; - lastUpdateTime: BN; - lastTimeRewardApplicable: BN; - periodFinishTime: BN; - } - - const snapshotStakingData = async ( - sender = sa.default, - beneficiary = sa.default, - ): Promise => { - return { - totalSupply: await stakingRewards.totalSupply(), - userStakingBalance: await stakingRewards.balanceOf(beneficiary), - userRewardPerTokenPaid: await stakingRewards.userRewardPerTokenPaid(beneficiary), - senderStakingTokenBalance: await stakingToken.balanceOf(sender), - contractStakingTokenBalance: await stakingToken.balanceOf(stakingRewards.address), - beneficiaryRewardsEarned: await stakingRewards.rewards(beneficiary), - rewardPerTokenStored: await stakingRewards.rewardPerTokenStored(), - rewardRate: await stakingRewards.rewardRate(), - lastUpdateTime: await stakingRewards.lastUpdateTime(), - lastTimeRewardApplicable: await stakingRewards.lastTimeRewardApplicable(), - periodFinishTime: await stakingRewards.periodFinish(), - }; - }; - - before(async () => { - systemMachine = new SystemMachine(sa.all); - await systemMachine.initialiseMocks(false, false); - stakingRewards = await redeployRewards(); - recipientCtx.recipient = (stakingRewards as unknown) as t.RewardsDistributionRecipientInstance; - moduleCtx.module = stakingRewards as t.ModuleInstance; - }); - - describe("implementing rewardDistributionRecipient and Module", async () => { - shouldBehaveLikeRecipient( - recipientCtx as Required, - moduleCtx as Required, - sa, - ); - }); - - describe("constructor & settings", async () => { - before(async () => { - stakingRewards = await redeployRewards(); - }); - it("should set all initial state", async () => { - // Set in constructor - expect(await stakingRewards.nexus(), systemMachine.nexus.address); - expect(await stakingRewards.stakingToken(), stakingToken.address); - expect(await stakingRewards.rewardsToken(), rewardToken.address); - expect(await stakingRewards.rewardsDistributor(), rewardsDistributor); - - // Basic storage - expect(await stakingRewards.totalSupply()).bignumber.eq(new BN(0)); - expect(await stakingRewards.periodFinish()).bignumber.eq(new BN(0)); - expect(await stakingRewards.rewardRate()).bignumber.eq(new BN(0)); - expect(await stakingRewards.lastUpdateTime()).bignumber.eq(new BN(0)); - expect(await stakingRewards.rewardPerTokenStored()).bignumber.eq(new BN(0)); - expect(await stakingRewards.lastTimeRewardApplicable()).bignumber.eq(new BN(0)); - expect(await stakingRewards.rewardPerToken()).bignumber.eq(new BN(0)); - }); - }); - - /** - * @dev Ensures the reward units are assigned correctly, based on the last update time, etc - * @param beforeData Snapshot after the tx - * @param afterData Snapshot after the tx - * @param isExistingStaker Expect the staker to be existing? - */ - const assertRewardsAssigned = async ( - beforeData: StakingData, - afterData: StakingData, - isExistingStaker: boolean, - shouldResetRewards = false, - ): Promise => { - const timeAfter = await time.latest(); - const periodIsFinished = new BN(timeAfter).gt(beforeData.periodFinishTime); - - // LastUpdateTime - expect( - periodIsFinished - ? beforeData.periodFinishTime - : beforeData.rewardPerTokenStored.eqn(0) && beforeData.totalSupply.eqn(0) - ? beforeData.lastUpdateTime - : timeAfter, - ).bignumber.eq(afterData.lastUpdateTime); - // RewardRate doesnt change - expect(beforeData.rewardRate).bignumber.eq(afterData.rewardRate); - // RewardPerTokenStored goes up - expect(afterData.rewardPerTokenStored).bignumber.gte( - beforeData.rewardPerTokenStored as any, - ); - // Calculate exact expected 'rewardPerToken' increase since last update - const timeApplicableToRewards = periodIsFinished - ? beforeData.periodFinishTime.sub(beforeData.lastUpdateTime) - : timeAfter.sub(beforeData.lastUpdateTime); - const increaseInRewardPerToken = beforeData.totalSupply.eq(new BN(0)) - ? new BN(0) - : beforeData.rewardRate - .mul(timeApplicableToRewards) - .mul(fullScale) - .div(beforeData.totalSupply); - expect(beforeData.rewardPerTokenStored.add(increaseInRewardPerToken)).bignumber.eq( - afterData.rewardPerTokenStored, - ); - - // Expect updated personal state - // userRewardPerTokenPaid(beneficiary) should update - expect(afterData.userRewardPerTokenPaid).bignumber.eq(afterData.rewardPerTokenStored); - - // If existing staker, then rewards Should increase - if (shouldResetRewards) { - expect(afterData.beneficiaryRewardsEarned).bignumber.eq(new BN(0)); - } else if (isExistingStaker) { - // rewards(beneficiary) should update with previously accrued tokens - const increaseInUserRewardPerToken = afterData.rewardPerTokenStored.sub( - beforeData.userRewardPerTokenPaid, - ); - const assignment = beforeData.userStakingBalance - .mul(increaseInUserRewardPerToken) - .div(fullScale); - expect(beforeData.beneficiaryRewardsEarned.add(assignment)).bignumber.eq( - afterData.beneficiaryRewardsEarned, - ); - } else { - // else `rewards` should stay the same - expect(beforeData.beneficiaryRewardsEarned).bignumber.eq( - afterData.beneficiaryRewardsEarned, - ); - } - }; - - /** - * @dev Ensures a stake is successful, updates the rewards for the beneficiary and - * collects the stake - * @param stakeAmount Exact units to stake - * @param sender Sender of the tx - * @param beneficiary Beneficiary of the stake - * @param confirmExistingStaker Expect the staker to be existing? - */ - const expectSuccessfulStake = async ( - stakeAmount: BN, - sender = sa.default, - beneficiary = sa.default, - confirmExistingStaker = false, - ): Promise => { - // 1. Get data from the contract - const senderIsBeneficiary = sender === beneficiary; - const beforeData = await snapshotStakingData(sender, beneficiary); - - const isExistingStaker = beforeData.userStakingBalance.gt(new BN(0)); - if (confirmExistingStaker) { - expect(isExistingStaker).eq(true); - } - // 2. Approve staking token spending and send the TX - await stakingToken.approve(stakingRewards.address, stakeAmount, { - from: sender, - }); - const tx = await (senderIsBeneficiary - ? stakingRewards.methods["stake(uint256)"](stakeAmount, { - from: sender, - }) - : stakingRewards.methods["stake(address,uint256)"](beneficiary, stakeAmount, { - from: sender, - })); - expectEvent(tx.receipt, "Staked", { - user: beneficiary, - amount: stakeAmount, - payer: sender, - }); - - // 3. Ensure rewards are accrued to the beneficiary - const afterData = await snapshotStakingData(sender, beneficiary); - await assertRewardsAssigned(beforeData, afterData, isExistingStaker); - - // 4. Expect token transfer - // StakingToken balance of sender - expect(beforeData.senderStakingTokenBalance.sub(stakeAmount)).bignumber.eq( - afterData.senderStakingTokenBalance, - ); - // StakingToken balance of StakingRewards - expect(beforeData.contractStakingTokenBalance.add(stakeAmount)).bignumber.eq( - afterData.contractStakingTokenBalance, - ); - // TotalSupply of StakingRewards - expect(beforeData.totalSupply.add(stakeAmount)).bignumber.eq(afterData.totalSupply); - }; - - /** - * @dev Ensures a funding is successful, checking that it updates the rewardRate etc - * @param rewardUnits Number of units to stake - */ - const expectSuccesfulFunding = async (rewardUnits: BN): Promise => { - const beforeData = await snapshotStakingData(); - const tx = await stakingRewards.notifyRewardAmount(rewardUnits, { - from: rewardsDistributor, - }); - expectEvent(tx.receipt, "RewardAdded", { reward: rewardUnits }); - - const cur = new BN(await time.latest()); - const leftOverRewards = beforeData.rewardRate.mul( - beforeData.periodFinishTime.sub(beforeData.lastTimeRewardApplicable), - ); - const afterData = await snapshotStakingData(); - - // Sets lastTimeRewardApplicable to latest - expect(cur).bignumber.eq(afterData.lastTimeRewardApplicable); - // Sets lastUpdateTime to latest - expect(cur).bignumber.eq(afterData.lastUpdateTime); - // Sets periodFinish to 1 week from now - expect(cur.add(ONE_WEEK)).bignumber.eq(afterData.periodFinishTime); - // Sets rewardRate to rewardUnits / ONE_WEEK - if (leftOverRewards.gtn(0)) { - const total = rewardUnits.add(leftOverRewards); - assertBNClose( - total.div(ONE_WEEK), - afterData.rewardRate, - beforeData.rewardRate.div(ONE_WEEK).muln(5), // the effect of 1 second on the future scale - ); - } else { - expect(rewardUnits.div(ONE_WEEK)).bignumber.eq(afterData.rewardRate); - } - }; - - /** - * @dev Makes a withdrawal from the contract, and ensures that resulting state is correct - * and the rewards have been applied - * @param withdrawAmount Exact amount to withdraw - * @param sender User to execute the tx - */ - const expectStakingWithdrawal = async ( - withdrawAmount: BN, - sender = sa.default, - ): Promise => { - // 1. Get data from the contract - const beforeData = await snapshotStakingData(sender); - const isExistingStaker = beforeData.userStakingBalance.gt(new BN(0)); - expect(isExistingStaker).eq(true); - expect(withdrawAmount).bignumber.gte(beforeData.userStakingBalance as any); - - // 2. Send withdrawal tx - const tx = await stakingRewards.withdraw(withdrawAmount, { - from: sender, - }); - expectEvent(tx.receipt, "Withdrawn", { - user: sender, - amount: withdrawAmount, - }); - - // 3. Expect Rewards to accrue to the beneficiary - // StakingToken balance of sender - const afterData = await snapshotStakingData(sender); - await assertRewardsAssigned(beforeData, afterData, isExistingStaker); - - // 4. Expect token transfer - // StakingToken balance of sender - expect(beforeData.senderStakingTokenBalance.add(withdrawAmount)).bignumber.eq( - afterData.senderStakingTokenBalance, - ); - // Withdraws from the actual rewards wrapper token - expect(beforeData.userStakingBalance.sub(withdrawAmount)).bignumber.eq( - afterData.userStakingBalance, - ); - // Updates total supply - expect(beforeData.totalSupply.sub(withdrawAmount)).bignumber.eq(afterData.totalSupply); - }; - - context("initialising and staking in a new pool", () => { - describe("notifying the pool of reward", () => { - it("should begin a new period through", async () => { - const rewardUnits = simpleToExactAmount(1, 18); - await expectSuccesfulFunding(rewardUnits); - }); - }); - describe("staking in the new period", () => { - it("should assign rewards to the staker", async () => { - // Do the stake - const rewardRate = await stakingRewards.rewardRate(); - const stakeAmount = simpleToExactAmount(100, 18); - await expectSuccessfulStake(stakeAmount); - - await time.increase(ONE_DAY); - - // This is the total reward per staked token, since the last update - const rewardPerToken = await stakingRewards.rewardPerToken(); - const rewardPerSecond = new BN(1) - .mul(rewardRate) - .mul(fullScale) - .div(stakeAmount); - assertBNClose( - rewardPerToken, - ONE_DAY.mul(rewardPerSecond), - rewardPerSecond.muln(10), - ); - - // Calc estimated unclaimed reward for the user - // earned == balance * (rewardPerToken-userExistingReward) - const earned = await stakingRewards.earned(sa.default); - expect(stakeAmount.mul(rewardPerToken).div(fullScale)).bignumber.eq(earned); - }); - it("should update stakers rewards after consequent stake", async () => { - const stakeAmount = simpleToExactAmount(100, 18); - // This checks resulting state after second stake - await expectSuccessfulStake(stakeAmount, sa.default, sa.default, true); - }); - - it("should fail if stake amount is 0", async () => { - await expectRevert( - stakingRewards.methods["stake(uint256)"](0, { from: sa.default }), - "Cannot stake 0", - ); - }); - - it("should fail if staker has insufficient balance", async () => { - await stakingToken.approve(stakingRewards.address, 1, { from: sa.dummy2 }); - await expectRevert( - stakingRewards.methods["stake(uint256)"](1, { from: sa.dummy2 }), - "SafeERC20: low-level call failed", - ); - }); - }); - }); - context("funding with too much rewards", () => { - before(async () => { - stakingRewards = await redeployRewards(); - }); - it("should fail", async () => { - await expectRevert( - stakingRewards.notifyRewardAmount(simpleToExactAmount(1, 25), { - from: sa.fundManager, - }), - "Cannot notify with more than a million units", - ); - }); - }); - context("staking before rewards are added", () => { - before(async () => { - stakingRewards = await redeployRewards(); - }); - it("should assign no rewards", async () => { - // Get data before - const stakeAmount = simpleToExactAmount(100, 18); - const beforeData = await snapshotStakingData(); - expect(beforeData.rewardRate).bignumber.eq(new BN(0)); - expect(beforeData.rewardPerTokenStored).bignumber.eq(new BN(0)); - expect(beforeData.beneficiaryRewardsEarned).bignumber.eq(new BN(0)); - expect(beforeData.totalSupply).bignumber.eq(new BN(0)); - expect(beforeData.lastTimeRewardApplicable).bignumber.eq(new BN(0)); - - // Do the stake - await expectSuccessfulStake(stakeAmount); - - // Wait a day - await time.increase(ONE_DAY); - - // Do another stake - await expectSuccessfulStake(stakeAmount); - - // Get end results - const afterData = await snapshotStakingData(); - expect(afterData.rewardRate).bignumber.eq(new BN(0)); - expect(afterData.rewardPerTokenStored).bignumber.eq(new BN(0)); - expect(afterData.beneficiaryRewardsEarned).bignumber.eq(new BN(0)); - expect(afterData.totalSupply).bignumber.eq(stakeAmount.muln(2)); - expect(afterData.lastTimeRewardApplicable).bignumber.eq(new BN(0)); - }); - }); - context("adding first stake days after funding", () => { - before(async () => { - stakingRewards = await redeployRewards(); - }); - it("should retrospectively assign rewards to the first staker", async () => { - await expectSuccesfulFunding(simpleToExactAmount(100, 18)); - - // Do the stake - const rewardRate = await stakingRewards.rewardRate(); - - await time.increase(FIVE_DAYS); - - const stakeAmount = simpleToExactAmount(100, 18); - await expectSuccessfulStake(stakeAmount); - - // This is the total reward per staked token, since the last update - const rewardPerToken = await stakingRewards.rewardPerToken(); - - const rewardPerSecond = new BN(1) - .mul(rewardRate) - .mul(fullScale) - .div(stakeAmount); - assertBNClose(rewardPerToken, FIVE_DAYS.mul(rewardPerSecond), rewardPerSecond.muln(4)); - - // Calc estimated unclaimed reward for the user - // earned == balance * (rewardPerToken-userExistingReward) - const earnedAfterConsequentStake = await stakingRewards.earned(sa.default); - expect(stakeAmount.mul(rewardPerToken).div(fullScale)).bignumber.eq( - earnedAfterConsequentStake, - ); - }); - }); - context("staking over multiple funded periods", () => { - context("with a single staker", () => { - before(async () => { - stakingRewards = await redeployRewards(); - }); - it("should assign all the rewards from the periods", async () => { - const fundAmount1 = simpleToExactAmount(100, 18); - const fundAmount2 = simpleToExactAmount(200, 18); - await expectSuccesfulFunding(fundAmount1); - - const stakeAmount = simpleToExactAmount(1, 18); - await expectSuccessfulStake(stakeAmount); - - await time.increase(ONE_WEEK.muln(2)); - - await expectSuccesfulFunding(fundAmount2); - - await time.increase(ONE_WEEK.muln(2)); - - const earned = await stakingRewards.earned(sa.default); - assertBNSlightlyGT(fundAmount1.add(fundAmount2), earned, new BN(1000000), false); - }); - }); - context("with multiple stakers coming in and out", () => { - const fundAmount1 = simpleToExactAmount(100, 21); - const fundAmount2 = simpleToExactAmount(200, 21); - const staker2 = sa.dummy1; - const staker3 = sa.dummy2; - const staker1Stake1 = simpleToExactAmount(100, 18); - const staker1Stake2 = simpleToExactAmount(200, 18); - const staker2Stake = simpleToExactAmount(100, 18); - const staker3Stake = simpleToExactAmount(100, 18); - - before(async () => { - stakingRewards = await redeployRewards(); - await stakingToken.transfer(staker2, staker2Stake); - await stakingToken.transfer(staker3, staker3Stake); - }); - it("should accrue rewards on a pro rata basis", async () => { - /* - * 0 1 2 <-- Weeks - * [ - - - - - - ] [ - - - - - - ] - * 100k 200k <-- Funding - * +100 +200 <-- Staker 1 - * +100 <-- Staker 2 - * +100 -100 <-- Staker 3 - * - * Staker 1 gets 25k + 16.66k from week 1 + 150k from week 2 = 191.66k - * Staker 2 gets 16.66k from week 1 + 50k from week 2 = 66.66k - * Staker 3 gets 25k + 16.66k from week 1 + 0 from week 2 = 41.66k - */ - - // WEEK 0-1 START - await expectSuccessfulStake(staker1Stake1); - await expectSuccessfulStake(staker3Stake, staker3, staker3); - - await expectSuccesfulFunding(fundAmount1); - - await time.increase(ONE_WEEK.divn(2).addn(1)); - - await expectSuccessfulStake(staker2Stake, staker2, staker2); - - await time.increase(ONE_WEEK.divn(2).addn(1)); - - // WEEK 1-2 START - await expectSuccesfulFunding(fundAmount2); - - await stakingRewards.withdraw(staker3Stake, { from: staker3 }); - await expectSuccessfulStake(staker1Stake2, sa.default, sa.default, true); - - await time.increase(ONE_WEEK); - - // WEEK 2 FINISH - const earned1 = await stakingRewards.earned(sa.default); - assertBNClose( - earned1, - simpleToExactAmount("191.66", 21), - simpleToExactAmount(1, 19), - ); - const earned2 = await stakingRewards.earned(staker2); - assertBNClose( - earned2, - simpleToExactAmount("66.66", 21), - simpleToExactAmount(1, 19), - ); - const earned3 = await stakingRewards.earned(staker3); - assertBNClose( - earned3, - simpleToExactAmount("41.66", 21), - simpleToExactAmount(1, 19), - ); - // Ensure that sum of earned rewards does not exceed funcing amount - expect(fundAmount1.add(fundAmount2)).bignumber.gte( - earned1.add(earned2).add(earned3) as any, - ); - }); - }); - }); - context("staking after period finish", () => { - const fundAmount1 = simpleToExactAmount(100, 21); - - before(async () => { - stakingRewards = await redeployRewards(); - }); - it("should stop accruing rewards after the period is over", async () => { - await expectSuccessfulStake(simpleToExactAmount(1, 18)); - await expectSuccesfulFunding(fundAmount1); - - await time.increase(ONE_WEEK.addn(1)); - - const earnedAfterWeek = await stakingRewards.earned(sa.default); - - await time.increase(ONE_WEEK.addn(1)); - const now = await time.latest(); - - const earnedAfterTwoWeeks = await stakingRewards.earned(sa.default); - - expect(earnedAfterWeek).bignumber.eq(earnedAfterTwoWeeks); - - const lastTimeRewardApplicable = await stakingRewards.lastTimeRewardApplicable(); - assertBNClose(lastTimeRewardApplicable, now.sub(ONE_WEEK).subn(2), new BN(2)); - }); - }); - context("staking on behalf of a beneficiary", () => { - const fundAmount = simpleToExactAmount(100, 21); - const beneficiary = sa.dummy1; - const stakeAmount = simpleToExactAmount(100, 18); - - before(async () => { - stakingRewards = await redeployRewards(); - await expectSuccesfulFunding(fundAmount); - await expectSuccessfulStake(stakeAmount, sa.default, beneficiary); - await time.increase(10); - }); - it("should update the beneficiaries reward details", async () => { - const earned = await stakingRewards.earned(beneficiary); - expect(earned).bignumber.gt(new BN(0) as any); - - const balance = await stakingRewards.balanceOf(beneficiary); - expect(balance).bignumber.eq(stakeAmount); - }); - it("should not update the senders details", async () => { - const earned = await stakingRewards.earned(sa.default); - expect(earned).bignumber.eq(new BN(0)); - - const balance = await stakingRewards.balanceOf(sa.default); - expect(balance).bignumber.eq(new BN(0)); - }); - }); - context("using staking / reward tokens with diff decimals", () => { - before(async () => { - rewardToken = await MockERC20.new("Reward", "RWD", 12, rewardsDistributor, 1000000); - stakingToken = await MockERC20.new("Staking", "ST8k", 16, sa.default, 1000000); - stakingRewards = await StakingRewards.new( - systemMachine.nexus.address, - stakingToken.address, - rewardToken.address, - rewardsDistributor, - ); - }); - it("should not affect the pro rata payouts", async () => { - // Add 100 reward tokens - await expectSuccesfulFunding(simpleToExactAmount(100, 12)); - const rewardRate = await stakingRewards.rewardRate(); - - // Do the stake - const stakeAmount = simpleToExactAmount(100, 16); - await expectSuccessfulStake(stakeAmount); - - await time.increase(ONE_WEEK.addn(1)); - - // This is the total reward per staked token, since the last update - const rewardPerToken = await stakingRewards.rewardPerToken(); - assertBNClose( - rewardPerToken, - ONE_WEEK.mul(rewardRate) - .mul(fullScale) - .div(stakeAmount), - new BN(1) - .mul(rewardRate) - .mul(fullScale) - .div(stakeAmount), - ); - - // Calc estimated unclaimed reward for the user - // earned == balance * (rewardPerToken-userExistingReward) - const earnedAfterConsequentStake = await stakingRewards.earned(sa.default); - assertBNSlightlyGT( - simpleToExactAmount(100, 12), - earnedAfterConsequentStake, - simpleToExactAmount(1, 9), - ); - }); - }); - - context("getting the reward token", () => { - before(async () => { - stakingRewards = await redeployRewards(); - }); - it("should simply return the rewards Token", async () => { - const readToken = await stakingRewards.getRewardToken(); - expect(readToken).eq(rewardToken.address); - expect(readToken).eq(await stakingRewards.rewardsToken()); - }); - }); - - context("notifying new reward amount", () => { - context("from someone other than the distributor", () => { - before(async () => { - stakingRewards = await redeployRewards(); - }); - it("should fail", async () => { - await expectRevert( - stakingRewards.notifyRewardAmount(1, { from: sa.default }), - "Caller is not reward distributor", - ); - await expectRevert( - stakingRewards.notifyRewardAmount(1, { from: sa.dummy1 }), - "Caller is not reward distributor", - ); - await expectRevert( - stakingRewards.notifyRewardAmount(1, { from: sa.governor }), - "Caller is not reward distributor", - ); - }); - }); - context("before current period finish", async () => { - const funding1 = simpleToExactAmount(100, 18); - const funding2 = simpleToExactAmount(200, 18); - beforeEach(async () => { - stakingRewards = await redeployRewards(); - }); - it("should factor in unspent units to the new rewardRate", async () => { - // Do the initial funding - await expectSuccesfulFunding(funding1); - const actualRewardRate = await stakingRewards.rewardRate(); - const expectedRewardRate = funding1.div(ONE_WEEK); - expect(expectedRewardRate).bignumber.eq(actualRewardRate); - - // Zoom forward half a week - await time.increase(ONE_WEEK.divn(2)); - - // Do the second funding, and factor in the unspent units - const expectedLeftoverReward = funding1.divn(2); - await expectSuccesfulFunding(funding2); - const actualRewardRateAfter = await stakingRewards.rewardRate(); - const totalRewardsForWeek = funding2.add(expectedLeftoverReward); - const expectedRewardRateAfter = totalRewardsForWeek.div(ONE_WEEK); - assertBNClose( - actualRewardRateAfter, - expectedRewardRateAfter, - actualRewardRate.div(ONE_WEEK).muln(20), - ); - }); - it("should factor in unspent units to the new rewardRate if instant", async () => { - // Do the initial funding - await expectSuccesfulFunding(funding1); - const actualRewardRate = await stakingRewards.rewardRate(); - const expectedRewardRate = funding1.div(ONE_WEEK); - expect(expectedRewardRate).bignumber.eq(actualRewardRate); - - // Zoom forward half a week - await time.increase(1); - - // Do the second funding, and factor in the unspent units - await expectSuccesfulFunding(funding2); - const actualRewardRateAfter = await stakingRewards.rewardRate(); - const expectedRewardRateAfter = funding1.add(funding2).div(ONE_WEEK); - assertBNClose( - actualRewardRateAfter, - expectedRewardRateAfter, - actualRewardRate.div(ONE_WEEK).muln(20), - ); - }); - }); - - context("after current period finish", () => { - const funding1 = simpleToExactAmount(100, 18); - before(async () => { - stakingRewards = await redeployRewards(); - }); - it("should start a new period with the correct rewardRate", async () => { - // Do the initial funding - await expectSuccesfulFunding(funding1); - const actualRewardRate = await stakingRewards.rewardRate(); - const expectedRewardRate = funding1.div(ONE_WEEK); - expect(expectedRewardRate).bignumber.eq(actualRewardRate); - - // Zoom forward half a week - await time.increase(ONE_WEEK.addn(1)); - - // Do the second funding, and factor in the unspent units - await expectSuccesfulFunding(funding1.muln(2)); - const actualRewardRateAfter = await stakingRewards.rewardRate(); - const expectedRewardRateAfter = expectedRewardRate.muln(2); - expect(actualRewardRateAfter).bignumber.eq(expectedRewardRateAfter); - }); - }); - }); - - context("withdrawing stake or rewards", () => { - context("withdrawing a stake amount", () => { - const fundAmount = simpleToExactAmount(100, 21); - const stakeAmount = simpleToExactAmount(100, 18); - - before(async () => { - stakingRewards = await redeployRewards(); - await expectSuccesfulFunding(fundAmount); - await expectSuccessfulStake(stakeAmount); - await time.increase(10); - }); - it("should revert for a non-staker", async () => { - await expectRevert( - stakingRewards.withdraw(1, { from: sa.dummy1 }), - "SafeMath: subtraction overflow", - ); - }); - it("should revert if insufficient balance", async () => { - await expectRevert( - stakingRewards.withdraw(stakeAmount.addn(1), { from: sa.default }), - "SafeMath: subtraction overflow", - ); - }); - it("should fail if trying to withdraw 0", async () => { - await expectRevert( - stakingRewards.withdraw(0, { from: sa.default }), - "Cannot withdraw 0", - ); - }); - it("should withdraw the stake and update the existing reward accrual", async () => { - // Check that the user has earned something - const earnedBefore = await stakingRewards.earned(sa.default); - expect(earnedBefore).bignumber.gt(new BN(0) as any); - const rewardsBefore = await stakingRewards.rewards(sa.default); - expect(rewardsBefore).bignumber.eq(new BN(0)); - - // Execute the withdrawal - await expectStakingWithdrawal(stakeAmount); - - // Ensure that the new awards are added + assigned to user - const earnedAfter = await stakingRewards.earned(sa.default); - expect(earnedAfter).bignumber.gte(earnedBefore as any); - const rewardsAfter = await stakingRewards.rewards(sa.default); - expect(rewardsAfter).bignumber.eq(earnedAfter); - - // Zoom forward now - await time.increase(10); - - // Check that the user does not earn anything else - const earnedEnd = await stakingRewards.earned(sa.default); - expect(earnedEnd).bignumber.eq(earnedAfter); - const rewardsEnd = await stakingRewards.rewards(sa.default); - expect(rewardsEnd).bignumber.eq(rewardsAfter); - - // Cannot withdraw anything else - await expectRevert( - stakingRewards.withdraw(stakeAmount.addn(1), { from: sa.default }), - "SafeMath: subtraction overflow", - ); - }); - }); - context("claiming rewards", async () => { - const fundAmount = simpleToExactAmount(100, 21); - const stakeAmount = simpleToExactAmount(100, 18); - - before(async () => { - stakingRewards = await redeployRewards(); - await expectSuccesfulFunding(fundAmount); - await rewardToken.transfer(stakingRewards.address, fundAmount, { - from: rewardsDistributor, - }); - await expectSuccessfulStake(stakeAmount, sa.default, sa.dummy2); - await time.increase(ONE_WEEK.addn(1)); - }); - it("should do nothing for a non-staker", async () => { - const beforeData = await snapshotStakingData(sa.dummy1, sa.dummy1); - await stakingRewards.claimReward({ from: sa.dummy1 }); - - const afterData = await snapshotStakingData(sa.dummy1, sa.dummy1); - expect(beforeData.beneficiaryRewardsEarned).bignumber.eq(new BN(0)); - expect(afterData.beneficiaryRewardsEarned).bignumber.eq(new BN(0)); - expect(afterData.senderStakingTokenBalance).bignumber.eq(new BN(0)); - expect(afterData.userRewardPerTokenPaid).bignumber.eq( - afterData.rewardPerTokenStored, - ); - }); - it("should send all accrued rewards to the rewardee", async () => { - const beforeData = await snapshotStakingData(sa.dummy2, sa.dummy2); - const rewardeeBalanceBefore = await rewardToken.balanceOf(sa.dummy2); - expect(rewardeeBalanceBefore).bignumber.eq(new BN(0)); - const tx = await stakingRewards.claimReward({ from: sa.dummy2 }); - expectEvent(tx.receipt, "RewardPaid", { - user: sa.dummy2, - }); - const afterData = await snapshotStakingData(sa.dummy2, sa.dummy2); - await assertRewardsAssigned(beforeData, afterData, false, true); - // Balance transferred to the rewardee - const rewardeeBalanceAfter = await rewardToken.balanceOf(sa.dummy2); - assertBNClose(rewardeeBalanceAfter, fundAmount, simpleToExactAmount(1, 16)); - - // 'rewards' reset to 0 - expect(afterData.beneficiaryRewardsEarned).bignumber.eq(new BN(0)); - // Paid up until the last block - expect(afterData.userRewardPerTokenPaid).bignumber.eq( - afterData.rewardPerTokenStored, - ); - // Token balances dont change - expect(afterData.senderStakingTokenBalance).bignumber.eq( - beforeData.senderStakingTokenBalance, - ); - expect(beforeData.userStakingBalance).bignumber.eq(afterData.userStakingBalance); - }); - }); - context("completely 'exiting' the system", () => { - const fundAmount = simpleToExactAmount(100, 21); - const stakeAmount = simpleToExactAmount(100, 18); - - before(async () => { - stakingRewards = await redeployRewards(); - await expectSuccesfulFunding(fundAmount); - await rewardToken.transfer(stakingRewards.address, fundAmount, { - from: rewardsDistributor, - }); - await expectSuccessfulStake(stakeAmount); - await time.increase(ONE_WEEK.addn(1)); - }); - it("should fail if the sender has no stake", async () => { - await expectRevert(stakingRewards.exit({ from: sa.dummy1 }), "Cannot withdraw 0"); - }); - it("should withdraw all senders stake and send outstanding rewards to the staker", async () => { - const beforeData = await snapshotStakingData(); - const rewardeeBalanceBefore = await rewardToken.balanceOf(sa.default); - - const tx = await stakingRewards.exit(); - expectEvent(tx.receipt, "Withdrawn", { - user: sa.default, - amount: stakeAmount, - }); - expectEvent(tx.receipt, "RewardPaid", { - user: sa.default, - }); - - const afterData = await snapshotStakingData(); - // Balance transferred to the rewardee - const rewardeeBalanceAfter = await rewardToken.balanceOf(sa.default); - assertBNClose( - rewardeeBalanceAfter.sub(rewardeeBalanceBefore), - fundAmount, - simpleToExactAmount(1, 16), - ); - - // Expect Rewards to accrue to the beneficiary - // StakingToken balance of sender - await assertRewardsAssigned(beforeData, afterData, false, true); - - // Expect token transfer - // StakingToken balance of sender - expect(beforeData.senderStakingTokenBalance.add(stakeAmount)).bignumber.eq( - afterData.senderStakingTokenBalance, - ); - // Withdraws from the actual rewards wrapper token - expect(beforeData.userStakingBalance.sub(stakeAmount)).bignumber.eq( - afterData.userStakingBalance, - ); - // Updates total supply - expect(beforeData.totalSupply.sub(stakeAmount)).bignumber.eq(afterData.totalSupply); - - await expectRevert(stakingRewards.exit(), "Cannot withdraw 0"); - }); - }); - }); - context("running a full integration test", () => { - const fundAmount = simpleToExactAmount(100, 21); - const stakeAmount = simpleToExactAmount(100, 18); - let period; - - before(async () => { - stakingRewards = await redeployRewards(); - }); - it("1. should allow the rewardsDistributor to fund the pool", async () => { - await rewardToken.transfer(stakingRewards.address, fundAmount, { - from: rewardsDistributor, - }); - await expectSuccesfulFunding(fundAmount); - }); - it("2. should allow stakers to stake and earn rewards", async () => { - await expectSuccessfulStake(stakeAmount); - await time.increase(ONE_WEEK.addn(1)); - }); - it("3. should credit earnings directly to beneficiary", async () => { - const beforeData = await snapshotStakingData(); - const beneficiaryBalanceBefore = await rewardToken.balanceOf(sa.default); - - await stakingRewards.exit(); - - const afterData = await snapshotStakingData(); - // Balance transferred to the rewardee - const beneficiaryBalanceAfter = await rewardToken.balanceOf(sa.default); - assertBNClose( - beneficiaryBalanceAfter.sub(beneficiaryBalanceBefore), - fundAmount, - simpleToExactAmount(1, 16), - ); - - await assertRewardsAssigned(beforeData, afterData, false, true); - }); - }); -}); diff --git a/test/rewards/TestStakingRewardsWithPlatformToken.spec.ts b/test/rewards/TestStakingRewardsWithPlatformToken.spec.ts deleted file mode 100644 index 99b860a0..00000000 --- a/test/rewards/TestStakingRewardsWithPlatformToken.spec.ts +++ /dev/null @@ -1,1448 +0,0 @@ -/* eslint-disable no-nested-ternary */ - -import * as t from "types/generated"; -import { expectEvent, expectRevert, time } from "@openzeppelin/test-helpers"; -import { StandardAccounts, SystemMachine } from "@utils/machines"; -import { assertBNClose, assertBNSlightlyGT } from "@utils/assertions"; -import { simpleToExactAmount } from "@utils/math"; -import { BN } from "@utils/tools"; -import { - ONE_WEEK, - ONE_DAY, - FIVE_DAYS, - fullScale, - MAX_UINT256, - ZERO_ADDRESS, -} from "@utils/constants"; -import envSetup from "@utils/env_setup"; - -import shouldBehaveLikeRecipient from "./RewardsDistributionRecipient.behaviour"; - -const MockERC20 = artifacts.require("MockERC20"); -const StakingRewardsWithPlatformToken = artifacts.require("StakingRewardsWithPlatformToken"); -const PlatformTokenVendor = artifacts.require("PlatformTokenVendor"); - -const { expect } = envSetup.configure(); - -contract("StakingRewardsWithPlatformToken", async (accounts) => { - const recipientCtx: { - recipient?: t.RewardsDistributionRecipientInstance; - } = {}; - const moduleCtx: { - module?: t.ModuleInstance; - } = {}; - const sa = new StandardAccounts(accounts); - let systemMachine: SystemMachine; - - const rewardsDistributor = sa.fundManager; - let rewardToken: t.MockERC20Instance; - let platformToken: t.MockERC20Instance; - let stakingToken: t.MockERC20Instance; - let stakingRewards: t.StakingRewardsWithPlatformTokenInstance; - - const redeployRewards = async ( - nexusAddress = systemMachine.nexus.address, - ): Promise => { - rewardToken = await MockERC20.new("Reward", "RWD", 18, rewardsDistributor, 1000000); - platformToken = await MockERC20.new("PLAT4M", "PLAT", 18, rewardsDistributor, 1000000); - stakingToken = await MockERC20.new("Staking", "ST8k", 18, sa.default, 1000000); - return StakingRewardsWithPlatformToken.new( - nexusAddress, - stakingToken.address, - rewardToken.address, - platformToken.address, - rewardsDistributor, - ); - }; - - interface StakingData { - totalSupply: BN; - userStakingBalance: BN; - senderStakingTokenBalance: BN; - contractStakingTokenBalance: BN; - userRewardPerTokenPaid: BN; - userPlatformRewardPerTokenPaid: BN; - beneficiaryRewardsEarned: BN; - beneficiaryPlatformRewardsEarned: BN; - rewardPerTokenStored: BN; - platformRewardPerTokenStored: BN; - rewardRate: BN; - platformRewardRate: BN; - lastUpdateTime: BN; - lastTimeRewardApplicable: BN; - periodFinishTime: BN; - platformTokenVendor: string; - platformTokenBalanceVendor: BN; - platformTokenBalanceStakingRewards: BN; - } - - const snapshotStakingData = async ( - sender = sa.default, - beneficiary = sa.default, - ): Promise => { - const platformTokenVendor = await stakingRewards.platformTokenVendor(); - return { - totalSupply: await stakingRewards.totalSupply(), - userStakingBalance: await stakingRewards.balanceOf(beneficiary), - senderStakingTokenBalance: await stakingToken.balanceOf(sender), - contractStakingTokenBalance: await stakingToken.balanceOf(stakingRewards.address), - userRewardPerTokenPaid: await stakingRewards.userRewardPerTokenPaid(beneficiary), - userPlatformRewardPerTokenPaid: await stakingRewards.userPlatformRewardPerTokenPaid( - beneficiary, - ), - beneficiaryRewardsEarned: await stakingRewards.rewards(beneficiary), - beneficiaryPlatformRewardsEarned: await stakingRewards.platformRewards(beneficiary), - rewardPerTokenStored: await stakingRewards.rewardPerTokenStored(), - platformRewardPerTokenStored: await stakingRewards.platformRewardPerTokenStored(), - rewardRate: await stakingRewards.rewardRate(), - platformRewardRate: await stakingRewards.platformRewardRate(), - lastUpdateTime: await stakingRewards.lastUpdateTime(), - lastTimeRewardApplicable: await stakingRewards.lastTimeRewardApplicable(), - periodFinishTime: await stakingRewards.periodFinish(), - platformTokenVendor, - platformTokenBalanceVendor: await platformToken.balanceOf(platformTokenVendor), - platformTokenBalanceStakingRewards: await platformToken.balanceOf( - stakingRewards.address, - ), - }; - }; - - before(async () => { - systemMachine = new SystemMachine(sa.all); - await systemMachine.initialiseMocks(false, false); - stakingRewards = await redeployRewards(); - recipientCtx.recipient = (stakingRewards as unknown) as t.RewardsDistributionRecipientInstance; - moduleCtx.module = stakingRewards as t.ModuleInstance; - }); - - describe("implementing rewardDistributionRecipient and Module", async () => { - shouldBehaveLikeRecipient( - recipientCtx as Required, - moduleCtx as Required, - sa, - ); - }); - - describe("constructor & settings", async () => { - before(async () => { - stakingRewards = await redeployRewards(); - }); - it("should set all initial state", async () => { - // Set in constructor - expect(await stakingRewards.nexus(), systemMachine.nexus.address); - expect(await stakingRewards.stakingToken(), stakingToken.address); - expect(await stakingRewards.rewardsToken(), rewardToken.address); - expect(await stakingRewards.platformToken(), platformToken.address); - expect(await stakingRewards.platformTokenVendor()).not.eq(ZERO_ADDRESS); - expect(await stakingRewards.rewardsDistributor(), rewardsDistributor); - - // Basic storage - expect(await stakingRewards.totalSupply()).bignumber.eq(new BN(0)); - expect(await stakingRewards.periodFinish()).bignumber.eq(new BN(0)); - expect(await stakingRewards.rewardRate()).bignumber.eq(new BN(0)); - expect(await stakingRewards.platformRewardRate()).bignumber.eq(new BN(0)); - expect(await stakingRewards.lastUpdateTime()).bignumber.eq(new BN(0)); - expect(await stakingRewards.rewardPerTokenStored()).bignumber.eq(new BN(0)); - expect(await stakingRewards.platformRewardPerTokenStored()).bignumber.eq(new BN(0)); - expect(await stakingRewards.lastTimeRewardApplicable()).bignumber.eq(new BN(0)); - expect((await stakingRewards.rewardPerToken())[0]).bignumber.eq(new BN(0)); - expect((await stakingRewards.rewardPerToken())[1]).bignumber.eq(new BN(0)); - }); - }); - - /** - * @dev Ensures the reward units are assigned correctly, based on the last update time, etc - * @param beforeData Snapshot after the tx - * @param afterData Snapshot after the tx - * @param isExistingStaker Expect the staker to be existing? - */ - const assertRewardsAssigned = async ( - beforeData: StakingData, - afterData: StakingData, - isExistingStaker: boolean, - shouldResetRewards = false, - shouldResetPlatformRewards = false, - ): Promise => { - const timeAfter = await time.latest(); - const periodIsFinished = new BN(timeAfter).gt(beforeData.periodFinishTime); - - // LastUpdateTime - expect( - periodIsFinished - ? beforeData.periodFinishTime - : beforeData.rewardPerTokenStored.eqn(0) && beforeData.totalSupply.eqn(0) - ? beforeData.lastUpdateTime - : timeAfter, - ).bignumber.eq(afterData.lastUpdateTime); - - // RewardRate doesnt change - expect(beforeData.rewardRate).bignumber.eq(afterData.rewardRate); - expect(beforeData.platformRewardRate).bignumber.eq(afterData.platformRewardRate); - // RewardPerTokenStored goes up - expect(afterData.rewardPerTokenStored).bignumber.gte( - beforeData.rewardPerTokenStored as any, - ); - expect(afterData.platformRewardPerTokenStored).bignumber.gte( - beforeData.platformRewardPerTokenStored as any, - ); - - // Calculate exact expected 'rewardPerToken' increase since last update - const timeApplicableToRewards = periodIsFinished - ? beforeData.periodFinishTime.sub(beforeData.lastUpdateTime) - : timeAfter.sub(beforeData.lastUpdateTime); - const increaseInRewardPerToken = beforeData.totalSupply.eq(new BN(0)) - ? new BN(0) - : beforeData.rewardRate - .mul(timeApplicableToRewards) - .mul(fullScale) - .div(beforeData.totalSupply); - const increaseInPlatformRewardPerToken = beforeData.totalSupply.eq(new BN(0)) - ? new BN(0) - : beforeData.platformRewardRate - .mul(timeApplicableToRewards) - .mul(fullScale) - .div(beforeData.totalSupply); - - expect(beforeData.rewardPerTokenStored.add(increaseInRewardPerToken)).bignumber.eq( - afterData.rewardPerTokenStored, - ); - expect( - beforeData.platformRewardPerTokenStored.add(increaseInPlatformRewardPerToken), - ).bignumber.eq(afterData.platformRewardPerTokenStored); - - // Expect updated personal state - // userRewardPerTokenPaid(beneficiary) should update - expect(afterData.userRewardPerTokenPaid).bignumber.eq(afterData.rewardPerTokenStored); - expect(afterData.userPlatformRewardPerTokenPaid).bignumber.eq( - afterData.platformRewardPerTokenStored, - ); - - // If existing staker, then rewards Should increase - if (shouldResetRewards) { - expect(afterData.beneficiaryRewardsEarned).bignumber.eq(new BN(0)); - } else if (isExistingStaker) { - // rewards(beneficiary) should update with previously accrued tokens - const increaseInUserRewardPerToken = afterData.rewardPerTokenStored.sub( - beforeData.userRewardPerTokenPaid, - ); - const assignment = beforeData.userStakingBalance - .mul(increaseInUserRewardPerToken) - .div(fullScale); - expect(beforeData.beneficiaryRewardsEarned.add(assignment)).bignumber.eq( - afterData.beneficiaryRewardsEarned, - ); - } else { - // else `rewards` should stay the same - expect(beforeData.beneficiaryRewardsEarned).bignumber.eq( - afterData.beneficiaryRewardsEarned, - ); - } - - // If existing staker, then platform rewards Should increase - if (shouldResetPlatformRewards) { - expect(afterData.beneficiaryPlatformRewardsEarned).bignumber.eq(new BN(0)); - } else if (isExistingStaker) { - // rewards(beneficiary) should update with previously accrued tokens - const increaseInUserPlatformRewardPerToken = afterData.platformRewardPerTokenStored.sub( - beforeData.userPlatformRewardPerTokenPaid, - ); - const assignment = beforeData.userStakingBalance - .mul(increaseInUserPlatformRewardPerToken) - .div(fullScale); - expect(beforeData.beneficiaryPlatformRewardsEarned.add(assignment)).bignumber.eq( - afterData.beneficiaryPlatformRewardsEarned, - ); - } else { - // else `rewards` should stay the same - expect(beforeData.beneficiaryPlatformRewardsEarned).bignumber.eq( - afterData.beneficiaryPlatformRewardsEarned, - ); - } - }; - - /** - * @dev Ensures a stake is successful, updates the rewards for the beneficiary and - * collects the stake - * @param stakeAmount Exact units to stake - * @param sender Sender of the tx - * @param beneficiary Beneficiary of the stake - * @param confirmExistingStaker Expect the staker to be existing? - */ - const expectSuccessfulStake = async ( - stakeAmount: BN, - sender = sa.default, - beneficiary = sa.default, - confirmExistingStaker = false, - ): Promise => { - // 1. Get data from the contract - const senderIsBeneficiary = sender === beneficiary; - const beforeData = await snapshotStakingData(sender, beneficiary); - - const isExistingStaker = beforeData.userStakingBalance.gt(new BN(0)); - if (confirmExistingStaker) { - expect(isExistingStaker).eq(true); - } - // 2. Approve staking token spending and send the TX - await stakingToken.approve(stakingRewards.address, stakeAmount, { - from: sender, - }); - - const tx = await (senderIsBeneficiary - ? stakingRewards.methods["stake(uint256)"](stakeAmount, { - from: sender, - }) - : stakingRewards.methods["stake(address,uint256)"](beneficiary, stakeAmount, { - from: sender, - })); - expectEvent(tx.receipt, "Staked", { - user: beneficiary, - amount: stakeAmount, - payer: sender, - }); - - // 3. Ensure rewards are accrued to the beneficiary - const afterData = await snapshotStakingData(sender, beneficiary); - await assertRewardsAssigned(beforeData, afterData, isExistingStaker); - - // 4. Expect token transfer - // StakingToken balance of sender - expect(beforeData.senderStakingTokenBalance.sub(stakeAmount)).bignumber.eq( - afterData.senderStakingTokenBalance, - ); - - // StakingToken balance of StakingRewardsWithPlatformToken - expect(beforeData.contractStakingTokenBalance.add(stakeAmount)).bignumber.eq( - afterData.contractStakingTokenBalance, - ); - - // TotalSupply of StakingRewardsWithPlatformToken - expect(beforeData.totalSupply.add(stakeAmount)).bignumber.eq(afterData.totalSupply); - }; - - /** - * @dev Ensures a funding is successful, checking that it updates the rewardRate etc - * @param rewardUnits Number of units to stake - */ - const expectSuccesfulFunding = async ( - rewardUnits: BN, - platformUnitsExpected = new BN(0), - ): Promise => { - const beforeData = await snapshotStakingData(); - expect(beforeData.platformTokenBalanceStakingRewards).bignumber.gte( - platformUnitsExpected as any, - ); - - const tx = await stakingRewards.notifyRewardAmount(rewardUnits, { - from: rewardsDistributor, - }); - expectEvent(tx.receipt, "RewardAdded", { - reward: rewardUnits, - platformReward: platformUnitsExpected, - }); - - const cur = new BN(await time.latest()); - const leftOverRewards = beforeData.rewardRate.mul( - beforeData.periodFinishTime.sub(beforeData.lastTimeRewardApplicable), - ); - const leftOverPlatformRewards = beforeData.platformRewardRate.mul( - beforeData.periodFinishTime.sub(beforeData.lastTimeRewardApplicable), - ); - - const afterData = await snapshotStakingData(); - - // Expect the tokens to be transferred to the vendor - expect(afterData.platformTokenBalanceStakingRewards).bignumber.eq(new BN(0)); - expect(afterData.platformTokenBalanceVendor).bignumber.eq( - beforeData.platformTokenBalanceVendor.add( - beforeData.platformTokenBalanceStakingRewards, - ), - ); - - // Sets lastTimeRewardApplicable to latest - expect(cur).bignumber.eq(afterData.lastTimeRewardApplicable); - - // Sets lastUpdateTime to latest - expect(cur).bignumber.eq(afterData.lastUpdateTime); - - // Sets periodFinish to 1 week from now - expect(cur.add(ONE_WEEK)).bignumber.eq(afterData.periodFinishTime); - - // Sets rewardRate to rewardUnits / ONE_WEEK - if (leftOverRewards.gtn(0)) { - const total = rewardUnits.add(leftOverRewards); - assertBNClose( - total.div(ONE_WEEK), - afterData.rewardRate, - beforeData.rewardRate.div(ONE_WEEK).muln(10), // the effect of 10 second on the future scale - ); - } else { - expect(rewardUnits.div(ONE_WEEK)).bignumber.eq(afterData.rewardRate); - } - - // Sets platformRewardRate to rewardUnits / ONE_WEEK - if (leftOverPlatformRewards.gtn(0)) { - const total = platformUnitsExpected.add(leftOverRewards); - assertBNClose( - total.div(ONE_WEEK), - afterData.platformRewardRate, - beforeData.platformRewardRate.div(ONE_WEEK).muln(10), // the effect of 10 second on the future scale - ); - } else { - expect(platformUnitsExpected.div(ONE_WEEK)).bignumber.eq(afterData.platformRewardRate); - } - }; - - /** - * @dev Makes a withdrawal from the contract, and ensures that resulting state is correct - * and the rewards have been applied - * @param withdrawAmount Exact amount to withdraw - * @param sender User to execute the tx - */ - const expectStakingWithdrawal = async ( - withdrawAmount: BN, - sender = sa.default, - ): Promise => { - // 1. Get data from the contract - const beforeData = await snapshotStakingData(sender); - const isExistingStaker = beforeData.userStakingBalance.gt(new BN(0)); - expect(isExistingStaker).eq(true); - expect(withdrawAmount).bignumber.gte(beforeData.userStakingBalance as any); - - // 2. Send withdrawal tx - const tx = await stakingRewards.withdraw(withdrawAmount, { - from: sender, - }); - expectEvent(tx.receipt, "Withdrawn", { - user: sender, - amount: withdrawAmount, - }); - - // 3. Expect Rewards to accrue to the beneficiary - // StakingToken balance of sender - const afterData = await snapshotStakingData(sender); - await assertRewardsAssigned(beforeData, afterData, isExistingStaker); - - // 4. Expect token transfer - // StakingToken balance of sender - expect(beforeData.senderStakingTokenBalance.add(withdrawAmount)).bignumber.eq( - afterData.senderStakingTokenBalance, - ); - // Withdraws from the actual rewards wrapper token - expect(beforeData.userStakingBalance.sub(withdrawAmount)).bignumber.eq( - afterData.userStakingBalance, - ); - // Updates total supply - expect(beforeData.totalSupply.sub(withdrawAmount)).bignumber.eq(afterData.totalSupply); - }; - - context("initialising and staking in a new pool", () => { - describe("notifying the pool of reward", () => { - it("should begin a new period through", async () => { - const rewardUnits = simpleToExactAmount(1, 18); - const airdropAmount = simpleToExactAmount(100, 18); - await platformToken.transfer(stakingRewards.address, airdropAmount, { - from: rewardsDistributor, - }); - await expectSuccesfulFunding(rewardUnits, airdropAmount); - }); - }); - describe("staking in the new period", () => { - it("should assign rewards to the staker", async () => { - // Do the stake - const rewardRate = await stakingRewards.rewardRate(); - const platformRewardRate = await stakingRewards.platformRewardRate(); - const stakeAmount = simpleToExactAmount(100, 18); - await expectSuccessfulStake(stakeAmount); - - await time.increase(ONE_DAY); - - // This is the total reward per staked token, since the last update - const [ - rewardPerToken, - platformRewardPerToken, - ] = await stakingRewards.rewardPerToken(); - expect(rewardPerToken).bignumber.gt(new BN(0) as any); - expect(platformRewardPerToken).bignumber.gt(new BN(0) as any); - const rewardPerSecond = new BN(1) - .mul(rewardRate) - .mul(fullScale) - .div(stakeAmount); - assertBNClose( - rewardPerToken, - ONE_DAY.mul(rewardPerSecond), - rewardPerSecond.muln(10), - ); - const platformRewardPerSecond = new BN(1) - .mul(platformRewardRate) - .mul(fullScale) - .div(stakeAmount); - assertBNClose( - platformRewardPerToken, - ONE_DAY.mul(platformRewardPerSecond), - platformRewardPerSecond.muln(10), - ); - // Calc estimated unclaimed reward for the user - // earned == balance * (rewardPerToken-userExistingReward) - const [earned, platformEarned] = await stakingRewards.earned(sa.default); - expect(stakeAmount.mul(rewardPerToken).div(fullScale)).bignumber.eq(earned); - expect(stakeAmount.mul(platformRewardPerToken).div(fullScale)).bignumber.eq( - platformEarned, - ); - }); - it("should update stakers rewards after consequent stake", async () => { - const stakeAmount = simpleToExactAmount(100, 18); - // This checks resulting state after second stake - await expectSuccessfulStake(stakeAmount, sa.default, sa.default, true); - }); - it("should fail if stake amount is 0", async () => { - await expectRevert( - stakingRewards.methods["stake(uint256)"](0, { from: sa.default }), - "Cannot stake 0", - ); - }); - it("should fail if staker has insufficient balance", async () => { - await stakingToken.approve(stakingRewards.address, 1, { from: sa.dummy2 }); - await expectRevert( - stakingRewards.methods["stake(uint256)"](1, { from: sa.dummy2 }), - "SafeERC20: low-level call failed", - ); - }); - }); - }); - - context("funding with too much rewards", () => { - before(async () => { - stakingRewards = await redeployRewards(); - }); - it("should fail", async () => { - await expectRevert( - stakingRewards.notifyRewardAmount(simpleToExactAmount(1, 25), { - from: sa.fundManager, - }), - "Cannot notify with more than a million units", - ); - }); - }); - context("staking before rewards are added", () => { - before(async () => { - stakingRewards = await redeployRewards(); - }); - it("should assign no rewards", async () => { - // Get data before - const stakeAmount = simpleToExactAmount(100, 18); - const beforeData = await snapshotStakingData(); - expect(beforeData.rewardRate).bignumber.eq(new BN(0)); - expect(beforeData.rewardPerTokenStored).bignumber.eq(new BN(0)); - expect(beforeData.platformRewardRate).bignumber.eq(new BN(0)); - expect(beforeData.platformRewardPerTokenStored).bignumber.eq(new BN(0)); - expect(beforeData.beneficiaryRewardsEarned).bignumber.eq(new BN(0)); - expect(beforeData.beneficiaryPlatformRewardsEarned).bignumber.eq(new BN(0)); - expect(beforeData.totalSupply).bignumber.eq(new BN(0)); - expect(beforeData.lastTimeRewardApplicable).bignumber.eq(new BN(0)); - - // Do the stake - await expectSuccessfulStake(stakeAmount); - - // Wait a day - await time.increase(ONE_DAY); - - // Do another stake - await expectSuccessfulStake(stakeAmount); - - // Get end results - const afterData = await snapshotStakingData(); - expect(afterData.rewardRate).bignumber.eq(new BN(0)); - expect(afterData.rewardPerTokenStored).bignumber.eq(new BN(0)); - expect(afterData.platformRewardRate).bignumber.eq(new BN(0)); - expect(afterData.platformRewardPerTokenStored).bignumber.eq(new BN(0)); - expect(afterData.beneficiaryPlatformRewardsEarned).bignumber.eq(new BN(0)); - expect(afterData.totalSupply).bignumber.eq(stakeAmount.muln(2)); - expect(afterData.lastTimeRewardApplicable).bignumber.eq(new BN(0)); - }); - }); - context("adding first stake days after funding", () => { - before(async () => { - stakingRewards = await redeployRewards(); - }); - it("should retrospectively assign rewards to the first staker", async () => { - const airdropAmount = simpleToExactAmount(100, 18); - await platformToken.transfer(stakingRewards.address, airdropAmount, { - from: rewardsDistributor, - }); - await expectSuccesfulFunding(simpleToExactAmount(100, 18), airdropAmount); - - // Do the stake - const rewardRate = await stakingRewards.rewardRate(); - const platformRewardRate = await stakingRewards.platformRewardRate(); - - await time.increase(FIVE_DAYS); - - const stakeAmount = simpleToExactAmount(100, 18); - await expectSuccessfulStake(stakeAmount); - - // This is the total reward per staked token, since the last update - const [rewardPerToken, platformRewardPerToken] = await stakingRewards.rewardPerToken(); - - const rewardPerSecond = new BN(1) - .mul(rewardRate) - .mul(fullScale) - .div(stakeAmount); - assertBNClose(rewardPerToken, FIVE_DAYS.mul(rewardPerSecond), rewardPerSecond.muln(4)); - - const platformRewardPerSecond = new BN(1) - .mul(platformRewardRate) - .mul(fullScale) - .div(stakeAmount); - assertBNClose( - platformRewardPerToken, - FIVE_DAYS.mul(platformRewardPerSecond), - platformRewardPerSecond.muln(4), - ); - - // Calc estimated unclaimed reward for the user - // earned == balance * (rewardPerToken-userExistingReward) - const [ - earnedAfterConsequentStake, - platformEarnedAfterConsequentStake, - ] = await stakingRewards.earned(sa.default); - expect(stakeAmount.mul(rewardPerToken).div(fullScale)).bignumber.eq( - earnedAfterConsequentStake, - ); - expect(stakeAmount.mul(platformRewardPerToken).div(fullScale)).bignumber.eq( - platformEarnedAfterConsequentStake, - ); - }); - }); - context("staking over multiple funded periods", () => { - context("with a single staker", () => { - before(async () => { - stakingRewards = await redeployRewards(); - }); - it("should assign all the rewards from the periods", async () => { - const airdropAmount1 = simpleToExactAmount(100, 18); - const fundAmount1 = simpleToExactAmount(100, 18); - const fundAmount2 = simpleToExactAmount(200, 18); - await expectSuccesfulFunding(fundAmount1); - - const stakeAmount = simpleToExactAmount(1, 18); - await expectSuccessfulStake(stakeAmount); - - await time.increase(ONE_WEEK.muln(2)); - - await platformToken.transfer(stakingRewards.address, airdropAmount1, { - from: rewardsDistributor, - }); - await expectSuccesfulFunding(fundAmount2, airdropAmount1); - - await time.increase(ONE_WEEK.muln(2)); - - const [earned, platformEarned] = await stakingRewards.earned(sa.default); - assertBNSlightlyGT(fundAmount1.add(fundAmount2), earned, new BN(1000000), false); - assertBNSlightlyGT(airdropAmount1, platformEarned, new BN(1000000), false); - }); - }); - context("with multiple stakers coming in and out", () => { - beforeEach(async () => { - stakingRewards = await redeployRewards(); - }); - it("should accrue rewards on a pro rata basis", async () => { - const airdropAmount = simpleToExactAmount(100, 21); - const fundAmount1 = simpleToExactAmount(100, 21); - const fundAmount2 = simpleToExactAmount(200, 21); - const staker2 = sa.dummy1; - const staker3 = sa.dummy2; - const staker1Stake1 = simpleToExactAmount(100, 18); - const staker1Stake2 = simpleToExactAmount(200, 18); - const staker2Stake = simpleToExactAmount(100, 18); - const staker3Stake = simpleToExactAmount(100, 18); - - await stakingToken.transfer(staker2, staker2Stake); - await stakingToken.transfer(staker3, staker3Stake); - - /* - * 0 1 2 <-- Weeks - * [ - - - - - - ] [ - - - - - - ] - * 100k 200k <-- Funding - * 100k <-- Airdrop - * +100 +200 <-- Staker 1 - * +100 <-- Staker 2 - * +100 -100 <-- Staker 3 - * - * Staker 1 gets 25k + 16.66k from week 1 n 150k = 191.66k - * gets 75k - * Staker 2 gets 16.66k from week 1 n 50k from week 2 = 66.66k - * gets 25k - * Staker 3 gets 25k + 16.66k from week 1 n 0 from week 2 = 41.66k - * gets 0 - */ - - // WEEK 0-1 START - await expectSuccessfulStake(staker1Stake1); - await expectSuccessfulStake(staker3Stake, staker3, staker3); - - await expectSuccesfulFunding(fundAmount1); - - await time.increase(ONE_WEEK.divn(2).addn(1)); - - await expectSuccessfulStake(staker2Stake, staker2, staker2); - - await time.increase(ONE_WEEK.divn(2).addn(1)); - - // WEEK 1-2 START - await stakingRewards.withdraw(staker3Stake, { from: staker3 }); - await expectSuccessfulStake(staker1Stake2, sa.default, sa.default, true); - await platformToken.transfer(stakingRewards.address, airdropAmount, { - from: rewardsDistributor, - }); - await expectSuccesfulFunding(fundAmount2, airdropAmount); - - await time.increase(ONE_WEEK); - - // WEEK 2 FINISH - const [earned1, platformEarned1] = await stakingRewards.earned(sa.default); - assertBNClose( - earned1, - simpleToExactAmount("191.66", 21), - simpleToExactAmount(1, 19), - ); - assertBNClose( - platformEarned1, - simpleToExactAmount(75, 21), - simpleToExactAmount(1, 19), - ); - const [earned2, platformEarned2] = await stakingRewards.earned(staker2); - assertBNClose( - earned2, - simpleToExactAmount("66.66", 21), - simpleToExactAmount(1, 19), - ); - assertBNClose( - platformEarned2, - simpleToExactAmount(25, 21), - simpleToExactAmount(1, 19), - ); - const [earned3, platformEarned3] = await stakingRewards.earned(staker3); - assertBNClose( - earned3, - simpleToExactAmount("41.66", 21), - simpleToExactAmount(1, 19), - ); - expect(platformEarned3).bignumber.eq(new BN(0)); - // Ensure that sum of earned rewards does not exceed funcing amount - expect(fundAmount1.add(fundAmount2)).bignumber.gte( - earned1.add(earned2).add(earned3) as any, - ); - expect(airdropAmount).bignumber.gte( - platformEarned1.add(platformEarned2).add(platformEarned3) as any, - ); - }); - it("should accrue rewards on a pro rata basis 2", async () => { - const airdropAmount1 = simpleToExactAmount(50, 21); - const airdropAmount2 = simpleToExactAmount(100, 21); - const fundAmount1 = simpleToExactAmount(50, 21); - const fundAmount2 = simpleToExactAmount(200, 21); - const staker2 = sa.dummy1; - const staker3 = sa.dummy2; - const staker1Stake1 = simpleToExactAmount(100, 18); - const staker1Stake2 = simpleToExactAmount(100, 18); - const staker2Stake = simpleToExactAmount(100, 18); - const staker3Stake = simpleToExactAmount(100, 18); - - await stakingToken.transfer(staker2, staker2Stake); - await stakingToken.transfer(staker3, staker3Stake); - - /* - * 0 1 2 <-- Weeks - * [ - - - - - - ] [ - - - - - - ] - * 50k 200k <-- Funding - * 50k 100k <-- Airdrop - * +100 +100 <-- Staker 1 - * +100 <-- Staker 2 - * +100 -100 <-- Staker 3 - * - * Staker 1 gets 25k + 8.33 from week 1 n 50k + 66.66 = 150k - * gets 25k + 8.33 from week 1 n 25k + 33.33 = 91.66k - * Staker 2 gets 8.33 from week 1 n 25k + 33.33 = 66.66k - * gets 8.33 from week 1 n 12.5 + 16.67 = 37.5k - * Staker 3 gets 8.33 from week 1 n 25k = 33.33 - * gets 8.33 from week 1 n 12.5k = 20.83 - */ - - // WEEK 0-1 START - await expectSuccessfulStake(staker1Stake1); - - await platformToken.transfer(stakingRewards.address, airdropAmount1, { - from: rewardsDistributor, - }); - await expectSuccesfulFunding(fundAmount1, airdropAmount1); - - await time.increase(ONE_WEEK.divn(2).addn(1)); - - await expectSuccessfulStake(staker2Stake, staker2, staker2); - await expectSuccessfulStake(staker3Stake, staker3, staker3); - - await time.increase(ONE_WEEK.divn(2).addn(1)); - - // WEEK 1-2 START - await platformToken.transfer(stakingRewards.address, airdropAmount2, { - from: rewardsDistributor, - }); - await expectSuccesfulFunding(fundAmount2, airdropAmount2); - - await expectSuccessfulStake(staker1Stake2, sa.default, sa.default, true); - - await time.increase(ONE_WEEK.divn(2).addn(1)); - - await stakingRewards.withdraw(staker3Stake, { from: staker3 }); - - await time.increase(ONE_WEEK.divn(2).addn(1)); - - // WEEK 2 FINISH - const [earned1, platformEarned1] = await stakingRewards.earned(sa.default); - assertBNClose(earned1, simpleToExactAmount(150, 21), simpleToExactAmount(1, 19)); - assertBNClose( - platformEarned1, - simpleToExactAmount("91.66", 21), - simpleToExactAmount(1, 19), - ); - const [earned2, platformEarned2] = await stakingRewards.earned(staker2); - assertBNClose( - earned2, - simpleToExactAmount("66.66", 21), - simpleToExactAmount(1, 19), - ); - assertBNClose( - platformEarned2, - simpleToExactAmount("37.5", 21), - simpleToExactAmount(1, 19), - ); - const [earned3, platformEarned3] = await stakingRewards.earned(staker3); - assertBNClose( - earned3, - simpleToExactAmount("33.33", 21), - simpleToExactAmount(1, 19), - ); - assertBNClose( - platformEarned3, - simpleToExactAmount("20.83", 21), - simpleToExactAmount(1, 19), - ); - // Ensure that sum of earned rewards does not exceed funcing amount - expect(fundAmount1.add(fundAmount2)).bignumber.gte( - earned1.add(earned2).add(earned3) as any, - ); - expect(airdropAmount1.add(airdropAmount2)).bignumber.gte( - platformEarned1.add(platformEarned2).add(platformEarned3) as any, - ); - }); - }); - }); - context("staking after period finish", () => { - const airdropAmount1 = simpleToExactAmount(100, 21); - const fundAmount1 = simpleToExactAmount(100, 21); - - before(async () => { - stakingRewards = await redeployRewards(); - }); - it("should stop accruing rewards after the period is over", async () => { - await expectSuccessfulStake(simpleToExactAmount(1, 18)); - await platformToken.transfer(stakingRewards.address, airdropAmount1, { - from: rewardsDistributor, - }); - await expectSuccesfulFunding(fundAmount1, airdropAmount1); - - await time.increase(ONE_WEEK.addn(1)); - - const [earnedAfterWeek, platformEarnedAfterWeek] = await stakingRewards.earned( - sa.default, - ); - - await time.increase(ONE_WEEK.addn(1)); - const now = await time.latest(); - - const [earnedAfterTwoWeeks, platformEarnedAfterTwoWeeks] = await stakingRewards.earned( - sa.default, - ); - - expect(earnedAfterWeek).bignumber.eq(earnedAfterTwoWeeks); - expect(platformEarnedAfterWeek).bignumber.eq(platformEarnedAfterTwoWeeks); - - const lastTimeRewardApplicable = await stakingRewards.lastTimeRewardApplicable(); - assertBNClose(lastTimeRewardApplicable, now.sub(ONE_WEEK).subn(2), new BN(2)); - }); - }); - context("staking on behalf of a beneficiary", () => { - const fundAmount = simpleToExactAmount(100, 21); - const beneficiary = sa.dummy1; - const stakeAmount = simpleToExactAmount(100, 18); - - before(async () => { - stakingRewards = await redeployRewards(); - await expectSuccesfulFunding(fundAmount); - await expectSuccessfulStake(stakeAmount, sa.default, beneficiary); - await time.increase(10); - }); - it("should update the beneficiaries reward details", async () => { - const earned = await stakingRewards.earned(beneficiary); - expect(earned[0]).bignumber.gt(new BN(0) as any); - - const balance = await stakingRewards.balanceOf(beneficiary); - expect(balance).bignumber.eq(stakeAmount); - }); - it("should not update the senders details", async () => { - const earned = await stakingRewards.earned(sa.default); - expect(earned[0]).bignumber.eq(new BN(0)); - - const balance = await stakingRewards.balanceOf(sa.default); - expect(balance).bignumber.eq(new BN(0)); - }); - }); - context("using staking / reward tokens with diff decimals", () => { - before(async () => { - rewardToken = await MockERC20.new("Reward", "RWD", 12, rewardsDistributor, 1000000); - platformToken = await MockERC20.new("PLATF4M", "PLAT", 14, rewardsDistributor, 1000000); - stakingToken = await MockERC20.new("Staking", "ST8k", 16, sa.default, 1000000); - stakingRewards = await StakingRewardsWithPlatformToken.new( - systemMachine.nexus.address, - stakingToken.address, - rewardToken.address, - platformToken.address, - rewardsDistributor, - ); - }); - it("should not affect the pro rata payouts", async () => { - // Add 100 reward tokens - await expectSuccesfulFunding(simpleToExactAmount(100, 12)); - const rewardRate = await stakingRewards.rewardRate(); - - // Do the stake - const stakeAmount = simpleToExactAmount(100, 16); - await expectSuccessfulStake(stakeAmount); - - await time.increase(ONE_WEEK.addn(1)); - - // This is the total reward per staked token, since the last update - const [rewardPerToken, platformRewardPerToken] = await stakingRewards.rewardPerToken(); - assertBNClose( - rewardPerToken, - ONE_WEEK.mul(rewardRate) - .mul(fullScale) - .div(stakeAmount), - new BN(1) - .mul(rewardRate) - .mul(fullScale) - .div(stakeAmount), - ); - expect(platformRewardPerToken).bignumber.eq(new BN(0)); - - // Calc estimated unclaimed reward for the user - // earned == balance * (rewardPerToken-userExistingReward) - const [earnedAfterConsequentStake, platformEarned] = await stakingRewards.earned( - sa.default, - ); - assertBNSlightlyGT( - simpleToExactAmount(100, 12), - earnedAfterConsequentStake, - simpleToExactAmount(1, 9), - ); - expect(platformEarned).bignumber.eq(new BN(0)); - }); - }); - - context("getting the reward token", () => { - before(async () => { - stakingRewards = await redeployRewards(); - }); - it("should simply return the rewards Token", async () => { - const readToken = await stakingRewards.getRewardToken(); - expect(readToken).eq(rewardToken.address); - expect(readToken).eq(await stakingRewards.rewardsToken()); - expect(platformToken.address).eq(await stakingRewards.platformToken()); - }); - }); - - context("notifying new reward amount", () => { - context("from someone other than the distributor", () => { - before(async () => { - stakingRewards = await redeployRewards(); - }); - it("should fail", async () => { - await expectRevert( - stakingRewards.notifyRewardAmount(1, { from: sa.default }), - "Caller is not reward distributor", - ); - await expectRevert( - stakingRewards.notifyRewardAmount(1, { from: sa.dummy1 }), - "Caller is not reward distributor", - ); - await expectRevert( - stakingRewards.notifyRewardAmount(1, { from: sa.governor }), - "Caller is not reward distributor", - ); - }); - }); - context("before current period finish", async () => { - const airdrop1 = simpleToExactAmount(100, 18); - const airdrop2 = simpleToExactAmount(200, 18); - const funding1 = simpleToExactAmount(100, 18); - const funding2 = simpleToExactAmount(200, 18); - beforeEach(async () => { - stakingRewards = await redeployRewards(); - }); - it("should factor in unspent units to the new rewardRate", async () => { - // Do the initial funding - await platformToken.transfer(stakingRewards.address, airdrop1, { - from: rewardsDistributor, - }); - - await expectSuccesfulFunding(funding1, airdrop1); - const actualRewardRate = await stakingRewards.rewardRate(); - const actualPlatformRewardRate = await stakingRewards.platformRewardRate(); - const expectedRewardRate = funding1.div(ONE_WEEK); - expect(expectedRewardRate).bignumber.eq(actualRewardRate); - expect(expectedRewardRate).bignumber.eq(actualPlatformRewardRate); - - // Zoom forward half a week - await time.increase(ONE_WEEK.divn(2)); - - // Do the second funding, and factor in the unspent units - const expectedLeftoverReward = funding1.divn(2); - await platformToken.transfer(stakingRewards.address, airdrop2, { - from: rewardsDistributor, - }); - await expectSuccesfulFunding(funding2, airdrop2); - const actualRewardRateAfter = await stakingRewards.rewardRate(); - const actualPlatformRewardRateAfter = await stakingRewards.platformRewardRate(); - const totalRewardsForWeek = funding2.add(expectedLeftoverReward); - const expectedRewardRateAfter = totalRewardsForWeek.div(ONE_WEEK); - - assertBNClose( - actualRewardRateAfter, - expectedRewardRateAfter, - actualRewardRate.divn(1000), - ); - - assertBNClose( - actualPlatformRewardRateAfter, - expectedRewardRateAfter, - actualRewardRate.divn(1000), - ); - }); - - it("should factor in unspent units to the new rewardRate if instant", async () => { - // Do the initial funding - await platformToken.transfer(stakingRewards.address, airdrop1, { - from: rewardsDistributor, - }); - await expectSuccesfulFunding(funding1, airdrop1); - const actualRewardRate = await stakingRewards.rewardRate(); - const expectedRewardRate = funding1.div(ONE_WEEK); - expect(expectedRewardRate).bignumber.eq(actualRewardRate); - const actualPlatformRewardRate = await stakingRewards.platformRewardRate(); - const expectedPlatformRewardRate = airdrop1.div(ONE_WEEK); - expect(expectedPlatformRewardRate).bignumber.eq(actualPlatformRewardRate); - - // Zoom forward 1 second - await time.increase(1); - - // Do the second funding, and factor in the unspent units - await expectSuccesfulFunding(funding2); - const actualRewardRateAfter = await stakingRewards.rewardRate(); - const expectedRewardRateAfter = funding1.add(funding2).div(ONE_WEEK); - assertBNClose( - actualRewardRateAfter, - expectedRewardRateAfter, - actualRewardRate.divn(1000), - ); - - const actualPlatformRewardRateAfter = await stakingRewards.platformRewardRate(); - assertBNClose( - actualPlatformRewardRateAfter, - actualPlatformRewardRate, - actualPlatformRewardRate.divn(1000), - ); - }); - }); - - context("after current period finish", () => { - const airdrop1 = simpleToExactAmount(1, 18); - const funding1 = simpleToExactAmount(100, 18); - before(async () => { - stakingRewards = await redeployRewards(); - }); - it("should start a new period with the correct rewardRate", async () => { - // Do the initial funding - await platformToken.transfer(stakingRewards.address, airdrop1, { - from: rewardsDistributor, - }); - await expectSuccesfulFunding(funding1, airdrop1); - const actualRewardRate = await stakingRewards.rewardRate(); - const expectedRewardRate = funding1.div(ONE_WEEK); - expect(expectedRewardRate).bignumber.eq(actualRewardRate); - - // Zoom forward half a week - await time.increase(ONE_WEEK.addn(1)); - - // Do the second funding, and factor in the unspent units - await expectSuccesfulFunding(funding1.muln(2)); - const actualRewardRateAfter = await stakingRewards.rewardRate(); - const expectedRewardRateAfter = expectedRewardRate.muln(2); - expect(actualRewardRateAfter).bignumber.eq(expectedRewardRateAfter); - - const actualPlatformRewardRateAfter = await stakingRewards.platformRewardRate(); - expect(actualPlatformRewardRateAfter).bignumber.eq(new BN(0)); - }); - }); - }); - - context("withdrawing stake or rewards", () => { - context("withdrawing a stake amount", () => { - const fundAmount = simpleToExactAmount(100, 21); - const stakeAmount = simpleToExactAmount(100, 18); - - before(async () => { - stakingRewards = await redeployRewards(); - await platformToken.transfer(stakingRewards.address, fundAmount, { - from: rewardsDistributor, - }); - await expectSuccesfulFunding(fundAmount, fundAmount); - await expectSuccessfulStake(stakeAmount); - await time.increase(10); - }); - it("should revert for a non-staker", async () => { - await expectRevert( - stakingRewards.withdraw(1, { from: sa.dummy1 }), - "SafeMath: subtraction overflow", - ); - }); - it("should revert if insufficient balance", async () => { - await expectRevert( - stakingRewards.withdraw(stakeAmount.addn(1), { from: sa.default }), - "SafeMath: subtraction overflow", - ); - }); - it("should fail if trying to withdraw 0", async () => { - await expectRevert( - stakingRewards.withdraw(0, { from: sa.default }), - "Cannot withdraw 0", - ); - }); - it("should withdraw the stake and update the existing reward accrual", async () => { - // Check that the user has earned something - const earnedBefore = await stakingRewards.earned(sa.default); - expect(earnedBefore[0]).bignumber.gt(new BN(0) as any); - expect(earnedBefore[1]).bignumber.gt(new BN(0) as any); - const rewardsBefore = await stakingRewards.rewards(sa.default); - expect(rewardsBefore).bignumber.eq(new BN(0)); - - // Execute the withdrawal - await expectStakingWithdrawal(stakeAmount); - - // Ensure that the new awards are added + assigned to user - const earnedAfter = await stakingRewards.earned(sa.default); - expect(earnedAfter[0]).bignumber.gte(earnedBefore[0] as any); - expect(earnedAfter[1]).bignumber.gte(earnedBefore[1] as any); - const rewardsAfter = await stakingRewards.rewards(sa.default); - expect(rewardsAfter).bignumber.eq(earnedAfter[0]); - - // Zoom forward now - await time.increase(10); - - // Check that the user does not earn anything else - const earnedEnd = await stakingRewards.earned(sa.default); - expect(earnedEnd[0]).bignumber.eq(earnedAfter[0]); - expect(earnedEnd[1]).bignumber.eq(earnedAfter[1]); - const rewardsEnd = await stakingRewards.rewards(sa.default); - expect(rewardsEnd).bignumber.eq(rewardsAfter); - - // Cannot withdraw anything else - await expectRevert( - stakingRewards.withdraw(stakeAmount.addn(1), { from: sa.default }), - "SafeMath: subtraction overflow", - ); - }); - }); - context("claiming rewards", async () => { - const airdropAmount = simpleToExactAmount(100, 21); - const fundAmount = simpleToExactAmount(100, 21); - const stakeAmount = simpleToExactAmount(100, 18); - - before(async () => { - stakingRewards = await redeployRewards(); - await platformToken.transfer(stakingRewards.address, airdropAmount, { - from: rewardsDistributor, - }); - await rewardToken.transfer(stakingRewards.address, fundAmount, { - from: rewardsDistributor, - }); - await expectSuccesfulFunding(fundAmount, airdropAmount); - await expectSuccessfulStake(stakeAmount, sa.default, sa.dummy2); - await time.increase(ONE_WEEK.addn(1)); - }); - it("should do nothing for a non-staker", async () => { - const beforeData = await snapshotStakingData(sa.dummy1, sa.dummy1); - await stakingRewards.claimReward({ from: sa.dummy1 }); - - const afterData = await snapshotStakingData(sa.dummy1, sa.dummy1); - expect(beforeData.beneficiaryRewardsEarned).bignumber.eq(new BN(0)); - expect(afterData.beneficiaryRewardsEarned).bignumber.eq(new BN(0)); - expect(afterData.beneficiaryPlatformRewardsEarned).bignumber.eq(new BN(0)); - expect(afterData.senderStakingTokenBalance).bignumber.eq(new BN(0)); - expect(afterData.userRewardPerTokenPaid).bignumber.eq( - afterData.rewardPerTokenStored, - ); - expect(afterData.userPlatformRewardPerTokenPaid).bignumber.eq( - afterData.platformRewardPerTokenStored, - ); - }); - it("should send all accrued rewards to the rewardee and withdraw platform token", async () => { - const beforeData = await snapshotStakingData(sa.dummy2, sa.dummy2); - const rewardeeBalanceBefore = await rewardToken.balanceOf(sa.dummy2); - expect(rewardeeBalanceBefore).bignumber.eq(new BN(0)); - // Expect no platform rewards before - const platformBalanceBefore = await platformToken.balanceOf(sa.dummy2); - expect(platformBalanceBefore).bignumber.eq(new BN(0)); - - const tx = await stakingRewards.claimReward({ from: sa.dummy2 }); - const afterData = await snapshotStakingData(sa.dummy2, sa.dummy2); - - await assertRewardsAssigned(beforeData, afterData, false, true, true); - - // Balance transferred to the rewardee - const rewardeeBalanceAfter = await rewardToken.balanceOf(sa.dummy2); - assertBNClose(rewardeeBalanceAfter, fundAmount, simpleToExactAmount(1, 16)); - // Expect the platform rewards to send out - const platformBalanceAfter = await platformToken.balanceOf(sa.dummy2); - assertBNClose(platformBalanceAfter, airdropAmount, simpleToExactAmount(1, 16)); - expect(afterData.platformTokenBalanceVendor).bignumber.eq( - beforeData.platformTokenBalanceVendor.sub(platformBalanceAfter), - ); - - expectEvent(tx.receipt, "RewardPaid", { - user: sa.dummy2, - reward: rewardeeBalanceAfter.sub(rewardeeBalanceBefore), - platformReward: beforeData.platformTokenBalanceVendor.sub( - afterData.platformTokenBalanceVendor, - ), - }); - // 'rewards' reset to 0 - expect(afterData.beneficiaryRewardsEarned).bignumber.eq(new BN(0)); - - expect(afterData.beneficiaryPlatformRewardsEarned).bignumber.eq(new BN(0)); - // Paid up until the last block - expect(afterData.userRewardPerTokenPaid).bignumber.eq( - afterData.rewardPerTokenStored, - ); - - expect(afterData.userPlatformRewardPerTokenPaid).bignumber.eq( - afterData.platformRewardPerTokenStored, - ); - // Token balances dont change - expect(afterData.senderStakingTokenBalance).bignumber.eq( - beforeData.senderStakingTokenBalance, - ); - - expect(beforeData.userStakingBalance).bignumber.eq(afterData.userStakingBalance); - }); - }); - context("claiming rewards only", async () => { - const fundAmount = simpleToExactAmount(100, 21); - const stakeAmount = simpleToExactAmount(100, 18); - - before(async () => { - stakingRewards = await redeployRewards(); - await expectSuccesfulFunding(fundAmount); - await rewardToken.transfer(stakingRewards.address, fundAmount, { - from: rewardsDistributor, - }); - await expectSuccessfulStake(stakeAmount); - await time.increase(ONE_WEEK.addn(1)); - }); - it("should do nothing for a non-staker", async () => { - const beforeData = await snapshotStakingData(sa.dummy1, sa.dummy1); - await stakingRewards.claimRewardOnly({ from: sa.dummy1 }); - - const afterData = await snapshotStakingData(sa.dummy1, sa.dummy1); - expect(beforeData.beneficiaryRewardsEarned).bignumber.eq(new BN(0)); - expect(afterData.beneficiaryRewardsEarned).bignumber.eq(new BN(0)); - expect(afterData.senderStakingTokenBalance).bignumber.eq(new BN(0)); - expect(afterData.userRewardPerTokenPaid).bignumber.eq( - afterData.rewardPerTokenStored, - ); - }); - it("should send all accrued rewards to the rewardee", async () => { - const beforeData = await snapshotStakingData(); - const rewardeeBalanceBefore = await rewardToken.balanceOf(sa.default); - - const tx = await stakingRewards.claimRewardOnly(); - const afterData = await snapshotStakingData(); - await assertRewardsAssigned(beforeData, afterData, false, true); - // Balance transferred to the rewardee - const rewardeeBalanceAfter = await rewardToken.balanceOf(sa.default); - expectEvent(tx.receipt, "RewardPaid", { - user: sa.default, - reward: rewardeeBalanceAfter.sub(rewardeeBalanceBefore), - platformReward: new BN(0), - }); - assertBNClose( - rewardeeBalanceAfter.sub(rewardeeBalanceBefore), - fundAmount, - simpleToExactAmount(1, 16), - ); - - // 'rewards' reset to 0 - expect(afterData.beneficiaryRewardsEarned).bignumber.eq(new BN(0)); - // Paid up until the last block - expect(afterData.userRewardPerTokenPaid).bignumber.eq( - afterData.rewardPerTokenStored, - ); - // Token balances dont change - expect(afterData.senderStakingTokenBalance).bignumber.eq( - beforeData.senderStakingTokenBalance, - ); - expect(beforeData.userStakingBalance).bignumber.eq(afterData.userStakingBalance); - }); - }); - context("completely 'exiting' the system", () => { - const fundAmount = simpleToExactAmount(100, 21); - const stakeAmount = simpleToExactAmount(100, 18); - - before(async () => { - stakingRewards = await redeployRewards(); - await expectSuccesfulFunding(fundAmount); - await rewardToken.transfer(stakingRewards.address, fundAmount, { - from: rewardsDistributor, - }); - await expectSuccessfulStake(stakeAmount); - await time.increase(ONE_WEEK.addn(1)); - }); - it("should fail if the sender has no stake", async () => { - await expectRevert(stakingRewards.exit({ from: sa.dummy1 }), "Cannot withdraw 0"); - }); - it("should withdraw all senders stake and send oustanding rewards to the staker", async () => { - const beforeData = await snapshotStakingData(); - const rewardeeBalanceBefore = await rewardToken.balanceOf(sa.default); - - const tx = await stakingRewards.exit(); - expectEvent(tx.receipt, "Withdrawn", { - user: sa.default, - amount: stakeAmount, - }); - expectEvent(tx.receipt, "RewardPaid", { - user: sa.default, - }); - - const afterData = await snapshotStakingData(); - // Balance transferred to the rewardee - const rewardeeBalanceAfter = await rewardToken.balanceOf(sa.default); - assertBNClose( - rewardeeBalanceAfter.sub(rewardeeBalanceBefore), - fundAmount, - simpleToExactAmount(1, 16), - ); - - // Expect Rewards to accrue to the beneficiary - // StakingToken balance of sender - await assertRewardsAssigned(beforeData, afterData, false, true); - - // Expect token transfer - // StakingToken balance of sender - expect(beforeData.senderStakingTokenBalance.add(stakeAmount)).bignumber.eq( - afterData.senderStakingTokenBalance, - ); - // Withdraws from the actual rewards wrapper token - expect(beforeData.userStakingBalance.sub(stakeAmount)).bignumber.eq( - afterData.userStakingBalance, - ); - // Updates total supply - expect(beforeData.totalSupply.sub(stakeAmount)).bignumber.eq(afterData.totalSupply); - - await expectRevert(stakingRewards.exit(), "Cannot withdraw 0"); - }); - }); - }); - context("testing platformTokenVendor", () => { - before(async () => { - stakingRewards = await redeployRewards(); - }); - it("should re-approve spending of the platformToken", async () => { - const beforeData = await snapshotStakingData(); - const maxApproval = await platformToken.allowance( - beforeData.platformTokenVendor, - stakingRewards.address, - ); - expect(maxApproval).bignumber.eq(MAX_UINT256); - - const fundAmount = simpleToExactAmount(1, 18); - await rewardToken.transfer(stakingRewards.address, fundAmount, { - from: rewardsDistributor, - }); - await platformToken.transfer(stakingRewards.address, fundAmount, { - from: rewardsDistributor, - }); - await expectSuccesfulFunding(fundAmount, fundAmount); - await expectSuccessfulStake(fundAmount); - await time.increase(ONE_WEEK.addn(1)); - await stakingRewards.exit(); - - const approvalAfter = await platformToken.allowance( - beforeData.platformTokenVendor, - stakingRewards.address, - ); - expect(approvalAfter).bignumber.lt(MAX_UINT256 as any); - - const vendor = await PlatformTokenVendor.at(beforeData.platformTokenVendor); - await vendor.reApproveOwner(); - - const approvalEnd = await platformToken.allowance( - beforeData.platformTokenVendor, - stakingRewards.address, - ); - expect(approvalEnd).bignumber.eq(MAX_UINT256); - }); - }); - context("running a full integration test", () => { - const airdropAmount = simpleToExactAmount(200, 21); - const fundAmount = simpleToExactAmount(100, 21); - const stakeAmount = simpleToExactAmount(100, 18); - let period; - - before(async () => { - stakingRewards = await redeployRewards(); - }); - it("1. should allow the rewardsDistributor to fund the pool", async () => { - await platformToken.transfer(stakingRewards.address, airdropAmount, { - from: rewardsDistributor, - }); - await rewardToken.transfer(stakingRewards.address, fundAmount, { - from: rewardsDistributor, - }); - await expectSuccesfulFunding(fundAmount, airdropAmount); - }); - it("2. should allow stakers to stake and earn rewards", async () => { - await expectSuccessfulStake(stakeAmount); - await time.increase(ONE_WEEK.addn(1)); - }); - it("3. should deposit earnings to the beneficiary", async () => { - const beforeData = await snapshotStakingData(); - - const rewardeeBalanceBefore = await rewardToken.balanceOf(sa.default); - - await stakingRewards.exit(); - - const afterData = await snapshotStakingData(); - // Balance transferred to the beneficiary - const rewardeeBalanceAfter = await rewardToken.balanceOf(sa.default); - assertBNClose( - rewardeeBalanceAfter.sub(rewardeeBalanceBefore), - fundAmount, - simpleToExactAmount(1, 16), - ); - - const platformBalanceAfter = await platformToken.balanceOf(sa.default); - assertBNClose(platformBalanceAfter, airdropAmount, simpleToExactAmount(1, 16)); - - await assertRewardsAssigned(beforeData, afterData, false, true, true); - }); - }); -}); diff --git a/test/savings/TestSavingsContract.spec.ts b/test/savings/TestSavingsContract.spec.ts deleted file mode 100644 index f66482c2..00000000 --- a/test/savings/TestSavingsContract.spec.ts +++ /dev/null @@ -1,624 +0,0 @@ -/* eslint-disable @typescript-eslint/camelcase */ - -import { expectRevert, expectEvent, time } from "@openzeppelin/test-helpers"; - -import { simpleToExactAmount } from "@utils/math"; -import { assertBNClose, assertBNSlightlyGT } from "@utils/assertions"; -import { StandardAccounts, SystemMachine, MassetDetails } from "@utils/machines"; -import { BN } from "@utils/tools"; -import { fullScale, ZERO_ADDRESS, ZERO, MAX_UINT256, ONE_DAY } from "@utils/constants"; -import envSetup from "@utils/env_setup"; -import * as t from "types/generated"; -import shouldBehaveLikeModule from "../shared/behaviours/Module.behaviour"; - -const { expect } = envSetup.configure(); - -const SavingsContract = artifacts.require("SavingsContract"); -const MockNexus = artifacts.require("MockNexus"); -const MockMasset = artifacts.require("MockMasset"); -const MockSavingsManager = artifacts.require("MockSavingsManager"); -const SavingsManager = artifacts.require("SavingsManager"); -const MStableHelper = artifacts.require("MStableHelper"); - -interface SavingsBalances { - totalSavings: BN; - totalCredits: BN; - userCredits: BN; - exchangeRate: BN; -} - -const getBalances = async ( - contract: t.SavingsContractInstance, - user: string, -): Promise => { - return { - totalSavings: await contract.totalSavings(), - totalCredits: await contract.totalCredits(), - userCredits: await contract.creditBalances(user), - exchangeRate: await contract.exchangeRate(), - }; -}; - -contract("SavingsContract", async (accounts) => { - const sa = new StandardAccounts(accounts); - const governance = sa.dummy1; - const manager = sa.dummy2; - const ctx: { module?: t.ModuleInstance } = {}; - const TEN_TOKENS = new BN(10).mul(fullScale); - const initialMint = new BN(1000000000); - - let systemMachine: SystemMachine; - let massetDetails: MassetDetails; - - let savingsContract: t.SavingsContractInstance; - let nexus: t.MockNexusInstance; - let masset: t.MockMassetInstance; - let savingsManager: t.SavingsManagerInstance; - let helper: t.MStableHelperInstance; - - const createNewSavingsContract = async (useMockSavingsManager = true): Promise => { - // Use a mock Nexus so we can dictate addresses - nexus = await MockNexus.new(sa.governor, governance, manager); - // Use a mock mAsset so we can dictate the interest generated - masset = await MockMasset.new("MOCK", "MOCK", 18, sa.default, initialMint); - savingsContract = await SavingsContract.new(nexus.address, masset.address); - helper = await MStableHelper.new(); - // Use a mock SavingsManager so we don't need to run integrations - if (useMockSavingsManager) { - const mockSavingsManager = await MockSavingsManager.new(); - await nexus.setSavingsManager(mockSavingsManager.address); - } else { - savingsManager = await SavingsManager.new( - nexus.address, - masset.address, - savingsContract.address, - ); - await nexus.setSavingsManager(savingsManager.address); - } - }; - - /** Credits issued based on ever increasing exchange rate */ - function calculateCreditIssued(amount: BN, exchangeRate: BN): BN { - return amount.mul(fullScale).div(exchangeRate); - } - - before(async () => { - await createNewSavingsContract(); - }); - - describe("behaviors", async () => { - describe("behave like a Module", async () => { - beforeEach(async () => { - await createNewSavingsContract(); - ctx.module = savingsContract; - }); - shouldBehaveLikeModule(ctx as Required, sa); - }); - }); - - describe("constructor", async () => { - it("should fail when masset address is zero", async () => { - await expectRevert( - SavingsContract.new(nexus.address, ZERO_ADDRESS), - "mAsset address is zero", - ); - }); - - it("should succeed when valid parameters", async () => { - const nexusAddr = await savingsContract.nexus(); - expect(nexus.address).to.equal(nexusAddr); - expect(ZERO).to.bignumber.equal(await savingsContract.totalCredits()); - expect(ZERO).to.bignumber.equal(await savingsContract.totalSavings()); - expect(fullScale).to.bignumber.equal(await savingsContract.exchangeRate()); - }); - }); - - describe("setting automateInterestCollection Flag", async () => { - it("should fail when not called by governor", async () => { - await expectRevert( - savingsContract.automateInterestCollectionFlag(true, { from: sa.other }), - "Only governor can execute", - ); - }); - - it("should enable", async () => { - const tx = await savingsContract.automateInterestCollectionFlag(true, { - from: sa.governor, - }); - expectEvent.inLogs(tx.logs, "AutomaticInterestCollectionSwitched", { - automationEnabled: true, - }); - }); - - it("should disable", async () => { - const tx = await savingsContract.automateInterestCollectionFlag(false, { - from: sa.governor, - }); - expectEvent.inLogs(tx.logs, "AutomaticInterestCollectionSwitched", { - automationEnabled: false, - }); - }); - }); - - describe("depositing savings", async () => { - context("when there is some interest to collect from the manager", async () => { - before(async () => { - await createNewSavingsContract(false); - }); - - it("should collect the interest and update the exchange rate before issuance", async () => { - // Approve first - await masset.approve(savingsContract.address, TEN_TOKENS); - - // Get the total balances - const stateBefore = await getBalances(savingsContract, sa.default); - expect(stateBefore.exchangeRate).to.bignumber.equal(fullScale); - - // Deposit first to get some savings in the basket - await savingsContract.depositSavings(TEN_TOKENS); - - const stateMiddle = await getBalances(savingsContract, sa.default); - expect(stateMiddle.exchangeRate).to.bignumber.equal(fullScale); - expect(stateMiddle.totalSavings).to.bignumber.equal(TEN_TOKENS); - expect(stateMiddle.totalCredits).to.bignumber.equal(TEN_TOKENS); - - // Set up the mAsset with some interest - const interestCollected = simpleToExactAmount(10, 18); - await masset.setAmountForCollectInterest(interestCollected); - await time.increase(ONE_DAY.mul(new BN(10))); - - // Give dummy2 some tokens - await masset.transfer(sa.dummy2, TEN_TOKENS); - await masset.approve(savingsContract.address, TEN_TOKENS, { from: sa.dummy2 }); - - // Dummy 2 deposits into the contract - await savingsContract.depositSavings(TEN_TOKENS, { from: sa.dummy2 }); - - const stateEnd = await getBalances(savingsContract, sa.default); - expect(stateEnd.exchangeRate).bignumber.eq(fullScale.mul(new BN(2))); - const dummyState = await getBalances(savingsContract, sa.dummy2); - expect(dummyState.userCredits).bignumber.eq(TEN_TOKENS.div(new BN(2))); - expect(dummyState.totalSavings).bignumber.eq(TEN_TOKENS.mul(new BN(3))); - expect(dummyState.totalCredits).bignumber.eq( - TEN_TOKENS.mul(new BN(3)).div(new BN(2)), - ); - }); - }); - - context("with invalid args", async () => { - before(async () => { - await createNewSavingsContract(); - }); - it("should fail when amount is zero", async () => { - await expectRevert(savingsContract.depositSavings(ZERO), "Must deposit something"); - }); - - it("should fail if the user has no balance", async () => { - // Approve first - await masset.approve(savingsContract.address, TEN_TOKENS, { from: sa.dummy1 }); - - // Deposit - await expectRevert( - savingsContract.depositSavings(TEN_TOKENS, { from: sa.dummy1 }), - "ERC20: transfer amount exceeds balance", - ); - }); - }); - - context("when user has balance", async () => { - before(async () => { - await createNewSavingsContract(); - }); - it("should deposit some amount and issue credits", async () => { - // Approve first - await masset.approve(savingsContract.address, TEN_TOKENS); - - // Get the total balances - const totalSavingsBefore = await savingsContract.totalSavings(); - const totalCreditsBefore = await savingsContract.totalCredits(); - const creditBalBefore = await savingsContract.creditBalances(sa.default); - const exchangeRateBefore = await savingsContract.exchangeRate(); - expect(fullScale).to.bignumber.equal(exchangeRateBefore); - - // Deposit - const tx = await savingsContract.depositSavings(TEN_TOKENS); - const calcCreditIssued = calculateCreditIssued(TEN_TOKENS, exchangeRateBefore); - expectEvent.inLogs(tx.logs, "SavingsDeposited", { - saver: sa.default, - savingsDeposited: TEN_TOKENS, - creditsIssued: calcCreditIssued, - }); - - const totalSavingsAfter = await savingsContract.totalSavings(); - const totalCreditsAfter = await savingsContract.totalCredits(); - const creditBalAfter = await savingsContract.creditBalances(sa.default); - const exchangeRateAfter = await savingsContract.exchangeRate(); - - expect(totalSavingsBefore.add(TEN_TOKENS)).to.bignumber.equal(totalSavingsAfter); - expect(totalCreditsBefore.add(calcCreditIssued)).to.bignumber.equal( - totalCreditsAfter, - ); - expect(creditBalBefore.add(TEN_TOKENS)).to.bignumber.equal(creditBalAfter); - expect(fullScale).to.bignumber.equal(exchangeRateAfter); - }); - it("should deposit when auto interest collection disabled", async () => { - // Approve first - await masset.approve(savingsContract.address, TEN_TOKENS); - - await savingsContract.automateInterestCollectionFlag(false, { from: sa.governor }); - - const balanceOfUserBefore = await masset.balanceOf(sa.default); - const balanceBefore = await masset.balanceOf(savingsContract.address); - const totalSavingsBefore = await savingsContract.totalSavings(); - const totalCreditsBefore = await savingsContract.totalCredits(); - const creditBalBefore = await savingsContract.creditBalances(sa.default); - const exchangeRateBefore = await savingsContract.exchangeRate(); - expect(fullScale).to.bignumber.equal(exchangeRateBefore); - - // Deposit - const tx = await savingsContract.depositSavings(TEN_TOKENS); - expectEvent.inLogs(tx.logs, "SavingsDeposited", { - saver: sa.default, - savingsDeposited: TEN_TOKENS, - creditsIssued: TEN_TOKENS, - }); - - const balanceOfUserAfter = await masset.balanceOf(sa.default); - const balanceAfter = await masset.balanceOf(savingsContract.address); - const totalSavingsAfter = await savingsContract.totalSavings(); - const totalCreditsAfter = await savingsContract.totalCredits(); - const creditBalAfter = await savingsContract.creditBalances(sa.default); - const exchangeRateAfter = await savingsContract.exchangeRate(); - - expect(balanceOfUserBefore.sub(TEN_TOKENS)).to.bignumber.equal(balanceOfUserAfter); - expect(balanceBefore.add(TEN_TOKENS)).to.bignumber.equal(balanceAfter); - expect(totalSavingsBefore.add(TEN_TOKENS)).to.bignumber.equal(totalSavingsAfter); - expect(totalCreditsBefore.add(TEN_TOKENS)).to.bignumber.equal(totalCreditsAfter); - expect(creditBalBefore.add(TEN_TOKENS)).to.bignumber.equal(creditBalAfter); - expect(fullScale).to.bignumber.equal(exchangeRateAfter); - }); - }); - }); - - describe("using the helper", async () => { - before(async () => { - await createNewSavingsContract(false); - }); - - it("should deposit and withdraw", async () => { - // Approve first - await masset.approve(savingsContract.address, TEN_TOKENS); - - // Get the total balances - const stateBefore = await getBalances(savingsContract, sa.default); - expect(stateBefore.exchangeRate).to.bignumber.equal(fullScale); - - // Deposit first to get some savings in the basket - await savingsContract.depositSavings(TEN_TOKENS); - - const bal = await helper.getSaveBalance(savingsContract.address, sa.default); - assertBNSlightlyGT(TEN_TOKENS, bal, new BN(1)); - - // Set up the mAsset with some interest - await masset.setAmountForCollectInterest(simpleToExactAmount(5, 18)); - await masset.transfer(sa.dummy2, TEN_TOKENS); - await masset.approve(savingsContract.address, TEN_TOKENS, { from: sa.dummy2 }); - await savingsContract.depositSavings(TEN_TOKENS, { from: sa.dummy2 }); - - const redeemInput = await helper.getSaveRedeemInput( - savingsContract.address, - TEN_TOKENS, - ); - const balBefore = await masset.balanceOf(sa.default); - await savingsContract.redeem(redeemInput); - - const balAfter = await masset.balanceOf(sa.default); - expect(balAfter).bignumber.eq(balBefore.add(TEN_TOKENS)); - }); - }); - - describe("depositing interest", async () => { - const savingsManagerAccount = sa.dummy4; - - beforeEach(async () => { - await createNewSavingsContract(); - await nexus.setSavingsManager(savingsManagerAccount); - await masset.transfer(savingsManagerAccount, TEN_TOKENS); - await masset.approve(savingsContract.address, TEN_TOKENS, { - from: savingsManagerAccount, - }); - }); - - context("when called by random address", async () => { - it("should fail when not called by savings manager", async () => { - await expectRevert( - savingsContract.depositInterest(TEN_TOKENS, { from: sa.other }), - "Only savings manager can execute", - ); - }); - }); - - context("when called with incorrect args", async () => { - it("should fail when amount is zero", async () => { - await expectRevert( - savingsContract.depositInterest(ZERO, { from: savingsManagerAccount }), - "Must deposit something", - ); - }); - }); - - context("in a valid situation", async () => { - it("should deposit interest when no credits", async () => { - const balanceBefore = await masset.balanceOf(savingsContract.address); - const exchangeRateBefore = await savingsContract.exchangeRate(); - - await savingsContract.depositInterest(TEN_TOKENS, { from: savingsManagerAccount }); - - const exchangeRateAfter = await savingsContract.exchangeRate(); - const balanceAfter = await masset.balanceOf(savingsContract.address); - expect(TEN_TOKENS).to.bignumber.equal(await savingsContract.totalSavings()); - expect(balanceBefore.add(TEN_TOKENS)).to.bignumber.equal(balanceAfter); - // exchangeRate should not change - expect(exchangeRateBefore).to.bignumber.equal(exchangeRateAfter); - }); - - it("should deposit interest when some credits exist", async () => { - const TWENTY_TOKENS = TEN_TOKENS.mul(new BN(2)); - - // Deposit to SavingsContract - await masset.approve(savingsContract.address, TEN_TOKENS); - await savingsContract.automateInterestCollectionFlag(false, { from: sa.governor }); - await savingsContract.depositSavings(TEN_TOKENS); - - const balanceBefore = await masset.balanceOf(savingsContract.address); - - // Deposit Interest - const tx = await savingsContract.depositInterest(TEN_TOKENS, { - from: savingsManagerAccount, - }); - expectEvent.inLogs(tx.logs, "ExchangeRateUpdated", { - newExchangeRate: TWENTY_TOKENS.mul(fullScale).div(TEN_TOKENS), - interestCollected: TEN_TOKENS, - }); - - const exchangeRateAfter = await savingsContract.exchangeRate(); - const balanceAfter = await masset.balanceOf(savingsContract.address); - expect(TWENTY_TOKENS).to.bignumber.equal(await savingsContract.totalSavings()); - expect(balanceBefore.add(TEN_TOKENS)).to.bignumber.equal(balanceAfter); - - // exchangeRate should change - const expectedExchangeRate = TWENTY_TOKENS.mul(fullScale).div(TEN_TOKENS); - expect(expectedExchangeRate).to.bignumber.equal(exchangeRateAfter); - }); - }); - }); - - describe("redeeming credits", async () => { - beforeEach(async () => { - await createNewSavingsContract(); - }); - - context("with invalid args", async () => { - it("should fail when credits is zero", async () => { - await expectRevert(savingsContract.redeem(ZERO), "Must withdraw something"); - }); - - it("should fail when user doesn't have credits", async () => { - const credits = new BN(10); - await expectRevert(savingsContract.redeem(credits), "Saver has no credits", { - from: sa.other, - }); - }); - }); - - context("when the user has balance", async () => { - it("should redeem when user has balance", async () => { - const FIVE_TOKENS = TEN_TOKENS.div(new BN(2)); - - const balanceOfUserBefore = await masset.balanceOf(sa.default); - - // Approve tokens - await masset.approve(savingsContract.address, TEN_TOKENS); - - // Deposit tokens first - const balanceBeforeDeposit = await masset.balanceOf(savingsContract.address); - await savingsContract.depositSavings(TEN_TOKENS); - const balanceAfterDeposit = await masset.balanceOf(savingsContract.address); - expect(balanceBeforeDeposit.add(TEN_TOKENS)).to.bignumber.equal( - balanceAfterDeposit, - ); - - // Redeem tokens - const tx = await savingsContract.redeem(FIVE_TOKENS); - const exchangeRate = fullScale; - expectEvent.inLogs(tx.logs, "CreditsRedeemed", { - redeemer: sa.default, - creditsRedeemed: FIVE_TOKENS, - savingsCredited: calculateCreditIssued(FIVE_TOKENS, exchangeRate), - }); - const balanceAfterRedeem = await masset.balanceOf(savingsContract.address); - expect(balanceAfterDeposit.sub(FIVE_TOKENS)).to.bignumber.equal(balanceAfterRedeem); - - const balanceOfUserAfter = await masset.balanceOf(sa.default); - expect(balanceOfUserBefore.sub(FIVE_TOKENS)).to.bignumber.equal(balanceOfUserAfter); - }); - - it("should redeem when user redeems all", async () => { - const balanceOfUserBefore = await masset.balanceOf(sa.default); - - // Approve tokens - await masset.approve(savingsContract.address, TEN_TOKENS); - - // Deposit tokens first - const balanceBeforeDeposit = await masset.balanceOf(savingsContract.address); - await savingsContract.depositSavings(TEN_TOKENS); - const balanceAfterDeposit = await masset.balanceOf(savingsContract.address); - expect(balanceBeforeDeposit.add(TEN_TOKENS)).to.bignumber.equal( - balanceAfterDeposit, - ); - - // Redeem tokens - const tx = await savingsContract.redeem(TEN_TOKENS); - const exchangeRate = fullScale; - expectEvent.inLogs(tx.logs, "CreditsRedeemed", { - redeemer: sa.default, - creditsRedeemed: TEN_TOKENS, - savingsCredited: calculateCreditIssued(TEN_TOKENS, exchangeRate), - }); - const balanceAfterRedeem = await masset.balanceOf(savingsContract.address); - expect(ZERO).to.bignumber.equal(balanceAfterRedeem); - - const balanceOfUserAfter = await masset.balanceOf(sa.default); - expect(balanceOfUserBefore).to.bignumber.equal(balanceOfUserAfter); - }); - }); - }); - - context("performing multiple operations from multiple addresses in sequence", async () => { - describe("depositing, collecting interest and then depositing/withdrawing", async () => { - before(async () => { - await createNewSavingsContract(false); - }); - - it("should give existing savers the benefit of the increased exchange rate", async () => { - const saver1 = sa.default; - const saver2 = sa.dummy1; - const saver3 = sa.dummy2; - const saver4 = sa.dummy3; - - // Set up amounts - // Each savers deposit will trigger some interest to be deposited - const saver1deposit = simpleToExactAmount(1000, 18); - const interestToReceive1 = simpleToExactAmount(100, 18); - const saver2deposit = simpleToExactAmount(1000, 18); - const interestToReceive2 = simpleToExactAmount(350, 18); - const saver3deposit = simpleToExactAmount(1000, 18); - const interestToReceive3 = simpleToExactAmount(80, 18); - const saver4deposit = simpleToExactAmount(1000, 18); - const interestToReceive4 = simpleToExactAmount(160, 18); - - // Ensure saver2 has some balances and do approvals - await masset.transfer(saver2, saver2deposit); - await masset.transfer(saver3, saver3deposit); - await masset.transfer(saver4, saver4deposit); - await masset.approve(savingsContract.address, MAX_UINT256, { from: saver1 }); - await masset.approve(savingsContract.address, MAX_UINT256, { from: saver2 }); - await masset.approve(savingsContract.address, MAX_UINT256, { from: saver3 }); - await masset.approve(savingsContract.address, MAX_UINT256, { from: saver4 }); - - // Should be a fresh balance sheet - const stateBefore = await getBalances(savingsContract, sa.default); - expect(stateBefore.exchangeRate).to.bignumber.equal(fullScale); - expect(stateBefore.totalSavings).to.bignumber.equal(new BN(0)); - - // 1.0 user 1 deposits - // interest remains unassigned and exchange rate unmoved - await masset.setAmountForCollectInterest(interestToReceive1); - await time.increase(ONE_DAY); - await savingsContract.depositSavings(saver1deposit, { from: saver1 }); - const state1 = await getBalances(savingsContract, saver1); - // 2.0 user 2 deposits - // interest rate benefits user 1 and issued user 2 less credits than desired - await masset.setAmountForCollectInterest(interestToReceive2); - await time.increase(ONE_DAY); - await savingsContract.depositSavings(saver2deposit, { from: saver2 }); - const state2 = await getBalances(savingsContract, saver2); - // 3.0 user 3 deposits - // interest rate benefits users 1 and 2 - await masset.setAmountForCollectInterest(interestToReceive3); - await time.increase(ONE_DAY); - await savingsContract.depositSavings(saver3deposit, { from: saver3 }); - const state3 = await getBalances(savingsContract, saver3); - // 4.0 user 1 withdraws all her credits - await savingsContract.redeem(state1.userCredits, { from: saver1 }); - const state4 = await getBalances(savingsContract, saver1); - expect(state4.userCredits).bignumber.eq(new BN(0)); - expect(state4.totalCredits).bignumber.eq( - state3.totalCredits.sub(state1.userCredits), - ); - expect(state4.exchangeRate).bignumber.eq(state3.exchangeRate); - assertBNClose( - state4.totalSavings, - state4.totalCredits.mul(state4.exchangeRate).div(fullScale), - new BN(1000), - ); - // 5.0 user 4 deposits - // interest rate benefits users 2 and 3 - await masset.setAmountForCollectInterest(interestToReceive4); - await time.increase(ONE_DAY); - await savingsContract.depositSavings(saver4deposit, { from: saver4 }); - const state5 = await getBalances(savingsContract, saver4); - // 6.0 users 2, 3, and 4 withdraw all their tokens - await savingsContract.redeem(state2.userCredits, { from: saver2 }); - await savingsContract.redeem(state3.userCredits, { from: saver3 }); - await savingsContract.redeem(state5.userCredits, { from: saver4 }); - }); - }); - }); - - describe("depositing and withdrawing", () => { - before(async () => { - // Create the system Mock machines - systemMachine = new SystemMachine(sa.all); - await systemMachine.initialiseMocks(true); - massetDetails = systemMachine.mUSD; - }); - describe("depositing mUSD into savings", () => { - it("Should deposit the mUSD and assign credits to the saver", async () => { - const depositAmount = simpleToExactAmount(1, 18); - // const exchangeRate_before = await systemMachine.savingsContract.exchangeRate(); - const credits_totalBefore = await systemMachine.savingsContract.totalCredits(); - const mUSD_balBefore = await massetDetails.mAsset.balanceOf(sa.default); - const mUSD_totalBefore = await systemMachine.savingsContract.totalSavings(); - // 1. Approve the savings contract to spend mUSD - await massetDetails.mAsset.approve( - systemMachine.savingsContract.address, - depositAmount, - { from: sa.default }, - ); - // 2. Deposit the mUSD - await systemMachine.savingsContract.depositSavings(depositAmount, { - from: sa.default, - }); - const credits_balAfter = await systemMachine.savingsContract.creditBalances( - sa.default, - ); - expect(credits_balAfter, "Must receive some savings credits").bignumber.eq( - simpleToExactAmount(1, 18), - ); - const credits_totalAfter = await systemMachine.savingsContract.totalCredits(); - expect(credits_totalAfter, "Must deposit 1 full units of mUSD").bignumber.eq( - credits_totalBefore.add(simpleToExactAmount(1, 18)), - ); - const mUSD_balAfter = await massetDetails.mAsset.balanceOf(sa.default); - expect(mUSD_balAfter, "Must deposit 1 full units of mUSD").bignumber.eq( - mUSD_balBefore.sub(depositAmount), - ); - const mUSD_totalAfter = await systemMachine.savingsContract.totalSavings(); - expect(mUSD_totalAfter, "Must deposit 1 full units of mUSD").bignumber.eq( - mUSD_totalBefore.add(simpleToExactAmount(1, 18)), - ); - }); - }); - describe("Withdrawing mUSD from savings", () => { - it("Should withdraw the mUSD and burn the credits", async () => { - const redemptionAmount = simpleToExactAmount(1, 18); - const credits_balBefore = await systemMachine.savingsContract.creditBalances( - sa.default, - ); - const mUSD_balBefore = await massetDetails.mAsset.balanceOf(sa.default); - // Redeem all the credits - await systemMachine.savingsContract.redeem(credits_balBefore, { from: sa.default }); - - const credits_balAfter = await systemMachine.savingsContract.creditBalances( - sa.default, - ); - const mUSD_balAfter = await massetDetails.mAsset.balanceOf(sa.default); - expect(credits_balAfter, "Must burn all the credits").bignumber.eq(new BN(0)); - expect(mUSD_balAfter, "Must receive back mUSD").bignumber.eq( - mUSD_balBefore.add(redemptionAmount), - ); - }); - }); - }); -}); diff --git a/test/savings/TestSavingsManager.spec.ts b/test/savings/TestSavingsManager.spec.ts deleted file mode 100644 index 203f9190..00000000 --- a/test/savings/TestSavingsManager.spec.ts +++ /dev/null @@ -1,1346 +0,0 @@ -/* eslint-disable @typescript-eslint/camelcase */ - -import { assertBNClose, assertBNClosePercent, assertBNSlightlyGTPercent } from "@utils/assertions"; -import { expectEvent, time, expectRevert } from "@openzeppelin/test-helpers"; -import { StandardAccounts } from "@utils/machines"; -import { simpleToExactAmount } from "@utils/math"; -import envSetup from "@utils/env_setup"; -import { BN } from "@utils/tools"; -import { - ZERO_ADDRESS, - MAX_UINT256, - ZERO, - fullScale, - TEN_MINS, - ONE_DAY, - ONE_MIN, - ONE_WEEK, - DEAD_ADDRESS, -} from "@utils/constants"; -import * as t from "types/generated"; -import shouldBehaveLikeModule from "../shared/behaviours/Module.behaviour"; -import shouldBehaveLikePausableModule from "../shared/behaviours/PausableModule.behaviour"; - -const { expect } = envSetup.configure(); - -const SavingsManager = artifacts.require("SavingsManager"); -const MockNexus = artifacts.require("MockNexus"); -const MockMasset = artifacts.require("MockMasset"); -const MockMasset1 = artifacts.require("MockMasset1"); -const SavingsContract = artifacts.require("SavingsContract"); -const MockRevenueRecipient = artifacts.require("MockRevenueRecipient"); - -contract("SavingsManager", async (accounts) => { - const TEN = new BN(10); - const TEN_TOKENS = TEN.mul(fullScale); - const FIVE_TOKENS = TEN_TOKENS.div(new BN(2)); - const THIRTY_MINUTES = TEN_MINS.mul(new BN(3)).add(new BN(1)); - // 1.2 million tokens - const INITIAL_MINT = new BN(1200000); - const sa = new StandardAccounts(accounts); - const governance = sa.dummy1; - const manager = sa.dummy2; - const ctx: { module?: t.PausableModuleInstance } = {}; - - let nexus: t.MockNexusInstance; - let savingsContract: t.SavingsContractInstance; - let savingsManager: t.SavingsManagerInstance; - let mUSD: t.MockMassetInstance; - const liquidator = sa.fundManager; - - async function createNewSavingsManager(mintAmount: BN = INITIAL_MINT): Promise { - mUSD = await MockMasset.new("mUSD", "mUSD", 18, sa.default, mintAmount); - savingsContract = await SavingsContract.new(nexus.address, mUSD.address); - savingsManager = await SavingsManager.new( - nexus.address, - mUSD.address, - savingsContract.address, - ); - // Set new SavingsManager address in Nexus - await nexus.setSavingsManager(savingsManager.address); - await nexus.setLiquidator(liquidator); - await mUSD.transfer(liquidator, simpleToExactAmount(1, 23), { from: sa.default }); - } - - before(async () => { - nexus = await MockNexus.new(sa.governor, governance, manager); - - await createNewSavingsManager(); - }); - - describe("behaviours", async () => { - describe("should behave like a Module", async () => { - beforeEach(async () => { - await createNewSavingsManager(); - ctx.module = savingsManager as t.PausableModuleInstance; - }); - shouldBehaveLikeModule(ctx as Required, sa); - shouldBehaveLikePausableModule(ctx as { module: t.PausableModuleInstance }, sa); - }); - }); - - describe("constructor", async () => { - it("should fail when nexus address is zero", async () => { - await expectRevert( - SavingsManager.new(ZERO_ADDRESS, mUSD.address, savingsContract.address), - "Nexus is zero address", - ); - }); - - it("should fail when mAsset address is zero", async () => { - await expectRevert( - SavingsManager.new(nexus.address, ZERO_ADDRESS, savingsContract.address), - "Must be valid address", - ); - }); - - it("should fail when savingsContract address is zero", async () => { - await expectRevert( - SavingsManager.new(nexus.address, mUSD.address, ZERO_ADDRESS), - "Must be valid address", - ); - }); - - it("should have valid state after deployment", async () => { - const savingsContractAddr = await savingsManager.savingsContracts(mUSD.address); - expect(savingsContractAddr).to.equal(savingsContract.address); - - const allowance = await mUSD.allowance(savingsManager.address, savingsContract.address); - expect(MAX_UINT256).to.bignumber.equal(allowance); - }); - }); - - describe("adding a SavingsContract", async () => { - let mockMasset: t.MockERC20Instance; - const mockSavingsContract = sa.dummy4; - - before(async () => { - mockMasset = await MockMasset.new("MOCK", "MOCK", 18, sa.default, new BN(10000)); - }); - - it("should fail when not called by governor", async () => { - await expectRevert( - savingsManager.addSavingsContract(mockMasset.address, mockSavingsContract, { - from: sa.other, - }), - "Only governor can execute", - ); - }); - - it("should fail when mAsset address is zero", async () => { - await expectRevert( - savingsManager.addSavingsContract(ZERO_ADDRESS, mockSavingsContract, { - from: sa.governor, - }), - "Must be valid address", - ); - }); - - it("should fail when savingsContract address is zero", async () => { - await expectRevert( - savingsManager.addSavingsContract(mockMasset.address, ZERO_ADDRESS, { - from: sa.governor, - }), - "Must be valid address", - ); - }); - - it("should fail when mAsset entry already exist", async () => { - await expectRevert( - savingsManager.addSavingsContract(mUSD.address, savingsContract.address, { - from: sa.governor, - }), - "Savings contract already exists", - ); - }); - - it("should succeed with valid parameter", async () => { - let savingsContractAddr = await savingsManager.savingsContracts(mUSD.address); - expect(savingsContractAddr).to.equal(savingsContract.address); - - savingsContractAddr = await savingsManager.savingsContracts(mockMasset.address); - expect(ZERO_ADDRESS).to.equal(savingsContractAddr); - - const tx = await savingsManager.addSavingsContract( - mockMasset.address, - mockSavingsContract, - { - from: sa.governor, - }, - ); - expectEvent(tx.receipt, "SavingsContractAdded", { - mAsset: mockMasset.address, - savingsContract: mockSavingsContract, - }); - - savingsContractAddr = await savingsManager.savingsContracts(mUSD.address); - expect(savingsContractAddr).to.equal(savingsContract.address); - - savingsContractAddr = await savingsManager.savingsContracts(mockMasset.address); - expect(mockSavingsContract).to.equal(savingsContractAddr); - }); - }); - - describe("updating a SavingsContract", async () => { - it("should fail when not called by governor", async () => { - await expectRevert( - savingsManager.updateSavingsContract(mUSD.address, savingsContract.address, { - from: sa.other, - }), - "Only governor can execute", - ); - }); - - it("should fail when mAsset address is zero", async () => { - await expectRevert( - savingsManager.updateSavingsContract(ZERO_ADDRESS, savingsContract.address, { - from: sa.governor, - }), - "Savings contract does not exist", - ); - }); - - it("should fail when savingsContract address is zero", async () => { - await expectRevert( - savingsManager.updateSavingsContract(mUSD.address, ZERO_ADDRESS, { - from: sa.governor, - }), - "Must be valid address", - ); - }); - - it("should fail when savingsContract not found", async () => { - await expectRevert( - savingsManager.updateSavingsContract(sa.other, savingsContract.address, { - from: sa.governor, - }), - "Savings contract does not exist", - ); - }); - - it("should succeed with valid parameters", async () => { - let savingsContractAddr = await savingsManager.savingsContracts(mUSD.address); - expect(savingsContractAddr).to.equal(savingsContract.address); - - const tx = await savingsManager.updateSavingsContract(mUSD.address, sa.other, { - from: sa.governor, - }); - - expectEvent(tx.receipt, "SavingsContractUpdated", { - mAsset: mUSD.address, - savingsContract: sa.other, - }); - - savingsContractAddr = await savingsManager.savingsContracts(mUSD.address); - expect(sa.other).to.equal(savingsContractAddr); - }); - }); - - describe("freezing streams", async () => { - it("should fail when not called by governor", async () => { - await expectRevert( - savingsManager.freezeStreams({ from: sa.other }), - "Only governor can execute", - ); - }); - it("should stop all streaming from being initialized", async () => { - const tx = await savingsManager.freezeStreams({ from: sa.governor }); - expectEvent(tx.receipt, "StreamsFrozen"); - - await expectRevert( - savingsManager.collectAndStreamInterest(mUSD.address), - "Streaming is currently frozen", - ); - }); - }); - - describe("adding a revenue recipient", async () => { - it("should fail when not called by governor", async () => { - await expectRevert( - savingsManager.setRevenueRecipient(mUSD.address, DEAD_ADDRESS, { from: sa.other }), - "Only governor can execute", - ); - }); - it("should simply update the recipient and emit an event", async () => { - const tx = await savingsManager.setRevenueRecipient(mUSD.address, sa.fundManager, { - from: sa.governor, - }); - expectEvent(tx.receipt, "RevenueRecipientSet", { - mAsset: mUSD.address, - recipient: sa.fundManager, - }); - const recipient = await savingsManager.revenueRecipients(mUSD.address); - expect(recipient).eq(sa.fundManager); - }); - }); - - describe("modifying the savings rate", async () => { - it("should fail when not called by governor", async () => { - await expectRevert( - savingsManager.setSavingsRate(fullScale, { from: sa.other }), - "Only governor can execute", - ); - }); - - it("should fail when not in range (lower range)", async () => { - await expectRevert( - savingsManager.setSavingsRate(simpleToExactAmount(1, 16), { from: sa.governor }), - "Must be a valid rate", - ); - }); - - it("should fail when not in range (higher range)", async () => { - await expectRevert( - savingsManager.setSavingsRate(simpleToExactAmount(1, 20), { from: sa.governor }), - "Must be a valid rate", - ); - }); - - it("should succeed when in valid range (min value)", async () => { - const newRate = simpleToExactAmount(6, 17); - const tx = await savingsManager.setSavingsRate(newRate, { - from: sa.governor, - }); - - expectEvent(tx.receipt, "SavingsRateChanged", { newSavingsRate: newRate }); - }); - - it("should succeed when in valid range (max value)", async () => { - const newRate = simpleToExactAmount(1, 18); - const tx = await savingsManager.setSavingsRate(newRate, { - from: sa.governor, - }); - - expectEvent(tx.receipt, "SavingsRateChanged", { newSavingsRate: newRate }); - }); - }); - - describe("collecting and distributing Interest", async () => { - beforeEach(async () => { - await createNewSavingsManager(); - }); - context("with invalid arguments", async () => { - it("should fail when mAsset not exist", async () => { - await expectRevert( - savingsManager.collectAndDistributeInterest(sa.other), - "Must have a valid savings contract", - ); - }); - }); - context("when the contract is paused", async () => { - it("should fail", async () => { - // Pause contract - await savingsManager.pause({ from: sa.governor }); - - await expectRevert( - savingsManager.collectAndDistributeInterest(mUSD.address), - "Pausable: paused", - ); - }); - }); - context("when there is no interest to collect", async () => { - before(async () => { - await createNewSavingsManager(); - }); - - it("should succeed when interest collected is zero", async () => { - const tx = await savingsManager.collectAndDistributeInterest(mUSD.address); - expectEvent(tx.receipt, "InterestCollected", { - mAsset: mUSD.address, - interest: new BN(0), - newTotalSupply: INITIAL_MINT.mul(new BN(10).pow(new BN(18))), - apy: new BN(0), - }); - }); - }); - - context("with a broken mAsset", async () => { - it("fails if the mAsset does not send required mAsset", async () => { - const mUSD2 = await MockMasset1.new("mUSD", "mUSD", 18, sa.default, INITIAL_MINT); - savingsContract = await SavingsContract.new(nexus.address, mUSD.address); - savingsManager = await SavingsManager.new( - nexus.address, - mUSD2.address, - savingsContract.address, - ); - // Set new SavingsManager address in Nexus - nexus.setSavingsManager(savingsManager.address); - - const newInterest = new BN(10).mul(fullScale); - await mUSD2.setAmountForCollectInterest(newInterest); - - // should move 1 day in future - await time.increase(THIRTY_MINUTES); - await expectRevert( - savingsManager.collectAndDistributeInterest(mUSD2.address), - "Must receive mUSD", - ); - }); - }); - - interface Stream { - end: BN; - rate: BN; - } - - interface Data { - lastPeriodStart: BN; - lastCollection: BN; - periodYield: BN; - liqStream: Stream; - yieldStream: Stream; - savingsManagerBal: BN; - savingsContractBal: BN; - lastBatchCollected: BN; - } - const snapshotData = async (): Promise => { - const liqStream = await savingsManager.liqStream(mUSD.address); - const yieldStream = await savingsManager.yieldStream(mUSD.address); - return { - lastPeriodStart: await savingsManager.lastPeriodStart(mUSD.address), - lastCollection: await savingsManager.lastCollection(mUSD.address), - periodYield: await savingsManager.periodYield(mUSD.address), - liqStream: { end: liqStream[0], rate: liqStream[1] }, - yieldStream: { end: yieldStream[0], rate: yieldStream[1] }, - savingsManagerBal: await mUSD.balanceOf(savingsManager.address), - savingsContractBal: await mUSD.balanceOf(savingsContract.address), - lastBatchCollected: await savingsManager.lastBatchCollected(mUSD.address), - }; - }; - context("testing the boundaries of liquidated deposits", async () => { - // Initial supply of 10m units - const initialSupply = new BN(10000000); - const liquidated1 = simpleToExactAmount(100, 18); - const liquidated2 = simpleToExactAmount(200, 18); - const liquidated3 = simpleToExactAmount(300, 18); - beforeEach(async () => { - await createNewSavingsManager(initialSupply); - }); - it("should fail if deposit not called by the liquidator", async () => { - await expectRevert( - savingsManager.depositLiquidation(mUSD.address, liquidated1, { - from: sa.dummy2, - }), - "Only liquidator can execute", - ); - }); - it("should fail if sender has no mUSD approved", async () => { - await expectRevert( - savingsManager.depositLiquidation(mUSD.address, liquidated1, { - from: liquidator, - }), - "SafeERC20: low-level call failed", - ); - }); - it("should set the streamRate and finish time correctly", async () => { - const before = await snapshotData(); - await mUSD.approve(savingsManager.address, liquidated1, { from: liquidator }); - - const tx = await savingsManager.depositLiquidation(mUSD.address, liquidated1, { - from: liquidator, - }); - expectEvent(tx.receipt, "LiquidatorDeposited", { - mAsset: mUSD.address, - amount: liquidated1, - }); - const t0 = await time.latest(); - - const after = await snapshotData(); - expect(after.savingsManagerBal).bignumber.eq( - before.savingsManagerBal.add(liquidated1), - ); - assertBNClose(after.lastCollection, t0, 2); - expect(after.lastPeriodStart).bignumber.eq(after.lastCollection); - expect(after.periodYield).bignumber.eq(new BN(0)); - expect(after.liqStream.end).bignumber.eq(after.lastCollection.add(ONE_WEEK)); - assertBNClosePercent(after.liqStream.rate, liquidated1.div(ONE_WEEK), "0.001"); - }); - it("should work over multiple periods", async () => { - // 0 1 2 3 - // | - - - - | - - - - | - - - - | - // ^ ^^^ ^ ^ ^ - // start 567 1516 18 - // @time - Description (periodStart, lastCollection, periodYield) - // @0 - Deposit is made - // @5 - Yield collects days 0-5 - // @6 - Deposit is made - second period begins - // @7 - Yield collects days 6-7 - // @15 - Yield collects days 7-13 but not 14 - // @16 - Yield collects nothing - // @18 - Deposit is made - - // @0 - const s = await snapshotData(); - expect(s.liqStream.rate).bignumber.eq(new BN(0)); - expect(s.savingsManagerBal).bignumber.eq(new BN(0)); - - await mUSD.approve(savingsManager.address, liquidated1, { from: liquidator }); - await savingsManager.depositLiquidation(mUSD.address, liquidated1, { - from: liquidator, - }); - - const s0 = await snapshotData(); - assertBNClosePercent(s0.liqStream.rate, liquidated1.div(ONE_WEEK), "0.001"); - - await time.increase(ONE_DAY.muln(5)); - // @5 - - let expectedInterest = ONE_DAY.muln(5).mul(s0.liqStream.rate); - await mUSD.setAmountForCollectInterest(1); - await savingsManager.collectAndDistributeInterest(mUSD.address); - - const s5 = await snapshotData(); - - assertBNClosePercent( - s5.savingsManagerBal, - s0.savingsManagerBal.sub(expectedInterest), - "0.01", - ); - - assertBNClosePercent( - s5.savingsContractBal, - s0.savingsContractBal.add(expectedInterest), - "0.01", - ); - - await time.increase(ONE_DAY); - // @6 - const leftOverRewards = ONE_DAY.mul(s0.liqStream.rate); - const totalRewards = leftOverRewards.add(liquidated2); - - await mUSD.approve(savingsManager.address, liquidated2, { from: liquidator }); - await savingsManager.depositLiquidation(mUSD.address, liquidated2, { - from: liquidator, - }); - - const s6 = await snapshotData(); - - assertBNClosePercent(s6.liqStream.rate, totalRewards.div(ONE_WEEK), "0.01"); - expect(s6.liqStream.end).bignumber.eq(s6.lastCollection.add(ONE_WEEK)); - - await time.increase(ONE_DAY); - // @7 - expectedInterest = ONE_DAY.mul(s6.liqStream.rate); - await mUSD.setAmountForCollectInterest(1); - await savingsManager.collectAndDistributeInterest(mUSD.address); - - const s7 = await snapshotData(); - assertBNClosePercent( - s7.savingsManagerBal, - s6.savingsManagerBal.sub(expectedInterest), - "0.01", - ); - - await time.increase(ONE_DAY.muln(8)); - // @15 - expectedInterest = ONE_DAY.muln(6).mul(s6.liqStream.rate); - await mUSD.setAmountForCollectInterest(1); - await savingsManager.collectAndDistributeInterest(mUSD.address); - - const s15 = await snapshotData(); - assertBNClosePercent( - s15.savingsManagerBal, - s7.savingsManagerBal.sub(expectedInterest), - "0.01", - ); - - expect(s15.liqStream.end).bignumber.lt(s15.lastCollection as any); - expect(s15.liqStream.rate).bignumber.eq(s7.liqStream.rate); - assertBNClose(s15.savingsManagerBal, new BN(0), simpleToExactAmount(1, 6)); - - await time.increase(ONE_DAY); - // @16 - expectedInterest = new BN(0); - await mUSD.setAmountForCollectInterest(1); - await savingsManager.collectAndDistributeInterest(mUSD.address); - - const s16 = await snapshotData(); - expect(s16.savingsManagerBal).bignumber.eq(s15.savingsManagerBal); - - await time.increase(ONE_DAY.muln(2)); - // @18 - await mUSD.approve(savingsManager.address, liquidated3, { from: liquidator }); - await savingsManager.depositLiquidation(mUSD.address, liquidated3, { - from: liquidator, - }); - const s18 = await snapshotData(); - assertBNClosePercent(s18.liqStream.rate, liquidated3.div(ONE_WEEK), "0.001"); - }); - }); - - context("testing the collection and streaming of mAsset interest", async () => { - // Initial supply of 10m units - const initialSupply = new BN(10000000); - const liquidated1 = simpleToExactAmount(100, 18); - const platformInterest1 = simpleToExactAmount(10, 18); - const platformInterest2 = simpleToExactAmount(50, 18); - const platformInterest3 = simpleToExactAmount(20, 18); - const platformInterest4 = simpleToExactAmount(40, 18); - // check lastBatchCollected - beforeEach(async () => { - await createNewSavingsManager(initialSupply); - }); - it("should fail if streams are frozen", async () => { - await savingsManager.freezeStreams({ from: sa.governor }); - await expectRevert( - savingsManager.collectAndStreamInterest(mUSD.address), - "Streaming is currently frozen", - ); - }); - it("should fail if there is no valid savings contract", async () => { - await expectRevert( - savingsManager.collectAndStreamInterest(sa.dummy1, { - from: sa.dummy2, - }), - "Must have a valid savings contract", - ); - }); - it("should fail if called twice within 6 hours", async () => { - await mUSD.setAmountForPlatformInterest(new BN(10000)); - await savingsManager.collectAndStreamInterest(mUSD.address); - await expectRevert( - savingsManager.collectAndStreamInterest(mUSD.address, { - from: sa.dummy2, - }), - "Cannot deposit twice in 6 hours", - ); - }); - it("should have no effect if there is no interest to collect", async () => { - const before = await snapshotData(); - const tx = await savingsManager.collectAndStreamInterest(mUSD.address); - expectEvent(tx.receipt, "InterestCollected", { - interest: new BN(0), - apy: new BN(0), - }); - const timeAfter = await time.latest(); - const after = await snapshotData(); - expect(before.yieldStream.rate).bignumber.eq(after.yieldStream.rate); - expect(before.yieldStream.end).bignumber.eq(after.yieldStream.end); - // It should first collect and distribute existing interest - assertBNClose(after.lastCollection, timeAfter, 2); - expect(before.lastCollection).bignumber.eq(new BN(0)); - }); - it("should fail if the APY is too high", async () => { - await mUSD.setAmountForPlatformInterest(new BN(10000)); - await savingsManager.collectAndStreamInterest(mUSD.address); - - await time.increase(ONE_DAY.divn(2).addn(1)); - // max APY = 1500% - // initial liq = 10m - // 12h increase = ~~205k - await mUSD.setAmountForPlatformInterest(simpleToExactAmount(210000, 18)); - await expectRevert( - savingsManager.collectAndStreamInterest(mUSD.address, { - from: sa.dummy2, - }), - "Interest protected from inflating past maxAPY", - ); - await mUSD.setAmountForPlatformInterest(simpleToExactAmount(200000, 18)); - const tx = await savingsManager.collectAndStreamInterest(mUSD.address); - expectEvent(tx.receipt, "InterestCollected", { - interest: simpleToExactAmount(200000, 18), - }); - }); - it("should factor in new mUSD, initialise stream and emit an event", async () => { - const before = await snapshotData(); - expect(before.lastBatchCollected).bignumber.eq(new BN(0)); - expect(before.lastCollection).bignumber.eq(new BN(0)); - expect(before.lastPeriodStart).bignumber.eq(new BN(0)); - expect(before.periodYield).bignumber.eq(new BN(0)); - expect(before.savingsContractBal).bignumber.eq(new BN(0)); - expect(before.savingsManagerBal).bignumber.eq(new BN(0)); - expect(before.yieldStream.rate).bignumber.eq(new BN(0)); - expect(before.yieldStream.end).bignumber.eq(new BN(0)); - - const ts = await time.latest(); - const collectionAmount = simpleToExactAmount(100, 18); - await mUSD.setAmountForPlatformInterest(collectionAmount); - const tx = await savingsManager.collectAndStreamInterest(mUSD.address); - - const after = await snapshotData(); - assertBNClose(after.lastBatchCollected, ts, 5); - expect(after.lastCollection).bignumber.eq(after.lastBatchCollected); - expect(after.lastPeriodStart).bignumber.eq(after.lastBatchCollected); - expect(after.periodYield).bignumber.eq(new BN(0)); - expect(after.savingsContractBal).bignumber.eq(new BN(0)); - expect(after.savingsManagerBal).bignumber.eq(collectionAmount); - assertBNClosePercent( - after.yieldStream.rate, - simpleToExactAmount("1.157", 15), - "0.1", - ); - expect(after.yieldStream.end).bignumber.eq(after.lastBatchCollected.add(ONE_DAY)); - assertBNSlightlyGTPercent( - collectionAmount, - after.yieldStream.rate.mul(after.yieldStream.end.sub(after.lastCollection)), - "0.1", - true, - ); - - expectEvent(tx.receipt, "InterestCollected", { - mAsset: mUSD.address, - interest: collectionAmount, - newTotalSupply: simpleToExactAmount(initialSupply, 18).add(collectionAmount), - }); - }); - - it("should coexist with liquidator stream to allow simultaneous streaming", async () => { - // 0 1 2 3 - // | - - - - - - | - - - - - - | - - - - - - | - // ^ ^ ^ ^ ^ ^ ^ - // 0 1 5 11 | 16 | - // 11.5 16.5 - // @time - Action - // @0 - Liquidation is made - // @1 - Stream interest is made - // @5 - Yield collects days 1-5 - // @11 - Stream interest is made - // @11.5- Stream interest is made - // @16 - Yield collects 11.5-12.5 - // @16.5 - Stream interest is made - // @0 - const s = await snapshotData(); - expect(s.liqStream.rate).bignumber.eq(new BN(0)); - expect(s.savingsManagerBal).bignumber.eq(new BN(0)); - await mUSD.approve(savingsManager.address, liquidated1, { from: liquidator }); - await savingsManager.depositLiquidation(mUSD.address, liquidated1, { - from: liquidator, - }); - const s0 = await snapshotData(); - assertBNClosePercent(s0.liqStream.rate, liquidated1.div(ONE_WEEK), "0.001"); - await time.increase(ONE_DAY.muln(1)); - // @1 - await mUSD.setAmountForPlatformInterest(platformInterest1); - await savingsManager.collectAndStreamInterest(mUSD.address); - const s1 = await snapshotData(); - assertBNClosePercent(s1.yieldStream.rate, platformInterest1.div(ONE_DAY), "0.001"); - expect(s1.liqStream.end).bignumber.eq(s0.liqStream.end); - expect(s1.liqStream.rate).bignumber.eq(s0.liqStream.rate); - expect(s1.yieldStream.end).bignumber.eq(s1.lastCollection.add(ONE_DAY)); - expect(s1.lastBatchCollected).bignumber.eq(s1.lastCollection); - await time.increase(ONE_DAY.muln(4)); - // @5 - let expectedInterest = ONE_DAY.muln(4).mul(s1.liqStream.rate); - expectedInterest = expectedInterest.add(ONE_DAY.mul(s1.yieldStream.rate)); - await mUSD.setAmountForCollectInterest(1); - await savingsManager.collectAndDistributeInterest(mUSD.address); - const s5 = await snapshotData(); - assertBNClosePercent( - s5.savingsManagerBal, - s1.savingsManagerBal.sub(expectedInterest), - "0.01", - ); - assertBNClosePercent( - s5.savingsContractBal, - s1.savingsContractBal.add(expectedInterest), - "0.01", - ); - await time.increase(ONE_DAY.muln(6)); - // @t11 - expectedInterest = ONE_DAY.muln(2).mul(s0.liqStream.rate); - await mUSD.setAmountForPlatformInterest(platformInterest2); - await savingsManager.collectAndStreamInterest(mUSD.address); - const s11 = await snapshotData(); - assertBNClosePercent(s11.yieldStream.rate, platformInterest2.div(ONE_DAY), "0.001"); - expect(s11.yieldStream.end).bignumber.eq(s11.lastCollection.add(ONE_DAY)); - expect(s11.lastBatchCollected).bignumber.eq(s11.lastCollection); - assertBNClosePercent( - s11.savingsManagerBal, - s5.savingsManagerBal.sub(expectedInterest).add(platformInterest2), - "0.01", - ); - assertBNClosePercent( - s11.savingsContractBal, - s5.savingsContractBal.add(expectedInterest), - "0.01", - ); - await time.increase(ONE_DAY.divn(2)); - // @11.5 - const leftOverRewards = ONE_DAY.divn(2).mul(s11.yieldStream.rate); - const total = leftOverRewards.add(platformInterest3); - await mUSD.setAmountForPlatformInterest(platformInterest3); - await savingsManager.collectAndStreamInterest(mUSD.address); - const s115 = await snapshotData(); - expect(s115.yieldStream.end).bignumber.eq(s115.lastCollection.add(ONE_DAY)); - assertBNClosePercent(s115.yieldStream.rate, total.div(ONE_DAY), "0.01"); - await time.increase(ONE_DAY.muln(9).divn(2)); - // @16 - expectedInterest = s115.yieldStream.rate.mul(ONE_DAY); - await mUSD.setAmountForCollectInterest(1); - await savingsManager.collectAndDistributeInterest(mUSD.address); - const s16 = await snapshotData(); - assertBNClosePercent( - s16.savingsManagerBal, - s115.savingsManagerBal.sub(expectedInterest), - "0.01", - ); - assertBNClosePercent( - s16.savingsContractBal, - s115.savingsContractBal.add(expectedInterest), - "0.01", - ); - // all mUSD should be drained now - expect(s16.savingsManagerBal).bignumber.lt(simpleToExactAmount(1, 16) as any); - await time.increase(ONE_DAY.divn(2)); - // @16.5 - const ts17 = await time.latest(); - await mUSD.setAmountForPlatformInterest(platformInterest4); - await savingsManager.collectAndStreamInterest(mUSD.address); - const s17 = await snapshotData(); - assertBNClosePercent(s17.yieldStream.rate, platformInterest4.div(ONE_DAY), "0.01"); - assertBNClose(ts17, s17.lastCollection, 10); - }); - }); - context("testing new mechanism", async () => { - // Initial supply of 10m units - const initialSupply = new BN(10000000); - const initialSupplyExact = simpleToExactAmount(initialSupply, 18); - beforeEach(async () => { - await createNewSavingsManager(initialSupply); - }); - it("should work when lastCollection time is 0 with low interest", async () => { - const lastPeriodStart = await savingsManager.lastPeriodStart(mUSD.address); - expect(lastPeriodStart).bignumber.eq(new BN(0)); - const lastCollection = await savingsManager.lastCollection(mUSD.address); - expect(lastCollection).bignumber.eq(new BN(0)); - const lastPeriodYield = await savingsManager.periodYield(mUSD.address); - expect(lastPeriodYield).bignumber.eq(new BN(0)); - - const newInterest = simpleToExactAmount(1000, 18); - // e.g. (1e21*1e18)/1e25 = 1e14 (or 0.01%) - const percentageIncrease = newInterest.mul(fullScale).div(initialSupplyExact); - // e.g. (1e14 * 1e18) / 50e18 = 2e12 - const expectedAPY = percentageIncrease - .mul(fullScale) - .div(simpleToExactAmount(50, 18)); - expect(expectedAPY).bignumber.eq(simpleToExactAmount(2, 12)); - - await mUSD.setAmountForCollectInterest(newInterest); - - const curTime = await time.latest(); - const tx = await savingsManager.collectAndDistributeInterest(mUSD.address); - - expectEvent(tx.receipt, "InterestCollected", { - mAsset: mUSD.address, - interest: newInterest, - newTotalSupply: initialSupplyExact.add(newInterest), - }); - const interectCollectedEvent = tx.logs[0]; - assertBNClose( - interectCollectedEvent.args[3], - expectedAPY, - simpleToExactAmount(5, 11), // allow for a 0.000005% deviation in the percentage - ); - const lastCollectionAfter = await savingsManager.lastCollection(mUSD.address); - assertBNClose(lastCollectionAfter, curTime, new BN(2)); - const lastPeriodStartAfter = await savingsManager.lastPeriodStart(mUSD.address); - expect(lastPeriodStartAfter).bignumber.eq(lastCollectionAfter); - const lastPeriodYieldAfter = await savingsManager.periodYield(mUSD.address); - expect(lastPeriodYieldAfter).bignumber.eq(new BN(0)); - }); - it("should always update the lastCollection time for future", async () => { - const lastCollection = await savingsManager.lastCollection(mUSD.address); - expect(lastCollection).bignumber.eq(new BN(0)); - - const curTime = await time.latest(); - await savingsManager.collectAndDistributeInterest(mUSD.address); - - const lastCollectionMiddle = await savingsManager.lastCollection(mUSD.address); - assertBNClose(lastCollectionMiddle, curTime, new BN(2)); - - const newInterest = simpleToExactAmount(11000, 18); - await mUSD.setAmountForCollectInterest(newInterest); - - await expectRevert( - savingsManager.collectAndDistributeInterest(mUSD.address), - "Interest protected from inflating past 10 Bps", - ); - - await time.increase(THIRTY_MINUTES.addn(1)); - - await expectRevert( - savingsManager.collectAndDistributeInterest(mUSD.address), - "Interest protected from inflating past maxAPY", - ); - - await time.increase(THIRTY_MINUTES.addn(1)); - - const tx = await savingsManager.collectAndDistributeInterest(mUSD.address); - - const endTime = await time.latest(); - const lastCollectionEnd = await savingsManager.lastCollection(mUSD.address); - assertBNClose(lastCollectionEnd, endTime, new BN(2)); - const lastPeriodStartEnd = await savingsManager.lastPeriodStart(mUSD.address); - expect(lastPeriodStartEnd).bignumber.eq(lastCollectionEnd); - const lastPeriodYieldEnd = await savingsManager.periodYield(mUSD.address); - expect(lastPeriodYieldEnd).bignumber.eq(new BN(0)); - - const expectedAPY = simpleToExactAmount("9.636", 18); - - expectEvent(tx.receipt, "InterestCollected", { - mAsset: mUSD.address, - interest: newInterest, - newTotalSupply: initialSupplyExact.add(newInterest), - }); - const interectCollectedEvent = tx.logs[0]; - assertBNClose( - interectCollectedEvent.args[3], - expectedAPY, - simpleToExactAmount(1, 17), // allow for a 10% deviation in the percentage - ); - }); - it("should fail if under 30 minutes and greater than 10bps increase", async () => { - // Pass 1st - const curTime = await time.latest(); - await savingsManager.collectAndDistributeInterest(mUSD.address); - - const lastCollectionMiddle = await savingsManager.lastCollection(mUSD.address); - assertBNClose(lastCollectionMiddle, curTime, new BN(2)); - - // fail with 10bps - const failingInterest = simpleToExactAmount(10100, 18); - await mUSD.setAmountForCollectInterest(failingInterest); - await expectRevert( - savingsManager.collectAndDistributeInterest(mUSD.address), - "Interest protected from inflating past 10 Bps", - ); - // change to 9.99bps - const passingInterest = simpleToExactAmount(9999, 18); - await mUSD.setAmountForCollectInterest(passingInterest); - - const tx = await savingsManager.collectAndDistributeInterest(mUSD.address); - - const endTime = await time.latest(); - const lastCollectionEnd = await savingsManager.lastCollection(mUSD.address); - assertBNClose(lastCollectionEnd, endTime, new BN(2)); - const lastPeriodStartEnd = await savingsManager.lastPeriodStart(mUSD.address); - expect(lastPeriodStartEnd).bignumber.eq(lastCollectionMiddle); - const lastPeriodYieldEnd = await savingsManager.periodYield(mUSD.address); - expect(lastPeriodYieldEnd).bignumber.eq(passingInterest); - - expectEvent(tx.receipt, "InterestCollected", { - mAsset: mUSD.address, - interest: passingInterest, - newTotalSupply: initialSupplyExact.add(passingInterest), - }); - }); - it("should pass if 1 block and 9.99bps increase", async () => { - // Pass 1st - const curTime = await time.latest(); - await savingsManager.collectAndDistributeInterest(mUSD.address); - - const lastCollectionBefore = await savingsManager.lastCollection(mUSD.address); - assertBNClose(lastCollectionBefore, curTime, new BN(2)); - - // update ONE SECOND - const passingInterest = simpleToExactAmount(9999, 18); - await mUSD.setAmountForCollectInterest(passingInterest); - - const tx = await savingsManager.collectAndDistributeInterest(mUSD.address); - - const lastCollectionAfter = await savingsManager.lastCollection(mUSD.address); - - const timeDifferential = lastCollectionAfter.sub(lastCollectionBefore); - const expectedApy = new BN("31532846400760319992415").div( - timeDifferential.eqn(0) ? new BN(1) : timeDifferential, - ); - - expectEvent(tx.receipt, "InterestCollected", { - mAsset: mUSD.address, - interest: passingInterest, - newTotalSupply: initialSupplyExact.add(passingInterest), - }); - - const interectCollectedEvent = tx.logs[0]; - assertBNClose( - interectCollectedEvent.args[3], - expectedApy, - simpleToExactAmount(1, 14), // allow for minor deviation in calc - ); - - // it should fail if it goes over 9.99bps in the period - - const failingInterest = simpleToExactAmount(10, 18); - await mUSD.setAmountForCollectInterest(failingInterest); - - await expectRevert( - savingsManager.collectAndDistributeInterest(mUSD.address), - "Interest protected from inflating past 10 Bps", - ); - }); - it("should pass if over 30 minutes and less than 15e18", async () => { - // Pass 1st - await savingsManager.collectAndDistributeInterest(mUSD.address); - - // update 30 mins - await time.increase(THIRTY_MINUTES.addn(1)); - // fail on 16e18 - const failingInterest = simpleToExactAmount(8700, 18); - await mUSD.setAmountForCollectInterest(failingInterest); - await expectRevert( - savingsManager.collectAndDistributeInterest(mUSD.address), - "Interest protected from inflating past maxAPY", - ); - // update 30 mins - await time.increase(THIRTY_MINUTES.addn(1)); - // pass - await savingsManager.collectAndDistributeInterest(mUSD.address); - - // update 10 mins - // add 5bps - const passingInterest = simpleToExactAmount(5000, 18); - await mUSD.setAmountForCollectInterest(passingInterest); - - // pass - await savingsManager.collectAndDistributeInterest(mUSD.address); - }); - - it("should updated period information correctly across sequence", async () => { - // 0 30 60 90 120 - // | - - - - | - - - - | - - - - | - - - - | - // ^ ^ ^ ^ ^ ^ - // start 40 50 65 80 120 - // @time - Description (periodStart, lastCollection, periodYield) - // @40 - Should start new period (40, 40, 0) - // @50 - Should calc in period 40-70 (40, 50, X) - // @65 - Should calc in period 40-70 (40, 65, X+Y) - // @80 - Should start new period from last collection, 65-95 (65, 80, Z) - // @120 - Should start new period (120, 120, 0) - - // @0 - const lastCollection_0 = await savingsManager.lastCollection(mUSD.address); - expect(lastCollection_0).bignumber.eq(new BN(0)); - const lastPeriodStart_0 = await savingsManager.lastPeriodStart(mUSD.address); - expect(lastPeriodStart_0).bignumber.eq(new BN(0)); - const periodYield_0 = await savingsManager.periodYield(mUSD.address); - expect(periodYield_0).bignumber.eq(new BN(0)); - - // @40 - await time.increase(ONE_MIN.muln(40)); - let curTime = await time.latest(); - const interest_40 = simpleToExactAmount(1000, 18); - await mUSD.setAmountForCollectInterest(interest_40); - await savingsManager.collectAndDistributeInterest(mUSD.address); - const lastCollection_40 = await savingsManager.lastCollection(mUSD.address); - assertBNClose(lastCollection_40, curTime, 3); - const lastPeriodStart_40 = await savingsManager.lastPeriodStart(mUSD.address); - expect(lastPeriodStart_40).bignumber.eq(lastCollection_40); - const periodYield_40 = await savingsManager.periodYield(mUSD.address); - expect(periodYield_40).bignumber.eq(new BN(0)); - - // @50 - await time.increase(ONE_MIN.muln(10)); - curTime = await time.latest(); - const interest_50 = simpleToExactAmount(900, 18); - await mUSD.setAmountForCollectInterest(interest_50); - await savingsManager.collectAndDistributeInterest(mUSD.address); - const lastCollection_50 = await savingsManager.lastCollection(mUSD.address); - assertBNClose(lastCollection_50, curTime, 3); - const lastPeriodStart_50 = await savingsManager.lastPeriodStart(mUSD.address); - expect(lastPeriodStart_50).bignumber.eq(lastCollection_40); - const periodYield_50 = await savingsManager.periodYield(mUSD.address); - expect(periodYield_50).bignumber.eq(interest_50); - - // @65 - await time.increase(ONE_MIN.muln(15)); - curTime = await time.latest(); - const interest_65 = simpleToExactAmount(800, 18); - await mUSD.setAmountForCollectInterest(interest_65); - await savingsManager.collectAndDistributeInterest(mUSD.address); - const lastCollection_65 = await savingsManager.lastCollection(mUSD.address); - assertBNClose(lastCollection_65, curTime, 3); - const lastPeriodStart_65 = await savingsManager.lastPeriodStart(mUSD.address); - expect(lastPeriodStart_65).bignumber.eq(lastCollection_40); - const periodYield_65 = await savingsManager.periodYield(mUSD.address); - expect(periodYield_65).bignumber.eq(interest_65.add(interest_50)); - - // @80 - await time.increase(ONE_MIN.muln(15)); - curTime = await time.latest(); - const interest_80 = simpleToExactAmount(700, 18); - await mUSD.setAmountForCollectInterest(interest_80); - await savingsManager.collectAndDistributeInterest(mUSD.address); - const lastCollection_80 = await savingsManager.lastCollection(mUSD.address); - assertBNClose(lastCollection_80, curTime, 3); - const lastPeriodStart_80 = await savingsManager.lastPeriodStart(mUSD.address); - expect(lastPeriodStart_80).bignumber.eq(lastCollection_65); - const periodYield_80 = await savingsManager.periodYield(mUSD.address); - expect(periodYield_80).bignumber.eq(interest_80); - - // @120 - await time.increase(ONE_MIN.muln(40)); - curTime = await time.latest(); - const interest_120 = simpleToExactAmount(600, 18); - await mUSD.setAmountForCollectInterest(interest_120); - await savingsManager.collectAndDistributeInterest(mUSD.address); - const lastCollection_120 = await savingsManager.lastCollection(mUSD.address); - assertBNClose(lastCollection_120, curTime, 3); - const lastPeriodStart_120 = await savingsManager.lastPeriodStart(mUSD.address); - expect(lastPeriodStart_120).bignumber.eq(lastCollection_120); - const periodYield_120 = await savingsManager.periodYield(mUSD.address); - expect(periodYield_120).bignumber.eq(new BN(0)); - }); - }); - context("when there is some interest to collect", async () => { - before(async () => { - await createNewSavingsManager(); - }); - it("should collect the interest first time", async () => { - // Refresh the collection timer - await savingsManager.collectAndDistributeInterest(mUSD.address); - - // Total supply is 1.2 million - // For 7.3% APY following is the calculation - // 1.2million * 7.3% = 87600 Yearly - // 87600 / 365 = 240 per day - // 240 / 24 = 10 per hour - // 10 / 2 = 5 per half hour - const balanceBefore = await mUSD.balanceOf(savingsContract.address); - expect(ZERO).to.bignumber.equal(balanceBefore); - - const newInterest = FIVE_TOKENS; - await mUSD.setAmountForCollectInterest(newInterest); - - // should move 30 mins in future - await time.increase(THIRTY_MINUTES); - const tx = await savingsManager.collectAndDistributeInterest(mUSD.address); - - const expectedTotalSupply = INITIAL_MINT.mul(fullScale).add(FIVE_TOKENS); - // expectedAPY = 7.3% - const expectedAPY = simpleToExactAmount("7.3", 16); - expectEvent(tx.receipt, "InterestCollected", { - mAsset: mUSD.address, - interest: FIVE_TOKENS, - newTotalSupply: expectedTotalSupply, - }); - const interectCollectedEvent = tx.logs[0]; - assertBNClose( - interectCollectedEvent.args[3], - expectedAPY, - simpleToExactAmount(2, 14), // allow for a 0.02% deviation in the percentage - ); - - const balanceAfter = await mUSD.balanceOf(savingsContract.address); - expect(newInterest).to.bignumber.equal(balanceAfter); - }); - - it("should throw if the APY is too high", async () => { - // Refresh the collection timer - await savingsManager.collectAndDistributeInterest(mUSD.address); - // >= 1500 APY with a 1.2m cap is equal to - // 49315 tokens per day (~4) - const balanceBefore = await mUSD.balanceOf(savingsContract.address); - expect(ZERO).to.bignumber.equal(balanceBefore); - const newInterest = new BN(49500).mul(fullScale); - await mUSD.setAmountForCollectInterest(newInterest); - // should move 1 day in future - await time.increase(ONE_DAY); - await expectRevert( - savingsManager.collectAndDistributeInterest(mUSD.address), - "Interest protected from inflating past maxAPY", - ); - await time.increase(THIRTY_MINUTES.mul(new BN(10))); - await savingsManager.collectAndDistributeInterest(mUSD.address); - const balanceAfter = await mUSD.balanceOf(savingsContract.address); - expect(newInterest).to.bignumber.equal(balanceAfter); - }); - - it("should allow interest collection before 30 mins", async () => { - await savingsManager.collectAndDistributeInterest(mUSD.address); - const tx = await savingsManager.collectAndDistributeInterest(mUSD.address); - expectEvent(tx.receipt, "InterestCollected", { - interest: new BN(0), - apy: new BN(0), - }); - }); - - it("should allow interest collection again after 30 mins", async () => { - await time.increase(THIRTY_MINUTES); - const tx = await savingsManager.collectAndDistributeInterest(mUSD.address); - expectEvent(tx.receipt, "InterestCollected", { - mAsset: mUSD.address, - interest: new BN(0), - newTotalSupply: INITIAL_MINT.mul(fullScale), - apy: new BN(0), - }); - }); - }); - }); - - describe("distributing unallocated Interest", async () => { - it("should fail when not called by governor", async () => { - await expectRevert( - savingsManager.distributeUnallocatedInterest(mUSD.address, { - from: sa.other, - }), - "Only governance can execute", - ); - }); - it("should fail without a valid recipient", async () => { - await expectRevert( - savingsManager.distributeUnallocatedInterest(mUSD.address, { - from: sa.governor, - }), - "Must have valid recipient", - ); - }); - - it("calls the distribute function on a valid recipient", async () => { - const balanceBefore = await mUSD.balanceOf(sa.other); - expect(ZERO).to.bignumber.equal(balanceBefore); - - // Send some mUSD to SavingsManager - const amount = new BN(1000); - await mUSD.transfer(savingsManager.address, amount, { from: sa.default }); - - const recipient = await MockRevenueRecipient.new(); - await savingsManager.setRevenueRecipient(mUSD.address, recipient.address, { - from: sa.governor, - }); - const tx = await savingsManager.distributeUnallocatedInterest(mUSD.address, { - from: sa.governor, - }); - - const balanceAfter = await mUSD.balanceOf(recipient.address); - expect(amount).to.bignumber.equal(balanceAfter); - - expectEvent(tx.receipt, "RevenueRedistributed", { - mAsset: mUSD.address, - recipient: recipient.address, - amount, - }); - }); - - it("calculates the unallocated interest correctly and calls the recipient", async () => { - const recipient = await MockRevenueRecipient.new(); - await savingsManager.setRevenueRecipient(mUSD.address, recipient.address, { - from: sa.governor, - }); - const liquidationAmount = simpleToExactAmount(1000, 18); - const swapFeesAmount = simpleToExactAmount(50, 18); - // Set rate to 80% - await savingsManager.setSavingsRate(simpleToExactAmount(8, 17), { from: sa.governor }); - // Create a liquidation - await mUSD.approve(savingsManager.address, liquidationAmount, { from: liquidator }); - await savingsManager.depositLiquidation(mUSD.address, liquidationAmount, { - from: liquidator, - }); - // Zoom forward 3 days - await time.increase(ONE_DAY.muln(3)); - // Set interest for collection - await mUSD.setAmountForCollectInterest(swapFeesAmount); - // Deposit to SAVE - await savingsManager.collectAndDistributeInterest(mUSD.address); - // Redistribution should net (interest + 3/7 of liquidation) * 0.2 - const expectedRedistribution = liquidationAmount - .muln(3) - .divn(7) - .add(swapFeesAmount) - .muln(2) - .divn(10); - - await savingsManager.distributeUnallocatedInterest(mUSD.address, { - from: sa.governor, - }); - const balance00 = await mUSD.balanceOf(recipient.address); - assertBNClosePercent(expectedRedistribution, balance00, "0.01"); - // Zoom forward 1 days - await time.increase(ONE_DAY); - // Redistribution should net 0 - await savingsManager.distributeUnallocatedInterest(mUSD.address, { - from: sa.governor, - }); - const balance01 = await mUSD.balanceOf(recipient.address); - expect(balance01).bignumber.eq(balance00); - }); - }); - - describe("extra tests:", async () => { - let recipient; - beforeEach(async () => { - await createNewSavingsManager(); - - recipient = await MockRevenueRecipient.new(); - await savingsManager.setRevenueRecipient(mUSD.address, recipient.address, { - from: sa.governor, - }); - }); - - it("should collect when 0% unallocated interest", async () => { - const newInterest = FIVE_TOKENS; - await mUSD.setAmountForCollectInterest(newInterest); - - let savingsManagerBalance = await mUSD.balanceOf(savingsManager.address); - expect(ZERO).to.bignumber.equal(savingsManagerBalance); - - await savingsManager.collectAndDistributeInterest(mUSD.address); - - const balanceAfter = await mUSD.balanceOf(savingsContract.address); - expect(newInterest).to.bignumber.equal(balanceAfter); - - savingsManagerBalance = await mUSD.balanceOf(savingsManager.address); - expect(ZERO).to.bignumber.equal(savingsManagerBalance); - }); - - it("should collect 10% unallocated interest when rate changed", async () => { - // Set savings rate to 90% - const NINTY_PERCENT = new BN(9).mul(new BN(10).pow(new BN(17))).add(new BN(1)); - // 5 * 90% = 4.5 tokens - // const nintyPercentToken = new BN(45).mul(new BN(10).pow(new BN(16))); - const nintyPercentToken = FIVE_TOKENS.mul(NINTY_PERCENT).div(fullScale); - await savingsManager.setSavingsRate(NINTY_PERCENT, { from: sa.governor }); - - await mUSD.setAmountForCollectInterest(FIVE_TOKENS); - - let savingsManagerBalance = await mUSD.balanceOf(savingsManager.address); - expect(ZERO).to.bignumber.equal(savingsManagerBalance); - - await savingsManager.collectAndDistributeInterest(mUSD.address); - - const balanceAfter = await mUSD.balanceOf(savingsContract.address); - expect(nintyPercentToken).to.bignumber.equal(balanceAfter); - - // expect 10% balance left at SavingsManager - savingsManagerBalance = await mUSD.balanceOf(savingsManager.address); - const expectedTenPercentTokens = FIVE_TOKENS.sub(nintyPercentToken); - expect(expectedTenPercentTokens).to.bignumber.equal(savingsManagerBalance); - - await savingsManager.distributeUnallocatedInterest(mUSD.address, { - from: sa.governor, - }); - - const balanceOfRecipient = await mUSD.balanceOf(recipient.address); - expect(expectedTenPercentTokens).to.bignumber.equal(balanceOfRecipient); - }); - - it("should collect 5% unallocated interest when rate changed", async () => { - // Set savings rate to 95% - const NINTY_FIVE_PERCENT = new BN(95).mul(new BN(10).pow(new BN(16))); - // 5 * 95% = 4.75 tokens - const nintyFivePercentToken = FIVE_TOKENS.mul(NINTY_FIVE_PERCENT).div(fullScale); - await savingsManager.setSavingsRate(NINTY_FIVE_PERCENT, { from: sa.governor }); - - await mUSD.setAmountForCollectInterest(FIVE_TOKENS); - - let savingsManagerBalance = await mUSD.balanceOf(savingsManager.address); - expect(ZERO).to.bignumber.equal(savingsManagerBalance); - - await savingsManager.collectAndDistributeInterest(mUSD.address); - - const balanceAfter = await mUSD.balanceOf(savingsContract.address); - expect(nintyFivePercentToken).to.bignumber.equal(balanceAfter); - - // expect 5% balance left at SavingsManager - savingsManagerBalance = await mUSD.balanceOf(savingsManager.address); - const expectedFivePercentTokens = FIVE_TOKENS.sub(nintyFivePercentToken); - expect(expectedFivePercentTokens).to.bignumber.equal(savingsManagerBalance); - - await savingsManager.distributeUnallocatedInterest(mUSD.address, { - from: sa.governor, - }); - - const balanceOfRecipient = await mUSD.balanceOf(recipient.address); - expect(expectedFivePercentTokens).to.bignumber.equal(balanceOfRecipient); - }); - }); -}); diff --git a/test/savings/savings-contract.spec.ts b/test/savings/savings-contract.spec.ts new file mode 100644 index 00000000..438381e8 --- /dev/null +++ b/test/savings/savings-contract.spec.ts @@ -0,0 +1,1264 @@ +import { ethers } from "hardhat" +import { expect } from "chai" +import { simpleToExactAmount, BN } from "@utils/math" +import { assertBNClose, assertBNClosePercent } from "@utils/assertions" +import { StandardAccounts, MassetDetails, MassetMachine, Account } from "@utils/machines" +import { fullScale, ZERO_ADDRESS, ZERO, MAX_UINT256, ONE_DAY, ONE_HOUR } from "@utils/constants" +import { + SavingsContract, + MockERC20__factory, + MockConnector__factory, + MockNexus__factory, + MockNexus, + MockMasset, + MockMasset__factory, + SavingsContract__factory, + MockSavingsManager__factory, + AssetProxy__factory, + MockErroneousConnector1__factory, + MockErroneousConnector2__factory, + MockLendingConnector__factory, + MockVaultConnector__factory, + MockLendingConnector, + MockVaultConnector, +} from "types/generated" +import { shouldBehaveLikeModule, IModuleBehaviourContext } from "../shared/Module.behaviour" + +interface Balances { + totalCredits: BN + userCredits: BN + user: BN + contract: BN +} + +interface ConnectorData { + lastPoke: BN + lastBalance: BN + fraction: BN + address: string + balance: BN +} + +interface Data { + balances: Balances + exchangeRate: BN + connector: ConnectorData +} + +interface ExpectedPoke { + aboveMax: boolean + type: "deposit" | "withdraw" | "none" + amount: BN + ideal: BN +} + +const underlyingToCredits = (amount: BN | number, exchangeRate: BN): BN => BN.from(amount).mul(fullScale).div(exchangeRate).add(1) + +const creditsToUnderlying = (amount: BN, exchangeRate: BN): BN => amount.mul(exchangeRate).div(fullScale) + +const getData = async (contract: SavingsContract, user: Account): Promise => { + const mAsset = await (await new MockERC20__factory(user.signer)).attach(await contract.underlying()) + const connectorAddress = await contract.connector() + let connectorBalance = BN.from(0) + if (connectorAddress !== ZERO_ADDRESS) { + const connector = await (await new MockConnector__factory(user.signer)).attach(connectorAddress) + connectorBalance = await connector.checkBalance() + } + return { + balances: { + totalCredits: await contract.totalSupply(), + userCredits: await contract.balanceOf(user.address), + user: await mAsset.balanceOf(user.address), + contract: await mAsset.balanceOf(contract.address), + }, + exchangeRate: await contract.exchangeRate(), + connector: { + lastPoke: await contract.lastPoke(), + lastBalance: await contract.lastBalance(), + fraction: await contract.fraction(), + address: connectorAddress, + balance: connectorBalance, + }, + } +} + +const getExpectedPoke = (data: Data, withdrawCredits: BN = BN.from(0)): ExpectedPoke => { + const { balances, connector, exchangeRate } = data + const totalCollat = creditsToUnderlying(balances.totalCredits.sub(withdrawCredits), exchangeRate) + const connectorDerived = balances.contract.gt(totalCollat) ? BN.from(0) : totalCollat.sub(balances.contract) + const max = totalCollat.mul(connector.fraction.add(simpleToExactAmount(2, 17))).div(fullScale) + const ideal = totalCollat.mul(connector.fraction).div(fullScale) + return { + aboveMax: connectorDerived.gt(max), + type: connector.balance.eq(ideal) ? "none" : connector.balance.gt(ideal) ? "withdraw" : "deposit", + amount: connector.balance.gte(ideal) ? connector.balance.sub(ideal) : ideal.sub(connector.balance), + ideal, + } +} + +const getTimestamp = async (): Promise => (await ethers.provider.getBlock(await ethers.provider.getBlockNumber())).timestamp + +/** + * @notice Returns bool to signify whether the total collateral held is redeemable + */ +const exchangeRateHolds = (data: Data): boolean => { + const { balances, connector, exchangeRate } = data + const collateral = balances.contract.add(connector.balance) + return collateral.gte(creditsToUnderlying(balances.totalCredits, exchangeRate)) +} + +describe("SavingsContract", async () => { + let sa: StandardAccounts + let manager: Account + let alice: Account + let bob: Account + const ctx: Partial = {} + const initialExchangeRate = simpleToExactAmount(1, 17) + + let mAssetMachine: MassetMachine + + let savingsContract: SavingsContract + let savingsFactory: SavingsContract__factory + let connectorFactory: MockConnector__factory + let nexus: MockNexus + let masset: MockMasset + + const createNewSavingsContract = async (): Promise => { + // Use a mock Nexus so we can dictate addresses + nexus = await (await new MockNexus__factory(sa.default.signer)).deploy(sa.governor.address, manager.address) + // Use a mock mAsset so we can dictate the interest generated + masset = await (await new MockMasset__factory(sa.default.signer)).deploy("MOCK", "MOCK", 18, sa.default.address, 1000000000) + + savingsFactory = await new SavingsContract__factory(sa.default.signer) + const impl = await savingsFactory.deploy(nexus.address, masset.address) + const data = impl.interface.encodeFunctionData("initialize", [sa.default.address, "Savings Credit", "imUSD"]) + const proxy = await (await new AssetProxy__factory(sa.default.signer)).deploy(impl.address, sa.dummy4.address, data) + savingsContract = await savingsFactory.attach(proxy.address) + + // Use a mock SavingsManager so we don't need to run integrations + const mockSavingsManager = await (await new MockSavingsManager__factory(sa.default.signer)).deploy(savingsContract.address) + await nexus.setSavingsManager(mockSavingsManager.address) + } + + before(async () => { + const accounts = await ethers.getSigners() + mAssetMachine = await new MassetMachine().initAccounts(accounts) + sa = mAssetMachine.sa + manager = sa.dummy2 + alice = sa.default + bob = sa.dummy3 + connectorFactory = await new MockConnector__factory(sa.default.signer) + await createNewSavingsContract() + }) + + describe("behaviors", async () => { + describe("behave like a Module", async () => { + beforeEach(async () => { + await createNewSavingsContract() + ctx.module = savingsContract + ctx.sa = sa + }) + shouldBehaveLikeModule(ctx as IModuleBehaviourContext) + }) + }) + + describe("constructor", async () => { + it("should fail when masset address is zero", async () => { + await expect(savingsFactory.deploy(nexus.address, ZERO_ADDRESS)).to.be.revertedWith("mAsset address is zero") + + savingsContract = await savingsFactory.deploy(nexus.address, masset.address) + await expect(savingsContract.initialize(ZERO_ADDRESS, "Savings Credit", "imUSD")).to.be.revertedWith("Invalid poker address") + }) + + it("should succeed and set valid parameters", async () => { + await createNewSavingsContract() + const nexusAddr = await savingsContract.nexus() + expect(nexus.address).to.equal(nexusAddr) + const pokerAddr = await savingsContract.poker() + expect(sa.default.address).to.equal(pokerAddr) + const { balances, exchangeRate, connector } = await getData(savingsContract, sa.default) + expect(simpleToExactAmount(2, 17)).to.equal(connector.fraction) + const underlyingAddr = await savingsContract.underlying() + expect(masset.address).to.equal(underlyingAddr) + expect(ZERO).to.equal(balances.totalCredits) + expect(ZERO).to.equal(balances.contract) + expect(initialExchangeRate).to.equal(exchangeRate) + const name = await savingsContract.name() + expect("Savings Credit").to.equal(name) + }) + }) + + describe("setting automateInterestCollection Flag", async () => { + it("should fail when not called by governor", async () => { + await expect(savingsContract.connect(sa.default.signer).automateInterestCollectionFlag(true)).to.be.revertedWith( + "Only governor can execute", + ) + }) + it("should enable interest collection", async () => { + const tx = savingsContract.connect(sa.governor.signer).automateInterestCollectionFlag(true) + + await expect(tx).to.emit(savingsContract, "AutomaticInterestCollectionSwitched").withArgs(true) + }) + it("should disable interest collection", async () => { + const tx = savingsContract.connect(sa.governor.signer).automateInterestCollectionFlag(false) + await expect(tx).to.emit(savingsContract, "AutomaticInterestCollectionSwitched").withArgs(false) + }) + }) + + describe("depositing interest", async () => { + let savingsManagerAccount: Account + beforeEach(async () => { + savingsManagerAccount = sa.dummy3 + await createNewSavingsContract() + await nexus.setSavingsManager(savingsManagerAccount.address) + await masset.transfer(savingsManagerAccount.address, simpleToExactAmount(20, 18)) + await masset.connect(savingsManagerAccount.signer).approve(savingsContract.address, simpleToExactAmount(20, 18)) + }) + afterEach(async () => { + const data = await getData(savingsContract, alice) + expect(exchangeRateHolds(data), "Exchange rate must hold") + }) + it("should fail when not called by savings manager", async () => { + await expect(savingsContract.connect(sa.other.signer).depositInterest(1)).to.be.revertedWith("Only savings manager can execute") + }) + it("should fail when amount is zero", async () => { + await expect(savingsContract.connect(savingsManagerAccount.signer).depositInterest(ZERO)).to.be.revertedWith( + "Must deposit something", + ) + }) + it("should deposit interest when no credits", async () => { + const before = await getData(savingsContract, sa.default) + const deposit = simpleToExactAmount(1, 18) + await savingsContract.connect(savingsManagerAccount.signer).depositInterest(deposit) + + const after = await getData(savingsContract, sa.default) + expect(deposit).to.equal(after.balances.contract) + expect(before.balances.contract.add(deposit)).to.equal(after.balances.contract) + // exchangeRate should not change + expect(before.exchangeRate).to.equal(after.exchangeRate) + }) + it("should deposit interest when some credits exist", async () => { + const interest = simpleToExactAmount(20, 18) + const deposit = simpleToExactAmount(10, 18) + + // Deposit to SavingsContract + await masset.approve(savingsContract.address, deposit) + await savingsContract.preDeposit(deposit, sa.default.address) + + const balanceBefore = await masset.balanceOf(savingsContract.address) + + // Deposit Interest + const tx = savingsContract.connect(savingsManagerAccount.signer).depositInterest(interest) + // Expected rate = 1e17 + (20e18 / (100e18+1)) + // Expected rate = 1e17 + 2e17-1 + const expectedExchangeRate = simpleToExactAmount(3, 17) + await expect(tx).to.emit(savingsContract, "ExchangeRateUpdated").withArgs(expectedExchangeRate, interest) + // await tx.wait() + const dataAfter = await getData(savingsContract, sa.default) + + expect(balanceBefore.add(interest)).to.equal(dataAfter.balances.contract) + expect(expectedExchangeRate).to.equal(dataAfter.exchangeRate) + }) + }) + + describe("depositing savings", async () => { + context("using preDeposit", async () => { + before(async () => { + await createNewSavingsContract() + await masset.approve(savingsContract.address, simpleToExactAmount(1, 21)) + // This amount should not be collected + await masset.setAmountForCollectInterest(simpleToExactAmount(100, 18)) + }) + afterEach(async () => { + const data = await getData(savingsContract, alice) + expect(exchangeRateHolds(data), "Exchange rate must hold") + }) + it("should not collect interest or affect the exchangeRate", async () => { + const dataBefore = await getData(savingsContract, sa.default) + const deposit = simpleToExactAmount(10, 18) + const tx = savingsContract.preDeposit(deposit, sa.default.address) + await expect(tx) + .to.emit(savingsContract, "SavingsDeposited") + .withArgs(sa.default.address, deposit, underlyingToCredits(deposit, dataBefore.exchangeRate)) + const dataAfter = await getData(savingsContract, sa.default) + expect(dataAfter.exchangeRate).eq(initialExchangeRate) + expect(dataAfter.balances.totalCredits).eq(underlyingToCredits(deposit, dataBefore.exchangeRate)) + // Should only receive the deposited, and not collect from the manager + expect(dataAfter.balances.contract).eq(deposit) + }) + it("allows multiple preDeposits", async () => { + await savingsContract.preDeposit(simpleToExactAmount(1, 18), sa.default.address) + await savingsContract.preDeposit(simpleToExactAmount(1, 18), sa.default.address) + await savingsContract.preDeposit(simpleToExactAmount(1, 18), sa.default.address) + await savingsContract.preDeposit(simpleToExactAmount(1, 18), sa.default.address) + }) + it("should fail after exchange rate updates", async () => { + // 1. Now there is more collateral than credits + await savingsContract["depositSavings(uint256)"](simpleToExactAmount(1, 18)) + await savingsContract.poke() + const exchangeRate = await savingsContract.exchangeRate() + expect(exchangeRate).gt(initialExchangeRate) + // 2. preDeposit should no longer work + await expect(savingsContract.preDeposit(BN.from(1), sa.default.address)).to.be.revertedWith( + "Can only use this method before streaming begins", + ) + }) + }) + + context("using depositSavings", async () => { + before(async () => { + await createNewSavingsContract() + }) + afterEach(async () => { + const data = await getData(savingsContract, alice) + expect(exchangeRateHolds(data), "Exchange rate must hold") + }) + it("should fail when amount is zero", async () => { + await expect(savingsContract["depositSavings(uint256)"](ZERO)).to.be.revertedWith("Must deposit something") + }) + it("should fail when beneficiary is 0", async () => { + await expect(savingsContract["depositSavings(uint256,address)"](1, ZERO_ADDRESS)).to.be.revertedWith( + "Invalid beneficiary address", + ) + }) + it("should fail if the user has no balance", async () => { + // Approve first + await masset.connect(sa.dummy1.signer).approve(savingsContract.address, simpleToExactAmount(1, 18)) + + // Deposit + await expect( + savingsContract.connect(sa.dummy1.signer)["depositSavings(uint256)"](simpleToExactAmount(1, 18)), + ).to.be.revertedWith("VM Exception") + }) + it("should deposit the mUSD and assign credits to the saver", async () => { + const dataBefore = await getData(savingsContract, sa.default) + const depositAmount = simpleToExactAmount(1, 18) + + // 1. Approve the savings contract to spend mUSD + await masset.approve(savingsContract.address, depositAmount) + // 2. Deposit the mUSD + const tx = savingsContract["depositSavings(uint256)"](depositAmount) + const expectedCredits = underlyingToCredits(depositAmount, initialExchangeRate) + await expect(tx).to.emit(savingsContract, "SavingsDeposited").withArgs(sa.default.address, depositAmount, expectedCredits) + + const dataAfter = await getData(savingsContract, sa.default) + expect(dataAfter.balances.userCredits).eq(expectedCredits, "Must receive some savings credits") + expect(dataAfter.balances.totalCredits).eq(expectedCredits) + expect(dataAfter.balances.user).eq(dataBefore.balances.user.sub(depositAmount)) + expect(dataAfter.balances.contract).eq(simpleToExactAmount(1, 18)) + }) + it("allows alice to deposit to beneficiary (bob.address)", async () => { + const dataBefore = await getData(savingsContract, bob) + const depositAmount = simpleToExactAmount(1, 18) + + await masset.approve(savingsContract.address, depositAmount) + + const tx = savingsContract.connect(alice.signer)["depositSavings(uint256,address)"](depositAmount, bob.address) + const expectedCredits = underlyingToCredits(depositAmount, initialExchangeRate) + await expect(tx).to.emit(savingsContract, "SavingsDeposited").withArgs(bob.address, depositAmount, expectedCredits) + const dataAfter = await getData(savingsContract, bob) + expect(dataAfter.balances.userCredits).eq(expectedCredits, "Must receive some savings credits") + expect(dataAfter.balances.totalCredits).eq(expectedCredits.mul(2)) + expect(dataAfter.balances.user).eq(dataBefore.balances.user) + expect(dataAfter.balances.contract).eq(dataBefore.balances.contract.add(simpleToExactAmount(1, 18))) + }) + + context("when there is some interest to collect from the manager", async () => { + const deposit = simpleToExactAmount(10, 18) + const interest = simpleToExactAmount(10, 18) + before(async () => { + await createNewSavingsContract() + await masset.approve(savingsContract.address, deposit) + }) + afterEach(async () => { + const data = await getData(savingsContract, alice) + expect(exchangeRateHolds(data), "Exchange rate must hold") + }) + it("should collect the interest and update the exchange rate before issuance", async () => { + // Get the total balances + const stateBefore = await getData(savingsContract, alice) + expect(stateBefore.exchangeRate).to.equal(initialExchangeRate) + + // Deposit first to get some savings in the basket + await savingsContract["depositSavings(uint256)"](deposit) + + const stateMiddle = await getData(savingsContract, alice) + expect(stateMiddle.exchangeRate).to.equal(initialExchangeRate) + expect(stateMiddle.balances.contract).to.equal(deposit) + expect(stateMiddle.balances.totalCredits).to.equal(underlyingToCredits(deposit, initialExchangeRate)) + + // Set up the mAsset with some interest + await masset.setAmountForCollectInterest(interest) + + await ethers.provider.send("evm_increaseTime", [ONE_DAY.toNumber()]) + await ethers.provider.send("evm_mine", []) + + // Bob deposits into the contract + await masset.transfer(bob.address, deposit) + await masset.connect(bob.signer).approve(savingsContract.address, deposit) + const tx = savingsContract.connect(bob.signer)["depositSavings(uint256)"](deposit) + // Bob collects interest, to the benefit of Alice + // Expected rate = 1e17 + 1e17-1 + const expectedExchangeRate = simpleToExactAmount(2, 17) + await expect(tx).to.emit(savingsContract, "ExchangeRateUpdated").withArgs(expectedExchangeRate, interest) + + // Alice gets the benefit of the new exchange rate + const stateEnd = await getData(savingsContract, alice) + expect(stateEnd.exchangeRate).eq(expectedExchangeRate) + expect(stateEnd.balances.contract).eq(deposit.mul(3)) + const aliceBalance = await savingsContract.balanceOfUnderlying(alice.address) + expect(simpleToExactAmount(20, 18)).eq(aliceBalance) + + // Bob gets credits at the NEW exchange rate + const bobData = await getData(savingsContract, bob) + expect(bobData.balances.userCredits).eq(underlyingToCredits(deposit, stateEnd.exchangeRate)) + expect(stateEnd.balances.totalCredits).eq(bobData.balances.userCredits.add(stateEnd.balances.userCredits)) + const bobBalance = await savingsContract.balanceOfUnderlying(bob.address) + expect(bobBalance).eq(deposit) + expect(bobBalance.add(aliceBalance)).eq(deposit.mul(3), "Individual balances cannot exceed total") + + expect(exchangeRateHolds(stateEnd), "Exchange rate must hold") + }) + }) + }) + }) + describe("checking the view methods", () => { + const aliceCredits = simpleToExactAmount(100, 18).add(1) + const aliceUnderlying = simpleToExactAmount(20, 18) + const bobCredits = simpleToExactAmount(50, 18).add(1) + const bobUnderlying = simpleToExactAmount(10, 18) + let data: Data + before(async () => { + await createNewSavingsContract() + await masset.approve(savingsContract.address, simpleToExactAmount(1, 21)) + await savingsContract.preDeposit(simpleToExactAmount(10, 18), alice.address) + await masset.setAmountForCollectInterest(simpleToExactAmount(10, 18)) + await savingsContract["depositSavings(uint256,address)"](simpleToExactAmount(10, 18), bob.address) + data = await getData(savingsContract, alice) + const bobData = await getData(savingsContract, bob) + expect(data.balances.userCredits).eq(aliceCredits) + expect(creditsToUnderlying(aliceCredits, data.exchangeRate)).eq(aliceUnderlying) + expect(bobData.balances.userCredits).eq(bobCredits) + expect(creditsToUnderlying(bobCredits, bobData.exchangeRate)).eq(bobUnderlying) + }) + it("should return correct balances as local checks", async () => { + const aliceBoU = await savingsContract.balanceOfUnderlying(alice.address) + expect(aliceBoU).eq(aliceUnderlying) + const bobBoU = await savingsContract.balanceOfUnderlying(bob.address) + expect(bobBoU).eq(bobUnderlying) + const otherBoU = await savingsContract.balanceOfUnderlying(sa.other.address) + expect(otherBoU).eq(BN.from(0)) + }) + it("should return same result in balanceOfUnderlying and creditsToUnderlying(balanceOf(user))", async () => { + const aliceBoU = await savingsContract.balanceOfUnderlying(alice.address) + const aliceC = await savingsContract.creditsToUnderlying(await savingsContract.balanceOf(alice.address)) + expect(aliceBoU).eq(aliceC) + + const bobBou = await savingsContract.balanceOfUnderlying(bob.address) + const bobC = await savingsContract.creditsToUnderlying(await savingsContract.balanceOf(bob.address)) + expect(bobBou).eq(bobC) + }) + it("should return same result in creditBalances and balanceOf", async () => { + const aliceCB = await savingsContract.creditBalances(alice.address) + const aliceB = await savingsContract.balanceOf(alice.address) + expect(aliceCB).eq(aliceB) + + const bobCB = await savingsContract.creditBalances(bob.address) + const bobB = await savingsContract.balanceOf(bob.address) + expect(bobCB).eq(bobB) + + const otherCB = await savingsContract.creditBalances(sa.other.address) + const otherB = await savingsContract.balanceOf(sa.other.address) + expect(otherCB).eq(BN.from(0)) + expect(otherB).eq(BN.from(0)) + }) + it("should calculate back and forth correctly", async () => { + // underlyingToCredits + const uToC = await savingsContract.underlyingToCredits(simpleToExactAmount(1, 18)) + expect(uToC).eq(underlyingToCredits(simpleToExactAmount(1, 18), data.exchangeRate)) + expect(await savingsContract.creditsToUnderlying(uToC)).eq(simpleToExactAmount(1, 18)) + + const uToC2 = await savingsContract.underlyingToCredits(1) + expect(uToC2).eq(underlyingToCredits(1, data.exchangeRate)) + expect(await savingsContract.creditsToUnderlying(uToC2)).eq(BN.from(1)) + + const uToC3 = await savingsContract.underlyingToCredits(0) + expect(uToC3).eq(BN.from(1)) + expect(await savingsContract.creditsToUnderlying(uToC3)).eq(BN.from(0)) + + const uToC4 = await savingsContract.underlyingToCredits(12986123876) + expect(uToC4).eq(underlyingToCredits(12986123876, data.exchangeRate)) + expect(await savingsContract.creditsToUnderlying(uToC4)).eq(BN.from(12986123876)) + }) + }) + + describe("redeeming", async () => { + before(async () => { + await createNewSavingsContract() + }) + it("should fail when input is zero", async () => { + await expect(savingsContract.redeem(ZERO)).to.be.revertedWith("Must withdraw something") + await expect(savingsContract.redeemCredits(ZERO)).to.be.revertedWith("Must withdraw something") + await expect(savingsContract.redeemUnderlying(ZERO)).to.be.revertedWith("Must withdraw something") + }) + it("should fail when user doesn't have credits", async () => { + const amt = BN.from(10) + await expect(savingsContract.connect(sa.other.signer).redeem(amt)).to.be.revertedWith("VM Exception") + await expect(savingsContract.connect(sa.other.signer).redeemCredits(amt)).to.be.revertedWith("VM Exception") + await expect(savingsContract.connect(sa.other.signer).redeemUnderlying(amt)).to.be.revertedWith("VM Exception") + }) + context("using redeemCredits", async () => { + const deposit = simpleToExactAmount(10, 18) + const credits = underlyingToCredits(deposit, initialExchangeRate) + const interest = simpleToExactAmount(10, 18) + beforeEach(async () => { + await createNewSavingsContract() + await masset.approve(savingsContract.address, simpleToExactAmount(1, 21)) + await savingsContract.preDeposit(deposit, alice.address) + }) + afterEach(async () => { + const data = await getData(savingsContract, alice) + expect(exchangeRateHolds(data), "Exchange rate must hold") + }) + // test the balance calcs here.. credit to masset, and public calcs + it("should redeem a specific amount of credits", async () => { + // calculates underlying/credits + const creditsToWithdraw = simpleToExactAmount(5, 18) + const expectedWithdrawal = creditsToUnderlying(creditsToWithdraw, initialExchangeRate) + const dataBefore = await getData(savingsContract, alice) + const tx = savingsContract.redeemCredits(creditsToWithdraw) + await expect(tx).to.emit(savingsContract, "CreditsRedeemed").withArgs(alice.address, creditsToWithdraw, expectedWithdrawal) + // await tx.wait() + const dataAfter = await getData(savingsContract, alice) + // burns credits from sender + expect(dataAfter.balances.userCredits).eq(dataBefore.balances.userCredits.sub(creditsToWithdraw)) + expect(dataAfter.balances.totalCredits).eq(dataBefore.balances.totalCredits.sub(creditsToWithdraw)) + // transfers tokens to sender + expect(dataAfter.balances.user).eq(dataBefore.balances.user.add(expectedWithdrawal)) + expect(dataAfter.balances.contract).eq(dataBefore.balances.contract.sub(expectedWithdrawal)) + }) + it("collects interest and credits to saver before redemption", async () => { + const expectedExchangeRate = simpleToExactAmount(2, 17) + await masset.setAmountForCollectInterest(interest) + const dataBefore = await getData(savingsContract, alice) + await savingsContract.redeemCredits(credits) + const dataAfter = await getData(savingsContract, alice) + expect(dataAfter.balances.totalCredits).eq(BN.from(0)) + // User receives their deposit back + interest + assertBNClose(dataAfter.balances.user, dataBefore.balances.user.add(deposit).add(interest), 100) + // Exchange rate updates + expect(dataAfter.exchangeRate).eq(expectedExchangeRate) + }) + }) + context("using redeemUnderlying", async () => { + const deposit = simpleToExactAmount(10, 18) + const interest = simpleToExactAmount(10, 18) + beforeEach(async () => { + await createNewSavingsContract() + await masset.approve(savingsContract.address, simpleToExactAmount(1, 21)) + await savingsContract.preDeposit(deposit, alice.address) + }) + afterEach(async () => { + const data = await getData(savingsContract, alice) + expect(exchangeRateHolds(data), "Exchange rate must hold") + }) + it("allows full redemption immediately after deposit", async () => { + await savingsContract.redeemUnderlying(deposit) + const data = await getData(savingsContract, alice) + expect(data.balances.userCredits).eq(BN.from(0)) + }) + it("should redeem a specific amount of underlying", async () => { + // calculates underlying/credits + const underlying = simpleToExactAmount(5, 18) + const expectedCredits = underlyingToCredits(underlying, initialExchangeRate) + const dataBefore = await getData(savingsContract, alice) + const tx = savingsContract.redeemUnderlying(underlying) + await expect(tx).to.emit(savingsContract, "CreditsRedeemed").withArgs(alice.address, expectedCredits, underlying) + const dataAfter = await getData(savingsContract, alice) + // burns credits from sender + expect(dataAfter.balances.userCredits).eq(dataBefore.balances.userCredits.sub(expectedCredits)) + expect(dataAfter.balances.totalCredits).eq(dataBefore.balances.totalCredits.sub(expectedCredits)) + // transfers tokens to sender + expect(dataAfter.balances.user).eq(dataBefore.balances.user.add(underlying)) + expect(dataAfter.balances.contract).eq(dataBefore.balances.contract.sub(underlying)) + }) + it("collects interest and credits to saver before redemption", async () => { + const expectedExchangeRate = simpleToExactAmount(2, 17) + await masset.setAmountForCollectInterest(interest) + + const dataBefore = await getData(savingsContract, alice) + await savingsContract.redeemUnderlying(deposit) + const dataAfter = await getData(savingsContract, alice) + + expect(dataAfter.balances.user).eq(dataBefore.balances.user.add(deposit)) + // User is left with resulting credits due to exchange rate going up + assertBNClose(dataAfter.balances.userCredits, dataBefore.balances.userCredits.div(2), 1000) + // Exchange rate updates + expect(dataAfter.exchangeRate).eq(expectedExchangeRate) + }) + it("skips interest collection if automate is turned off", async () => { + await masset.setAmountForCollectInterest(interest) + await savingsContract.connect(sa.governor.signer).automateInterestCollectionFlag(false) + + const dataBefore = await getData(savingsContract, alice) + await savingsContract.redeemUnderlying(deposit) + const dataAfter = await getData(savingsContract, alice) + + expect(dataAfter.balances.user).eq(dataBefore.balances.user.add(deposit)) + expect(dataAfter.balances.userCredits).eq(BN.from(0)) + expect(dataAfter.exchangeRate).eq(dataBefore.exchangeRate) + }) + }) + + context("with a connector that surpasses limit", async () => { + const deposit = simpleToExactAmount(100, 18) + const redemption = underlyingToCredits(simpleToExactAmount(51, 18), initialExchangeRate) + before(async () => { + await createNewSavingsContract() + const connector = await (await new MockConnector__factory(sa.default.signer)).deploy( + savingsContract.address, + masset.address, + ) + + await masset.approve(savingsContract.address, simpleToExactAmount(1, 21)) + await savingsContract.preDeposit(deposit, alice.address) + + await savingsContract.connect(sa.governor.signer).setConnector(connector.address) + + await ethers.provider.send("evm_increaseTime", [ONE_HOUR.mul(4).add(1).toNumber()]) + await ethers.provider.send("evm_mine", []) + + const data = await getData(savingsContract, alice) + expect(data.connector.balance).eq(deposit.mul(data.connector.fraction).div(fullScale)) + expect(data.balances.contract).eq(deposit.sub(data.connector.balance)) + expect(data.exchangeRate).eq(initialExchangeRate) + }) + afterEach(async () => { + const data = await getData(savingsContract, alice) + expect(exchangeRateHolds(data), "Exchange rate must hold") + }) + it("triggers poke and deposits to connector if the threshold is hit", async () => { + // in order to reach 40%, must redeem > 51 + const dataBefore = await getData(savingsContract, alice) + const poke = await getExpectedPoke(dataBefore, redemption) + + const tx = savingsContract.redeemCredits(redemption) + await expect(tx) + .to.emit(savingsContract, "CreditsRedeemed") + .withArgs(alice.address, redemption, simpleToExactAmount(51, 18)) + // Remaining balance is 49, with 20 in the connector + await expect(tx).to.emit(savingsContract, "Poked").withArgs(dataBefore.connector.balance, poke.ideal, BN.from(0)) + + const dataAfter = await getData(savingsContract, alice) + expect(dataAfter.balances.contract).eq(simpleToExactAmount("39.2", 18)) + }) + it("errors if triggered again within 4h", async () => {}) + }) + + context("using redeem (depcrecated)", async () => { + beforeEach(async () => { + await createNewSavingsContract() + await masset.approve(savingsContract.address, simpleToExactAmount(10, 18)) + await savingsContract["depositSavings(uint256)"](simpleToExactAmount(1, 18)) + }) + it("should redeem when user has balance", async () => { + const redemptionAmount = simpleToExactAmount(5, 18) + const balancesBefore = await getData(savingsContract, sa.default) + + const tx = savingsContract.redeem(redemptionAmount) + const exchangeRate = initialExchangeRate + const underlying = creditsToUnderlying(redemptionAmount, exchangeRate) + await expect(tx).to.emit(savingsContract, "CreditsRedeemed").withArgs(sa.default.address, redemptionAmount, underlying) + const dataAfter = await getData(savingsContract, sa.default) + expect(balancesBefore.balances.contract.sub(underlying)).to.equal(dataAfter.balances.contract) + + expect(balancesBefore.balances.user.add(underlying)).to.equal(dataAfter.balances.user) + }) + it("should withdraw the mUSD and burn the credits", async () => { + const redemptionAmount = simpleToExactAmount(1, 18) + const creditsBefore = await savingsContract.creditBalances(sa.default.address) + const mUSDBefore = await masset.balanceOf(sa.default.address) + // Redeem all the credits + await savingsContract.redeem(creditsBefore) + + const creditsAfter = await savingsContract.creditBalances(sa.default.address) + const mUSDAfter = await masset.balanceOf(sa.default.address) + expect(creditsAfter, "Must burn all the credits").eq(BN.from(0)) + expect(mUSDAfter, "Must receive back mUSD").eq(mUSDBefore.add(redemptionAmount)) + }) + }) + }) + + describe("setting poker", () => { + before(async () => { + await createNewSavingsContract() + }) + it("fails if not called by governor", async () => { + await expect(savingsContract.connect(sa.dummy1.signer).setPoker(sa.dummy1.address)).to.be.revertedWith( + "Only governor can execute", + ) + }) + it("fails if invalid poker address", async () => { + await expect(savingsContract.connect(sa.governor.signer).setPoker(sa.default.address)).to.be.revertedWith("Invalid poker") + }) + it("allows governance to set a new poker", async () => { + const tx = savingsContract.connect(sa.governor.signer).setPoker(sa.dummy1.address) + await expect(tx).to.emit(savingsContract, "PokerUpdated").withArgs(sa.dummy1.address) + expect(await savingsContract.poker()).eq(sa.dummy1.address) + }) + }) + + describe("setting fraction", () => { + before(async () => { + await createNewSavingsContract() + await masset.approve(savingsContract.address, simpleToExactAmount(1, 18)) + await savingsContract.preDeposit(simpleToExactAmount(1, 18), sa.default.address) + }) + it("fails if not called by governor", async () => { + await expect(savingsContract.connect(sa.dummy1.signer).setFraction(simpleToExactAmount(1, 17))).to.be.revertedWith( + "Only governor can execute", + ) + }) + it("fails if over the threshold", async () => { + await expect(savingsContract.connect(sa.governor.signer).setFraction(simpleToExactAmount(55, 16))).to.be.revertedWith( + "Fraction must be <= 50%", + ) + }) + it("sets a new fraction and pokes", async () => { + const tx = savingsContract.connect(sa.governor.signer).setFraction(simpleToExactAmount(1, 16)) + await expect(tx).to.emit(savingsContract, "FractionUpdated").withArgs(simpleToExactAmount(1, 16)) + await expect(tx).to.emit(savingsContract, "PokedRaw") + expect(await savingsContract.fraction()).eq(simpleToExactAmount(1, 16)) + }) + }) + + describe("setting connector", () => { + const deposit = simpleToExactAmount(100, 18) + + beforeEach(async () => { + await createNewSavingsContract() + const connector = await connectorFactory.deploy(savingsContract.address, masset.address) + + await masset.approve(savingsContract.address, simpleToExactAmount(1, 21)) + await savingsContract.preDeposit(deposit, alice.address) + + await savingsContract.connect(sa.governor.signer).setConnector(connector.address) + }) + afterEach(async () => { + const data = await getData(savingsContract, alice) + expect(exchangeRateHolds(data), "Exchange rate must hold") + }) + it("fails if not called by governor", async () => { + await expect(savingsContract.connect(sa.dummy1.signer).setConnector(sa.dummy1.address)).to.be.revertedWith( + "Only governor can execute", + ) + }) + it("updates the connector address, moving assets to new connector", async () => { + const dataBefore = await getData(savingsContract, alice) + + expect(dataBefore.connector.balance).eq(deposit.mul(dataBefore.connector.fraction).div(fullScale)) + expect(dataBefore.balances.contract).eq(deposit.sub(dataBefore.connector.balance)) + expect(dataBefore.exchangeRate).eq(initialExchangeRate) + + const newConnector = await connectorFactory.deploy(savingsContract.address, masset.address) + + const tx = savingsContract.connect(sa.governor.signer).setConnector(newConnector.address) + await expect(tx).to.emit(savingsContract, "ConnectorUpdated").withArgs(newConnector.address) + + const dataAfter = await getData(savingsContract, alice) + expect(dataAfter.connector.address).eq(newConnector.address) + expect(dataAfter.connector.balance).eq(dataBefore.connector.balance) + const oldConnector = await connectorFactory.attach(dataBefore.connector.address) + expect(await oldConnector.checkBalance()).eq(BN.from(0)) + }) + it("withdraws everything if connector is set to 0", async () => { + const dataBefore = await getData(savingsContract, alice) + const tx = savingsContract.connect(sa.governor.signer).setConnector(ZERO_ADDRESS) + await expect(tx).to.emit(savingsContract, "ConnectorUpdated").withArgs(ZERO_ADDRESS) + + const dataAfter = await getData(savingsContract, alice) + expect(dataAfter.connector.address).eq(ZERO_ADDRESS) + expect(dataAfter.connector.balance).eq(BN.from(0)) + expect(dataAfter.balances.contract).eq(dataBefore.balances.contract.add(dataBefore.connector.balance)) + }) + }) + + describe("poking", () => { + const deposit = simpleToExactAmount(1, 20) + before(async () => { + await createNewSavingsContract() + }) + it("allows only poker to poke", async () => { + await expect(savingsContract.connect(sa.governor.signer).poke()).to.be.revertedWith("Only poker can execute") + }) + it("fails if there are no credits", async () => { + const credits = await savingsContract.totalSupply() + expect(credits).eq(BN.from(0)) + await expect(savingsContract.connect(sa.default.signer).poke()).to.be.revertedWith("Must have something to poke") + }) + it("only allows pokes once every 4h", async () => { + await masset.approve(savingsContract.address, simpleToExactAmount(1, 21)) + await savingsContract.preDeposit(deposit, alice.address) + await savingsContract.poke() + await ethers.provider.send("evm_increaseTime", [ONE_HOUR.mul(3).toNumber()]) + await ethers.provider.send("evm_mine", []) + await expect(savingsContract.connect(sa.default.signer).poke()).to.be.revertedWith("Not enough time elapsed") + }) + context("with an erroneous connector", () => { + beforeEach(async () => { + await createNewSavingsContract() + + await masset.approve(savingsContract.address, simpleToExactAmount(1, 21)) + await savingsContract.preDeposit(deposit, alice.address) + }) + afterEach(async () => { + const data = await getData(savingsContract, alice) + expect(exchangeRateHolds(data), "Exchange rate must hold") + }) + it("should fail if the raw balance goes down somehow", async () => { + const connector = await (await new MockErroneousConnector1__factory(sa.default.signer)).deploy( + savingsContract.address, + masset.address, + ) + await savingsContract.connect(sa.governor.signer).setConnector(connector.address) + // Total collat goes down + await savingsContract.redeemUnderlying(deposit.div(2)) + // Withdrawal is made but nothing comes back + await ethers.provider.send("evm_increaseTime", [ONE_HOUR.mul(6).toNumber()]) + await ethers.provider.send("evm_mine", []) + await savingsContract.poke() + // Try that again + await ethers.provider.send("evm_increaseTime", [ONE_HOUR.mul(12).toNumber()]) + await ethers.provider.send("evm_mine", []) + await expect(savingsContract.poke()).to.be.revertedWith("ExchangeRate must increase") + }) + it("is protected by the system invariant", async () => { + // connector returns invalid balance after withdrawal + const connector = await (await new MockErroneousConnector2__factory(sa.default.signer)).deploy( + savingsContract.address, + masset.address, + ) + await savingsContract.connect(sa.governor.signer).setConnector(connector.address) + await savingsContract.redeemUnderlying(deposit.div(2)) + + await ethers.provider.send("evm_increaseTime", [ONE_HOUR.mul(4).toNumber()]) + await ethers.provider.send("evm_mine", []) + await expect(savingsContract.poke()).to.be.revertedWith("Enforce system invariant") + }) + it("should fail if the balance has gone down", async () => { + const connector = await (await new MockErroneousConnector2__factory(sa.default.signer)).deploy( + savingsContract.address, + masset.address, + ) + await savingsContract.connect(sa.governor.signer).setConnector(connector.address) + + await ethers.provider.send("evm_increaseTime", [ONE_HOUR.mul(4).toNumber()]) + await ethers.provider.send("evm_mine", []) + await connector.poke() + await expect(savingsContract.poke()).to.be.revertedWith("Invalid yield") + }) + }) + context("with a lending market connector", () => { + let connector: MockLendingConnector + before(async () => { + await createNewSavingsContract() + + connector = await (await new MockLendingConnector__factory(sa.default.signer)).deploy( + savingsContract.address, + masset.address, + ) + // Give mock some extra assets to allow inflation + await masset.transfer(connector.address, simpleToExactAmount(100, 18)) + + await masset.approve(savingsContract.address, simpleToExactAmount(1, 21)) + await savingsContract.preDeposit(deposit, alice.address) + + // Set up connector + await savingsContract.connect(sa.governor.signer).setFraction(0) + await savingsContract.connect(sa.governor.signer).setConnector(connector.address) + }) + afterEach(async () => { + const data = await getData(savingsContract, alice) + expect(exchangeRateHolds(data), "Exchange rate must hold") + }) + it("should do nothing if the fraction is 0", async () => { + const data = await getData(savingsContract, alice) + + await ethers.provider.send("evm_increaseTime", [ONE_HOUR.mul(4).toNumber()]) + await ethers.provider.send("evm_mine", []) + const tx = savingsContract.poke() + await expect(tx).to.emit(savingsContract, "Poked").withArgs(BN.from(0), BN.from(0), BN.from(0)) + const dataAfter = await getData(savingsContract, alice) + expect(dataAfter.balances.contract).eq(data.balances.contract) + expect(dataAfter.exchangeRate).eq(data.exchangeRate) + }) + it("should poke when fraction is set", async () => { + const tx = savingsContract.connect(sa.governor.signer).setFraction(simpleToExactAmount(2, 17)) + + await expect(tx).to.emit(savingsContract, "Poked").withArgs(BN.from(0), simpleToExactAmount(2, 19), BN.from(0)) + + const dataAfter = await getData(savingsContract, alice) + expect(dataAfter.balances.contract).eq(simpleToExactAmount(8, 19)) + expect(dataAfter.connector.balance).eq(simpleToExactAmount(2, 19)) + }) + it("should accrue interest and update exchange rate", async () => { + await ethers.provider.send("evm_increaseTime", [ONE_DAY.toNumber()]) + await ethers.provider.send("evm_mine", []) + const data = await getData(savingsContract, alice) + + const ts = await getTimestamp() + await connector.poke() + const tx = savingsContract.poke() + await expect(tx).to.emit(savingsContract, "Poked") + const dataAfter = await getData(savingsContract, alice) + expect(dataAfter.exchangeRate).gt(data.exchangeRate) + assertBNClose(dataAfter.connector.lastPoke, BN.from(ts), 5) + expect(dataAfter.connector.balance).gte(dataAfter.connector.lastBalance) + }) + it("should deposit to the connector if total supply increases", async () => { + await masset.approve(savingsContract.address, simpleToExactAmount(1, 20)) + await savingsContract["depositSavings(uint256)"](deposit) + + await ethers.provider.send("evm_increaseTime", [ONE_DAY.toNumber()]) + await ethers.provider.send("evm_mine", []) + const data = await getData(savingsContract, alice) + + const ts = await getTimestamp() + await savingsContract.poke() + + const dataAfter = await getData(savingsContract, alice) + expect(dataAfter.exchangeRate).gt(data.exchangeRate) + assertBNClose(dataAfter.connector.lastPoke, BN.from(ts), 5) + expect(dataAfter.connector.balance).gte(dataAfter.connector.lastBalance) + assertBNClosePercent(dataAfter.balances.contract, simpleToExactAmount(16, 19), "2") + }) + it("should withdraw from the connector if total supply lowers", async () => { + await savingsContract.redeemUnderlying(simpleToExactAmount(1, 20)) + + await ethers.provider.send("evm_increaseTime", [ONE_DAY.mul(2).add(1).toNumber()]) + await ethers.provider.send("evm_mine", []) + const data = await getData(savingsContract, alice) + + await savingsContract.poke() + + const dataAfter = await getData(savingsContract, alice) + expect(dataAfter.exchangeRate).gte(data.exchangeRate) + expect(dataAfter.connector.balance).gte(dataAfter.connector.lastBalance) + assertBNClosePercent(dataAfter.balances.contract, simpleToExactAmount(8, 19), "2") + }) + it("should continue to accrue interest", async () => { + await ethers.provider.send("evm_increaseTime", [ONE_DAY.mul(3).toNumber()]) + await ethers.provider.send("evm_mine", []) + const data = await getData(savingsContract, alice) + + await savingsContract.poke() + + const dataAfter = await getData(savingsContract, alice) + expect(dataAfter.exchangeRate).gte(data.exchangeRate) + expect(dataAfter.connector.balance).gte(dataAfter.connector.lastBalance) + assertBNClosePercent(dataAfter.balances.contract, simpleToExactAmount(8, 19), "2") + }) + it("should fail if the APY is too high", async () => { + await ethers.provider.send("evm_increaseTime", [ONE_HOUR.mul(4).toNumber()]) + await ethers.provider.send("evm_mine", []) + await expect(savingsContract.poke()).to.be.revertedWith("Interest protected from inflating past maxAPY") + }) + }) + context("with a vault connector", () => { + let connector: MockVaultConnector + before(async () => { + await createNewSavingsContract() + connector = await (await new MockVaultConnector__factory(sa.default.signer)).deploy(savingsContract.address, masset.address) + await masset.transfer(connector.address, simpleToExactAmount(100, 18)) + await masset.approve(savingsContract.address, simpleToExactAmount(1, 21)) + await savingsContract.preDeposit(deposit, alice.address) + }) + afterEach(async () => { + const data = await getData(savingsContract, alice) + expect(exchangeRateHolds(data), "Exchange rate must hold") + }) + it("should poke when fraction is set", async () => { + const tx = savingsContract.connect(sa.governor.signer).setConnector(connector.address) + + await expect(tx).to.emit(savingsContract, "Poked").withArgs(BN.from(0), simpleToExactAmount(2, 19), BN.from(0)) + + const dataAfter = await getData(savingsContract, alice) + expect(dataAfter.balances.contract).eq(simpleToExactAmount(8, 19)) + expect(dataAfter.connector.balance).eq(simpleToExactAmount(2, 19)) + }) + + // In this case, the slippage from the deposit has caused the connector + // to be less than the original balance. Fortunately, the invariant for Connectors + // protects against this case, and will return the deposited balance. + it("should not accrue interest if there is still a deficit", async () => { + await ethers.provider.send("evm_increaseTime", [ONE_HOUR.mul(4).toNumber()]) + await ethers.provider.send("evm_mine", []) + await savingsContract.poke() + + await ethers.provider.send("evm_increaseTime", [ONE_DAY.toNumber()]) + await ethers.provider.send("evm_mine", []) + const data = await getData(savingsContract, alice) + + const ts = await getTimestamp() + await connector.poke() + const tx = savingsContract.poke() + await expect(tx) + .to.emit(savingsContract, "Poked") + .withArgs(simpleToExactAmount(2, 19), simpleToExactAmount(2, 19), BN.from(0)) + + const dataAfter = await getData(savingsContract, alice) + expect(dataAfter.exchangeRate).eq(data.exchangeRate) + assertBNClose(dataAfter.connector.lastPoke, BN.from(ts), 5) + expect(dataAfter.connector.balance).eq(dataAfter.connector.lastBalance) + }) + it("should accrue interest if the balance goes positive", async () => { + await ethers.provider.send("evm_increaseTime", [ONE_DAY.mul(2).toNumber()]) + await ethers.provider.send("evm_mine", []) + await connector.poke() + + await ethers.provider.send("evm_increaseTime", [ONE_DAY.toNumber()]) + await ethers.provider.send("evm_mine", []) + const data = await getData(savingsContract, alice) + + const connectorBalance = await connector.checkBalance() + expect(connectorBalance).gt(simpleToExactAmount(2, 19)) + + await connector.poke() + const tx = savingsContract.poke() + await expect(tx).to.emit(savingsContract, "Poked") + + const dataAfter = await getData(savingsContract, alice) + expect(dataAfter.exchangeRate).gt(data.exchangeRate) + expect(connectorBalance).gt(dataAfter.connector.lastBalance) + }) + it("should deposit to the connector if total supply increases", async () => { + await masset.approve(savingsContract.address, simpleToExactAmount(1, 20)) + await savingsContract["depositSavings(uint256)"](deposit) + + await ethers.provider.send("evm_increaseTime", [ONE_DAY.toNumber()]) + await ethers.provider.send("evm_mine", []) + const data = await getData(savingsContract, alice) + + const ts = await getTimestamp() + await savingsContract.poke() + + const dataAfter = await getData(savingsContract, alice) + expect(dataAfter.exchangeRate, "Exchange rate must be the same").eq(data.exchangeRate) + assertBNClose(dataAfter.connector.lastPoke, BN.from(ts), 5) + expect(dataAfter.connector.balance).gte(dataAfter.connector.lastBalance) + assertBNClosePercent(dataAfter.balances.contract, simpleToExactAmount(16, 19), "2") + }) + it("should withdraw from the connector if total supply lowers", async () => { + await savingsContract.redeemUnderlying(simpleToExactAmount(1, 20)) + + await ethers.provider.send("evm_increaseTime", [ONE_DAY.mul(2).toNumber()]) + await ethers.provider.send("evm_mine", []) + const data = await getData(savingsContract, alice) + + await savingsContract.poke() + + const dataAfter = await getData(savingsContract, alice) + expect(dataAfter.exchangeRate).gte(data.exchangeRate) + expect(dataAfter.connector.balance).gte(dataAfter.connector.lastBalance) + assertBNClosePercent(dataAfter.balances.contract, simpleToExactAmount(8, 19), "2") + }) + it("should continue to accrue interest", async () => { + await ethers.provider.send("evm_increaseTime", [ONE_DAY.toNumber()]) + await ethers.provider.send("evm_mine", []) + const data = await getData(savingsContract, alice) + + await savingsContract.poke() + + const dataAfter = await getData(savingsContract, alice) + expect(dataAfter.exchangeRate).gte(data.exchangeRate) + expect(dataAfter.connector.balance).gte(dataAfter.connector.lastBalance) + assertBNClosePercent(dataAfter.balances.contract, simpleToExactAmount(8, 19), "2") + }) + it("allows the connector to be switched to a lending market", async () => { + await ethers.provider.send("evm_increaseTime", [ONE_DAY.toNumber()]) + await ethers.provider.send("evm_mine", []) + const newConnector = await (await new MockLendingConnector__factory(sa.default.signer)).deploy( + savingsContract.address, + masset.address, + ) + const data = await getData(savingsContract, alice) + await savingsContract.connect(sa.governor.signer).setConnector(newConnector.address) + const dataAfter = await getData(savingsContract, alice) + expect(dataAfter.connector.address).eq(newConnector.address) + assertBNClosePercent( + dataAfter.connector.lastBalance, + creditsToUnderlying(dataAfter.balances.totalCredits, dataAfter.exchangeRate).div(5), + "0.0001", + ) + expect(dataAfter.balances.contract).gte(data.balances.contract) + }) + }) + context("with no connector", () => { + const deposit2 = simpleToExactAmount(100, 18) + const airdrop = simpleToExactAmount(1, 18) + beforeEach(async () => { + await createNewSavingsContract() + await masset.approve(savingsContract.address, simpleToExactAmount(1, 21)) + await savingsContract.preDeposit(deposit2, alice.address) + }) + it("simply updates the exchangeRate using the raw balance", async () => { + const dataBefore = await getData(savingsContract, alice) + expect(dataBefore.balances.userCredits).eq(underlyingToCredits(deposit2, initialExchangeRate)) + + await masset.transfer(savingsContract.address, airdrop) + const tx = savingsContract.poke() + await expect(tx) + .to.emit(savingsContract, "ExchangeRateUpdated") + .withArgs(deposit2.add(airdrop).mul(fullScale).div(dataBefore.balances.userCredits.sub(1)), airdrop) + await expect(tx).to.emit(savingsContract, "PokedRaw") + const balanceOfUnderlying = await savingsContract.balanceOfUnderlying(alice.address) + expect(balanceOfUnderlying).eq(deposit2.add(airdrop)) + }) + }) + }) + + describe("testing emergency stop", () => { + const deposit = simpleToExactAmount(100, 18) + let dataBefore: Data + const expectedRateAfter = initialExchangeRate.div(10).mul(9) + before(async () => { + await createNewSavingsContract() + const connector = await connectorFactory.deploy(savingsContract.address, masset.address) + + await masset.transfer(bob.address, simpleToExactAmount(100, 18)) + await masset.approve(savingsContract.address, simpleToExactAmount(1, 21)) + await savingsContract.preDeposit(deposit, alice.address) + + await savingsContract.connect(sa.governor.signer).setConnector(connector.address) + dataBefore = await getData(savingsContract, alice) + }) + afterEach(async () => { + const data = await getData(savingsContract, alice) + expect(exchangeRateHolds(data), "exchange rate must hold") + }) + it("withdraws specific amount from the connector", async () => { + expect(dataBefore.connector.balance).eq(deposit.div(5)) + + const tx = savingsContract.connect(sa.governor.signer).emergencyWithdraw(simpleToExactAmount(10, 18)) + await expect(tx).to.emit(savingsContract, "ConnectorUpdated").withArgs(ZERO_ADDRESS) + await expect(tx).to.emit(savingsContract, "FractionUpdated").withArgs(BN.from(0)) + await expect(tx).to.emit(savingsContract, "EmergencyUpdate") + expect(tx).to.emit(savingsContract, "ExchangeRateUpdated").withArgs(expectedRateAfter, BN.from(0)) + + const dataMiddle = await getData(savingsContract, alice) + expect(dataMiddle.balances.contract).eq(simpleToExactAmount(90, 18)) + expect(dataMiddle.balances.totalCredits).eq(dataBefore.balances.totalCredits) + }) + it("sets fraction and connector to 0", async () => { + const fraction = await savingsContract.fraction() + expect(fraction).eq(BN.from(0)) + const connector = await savingsContract.connector() + expect(connector).eq(ZERO_ADDRESS) + }) + it("should lowers exchange rate if necessary", async () => { + const data = await getData(savingsContract, alice) + expect(data.exchangeRate).eq(expectedRateAfter) + + const balanceOfUnderlying = await savingsContract.balanceOfUnderlying(alice.address) + expect(balanceOfUnderlying).eq(simpleToExactAmount(90, 18)) + }) + it("should still allow deposits and withdrawals to work", async () => { + await masset.connect(bob.signer).approve(savingsContract.address, simpleToExactAmount(1, 21)) + await savingsContract.connect(bob.signer)["depositSavings(uint256)"](deposit) + const data = await getData(savingsContract, bob) + expect(data.balances.userCredits).eq(underlyingToCredits(deposit, expectedRateAfter)) + + const balanceOfUnderlying = await savingsContract.balanceOfUnderlying(bob.address) + expect(balanceOfUnderlying).eq(deposit) + + await savingsContract.connect(bob.signer).redeemCredits(data.balances.userCredits) + + const dataEnd = await getData(savingsContract, bob) + expect(dataEnd.balances.userCredits).eq(BN.from(0)) + expect(dataEnd.balances.user).eq(data.balances.user.add(deposit)) + }) + }) + + context("performing multiple operations from multiple addresses in sequence", async () => { + beforeEach(async () => { + await createNewSavingsContract() + }) + + it("should give existing savers the benefit of the increased exchange rate", async () => { + const saver1 = sa.default + const saver2 = sa.dummy1 + const saver3 = sa.dummy2 + const saver4 = sa.dummy3 + + // Set up amounts + // Each savers deposit will trigger some interest to be deposited + const saver1deposit = simpleToExactAmount(1000, 18) + const interestToReceive1 = simpleToExactAmount(100, 18) + const saver2deposit = simpleToExactAmount(1000, 18) + const interestToReceive2 = simpleToExactAmount(350, 18) + const saver3deposit = simpleToExactAmount(1000, 18) + const interestToReceive3 = simpleToExactAmount(80, 18) + const saver4deposit = simpleToExactAmount(1000, 18) + const interestToReceive4 = simpleToExactAmount(160, 18) + + // Ensure saver2 has some balances and do approvals + await masset.transfer(saver2.address, saver2deposit) + await masset.transfer(saver3.address, saver3deposit) + await masset.transfer(saver4.address, saver4deposit) + await masset.connect(saver1.signer).approve(savingsContract.address, MAX_UINT256) + await masset.connect(saver2.signer).approve(savingsContract.address, MAX_UINT256) + await masset.connect(saver3.signer).approve(savingsContract.address, MAX_UINT256) + await masset.connect(saver4.signer).approve(savingsContract.address, MAX_UINT256) + + // Should be a fresh balance sheet + const stateBefore = await getData(savingsContract, sa.default) + expect(stateBefore.exchangeRate).to.equal(initialExchangeRate) + expect(stateBefore.balances.contract).to.equal(BN.from(0)) + + // 1.0 user 1 deposits + // interest remains unassigned and exchange rate unmoved + await masset.setAmountForCollectInterest(interestToReceive1) + + await ethers.provider.send("evm_increaseTime", [ONE_DAY.toNumber()]) + await ethers.provider.send("evm_mine", []) + await savingsContract.connect(saver1.signer)["depositSavings(uint256)"](saver1deposit) + await savingsContract.poke() + const state1 = await getData(savingsContract, saver1) + // 2.0 user 2 deposits + // interest rate benefits user 1 and issued user 2 less credits than desired + await masset.setAmountForCollectInterest(interestToReceive2) + + await ethers.provider.send("evm_increaseTime", [ONE_DAY.toNumber()]) + await ethers.provider.send("evm_mine", []) + await savingsContract.connect(saver2.signer)["depositSavings(uint256)"](saver2deposit) + const state2 = await getData(savingsContract, saver2) + // 3.0 user 3 deposits + // interest rate benefits users 1 and 2 + await masset.setAmountForCollectInterest(interestToReceive3) + + await ethers.provider.send("evm_increaseTime", [ONE_DAY.toNumber()]) + await ethers.provider.send("evm_mine", []) + await savingsContract.connect(saver3.signer)["depositSavings(uint256)"](saver3deposit) + const state3 = await getData(savingsContract, saver3) + // 4.0 user 1 withdraws all her credits + await savingsContract.connect(saver1.signer).redeem(state1.balances.userCredits) + const state4 = await getData(savingsContract, saver1) + expect(state4.balances.userCredits).eq(BN.from(0)) + expect(state4.balances.totalCredits).eq(state3.balances.totalCredits.sub(state1.balances.userCredits)) + expect(state4.exchangeRate).eq(state3.exchangeRate) + assertBNClose(state4.balances.contract, creditsToUnderlying(state4.balances.totalCredits, state4.exchangeRate), BN.from(100000)) + // 5.0 user 4 deposits + // interest rate benefits users 2 and 3 + await masset.setAmountForCollectInterest(interestToReceive4) + + await ethers.provider.send("evm_increaseTime", [ONE_DAY.toNumber()]) + await ethers.provider.send("evm_mine", []) + await savingsContract.connect(saver4.signer)["depositSavings(uint256)"](saver4deposit) + const state5 = await getData(savingsContract, saver4) + // 6.0 users 2, 3, and 4 withdraw all their tokens + await savingsContract.connect(saver2.signer).redeemCredits(state2.balances.userCredits) + await savingsContract.connect(saver3.signer).redeemCredits(state3.balances.userCredits) + await savingsContract.connect(saver4.signer).redeemCredits(state5.balances.userCredits) + }) + }) +}) diff --git a/test/savings/savings-vault.spec.ts b/test/savings/savings-vault.spec.ts new file mode 100644 index 00000000..b6efb030 --- /dev/null +++ b/test/savings/savings-vault.spec.ts @@ -0,0 +1,1516 @@ +/* eslint-disable no-await-in-loop */ + +import { ethers } from "hardhat" +import { expect } from "chai" +import { utils } from "ethers" +import { simpleToExactAmount, BN } from "@utils/math" +import { assertBNClose, assertBNClosePercent, assertBNSlightlyGT } from "@utils/assertions" +import { StandardAccounts, MassetMachine, Account } from "@utils/machines" +import { fullScale, ZERO_ADDRESS, ONE_DAY, FIVE_DAYS, ONE_WEEK, DEAD_ADDRESS } from "@utils/constants" +import { getTimestamp, increaseTime } from "@utils/time" +import { + MockERC20, + MockERC20__factory, + ImmutableModule, + MockStakingContract, + MockStakingContract__factory, + InitializableRewardsDistributionRecipient, + BoostedSavingsVault, + BoostedSavingsVault__factory, + MockNexus, + MockNexus__factory, + AssetProxy__factory, +} from "types/generated" +import { + shouldBehaveLikeDistributionRecipient, + IRewardsDistributionRecipientContext, +} from "../shared/RewardsDistributionRecipient.behaviour" + +interface StakingBalance { + raw: BN + balance: BN + totalSupply: BN +} + +interface TokenBalance { + sender: BN + contract: BN +} + +interface UserData { + rewardPerTokenPaid: BN + rewards: BN + lastAction: BN + rewardCount: number + userClaim: BN +} +interface ContractData { + rewardPerTokenStored: BN + rewardRate: BN + lastUpdateTime: BN + lastTimeRewardApplicable: BN + periodFinishTime: BN +} +interface Reward { + start: BN + finish: BN + rate: BN +} + +interface StakingData { + boostBalance: StakingBalance + tokenBalance: TokenBalance + vMTABalance: BN + userData: UserData + userRewards: Reward[] + contractData: ContractData +} + +describe("SavingsVault", async () => { + const ctx: Partial = {} + + let sa: StandardAccounts + let mAssetMachine: MassetMachine + let rewardsDistributor: Account + + let rewardToken: MockERC20 + let iMasset: MockERC20 + let nexus: MockNexus + let savingsVault: BoostedSavingsVault + let stakingContract: MockStakingContract + + const minBoost = simpleToExactAmount(5, 17) + const maxBoost = simpleToExactAmount(15, 17) + const coeff = 60 + const priceCoeff = simpleToExactAmount(1, 17) + const lockupPeriod = ONE_WEEK.mul(26) + + const boost = (raw: BN, boostAmt: BN): BN => raw.mul(boostAmt).div(fullScale) + + const calcBoost = (raw: BN, vMTA: BN, priceCoefficient = priceCoeff): BN => { + // min(d + c * vMTA^a / imUSD^b, m) + const scaledBalance = raw.mul(priceCoefficient).div(simpleToExactAmount(1, 18)) + + if (scaledBalance.lt(simpleToExactAmount(1, 18))) return minBoost + + let denom = parseFloat(utils.formatUnits(scaledBalance)) + denom **= 0.875 + const lhs = minBoost.add(vMTA.mul(coeff).div(10).mul(fullScale).div(simpleToExactAmount(denom))) + return lhs.gt(maxBoost) ? maxBoost : lhs + } + + const unlockedRewards = (total: BN): BN => total.div(5) + + const lockedRewards = (total: BN): BN => total.div(5).mul(4) + + const redeployRewards = async (priceCoefficient = priceCoeff): Promise => { + nexus = await (await new MockNexus__factory(sa.default.signer)).deploy(sa.governor.address, DEAD_ADDRESS) + rewardToken = await (await new MockERC20__factory(sa.default.signer)).deploy( + "Reward", + "RWD", + 18, + rewardsDistributor.address, + 10000000, + ) + iMasset = await (await new MockERC20__factory(sa.default.signer)).deploy( + "Interest bearing mUSD", + "imUSD", + 18, + sa.default.address, + 1000000, + ) + stakingContract = await (await new MockStakingContract__factory(sa.default.signer)).deploy() + + const vaultFactory = await new BoostedSavingsVault__factory(sa.default.signer) + const impl = await vaultFactory.deploy( + nexus.address, + iMasset.address, + stakingContract.address, + priceCoefficient, + rewardToken.address, + ) + const data = impl.interface.encodeFunctionData("initialize", [rewardsDistributor.address]) + const proxy = await (await new AssetProxy__factory(sa.default.signer)).deploy(impl.address, sa.dummy4.address, data) + return vaultFactory.attach(proxy.address) + } + + const snapshotStakingData = async (sender = sa.default, beneficiary = sa.default): Promise => { + const userData = await savingsVault.userData(beneficiary.address) + const userRewards = [] + for (let i = 0; i < userData[3].toNumber(); i += 1) { + const e = await savingsVault.userRewards(beneficiary.address, i) + userRewards.push({ + start: e[0], + finish: e[1], + rate: e[2], + }) + } + return { + boostBalance: { + raw: await savingsVault.rawBalanceOf(beneficiary.address), + balance: await savingsVault.balanceOf(beneficiary.address), + totalSupply: await savingsVault.totalSupply(), + }, + tokenBalance: { + sender: await iMasset.balanceOf(sender.address), + contract: await iMasset.balanceOf(savingsVault.address), + }, + vMTABalance: await stakingContract.balanceOf(beneficiary.address), + userData: { + rewardPerTokenPaid: userData[0], + rewards: userData[1], + lastAction: userData[2], + rewardCount: userData[3].toNumber(), + userClaim: await savingsVault.userClaim(beneficiary.address), + }, + userRewards, + contractData: { + rewardPerTokenStored: await savingsVault.rewardPerTokenStored(), + rewardRate: await savingsVault.rewardRate(), + lastUpdateTime: await savingsVault.lastUpdateTime(), + lastTimeRewardApplicable: await savingsVault.lastTimeRewardApplicable(), + periodFinishTime: await savingsVault.periodFinish(), + }, + } + } + + before(async () => { + const accounts = await ethers.getSigners() + mAssetMachine = await new MassetMachine().initAccounts(accounts) + sa = mAssetMachine.sa + rewardsDistributor = sa.fundManager + + savingsVault = await redeployRewards() + + ctx.recipient = (savingsVault as unknown) as InitializableRewardsDistributionRecipient + ctx.module = savingsVault as ImmutableModule + ctx.sa = sa + }) + + describe("constructor & settings", async () => { + beforeEach(async () => { + savingsVault = await redeployRewards() + }) + it("should set all initial state", async () => { + // Set in constructor + expect(await savingsVault.nexus()).to.eq(nexus.address) + expect(await savingsVault.stakingToken()).to.eq(iMasset.address) + expect(await savingsVault.stakingContract()).to.eq(stakingContract.address) + expect(await savingsVault.rewardsToken()).to.eq(rewardToken.address) + expect(await savingsVault.rewardsDistributor()).to.eq(rewardsDistributor.address) + + // Basic storage + expect(await savingsVault.totalSupply()).to.be.eq(BN.from(0)) + expect(await savingsVault.periodFinish()).to.be.eq(BN.from(0)) + expect(await savingsVault.rewardRate()).to.be.eq(BN.from(0)) + expect(await savingsVault.lastUpdateTime()).to.be.eq(BN.from(0)) + expect(await savingsVault.rewardPerTokenStored()).to.be.eq(BN.from(0)) + expect(await savingsVault.lastTimeRewardApplicable()).to.be.eq(BN.from(0)) + expect(await savingsVault.rewardPerToken()).to.be.eq(BN.from(0)) + }) + + shouldBehaveLikeDistributionRecipient(ctx as IRewardsDistributionRecipientContext) + }) + + /** + * @dev Ensures the reward units are assigned correctly, based on the last update time, etc + * @param beforeData Snapshot after the tx + * @param afterData Snapshot after the tx + * @param isExistingStaker Expect the staker to be existing? + */ + const assertRewardsAssigned = async ( + beforeData: StakingData, + afterData: StakingData, + isExistingStaker: boolean, + shouldResetRewards = false, + ): Promise => { + const timeAfter = await getTimestamp() + const periodIsFinished = BN.from(timeAfter).gt(beforeData.contractData.periodFinishTime) + // LastUpdateTime + expect( + periodIsFinished + ? beforeData.contractData.periodFinishTime + : beforeData.contractData.rewardPerTokenStored.eq(0) && beforeData.boostBalance.totalSupply.eq(0) + ? beforeData.contractData.lastUpdateTime + : timeAfter, + ).to.be.eq(afterData.contractData.lastUpdateTime) + // RewardRate doesnt change + expect(beforeData.contractData.rewardRate).to.be.eq(afterData.contractData.rewardRate) + // RewardPerTokenStored goes up + expect(afterData.contractData.rewardPerTokenStored).to.be.gte(beforeData.contractData.rewardPerTokenStored) + // Calculate exact expected 'rewardPerToken' increase since last update + const timeApplicableToRewards = periodIsFinished + ? beforeData.contractData.periodFinishTime.sub(beforeData.contractData.lastUpdateTime) + : timeAfter.sub(beforeData.contractData.lastUpdateTime) + const increaseInRewardPerToken = beforeData.boostBalance.totalSupply.eq(BN.from(0)) + ? BN.from(0) + : beforeData.contractData.rewardRate.mul(timeApplicableToRewards).mul(fullScale).div(beforeData.boostBalance.totalSupply) + expect(beforeData.contractData.rewardPerTokenStored.add(increaseInRewardPerToken)).to.be.eq( + afterData.contractData.rewardPerTokenStored, + ) + // Expect updated personal state + // userRewardPerTokenPaid(beneficiary) should update + expect(afterData.userData.rewardPerTokenPaid).to.be.eq(afterData.userData.rewardPerTokenPaid) + + const increaseInUserRewardPerToken = afterData.contractData.rewardPerTokenStored.sub(beforeData.userData.rewardPerTokenPaid) + const assignment = beforeData.boostBalance.balance.mul(increaseInUserRewardPerToken).div(fullScale) + // If existing staker, then rewards Should increase + if (shouldResetRewards) { + expect(afterData.userData.rewards).to.be.eq(BN.from(0)) + } else if (isExistingStaker) { + // rewards(beneficiary) should update with previously accrued tokens + expect(beforeData.userData.rewards.add(unlockedRewards(assignment))).to.be.eq(afterData.userData.rewards) + } else { + // else `rewards` should stay the same + expect(beforeData.userData.rewards).to.be.eq(afterData.userData.rewards) + } + + // If existing staker, then a new entry should be appended + const newRewards = afterData.contractData.rewardPerTokenStored.gt(beforeData.userData.rewardPerTokenPaid) + if (isExistingStaker && newRewards) { + const newLockEntry = afterData.userRewards[afterData.userData.rewardCount - 1] + expect(newLockEntry.start).to.be.eq(beforeData.userData.lastAction.add(lockupPeriod)) + expect(newLockEntry.finish).to.be.eq(afterData.userData.lastAction.add(lockupPeriod)) + const elapsed = afterData.userData.lastAction.sub(beforeData.userData.lastAction) + expect(newLockEntry.rate).to.be.eq(lockedRewards(assignment).div(elapsed)) + expect(afterData.userData.lastAction).to.be.eq(timeAfter) + } else { + expect(beforeData.userRewards.length).eq(afterData.userRewards.length) + expect(beforeData.userData.rewardCount).eq(afterData.userData.rewardCount) + expect(afterData.userData.lastAction).to.be.eq(timeAfter) + expect(beforeData.userData.userClaim).to.be.eq(afterData.userData.userClaim) + } + } + + /** + * @dev Ensures a stake is successful, updates the rewards for the beneficiary and + * collects the stake + * @param stakeAmount Exact units to stake + * @param sender Sender of the tx + * @param beneficiary Beneficiary of the stake + * @param confirmExistingStaker Expect the staker to be existing? + */ + const expectSuccessfulStake = async ( + stakeAmount: BN, + sender = sa.default, + beneficiary = sa.default, + confirmExistingStaker = false, + ): Promise => { + // 1. Get data from the contract + const senderIsBeneficiary = sender === beneficiary + const beforeData = await snapshotStakingData(sender, beneficiary) + + const isExistingStaker = beforeData.boostBalance.raw.gt(BN.from(0)) + if (confirmExistingStaker) { + expect(isExistingStaker).eq(true) + } + // 2. Approve staking token spending and send the TX + await iMasset.connect(sender.signer).approve(savingsVault.address, stakeAmount) + const tx = senderIsBeneficiary + ? savingsVault.connect(sender.signer)["stake(uint256)"](stakeAmount) + : savingsVault.connect(sender.signer)["stake(address,uint256)"](beneficiary.address, stakeAmount) + await expect(tx).to.emit(savingsVault, "Staked").withArgs(beneficiary.address, stakeAmount, sender.address) + + // 3. Ensure rewards are accrued to the beneficiary + const afterData = await snapshotStakingData(sender, beneficiary) + const expectedBoost = boost(afterData.boostBalance.raw, calcBoost(afterData.boostBalance.raw, afterData.vMTABalance)) + await assertRewardsAssigned(beforeData, afterData, isExistingStaker) + + // 4. Expect token transfer + // StakingToken balance of sender + expect(beforeData.tokenBalance.sender.sub(stakeAmount)).to.be.eq(afterData.tokenBalance.sender) + // StakingToken balance of StakingRewards + expect(beforeData.tokenBalance.contract.add(stakeAmount)).to.be.eq(afterData.tokenBalance.contract) + // TotalSupply of StakingRewards + expect( + beforeData.boostBalance.totalSupply.sub(beforeData.boostBalance.balance).add(expectedBoost), + "Boost should affect total supply", + ).to.be.eq(afterData.boostBalance.totalSupply) + } + + /** + * @dev Ensures a funding is successful, checking that it updates the rewardRate etc + * @param rewardUnits Number of units to stake + */ + const expectSuccesfulFunding = async (rewardUnits: BN): Promise => { + const beforeData = await snapshotStakingData() + const tx = savingsVault.connect(rewardsDistributor.signer).notifyRewardAmount(rewardUnits) + await expect(tx).to.emit(savingsVault, "RewardAdded").withArgs(rewardUnits) + + const cur = BN.from(await getTimestamp()) + const leftOverRewards = beforeData.contractData.rewardRate.mul( + beforeData.contractData.periodFinishTime.sub(beforeData.contractData.lastTimeRewardApplicable), + ) + const afterData = await snapshotStakingData() + + // Sets lastTimeRewardApplicable to latest + expect(cur).to.be.eq(afterData.contractData.lastTimeRewardApplicable) + // Sets lastUpdateTime to latest + expect(cur).to.be.eq(afterData.contractData.lastUpdateTime) + // Sets periodFinish to 1 week from now + expect(cur.add(ONE_WEEK)).to.be.eq(afterData.contractData.periodFinishTime) + // Sets rewardRate to rewardUnits / ONE_WEEK + if (leftOverRewards.gt(0)) { + const total = rewardUnits.add(leftOverRewards) + assertBNClose( + total.div(ONE_WEEK), + afterData.contractData.rewardRate, + beforeData.contractData.rewardRate.div(ONE_WEEK).mul(5), // the effect of 1 second on the future scale + ) + } else { + expect(rewardUnits.div(ONE_WEEK)).to.be.eq(afterData.contractData.rewardRate) + } + } + + /** + * @dev Makes a withdrawal from the contract, and ensures that resulting state is correct + * and the rewards have been applied + * @param withdrawAmount Exact amount to withdraw + * @param sender User to execute the tx + */ + const expectStakingWithdrawal = async (withdrawAmount: BN, sender = sa.default): Promise => { + // 1. Get data from the contract + const beforeData = await snapshotStakingData(sender) + const isExistingStaker = beforeData.boostBalance.raw.gt(BN.from(0)) + expect(isExistingStaker).eq(true) + expect(withdrawAmount).to.be.gte(beforeData.boostBalance.raw) + + // 2. Send withdrawal tx + const tx = savingsVault.connect(sender.signer).withdraw(withdrawAmount) + await expect(tx).to.emit(savingsVault, "Withdrawn").withArgs(sender.address, withdrawAmount) + + // 3. Expect Rewards to accrue to the beneficiary + // StakingToken balance of sender + const afterData = await snapshotStakingData(sender) + await assertRewardsAssigned(beforeData, afterData, isExistingStaker) + + // 4. Expect token transfer + // StakingToken balance of sender + expect(beforeData.tokenBalance.sender.add(withdrawAmount)).to.be.eq(afterData.tokenBalance.sender) + // Withdraws from the actual rewards wrapper token + expect(beforeData.boostBalance.raw.sub(withdrawAmount)).to.be.eq(afterData.boostBalance.raw) + // Updates total supply + expect(beforeData.boostBalance.totalSupply.sub(beforeData.boostBalance.balance).add(afterData.boostBalance.balance)).to.be.eq( + afterData.boostBalance.totalSupply, + ) + } + + context("initialising and staking in a new pool", () => { + describe("notifying the pool of reward", () => { + it("should begin a new period through", async () => { + const rewardUnits = simpleToExactAmount(1, 18) + await expectSuccesfulFunding(rewardUnits) + }) + }) + describe("staking in the new period", () => { + it("should assign rewards to the staker", async () => { + // Do the stake + const rewardRate = await savingsVault.rewardRate() + const stakeAmount = simpleToExactAmount(100, 18) + const boosted = boost(stakeAmount, minBoost) + await expectSuccessfulStake(stakeAmount) + expect(boosted).to.be.eq(await savingsVault.balanceOf(sa.default.address)) + + await increaseTime(ONE_DAY) + + // This is the total reward per staked token, since the last update + const rewardPerToken = await savingsVault.rewardPerToken() + const rewardPerSecond = rewardRate.mul(fullScale).div(boosted) + assertBNClose(rewardPerToken, ONE_DAY.mul(rewardPerSecond), rewardPerSecond.mul(10)) + + // Calc estimated unclaimed reward for the user + // earned == balance * (rewardPerToken-userExistingReward) + const earned = await savingsVault.earned(sa.default.address) + expect(unlockedRewards(boosted.mul(rewardPerToken).div(fullScale))).to.be.eq(earned) + + await stakingContract.setBalanceOf(sa.default.address, simpleToExactAmount(1, 21)) + await savingsVault.pokeBoost(sa.default.address) + }) + it("should update stakers rewards after consequent stake", async () => { + const stakeAmount = simpleToExactAmount(100, 18) + // This checks resulting state after second stake + await expectSuccessfulStake(stakeAmount, sa.default, sa.default, true) + }) + + it("should fail if stake amount is 0", async () => { + await expect(savingsVault["stake(uint256)"](0)).to.be.revertedWith("Cannot stake 0") + }) + it("should fail if beneficiary is empty", async () => { + await expect(savingsVault.connect(sa.default.signer)["stake(address,uint256)"](ZERO_ADDRESS, 1)).to.be.revertedWith( + "Invalid beneficiary address", + ) + }) + + it("should fail if staker has insufficient balance", async () => { + await iMasset.connect(sa.dummy2.signer).approve(savingsVault.address, 1) + await expect(savingsVault.connect(sa.dummy2.signer)["stake(uint256)"](1)).to.be.revertedWith("VM Exception") + }) + }) + }) + context("funding with too much rewards", () => { + before(async () => { + savingsVault = await redeployRewards() + }) + it("should fail", async () => { + await expect(savingsVault.connect(sa.fundManager.signer).notifyRewardAmount(simpleToExactAmount(1, 25))).to.be.revertedWith( + "Cannot notify with more than a million units", + ) + }) + }) + context("staking before rewards are added", () => { + before(async () => { + savingsVault = await redeployRewards() + }) + it("should assign no rewards", async () => { + // Get data before + const stakeAmount = simpleToExactAmount(100, 18) + const beforeData = await snapshotStakingData() + expect(beforeData.contractData.rewardRate).to.be.eq(BN.from(0)) + expect(beforeData.contractData.rewardPerTokenStored).to.be.eq(BN.from(0)) + expect(beforeData.userData.rewards).to.be.eq(BN.from(0)) + expect(beforeData.boostBalance.totalSupply).to.be.eq(BN.from(0)) + expect(beforeData.contractData.lastTimeRewardApplicable).to.be.eq(BN.from(0)) + + // Do the stake + await expectSuccessfulStake(stakeAmount) + + // Wait a day + await increaseTime(ONE_DAY) + + // Do another stake + await expectSuccessfulStake(stakeAmount) + + // Get end results + const afterData = await snapshotStakingData() + expect(afterData.contractData.rewardRate).to.be.eq(BN.from(0)) + expect(afterData.contractData.rewardPerTokenStored).to.be.eq(BN.from(0)) + expect(afterData.userData.rewards).to.be.eq(BN.from(0)) + expect(afterData.boostBalance.totalSupply).to.be.eq(stakeAmount) + expect(afterData.contractData.lastTimeRewardApplicable).to.be.eq(BN.from(0)) + }) + }) + + context("calculating a users boost", async () => { + context("with a price coefficient of 30000 bucks", () => { + // 1 mBTC = 30k, 1 imBTC = 3k + const priceCoeffOverride = simpleToExactAmount(3000, 18) + beforeEach(async () => { + savingsVault = await redeployRewards(priceCoeffOverride) + }) + // 10k imUSD = 1k $ = 0.33 imBTC + it("should calculate boost for 10k imUSD stake and 250 vMTA", async () => { + const deposit = simpleToExactAmount(3333, 14) + const stake = simpleToExactAmount(250, 18) + const expectedBoost = simpleToExactAmount(49995, 13) + + await expectSuccessfulStake(deposit) + await stakingContract.setBalanceOf(sa.default.address, stake) + await savingsVault.pokeBoost(sa.default.address) + + const balance = await savingsVault.balanceOf(sa.default.address) + expect(balance).to.be.eq(expectedBoost) + expect(boost(deposit, calcBoost(deposit, stake, priceCoeffOverride))).to.be.eq(expectedBoost) + + const ratio = await savingsVault.getBoost(sa.default.address) + expect(ratio).to.be.eq(maxBoost) + }) + // 10k imUSD = 1k $ = 0.33 imBTC + it("should calculate boost for 10k imUSD stake and 50 vMTA", async () => { + const deposit = simpleToExactAmount(3333, 14) + const stake = simpleToExactAmount(50, 18) + const expectedBoost = simpleToExactAmount("4036.263", 14) + + await expectSuccessfulStake(deposit) + await stakingContract.setBalanceOf(sa.default.address, stake) + await savingsVault.pokeBoost(sa.default.address) + + const balance = await savingsVault.balanceOf(sa.default.address) + assertBNClosePercent(balance, expectedBoost, "1") + assertBNClosePercent(boost(deposit, calcBoost(deposit, stake, priceCoeffOverride)), expectedBoost, "0.1") + + const ratio = await savingsVault.getBoost(sa.default.address) + assertBNClosePercent(ratio, simpleToExactAmount(1.211, 18), "0.1") + }) + // 100k imUSD = 10k $ = 3.33 imBTC + it("should calculate boost for 100k imUSD stake and 500 vMTA", async () => { + const deposit = simpleToExactAmount(3333, 15) + const stake = simpleToExactAmount(500, 18) + const expectedBoost = simpleToExactAmount("4829.517", 15) + + await expectSuccessfulStake(deposit) + await stakingContract.setBalanceOf(sa.default.address, stake) + await savingsVault.pokeBoost(sa.default.address) + + const balance = await savingsVault.balanceOf(sa.default.address) + assertBNClosePercent(balance, expectedBoost, "1") + assertBNClosePercent(boost(deposit, calcBoost(deposit, stake, priceCoeffOverride)), expectedBoost, "0.1") + + const ratio = await savingsVault.getBoost(sa.default.address) + assertBNClosePercent(ratio, simpleToExactAmount(1.449, 18), "0.1") + }) + }) + + context("with a price coefficient of 10 cents", () => { + beforeEach(async () => { + savingsVault = await redeployRewards() + }) + describe("when saving and with staking balance", () => { + it("should calculate boost for 10k imUSD stake and 250 vMTA", async () => { + const deposit = simpleToExactAmount(10000) + const stake = simpleToExactAmount(250, 18) + const expectedBoost = simpleToExactAmount(15000) + + await expectSuccessfulStake(deposit) + await stakingContract.setBalanceOf(sa.default.address, stake) + await savingsVault.pokeBoost(sa.default.address) + + const balance = await savingsVault.balanceOf(sa.default.address) + expect(balance).to.be.eq(expectedBoost) + expect(boost(deposit, calcBoost(deposit, stake))).to.be.eq(expectedBoost) + + const ratio = await savingsVault.getBoost(sa.default.address) + expect(ratio).to.be.eq(maxBoost) + }) + it("should calculate boost for 10k imUSD stake and 50 vMTA", async () => { + const deposit = simpleToExactAmount(10000, 18) + const stake = simpleToExactAmount(50, 18) + const expectedBoost = simpleToExactAmount(12110, 18) + + await expectSuccessfulStake(deposit) + await stakingContract.setBalanceOf(sa.default.address, stake) + await savingsVault.pokeBoost(sa.default.address) + + const balance = await savingsVault.balanceOf(sa.default.address) + assertBNClosePercent(balance, expectedBoost, "1") + assertBNClosePercent(boost(deposit, calcBoost(deposit, stake)), expectedBoost, "0.1") + const ratio = await savingsVault.getBoost(sa.default.address) + assertBNClosePercent(ratio, simpleToExactAmount(1.211, 18), "0.1") + }) + it("should calculate boost for 100k imUSD stake and 500 vMTA", async () => { + const deposit = simpleToExactAmount(100000, 18) + const stake = simpleToExactAmount(500, 18) + const expectedBoost = simpleToExactAmount(144900, 18) + + await expectSuccessfulStake(deposit) + await stakingContract.setBalanceOf(sa.default.address, stake) + await savingsVault.pokeBoost(sa.default.address) + + const balance = await savingsVault.balanceOf(sa.default.address) + assertBNClosePercent(balance, expectedBoost, "1") + assertBNClosePercent(boost(deposit, calcBoost(deposit, stake)), expectedBoost, "0.1") + + const ratio = await savingsVault.getBoost(sa.default.address) + assertBNClosePercent(ratio, simpleToExactAmount(1.449, 18), "0.1") + }) + }) + describe("when saving with low staking balance and high vMTA", () => { + it("should give no boost due to below min threshold", async () => { + const deposit = simpleToExactAmount(5, 17) + const stake = simpleToExactAmount(800, 18) + const expectedBoost = simpleToExactAmount(25, 16) + + await expectSuccessfulStake(deposit) + await stakingContract.setBalanceOf(sa.default.address, stake) + await savingsVault.pokeBoost(sa.default.address) + + const balance = await savingsVault.balanceOf(sa.default.address) + assertBNClosePercent(balance, expectedBoost, "1") + assertBNClosePercent(boost(deposit, calcBoost(deposit, stake)), expectedBoost, "0.1") + + const ratio = await savingsVault.getBoost(sa.default.address) + assertBNClosePercent(ratio, minBoost, "0.1") + }) + }) + describe("when saving and with staking balance = 0", () => { + it("should give no boost", async () => { + const deposit = simpleToExactAmount(100, 18) + const expectedBoost = simpleToExactAmount(50, 18) + + await expectSuccessfulStake(deposit) + + const balance = await savingsVault.balanceOf(sa.default.address) + assertBNClosePercent(balance, expectedBoost, "1") + assertBNClosePercent(boost(deposit, minBoost), expectedBoost, "0.1") + + const ratio = await savingsVault.getBoost(sa.default.address) + assertBNClosePercent(ratio, minBoost, "0.1") + }) + }) + describe("when withdrawing and with staking balance", () => { + it("should set boost to 0 and update total supply", async () => { + const deposit = simpleToExactAmount(100, 18) + const stake = simpleToExactAmount(800, 18) + + await expectSuccessfulStake(deposit) + await stakingContract.setBalanceOf(sa.default.address, stake) + await savingsVault.pokeBoost(sa.default.address) + + await increaseTime(ONE_WEEK) + await savingsVault["exit()"]() + + const balance = await savingsVault.balanceOf(sa.default.address) + const raw = await savingsVault.rawBalanceOf(sa.default.address) + const supply = await savingsVault.totalSupply() + + expect(balance).to.be.eq(BN.from(0)) + expect(raw).to.be.eq(BN.from(0)) + expect(supply).to.be.eq(BN.from(0)) + }) + }) + describe("when staking and then updating vMTA balance", () => { + it("should start accruing more rewards", async () => { + // Alice vs Bob + // 1. Pools are funded + // 2. Alice and Bob both deposit 100 and have no MTA + // 3. wait half a week + // 4. Alice increases MTA stake to get max boost + // 5. Both users are poked + // 6. Wait half a week + // 7. Both users are poked + // 8. Alice accrued 3x the rewards in the second entry + const alice = sa.default + const bob = sa.dummy1 + // 1. + const hunnit = simpleToExactAmount(100, 18) + await rewardToken.connect(rewardsDistributor.signer).transfer(savingsVault.address, hunnit) + await expectSuccesfulFunding(hunnit) + + // 2. + await expectSuccessfulStake(hunnit) + await expectSuccessfulStake(hunnit, sa.default, bob) + + // 3. + await increaseTime(ONE_WEEK.div(2)) + + // 4. + await stakingContract.setBalanceOf(alice.address, hunnit) + + // 5. + await savingsVault.pokeBoost(alice.address) + await savingsVault.pokeBoost(bob.address) + + // 6. + await increaseTime(ONE_WEEK.div(2)) + + // 7. + await savingsVault.pokeBoost(alice.address) + await savingsVault.pokeBoost(bob.address) + + // 8. + const aliceData = await snapshotStakingData(alice, alice) + const bobData = await snapshotStakingData(bob, bob) + + assertBNClosePercent(aliceData.userRewards[1].rate, bobData.userRewards[1].rate.mul(3), "0.1") + }) + }) + }) + }) + context("adding first stake days after funding", () => { + before(async () => { + savingsVault = await redeployRewards() + }) + it("should retrospectively assign rewards to the first staker", async () => { + await expectSuccesfulFunding(simpleToExactAmount(100, 18)) + // Do the stake + const rewardRate = await savingsVault.rewardRate() + + await increaseTime(FIVE_DAYS) + + const stakeAmount = simpleToExactAmount(100, 18) + const boosted = boost(stakeAmount, minBoost) + await expectSuccessfulStake(stakeAmount) + // await increaseTime(ONE_DAY); + + // This is the total reward per staked token, since the last update + const rewardPerToken = await savingsVault.rewardPerToken() + + // e.g. 1e15 * 1e18 / 50e18 = 2e13 + const rewardPerSecond = rewardRate.mul(fullScale).div(boosted) + assertBNClosePercent(rewardPerToken, FIVE_DAYS.mul(rewardPerSecond), "0.01") + // Calc estimated unclaimed reward for the user + // earned == balance * (rewardPerToken-userExistingReward) + const earnedAfterConsequentStake = await savingsVault.earned(sa.default.address) + expect(unlockedRewards(boosted.mul(rewardPerToken).div(fullScale))).to.be.eq(earnedAfterConsequentStake) + await stakingContract.setBalanceOf(sa.default.address, simpleToExactAmount(1, 21)) + await savingsVault.pokeBoost(sa.default.address) + }) + }) + context("staking over multiple funded periods", () => { + context("with a single staker", () => { + before(async () => { + savingsVault = await redeployRewards() + }) + it("should assign all the rewards from the periods", async () => { + const fundAmount1 = simpleToExactAmount(100, 18) + const fundAmount2 = simpleToExactAmount(200, 18) + await expectSuccesfulFunding(fundAmount1) + + const stakeAmount = simpleToExactAmount(1, 18) + await expectSuccessfulStake(stakeAmount) + + await increaseTime(ONE_WEEK.mul(2)) + + await expectSuccesfulFunding(fundAmount2) + + await increaseTime(ONE_WEEK.mul(2)) + + const earned = await savingsVault.earned(sa.default.address) + assertBNSlightlyGT(unlockedRewards(fundAmount1.add(fundAmount2)), earned, BN.from(1000000), false) + + await stakingContract.setBalanceOf(sa.default.address, simpleToExactAmount(1, 21)) + await savingsVault.pokeBoost(sa.default.address) + }) + }) + context("with multiple stakers coming in and out", () => { + const fundAmount1 = simpleToExactAmount(100, 21) + const fundAmount2 = simpleToExactAmount(200, 21) + let staker2: Account + let staker3: Account + const staker1Stake1 = simpleToExactAmount(100, 18) + const staker1Stake2 = simpleToExactAmount(200, 18) + const staker2Stake = simpleToExactAmount(100, 18) + const staker3Stake = simpleToExactAmount(100, 18) + + before(async () => { + savingsVault = await redeployRewards() + staker2 = sa.dummy1 + staker3 = sa.dummy2 + await iMasset.transfer(staker2.address, staker2Stake) + await iMasset.transfer(staker3.address, staker3Stake) + }) + it("should accrue rewards on a pro rata basis", async () => { + /* + * 0 1 2 <-- Weeks + * [ - - - - - - ] [ - - - - - - ] + * 100k 200k <-- Funding + * +100 +200 <-- Staker 1 + * +100 <-- Staker 2 + * +100 -100 <-- Staker 3 + * + * Staker 1 gets 25k + 16.66k from week 1 + 150k from week 2 = 191.66k + * Staker 2 gets 16.66k from week 1 + 50k from week 2 = 66.66k + * Staker 3 gets 25k + 16.66k from week 1 + 0 from week 2 = 41.66k + */ + + // WEEK 0-1 START + await expectSuccessfulStake(staker1Stake1) + await expectSuccessfulStake(staker3Stake, staker3, staker3) + + await expectSuccesfulFunding(fundAmount1) + + await increaseTime(ONE_WEEK.div(2).add(1)) + + await expectSuccessfulStake(staker2Stake, staker2, staker2) + + await increaseTime(ONE_WEEK.div(2).add(1)) + + // WEEK 1-2 START + await expectSuccesfulFunding(fundAmount2) + + await savingsVault.connect(staker3.signer).withdraw(staker3Stake) + await expectSuccessfulStake(staker1Stake2, sa.default, sa.default, true) + + await increaseTime(ONE_WEEK) + + // WEEK 2 FINISH + const earned1 = await savingsVault.earned(sa.default.address) + assertBNClose(earned1, unlockedRewards(simpleToExactAmount("191.66", 21)), simpleToExactAmount(1, 19)) + const earned2 = await savingsVault.earned(staker2.address) + assertBNClose(earned2, unlockedRewards(simpleToExactAmount("66.66", 21)), simpleToExactAmount(1, 19)) + const earned3 = await savingsVault.earned(staker3.address) + assertBNClose(earned3, unlockedRewards(simpleToExactAmount("41.66", 21)), simpleToExactAmount(1, 19)) + // Ensure that sum of earned rewards does not exceed funding amount + expect(fundAmount1.add(fundAmount2)).to.be.gte(earned1.add(earned2).add(earned3)) + }) + }) + }) + context("staking after period finish", () => { + const fundAmount1 = simpleToExactAmount(100, 21) + + before(async () => { + savingsVault = await redeployRewards() + }) + it("should stop accruing rewards after the period is over", async () => { + await expectSuccessfulStake(simpleToExactAmount(1, 18)) + await expectSuccesfulFunding(fundAmount1) + + await increaseTime(ONE_WEEK.add(1)) + + const earnedAfterWeek = await savingsVault.earned(sa.default.address) + + await increaseTime(ONE_WEEK.add(1)) + const now = await getTimestamp() + + const earnedAfterTwoWeeks = await savingsVault.earned(sa.default.address) + + expect(earnedAfterWeek).to.be.eq(earnedAfterTwoWeeks) + + const lastTimeRewardApplicable = await savingsVault.lastTimeRewardApplicable() + assertBNClose(lastTimeRewardApplicable, now.sub(ONE_WEEK).sub(2), BN.from(2)) + }) + }) + context("staking on behalf of a beneficiary", () => { + const fundAmount = simpleToExactAmount(100, 21) + let beneficiary: Account + const stakeAmount = simpleToExactAmount(100, 18) + + before(async () => { + savingsVault = await redeployRewards() + beneficiary = sa.dummy1 + await expectSuccesfulFunding(fundAmount) + await expectSuccessfulStake(stakeAmount, sa.default, beneficiary) + await increaseTime(10) + }) + it("should update the beneficiaries reward details", async () => { + const earned = await savingsVault.earned(beneficiary.address) + expect(earned).to.be.gt(BN.from(0)) + + const rawBalance = await savingsVault.rawBalanceOf(beneficiary.address) + expect(rawBalance).to.be.eq(stakeAmount) + + const balance = await savingsVault.balanceOf(beneficiary.address) + expect(balance).to.be.eq(boost(stakeAmount, minBoost)) + }) + it("should not update the senders details", async () => { + const earned = await savingsVault.earned(sa.default.address) + expect(earned).to.be.eq(BN.from(0)) + + const balance = await savingsVault.balanceOf(sa.default.address) + expect(balance).to.be.eq(BN.from(0)) + }) + }) + + context("using staking / reward tokens with diff decimals", () => { + before(async () => { + rewardToken = await (await new MockERC20__factory(sa.default.signer)).deploy( + "Reward", + "RWD", + 12, + rewardsDistributor.address, + 10000000, + ) + iMasset = await (await new MockERC20__factory(sa.default.signer)).deploy( + "Interest bearing mUSD", + "imUSD", + 16, + sa.default.address, + 1000000, + ) + stakingContract = await (await new MockStakingContract__factory(sa.default.signer)).deploy() + + const vaultFactory = await new BoostedSavingsVault__factory(sa.default.signer) + const impl = await vaultFactory.deploy(nexus.address, iMasset.address, stakingContract.address, priceCoeff, rewardToken.address) + const data = impl.interface.encodeFunctionData("initialize", [rewardsDistributor.address]) + const proxy = await (await new AssetProxy__factory(sa.default.signer)).deploy(impl.address, sa.dummy4.address, data) + savingsVault = vaultFactory.attach(proxy.address) + }) + it("should not affect the pro rata payouts", async () => { + // Add 100 reward tokens + await expectSuccesfulFunding(simpleToExactAmount(100, 12)) + const rewardRate = await savingsVault.rewardRate() + + // Do the stake + const stakeAmount = simpleToExactAmount(100, 16) + const boosted = boost(stakeAmount, minBoost) + await expectSuccessfulStake(stakeAmount) + + await increaseTime(ONE_WEEK.add(1)) + + // This is the total reward per staked token, since the last update + const rewardPerToken = await savingsVault.rewardPerToken() + assertBNClose( + rewardPerToken, + ONE_WEEK.mul(rewardRate).mul(fullScale).div(boosted), + BN.from(1).mul(rewardRate).mul(fullScale).div(boosted), + ) + + // Calc estimated unclaimed reward for the user + // earned == balance * (rewardPerToken-userExistingReward) + const earnedAfterConsequentStake = await savingsVault.earned(sa.default.address) + assertBNSlightlyGT(unlockedRewards(simpleToExactAmount(100, 12)), earnedAfterConsequentStake, simpleToExactAmount(1, 9)) + }) + }) + + context("claiming rewards", async () => { + const fundAmount = simpleToExactAmount(100, 21) + const stakeAmount = simpleToExactAmount(100, 18) + const unlocked = unlockedRewards(fundAmount) + + before(async () => { + savingsVault = await redeployRewards() + await expectSuccesfulFunding(fundAmount) + await rewardToken.connect(rewardsDistributor.signer).transfer(savingsVault.address, fundAmount) + await expectSuccessfulStake(stakeAmount, sa.default, sa.dummy2) + await increaseTime(ONE_WEEK.add(1)) + }) + it("should do nothing for a non-staker", async () => { + const beforeData = await snapshotStakingData(sa.dummy1, sa.dummy1) + await savingsVault.connect(sa.dummy1.signer).claimReward() + + const afterData = await snapshotStakingData(sa.dummy1, sa.dummy1) + expect(beforeData.userData.rewards).to.be.eq(BN.from(0)) + expect(afterData.userData.rewards).to.be.eq(BN.from(0)) + expect(afterData.tokenBalance.sender).to.be.eq(BN.from(0)) + expect(afterData.userData.rewardPerTokenPaid).to.be.eq(afterData.contractData.rewardPerTokenStored) + }) + it("should send all UNLOCKED rewards to the rewardee", async () => { + const beforeData = await snapshotStakingData(sa.dummy2, sa.dummy2) + const rewardeeBalanceBefore = await rewardToken.balanceOf(sa.dummy2.address) + expect(rewardeeBalanceBefore).to.be.eq(BN.from(0)) + const tx = savingsVault.connect(sa.dummy2.signer).claimReward() + await expect(tx).to.emit(savingsVault, "RewardPaid") + const afterData = await snapshotStakingData(sa.dummy2, sa.dummy2) + await assertRewardsAssigned(beforeData, afterData, true, true) + // Balance transferred to the rewardee + const rewardeeBalanceAfter = await rewardToken.balanceOf(sa.dummy2.address) + assertBNClose(rewardeeBalanceAfter, unlocked, simpleToExactAmount(1, 16)) + + // 'rewards' reset to 0 + expect(afterData.userData.rewards).to.be.eq(BN.from(0)) + // Paid up until the last block + expect(afterData.userData.rewardPerTokenPaid).to.be.eq(afterData.contractData.rewardPerTokenStored) + // Token balances dont change + expect(afterData.tokenBalance.sender).to.be.eq(beforeData.tokenBalance.sender) + expect(beforeData.boostBalance.balance).to.be.eq(afterData.boostBalance.balance) + }) + }) + context("claiming locked rewards", () => { + /* + * 0 1 2 3 .. 26 27 28 29 <-- Weeks + * 100k 100k 200k 100k <-- Funding + * [ 1 ][ 1.5 ][.5] + * ^ ^ ^ ^ <-- Staker + * stake p1 p2 withdraw + */ + + const hunnit = simpleToExactAmount(100, 21) + const sum = hunnit.mul(4) + const unlocked = unlockedRewards(sum) + + beforeEach(async () => { + savingsVault = await redeployRewards() + await rewardToken.connect(rewardsDistributor.signer).transfer(savingsVault.address, hunnit.mul(5)) + // t0 + await expectSuccesfulFunding(hunnit) + await expectSuccessfulStake(hunnit) + await increaseTime(ONE_WEEK.add(1)) + // t1 + await expectSuccesfulFunding(hunnit) + await savingsVault.pokeBoost(sa.default.address) + await increaseTime(ONE_WEEK.add(1)) + // t2 + await expectSuccesfulFunding(hunnit.mul(2)) + await increaseTime(ONE_WEEK.div(2)) + // t2x5 + await savingsVault.pokeBoost(sa.default.address) + await increaseTime(ONE_WEEK.div(2)) + // t3 + await expectSuccesfulFunding(hunnit) + }) + it("should fetch the unclaimed tranche data", async () => { + await expectStakingWithdrawal(hunnit) + await increaseTime(ONE_WEEK.mul(23)) + // t = 26 + let [amount, first, last] = await savingsVault.unclaimedRewards(sa.default.address) + assertBNClosePercent(amount, unlocked, "0.01") + expect(first).to.be.eq(BN.from(0)) + expect(last).to.be.eq(BN.from(0)) + + await increaseTime(ONE_WEEK.mul(3).div(2)) + + // t = 27.5 + ;[amount, first, last] = await savingsVault.unclaimedRewards(sa.default.address) + expect(first).to.be.eq(BN.from(0)) + expect(last).to.be.eq(BN.from(1)) + assertBNClosePercent(amount, unlocked.add(lockedRewards(simpleToExactAmount(166.666, 21))), "0.01") + + await increaseTime(ONE_WEEK.mul(5).div(2)) + + // t = 30 + ;[amount, first, last] = await savingsVault.unclaimedRewards(sa.default.address) + expect(first).to.be.eq(BN.from(0)) + expect(last).to.be.eq(BN.from(2)) + assertBNClosePercent(amount, unlocked.add(lockedRewards(simpleToExactAmount(400, 21))), "0.01") + }) + it("should claim all unlocked rewards over the tranches, and any immediate unlocks", async () => { + await expectStakingWithdrawal(hunnit) + await increaseTime(ONE_WEEK.mul(23)) + await increaseTime(ONE_WEEK.mul(3).div(2)) + + // t=27.5 + const expected = lockedRewards(simpleToExactAmount(166.666, 21)) + const allRewards = unlocked.add(expected) + let [amount, first, last] = await savingsVault.unclaimedRewards(sa.default.address) + expect(first).to.be.eq(BN.from(0)) + expect(last).to.be.eq(BN.from(1)) + assertBNClosePercent(amount, allRewards, "0.01") + + // claims all immediate unlocks + const dataBefore = await snapshotStakingData() + const t27x5 = await getTimestamp() + const tx = savingsVault["claimRewards(uint256,uint256)"](first, last) + await expect(tx).to.emit(savingsVault, "RewardPaid") + + // Gets now unclaimed rewards (0, since no time has passed) + ;[amount, first, last] = await savingsVault.unclaimedRewards(sa.default.address) + expect(first).to.be.eq(BN.from(1)) + expect(last).to.be.eq(BN.from(1)) + expect(amount).to.be.eq(BN.from(0)) + + const dataAfter = await snapshotStakingData() + + // Checks that data has been updated correctly + expect(dataAfter.boostBalance.totalSupply).to.be.eq(BN.from(0)) + expect(dataAfter.tokenBalance.sender).to.be.eq(dataBefore.tokenBalance.sender.add(amount)) + expect(dataAfter.userData.lastAction).to.be.eq(dataAfter.userData.userClaim) + assertBNClose(t27x5, dataAfter.userData.lastAction, 5) + expect(dataAfter.userData.rewards).to.be.eq(BN.from(0)) + + await expect(savingsVault["claimRewards(uint256,uint256)"](0, 0)).to.be.revertedWith("Invalid epoch") + + await increaseTime(100) + ;[amount, first, last] = await savingsVault.unclaimedRewards(sa.default.address) + expect(first).to.be.eq(BN.from(1)) + expect(last).to.be.eq(BN.from(1)) + assertBNClose(amount, dataAfter.userRewards[1].rate.mul(100), dataAfter.userRewards[1].rate.mul(3)) + + await savingsVault["claimRewards(uint256,uint256)"](1, 1) + + await increaseTime(ONE_DAY.mul(10)) + + await savingsVault["claimRewards(uint256,uint256)"](1, 1) + + const d3 = await snapshotStakingData() + expect(d3.userData.userClaim).to.be.eq(d3.userRewards[1].finish) + + await savingsVault["claimRewards(uint256,uint256)"](1, 1) + + const d4 = await snapshotStakingData() + expect(d4.userData.userClaim).to.be.eq(d4.userRewards[1].finish) + expect(d4.tokenBalance.sender).to.be.eq(d3.tokenBalance.sender) + }) + it("should claim rewards without being passed the params", async () => { + await expectStakingWithdrawal(hunnit) + await increaseTime(ONE_WEEK.mul(23)) + await increaseTime(ONE_WEEK.mul(3).div(2)) + + // t=27.5 + const expected = lockedRewards(simpleToExactAmount(166.666, 21)) + const allRewards = unlocked.add(expected) + let [amount, first, last] = await savingsVault.unclaimedRewards(sa.default.address) + expect(first).to.be.eq(BN.from(0)) + expect(last).to.be.eq(BN.from(1)) + assertBNClosePercent(amount, allRewards, "0.01") + + // claims all immediate unlocks + const dataBefore = await snapshotStakingData() + const t27x5 = await getTimestamp() + const tx = savingsVault["claimRewards()"]() + await expect(tx).to.emit(savingsVault, "RewardPaid") + + // Gets now unclaimed rewards (0, since no time has passed) + ;[amount, first, last] = await savingsVault.unclaimedRewards(sa.default.address) + expect(first).to.be.eq(BN.from(1)) + expect(last).to.be.eq(BN.from(1)) + expect(amount).to.be.eq(BN.from(0)) + + const dataAfter = await snapshotStakingData() + + // Checks that data has been updated correctly + expect(dataAfter.boostBalance.totalSupply).to.be.eq(BN.from(0)) + expect(dataAfter.tokenBalance.sender).to.be.eq(dataBefore.tokenBalance.sender.add(amount)) + expect(dataAfter.userData.lastAction).to.be.eq(dataAfter.userData.userClaim) + assertBNClose(t27x5, dataAfter.userData.lastAction, 5) + expect(dataAfter.userData.rewards).to.be.eq(BN.from(0)) + }) + it("should unlock all rewards after sufficient time has elapsed", async () => { + await expectStakingWithdrawal(hunnit) + await increaseTime(ONE_WEEK.mul(27)) + + // t=30 + const expected = lockedRewards(simpleToExactAmount(400, 21)) + const allRewards = unlocked.add(expected) + let [amount, first, last] = await savingsVault.unclaimedRewards(sa.default.address) + expect(first).to.be.eq(BN.from(0)) + expect(last).to.be.eq(BN.from(2)) + assertBNClosePercent(amount, allRewards, "0.01") + + // claims all immediate unlocks + const dataBefore = await snapshotStakingData() + const t30 = await getTimestamp() + const tx = savingsVault["claimRewards()"]() + await expect(tx).to.emit(savingsVault, "RewardPaid") + + // Gets now unclaimed rewards (0, since no time has passed) + ;[amount, first, last] = await savingsVault.unclaimedRewards(sa.default.address) + expect(first).to.be.eq(BN.from(2)) + expect(last).to.be.eq(BN.from(2)) + expect(amount).to.be.eq(BN.from(0)) + + const dataAfter = await snapshotStakingData() + + // Checks that data has been updated correctly + expect(dataAfter.boostBalance.totalSupply).to.be.eq(BN.from(0)) + expect(dataAfter.tokenBalance.sender).to.be.eq(dataBefore.tokenBalance.sender.add(amount)) + expect(dataAfter.userData.userClaim).to.be.eq(dataAfter.userRewards[2].finish) + assertBNClose(t30, dataAfter.userData.lastAction, 5) + expect(dataAfter.userData.rewards).to.be.eq(BN.from(0)) + }) + it("should break if we leave rewards unclaimed at the start or end", async () => { + await expectStakingWithdrawal(hunnit) + await increaseTime(ONE_WEEK.mul(25)) + + // t=28 + let [, first, last] = await savingsVault.unclaimedRewards(sa.default.address) + expect(first).to.be.eq(BN.from(0)) + expect(last).to.be.eq(BN.from(1)) + + await expect(savingsVault["claimRewards(uint256,uint256)"](1, 1)).to.be.revertedWith( + "Invalid _first arg: Must claim earlier entries", + ) + + await increaseTime(ONE_WEEK.mul(3)) + // t=31 + ;[, first, last] = await savingsVault.unclaimedRewards(sa.default.address) + expect(first).to.be.eq(BN.from(0)) + expect(last).to.be.eq(BN.from(2)) + + await savingsVault["claimRewards(uint256,uint256)"](0, 1) + + await savingsVault["claimRewards(uint256,uint256)"](1, 2) + + // then try to claim 0-2 again, and it should give nothing + const unclaimed = await savingsVault.unclaimedRewards(sa.default.address) + expect(unclaimed[0]).to.be.eq(BN.from(0)) + expect(unclaimed[1]).to.be.eq(BN.from(2)) + expect(unclaimed[2]).to.be.eq(BN.from(2)) + + const dataBefore = await snapshotStakingData() + await expect(savingsVault["claimRewards(uint256,uint256)"](0, 2)).to.be.revertedWith("Invalid epoch") + const dataAfter = await snapshotStakingData() + + expect(dataAfter.tokenBalance.sender).to.be.eq(dataBefore.tokenBalance.sender) + expect(dataAfter.userData.userClaim).to.be.eq(dataBefore.userData.userClaim) + }) + describe("with many array entries", () => { + it("should allow them all to be searched and claimed", async () => { + await rewardToken.connect(rewardsDistributor.signer).transfer(savingsVault.address, hunnit.mul(6)) + await increaseTime(ONE_WEEK) + // t4 + await savingsVault.pokeBoost(sa.default.address) + await expectSuccesfulFunding(hunnit) + await increaseTime(ONE_WEEK.div(2)) + // t4.5 + await savingsVault.pokeBoost(sa.default.address) + await increaseTime(ONE_WEEK.div(2)) + // t5 + await savingsVault.pokeBoost(sa.default.address) + await expectSuccesfulFunding(hunnit) + await increaseTime(ONE_WEEK.div(2)) + // t5.5 + await savingsVault.pokeBoost(sa.default.address) + await increaseTime(ONE_WEEK.div(2)) + // t6 + await savingsVault.pokeBoost(sa.default.address) + await expectSuccesfulFunding(hunnit) + await increaseTime(ONE_WEEK.div(2)) + // t6.5 + await savingsVault.pokeBoost(sa.default.address) + await increaseTime(ONE_WEEK.div(2)) + // t7 + await savingsVault.pokeBoost(sa.default.address) + await expectSuccesfulFunding(hunnit) + await increaseTime(ONE_WEEK.div(2)) + // t7.5 + await savingsVault.pokeBoost(sa.default.address) + await increaseTime(ONE_WEEK.div(2)) + // t8 + await savingsVault.pokeBoost(sa.default.address) + await expectSuccesfulFunding(hunnit) + await increaseTime(ONE_WEEK.div(2)) + // t8.5 + await savingsVault.pokeBoost(sa.default.address) + await increaseTime(ONE_WEEK.div(2)) + // t9 + await savingsVault.pokeBoost(sa.default.address) + await expectSuccesfulFunding(hunnit) + await increaseTime(ONE_WEEK.div(2)) + // t9.5 + await savingsVault.pokeBoost(sa.default.address) + await increaseTime(ONE_WEEK.div(2)) + // t10 + await savingsVault.pokeBoost(sa.default.address) + + // count = 1 + // t=28 + await increaseTime(ONE_WEEK.mul(18)) + let [amt, first, last] = await savingsVault.unclaimedRewards(sa.default.address) + expect(first).to.be.eq(BN.from(0)) + expect(last).to.be.eq(BN.from(1)) + + const data28 = await snapshotStakingData() + expect(data28.userData.userClaim).to.be.eq(BN.from(0)) + expect(data28.userData.rewardCount).eq(15) + + // t=32 + await increaseTime(ONE_WEEK.mul(4).sub(100)) + ;[amt, first, last] = await savingsVault.unclaimedRewards(sa.default.address) + expect(first).to.be.eq(BN.from(0)) + expect(last).to.be.eq(BN.from(6)) + await savingsVault["claimRewards(uint256,uint256)"](0, 6) + const data32 = await snapshotStakingData() + expect(data32.userData.userClaim).to.be.eq(data32.userData.lastAction) + ;[amt, first, last] = await savingsVault.unclaimedRewards(sa.default.address) + expect(amt).to.be.eq(BN.from(0)) + expect(first).to.be.eq(BN.from(6)) + expect(last).to.be.eq(BN.from(6)) + + // t=35 + await increaseTime(ONE_WEEK.mul(3)) + ;[amt, first, last] = await savingsVault.unclaimedRewards(sa.default.address) + expect(first).to.be.eq(BN.from(6)) + expect(last).to.be.eq(BN.from(12)) + + await savingsVault["claimRewards(uint256,uint256)"](6, 12) + const data35 = await snapshotStakingData() + expect(data35.userData.userClaim).to.be.eq(data35.userData.lastAction) + ;[amt, ,] = await savingsVault.unclaimedRewards(sa.default.address) + expect(amt).to.be.eq(BN.from(0)) + + await expect(savingsVault["claimRewards(uint256,uint256)"](0, 1)).to.be.revertedWith("Invalid epoch") + }) + }) + describe("with a one second entry", () => { + it("should allow it to be claimed", async () => { + await rewardToken.connect(rewardsDistributor.signer).transfer(savingsVault.address, hunnit) + await savingsVault.pokeBoost(sa.default.address) + await increaseTime(ONE_WEEK) + // t4 + await expectSuccesfulFunding(hunnit) + await savingsVault.pokeBoost(sa.default.address) + await savingsVault.pokeBoost(sa.default.address) + await savingsVault.pokeBoost(sa.default.address) + await savingsVault.pokeBoost(sa.default.address) + await savingsVault.pokeBoost(sa.default.address) + await savingsVault.pokeBoost(sa.default.address) + await savingsVault.pokeBoost(sa.default.address) + await increaseTime(ONE_WEEK.mul(26).sub(10)) + + // t30 + const data = await snapshotStakingData() + expect(data.userData.rewardCount).eq(10) + const r4 = data.userRewards[4] + const r5 = data.userRewards[5] + expect(r4.finish).to.be.eq(r5.start) + expect(r5.finish).to.be.eq(r5.start.add(1)) + expect(r4.rate).to.be.eq(r5.rate) + assertBNClosePercent(r4.rate, lockedRewards(data.contractData.rewardRate), "0.001") + + let [, first, last] = await savingsVault.unclaimedRewards(sa.default.address) + expect(first).to.be.eq(BN.from(0)) + expect(last).to.be.eq(BN.from(3)) + await savingsVault["claimRewards(uint256,uint256)"](0, 3) + await increaseTime(20) + ;[, first, last] = await savingsVault.unclaimedRewards(sa.default.address) + expect(first).to.be.eq(BN.from(3)) + expect(last).to.be.eq(BN.from(10)) + + await expect(savingsVault["claimRewards(uint256,uint256)"](0, 8)).to.be.revertedWith("Invalid epoch") + await savingsVault["claimRewards(uint256,uint256)"](3, 8) + await expect(savingsVault["claimRewards(uint256,uint256)"](6, 9)).to.be.revertedWith("Invalid epoch") + await savingsVault["claimRewards()"] + }) + }) + }) + + context("getting the reward token", () => { + before(async () => { + savingsVault = await redeployRewards() + }) + it("should simply return the rewards Token", async () => { + const readToken = await savingsVault.getRewardToken() + expect(readToken).eq(rewardToken.address) + expect(readToken).eq(await savingsVault.rewardsToken()) + }) + }) + + context("calling exit", () => { + const hunnit = simpleToExactAmount(100, 18) + beforeEach(async () => { + savingsVault = await redeployRewards() + await rewardToken.connect(rewardsDistributor.signer).transfer(savingsVault.address, hunnit) + await expectSuccesfulFunding(hunnit) + await expectSuccessfulStake(hunnit) + await increaseTime(ONE_WEEK.add(1)) + }) + context("with no raw balance but rewards unlocked", () => { + it("errors", async () => { + await savingsVault.withdraw(hunnit) + const beforeData = await snapshotStakingData() + expect(beforeData.boostBalance.totalSupply).to.be.eq(BN.from(0)) + await expect(savingsVault["exit()"]()).to.be.revertedWith("Cannot withdraw 0") + }) + }) + context("with raw balance", async () => { + it("withdraws everything and claims unlocked rewards", async () => { + const beforeData = await snapshotStakingData() + expect(beforeData.boostBalance.totalSupply).to.be.eq(simpleToExactAmount(50, 18)) + await savingsVault["exit()"]() + const afterData = await snapshotStakingData() + expect(afterData.userData.userClaim).to.be.eq(afterData.userData.lastAction) + expect(afterData.userData.rewards).to.be.eq(BN.from(0)) + expect(afterData.boostBalance.totalSupply).to.be.eq(BN.from(0)) + }) + }) + context("with unlocked rewards", () => { + it("claims unlocked epochs", async () => { + await savingsVault.pokeBoost(sa.default.address) + await increaseTime(ONE_WEEK.mul(27)) + + const [amount, first, last] = await savingsVault.unclaimedRewards(sa.default.address) + expect(first).to.be.eq(BN.from(0)) + expect(last).to.be.eq(BN.from(0)) + assertBNClosePercent(amount, hunnit, "0.01") + + // claims all immediate unlocks + const tx = savingsVault["exit(uint256,uint256)"](first, last) + await expect(tx).to.emit(savingsVault, "RewardPaid") + await expect(tx).to.emit(savingsVault, "Withdrawn").withArgs(sa.default.address, hunnit) + }) + }) + }) + + context("withdrawing stake or rewards", () => { + context("withdrawing a stake amount", () => { + const fundAmount = simpleToExactAmount(100, 21) + const stakeAmount = simpleToExactAmount(100, 18) + + before(async () => { + savingsVault = await redeployRewards() + await expectSuccesfulFunding(fundAmount) + await expectSuccessfulStake(stakeAmount) + await increaseTime(10) + }) + it("should revert for a non-staker", async () => { + await expect(savingsVault.connect(sa.dummy1.signer).withdraw(1)).to.be.revertedWith("VM Exception") + }) + it("should revert if insufficient balance", async () => { + await expect(savingsVault.connect(sa.default.signer).withdraw(stakeAmount.add(1))).to.be.revertedWith("VM Exception") + }) + it("should fail if trying to withdraw 0", async () => { + await expect(savingsVault.connect(sa.default.signer).withdraw(0)).to.be.revertedWith("Cannot withdraw 0") + }) + it("should withdraw the stake and update the existing reward accrual", async () => { + // Check that the user has earned something + const earnedBefore = await savingsVault.earned(sa.default.address) + expect(earnedBefore).to.be.gt(BN.from(0)) + const dataBefore = await snapshotStakingData() + expect(dataBefore.userData.rewards).to.be.eq(BN.from(0)) + + // Execute the withdrawal + await expectStakingWithdrawal(stakeAmount) + + // Ensure that the new awards are added + assigned to user + const earnedAfter = await savingsVault.earned(sa.default.address) + expect(earnedAfter).to.be.gte(earnedBefore) + const dataAfter = await snapshotStakingData() + expect(dataAfter.userData.rewards).to.be.eq(earnedAfter) + + // Zoom forward now + await increaseTime(10) + + // Check that the user does not earn anything else + const earnedEnd = await savingsVault.earned(sa.default.address) + expect(earnedEnd).to.be.eq(earnedAfter) + const dataEnd = await snapshotStakingData() + expect(dataEnd.userData.rewards).to.be.eq(dataAfter.userData.rewards) + + // Cannot withdraw anything else + await expect(savingsVault.connect(sa.default.signer).withdraw(stakeAmount.add(1))).to.be.revertedWith("VM Exception") + }) + }) + }) + + context("notifying new reward amount", () => { + context("from someone other than the distributor", () => { + before(async () => { + savingsVault = await redeployRewards() + }) + it("should fail", async () => { + await expect(savingsVault.connect(sa.default.signer).notifyRewardAmount(1)).to.be.revertedWith( + "Caller is not reward distributor", + ) + await expect(savingsVault.connect(sa.dummy1.signer).notifyRewardAmount(1)).to.be.revertedWith( + "Caller is not reward distributor", + ) + await expect(savingsVault.connect(sa.governor.signer).notifyRewardAmount(1)).to.be.revertedWith( + "Caller is not reward distributor", + ) + }) + }) + context("before current period finish", async () => { + const funding1 = simpleToExactAmount(100, 18) + const funding2 = simpleToExactAmount(200, 18) + beforeEach(async () => { + savingsVault = await redeployRewards() + }) + it("should factor in unspent units to the new rewardRate", async () => { + // Do the initial funding + await expectSuccesfulFunding(funding1) + const actualRewardRate = await savingsVault.rewardRate() + const expectedRewardRate = funding1.div(ONE_WEEK) + expect(expectedRewardRate).to.be.eq(actualRewardRate) + + // Zoom forward half a week + await increaseTime(ONE_WEEK.div(2)) + + // Do the second funding, and factor in the unspent units + const expectedLeftoverReward = funding1.div(2) + await expectSuccesfulFunding(funding2) + const actualRewardRateAfter = await savingsVault.rewardRate() + const totalRewardsForWeek = funding2.add(expectedLeftoverReward) + const expectedRewardRateAfter = totalRewardsForWeek.div(ONE_WEEK) + assertBNClose(actualRewardRateAfter, expectedRewardRateAfter, actualRewardRate.div(ONE_WEEK).mul(20)) + }) + it("should factor in unspent units to the new rewardRate if instant", async () => { + // Do the initial funding + await expectSuccesfulFunding(funding1) + const actualRewardRate = await savingsVault.rewardRate() + const expectedRewardRate = funding1.div(ONE_WEEK) + expect(expectedRewardRate).to.be.eq(actualRewardRate) + + // Zoom forward half a week + await increaseTime(1) + + // Do the second funding, and factor in the unspent units + await expectSuccesfulFunding(funding2) + const actualRewardRateAfter = await savingsVault.rewardRate() + const expectedRewardRateAfter = funding1.add(funding2).div(ONE_WEEK) + assertBNClose(actualRewardRateAfter, expectedRewardRateAfter, actualRewardRate.div(ONE_WEEK).mul(20)) + }) + }) + + context("after current period finish", () => { + const funding1 = simpleToExactAmount(100, 18) + before(async () => { + savingsVault = await redeployRewards() + }) + it("should start a new period with the correct rewardRate", async () => { + // Do the initial funding + await expectSuccesfulFunding(funding1) + const actualRewardRate = await savingsVault.rewardRate() + const expectedRewardRate = funding1.div(ONE_WEEK) + expect(expectedRewardRate).to.be.eq(actualRewardRate) + + // Zoom forward half a week + await increaseTime(ONE_WEEK.add(1)) + + // Do the second funding, and factor in the unspent units + await expectSuccesfulFunding(funding1.mul(2)) + const actualRewardRateAfter = await savingsVault.rewardRate() + const expectedRewardRateAfter = expectedRewardRate.mul(2) + expect(actualRewardRateAfter).to.be.eq(expectedRewardRateAfter) + }) + }) + }) +}) diff --git a/test/shared/ERC20.behaviour.ts b/test/shared/ERC20.behaviour.ts new file mode 100644 index 00000000..66cf3d68 --- /dev/null +++ b/test/shared/ERC20.behaviour.ts @@ -0,0 +1,321 @@ +import { expect } from "chai" + +import { BN } from "@utils/math" +import { Account, MassetMachine, MassetDetails } from "@utils/machines" + +import { ZERO_ADDRESS } from "@utils/constants" +import { Address } from "types/common" +import { ERC20 } from "types/generated/ERC20" + +export interface IERC20BehaviourContext { + token: ERC20 + mAssetMachine: MassetMachine + initialHolder: Account + recipient: Account + anotherAccount: Account + details: MassetDetails +} + +const shouldBehaveLikeERC20Transfer = ( + ctx: IERC20BehaviourContext, + errorPrefix: string, + balance: BN, + transfer: (token: ERC20, from: Account, to: Address, value: BN) => void, +): void => { + describe("when the ctx.recipient is not the zero address", () => { + describe("when the sender does not have enough balance", () => { + const amount = balance.add(1) + + it("reverts", async () => { + await expect(transfer(ctx.token, ctx.initialHolder, ctx.recipient.address, amount)).to.be.revertedWith( + "VM Exception while processing transaction: revert", + ) + }) + }) + + describe("when the sender transfers all balance", () => { + const amount = balance + + it("transfers the requested amount", async () => { + await transfer(ctx.token, ctx.initialHolder, ctx.recipient.address, amount) + + expect(await ctx.token.balanceOf(ctx.initialHolder.address)).to.be.equal("0") + + expect(await ctx.token.balanceOf(ctx.recipient.address)).to.be.equal(amount) + }) + + it("emits a transfer event", async () => { + const tx = transfer(ctx.token, ctx.initialHolder, ctx.recipient.address, amount) + await expect(tx).to.emit(ctx.token, "Transfer").withArgs(ctx.initialHolder.address, ctx.recipient.address, amount) + }) + }) + + describe("when the sender transfers zero tokens", () => { + const amount = BN.from("0") + + it("transfers the requested amount", async () => { + await transfer(ctx.token, ctx.initialHolder, ctx.recipient.address, amount) + + expect(await ctx.token.balanceOf(ctx.initialHolder.address)).to.be.equal(balance) + + expect(await ctx.token.balanceOf(ctx.recipient.address)).to.be.equal("0") + }) + + it("emits a transfer event", async () => { + const tx = transfer(ctx.token, ctx.initialHolder, ctx.recipient.address, amount) + + await expect(tx).to.emit(ctx.token, "Transfer").withArgs(ctx.initialHolder.address, ctx.recipient.address, amount) + }) + }) + }) + + describe("when the ctx.recipient is the zero address", () => { + it("reverts", async () => { + await expect(transfer(ctx.token, ctx.initialHolder, ZERO_ADDRESS, balance)).to.be.revertedWith( + `${errorPrefix}: transfer to the zero address`, + ) + }) + }) +} + +const shouldBehaveLikeERC20Approve = ( + ctx: IERC20BehaviourContext, + errorPrefix: string, + supply: BN, + approve: (owner: Account, spender: Address, amount: BN) => void, +): void => { + let owner: Account + let spender: Account + before(() => { + owner = ctx.initialHolder + spender = ctx.recipient + }) + describe("when the spender is not the zero address", () => { + describe("when the sender has enough balance", () => { + const amount = supply + + it("emits an approval event", async () => { + const tx = approve(owner, spender.address, amount) + + await expect(tx).to.emit(ctx.token, "Approval").withArgs(owner.address, spender.address, amount) + }) + + describe("when there was no approved amount before", () => { + it("approves the requested amount", async () => { + await approve(owner, spender.address, amount) + + expect(await ctx.token.allowance(owner.address, spender.address)).to.be.equal(amount) + }) + }) + + describe("when the spender had an approved amount", () => { + beforeEach(async () => { + await approve(owner, spender.address, BN.from(1)) + }) + + it("approves the requested amount and replaces the previous one", async () => { + await approve(owner, spender.address, amount) + + expect(await ctx.token.allowance(owner.address, spender.address)).to.be.equal(amount) + }) + }) + }) + + describe("when the sender does not have enough balance", () => { + const amount = supply.add(1) + + it("emits an approval event", async () => { + const tx = approve(owner, spender.address, amount) + + await expect(tx).to.emit(ctx.token, "Approval").withArgs(owner.address, spender.address, amount) + }) + + describe("when there was no approved amount before", () => { + it("approves the requested amount", async () => { + await approve(owner, spender.address, amount) + + expect(await ctx.token.allowance(owner.address, spender.address)).to.be.equal(amount) + }) + }) + + describe("when the spender had an approved amount", () => { + beforeEach(async () => { + await approve(owner, spender.address, BN.from(1)) + }) + + it("approves the requested amount and replaces the previous one", async () => { + await approve(owner, spender.address, amount) + + expect(await ctx.token.allowance(owner.address, spender.address)).to.be.equal(amount) + }) + }) + }) + }) + + describe("when the spender is the zero address", () => { + it("reverts", async () => { + await expect(approve(owner, ZERO_ADDRESS, supply)).to.be.revertedWith(`${errorPrefix}: approve to the zero address`) + }) + }) +} + +/** + * + * @param ctx is only resolved after the callers before and beforeAll functions are run. + * So initially ctx will be an empty object. The before and beforeAll will add the properties + * @param errorPrefix + * @param initialSupply + */ +export function shouldBehaveLikeERC20(ctx: IERC20BehaviourContext, errorPrefix: string, initialSupply: BN): void { + describe("total supply", () => { + it("returns the total amount of tokens", async () => { + expect(await ctx.token.totalSupply()).to.be.equal(initialSupply) + }) + }) + + describe("balanceOf", () => { + describe("when the requested account has no tokens", () => { + it("returns zero", async () => { + expect(await ctx.token.balanceOf(ctx.anotherAccount.address)).to.be.equal("0") + }) + }) + + describe("when the requested account has some tokens", () => { + it("returns the total amount of tokens", async () => { + expect(await ctx.token.balanceOf(ctx.initialHolder.address)).to.be.equal(initialSupply) + }) + }) + }) + + describe("transfer", () => { + shouldBehaveLikeERC20Transfer(ctx, errorPrefix, initialSupply, (token: ERC20, from: Account, to: Address, value: BN) => + token.connect(from.signer).transfer(to, value), + ) + }) + + describe("transfer from", () => { + let spender: Account + before(() => { + spender = ctx.recipient + }) + + describe("when the token owner is not the zero address", () => { + let tokenOwner: Account + before(() => { + tokenOwner = ctx.initialHolder + }) + + describe("when the ctx.recipient is not the zero address", () => { + let to: Account + before(() => { + to = ctx.anotherAccount + }) + + describe("when the spender has enough approved balance", () => { + beforeEach(async () => { + await ctx.token.connect(ctx.initialHolder.signer).approve(spender.address, initialSupply) + }) + + describe("when the token owner has enough balance", () => { + const amount = initialSupply + + it("transfers the requested amount", async () => { + await ctx.token.connect(spender.signer).transferFrom(tokenOwner.address, to.address, amount) + + expect(await ctx.token.balanceOf(tokenOwner.address)).to.be.equal("0") + + expect(await ctx.token.balanceOf(to.address)).to.be.equal(amount) + }) + + it("decreases the spender allowance", async () => { + await ctx.token.connect(spender.signer).transferFrom(tokenOwner.address, to.address, amount) + + expect(await ctx.token.allowance(tokenOwner.address, spender.address)).to.be.equal("0") + }) + + it("emits a transfer event", async () => { + const tx = ctx.token.connect(spender.signer).transferFrom(tokenOwner.address, to.address, amount) + await expect(tx).to.emit(ctx.token, "Transfer").withArgs(tokenOwner.address, to.address, amount) + }) + + it("emits an approval event", async () => { + const tx = ctx.token.connect(spender.signer).approve(to.address, amount) + await expect(tx) + .to.emit(ctx.token, "Approval") + .withArgs(spender.address, to.address, await ctx.token.allowance(spender.address, to.address)) + }) + }) + + describe("when the token owner does not have enough balance", () => { + it("reverts", async () => { + const amount = initialSupply.add(1) + await expect( + ctx.token.connect(spender.signer).transferFrom(tokenOwner.address, to.address, amount), + ).to.be.revertedWith(`VM Exception while processing transaction`) + }) + }) + }) + + describe("when the spender does not have enough approved balance", () => { + beforeEach(async () => { + await ctx.token.connect(tokenOwner.signer).approve(spender.address, initialSupply.sub(1)) + }) + + describe("when the token owner has enough balance", () => { + const amount = initialSupply + + it("reverts", async () => { + await expect( + ctx.token.connect(spender.signer).transferFrom(tokenOwner.address, to.address, amount), + ).to.be.revertedWith("VM Exception while processing transaction: revert") + }) + }) + + describe("when the token owner does not have enough balance", () => { + const amount = initialSupply.add(1) + + it("reverts", async () => { + await expect( + ctx.token.connect(spender.signer).transferFrom(tokenOwner.address, to.address, amount), + ).to.be.revertedWith("VM Exception while processing transaction: revert") + }) + }) + }) + }) + + describe("when the ctx.recipient is the zero address", () => { + const amount = initialSupply + const to = ZERO_ADDRESS + + beforeEach(async () => { + await ctx.token.connect(tokenOwner.signer).approve(spender.address, amount) + }) + + it("reverts", async () => { + await expect(ctx.token.connect(spender.signer).transferFrom(tokenOwner.address, to, amount)).to.be.revertedWith( + `${errorPrefix}: transfer to the zero address`, + ) + }) + }) + }) + + describe("when the token owner is the zero address", () => { + const amount = 0 + const tokenOwner = ZERO_ADDRESS + + it("reverts", async () => { + await expect(ctx.token.connect(spender.signer).transferFrom(tokenOwner, ctx.recipient.address, amount)).to.be.revertedWith( + `${errorPrefix}: transfer from the zero address`, + ) + }) + }) + }) + + describe("approve", () => { + shouldBehaveLikeERC20Approve(ctx, errorPrefix, initialSupply, (owner: Account, spender: Address, amount) => + ctx.token.connect(owner.signer).approve(spender, amount), + ) + }) +} + +export default shouldBehaveLikeERC20 diff --git a/test/shared/Module.behaviour.ts b/test/shared/Module.behaviour.ts new file mode 100644 index 00000000..b35fea27 --- /dev/null +++ b/test/shared/Module.behaviour.ts @@ -0,0 +1,26 @@ +import { StandardAccounts } from "@utils/machines" +import { expect } from "chai" +import { ZERO_ADDRESS } from "@utils/constants" +import { INexus__factory, ImmutableModule } from "types/generated" + +export interface IModuleBehaviourContext { + module: ImmutableModule + sa: StandardAccounts +} + +export function shouldBehaveLikeModule(ctx: IModuleBehaviourContext): void { + it("should have Nexus", async () => { + const nexusAddr = await ctx.module.nexus() + expect(nexusAddr).to.not.equal(ZERO_ADDRESS) + }) + + it("should have Governor address", async () => { + const nexusAddr = await ctx.module.nexus() + const nexus = await INexus__factory.connect(nexusAddr, ctx.sa.default.signer) + + const nexusGovernor = await nexus.governor() + expect(nexusGovernor).to.equal(ctx.sa.governor.address) + }) +} + +export default shouldBehaveLikeModule diff --git a/test/shared/RewardsDistributionRecipient.behaviour.ts b/test/shared/RewardsDistributionRecipient.behaviour.ts new file mode 100644 index 00000000..c0b8d15a --- /dev/null +++ b/test/shared/RewardsDistributionRecipient.behaviour.ts @@ -0,0 +1,38 @@ +import { expect } from "chai" +import { ZERO_ADDRESS } from "@utils/constants" +import { InitializableRewardsDistributionRecipient } from "types/generated" +import { IModuleBehaviourContext, shouldBehaveLikeModule } from "./Module.behaviour" + +function behaveLikeAModule(ctx: IModuleBehaviourContext): void { + return shouldBehaveLikeModule(ctx) +} + +export interface IRewardsDistributionRecipientContext extends IModuleBehaviourContext { + recipient: InitializableRewardsDistributionRecipient +} + +export function shouldBehaveLikeDistributionRecipient(ctx: IRewardsDistributionRecipientContext): void { + behaveLikeAModule(ctx as IModuleBehaviourContext) + + it("should have a distributor", async () => { + const distributor = await ctx.recipient.rewardsDistributor() + expect(distributor).not.eq(ZERO_ADDRESS) + }) + + it("should allow governor to change the distributor", async () => { + const newDistributor = ctx.sa.other + await ctx.recipient.connect(ctx.sa.governor.signer).setRewardsDistribution(newDistributor.address) + expect(await ctx.recipient.rewardsDistributor()).eq(newDistributor.address) + }) + + it("should prevent change from non-governor", async () => { + const newDistributor = ctx.sa.other + const oldDistributor = await ctx.recipient.rewardsDistributor() + await expect(ctx.recipient.connect(ctx.sa.default.signer).setRewardsDistribution(newDistributor.address)).to.be.revertedWith( + "Only governor can execute", + ) + expect(await ctx.recipient.rewardsDistributor()).eq(oldDistributor) + }) +} + +export default shouldBehaveLikeDistributionRecipient diff --git a/test/shared/TestCommonHelpers.spec.ts b/test/shared/TestCommonHelpers.spec.ts deleted file mode 100644 index 04d931da..00000000 --- a/test/shared/TestCommonHelpers.spec.ts +++ /dev/null @@ -1,84 +0,0 @@ -import { expectRevert } from "@openzeppelin/test-helpers"; - -import { StandardAccounts } from "@utils/machines"; -import { BN } from "@utils/tools"; -import { ZERO_ADDRESS } from "@utils/constants"; -import envSetup from "@utils/env_setup"; -import * as t from "types/generated"; - -const { expect } = envSetup.configure(); - -const MockCommonHelpers = artifacts.require("MockCommonHelpers"); -const MockErc20 = artifacts.require("MockERC20"); - -contract("CommonHelpers", async (accounts) => { - const sa = new StandardAccounts(accounts); - let commonHelpers: t.MockCommonHelpersInstance; - - before(async () => { - commonHelpers = await MockCommonHelpers.new(); - }); - - describe("getting decimals of valid ERC20 token", async () => { - let validToken1: t.MockERC20Instance; - let validToken2: t.MockERC20Instance; - let validToken3: t.MockERC20Instance; - - before(async () => { - validToken1 = await MockErc20.new("Mock", "MK1", 4, sa.default, 1); - validToken2 = await MockErc20.new("Mock", "MK2", 14, sa.default, 1); - validToken3 = await MockErc20.new("Mock", "MK3", 18, sa.default, 1); - }); - - it("should return the correct decimals from `getDecimals`", async () => { - const decimals1 = await commonHelpers.getDecimals(validToken1.address); - expect(decimals1).bignumber.eq(new BN(4)); - const decimals2 = await commonHelpers.getDecimals(validToken2.address); - expect(decimals2).bignumber.eq(new BN(14)); - const decimals3 = await commonHelpers.getDecimals(validToken3.address); - expect(decimals3).bignumber.eq(new BN(18)); - }); - }); - describe("getting decimals of invalid ERC20 tokens", async () => { - let tokenWith0: t.MockERC20Instance; - let tokenWith2: t.MockERC20Instance; - let tokenWith19: t.MockERC20Instance; - let tokenWithXX: t.MockERC20Instance; - - before(async () => { - tokenWith0 = await MockErc20.new("Mock", "MK0", new BN(0), sa.default, 1); - tokenWith2 = await MockErc20.new("Mock", "MK2", new BN(2), sa.default, 1); - tokenWith19 = await MockErc20.new("Mock", "MK4", new BN(19), sa.default, 1); - tokenWithXX = await MockErc20.new("Mock", "MK6", new BN(128), sa.default, 1); - }); - it("should be set up", async () => { - expect(await tokenWith0.decimals()).bignumber.eq(new BN(0)); - expect(await tokenWith2.decimals()).bignumber.eq(new BN(2)); - expect(await tokenWith19.decimals()).bignumber.eq(new BN(19)); - expect(await tokenWithXX.decimals()).bignumber.eq(new BN(128)); - }); - - it("should fail if passed dud addresses", async () => { - await expectRevert.unspecified(commonHelpers.getDecimals(ZERO_ADDRESS)); - await expectRevert.unspecified(commonHelpers.getDecimals(sa.default)); - }); - it("should fail if the token has lt 4 or gt 18 decimals", async () => { - await expectRevert( - commonHelpers.getDecimals(tokenWith0.address), - "Token must have sufficient decimal places", - ); - await expectRevert( - commonHelpers.getDecimals(tokenWith2.address), - "Token must have sufficient decimal places", - ); - await expectRevert( - commonHelpers.getDecimals(tokenWith19.address), - "Token must have sufficient decimal places", - ); - await expectRevert( - commonHelpers.getDecimals(tokenWithXX.address), - "Token must have sufficient decimal places", - ); - }); - }); -}); diff --git a/test/shared/TestInitializableModule.spec.ts b/test/shared/TestInitializableModule.spec.ts deleted file mode 100644 index 75e158a0..00000000 --- a/test/shared/TestInitializableModule.spec.ts +++ /dev/null @@ -1,195 +0,0 @@ -import { StandardAccounts } from "@utils/machines"; -import { BN } from "@utils/tools"; -import { expectRevert } from "@openzeppelin/test-helpers"; -import envSetup from "@utils/env_setup"; -import { ZERO_ADDRESS } from "@utils/constants"; -import * as t from "types/generated"; -import shouldBehaveLikeModule from "./behaviours/Module.behaviour"; - -const MockInitializableModule = artifacts.require("MockInitializableModule"); -const MockNexus = artifacts.require("MockNexus"); - -const { expect } = envSetup.configure(); - -contract("InitializableModule", async (accounts) => { - const ctx: { module?: t.MockInitializableModuleInstance } = {}; - const sa = new StandardAccounts(accounts); - let nexus: t.MockNexusInstance; - const proxyAdmin = sa.dummy1; - const governanceAddr = sa.dummy2; - const managerAddr = sa.dummy3; - - before("before all", async () => { - // create New Nexus - nexus = await MockNexus.new(sa.governor, governanceAddr, managerAddr); - await nexus.setProxyAdmin(proxyAdmin); - }); - beforeEach("before each", async () => { - const initializedModule = await MockInitializableModule.new(); - await initializedModule.initialize(nexus.address); - ctx.module = initializedModule; - }); - - shouldBehaveLikeModule(ctx as Required, sa); - - describe("should succeed", async () => { - it("and return governor address", async () => { - const governor = await ctx.module.governor(); - expect(governor).to.not.equal(ZERO_ADDRESS); - const nexusGovernor = await nexus.governor(); - expect(nexusGovernor).to.equal(governor); - }); - - it("and return governance address", async () => { - const governance = await ctx.module.governance(); - expect(governance).to.not.equal(ZERO_ADDRESS); - const nexusGovernance = await nexus.getModule(web3.utils.keccak256("Governance")); - expect(nexusGovernance).to.equal(governance); - }); - - it("and return proxyAdmin address", async () => { - const proxyAdminAddr = await ctx.module.proxyAdmin(); - expect(proxyAdminAddr).to.not.equal(ZERO_ADDRESS); - const nexusProxyAdmin = await nexus.getModule(web3.utils.keccak256("ProxyAdmin")); - expect(nexusProxyAdmin).to.equal(proxyAdminAddr); - }); - - it("and return staking address", async () => { - const staking = await ctx.module.staking(); - expect(staking).to.not.equal(ZERO_ADDRESS); - const nexusStaking = await nexus.getModule(web3.utils.keccak256("Staking")); - expect(nexusStaking).to.equal(staking); - }); - - it("and return metaToken address", async () => { - const metaToken = await ctx.module.metaToken(); - expect(metaToken).to.not.equal(ZERO_ADDRESS); - const nexusMetaToken = await nexus.getModule(web3.utils.keccak256("MetaToken")); - expect(nexusMetaToken).to.equal(metaToken); - }); - - it("and return oracleHub address", async () => { - const oracleHub = await ctx.module.oracleHub(); - expect(oracleHub).to.not.equal(ZERO_ADDRESS); - const nexusOracleHub = await nexus.getModule(web3.utils.keccak256("OracleHub")); - expect(nexusOracleHub).to.equal(oracleHub); - }); - - it("and return manager address", async () => { - const manager = await ctx.module.manager(); - expect(manager).to.not.equal(ZERO_ADDRESS); - const nexusManager = await nexus.getModule(web3.utils.keccak256("Manager")); - expect(nexusManager).to.equal(manager); - }); - - it("and return SavingsManager address", async () => { - const savingsManager = await ctx.module.savingsManager(); - expect(savingsManager).to.not.equal(ZERO_ADDRESS); - const nexusSavingsManager = await nexus.getModule( - web3.utils.keccak256("SavingsManager"), - ); - expect(nexusSavingsManager).to.equal(savingsManager); - }); - - it("and return recollateraliser address", async () => { - const recollateraliser = await ctx.module.recollateraliser(); - expect(recollateraliser).to.not.equal(ZERO_ADDRESS); - const nexusRecollateraliser = await nexus.getModule( - web3.utils.keccak256("Recollateraliser"), - ); - expect(nexusRecollateraliser).to.equal(recollateraliser); - }); - - it("when shouldAllowOnlyGovernor() called by Governor", async () => { - let temp = await ctx.module.temp(); - expect(new BN(0)).to.bignumber.equal(temp); - await ctx.module.shouldAllowOnlyGovernor({ from: sa.governor }); - temp = await ctx.module.temp(); - expect(new BN(1)).to.bignumber.equal(temp); - }); - - it("when shouldAllowOnlyGovernance() called by Governor address", async () => { - let temp = await ctx.module.temp(); - expect(new BN(0)).to.bignumber.equal(temp); - await ctx.module.shouldAllowOnlyGovernance({ from: sa.governor }); - temp = await ctx.module.temp(); - expect(new BN(2)).to.bignumber.equal(temp); - }); - - it("when shouldAllowOnlyGovernance() called by Governance address", async () => { - let temp = await ctx.module.temp(); - expect(new BN(0)).to.bignumber.equal(temp); - await ctx.module.shouldAllowOnlyGovernance({ from: governanceAddr }); - temp = await ctx.module.temp(); - expect(new BN(2)).to.bignumber.equal(temp); - }); - - it("when shouldAllowOnlyManager() called by Manager", async () => { - let temp = await ctx.module.temp(); - expect(new BN(0)).to.bignumber.equal(temp); - await ctx.module.shouldAllowOnlyManager({ from: managerAddr }); - temp = await ctx.module.temp(); - expect(new BN(3)).to.bignumber.equal(temp); - }); - - it("when shouldAllowOnlyProxyAdmin() called by proxyAdmin", async () => { - let temp = await ctx.module.temp(); - expect(new BN(0)).to.bignumber.equal(temp); - await ctx.module.shouldAllowOnlyProxyAdmin({ from: proxyAdmin }); - temp = await ctx.module.temp(); - expect(new BN(4)).to.bignumber.equal(temp); - }); - }); - - describe("should fail", async () => { - it("if initialized with null Nexus address", async () => { - const newModule = await MockInitializableModule.new(); - await expectRevert(newModule.initialize(ZERO_ADDRESS), "Nexus address is zero"); - await newModule.initialize(sa.dummy1); - }); - - it("when shouldAllowOnlyGovernor() called by other", async () => { - let temp = await ctx.module.temp(); - expect(new BN(0)).to.bignumber.equal(temp); - await expectRevert( - ctx.module.shouldAllowOnlyGovernor({ from: sa.other }), - "Only governor can execute", - ); - temp = await ctx.module.temp(); - expect(new BN(0)).to.bignumber.equal(temp); - }); - - it("when shouldAllowOnlyGovernance() called by other", async () => { - let temp = await ctx.module.temp(); - expect(new BN(0)).to.bignumber.equal(temp); - await expectRevert( - ctx.module.shouldAllowOnlyGovernance({ from: sa.other }), - "Only governance can execute", - ); - temp = await ctx.module.temp(); - expect(new BN(0)).to.bignumber.equal(temp); - }); - - it("when shouldAllowOnlyManager() called by other", async () => { - let temp = await ctx.module.temp(); - expect(new BN(0)).to.bignumber.equal(temp); - await expectRevert( - ctx.module.shouldAllowOnlyManager({ from: sa.other }), - "Only manager can execute", - ); - temp = await ctx.module.temp(); - expect(new BN(0)).to.bignumber.equal(temp); - }); - - it("when shouldAllowOnlyProxyAdmin() called by other", async () => { - let temp = await ctx.module.temp(); - expect(new BN(0)).to.bignumber.equal(temp); - await expectRevert( - ctx.module.shouldAllowOnlyProxyAdmin({ from: sa.other }), - "Only ProxyAdmin can execute", - ); - temp = await ctx.module.temp(); - expect(new BN(0)).to.bignumber.equal(temp); - }); - }); -}); diff --git a/test/shared/TestInitializablePausableModule.spec.ts b/test/shared/TestInitializablePausableModule.spec.ts deleted file mode 100644 index cee3d358..00000000 --- a/test/shared/TestInitializablePausableModule.spec.ts +++ /dev/null @@ -1,197 +0,0 @@ -import { StandardAccounts } from "@utils/machines"; -import { BN } from "@utils/tools"; -import { expectRevert } from "@openzeppelin/test-helpers"; -import envSetup from "@utils/env_setup"; -import { ZERO_ADDRESS } from "@utils/constants"; -import * as t from "types/generated"; -import shouldBehaveLikeModule from "./behaviours/Module.behaviour"; -import shouldBehaveLikePausableModule from "./behaviours/PausableModule.behaviour"; - -const MockInitializablePausableModule = artifacts.require("MockInitializablePausableModule"); -const MockNexus = artifacts.require("MockNexus"); - -const { expect } = envSetup.configure(); - -contract("InitializablePausableModule", async (accounts) => { - const ctx: { module?: t.MockInitializablePausableModuleInstance } = {}; - const sa = new StandardAccounts(accounts); - let nexus: t.MockNexusInstance; - const proxyAdmin = sa.dummy1; - const governanceAddr = sa.dummy2; - const managerAddr = sa.dummy3; - - before("before all", async () => { - // create New Nexus - nexus = await MockNexus.new(sa.governor, governanceAddr, managerAddr); - await nexus.setProxyAdmin(proxyAdmin); - }); - beforeEach("before each", async () => { - const initializedModule = await MockInitializablePausableModule.new(); - await initializedModule.initialize(nexus.address); - ctx.module = initializedModule; - }); - - shouldBehaveLikeModule(ctx as Required, sa); - shouldBehaveLikePausableModule(ctx as Required, sa); - - describe("should succeed", async () => { - it("and return governor address", async () => { - const governor = await ctx.module.governor(); - expect(governor).to.not.equal(ZERO_ADDRESS); - const nexusGovernor = await nexus.governor(); - expect(nexusGovernor).to.equal(governor); - }); - - it("and return governance address", async () => { - const governance = await ctx.module.governance(); - expect(governance).to.not.equal(ZERO_ADDRESS); - const nexusGovernance = await nexus.getModule(web3.utils.keccak256("Governance")); - expect(nexusGovernance).to.equal(governance); - }); - - it("and return proxyAdmin address", async () => { - const proxyAdminAddr = await ctx.module.proxyAdmin(); - expect(proxyAdminAddr).to.not.equal(ZERO_ADDRESS); - const nexusProxyAdmin = await nexus.getModule(web3.utils.keccak256("ProxyAdmin")); - expect(nexusProxyAdmin).to.equal(proxyAdminAddr); - }); - - it("and return staking address", async () => { - const staking = await ctx.module.staking(); - expect(staking).to.not.equal(ZERO_ADDRESS); - const nexusStaking = await nexus.getModule(web3.utils.keccak256("Staking")); - expect(nexusStaking).to.equal(staking); - }); - - it("and return metaToken address", async () => { - const metaToken = await ctx.module.metaToken(); - expect(metaToken).to.not.equal(ZERO_ADDRESS); - const nexusMetaToken = await nexus.getModule(web3.utils.keccak256("MetaToken")); - expect(nexusMetaToken).to.equal(metaToken); - }); - - it("and return oracleHub address", async () => { - const oracleHub = await ctx.module.oracleHub(); - expect(oracleHub).to.not.equal(ZERO_ADDRESS); - const nexusOracleHub = await nexus.getModule(web3.utils.keccak256("OracleHub")); - expect(nexusOracleHub).to.equal(oracleHub); - }); - - it("and return manager address", async () => { - const manager = await ctx.module.manager(); - expect(manager).to.not.equal(ZERO_ADDRESS); - const nexusManager = await nexus.getModule(web3.utils.keccak256("Manager")); - expect(nexusManager).to.equal(manager); - }); - - it("and return SavingsManager address", async () => { - const savingsManager = await ctx.module.savingsManager(); - expect(savingsManager).to.not.equal(ZERO_ADDRESS); - const nexusSavingsManager = await nexus.getModule( - web3.utils.keccak256("SavingsManager"), - ); - expect(nexusSavingsManager).to.equal(savingsManager); - }); - - it("and return recollateraliser address", async () => { - const recollateraliser = await ctx.module.recollateraliser(); - expect(recollateraliser).to.not.equal(ZERO_ADDRESS); - const nexusRecollateraliser = await nexus.getModule( - web3.utils.keccak256("Recollateraliser"), - ); - expect(nexusRecollateraliser).to.equal(recollateraliser); - }); - - it("when shouldAllowOnlyGovernor() called by Governor", async () => { - let temp = await ctx.module.temp(); - expect(new BN(0)).to.bignumber.equal(temp); - await ctx.module.shouldAllowOnlyGovernor({ from: sa.governor }); - temp = await ctx.module.temp(); - expect(new BN(1)).to.bignumber.equal(temp); - }); - - it("when shouldAllowOnlyGovernance() called by Governor address", async () => { - let temp = await ctx.module.temp(); - expect(new BN(0)).to.bignumber.equal(temp); - await ctx.module.shouldAllowOnlyGovernance({ from: sa.governor }); - temp = await ctx.module.temp(); - expect(new BN(2)).to.bignumber.equal(temp); - }); - - it("when shouldAllowOnlyGovernance() called by Governance address", async () => { - let temp = await ctx.module.temp(); - expect(new BN(0)).to.bignumber.equal(temp); - await ctx.module.shouldAllowOnlyGovernance({ from: governanceAddr }); - temp = await ctx.module.temp(); - expect(new BN(2)).to.bignumber.equal(temp); - }); - - it("when shouldAllowOnlyManager() called by Manager", async () => { - let temp = await ctx.module.temp(); - expect(new BN(0)).to.bignumber.equal(temp); - await ctx.module.shouldAllowOnlyManager({ from: managerAddr }); - temp = await ctx.module.temp(); - expect(new BN(3)).to.bignumber.equal(temp); - }); - - it("when shouldAllowOnlyProxyAdmin() called by proxyAdmin", async () => { - let temp = await ctx.module.temp(); - expect(new BN(0)).to.bignumber.equal(temp); - await ctx.module.shouldAllowOnlyProxyAdmin({ from: proxyAdmin }); - temp = await ctx.module.temp(); - expect(new BN(4)).to.bignumber.equal(temp); - }); - }); - - describe("should fail", async () => { - it("if initialized with null Nexus address", async () => { - const newModule = await MockInitializablePausableModule.new(); - await expectRevert(newModule.initialize(ZERO_ADDRESS), "Nexus address is zero"); - await newModule.initialize(sa.dummy1); - }); - - it("when shouldAllowOnlyGovernor() called by other", async () => { - let temp = await ctx.module.temp(); - expect(new BN(0)).to.bignumber.equal(temp); - await expectRevert( - ctx.module.shouldAllowOnlyGovernor({ from: sa.other }), - "Only governor can execute", - ); - temp = await ctx.module.temp(); - expect(new BN(0)).to.bignumber.equal(temp); - }); - - it("when shouldAllowOnlyGovernance() called by other", async () => { - let temp = await ctx.module.temp(); - expect(new BN(0)).to.bignumber.equal(temp); - await expectRevert( - ctx.module.shouldAllowOnlyGovernance({ from: sa.other }), - "Only governance can execute", - ); - temp = await ctx.module.temp(); - expect(new BN(0)).to.bignumber.equal(temp); - }); - - it("when shouldAllowOnlyManager() called by other", async () => { - let temp = await ctx.module.temp(); - expect(new BN(0)).to.bignumber.equal(temp); - await expectRevert( - ctx.module.shouldAllowOnlyManager({ from: sa.other }), - "Only manager can execute", - ); - temp = await ctx.module.temp(); - expect(new BN(0)).to.bignumber.equal(temp); - }); - - it("when shouldAllowOnlyProxyAdmin() called by other", async () => { - let temp = await ctx.module.temp(); - expect(new BN(0)).to.bignumber.equal(temp); - await expectRevert( - ctx.module.shouldAllowOnlyProxyAdmin({ from: sa.other }), - "Only ProxyAdmin can execute", - ); - temp = await ctx.module.temp(); - expect(new BN(0)).to.bignumber.equal(temp); - }); - }); -}); diff --git a/test/shared/TestModule.spec.ts b/test/shared/TestModule.spec.ts deleted file mode 100644 index f11a5139..00000000 --- a/test/shared/TestModule.spec.ts +++ /dev/null @@ -1,189 +0,0 @@ -import { StandardAccounts } from "@utils/machines"; -import { BN } from "@utils/tools"; -import { expectRevert } from "@openzeppelin/test-helpers"; -import envSetup from "@utils/env_setup"; -import { ZERO_ADDRESS, KEY_SAVINGS_MANAGER, KEY_PROXY_ADMIN } from "@utils/constants"; -import * as t from "types/generated"; -import shouldBehaveLikeModule from "./behaviours/Module.behaviour"; - -const MockModule = artifacts.require("MockModule"); -const MockNexus = artifacts.require("MockNexus"); - -const { expect } = envSetup.configure(); - -contract("Module", async (accounts) => { - const ctx: { module?: t.MockModuleInstance } = {}; - const sa = new StandardAccounts(accounts); - let nexus: t.MockNexusInstance; - const proxyAdmin = sa.dummy1; - const governanceAddr = sa.dummy2; - const managerAddr = sa.dummy3; - - before("before all", async () => { - // create New Nexus - nexus = await MockNexus.new(sa.governor, governanceAddr, managerAddr); - await nexus.setProxyAdmin(proxyAdmin); - }); - beforeEach("before each", async () => { - ctx.module = await MockModule.new(nexus.address); - }); - - shouldBehaveLikeModule(ctx as Required, sa); - - describe("should succeed", async () => { - it("and return governor address", async () => { - const governor = await ctx.module.governor(); - expect(governor).to.not.equal(ZERO_ADDRESS); - const nexusGovernor = await nexus.governor(); - expect(nexusGovernor).to.equal(governor); - }); - - it("and return governance address", async () => { - const governance = await ctx.module.governance(); - expect(governance).to.not.equal(ZERO_ADDRESS); - const nexusGovernance = await nexus.getModule(web3.utils.keccak256("Governance")); - expect(nexusGovernance).to.equal(governance); - }); - - it("and return staking address", async () => { - const staking = await ctx.module.staking(); - expect(staking).to.not.equal(ZERO_ADDRESS); - const nexusStaking = await nexus.getModule(web3.utils.keccak256("Staking")); - expect(nexusStaking).to.equal(staking); - }); - - it("and return metaToken address", async () => { - const metaToken = await ctx.module.metaToken(); - expect(metaToken).to.not.equal(ZERO_ADDRESS); - const nexusMetaToken = await nexus.getModule(web3.utils.keccak256("MetaToken")); - expect(nexusMetaToken).to.equal(metaToken); - }); - - it("and return oracleHub address", async () => { - const oracleHub = await ctx.module.oracleHub(); - expect(oracleHub).to.not.equal(ZERO_ADDRESS); - const nexusOracleHub = await nexus.getModule(web3.utils.keccak256("OracleHub")); - expect(nexusOracleHub).to.equal(oracleHub); - }); - - it("and return manager address", async () => { - const manager = await ctx.module.manager(); - expect(manager).to.not.equal(ZERO_ADDRESS); - const nexusManager = await nexus.getModule(web3.utils.keccak256("Manager")); - expect(nexusManager).to.equal(manager); - }); - - it("and return SavingsManager address", async () => { - const savingsManager = await ctx.module.savingsManager(); - expect(savingsManager).to.not.equal(ZERO_ADDRESS); - const nexusSavingsManager = await nexus.getModule(KEY_SAVINGS_MANAGER); - expect(nexusSavingsManager).to.equal(savingsManager); - }); - - it("and return recollateraliser address", async () => { - const recollateraliser = await ctx.module.recollateraliser(); - expect(recollateraliser).to.not.equal(ZERO_ADDRESS); - const nexusRecollateraliser = await nexus.getModule( - web3.utils.keccak256("Recollateraliser"), - ); - expect(nexusRecollateraliser).to.equal(recollateraliser); - }); - - it("and return proxyadmin address", async () => { - const proxyAdminAddr = await ctx.module.proxyAdmin(); - expect(proxyAdminAddr).to.not.equal(ZERO_ADDRESS); - const nexusProxyAdmin = await nexus.getModule(KEY_PROXY_ADMIN); - expect(nexusProxyAdmin).to.equal(proxyAdminAddr); - }); - - it("when shouldAllowOnlyGovernor() called by Governor", async () => { - let temp = await ctx.module.temp(); - expect(new BN(0)).to.bignumber.equal(temp); - await ctx.module.shouldAllowOnlyGovernor({ from: sa.governor }); - temp = await ctx.module.temp(); - expect(new BN(1)).to.bignumber.equal(temp); - }); - - it("when shouldAllowOnlyGovernance() called by Governor address", async () => { - let temp = await ctx.module.temp(); - expect(new BN(0)).to.bignumber.equal(temp); - await ctx.module.shouldAllowOnlyGovernance({ from: sa.governor }); - temp = await ctx.module.temp(); - expect(new BN(2)).to.bignumber.equal(temp); - }); - - it("when shouldAllowOnlyGovernance() called by Governance address", async () => { - let temp = await ctx.module.temp(); - expect(new BN(0)).to.bignumber.equal(temp); - await ctx.module.shouldAllowOnlyGovernance({ from: governanceAddr }); - temp = await ctx.module.temp(); - expect(new BN(2)).to.bignumber.equal(temp); - }); - - it("when shouldAllowOnlyManager() called by Manager", async () => { - let temp = await ctx.module.temp(); - expect(new BN(0)).to.bignumber.equal(temp); - await ctx.module.shouldAllowOnlyManager({ from: managerAddr }); - temp = await ctx.module.temp(); - expect(new BN(3)).to.bignumber.equal(temp); - }); - - it("when shouldAllowOnlyProxyAdmin() called by proxyAdmin", async () => { - let temp = await ctx.module.temp(); - expect(new BN(0)).to.bignumber.equal(temp); - await ctx.module.shouldAllowOnlyProxyAdmin({ from: proxyAdmin }); - temp = await ctx.module.temp(); - expect(new BN(4)).to.bignumber.equal(temp); - }); - }); - - describe("should fail", async () => { - it("when zero address for Nexus", async () => { - await expectRevert(MockModule.new(ZERO_ADDRESS), "Nexus is zero address"); - }); - - it("when shouldAllowOnlyGovernor() called by other", async () => { - let temp = await ctx.module.temp(); - expect(new BN(0)).to.bignumber.equal(temp); - await expectRevert( - ctx.module.shouldAllowOnlyGovernor({ from: sa.other }), - "Only governor can execute", - ); - temp = await ctx.module.temp(); - expect(new BN(0)).to.bignumber.equal(temp); - }); - - it("when shouldAllowOnlyGovernance() called by other", async () => { - let temp = await ctx.module.temp(); - expect(new BN(0)).to.bignumber.equal(temp); - await expectRevert( - ctx.module.shouldAllowOnlyGovernance({ from: sa.other }), - "Only governance can execute", - ); - temp = await ctx.module.temp(); - expect(new BN(0)).to.bignumber.equal(temp); - }); - - it("when shouldAllowOnlyManager() called by other", async () => { - let temp = await ctx.module.temp(); - expect(new BN(0)).to.bignumber.equal(temp); - await expectRevert( - ctx.module.shouldAllowOnlyManager({ from: sa.other }), - "Only manager can execute", - ); - temp = await ctx.module.temp(); - expect(new BN(0)).to.bignumber.equal(temp); - }); - - it("when shouldAllowOnlyProxyAdmin() called by other", async () => { - let temp = await ctx.module.temp(); - expect(new BN(0)).to.bignumber.equal(temp); - await expectRevert( - ctx.module.shouldAllowOnlyProxyAdmin({ from: sa.other }), - "Only ProxyAdmin can execute", - ); - temp = await ctx.module.temp(); - expect(new BN(0)).to.bignumber.equal(temp); - }); - }); -}); diff --git a/test/shared/TestPausableModule.spec.ts b/test/shared/TestPausableModule.spec.ts deleted file mode 100644 index 851894b6..00000000 --- a/test/shared/TestPausableModule.spec.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { StandardAccounts } from "@utils/machines"; -import * as t from "types/generated"; - -import shouldBehaveLikeModule from "./behaviours/Module.behaviour"; -import shouldBehaveLikePausableModule from "./behaviours/PausableModule.behaviour"; - -const MockPausableModule = artifacts.require("MockPausableModule"); -const MockNexus = artifacts.require("MockNexus"); - -contract("PausableModule", async (accounts) => { - const ctx: { module?: t.PausableModuleInstance } = {}; - const sa = new StandardAccounts(accounts); - let nexus: t.MockNexusInstance; - const governanceAddr = sa.dummy1; - const managerAddr = sa.dummy2; - - before("before all", async () => { - // create New Nexus - nexus = await MockNexus.new(sa.governor, governanceAddr, managerAddr); - }); - - beforeEach("before each", async () => { - ctx.module = await MockPausableModule.new(nexus.address); - }); - - shouldBehaveLikeModule(ctx as Required, sa); - shouldBehaveLikePausableModule(ctx as Required, sa); -}); diff --git a/test/shared/TestRoot.spec.ts b/test/shared/TestRoot.spec.ts deleted file mode 100644 index b83fd2a7..00000000 --- a/test/shared/TestRoot.spec.ts +++ /dev/null @@ -1,42 +0,0 @@ -import { BN } from "@utils/tools"; -import * as t from "types/generated"; -import envSetup from "@utils/env_setup"; - -const { expect } = envSetup.configure(); -const Root = artifacts.require("MockRoot"); - -describe("Root", function() { - let root: t.MockRootInstance; - beforeEach(async () => { - root = await Root.new(); - }); - - describe("calculating the root", () => { - it("returns floored root", async () => { - let amt = new BN(1000000000); - let res = await root.sqrt(amt); - expect(res).bignumber.eq(new BN(31622)); - amt = new BN(64); - res = await root.sqrt(amt); - expect(res).bignumber.eq(new BN(8)); - amt = new BN("160000000000000000"); - res = await root.sqrt(amt); - expect(res).bignumber.eq(new BN(400000000)); - }); - it("returns root for seconds in year", async () => { - const amt = new BN("31540000"); - const res = await root.sqrt(amt); - expect(res).bignumber.eq(new BN(5616)); - }); - it("returns root for seconds in 6 months", async () => { - const amt = new BN("15724800"); - const res = await root.sqrt(amt); - expect(res).bignumber.eq(new BN(3965)); - }); - it("returns root for seconds in week", async () => { - const amt = new BN("604800"); - const res = await root.sqrt(amt); - expect(res).bignumber.eq(new BN(777)); - }); - }); -}); diff --git a/test/shared/TestSignedSafeMath128.spec.ts b/test/shared/TestSignedSafeMath128.spec.ts deleted file mode 100644 index a09d6465..00000000 --- a/test/shared/TestSignedSafeMath128.spec.ts +++ /dev/null @@ -1,173 +0,0 @@ -import { expectRevert } from "@openzeppelin/test-helpers"; -import { BN } from "@utils/tools"; -import { MAX_INT128, MIN_INT128 } from "@utils/constants"; -import envSetup from "@utils/env_setup"; - -const { expect } = envSetup.configure(); -const SignedSafeMath128Mock = artifacts.require("SignedSafeMath128Mock"); - -describe("SignedSafeMath", function() { - beforeEach(async function() { - this.safeMath = await SignedSafeMath128Mock.new(); - }); - - async function testCommutative(fn, lhs, rhs, expected) { - expect(await fn(lhs, rhs)).to.be.bignumber.equal(expected); - expect(await fn(rhs, lhs)).to.be.bignumber.equal(expected); - } - - async function testFailsCommutative(fn, lhs, rhs, reason) { - await expectRevert(fn(lhs, rhs), reason); - await expectRevert(fn(rhs, lhs), reason); - } - - describe("add", function() { - it("adds correctly if it does not overflow and the result is positive", async function() { - const a = new BN("1234"); - const b = new BN("5678"); - - await testCommutative(this.safeMath.add, a, b, a.add(b)); - }); - - it("adds correctly if it does not overflow and the result is negative", async function() { - const a = MAX_INT128; - const b = MIN_INT128; - - await testCommutative(this.safeMath.add, a, b, a.add(b)); - }); - - it("reverts on positive addition overflow", async function() { - const a = MAX_INT128; - const b = new BN("1"); - - await testFailsCommutative( - this.safeMath.add, - a, - b, - "SignedSafeMath: addition overflow", - ); - }); - - it("reverts on negative addition overflow", async function() { - const a = MIN_INT128; - const b = new BN("-1"); - - await testFailsCommutative( - this.safeMath.add, - a, - b, - "SignedSafeMath: addition overflow", - ); - }); - }); - - describe("sub", function() { - it("subtracts correctly if it does not overflow and the result is positive", async function() { - const a = new BN("5678"); - const b = new BN("1234"); - - const result = await this.safeMath.sub(a, b); - expect(result).to.be.bignumber.equal(a.sub(b)); - }); - - it("subtracts correctly if it does not overflow and the result is negative", async function() { - const a = new BN("1234"); - const b = new BN("5678"); - - const result = await this.safeMath.sub(a, b); - expect(result).to.be.bignumber.equal(a.sub(b)); - }); - - it("reverts on positive subtraction overflow", async function() { - const a = MAX_INT128; - const b = new BN("-1"); - - await expectRevert(this.safeMath.sub(a, b), "SignedSafeMath: subtraction overflow"); - }); - - it("reverts on negative subtraction overflow", async function() { - const a = MIN_INT128; - const b = new BN("1"); - - await expectRevert(this.safeMath.sub(a, b), "SignedSafeMath: subtraction overflow"); - }); - }); - - describe("mul", function() { - it("multiplies correctly", async function() { - const a = new BN("5678"); - const b = new BN("-1234"); - - await testCommutative(this.safeMath.mul, a, b, a.mul(b)); - }); - - it("multiplies by zero correctly", async function() { - const a = new BN("0"); - const b = new BN("5678"); - - await testCommutative(this.safeMath.mul, a, b, "0"); - }); - - it("reverts on multiplication overflow, positive operands", async function() { - const a = MAX_INT128; - const b = new BN("2"); - - await testFailsCommutative( - this.safeMath.mul, - a, - b, - "SignedSafeMath: multiplication overflow", - ); - }); - - it("reverts when minimum integer is multiplied by -1", async function() { - const a = MIN_INT128; - const b = new BN("-1"); - - await testFailsCommutative( - this.safeMath.mul, - a, - b, - "SignedSafeMath: multiplication overflow", - ); - }); - }); - - describe("div", function() { - it("divides correctly", async function() { - const a = new BN("-5678"); - const b = new BN("5678"); - - const result = await this.safeMath.div(a, b); - expect(result).to.be.bignumber.equal(a.div(b)); - }); - - it("divides zero correctly", async function() { - const a = new BN("0"); - const b = new BN("5678"); - - expect(await this.safeMath.div(a, b)).to.be.bignumber.equal("0"); - }); - - it("returns complete number result on non-even division", async function() { - const a = new BN("7000"); - const b = new BN("5678"); - - expect(await this.safeMath.div(a, b)).to.be.bignumber.equal("1"); - }); - - it("reverts on division by zero", async function() { - const a = new BN("-5678"); - const b = new BN("0"); - - await expectRevert(this.safeMath.div(a, b), "SignedSafeMath: division by zero"); - }); - - it("reverts on overflow, negative second", async function() { - const a = new BN(MIN_INT128); - const b = new BN("-1"); - - await expectRevert(this.safeMath.div(a, b), "SignedSafeMath: division overflow"); - }); - }); -}); diff --git a/test/shared/TestStableMath.spec.ts b/test/shared/TestStableMath.spec.ts deleted file mode 100644 index 883afb3e..00000000 --- a/test/shared/TestStableMath.spec.ts +++ /dev/null @@ -1,436 +0,0 @@ -import { expectRevert } from "@openzeppelin/test-helpers"; - -import { simpleToExactAmount } from "@utils/math"; -import { BN } from "@utils/tools"; -import { fullScale, ratioScale } from "@utils/constants"; -import envSetup from "@utils/env_setup"; -import { PublicStableMathInstance } from "../../types/generated"; - -const { expect } = envSetup.configure(); -const PublicStableMath = artifacts.require("PublicStableMath"); - -contract("StableMath", async () => { - let math: PublicStableMathInstance; - - before(async () => { - math = await PublicStableMath.new(); - }); - - /** ************************************* - GETTERS - *************************************** */ - - describe("calling the getters", async () => { - it("should return the correct scale", async () => { - expect(await math.getFullScale()).bignumber.eq(simpleToExactAmount(1, 18)); - expect(await math.getFullScale()).bignumber.eq(fullScale); - }); - - it("should return the correct ratio scale", async () => { - expect(await math.getRatioScale()).bignumber.eq(simpleToExactAmount(1, 8)); - expect(await math.getRatioScale()).bignumber.eq(ratioScale); - }); - }); - - describe("scaling an integer", async () => { - it("should scale an integer correctly", async () => { - expect(await math.scaleInteger("1000")).bignumber.eq(simpleToExactAmount(1000, 18)); - expect(await math.scaleInteger("7")).bignumber.eq(simpleToExactAmount(7, 18)); - expect(await math.scaleInteger("111231231231")).bignumber.eq( - simpleToExactAmount(111231231231, 18), - ); - expect(await math.scaleInteger(simpleToExactAmount(1, 18))).bignumber.eq( - simpleToExactAmount(1, 36), - ); - expect(await math.scaleInteger(1)).bignumber.eq(simpleToExactAmount(1, 18)); - }); - - it("should fail if integer overflow", async () => { - await expectRevert( - math.scaleInteger(simpleToExactAmount(1, 70)), - "SafeMath: multiplication overflow", - ); - }); - }); - - /** ************************************* - PRECISE ARITHMETIC - *************************************** */ - - describe("calling mulTruncate(x, y, scale)", async () => { - it("should return correct results", async () => { - let x = simpleToExactAmount(1, 10); - let y = simpleToExactAmount(9, 9); - let scale = simpleToExactAmount(1, 12); - let result = await math.mulTruncateScale(x, y, scale); - expect(result).bignumber.eq(new BN(x).mul(y).div(scale)); - expect(result).bignumber.lt(x as any); - - x = simpleToExactAmount(250, 22); - y = simpleToExactAmount(95, 16); - scale = fullScale; - result = await math.mulTruncateScale(x, y, scale); - expect(result).bignumber.eq(new BN(x).mul(y).div(scale)); - expect(result).bignumber.lt(x as any); - }); - it("should truncate fractions", async () => { - const x = new BN(11); - const y = new BN(3); - // 33 / 10 == 3.33.. should return 3 - const result = await math.mulTruncateScale(x, y, new BN(10)); - expect(result).bignumber.eq(new BN(3)); - }); - it("should fail if scale operand is 0", async () => { - const sampleInput = simpleToExactAmount(1, 18); - await expectRevert( - math.mulTruncateScale(sampleInput, sampleInput, 0), - "SafeMath: division by zero", - ); - }); - it("should return 0 if either operand is 0", async () => { - expect( - await math.mulTruncateScale(new BN(0), simpleToExactAmount(1, 18), fullScale), - ).bignumber.eq(new BN(0)); - expect( - await math.mulTruncateScale(simpleToExactAmount(1, 18), new BN(0), fullScale), - ).bignumber.eq(new BN(0)); - }); - }); - - describe("calling mulTruncate(x, y)", async () => { - it("should return correct results", async () => { - let x = simpleToExactAmount(1, 10); - let y = simpleToExactAmount(9, 9); - let result = await math.mulTruncate(x, y); - expect(result).bignumber.eq(new BN(x).mul(y).div(fullScale)); - expect(result).bignumber.lt(x as any); - - x = simpleToExactAmount(1, 20); - y = simpleToExactAmount(25, 16); - result = await math.mulTruncate(x, y); - expect(result).bignumber.eq(simpleToExactAmount(25, 18)); - expect(result).bignumber.lt(x as any); - }); - it("should truncate fractions", async () => { - const x = new BN(1234); - const y = simpleToExactAmount(75, 16); - const result = await math.mulTruncate(x, y); - // 75% of 1234 = 925.5, round to 925 - expect(result).bignumber.eq(new BN(925)); - }); - it("should return 0 if operands multiplied are less than the scale", async () => { - const x = new BN(100); - const y = simpleToExactAmount(1, 15); - const result = await math.mulTruncate(x, y); - // (1e2 * 1e15) / 1e18 = 0.1 - expect(result).bignumber.eq(new BN(0)); - }); - it("should return 0 if either operand is 0", async () => { - expect(await math.mulTruncate(new BN(0), simpleToExactAmount(1, 18))).bignumber.eq( - new BN(0), - ); - expect(await math.mulTruncate(simpleToExactAmount(1, 18), new BN(0))).bignumber.eq( - new BN(0), - ); - }); - }); - - describe("calling mulTruncateCeil(x, y)", async () => { - it("should round up any fraction", async () => { - let x = new BN(3); - let y = simpleToExactAmount(11, 17); - let result = await math.mulTruncateCeil(x, y); - // (3 * 11e17) / 1e18 == 33e17 / 1e18 == 3.3. - expect(result).bignumber.eq(new BN(4)); - - x = new BN(1); - y = simpleToExactAmount(95, 16); - result = await math.mulTruncateCeil(x, y); - // (1 * 95e16) / 1e18 == 0.95 - expect(result).bignumber.eq(new BN(1)); - - x = new BN(1234); - y = simpleToExactAmount(75, 16); - result = await math.mulTruncateCeil(x, y); - // 75% of 1234 = 925.5, round to 926 - expect(result).bignumber.eq(new BN(926)); - }); - it("should return 1 if operands multiplied are less than the scale", async () => { - const x = new BN(100); - const y = simpleToExactAmount(1, 15); - const result = await math.mulTruncateCeil(x, y); - // (1e2 * 1e15) / 1e18 = 0.1 - expect(result).bignumber.eq(new BN(1)); - }); - it("should not round a 0 fraction", async () => { - const x = new BN(30); - const y = simpleToExactAmount(11, 17); - const result = await math.mulTruncateCeil(x, y); - // (30 * 11e17) / 1e18 == 33e18 / 1e18 == 33 - expect(result).bignumber.eq(new BN(33)); - }); - it("should return 0 if either operand is 0", async () => { - expect(await math.mulTruncateCeil(new BN(0), simpleToExactAmount(1, 18))).bignumber.eq( - new BN(0), - ); - expect(await math.mulTruncateCeil(simpleToExactAmount(1, 18), new BN(0))).bignumber.eq( - new BN(0), - ); - }); - }); - - describe("calling divPrecisely(x, y)", async () => { - it("should calculate x as a percentage value of y to scale of 1e18", async () => { - let x = simpleToExactAmount(1, 18); - let y = simpleToExactAmount(1, 17); - let result = await math.divPrecisely(x, y); - // (1e18 * 1e18) / 1e17 == 1e19 - expect(result).bignumber.eq(simpleToExactAmount(1, 19)); - - x = simpleToExactAmount(1, 17); - y = simpleToExactAmount(1, 19); - result = await math.divPrecisely(x, y); - // (1e17 * 1e18) / 1e19 == 1e16 - expect(result).bignumber.eq(simpleToExactAmount(1, 16)); - }); - it("should ignore remaining fractions", async () => { - let x = new BN(100); - let y = simpleToExactAmount(1234, 16); - let result = await math.divPrecisely(x, y); - // (1e2 * 1e18) / 1234e16 == 8.103... - expect(result).bignumber.eq(new BN(8)); - - x = simpleToExactAmount(1, 4); - y = simpleToExactAmount(1, 24); - result = await math.divPrecisely(x, y); - // (1e4 * 1e18) / 1e24 == 0.01 - expect(result).bignumber.eq(new BN(0)); - }); - it("should fail if the divisor is 0", async () => { - const sampleInput = simpleToExactAmount(1, 18); - await expectRevert(math.divPrecisely(sampleInput, 0), "SafeMath: division by zero"); - }); - it("should fail if the left operand is too large", async () => { - const sampleInput = simpleToExactAmount(1, 65); - await expectRevert( - math.divPrecisely(sampleInput, simpleToExactAmount(1, 18)), - "SafeMath: multiplication overflow", - ); - }); - }); - - /** ************************************* - RATIO FUNCS - *************************************** */ - - describe("calling mulRatioTruncate(x, ratio)", async () => { - it("should calculate correct mAsset value from bAsset", async () => { - let x = simpleToExactAmount(1, 4); // 1e4 base bAsset units - let y = ratioScale; // 1e8 standard ratio - let result = await math.mulRatioTruncate(x, y); - expect(result).bignumber.eq(simpleToExactAmount(1, 4)); - - x = simpleToExactAmount(1, 12); // 1e12 units of bAsset - y = simpleToExactAmount(1, 14); // bAsset with 12 decimals, 1e8 * 1e(18-12) - result = await math.mulRatioTruncate(x, y); - expect(result).bignumber.eq(simpleToExactAmount(1, 18)); - - x = new BN(1234); // 1234 units of bAsset - y = simpleToExactAmount("0.324", 14); // bAsset with 12 decimals and 0.324 mm - result = await math.mulRatioTruncate(x, y); - // result == 399.816 units - expect(result).bignumber.eq(new BN(399816000)); - }); - it("should truncate fractions", async () => { - const x = new BN(1234); // 1234 units of bAsset - const y = simpleToExactAmount("0.324", 8); // bAsset with 18 decimals, but 0.324 mm - const result = await math.mulRatioTruncate(x, y); - // result == 399.816 units - expect(result).bignumber.eq(new BN(399)); - }); - it("should return 0 if operands multiplied are less than the scale", async () => { - const x = new BN(100); - const y = simpleToExactAmount(1, 5); - const result = await math.mulRatioTruncate(x, y); - // (1e2 * 1e5) / 1e8 = 0.1 - expect(result).bignumber.eq(new BN(0)); - }); - it("should return 0 if either operand is 0", async () => { - expect(await math.mulRatioTruncate(new BN(0), simpleToExactAmount(1, 18))).bignumber.eq( - new BN(0), - ); - expect(await math.mulRatioTruncate(simpleToExactAmount(1, 18), new BN(0))).bignumber.eq( - new BN(0), - ); - }); - }); - - describe("calling mulRatioTruncateCeil(x, ratio)", async () => { - it("should calculate correct mAsset value from bAsset", async () => { - let x = simpleToExactAmount(1, 4); // 1e4 base bAsset units - let y = ratioScale; // 1e8 standard ratio - let result = await math.mulRatioTruncateCeil(x, y); - expect(result).bignumber.eq(simpleToExactAmount(1, 4)); - - x = simpleToExactAmount(1, 12); // 1e12 units of bAsset - y = simpleToExactAmount(1, 14); // bAsset with 12 decimals, 1e8 * 1e(18-12) - result = await math.mulRatioTruncateCeil(x, y); - expect(result).bignumber.eq(simpleToExactAmount(1, 18)); - - x = new BN(1234); // 1234 units of bAsset - y = simpleToExactAmount("0.324", 14); // bAsset with 12 decimals and 0.324 mm - result = await math.mulRatioTruncateCeil(x, y); - // result == 399.816 units - expect(result).bignumber.eq(new BN(399816000)); - }); - it("should round up any fractions", async () => { - let x = new BN(1234); // 1234 units of bAsset - let y = simpleToExactAmount("0.324", 8); // bAsset with 18 decimals, but 0.324 mm - let result = await math.mulRatioTruncateCeil(x, y); - // result == 399.816 units - expect(result).bignumber.eq(new BN(400)); - - x = simpleToExactAmount(1234, 3); // 1.234e6 units of bAsset - y = simpleToExactAmount(3243, 4); // ratio = 3.243e7 - result = await math.mulRatioTruncateCeil(x, y); - // result == 400186.2 units - expect(result).bignumber.eq(new BN(400187)); - }); - it("should return 1 if operands multiplied are less than the scale", async () => { - const x = new BN(100); - const y = simpleToExactAmount(1, 5); - const result = await math.mulRatioTruncateCeil(x, y); - // (1e2 * 1e5) / 1e8 = 0.1 - expect(result).bignumber.eq(new BN(1)); - }); - it("should return 0 if either operand is 0", async () => { - expect( - await math.mulRatioTruncateCeil(new BN(0), simpleToExactAmount(1, 18)), - ).bignumber.eq(new BN(0)); - expect( - await math.mulRatioTruncateCeil(simpleToExactAmount(1, 18), new BN(0)), - ).bignumber.eq(new BN(0)); - }); - }); - - describe("calling divRatioPrecisely(x, ratio)", async () => { - it("should calculate x as a percentage value of y to scale of 1e8", async () => { - let x = simpleToExactAmount(1, 18); - let y = simpleToExactAmount(1, 8); - let result = await math.divRatioPrecisely(x, y); - // (1e18 * 1e8) / 1e8 == 1e18 - expect(result).bignumber.eq(simpleToExactAmount(1, 18)); - - x = simpleToExactAmount(1, 14); // 1e14 base units of mAsset - y = simpleToExactAmount(1, 12); // bAsset with 14 decimals - result = await math.divRatioPrecisely(x, y); - // Should equal mAsset units - 4 decimals, or 1e10 - expect(result).bignumber.eq(simpleToExactAmount(1, 10)); - - x = simpleToExactAmount("0.235", 18); // 235e15 - y = simpleToExactAmount(1, 12); - result = await math.divRatioPrecisely(x, y); - // Should equal mAsset units - 4 decimals, or 235e11 - expect(result).bignumber.eq(simpleToExactAmount(235, 11)); - }); - it("should ignore remaining fractions", async () => { - let x = new BN(100); - let y = simpleToExactAmount(1234, 6); - let result = await math.divRatioPrecisely(x, y); - // (1e2 * 1e8) / 1234e6 == 8.103... - expect(result).bignumber.eq(new BN(8)); - - x = simpleToExactAmount(1, 4); - y = simpleToExactAmount(1, 14); - result = await math.divRatioPrecisely(x, y); - // (1e4 * 1e8) / 1e14 == 0.01 - expect(result).bignumber.eq(new BN(0)); - }); - it("should fail if the divisor is 0", async () => { - const sampleInput = simpleToExactAmount(1, 18); - await expectRevert( - math.divRatioPrecisely(sampleInput, 0), - "SafeMath: division by zero", - ); - }); - it("should fail if the left operand is too large", async () => { - const sampleInput = simpleToExactAmount(1, 71); - await expectRevert( - math.divRatioPrecisely(sampleInput, simpleToExactAmount(1, 8)), - "SafeMath: multiplication overflow", - ); - }); - }); - - /** ************************************* - HELPERS - *************************************** */ - - describe("calling min(x, y)", async () => { - it("should find the minimum number", async () => { - let x = new BN(1); - let y = new BN(2); - expect(await math.min(x, y)).bignumber.eq(x); - expect(await math.min(y, x)).bignumber.eq(x); - - x = new BN(2); - y = new BN(1); - expect(await math.min(x, y)).bignumber.eq(y); - expect(await math.min(y, x)).bignumber.eq(y); - - x = new BN(0); - y = simpleToExactAmount(2323, 24); - expect(await math.min(x, y)).bignumber.eq(x); - expect(await math.min(y, x)).bignumber.eq(x); - - x = simpleToExactAmount("0.242", 4); - y = new BN(0); - expect(await math.min(x, y)).bignumber.eq(y); - expect(await math.min(y, x)).bignumber.eq(y); - }); - }); - - describe("calling max(x, y)", async () => { - it("should find the maximum number", async () => { - let x = new BN(1); - let y = new BN(2); - expect(await math.max(x, y)).bignumber.eq(y); - expect(await math.max(y, x)).bignumber.eq(y); - - x = new BN(2); - y = new BN(1); - expect(await math.max(x, y)).bignumber.eq(x); - expect(await math.max(y, x)).bignumber.eq(x); - - x = new BN(0); - y = simpleToExactAmount(2323, 24); - expect(await math.max(x, y)).bignumber.eq(y); - expect(await math.max(y, x)).bignumber.eq(y); - - x = simpleToExactAmount("0.242", 4); - y = new BN(0); - expect(await math.max(x, y)).bignumber.eq(x); - expect(await math.max(y, x)).bignumber.eq(x); - }); - }); - - describe("calling clamp(x, uepprBound)", async () => { - it("should clamp to the upper bound", async () => { - let x = new BN(1); - let bound = new BN(2); - expect(await math.clamp(x, bound)).bignumber.eq(x); - - x = new BN(2); - bound = new BN(1); - expect(await math.clamp(x, bound)).bignumber.eq(bound); - - x = new BN(0); - bound = simpleToExactAmount(2323, 24); - expect(await math.clamp(x, bound)).bignumber.eq(x); - - x = simpleToExactAmount("0.242", 4); - bound = new BN(0); - expect(await math.clamp(x, bound)).bignumber.eq(bound); - }); - }); -}); diff --git a/test/shared/behaviours/ERC20.behaviour.ts b/test/shared/behaviours/ERC20.behaviour.ts deleted file mode 100644 index 07018c33..00000000 --- a/test/shared/behaviours/ERC20.behaviour.ts +++ /dev/null @@ -1,365 +0,0 @@ -import { expectEvent, expectRevert } from "@openzeppelin/test-helpers"; -import { ZERO_ADDRESS } from "@utils/constants"; -import { BN } from "@utils/tools"; -import * as t from "types/generated"; -import envSetup from "@utils/env_setup"; - -const { expect } = envSetup.configure(); - -export default function shouldBehaveLikeERC20( - ctx: { token: t.ERC20Instance }, - errorPrefix, - initialSupply, - initialHolder, - recipient, - anotherAccount, -): void { - describe("total supply", () => { - it("returns the total amount of tokens", async () => { - expect(await ctx.token.totalSupply()).to.be.bignumber.equal(initialSupply); - }); - }); - - describe("balanceOf", () => { - describe("when the requested account has no tokens", () => { - it("returns zero", async () => { - expect(await ctx.token.balanceOf(anotherAccount)).to.be.bignumber.equal("0"); - }); - }); - - describe("when the requested account has some tokens", () => { - it("returns the total amount of tokens", async () => { - expect(await ctx.token.balanceOf(initialHolder)).to.be.bignumber.equal( - initialSupply, - ); - }); - }); - }); - - describe("transfer", () => { - shouldBehaveLikeERC20Transfer( - ctx, - errorPrefix, - initialHolder, - recipient, - initialSupply, - (from, to, value) => { - return ctx.token.transfer(to, value, { from }); - }, - ); - }); - - describe("transfer from", () => { - const spender = recipient; - - describe("when the token owner is not the zero address", () => { - const tokenOwner = initialHolder; - - describe("when the recipient is not the zero address", () => { - const to = anotherAccount; - - describe("when the spender has enough approved balance", () => { - beforeEach(async () => { - await ctx.token.approve(spender, initialSupply, { from: initialHolder }); - }); - - describe("when the token owner has enough balance", () => { - const amount = initialSupply; - - it("transfers the requested amount", async () => { - await ctx.token.transferFrom(tokenOwner, to, amount, { - from: spender, - }); - - expect(await ctx.token.balanceOf(tokenOwner)).to.be.bignumber.equal( - "0", - ); - - expect(await ctx.token.balanceOf(to)).to.be.bignumber.equal(amount); - }); - - it("decreases the spender allowance", async () => { - await ctx.token.transferFrom(tokenOwner, to, amount, { - from: spender, - }); - - expect( - await ctx.token.allowance(tokenOwner, spender), - ).to.be.bignumber.equal("0"); - }); - - it("emits a transfer event", async () => { - const { logs } = await ctx.token.transferFrom(tokenOwner, to, amount, { - from: spender, - }); - - expectEvent.inLogs(logs, "Transfer", { - from: tokenOwner, - to, - value: amount, - }); - }); - - it("emits an approval event", async () => { - const { logs } = await ctx.token.transferFrom(tokenOwner, to, amount, { - from: spender, - }); - - expectEvent.inLogs(logs, "Approval", { - owner: tokenOwner, - spender, - value: await ctx.token.allowance(tokenOwner, spender), - }); - }); - }); - - describe("when the token owner does not have enough balance", () => { - const amount = initialSupply.addn(1); - - it("reverts", async () => { - await expectRevert( - ctx.token.transferFrom(tokenOwner, to, amount, { from: spender }), - `${errorPrefix}: transfer amount exceeds balance`, - ); - }); - }); - }); - - describe("when the spender does not have enough approved balance", () => { - beforeEach(async () => { - await ctx.token.approve(spender, initialSupply.subn(1), { - from: tokenOwner, - }); - }); - - describe("when the token owner has enough balance", () => { - const amount = initialSupply; - - it("reverts", async () => { - await expectRevert( - ctx.token.transferFrom(tokenOwner, to, amount, { from: spender }), - `${errorPrefix}: transfer amount exceeds allowance`, - ); - }); - }); - - describe("when the token owner does not have enough balance", () => { - const amount = initialSupply.addn(1); - - it("reverts", async () => { - await expectRevert( - ctx.token.transferFrom(tokenOwner, to, amount, { from: spender }), - `${errorPrefix}: transfer amount exceeds balance`, - ); - }); - }); - }); - }); - - describe("when the recipient is the zero address", () => { - const amount = initialSupply; - const to = ZERO_ADDRESS; - - beforeEach(async () => { - await ctx.token.approve(spender, amount, { from: tokenOwner }); - }); - - it("reverts", async () => { - await expectRevert( - ctx.token.transferFrom(tokenOwner, to, amount, { from: spender }), - `${errorPrefix}: transfer to the zero address`, - ); - }); - }); - }); - - describe("when the token owner is the zero address", () => { - const amount = 0; - const tokenOwner = ZERO_ADDRESS; - const to = recipient; - - it("reverts", async () => { - await expectRevert( - ctx.token.transferFrom(tokenOwner, to, amount, { from: spender }), - `${errorPrefix}: transfer from the zero address`, - ); - }); - }); - }); - - describe("approve", () => { - shouldBehaveLikeERC20Approve( - ctx, - errorPrefix, - initialHolder, - recipient, - initialSupply, - (owner, spender, amount) => { - return ctx.token.approve(spender, amount, { from: owner }); - }, - ); - }); -} - -const shouldBehaveLikeERC20Transfer = ( - ctx: { token: t.ERC20Instance }, - errorPrefix, - from, - to, - balance, - transfer, -): void => { - describe("when the recipient is not the zero address", () => { - describe("when the sender does not have enough balance", () => { - const amount = balance.addn(1); - - it("reverts", async () => { - await expectRevert( - transfer.call(this, from, to, amount), - `${errorPrefix}: transfer amount exceeds balance`, - ); - }); - }); - - describe("when the sender transfers all balance", () => { - const amount = balance; - - it("transfers the requested amount", async () => { - await transfer.call(this, from, to, amount); - - expect(await ctx.token.balanceOf(from)).to.be.bignumber.equal("0"); - - expect(await ctx.token.balanceOf(to)).to.be.bignumber.equal(amount); - }); - - it("emits a transfer event", async () => { - const { logs } = await transfer.call(this, from, to, amount); - - expectEvent.inLogs(logs, "Transfer", { - from, - to, - value: amount, - }); - }); - }); - - describe("when the sender transfers zero tokens", () => { - const amount = new BN("0"); - - it("transfers the requested amount", async () => { - await transfer.call(this, from, to, amount); - - expect(await ctx.token.balanceOf(from)).to.be.bignumber.equal(balance); - - expect(await ctx.token.balanceOf(to)).to.be.bignumber.equal("0"); - }); - - it("emits a transfer event", async () => { - const { logs } = await transfer.call(this, from, to, amount); - - expectEvent.inLogs(logs, "Transfer", { - from, - to, - value: amount, - }); - }); - }); - }); - - describe("when the recipient is the zero address", () => { - it("reverts", async () => { - await expectRevert( - transfer.call(this, from, ZERO_ADDRESS, balance), - `${errorPrefix}: transfer to the zero address`, - ); - }); - }); -}; - -const shouldBehaveLikeERC20Approve = ( - ctx: { token: t.ERC20Instance }, - errorPrefix, - owner, - spender, - supply, - approve, -): void => { - describe("when the spender is not the zero address", () => { - describe("when the sender has enough balance", () => { - const amount = supply; - - it("emits an approval event", async () => { - const { logs } = await approve.call(this, owner, spender, amount); - - expectEvent.inLogs(logs, "Approval", { - owner, - spender, - value: amount, - }); - }); - - describe("when there was no approved amount before", () => { - it("approves the requested amount", async () => { - await approve.call(this, owner, spender, amount); - - expect(await ctx.token.allowance(owner, spender)).to.be.bignumber.equal(amount); - }); - }); - - describe("when the spender had an approved amount", () => { - beforeEach(async () => { - await approve.call(this, owner, spender, new BN(1)); - }); - - it("approves the requested amount and replaces the previous one", async () => { - await approve.call(this, owner, spender, amount); - - expect(await ctx.token.allowance(owner, spender)).to.be.bignumber.equal(amount); - }); - }); - }); - - describe("when the sender does not have enough balance", () => { - const amount = supply.addn(1); - - it("emits an approval event", async () => { - const { logs } = await approve.call(this, owner, spender, amount); - - expectEvent.inLogs(logs, "Approval", { - owner, - spender, - value: amount, - }); - }); - - describe("when there was no approved amount before", () => { - it("approves the requested amount", async () => { - await approve.call(this, owner, spender, amount); - - expect(await ctx.token.allowance(owner, spender)).to.be.bignumber.equal(amount); - }); - }); - - describe("when the spender had an approved amount", () => { - beforeEach(async () => { - await approve.call(this, owner, spender, new BN(1)); - }); - - it("approves the requested amount and replaces the previous one", async () => { - await approve.call(this, owner, spender, amount); - - expect(await ctx.token.allowance(owner, spender)).to.be.bignumber.equal(amount); - }); - }); - }); - }); - - describe("when the spender is the zero address", () => { - it("reverts", async () => { - await expectRevert( - approve.call(this, owner, ZERO_ADDRESS, supply), - `${errorPrefix}: approve to the zero address`, - ); - }); - }); -}; diff --git a/test/shared/behaviours/ERC20Burnable.behaviour.ts b/test/shared/behaviours/ERC20Burnable.behaviour.ts deleted file mode 100644 index d5eea197..00000000 --- a/test/shared/behaviours/ERC20Burnable.behaviour.ts +++ /dev/null @@ -1,125 +0,0 @@ -import { expectEvent, expectRevert } from "@openzeppelin/test-helpers"; -import { ZERO_ADDRESS } from "@utils/constants"; -import { BN } from "@utils/tools"; -import * as t from "types/generated"; -import envSetup from "@utils/env_setup"; - -const { expect } = envSetup.configure(); - -export default function shouldBehaveLikeERC20Burnable( - ctx: { burnableToken: t.ERC20BurnableInstance }, - owner, - initialBalance, - [burner], -): void { - describe("burn", () => { - describe("when the given amount is not greater than balance of the sender", () => { - const shouldBurn = (amount) => { - beforeEach(async () => { - ({ logs: this.logs } = await ctx.burnableToken.burn(amount, { from: owner })); - }); - - it("burns the requested amount", async () => { - expect(await ctx.burnableToken.balanceOf(owner)).to.be.bignumber.equal( - initialBalance.sub(amount), - ); - }); - - it("emits a transfer event", async () => { - expectEvent.inLogs(this.logs, "Transfer", { - from: owner, - to: ZERO_ADDRESS, - value: amount, - }); - }); - }; - - context("for a zero amount", () => { - shouldBurn(new BN(0)); - }); - - context("for a non-zero amount", () => { - shouldBurn(new BN(100)); - }); - }); - - describe("when the given amount is greater than the balance of the sender", () => { - const amount = initialBalance.addn(1); - - it("reverts", async () => { - await expectRevert( - ctx.burnableToken.burn(amount, { from: owner }), - "ERC20: burn amount exceeds balance", - ); - }); - }); - }); - - describe("burnFrom", () => { - describe("on success", () => { - const shouldBurnFrom = (amount) => { - const originalAllowance = amount.muln(3); - - beforeEach(async () => { - await ctx.burnableToken.approve(burner, originalAllowance, { from: owner }); - const { logs } = await ctx.burnableToken.burnFrom(owner, amount, { - from: burner, - }); - this.logs = logs; - }); - - it("burns the requested amount", async () => { - expect(await ctx.burnableToken.balanceOf(owner)).to.be.bignumber.equal( - initialBalance.sub(amount), - ); - }); - - it("decrements allowance", async () => { - expect(await ctx.burnableToken.allowance(owner, burner)).to.be.bignumber.equal( - originalAllowance.sub(amount), - ); - }); - - it("emits a transfer event", async () => { - expectEvent.inLogs(this.logs, "Transfer", { - from: owner, - to: ZERO_ADDRESS, - value: amount, - }); - }); - }; - - context("for a zero amount", () => { - shouldBurnFrom(new BN(0)); - }); - - context("for a non-zero amount", () => { - shouldBurnFrom(new BN(100)); - }); - }); - - describe("when the given amount is greater than the balance of the sender", () => { - const amount = initialBalance.addn(1); - - it("reverts", async () => { - await ctx.burnableToken.approve(burner, amount, { from: owner }); - await expectRevert( - ctx.burnableToken.burnFrom(owner, amount, { from: burner }), - "ERC20: burn amount exceeds balance", - ); - }); - }); - - describe("when the given amount is greater than the allowance", () => { - const allowance = new BN(100); - - it("reverts", async () => { - await ctx.burnableToken.approve(burner, allowance, { from: owner }); - await expectRevert( - ctx.burnableToken.burnFrom(owner, allowance.addn(1), { from: burner }), - "ERC20: burn amount exceeds allowance", - ); - }); - }); - }); -} diff --git a/test/shared/behaviours/Module.behaviour.ts b/test/shared/behaviours/Module.behaviour.ts deleted file mode 100644 index 23a34923..00000000 --- a/test/shared/behaviours/Module.behaviour.ts +++ /dev/null @@ -1,54 +0,0 @@ -import { StandardAccounts } from "@utils/machines"; -import { ZERO_ADDRESS } from "@utils/constants"; -import * as t from "types/generated"; - -const NexusArtifact = artifacts.require("Nexus"); - -export default function shouldBehaveLikeModule( - ctx: { module: t.ModuleInstance }, - sa: StandardAccounts, -): void { - // it("should have all ModuleKeys initialized", async () => { - // let key: string; - // key = await ctx.module.KEY_GOVERNANCE(); - // expect(key).to.equal(web3.utils.keccak256("Governance")); - - // key = await ctx.module.KEY_GOVERNANCE(); - // expect(key).to.equal(web3.utils.keccak256("ProxyAdmin")); - - // key = await ctx.module.KEY_STAKING(); - // expect(key).to.equal(web3.utils.keccak256("Staking")); - - // key = await ctx.module.KEY_ORACLE_HUB(); - // expect(key).to.equal(web3.utils.keccak256("OracleHub")); - - // key = await ctx.module.KEY_MANAGER(); - // expect(key).to.equal(web3.utils.keccak256("Manager")); - - // key = await ctx.module.KEY_RECOLLATERALISER(); - // expect(key).to.equal(web3.utils.keccak256("Recollateraliser")); - - // key = await ctx.module.KEY_META_TOKEN(); - // expect(key).to.equal(web3.utils.keccak256("MetaToken")); - - // key = await ctx.module.KEY_SAVINGS_MANAGER(); - // expect(key).to.equal(web3.utils.keccak256("SavingsManager")); - // }); - - it("should have Nexus", async () => { - const nexusAddr = await ctx.module.nexus(); - expect(nexusAddr).to.not.equal(ZERO_ADDRESS); - - const nexus: t.NexusInstance = await NexusArtifact.at(nexusAddr); - - const isInit = await nexus.initialized(); - expect(true).to.equal(isInit); - }); - - it("should have Governor address", async () => { - const nexusAddr = await ctx.module.nexus(); - const nexus: t.NexusInstance = await NexusArtifact.at(nexusAddr); - const nexusGovernor = await nexus.governor(); - expect(nexusGovernor).to.equal(sa.governor); - }); -} diff --git a/test/shared/behaviours/PausableModule.behaviour.ts b/test/shared/behaviours/PausableModule.behaviour.ts deleted file mode 100644 index e3e67f29..00000000 --- a/test/shared/behaviours/PausableModule.behaviour.ts +++ /dev/null @@ -1,109 +0,0 @@ -import { StandardAccounts } from "@utils/machines"; -import { expectEvent, expectRevert } from "@openzeppelin/test-helpers"; -import { ZERO_ADDRESS } from "@utils/constants"; -import * as t from "types/generated"; - -export default function shouldBehaveLikePausableModule( - ctx: { module: t.PausableModuleInstance }, - sa: StandardAccounts, -): void { - describe("pausableModule constructor", async () => { - it("should be in unpaused by default", async () => { - await this.shouldBePaused(ctx.module, false); - }); - - it("should have Nexus address set", async () => { - const nexus = await ctx.module.nexus(); - expect(nexus).to.not.equal(ZERO_ADDRESS); - }); - }); - - describe("pausing", async () => { - it("should succeed when called by the Governor", async () => { - const tx = await ctx.module.pause({ from: sa.governor }); - expectEvent(tx.receipt, "Paused", { account: sa.governor }); - await this.shouldBePaused(ctx.module, true); - }); - - it("should reject call by the non-Governor", async () => { - await this.shouldBePaused(ctx.module, false); - await expectRevert(ctx.module.pause({ from: sa.other }), "Only governor can execute"); - await this.shouldBePaused(ctx.module, false); - }); - - it("call should execute when not paused", async () => { - await this.shouldBePaused(ctx.module, false); - const tx = await ctx.module.pause({ from: sa.governor }); - expectEvent(tx.receipt, "Paused", { account: sa.governor }); - await this.shouldBePaused(ctx.module, true); - }); - - it("reject call if already paused", async () => { - await this.shouldBePaused(ctx.module, false); - const tx = await ctx.module.pause({ from: sa.governor }); - expectEvent(tx.receipt, "Paused", { account: sa.governor }); - await this.shouldBePaused(ctx.module, true); - await expectRevert(ctx.module.pause({ from: sa.governor }), "Pausable: paused"); - await this.shouldBePaused(ctx.module, true); - }); - }); - - describe("un-pausing", async () => { - it("should succeed when called by the Governor", async () => { - let tx = await ctx.module.pause({ from: sa.governor }); - expectEvent(tx.receipt, "Paused", { account: sa.governor }); - await this.shouldBePaused(ctx.module, true); - tx = await ctx.module.unpause({ from: sa.governor }); - expectEvent(tx.receipt, "Unpaused", { account: sa.governor }); - await this.shouldBePaused(ctx.module, false); - }); - it("should fail when called by the non-Governor", async () => { - await this.shouldBePaused(ctx.module, false); - const tx = await ctx.module.pause({ from: sa.governor }); - expectEvent(tx.receipt, "Paused", { account: sa.governor }); - await this.shouldBePaused(ctx.module, true); - - await expectRevert(ctx.module.unpause({ from: sa.other }), "Only governor can execute"); - await this.shouldBePaused(ctx.module, true); - }); - - it("should execute only when paused", async () => { - await this.shouldBePaused(ctx.module, false); - let tx = await ctx.module.pause({ from: sa.governor }); - expectEvent(tx.receipt, "Paused", { account: sa.governor }); - await this.shouldBePaused(ctx.module, true); - tx = await ctx.module.unpause({ from: sa.governor }); - expectEvent(tx.receipt, "Unpaused", { account: sa.governor }); - await this.shouldBePaused(ctx.module, false); - }); - - it("should reject if already unpaused", async () => { - await this.shouldBePaused(ctx.module, false); - await expectRevert(ctx.module.unpause({ from: sa.governor }), "Pausable: not paused"); - await this.shouldBePaused(ctx.module, false); - }); - }); - - describe("getting paused status", async () => { - it("should return true when paused", async () => { - await this.shouldBePaused(ctx.module, false); - const tx = await ctx.module.pause({ from: sa.governor }); - expectEvent(tx.receipt, "Paused", { account: sa.governor }); - await this.shouldBePaused(ctx.module, true); - }); - - it("should return false when unpaused", async () => { - let tx = await ctx.module.pause({ from: sa.governor }); - expectEvent(tx.receipt, "Paused", { account: sa.governor }); - await this.shouldBePaused(ctx.module, true); - tx = await ctx.module.unpause({ from: sa.governor }); - expectEvent(tx.receipt, "Unpaused", { account: sa.governor }); - await this.shouldBePaused(ctx.module, false); - }); - }); -} - -export async function shouldBePaused(module: t.PausableModuleInstance, flag: boolean) { - const paused = await module.paused(); - expect(flag, "Expected paused status not matched").to.equal(paused); -} diff --git a/test/shared/root.spec.ts b/test/shared/root.spec.ts new file mode 100644 index 00000000..d5bd97c6 --- /dev/null +++ b/test/shared/root.spec.ts @@ -0,0 +1,41 @@ +import { BN } from "@utils/math" +import { ethers } from "hardhat" +import { MockRoot, MockRoot__factory } from "types/generated" +import { expect } from "chai" + +describe("Root", () => { + let root: MockRoot + before(async () => { + const accounts = await ethers.getSigners() + root = await (await new MockRoot__factory(accounts[0])).deploy() + }) + + describe("calculating the root", () => { + it("returns floored root", async () => { + let amt = BN.from(1000000000) + let res = await root.sqrt(amt) + expect(res).to.be.eq(BN.from(31622)) + amt = BN.from(64) + res = await root.sqrt(amt) + expect(res).to.be.eq(BN.from(8)) + amt = BN.from("160000000000000000") + res = await root.sqrt(amt) + expect(res).to.be.eq(BN.from(400000000)) + }) + it("returns root for seconds in year", async () => { + const amt = BN.from("31540000") + const res = await root.sqrt(amt) + expect(res).to.be.eq(BN.from(5616)) + }) + it("returns root for seconds in 6 months", async () => { + const amt = BN.from("15724800") + const res = await root.sqrt(amt) + expect(res).to.be.eq(BN.from(3965)) + }) + it("returns root for seconds in week", async () => { + const amt = BN.from("604800") + const res = await root.sqrt(amt) + expect(res).to.be.eq(BN.from(777)) + }) + }) +}) diff --git a/test/shared/stable-math.spec.ts b/test/shared/stable-math.spec.ts new file mode 100644 index 00000000..74df7dba --- /dev/null +++ b/test/shared/stable-math.spec.ts @@ -0,0 +1,393 @@ +import { fullScale, ratioScale } from "@utils/constants" +import { BN, simpleToExactAmount } from "@utils/math" +import { ethers } from "hardhat" +import { PublicStableMath, PublicStableMath__factory } from "types/generated" +import { expect } from "chai" + +describe("StableMath", async () => { + let math: PublicStableMath + + before(async () => { + const accounts = await ethers.getSigners() + math = await (await new PublicStableMath__factory(accounts[0])).deploy() + }) + + /** ************************************* + GETTERS + *************************************** */ + + describe("calling the getters", async () => { + it("should return the correct scale", async () => { + expect(await math.getFullScale()).to.be.eq(simpleToExactAmount(1, 18)) + expect(await math.getFullScale()).to.be.eq(fullScale) + }) + + it("should return the correct ratio scale", async () => { + expect(await math.getRatioScale()).to.be.eq(simpleToExactAmount(1, 8)) + expect(await math.getRatioScale()).to.be.eq(ratioScale) + }) + }) + + describe("scaling an integer", async () => { + it("should scale an integer correctly", async () => { + expect(await math.scaleInteger("1000")).to.be.eq(simpleToExactAmount(1000, 18)) + expect(await math.scaleInteger("7")).to.be.eq(simpleToExactAmount(7, 18)) + expect(await math.scaleInteger("111231231231")).to.be.eq(simpleToExactAmount(111231231231, 18)) + expect(await math.scaleInteger(simpleToExactAmount(1, 18))).to.be.eq(simpleToExactAmount(1, 36)) + expect(await math.scaleInteger(1)).to.be.eq(simpleToExactAmount(1, 18)) + }) + + it("should fail if integer overflow", async () => { + await expect(math.scaleInteger(simpleToExactAmount(1, 70))).to.be.revertedWith("VM Exception") + }) + }) + + /** ************************************* + PRECISE ARITHMETIC + *************************************** */ + + describe("calling mulTruncate(x, y, scale)", async () => { + it("should return correct results", async () => { + let x = simpleToExactAmount(1, 10) + let y = simpleToExactAmount(9, 9) + let scale = simpleToExactAmount(1, 12) + let result = await math.mulTruncateScale(x, y, scale) + expect(result).to.be.eq(BN.from(x).mul(y).div(scale)) + expect(result).to.be.lt(x) + + x = simpleToExactAmount(250, 22) + y = simpleToExactAmount(95, 16) + scale = fullScale + result = await math.mulTruncateScale(x, y, scale) + expect(result).to.be.eq(BN.from(x).mul(y).div(scale)) + expect(result).to.be.lt(x) + }) + it("should truncate fractions", async () => { + const x = BN.from(11) + const y = BN.from(3) + // 33 / 10 == 3.33.. should return 3 + const result = await math.mulTruncateScale(x, y, BN.from(10)) + expect(result).to.be.eq(BN.from(3)) + }) + it("should fail if scale operand is 0", async () => { + const sampleInput = simpleToExactAmount(1, 18) + await expect(math.mulTruncateScale(sampleInput, sampleInput, 0)).to.be.revertedWith("VM Exception") + }) + it("should return 0 if either operand is 0", async () => { + expect(await math.mulTruncateScale(BN.from(0), simpleToExactAmount(1, 18), fullScale)).to.be.eq(BN.from(0)) + expect(await math.mulTruncateScale(simpleToExactAmount(1, 18), BN.from(0), fullScale)).to.be.eq(BN.from(0)) + }) + }) + + describe("calling mulTruncate(x, y)", async () => { + it("should return correct results", async () => { + let x = simpleToExactAmount(1, 10) + let y = simpleToExactAmount(9, 9) + let result = await math.mulTruncate(x, y) + expect(result).to.be.eq(BN.from(x).mul(y).div(fullScale)) + expect(result).to.be.lt(x) + + x = simpleToExactAmount(1, 20) + y = simpleToExactAmount(25, 16) + result = await math.mulTruncate(x, y) + expect(result).to.be.eq(simpleToExactAmount(25, 18)) + expect(result).to.be.lt(x) + }) + it("should truncate fractions", async () => { + const x = BN.from(1234) + const y = simpleToExactAmount(75, 16) + const result = await math.mulTruncate(x, y) + // 75% of 1234 = 925.5, round to 925 + expect(result).to.be.eq(BN.from(925)) + }) + it("should return 0 if operands multiplied are less than the scale", async () => { + const x = BN.from(100) + const y = simpleToExactAmount(1, 15) + const result = await math.mulTruncate(x, y) + // (1e2 * 1e15) / 1e18 = 0.1 + expect(result).to.be.eq(BN.from(0)) + }) + it("should return 0 if either operand is 0", async () => { + expect(await math.mulTruncate(BN.from(0), simpleToExactAmount(1, 18))).to.be.eq(BN.from(0)) + expect(await math.mulTruncate(simpleToExactAmount(1, 18), BN.from(0))).to.be.eq(BN.from(0)) + }) + }) + + describe("calling mulTruncateCeil(x, y)", async () => { + it("should round up any fraction", async () => { + let x = BN.from(3) + let y = simpleToExactAmount(11, 17) + let result = await math.mulTruncateCeil(x, y) + // (3 * 11e17) / 1e18 == 33e17 / 1e18 == 3.3. + expect(result).to.be.eq(BN.from(4)) + + x = BN.from(1) + y = simpleToExactAmount(95, 16) + result = await math.mulTruncateCeil(x, y) + // (1 * 95e16) / 1e18 == 0.95 + expect(result).to.be.eq(BN.from(1)) + + x = BN.from(1234) + y = simpleToExactAmount(75, 16) + result = await math.mulTruncateCeil(x, y) + // 75% of 1234 = 925.5, round to 926 + expect(result).to.be.eq(BN.from(926)) + }) + it("should return 1 if operands multiplied are less than the scale", async () => { + const x = BN.from(100) + const y = simpleToExactAmount(1, 15) + const result = await math.mulTruncateCeil(x, y) + // (1e2 * 1e15) / 1e18 = 0.1 + expect(result).to.be.eq(BN.from(1)) + }) + it("should not round a 0 fraction", async () => { + const x = BN.from(30) + const y = simpleToExactAmount(11, 17) + const result = await math.mulTruncateCeil(x, y) + // (30 * 11e17) / 1e18 == 33e18 / 1e18 == 33 + expect(result).to.be.eq(BN.from(33)) + }) + it("should return 0 if either operand is 0", async () => { + expect(await math.mulTruncateCeil(BN.from(0), simpleToExactAmount(1, 18))).to.be.eq(BN.from(0)) + expect(await math.mulTruncateCeil(simpleToExactAmount(1, 18), BN.from(0))).to.be.eq(BN.from(0)) + }) + }) + + describe("calling divPrecisely(x, y)", async () => { + it("should calculate x as a percentage value of y to scale of 1e18", async () => { + let x = simpleToExactAmount(1, 18) + let y = simpleToExactAmount(1, 17) + let result = await math.divPrecisely(x, y) + // (1e18 * 1e18) / 1e17 == 1e19 + expect(result).to.be.eq(simpleToExactAmount(1, 19)) + + x = simpleToExactAmount(1, 17) + y = simpleToExactAmount(1, 19) + result = await math.divPrecisely(x, y) + // (1e17 * 1e18) / 1e19 == 1e16 + expect(result).to.be.eq(simpleToExactAmount(1, 16)) + }) + it("should ignore remaining fractions", async () => { + let x = BN.from(100) + let y = simpleToExactAmount(1234, 16) + let result = await math.divPrecisely(x, y) + // (1e2 * 1e18) / 1234e16 == 8.103... + expect(result).to.be.eq(BN.from(8)) + + x = simpleToExactAmount(1, 4) + y = simpleToExactAmount(1, 24) + result = await math.divPrecisely(x, y) + // (1e4 * 1e18) / 1e24 == 0.01 + expect(result).to.be.eq(BN.from(0)) + }) + it("should fail if the divisor is 0", async () => { + const sampleInput = simpleToExactAmount(1, 18) + await expect(math.divPrecisely(sampleInput, 0)).to.be.revertedWith("VM Exception") + }) + it("should fail if the left operand is too large", async () => { + const sampleInput = simpleToExactAmount(1, 65) + await expect(math.divPrecisely(sampleInput, simpleToExactAmount(1, 18))).to.be.revertedWith("VM Exception") + }) + }) + + /** ************************************* + RATIO FUNCS + *************************************** */ + + describe("calling mulRatioTruncate(x, ratio)", async () => { + it("should calculate correct mAsset value from bAsset", async () => { + let x = simpleToExactAmount(1, 4) // 1e4 base bAsset units + let y = ratioScale // 1e8 standard ratio + let result = await math.mulRatioTruncate(x, y) + expect(result).to.be.eq(simpleToExactAmount(1, 4)) + + x = simpleToExactAmount(1, 12) // 1e12 units of bAsset + y = simpleToExactAmount(1, 14) // bAsset with 12 decimals, 1e8 * 1e(18-12) + result = await math.mulRatioTruncate(x, y) + expect(result).to.be.eq(simpleToExactAmount(1, 18)) + + x = BN.from(1234) // 1234 units of bAsset + y = simpleToExactAmount("0.324", 14) // bAsset with 12 decimals and 0.324 mm + result = await math.mulRatioTruncate(x, y) + // result == 399.816 units + expect(result).to.be.eq(BN.from(399816000)) + }) + it("should truncate fractions", async () => { + const x = BN.from(1234) // 1234 units of bAsset + const y = simpleToExactAmount("0.324", 8) // bAsset with 18 decimals, but 0.324 mm + const result = await math.mulRatioTruncate(x, y) + // result == 399.816 units + expect(result).to.be.eq(BN.from(399)) + }) + it("should return 0 if operands multiplied are less than the scale", async () => { + const x = BN.from(100) + const y = simpleToExactAmount(1, 5) + const result = await math.mulRatioTruncate(x, y) + // (1e2 * 1e5) / 1e8 = 0.1 + expect(result).to.be.eq(BN.from(0)) + }) + it("should return 0 if either operand is 0", async () => { + expect(await math.mulRatioTruncate(BN.from(0), simpleToExactAmount(1, 18))).to.be.eq(BN.from(0)) + expect(await math.mulRatioTruncate(simpleToExactAmount(1, 18), BN.from(0))).to.be.eq(BN.from(0)) + }) + }) + + describe("calling mulRatioTruncateCeil(x, ratio)", async () => { + it("should calculate correct mAsset value from bAsset", async () => { + let x = simpleToExactAmount(1, 4) // 1e4 base bAsset units + let y = ratioScale // 1e8 standard ratio + let result = await math.mulRatioTruncateCeil(x, y) + expect(result).to.be.eq(simpleToExactAmount(1, 4)) + + x = simpleToExactAmount(1, 12) // 1e12 units of bAsset + y = simpleToExactAmount(1, 14) // bAsset with 12 decimals, 1e8 * 1e(18-12) + result = await math.mulRatioTruncateCeil(x, y) + expect(result).to.be.eq(simpleToExactAmount(1, 18)) + + x = BN.from(1234) // 1234 units of bAsset + y = simpleToExactAmount("0.324", 14) // bAsset with 12 decimals and 0.324 mm + result = await math.mulRatioTruncateCeil(x, y) + // result == 399.816 units + expect(result).to.be.eq(BN.from(399816000)) + }) + it("should round up any fractions", async () => { + let x = BN.from(1234) // 1234 units of bAsset + let y = simpleToExactAmount("0.324", 8) // bAsset with 18 decimals, but 0.324 mm + let result = await math.mulRatioTruncateCeil(x, y) + // result == 399.816 units + expect(result).to.be.eq(BN.from(400)) + + x = simpleToExactAmount(1234, 3) // 1.234e6 units of bAsset + y = simpleToExactAmount(3243, 4) // ratio = 3.243e7 + result = await math.mulRatioTruncateCeil(x, y) + // result == 400186.2 units + expect(result).to.be.eq(BN.from(400187)) + }) + it("should return 1 if operands multiplied are less than the scale", async () => { + const x = BN.from(100) + const y = simpleToExactAmount(1, 5) + const result = await math.mulRatioTruncateCeil(x, y) + // (1e2 * 1e5) / 1e8 = 0.1 + expect(result).to.be.eq(BN.from(1)) + }) + it("should return 0 if either operand is 0", async () => { + expect(await math.mulRatioTruncateCeil(BN.from(0), simpleToExactAmount(1, 18))).to.be.eq(BN.from(0)) + expect(await math.mulRatioTruncateCeil(simpleToExactAmount(1, 18), BN.from(0))).to.be.eq(BN.from(0)) + }) + }) + + describe("calling divRatioPrecisely(x, ratio)", async () => { + it("should calculate x as a percentage value of y to scale of 1e8", async () => { + let x = simpleToExactAmount(1, 18) + let y = simpleToExactAmount(1, 8) + let result = await math.divRatioPrecisely(x, y) + // (1e18 * 1e8) / 1e8 == 1e18 + expect(result).to.be.eq(simpleToExactAmount(1, 18)) + + x = simpleToExactAmount(1, 14) // 1e14 base units of mAsset + y = simpleToExactAmount(1, 12) // bAsset with 14 decimals + result = await math.divRatioPrecisely(x, y) + // Should equal mAsset units - 4 decimals, or 1e10 + expect(result).to.be.eq(simpleToExactAmount(1, 10)) + + x = simpleToExactAmount("0.235", 18) // 235e15 + y = simpleToExactAmount(1, 12) + result = await math.divRatioPrecisely(x, y) + // Should equal mAsset units - 4 decimals, or 235e11 + expect(result).to.be.eq(simpleToExactAmount(235, 11)) + }) + it("should ignore remaining fractions", async () => { + let x = BN.from(100) + let y = simpleToExactAmount(1234, 6) + let result = await math.divRatioPrecisely(x, y) + // (1e2 * 1e8) / 1234e6 == 8.103... + expect(result).to.be.eq(BN.from(8)) + + x = simpleToExactAmount(1, 4) + y = simpleToExactAmount(1, 14) + result = await math.divRatioPrecisely(x, y) + // (1e4 * 1e8) / 1e14 == 0.01 + expect(result).to.be.eq(BN.from(0)) + }) + it("should fail if the divisor is 0", async () => { + const sampleInput = simpleToExactAmount(1, 18) + await expect(math.divRatioPrecisely(sampleInput, 0)).to.be.revertedWith("VM Exception") + }) + it("should fail if the left operand is too large", async () => { + const sampleInput = simpleToExactAmount(1, 71) + await expect(math.divRatioPrecisely(sampleInput, simpleToExactAmount(1, 8))).to.be.revertedWith("VM Exception") + }) + }) + + /** ************************************* + HELPERS + *************************************** */ + + describe("calling min(x, y)", async () => { + it("should find the minimum number", async () => { + let x = BN.from(1) + let y = BN.from(2) + expect(await math.min(x, y)).to.be.eq(x) + expect(await math.min(y, x)).to.be.eq(x) + + x = BN.from(2) + y = BN.from(1) + expect(await math.min(x, y)).to.be.eq(y) + expect(await math.min(y, x)).to.be.eq(y) + + x = BN.from(0) + y = simpleToExactAmount(2323, 24) + expect(await math.min(x, y)).to.be.eq(x) + expect(await math.min(y, x)).to.be.eq(x) + + x = simpleToExactAmount("0.242", 4) + y = BN.from(0) + expect(await math.min(x, y)).to.be.eq(y) + expect(await math.min(y, x)).to.be.eq(y) + }) + }) + + describe("calling max(x, y)", async () => { + it("should find the maximum number", async () => { + let x = BN.from(1) + let y = BN.from(2) + expect(await math.max(x, y)).to.be.eq(y) + expect(await math.max(y, x)).to.be.eq(y) + + x = BN.from(2) + y = BN.from(1) + expect(await math.max(x, y)).to.be.eq(x) + expect(await math.max(y, x)).to.be.eq(x) + + x = BN.from(0) + y = simpleToExactAmount(2323, 24) + expect(await math.max(x, y)).to.be.eq(y) + expect(await math.max(y, x)).to.be.eq(y) + + x = simpleToExactAmount("0.242", 4) + y = BN.from(0) + expect(await math.max(x, y)).to.be.eq(x) + expect(await math.max(y, x)).to.be.eq(x) + }) + }) + + describe("calling clamp(x, uepprBound)", async () => { + it("should clamp to the upper bound", async () => { + let x = BN.from(1) + let bound = BN.from(2) + expect(await math.clamp(x, bound)).to.be.eq(x) + + x = BN.from(2) + bound = BN.from(1) + expect(await math.clamp(x, bound)).to.be.eq(bound) + + x = BN.from(0) + bound = simpleToExactAmount(2323, 24) + expect(await math.clamp(x, bound)).to.be.eq(x) + + x = simpleToExactAmount("0.242", 4) + bound = BN.from(0) + expect(await math.clamp(x, bound)).to.be.eq(bound) + }) + }) +}) diff --git a/test/upgradability/TestDelayedProxyAdmin.spec.ts b/test/upgradability/TestDelayedProxyAdmin.spec.ts deleted file mode 100644 index 8fcadf73..00000000 --- a/test/upgradability/TestDelayedProxyAdmin.spec.ts +++ /dev/null @@ -1,630 +0,0 @@ -/* eslint-disable @typescript-eslint/explicit-function-return-type */ -/* eslint-disable @typescript-eslint/no-use-before-define */ -import { expectRevert, expectEvent, time } from "@openzeppelin/test-helpers"; -import { StandardAccounts } from "@utils/machines"; -import { ZERO_ADDRESS, ZERO } from "@utils/constants"; -import { BN } from "@utils/tools"; -import envSetup from "@utils/env_setup"; -import * as t from "types/generated"; -import shouldBehaveLikeModule from "../shared/behaviours/Module.behaviour"; - -; - -const { expect } = envSetup.configure(); -const DelayedProxyAdmin = artifacts.require("DelayedProxyAdmin"); -const InitializableProxy = artifacts.require( - // eslint-disable-next-line @typescript-eslint/ban-ts-ignore - // @ts-ignore - "@openzeppelin/upgrades/InitializableAdminUpgradeabilityProxy", -) as t.InitializableAdminUpgradeabilityProxyContract; -const MockImplementationV1 = artifacts.require("MockImplementationV1"); -const MockImplementationV2 = artifacts.require("MockImplementationV2"); -const MockImplementationV3 = artifacts.require("MockImplementationV3"); -const MockNexus = artifacts.require("MockNexus"); - -contract("DelayedProxyAdmin", async (accounts) => { - let nexus: t.MockNexusInstance; - const ctx: { module?: t.ModuleInstance } = {}; - const sa = new StandardAccounts(accounts); - const governanceAddr = sa.governor; - const managerAddr = sa.dummy1; - const ONE_DAY = new BN(60 * 60 * 24); - const ONE_WEEK = ONE_DAY.mul(new BN(7)); - - let delayedProxyAdmin: t.DelayedProxyAdminInstance; - let proxy: t.InitializableAdminUpgradeabilityProxyInstance; - let mockImplV1: t.MockImplementationV1Instance; - let mockImplV2: t.MockImplementationV2Instance; - let mockImplV3: t.MockImplementationV3Instance; - - before("before all", async () => { - // create New Nexus - nexus = await MockNexus.new(sa.governor, governanceAddr, managerAddr); - }); - - describe("behaviours", async () => { - beforeEach("before each", async () => { - ctx.module = await DelayedProxyAdmin.new(nexus.address); - }); - - shouldBehaveLikeModule(ctx as Required, sa); - }); - - describe("constructor", async () => { - context("should succeed", async () => { - it("when valid Nexus address is given", async () => { - const instance = await DelayedProxyAdmin.new(nexus.address); - const nexusAddr = await instance.nexus(); - expect(nexus.address).to.equal(nexusAddr); - }); - }); - - context("should fail", async () => { - it("when zero Nexus address", async () => { - await expectRevert(DelayedProxyAdmin.new(ZERO_ADDRESS), "Nexus is zero address"); - }); - }); - }); - - beforeEach("before each", async () => { - // 1. Deploy DelayedProxyAdmin - delayedProxyAdmin = await DelayedProxyAdmin.new(nexus.address); - - await nexus.setProxyAdmin(delayedProxyAdmin.address); - - // 2. Deploy MockImplementation - mockImplV1 = await MockImplementationV1.new(); - let uintVal = await mockImplV1.uintVal(); - expect(new BN(1)).to.bignumber.equal(uintVal); - // 2.1 Deploy a proxy contract - proxy = await InitializableProxy.new(); - // 2.2 Initialize Proxy contract of MockImplementation - const data = mockImplV1.contract.methods.initialize(delayedProxyAdmin.address).encodeABI(); - await proxy.methods["initialize(address,address,bytes)"]( - mockImplV1.address, - delayedProxyAdmin.address, - data, - ); - - // Validate Setup - // =============== - const proxyToImpl: t.MockImplementationV1Instance = await MockImplementationV1.at( - proxy.address, - ); - uintVal = await proxyToImpl.uintVal(); - expect(new BN(2)).to.bignumber.equal(uintVal); - const version = await proxyToImpl.version(); - expect("V1").to.equal(version); - - // Deploy new implementation - mockImplV2 = await MockImplementationV2.new(); - }); - - describe("proposeUpgrade()", async () => { - context("should succeed", async () => { - it("when valid upgrade proposed and function called by the Governor", async () => { - const tx = await delayedProxyAdmin.proposeUpgrade( - proxy.address, - mockImplV2.address, - "0x", - { from: sa.governor }, - ); - const timestamp = await time.latest(); - await expectInRequest( - delayedProxyAdmin, - proxy.address, - mockImplV2.address, - null, - timestamp, - ); - - expectEvent(tx.receipt, "UpgradeProposed", { - proxy: proxy.address, - implementation: mockImplV2.address, - data: null, - }); - await expectDataInMockImpl(proxy, "V1", new BN(2)); - }); - - it("when valid upgrade with data", async () => { - const encodeData = mockImplV2.contract.methods.initializeV2().encodeABI(); - const tx = await delayedProxyAdmin.proposeUpgrade( - proxy.address, - mockImplV2.address, - encodeData, - { from: sa.governor }, - ); - const timestamp = await time.latest(); - await expectInRequest( - delayedProxyAdmin, - proxy.address, - mockImplV2.address, - encodeData, - timestamp, - ); - - expectEvent(tx.receipt, "UpgradeProposed", { - proxy: proxy.address, - implementation: mockImplV2.address, - data: encodeData, - }); - await expectDataInMockImpl(proxy, "V1", new BN(2)); - }); - }); - - context("should fail", async () => { - it("when valid upgrade proposed and function called by the Other", async () => { - await expectRevert( - delayedProxyAdmin.proposeUpgrade(proxy.address, mockImplV2.address, "0x", { - from: sa.other, - }), - "Only governor can execute", - ); - await expectInRequest( - delayedProxyAdmin, - proxy.address, - ZERO_ADDRESS, - null, - new BN(0), - ); - }); - - it("when proxy address is zero", async () => { - await expectRevert( - delayedProxyAdmin.proposeUpgrade(ZERO_ADDRESS, mockImplV2.address, "0x", { - from: sa.governor, - }), - "Proxy address is zero", - ); - }); - - it("when implementation address is zero", async () => { - await expectRevert( - delayedProxyAdmin.proposeUpgrade(proxy.address, ZERO_ADDRESS, "0x", { - from: sa.governor, - }), - "Implementation address is zero", - ); - }); - - it("when proxy return zero implementation address", async () => { - // Proxy without implementation - const newProxy = await InitializableProxy.new(); - await expectRevert.unspecified( - delayedProxyAdmin.proposeUpgrade(newProxy.address, mockImplV2.address, "0x", { - from: sa.governor, - }), - ); - }); - - it("when proxy admin not control the given proxy", async () => { - // Deploy a Proxy with implementation - const initProxy: t.InitializableAdminUpgradeabilityProxyInstance = await InitializableProxy.new(); - const mockImpl = await MockImplementationV2.new(); - await initProxy.methods["initialize(address,address,bytes)"]( - mockImpl.address, - sa.other, - "0x", - ); - - mockImplV3 = await MockImplementationV3.new(); - - await expectRevert( - delayedProxyAdmin.proposeUpgrade(initProxy.address, mockImplV3.address, "0x", { - from: sa.governor, - }), - "Call failed", - ); - }); - - it("when upgrade already proposed for same proxy", async () => { - const tx = await delayedProxyAdmin.proposeUpgrade( - proxy.address, - mockImplV2.address, - "0x", - { from: sa.governor }, - ); - const timestamp = await time.latest(); - await expectInRequest( - delayedProxyAdmin, - proxy.address, - mockImplV2.address, - null, - timestamp, - ); - expectEvent(tx.receipt, "UpgradeProposed", { - proxy: proxy.address, - implementation: mockImplV2.address, - data: null, - }); - await expectRevert( - delayedProxyAdmin.proposeUpgrade(proxy.address, mockImplV2.address, "0x", { - from: sa.governor, - }), - "Upgrade already proposed", - ); - await expectInRequest( - delayedProxyAdmin, - proxy.address, - mockImplV2.address, - null, - timestamp, - ); - }); - - it("when new implementation same as current implementation", async () => { - await expectRevert( - delayedProxyAdmin.proposeUpgrade(proxy.address, mockImplV1.address, "0x", { - from: sa.governor, - }), - "Implementation must be different", - ); - }); - }); - }); - - describe("cancelUpgrade()", async () => { - beforeEach("before each", async () => { - // 1. Propose an upgrade request - const encodeData = mockImplV2.contract.methods.initializeV2().encodeABI(); - const tx = await delayedProxyAdmin.proposeUpgrade( - proxy.address, - mockImplV2.address, - encodeData, - { from: sa.governor }, - ); - const timestamp = await time.latest(); - await expectInRequest( - delayedProxyAdmin, - proxy.address, - mockImplV2.address, - encodeData, - timestamp, - ); - - expectEvent(tx.receipt, "UpgradeProposed", { - proxy: proxy.address, - implementation: mockImplV2.address, - data: encodeData, - }); - await expectDataInMockImpl(proxy, "V1", new BN(2)); - }); - - context("should succeed", async () => { - it("when valid cancel request and function called by the Governor", async () => { - // Immediate cancel - const tx = await delayedProxyAdmin.cancelUpgrade(proxy.address, { - from: sa.governor, - }); - await expectInRequest( - delayedProxyAdmin, - proxy.address, - ZERO_ADDRESS, - null, - new BN(0), - ); - expectEvent(tx.receipt, "UpgradeCancelled", { proxy: proxy.address }); - }); - - it("when cancel after 1 week as well", async () => { - // Cancel after 1 week - await time.increase(ONE_WEEK); - const tx = await delayedProxyAdmin.cancelUpgrade(proxy.address, { - from: sa.governor, - }); - await expectInRequest( - delayedProxyAdmin, - proxy.address, - ZERO_ADDRESS, - null, - new BN(0), - ); - expectEvent(tx.receipt, "UpgradeCancelled", { proxy: proxy.address }); - }); - }); - - context("should fail", async () => { - it("when valid cancel request and function called by the Other", async () => { - const result = await delayedProxyAdmin.requests(proxy.address); - const implAddr = result[0]; - const data = result[1]; - const timestamp = result[2]; - expect(implAddr).to.equal(mockImplV2.address); - expect(data).to.not.equal(null); - expect(timestamp).to.bignumber.not.equal(new BN(0)); - await expectRevert( - delayedProxyAdmin.cancelUpgrade(proxy.address, { from: sa.other }), - "Only governor can execute", - ); - await expectInRequest( - delayedProxyAdmin, - proxy.address, - mockImplV2.address, - data, - timestamp, - ); - }); - - it("when proxy address is zero", async () => { - await expectRevert( - delayedProxyAdmin.cancelUpgrade(ZERO_ADDRESS, { from: sa.governor }), - "Proxy address is zero", - ); - }); - - it("when no valid request found", async () => { - await expectRevert( - delayedProxyAdmin.cancelUpgrade(sa.dummy2, { from: sa.governor }), - "No request found", - ); - }); - }); - }); - - describe("acceptRequest()", async () => { - let encodeData: string; - beforeEach("before each", async () => { - // 1. Propose an upgrade request - encodeData = mockImplV2.contract.methods.initializeV2().encodeABI(); - const tx = await delayedProxyAdmin.proposeUpgrade( - proxy.address, - mockImplV2.address, - encodeData, - { from: sa.governor }, - ); - const timestamp = await time.latest(); - await expectInRequest( - delayedProxyAdmin, - proxy.address, - mockImplV2.address, - encodeData, - timestamp, - ); - - expectEvent(tx.receipt, "UpgradeProposed", { - proxy: proxy.address, - implementation: mockImplV2.address, - data: encodeData, - }); - await expectDataInMockImpl(proxy, "V1", new BN(2)); - }); - - context("should succeed", async () => { - it("when valid request and function called by the Governor", async () => { - await time.increase(ONE_WEEK); - const tx = await delayedProxyAdmin.acceptUpgradeRequest(proxy.address, { - from: sa.governor, - }); - await expectDataInMockImpl(proxy, "V2", new BN(3)); - await expectInRequest( - delayedProxyAdmin, - proxy.address, - ZERO_ADDRESS, - null, - new BN(0), - ); - expectEvent(tx.receipt, "Upgraded", { - proxy: proxy.address, - oldImpl: mockImplV1.address, - newImpl: mockImplV2.address, - data: encodeData, - }); - }); - - it("when only implementation contract is upgraded without data", async () => { - // Cancel earlier request as it was with data - await delayedProxyAdmin.cancelUpgrade(proxy.address, { from: sa.governor }); - // propose new upgrade request - await delayedProxyAdmin.proposeUpgrade(proxy.address, mockImplV2.address, "0x", { - from: sa.governor, - }); - await time.increase(ONE_WEEK); - const tx = await delayedProxyAdmin.acceptUpgradeRequest(proxy.address, { - from: sa.governor, - }); - await expectEvent(tx.receipt, "Upgraded", { - proxy: proxy.address, - oldImpl: mockImplV1.address, - newImpl: mockImplV2.address, - data: null, - }); - }); - - it("when ETH is sent to upgraded implementation along with function call", async () => { - await time.increase(ONE_WEEK); - await delayedProxyAdmin.acceptUpgradeRequest(proxy.address, { - from: sa.governor, - value: "100", - }); - const bal = await web3.eth.getBalance(proxy.address); - expect(new BN(100)).to.bignumber.equal(bal); - }); - }); - - context("should fail", async () => { - it("when valid request and function called by the Other", async () => { - await expectRevert( - delayedProxyAdmin.acceptUpgradeRequest(proxy.address, { from: sa.other }), - "Only governor can execute", - ); - }); - - it("when proxy address is zero", async () => { - await expectRevert( - delayedProxyAdmin.acceptUpgradeRequest(ZERO_ADDRESS, { from: sa.governor }), - "Proxy address is zero", - ); - }); - - it("when no request found", async () => { - await expectRevert( - delayedProxyAdmin.acceptUpgradeRequest(sa.dummy4, { from: sa.governor }), - "Delay not over", - ); - }); - - it("when opt-out delay not over", async () => { - const timestamp = await time.latest(); - await time.increase(ONE_DAY); - await expectRevert( - delayedProxyAdmin.acceptUpgradeRequest(proxy.address, { - from: sa.governor, - }), - "Delay not over", - ); - await expectInRequest( - delayedProxyAdmin, - proxy.address, - mockImplV2.address, - encodeData, - timestamp, - ); - }); - - it("when opt-out delay is 10 seconds before 1 week", async () => { - const timestamp = await time.latest(); - await time.increase(ONE_WEEK.sub(new BN(10))); - await expectRevert( - delayedProxyAdmin.acceptUpgradeRequest(proxy.address, { - from: sa.governor, - }), - "Delay not over", - ); - await expectInRequest( - delayedProxyAdmin, - proxy.address, - mockImplV2.address, - encodeData, - timestamp, - ); - }); - - it("when ETH sent and no data supplied", async () => { - await delayedProxyAdmin.cancelUpgrade(proxy.address, { from: sa.governor }); - await delayedProxyAdmin.proposeUpgrade(proxy.address, mockImplV2.address, "0x", { - from: sa.governor, - }); - await time.increase(ONE_WEEK); - await expectRevert( - delayedProxyAdmin.acceptUpgradeRequest(proxy.address, { - from: sa.governor, - value: "100", - }), - "msg.value should be zero", - ); - const bal = await web3.eth.getBalance(proxy.address); - expect(new BN(0)).to.bignumber.equal(bal); - }); - }); - }); - - describe("view functions", async () => { - beforeEach("before each", async () => { - // 1. Propose an upgrade request - const encodeData = mockImplV2.contract.methods.initializeV2().encodeABI(); - const tx = await delayedProxyAdmin.proposeUpgrade( - proxy.address, - mockImplV2.address, - encodeData, - { from: sa.governor }, - ); - const timestamp = await time.latest(); - await expectInRequest( - delayedProxyAdmin, - proxy.address, - mockImplV2.address, - encodeData, - timestamp, - ); - - expectEvent(tx.receipt, "UpgradeProposed", { - proxy: proxy.address, - implementation: mockImplV2.address, - data: encodeData, - }); - await expectDataInMockImpl(proxy, "V1", new BN(2)); - }); - - describe("getProxyAdmin()", async () => { - context("should succeed", async () => { - it("when proxy exist and returns admin address", async () => { - const proxyAdmin = await delayedProxyAdmin.getProxyAdmin(proxy.address); - expect(delayedProxyAdmin.address).to.equal(proxyAdmin); - }); - }); - - context("should fail", async () => { - it("when proxy address is zero", async () => { - await expectRevert.unspecified(delayedProxyAdmin.getProxyAdmin(ZERO_ADDRESS)); - }); - - it("when wrong proxy address", async () => { - await expectRevert.unspecified(delayedProxyAdmin.getProxyAdmin(sa.dummy4)); - }); - }); - }); - - describe("getProxyImplementation()", async () => { - context("should succeed", async () => { - it("when proxy exist and returns implementation address", async () => { - const implAddr = await delayedProxyAdmin.getProxyImplementation(proxy.address); - expect(mockImplV1.address).to.equal(implAddr); - }); - - it("when proxy upgraded to new implementation", async () => { - let implAddr = await delayedProxyAdmin.getProxyImplementation(proxy.address); - expect(mockImplV1.address).to.equal(implAddr); - - await time.increase(ONE_WEEK); - - await delayedProxyAdmin.acceptUpgradeRequest(proxy.address, { - from: sa.governor, - }); - - implAddr = await delayedProxyAdmin.getProxyImplementation(proxy.address); - expect(mockImplV2.address).to.equal(implAddr); - }); - }); - - context("should fail", async () => { - it("when proxy address is zero", async () => { - await expectRevert.unspecified( - delayedProxyAdmin.getProxyImplementation(ZERO_ADDRESS), - ); - }); - }); - }); - }); -}); - -async function expectInRequest( - proxyAdmin: t.DelayedProxyAdminInstance, - proxy: string, - impl: string, - data: string, - timestamp: BN, -) { - expect(proxy).to.not.equal(ZERO_ADDRESS); - const req = await proxyAdmin.requests(proxy); - const reqImpl: string = req[0]; - const reqData: string = req[1]; - const reqTimestamp: BN = req[2]; - - expect(impl).to.equal(reqImpl); - expect(data).to.equal(reqData); - expect(timestamp).to.bignumber.equal(reqTimestamp); -} - -async function expectDataInMockImpl( - proxy: t.InitializableAdminUpgradeabilityProxyInstance, - version: string, - uintVal: BN, -) { - const proxyToImpl: t.MockImplementationV2Instance = await MockImplementationV2.at( - proxy.address, - ); - const returnedVersion = await proxyToImpl.version(); - expect(version).to.equal(returnedVersion); - const returnedUintVal = await proxyToImpl.uintVal(); - expect(uintVal).to.bignumber.equals(returnedUintVal); -} diff --git a/truffle-config.js b/truffle-config.js deleted file mode 100644 index 11c5f8c4..00000000 --- a/truffle-config.js +++ /dev/null @@ -1,74 +0,0 @@ -require('ts-node/register') -// OPTIONAL: Allows the use of tsconfig path mappings with ts-node -require('tsconfig-paths/register') - -const HDWalletProvider = require('@truffle/hdwallet-provider') - - -module.exports = { - // See - // for more about customizing your Truffle configuration! - - migrations_directory: './migrations', - contracts_build_directory: './build/contracts', - plugins: ['solidity-coverage', 'truffle-plugin-verify'], - api_keys: { - etherscan: '' - }, - networks: { - development: { - host: '127.0.0.1', - port: 7545, - network_id: '*', // Match any network id - gas: 8000000 - }, - fork: { - host: '127.0.0.1', - port: 7545, - network_id: '*', // Match any network id - gas: 8000000 - }, - coverage: { - host: "127.0.0.1", - port: 7546, - network_id: "*", - gas: 0xfffffffffff, // <-- Use this high gas value - gasPrice: 0x01 // <-- Use this low gas price - }, - ropsten: { - provider() { - return new HDWalletProvider("", `https://ropsten.infura.io/v3/`, 0, 3) - }, - network_id: 3, - gasPrice: 100000000001, // 100 GWei, - skipDryRun: true, - gas: 8000000 - }, - kovan: { - provider() { - return new HDWalletProvider("", "https://kovan.infura.io/v3/", 0, 3) - }, - network_id: 42, - gasPrice: 20000000000, // 20 GWei, - skipDryRun: true, - gas: 8000000 - } - }, - mocha: { - reporter: 'eth-gas-reporter', - reporterOptions: { - currency: 'USD' - } - }, - compilers: { - solc: { - version: '0.5.16', - settings: { - optimizer: { - enabled: true, - runs: 200 - } - } - } - } -} diff --git a/tsconfig.json b/tsconfig.json index 5cfe6ed2..a3418d98 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -17,20 +17,15 @@ "node_modules/@0x/typescript-typings/types", "node_modules/@types" ], - "esModuleInterop": true + "esModuleInterop": true, + "resolveJsonModule": true }, "include": [ - "./types/*.ts", - "./types/chai.d.ts", - "./types/interfaces.d.ts", - "./types/**/*.ts", - "./test/*.ts", "./scripts/**/*.ts", + "./types/**/*.ts", + "./tasks/**/*.ts", "./test/**/*.ts", - "./test-utils/*.ts", - "./test-utils/**/*.ts", - "./migrations/**/*.ts", - "./migrations/*.js" + "./test-utils/**/*.ts" ], "files": ["./hardhat.config.ts"] } \ No newline at end of file diff --git a/types/chai.d.ts b/types/chai.d.ts deleted file mode 100644 index da93707e..00000000 --- a/types/chai.d.ts +++ /dev/null @@ -1,8 +0,0 @@ -declare namespace Chai { - export interface Assertion { - bignumber: Assertion; - } - export interface NumericComparison { - gt: (value: BN | Date, message?: string) => Chai.Assertion; - } -} diff --git a/types/common.d.ts b/types/common.d.ts index 3bf4ba46..e6d3e9cc 100644 --- a/types/common.d.ts +++ b/types/common.d.ts @@ -1,2 +1,2 @@ -export type Address = string; -export type Bytes32 = string; +export type Address = string +export type Bytes32 = string diff --git a/types/index.d.ts b/types/index.d.ts index 9f655edd..46fa2c6e 100644 --- a/types/index.d.ts +++ b/types/index.d.ts @@ -1,6 +1,2 @@ -import "./interfaces"; - -export * from "./chai"; -export * from "./common"; -export * from "./machines"; -export * from "./mocha"; +export * from "./common" +export * from "./machines" diff --git a/types/interfaces.d.ts b/types/interfaces.d.ts deleted file mode 100644 index c92b5236..00000000 --- a/types/interfaces.d.ts +++ /dev/null @@ -1,14 +0,0 @@ -// eslint-disable-next-line import/no-extraneous-dependencies -import * as Web3 from "web3"; - -import { Address } from "./common"; - -declare type ContractTest = (accounts: Address[]) => void; -declare type ExecutionBlock = () => void; -declare type AsyncExecutionBlock = (done: () => void) => void; - -declare global { - const web3: Web3; - - function contract(name: string, test: ContractTest): void; -} diff --git a/types/machines.ts b/types/machines.ts index 217b36a4..3fe0412c 100644 --- a/types/machines.ts +++ b/types/machines.ts @@ -1,52 +1,53 @@ -import * as t from "types/generated"; -import { BN } from "../test-utils/tools"; -import { Address } from "./common"; -import { Basset } from "../test-utils/mstable-objects"; +import { MockERC20 } from "types/generated" +import { BN } from "../test-utils/math" +import { Address } from "./common" +import { Basset } from "../test-utils/mstable-objects" export interface ATokenDetails { - bAsset: Address; - aToken: Address; + bAsset: Address + aToken: Address } export interface CTokenDetails { - bAsset: Address; - cToken: Address; + bAsset: Address + cToken: Address } export enum Platform { + none, aave, compound, } export interface BassetIntegrationDetails { - bAssets: Array; - fees: Array; - platforms: Array; - aavePlatformAddress: Address; - aTokens: Array; - cTokens: Array; + bAssets: Array + bAssetTxFees: boolean[] + platforms?: Array + aavePlatformAddress?: Address + aTokens?: Array + cTokens?: Array } export interface BassetDetails extends Basset { - address: Address; - mAssetUnits: BN; - overweight: boolean; - actualBalance: BN; - rawBalance?: BN; - platformBalance?: BN; + address: Address + mAssetUnits: BN + actualBalance: BN + rawBalance?: BN + platformBalance?: BN } export interface BasketComposition { - bAssets: Array; - totalSupply: BN; - surplus: BN; - sumOfBassets: BN; - failed: boolean; - undergoingRecol: boolean; - colRatio: BN; + bAssets: Array + totalSupply: BN + surplus: BN + sumOfBassets: BN + failed: boolean + undergoingRecol: boolean + colRatio?: BN } export interface ActionDetails { - expectInteraction: boolean; - amount: BN; - rawBalance: BN; + hasLendingMarket: boolean + expectInteraction: boolean + amount?: BN + rawBalance?: BN } diff --git a/types/mocha.d.ts b/types/mocha.d.ts deleted file mode 100644 index d324cf2f..00000000 --- a/types/mocha.d.ts +++ /dev/null @@ -1,3 +0,0 @@ -import { Suite } from "mocha"; - -export type SuiteWithContext = Suite & T; diff --git a/yarn.lock b/yarn.lock index 56c2b640..f8e5180a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3,28 +3,16 @@ "@babel/code-frame@^7.0.0": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.10.4.tgz#168da1a36e90da68ae8d49c0f1b48c7c6249213a" - integrity sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg== + version "7.12.11" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.12.11.tgz#f4ad435aa263db935b8f10f2c552d23fb716a63f" + integrity sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw== dependencies: "@babel/highlight" "^7.10.4" -"@babel/helper-module-imports@^7.12.1": - version "7.12.5" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.12.5.tgz#1bfc0229f794988f76ed0a4d4e90860850b54dfb" - integrity sha512-SR713Ogqg6++uexFRORf/+nPXMmWIn80TALu0uaFb+iQIUoR7bOC7zBWyzBs5b3tBBJXuyD0cRu1F15GyzjOWA== - dependencies: - "@babel/types" "^7.12.5" - -"@babel/helper-plugin-utils@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz#2f75a831269d4f677de49986dff59927533cf375" - integrity sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg== - "@babel/helper-validator-identifier@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz#a78c7a7251e01f616512d31b10adcf52ada5e0d2" - integrity sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw== + version "7.12.11" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz#c9a1f021917dcb5ccf0d4e453e399022981fc9ed" + integrity sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw== "@babel/highlight@^7.10.4": version "7.10.4" @@ -35,16 +23,6 @@ chalk "^2.0.0" js-tokens "^4.0.0" -"@babel/plugin-transform-runtime@^7.5.5": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.12.1.tgz#04b792057eb460389ff6a4198e377614ea1e7ba5" - integrity sha512-Ac/H6G9FEIkS2tXsZjL4RAdS3L3WHxci0usAnz7laPWUmFiGtj7tIASChqKZMHTSQTQY6xDbOq+V1/vIq3QrWg== - dependencies: - "@babel/helper-module-imports" "^7.12.1" - "@babel/helper-plugin-utils" "^7.10.4" - resolve "^1.8.1" - semver "^5.5.1" - "@babel/runtime-corejs3@^7.10.2": version "7.12.5" resolved "https://registry.yarnpkg.com/@babel/runtime-corejs3/-/runtime-corejs3-7.12.5.tgz#ffee91da0eb4c6dae080774e94ba606368e414f4" @@ -53,21 +31,94 @@ core-js-pure "^3.0.0" regenerator-runtime "^0.13.4" -"@babel/runtime@^7.10.2", "@babel/runtime@^7.11.2", "@babel/runtime@^7.5.5": +"@babel/runtime@^7.10.2", "@babel/runtime@^7.11.2": version "7.12.5" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.12.5.tgz#410e7e487441e1b360c29be715d870d9b985882e" integrity sha512-plcc+hbExy3McchJCEQG3knOsuh3HH+Prx1P6cLIkET/0dLuQDEnrT+s27Axgc9bqfsmNUNHfscgMUdBpC9xfg== dependencies: regenerator-runtime "^0.13.4" -"@babel/types@^7.12.5": - version "7.12.6" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.12.6.tgz#ae0e55ef1cce1fbc881cd26f8234eb3e657edc96" - integrity sha512-hwyjw6GvjBLiyy3W0YQf0Z5Zf4NpYejUnKFcfcUhZCSffoBBp30w6wP2Wn6pk31jMYZvcOrB/1b7cGXvEoKogA== +"@ensdomains/ens@^0.4.4": + version "0.4.5" + resolved "https://registry.yarnpkg.com/@ensdomains/ens/-/ens-0.4.5.tgz#e0aebc005afdc066447c6e22feb4eda89a5edbfc" + integrity sha512-JSvpj1iNMFjK6K+uVl4unqMoa9rf5jopb8cya5UGBWz23Nw8hSNT7efgUx4BTlAPAgpNlEioUfeTyQ6J9ZvTVw== dependencies: - "@babel/helper-validator-identifier" "^7.10.4" - lodash "^4.17.19" - to-fast-properties "^2.0.0" + bluebird "^3.5.2" + eth-ens-namehash "^2.0.8" + solc "^0.4.20" + testrpc "0.0.1" + web3-utils "^1.0.0-beta.31" + +"@ensdomains/resolver@^0.2.4": + version "0.2.4" + resolved "https://registry.yarnpkg.com/@ensdomains/resolver/-/resolver-0.2.4.tgz#c10fe28bf5efbf49bff4666d909aed0265efbc89" + integrity sha512-bvaTH34PMCbv6anRa9I/0zjLJgY4EuznbEMgbV77JBCQ9KNC46rzi0avuxpOfu+xDjPEtSFGqVEOr5GlUSGudA== + +"@eslint/eslintrc@^0.3.0": + version "0.3.0" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-0.3.0.tgz#d736d6963d7003b6514e6324bec9c602ac340318" + integrity sha512-1JTKgrOKAHVivSvOYw+sJOunkBjUOvjqWk1DPja7ZFhIS2mX/4EgTT8M7eTK9jrKhL/FvXXEbQwIs3pg1xp3dg== + dependencies: + ajv "^6.12.4" + debug "^4.1.1" + espree "^7.3.0" + globals "^12.1.0" + ignore "^4.0.6" + import-fresh "^3.2.1" + js-yaml "^3.13.1" + lodash "^4.17.20" + minimatch "^3.0.4" + strip-json-comments "^3.1.1" + +"@ethereum-waffle/chai@^3.2.1": + version "3.2.1" + resolved "https://registry.yarnpkg.com/@ethereum-waffle/chai/-/chai-3.2.1.tgz#5cb542b2a323adf0bc2dda00f48b0eb85944d8ab" + integrity sha512-0aG946J1+2Gg7WnEjtwPEWe+xwLTeBTy6LpCnGecosMf3YINkaf9Xv3Sd7CrXBR88ihCoUhfzfmOloMHIAQPAg== + dependencies: + "@ethereum-waffle/provider" "^3.2.1" + ethers "^5.0.0" + +"@ethereum-waffle/compiler@^3.2.1": + version "3.2.1" + resolved "https://registry.yarnpkg.com/@ethereum-waffle/compiler/-/compiler-3.2.1.tgz#612a9056285a94ce28eb57b895770ad10e438bf9" + integrity sha512-URSsbTp4g8HPHAaA4KiAD6Aya9WPx/TULfOr+YpjCJ6YWXqE9wwi3ubf9qJUQxu6W6PsiczBaQhVhpI9RLoVUA== + dependencies: + "@resolver-engine/imports" "^0.3.3" + "@resolver-engine/imports-fs" "^0.3.3" + "@types/mkdirp" "^0.5.2" + "@types/node-fetch" "^2.5.5" + ethers "^5.0.1" + mkdirp "^0.5.1" + node-fetch "^2.6.0" + solc "^0.6.3" + +"@ethereum-waffle/ens@^3.2.1": + version "3.2.1" + resolved "https://registry.yarnpkg.com/@ethereum-waffle/ens/-/ens-3.2.1.tgz#9f369112d62f7aa88d010be4d133b6d0f5e8c492" + integrity sha512-dXv/Mb8EgEYOKv2jjmkFNFCmSjNv8nPk1Gaegc0J/KXWuTU6CBOhWet7YS5joGO8ORK21MvN2qVgcQj+FYw0Dw== + dependencies: + "@ensdomains/ens" "^0.4.4" + "@ensdomains/resolver" "^0.2.4" + ethers "^5.0.1" + +"@ethereum-waffle/mock-contract@^3.2.1": + version "3.2.1" + resolved "https://registry.yarnpkg.com/@ethereum-waffle/mock-contract/-/mock-contract-3.2.1.tgz#bf5f63f61c9749eb3270108893a88ff161e68f58" + integrity sha512-39GMp/IqsHF+3j3XK38cWA+nX7Q6ABfMsYkuAjtfpTguTFQKXx2C1/VJZwGOyb4de2pl4bssmN37VEraB3NWbQ== + dependencies: + "@ethersproject/abi" "^5.0.1" + ethers "^5.0.1" + +"@ethereum-waffle/provider@^3.2.1": + version "3.2.1" + resolved "https://registry.yarnpkg.com/@ethereum-waffle/provider/-/provider-3.2.1.tgz#d84c0603936f09afa69ecb671d56f527e9818e71" + integrity sha512-doG18hThqldsYcZIIO0YoiwV+ERx0dCVY6bkg4FKZtoymNelf15zNycb881c6QD9RnLuz6A2Jp9lmnrAD+IvYQ== + dependencies: + "@ethereum-waffle/ens" "^3.2.1" + ethers "^5.0.1" + ganache-core "^2.10.2" + patch-package "^6.2.2" + postinstall-postinstall "^2.1.0" "@ethersproject/abi@5.0.0-beta.153": version "5.0.0-beta.153" @@ -84,210 +135,367 @@ "@ethersproject/properties" ">=5.0.0-beta.131" "@ethersproject/strings" ">=5.0.0-beta.130" -"@ethersproject/abi@^5.0.0-beta.146": - version "5.0.8" - resolved "https://registry.yarnpkg.com/@ethersproject/abi/-/abi-5.0.8.tgz#b79e8b90932f0ce4b5796f21ec854e4fac4e6f7a" - integrity sha512-QiWzNybzepEmFfwxqEOoUm9i8G5fBuxMiiMcyUwXqywKtktbhNHpUbfOapMkEvPB8VgefzaUf1vHDSqC2Dc8Eg== - dependencies: - "@ethersproject/address" "^5.0.4" - "@ethersproject/bignumber" "^5.0.7" - "@ethersproject/bytes" "^5.0.4" - "@ethersproject/constants" "^5.0.4" - "@ethersproject/hash" "^5.0.4" - "@ethersproject/keccak256" "^5.0.3" - "@ethersproject/logger" "^5.0.5" - "@ethersproject/properties" "^5.0.3" - "@ethersproject/strings" "^5.0.4" - -"@ethersproject/abstract-provider@^5.0.4": - version "5.0.6" - resolved "https://registry.yarnpkg.com/@ethersproject/abstract-provider/-/abstract-provider-5.0.6.tgz#fd379b4c2dbb316841dd4f581a73b95d7f399a13" - integrity sha512-3GJjD+wM8J160XFiTMkDu1UFV9uA1OdbMUI0aYy1CFepxYGSh9vY12bsbiYiTJLXQ86usvSBK6OA9U7IqmKZVw== - dependencies: - "@ethersproject/bignumber" "^5.0.7" - "@ethersproject/bytes" "^5.0.4" - "@ethersproject/logger" "^5.0.5" - "@ethersproject/networks" "^5.0.3" - "@ethersproject/properties" "^5.0.3" - "@ethersproject/transactions" "^5.0.5" - "@ethersproject/web" "^5.0.6" - -"@ethersproject/abstract-signer@^5.0.6": +"@ethersproject/abi@5.0.10", "@ethersproject/abi@^5.0.0-beta.146", "@ethersproject/abi@^5.0.1", "@ethersproject/abi@^5.0.10": + version "5.0.10" + resolved "https://registry.yarnpkg.com/@ethersproject/abi/-/abi-5.0.10.tgz#c32baa919ad0e5cddabb2f3a8aed0eaeeed7fa4a" + integrity sha512-cfC3lGgotfxX3SMri4+CisOPwignoj/QGHW9J29spC4R4Qqcnk/SYuVkPFBMdLbvBp3f/pGiVqPNwont0TSXhg== + dependencies: + "@ethersproject/address" "^5.0.9" + "@ethersproject/bignumber" "^5.0.13" + "@ethersproject/bytes" "^5.0.9" + "@ethersproject/constants" "^5.0.8" + "@ethersproject/hash" "^5.0.10" + "@ethersproject/keccak256" "^5.0.7" + "@ethersproject/logger" "^5.0.8" + "@ethersproject/properties" "^5.0.7" + "@ethersproject/strings" "^5.0.8" + +"@ethersproject/abstract-provider@5.0.8", "@ethersproject/abstract-provider@^5.0.8": version "5.0.8" - resolved "https://registry.yarnpkg.com/@ethersproject/abstract-signer/-/abstract-signer-5.0.8.tgz#16d8107ea718ad7a9b5925bd870aa40c05fbfba3" - integrity sha512-Q5ZJtxs5txKBfTbdXRI4n6Nn4EJlKg3zA22S4Eg+P3hIZ+cXoLoK9CnA1GeKMRHJiDBqECnWqeQl+yyGR7D+jg== - dependencies: - "@ethersproject/abstract-provider" "^5.0.4" - "@ethersproject/bignumber" "^5.0.7" - "@ethersproject/bytes" "^5.0.4" - "@ethersproject/logger" "^5.0.5" - "@ethersproject/properties" "^5.0.3" - -"@ethersproject/address@>=5.0.0-beta.128", "@ethersproject/address@^5.0.4", "@ethersproject/address@^5.0.5": + resolved "https://registry.yarnpkg.com/@ethersproject/abstract-provider/-/abstract-provider-5.0.8.tgz#880793c29bfed33dff4c2b2be7ecb9ba966d52c0" + integrity sha512-fqJXkewcGdi8LogKMgRyzc/Ls2js07yor7+g9KfPs09uPOcQLg7cc34JN+lk34HH9gg2HU0DIA5797ZR8znkfw== + dependencies: + "@ethersproject/bignumber" "^5.0.13" + "@ethersproject/bytes" "^5.0.9" + "@ethersproject/logger" "^5.0.8" + "@ethersproject/networks" "^5.0.7" + "@ethersproject/properties" "^5.0.7" + "@ethersproject/transactions" "^5.0.9" + "@ethersproject/web" "^5.0.12" + +"@ethersproject/abstract-signer@5.0.11", "@ethersproject/abstract-signer@^5.0.10": + version "5.0.11" + resolved "https://registry.yarnpkg.com/@ethersproject/abstract-signer/-/abstract-signer-5.0.11.tgz#675da9ec168905c60ee79a6da95f7157ca956f46" + integrity sha512-RKOgPSEYafknA62SrD3OCK42AllHE4YBfKYXyQeM+sBP7Nq3X5FpzeoY4uzC43P4wIhmNoTHCKQuwnX7fBqb6Q== + dependencies: + "@ethersproject/abstract-provider" "^5.0.8" + "@ethersproject/bignumber" "^5.0.13" + "@ethersproject/bytes" "^5.0.9" + "@ethersproject/logger" "^5.0.8" + "@ethersproject/properties" "^5.0.7" + +"@ethersproject/address@5.0.9", "@ethersproject/address@>=5.0.0-beta.128", "@ethersproject/address@^5.0.9": + version "5.0.9" + resolved "https://registry.yarnpkg.com/@ethersproject/address/-/address-5.0.9.tgz#347ef30dc8243c682574a3f23ff63f73c8f8cbf1" + integrity sha512-gKkmbZDMyGbVjr8nA5P0md1GgESqSGH7ILIrDidPdNXBl4adqbuA3OAuZx/O2oGpL6PtJ9BDa0kHheZ1ToHU3w== + dependencies: + "@ethersproject/bignumber" "^5.0.13" + "@ethersproject/bytes" "^5.0.9" + "@ethersproject/keccak256" "^5.0.7" + "@ethersproject/logger" "^5.0.8" + "@ethersproject/rlp" "^5.0.7" + +"@ethersproject/base64@5.0.7", "@ethersproject/base64@^5.0.7": version "5.0.7" - resolved "https://registry.yarnpkg.com/@ethersproject/address/-/address-5.0.7.tgz#ee7fd7d3b3a400dec6035c7b3f0b7e4652207308" - integrity sha512-+63DiYG+2og6rFNvQmLlLw8i5LtyT65n+jtHd06Ic81rLHc+JUKRpeZFhBa+gqh9f+P8V0xtKR5NI/EHXOfgSw== + resolved "https://registry.yarnpkg.com/@ethersproject/base64/-/base64-5.0.7.tgz#d5da73699b4a33dc92bd8e5056ad1880b262057d" + integrity sha512-S5oh5DVfCo06xwJXT8fQC68mvJfgScTl2AXvbYMsHNfIBTDb084Wx4iA9MNlEReOv6HulkS+gyrUM/j3514rSw== dependencies: - "@ethersproject/bignumber" "^5.0.10" - "@ethersproject/bytes" "^5.0.4" - "@ethersproject/keccak256" "^5.0.3" - "@ethersproject/logger" "^5.0.5" - "@ethersproject/rlp" "^5.0.3" + "@ethersproject/bytes" "^5.0.9" -"@ethersproject/base64@^5.0.3": - version "5.0.5" - resolved "https://registry.yarnpkg.com/@ethersproject/base64/-/base64-5.0.5.tgz#1c4873b075e40154c319ee0414aab105415e4072" - integrity sha512-4GJ9InM+zDDiiejPG/TrNGXVgD8D4BClEfJ3w45+ufyFA7QDT3gkAy+SdmmQCGAEBB+79MmXMLFq7TNtDM2DaA== +"@ethersproject/basex@5.0.7", "@ethersproject/basex@^5.0.7": + version "5.0.7" + resolved "https://registry.yarnpkg.com/@ethersproject/basex/-/basex-5.0.7.tgz#2f7026b12c9dee6cdc7b7bf1805461836e635495" + integrity sha512-OsXnRsujGmYD9LYyJlX+cVe5KfwgLUbUJrJMWdzRWogrygXd5HvGd7ygX1AYjlu1z8W/+t2FoQnczDR/H2iBjA== dependencies: - "@ethersproject/bytes" "^5.0.4" + "@ethersproject/bytes" "^5.0.9" + "@ethersproject/properties" "^5.0.7" -"@ethersproject/bignumber@>=5.0.0-beta.130", "@ethersproject/bignumber@^5.0.10", "@ethersproject/bignumber@^5.0.7", "@ethersproject/bignumber@^5.0.8": - version "5.0.10" - resolved "https://registry.yarnpkg.com/@ethersproject/bignumber/-/bignumber-5.0.10.tgz#aee93d18f13b4976aba399888812804419ba2d5f" - integrity sha512-1b3bMe+PCjx6xI5IINzaWtNZEKtwq2guVrhuwRqQmHEsAgKDK+UMckXYsu0CwMwRsQoeq+sNuCWd64pCxkBqMw== +"@ethersproject/bignumber@5.0.13", "@ethersproject/bignumber@>=5.0.0-beta.130", "@ethersproject/bignumber@^5.0.13": + version "5.0.13" + resolved "https://registry.yarnpkg.com/@ethersproject/bignumber/-/bignumber-5.0.13.tgz#a5466412b3b80104097b9c694f6ae827df4353fe" + integrity sha512-b89bX5li6aK492yuPP5mPgRVgIxxBP7ksaBtKX5QQBsrZTpNOjf/MR4CjcUrAw8g+RQuD6kap9lPjFgY4U1/5A== dependencies: - "@ethersproject/bytes" "^5.0.4" - "@ethersproject/logger" "^5.0.5" + "@ethersproject/bytes" "^5.0.9" + "@ethersproject/logger" "^5.0.8" bn.js "^4.4.0" -"@ethersproject/bytes@>=5.0.0-beta.129", "@ethersproject/bytes@^5.0.4": - version "5.0.6" - resolved "https://registry.yarnpkg.com/@ethersproject/bytes/-/bytes-5.0.6.tgz#848f8c10d78213eb743831fba0704154d3f39d13" - integrity sha512-axEmVeVy5IS0Sg46fNk4mygMm96uGd/15b6zmMu53w0NpHmOC/GYfpqMBHYxavjFYN+LUL7vVwgpbIFYGO2QHA== +"@ethersproject/bytes@5.0.9", "@ethersproject/bytes@>=5.0.0-beta.129", "@ethersproject/bytes@^5.0.9": + version "5.0.9" + resolved "https://registry.yarnpkg.com/@ethersproject/bytes/-/bytes-5.0.9.tgz#2748247402ad20df69f3a3e935dc7b58c0d75c08" + integrity sha512-k+17ZViDtAugC0s7HM6rdsTWEdIYII4RPCDkPEuxKc6i40Bs+m6tjRAtCECX06wKZnrEoR9pjOJRXHJ/VLoOcA== dependencies: - "@ethersproject/logger" "^5.0.5" + "@ethersproject/logger" "^5.0.8" -"@ethersproject/constants@>=5.0.0-beta.128", "@ethersproject/constants@^5.0.4": - version "5.0.6" - resolved "https://registry.yarnpkg.com/@ethersproject/constants/-/constants-5.0.6.tgz#bc8ca82d2c0eb1869e5cce4fee473e9a9a0e858c" - integrity sha512-ioBMaUsVb2+C8UVAHUpfrrkNtFEcAYNaZSf79Lw7VhjFRY5f1ImWGqSZhJb4/wKxaw0RIYLW7ZriDgcx2YMwWA== - dependencies: - "@ethersproject/bignumber" "^5.0.7" +"@ethersproject/constants@5.0.8", "@ethersproject/constants@>=5.0.0-beta.128", "@ethersproject/constants@^5.0.8": + version "5.0.8" + resolved "https://registry.yarnpkg.com/@ethersproject/constants/-/constants-5.0.8.tgz#50f2e23f48c0d1d0de3759ea79b68ec3e06435a1" + integrity sha512-sCc73pFBsl59eDfoQR5OCEZCRv5b0iywadunti6MQIr5lt3XpwxK1Iuzd8XSFO02N9jUifvuZRrt0cY0+NBgTg== + dependencies: + "@ethersproject/bignumber" "^5.0.13" + +"@ethersproject/contracts@5.0.9": + version "5.0.9" + resolved "https://registry.yarnpkg.com/@ethersproject/contracts/-/contracts-5.0.9.tgz#6c67c0ebe20ee1af903f7f43568401023334a181" + integrity sha512-CCTxVeDh6sjdSEbjzONhtwPjECvaHE62oGkY8M7kP0CHmgLD2SEGel0HZib8e5oQKRKGly9AKcUFW4g3rQ0AQw== + dependencies: + "@ethersproject/abi" "^5.0.10" + "@ethersproject/abstract-provider" "^5.0.8" + "@ethersproject/abstract-signer" "^5.0.10" + "@ethersproject/address" "^5.0.9" + "@ethersproject/bignumber" "^5.0.13" + "@ethersproject/bytes" "^5.0.9" + "@ethersproject/constants" "^5.0.8" + "@ethersproject/logger" "^5.0.8" + "@ethersproject/properties" "^5.0.7" + +"@ethersproject/hash@5.0.10", "@ethersproject/hash@>=5.0.0-beta.128", "@ethersproject/hash@^5.0.10": + version "5.0.10" + resolved "https://registry.yarnpkg.com/@ethersproject/hash/-/hash-5.0.10.tgz#41bf37428e8ddbc229ffd81c47af667174cb491a" + integrity sha512-Tf0bvs6YFhw28LuHnhlDWyr0xfcDxSXdwM4TcskeBbmXVSKLv3bJQEEEBFUcRX0fJuslR3gCVySEaSh7vuMx5w== + dependencies: + "@ethersproject/abstract-signer" "^5.0.10" + "@ethersproject/address" "^5.0.9" + "@ethersproject/bignumber" "^5.0.13" + "@ethersproject/bytes" "^5.0.9" + "@ethersproject/keccak256" "^5.0.7" + "@ethersproject/logger" "^5.0.8" + "@ethersproject/properties" "^5.0.7" + "@ethersproject/strings" "^5.0.8" + +"@ethersproject/hdnode@5.0.8", "@ethersproject/hdnode@^5.0.8": + version "5.0.8" + resolved "https://registry.yarnpkg.com/@ethersproject/hdnode/-/hdnode-5.0.8.tgz#2b52ede921cfbce8de49da774ec5a74025fc2bb1" + integrity sha512-Mscpjd7BBjxYSWghaNMwV0xrBBkOoCq6YEPRm9MgE24CiBlzzbfEB5DGq6hiZqhQaxPkdCUtKKqZi3nt9hx43g== + dependencies: + "@ethersproject/abstract-signer" "^5.0.10" + "@ethersproject/basex" "^5.0.7" + "@ethersproject/bignumber" "^5.0.13" + "@ethersproject/bytes" "^5.0.9" + "@ethersproject/logger" "^5.0.8" + "@ethersproject/pbkdf2" "^5.0.7" + "@ethersproject/properties" "^5.0.7" + "@ethersproject/sha2" "^5.0.7" + "@ethersproject/signing-key" "^5.0.8" + "@ethersproject/strings" "^5.0.8" + "@ethersproject/transactions" "^5.0.9" + "@ethersproject/wordlists" "^5.0.8" + +"@ethersproject/json-wallets@5.0.10", "@ethersproject/json-wallets@^5.0.10": + version "5.0.10" + resolved "https://registry.yarnpkg.com/@ethersproject/json-wallets/-/json-wallets-5.0.10.tgz#cdc9c27cb486762a3313e25f6f2fef0eb890dbaf" + integrity sha512-Ux36u+d7Dm0M5AQ+mWuHdvfGPMN8K1aaLQgwzrsD4ELTWlwRuHuQbmn7/GqeOpbfaV6POLwdYcBk2TXjlGp/IQ== + dependencies: + "@ethersproject/abstract-signer" "^5.0.10" + "@ethersproject/address" "^5.0.9" + "@ethersproject/bytes" "^5.0.9" + "@ethersproject/hdnode" "^5.0.8" + "@ethersproject/keccak256" "^5.0.7" + "@ethersproject/logger" "^5.0.8" + "@ethersproject/pbkdf2" "^5.0.7" + "@ethersproject/properties" "^5.0.7" + "@ethersproject/random" "^5.0.7" + "@ethersproject/strings" "^5.0.8" + "@ethersproject/transactions" "^5.0.9" + aes-js "3.0.0" + scrypt-js "3.0.1" -"@ethersproject/hash@>=5.0.0-beta.128", "@ethersproject/hash@^5.0.4": +"@ethersproject/keccak256@5.0.7", "@ethersproject/keccak256@>=5.0.0-beta.127", "@ethersproject/keccak256@^5.0.7": version "5.0.7" - resolved "https://registry.yarnpkg.com/@ethersproject/hash/-/hash-5.0.7.tgz#e4ede972575d9aadffeab15070e9ffdf2f72d7e5" - integrity sha512-vYuRJRTAGHcYqQFAxxCgDpJtJv4aGC5TQm5NDZat/55BeLGLmH90ftJG1ldv7MhzGRxBPJtpqSHzJDizB6VKoA== - dependencies: - "@ethersproject/abstract-signer" "^5.0.6" - "@ethersproject/address" "^5.0.5" - "@ethersproject/bignumber" "^5.0.8" - "@ethersproject/bytes" "^5.0.4" - "@ethersproject/keccak256" "^5.0.3" - "@ethersproject/logger" "^5.0.5" - "@ethersproject/properties" "^5.0.4" - "@ethersproject/strings" "^5.0.4" - -"@ethersproject/keccak256@>=5.0.0-beta.127", "@ethersproject/keccak256@^5.0.3": - version "5.0.5" - resolved "https://registry.yarnpkg.com/@ethersproject/keccak256/-/keccak256-5.0.5.tgz#414752fbdf9a2baa2634f4ed22f555bf5acbf536" - integrity sha512-9hXXp113jW5yPf27krofmnZ26u5SXsmuvrMTUuXyVdIDIJDLGorVyB2bBiWwENVok92E4WDnfAZHG+A+E6TCMQ== - dependencies: - "@ethersproject/bytes" "^5.0.4" + resolved "https://registry.yarnpkg.com/@ethersproject/keccak256/-/keccak256-5.0.7.tgz#2eedb5e4c160fcdf0079660f8ae362d7855ea943" + integrity sha512-zpUBmofWvx9PGfc7IICobgFQSgNmTOGTGLUxSYqZzY/T+b4y/2o5eqf/GGmD7qnTGzKQ42YlLNo+LeDP2qe55g== + dependencies: + "@ethersproject/bytes" "^5.0.9" js-sha3 "0.5.7" -"@ethersproject/logger@>=5.0.0-beta.129", "@ethersproject/logger@^5.0.5": +"@ethersproject/logger@5.0.8", "@ethersproject/logger@>=5.0.0-beta.129", "@ethersproject/logger@^5.0.8": + version "5.0.8" + resolved "https://registry.yarnpkg.com/@ethersproject/logger/-/logger-5.0.8.tgz#135c1903d35c878265f3cbf2b287042c4c20d5d4" + integrity sha512-SkJCTaVTnaZ3/ieLF5pVftxGEFX56pTH+f2Slrpv7cU0TNpUZNib84QQdukd++sWUp/S7j5t5NW+WegbXd4U/A== + +"@ethersproject/networks@5.0.7", "@ethersproject/networks@^5.0.7": version "5.0.7" - resolved "https://registry.yarnpkg.com/@ethersproject/logger/-/logger-5.0.7.tgz#35c226ec6702ff1d6c4dcedd5121e54665f56e44" - integrity sha512-1wl+kDTPdDptpQdrkTmImubygUf0mVeo0I/p8d21qdzT16h/GnoJWt7q6Kt0xvTfcI7Jv4kryskxI2xV++w5Hg== + resolved "https://registry.yarnpkg.com/@ethersproject/networks/-/networks-5.0.7.tgz#8d06e41197b27c2404d89a29ca21f741a01acbfc" + integrity sha512-dI14QATndIcUgcCBL1c5vUr/YsI5cCHLN81rF7PU+yS7Xgp2/Rzbr9+YqpC6NBXHFUASjh6GpKqsVMpufAL0BQ== + dependencies: + "@ethersproject/logger" "^5.0.8" -"@ethersproject/networks@^5.0.3": - version "5.0.5" - resolved "https://registry.yarnpkg.com/@ethersproject/networks/-/networks-5.0.5.tgz#bd33013bc62b48bb4b8ce45ad3b05a602cb7eba2" - integrity sha512-DEcGEoRPtpbM+no9JmpwdCVVQELqYhP42BKArLsqps6nIEqOInWnjfpXfEss+nTrBp3zDrL4KNfOe7mS96C/mQ== +"@ethersproject/pbkdf2@5.0.7", "@ethersproject/pbkdf2@^5.0.7": + version "5.0.7" + resolved "https://registry.yarnpkg.com/@ethersproject/pbkdf2/-/pbkdf2-5.0.7.tgz#a36fdb7327760ec0096857053e01c923a63417da" + integrity sha512-0SNLNixPMqnosH6pyc4yPiUu/C9/Jbu+f6I8GJW9U2qNpMBddmRJviwseoha5Zw1V+Aw0Z/yvYyzIIE8yPXqLA== dependencies: - "@ethersproject/logger" "^5.0.5" + "@ethersproject/bytes" "^5.0.9" + "@ethersproject/sha2" "^5.0.7" -"@ethersproject/properties@>=5.0.0-beta.131", "@ethersproject/properties@^5.0.3", "@ethersproject/properties@^5.0.4": - version "5.0.5" - resolved "https://registry.yarnpkg.com/@ethersproject/properties/-/properties-5.0.5.tgz#fb28b8dab39e876b9ca49b9b46b9f7bd95e2e469" - integrity sha512-2HwajwTUwlrOsiLVyyxiS4oP0a4xBNi1i90/kDJESmtlDmf2DkrY6qjBssa9YnWoEH34N/ZpLFVndimIrlo8kg== +"@ethersproject/properties@5.0.7", "@ethersproject/properties@>=5.0.0-beta.131", "@ethersproject/properties@^5.0.7": + version "5.0.7" + resolved "https://registry.yarnpkg.com/@ethersproject/properties/-/properties-5.0.7.tgz#951d11ba592ff90bbe8ec34c5a03a5157e3b3360" + integrity sha512-812H1Rus2vjw0zbasfDI1GLNPDsoyX1pYqiCgaR1BuyKxUTbwcH1B+214l6VGe1v+F6iEVb7WjIwMjKhb4EUsg== + dependencies: + "@ethersproject/logger" "^5.0.8" + +"@ethersproject/providers@5.0.19": + version "5.0.19" + resolved "https://registry.yarnpkg.com/@ethersproject/providers/-/providers-5.0.19.tgz#94c8f1a86755ee4187911fc6250e94b1116c089a" + integrity sha512-G+flo1jK1y/rvQy6b71+Nu7qOlkOKz+XqpgqFMZslkCzGuzQRmk9Qp7Ln4soK8RSyP1e5TCujaRf1H+EZahoaw== + dependencies: + "@ethersproject/abstract-provider" "^5.0.8" + "@ethersproject/abstract-signer" "^5.0.10" + "@ethersproject/address" "^5.0.9" + "@ethersproject/basex" "^5.0.7" + "@ethersproject/bignumber" "^5.0.13" + "@ethersproject/bytes" "^5.0.9" + "@ethersproject/constants" "^5.0.8" + "@ethersproject/hash" "^5.0.10" + "@ethersproject/logger" "^5.0.8" + "@ethersproject/networks" "^5.0.7" + "@ethersproject/properties" "^5.0.7" + "@ethersproject/random" "^5.0.7" + "@ethersproject/rlp" "^5.0.7" + "@ethersproject/sha2" "^5.0.7" + "@ethersproject/strings" "^5.0.8" + "@ethersproject/transactions" "^5.0.9" + "@ethersproject/web" "^5.0.12" + bech32 "1.1.4" + ws "7.2.3" + +"@ethersproject/random@5.0.7", "@ethersproject/random@^5.0.7": + version "5.0.7" + resolved "https://registry.yarnpkg.com/@ethersproject/random/-/random-5.0.7.tgz#e364268ce68bf6d300c36d654e622fd9d26b3a86" + integrity sha512-PxSRWwN3s+FH9AWMZU6AcWJsNQ9KzqKV6NgdeKPtxahdDjCuXxTAuzTZNXNRK+qj+Il351UnweAGd+VuZcOAlQ== + dependencies: + "@ethersproject/bytes" "^5.0.9" + "@ethersproject/logger" "^5.0.8" + +"@ethersproject/rlp@5.0.7", "@ethersproject/rlp@^5.0.7": + version "5.0.7" + resolved "https://registry.yarnpkg.com/@ethersproject/rlp/-/rlp-5.0.7.tgz#cfa4fa6415960a435b7814e1a29bdfea657e2b6e" + integrity sha512-ulUTVEuV7PT4jJTPpfhRHK57tkLEDEY9XSYJtrSNHOqdwMvH0z7BM2AKIMq4LVDlnu4YZASdKrkFGEIO712V9w== dependencies: - "@ethersproject/logger" "^5.0.5" + "@ethersproject/bytes" "^5.0.9" + "@ethersproject/logger" "^5.0.8" -"@ethersproject/rlp@^5.0.3": - version "5.0.5" - resolved "https://registry.yarnpkg.com/@ethersproject/rlp/-/rlp-5.0.5.tgz#9670e0ad0cba701593e3b0b2ab5e7404486979fa" - integrity sha512-RAUhk5+VH2UquTawgf7eK1i4Qbbzt0Ky6M27Q9JniRx0SBqmTkbKx/iXRZN/0x9vqQJhT596Z3vVevhqSa+GPQ== +"@ethersproject/sha2@5.0.7", "@ethersproject/sha2@^5.0.7": + version "5.0.7" + resolved "https://registry.yarnpkg.com/@ethersproject/sha2/-/sha2-5.0.7.tgz#ef9f18770c9f90a6cfd73840b0c3400910219099" + integrity sha512-MbUqz68hhp5RsaZdqi1eg1rrtiqt5wmhRYqdA7MX8swBkzW2KiLgK+Oh25UcWhUhdi1ImU9qrV6if5j0cC7Bxg== dependencies: - "@ethersproject/bytes" "^5.0.4" - "@ethersproject/logger" "^5.0.5" + "@ethersproject/bytes" "^5.0.9" + "@ethersproject/logger" "^5.0.8" + hash.js "1.1.3" -"@ethersproject/signing-key@^5.0.4": - version "5.0.6" - resolved "https://registry.yarnpkg.com/@ethersproject/signing-key/-/signing-key-5.0.6.tgz#78550155cf84fa78bde2ac1f723182f80c4c8cb3" - integrity sha512-KjyePQsh+L6BwmPWD5JoXCrRGjNfYSD5YeXQhy6YWQeMAfG0+WMG7U2SKzl+DWM+8/Ymat3s6o3U2GLXhGrcMg== +"@ethersproject/signing-key@5.0.8", "@ethersproject/signing-key@^5.0.8": + version "5.0.8" + resolved "https://registry.yarnpkg.com/@ethersproject/signing-key/-/signing-key-5.0.8.tgz#156522e542916b9aa9135527b40c5b6f9235af02" + integrity sha512-YKxQM45eDa6WAD+s3QZPdm1uW1MutzVuyoepdRRVmMJ8qkk7iOiIhUkZwqKLNxKzEJijt/82ycuOREc9WBNAKg== dependencies: - "@ethersproject/bytes" "^5.0.4" - "@ethersproject/logger" "^5.0.5" - "@ethersproject/properties" "^5.0.3" + "@ethersproject/bytes" "^5.0.9" + "@ethersproject/logger" "^5.0.8" + "@ethersproject/properties" "^5.0.7" elliptic "6.5.3" -"@ethersproject/strings@>=5.0.0-beta.130", "@ethersproject/strings@^5.0.4": - version "5.0.6" - resolved "https://registry.yarnpkg.com/@ethersproject/strings/-/strings-5.0.6.tgz#722295012a052d68a42418404213b190a34c453b" - integrity sha512-eJf0TKk/X2MvR3OSaOsS4XhKkWTi4p7YrZp2P1DaiTP+xsxizMYI1Ds5VUB4DH4RIseUe4Sbf6eN2dfG+fhW2w== +"@ethersproject/solidity@5.0.8": + version "5.0.8" + resolved "https://registry.yarnpkg.com/@ethersproject/solidity/-/solidity-5.0.8.tgz#a260116a794bc97558d89e98f59831ce8d25c733" + integrity sha512-OJkyBq9KaoGsi8E8mYn6LX+vKyCURvxSp0yuGBcOqEFM3vkn9PsCiXsHdOXdNBvlHG5evJXwAYC2UR0TzgJeKA== dependencies: - "@ethersproject/bytes" "^5.0.4" - "@ethersproject/constants" "^5.0.4" - "@ethersproject/logger" "^5.0.5" + "@ethersproject/bignumber" "^5.0.13" + "@ethersproject/bytes" "^5.0.9" + "@ethersproject/keccak256" "^5.0.7" + "@ethersproject/sha2" "^5.0.7" + "@ethersproject/strings" "^5.0.8" -"@ethersproject/transactions@^5.0.0-beta.135", "@ethersproject/transactions@^5.0.5": - version "5.0.7" - resolved "https://registry.yarnpkg.com/@ethersproject/transactions/-/transactions-5.0.7.tgz#76260ab2df7de406371963ab7df1d50d1ca9139e" - integrity sha512-U7dyBMQ73lHUoAnp3fdcfhgvJwcow88b0/q7Fl6Id21/Ll7Dxe7qrWjR6pH6XTKV+h2a74o/pJS7CxNiwahaHw== - dependencies: - "@ethersproject/address" "^5.0.4" - "@ethersproject/bignumber" "^5.0.7" - "@ethersproject/bytes" "^5.0.4" - "@ethersproject/constants" "^5.0.4" - "@ethersproject/keccak256" "^5.0.3" - "@ethersproject/logger" "^5.0.5" - "@ethersproject/properties" "^5.0.3" - "@ethersproject/rlp" "^5.0.3" - "@ethersproject/signing-key" "^5.0.4" - -"@ethersproject/web@^5.0.6": +"@ethersproject/strings@5.0.8", "@ethersproject/strings@>=5.0.0-beta.130", "@ethersproject/strings@^5.0.8": + version "5.0.8" + resolved "https://registry.yarnpkg.com/@ethersproject/strings/-/strings-5.0.8.tgz#11a1b0ed1e8417408693789839f0b5f4e323c0c9" + integrity sha512-5IsdXf8tMY8QuHl8vTLnk9ehXDDm6x9FB9S9Og5IA1GYhLe5ZewydXSjlJlsqU2t9HRbfv97OJZV/pX8DVA/Hw== + dependencies: + "@ethersproject/bytes" "^5.0.9" + "@ethersproject/constants" "^5.0.8" + "@ethersproject/logger" "^5.0.8" + +"@ethersproject/transactions@5.0.9", "@ethersproject/transactions@^5.0.0-beta.135", "@ethersproject/transactions@^5.0.9": + version "5.0.9" + resolved "https://registry.yarnpkg.com/@ethersproject/transactions/-/transactions-5.0.9.tgz#ccfcc1d395b5e3ce7342545fa28bfe5541182fd6" + integrity sha512-0Fu1yhdFBkrbMjenEr+39tmDxuHmaw0pe9Jb18XuKoItj7Z3p7+UzdHLr2S/okvHDHYPbZE5gtANDdQ3ZL1nBA== + dependencies: + "@ethersproject/address" "^5.0.9" + "@ethersproject/bignumber" "^5.0.13" + "@ethersproject/bytes" "^5.0.9" + "@ethersproject/constants" "^5.0.8" + "@ethersproject/keccak256" "^5.0.7" + "@ethersproject/logger" "^5.0.8" + "@ethersproject/properties" "^5.0.7" + "@ethersproject/rlp" "^5.0.7" + "@ethersproject/signing-key" "^5.0.8" + +"@ethersproject/units@5.0.9": + version "5.0.9" + resolved "https://registry.yarnpkg.com/@ethersproject/units/-/units-5.0.9.tgz#f8dc406f593eadcba883d6e86cc077203b03e7da" + integrity sha512-4jIkcMVrJ3lCgXMO4M/2ww0/T/IN08vJTZld7FIAwa6aoBDTAy71+sby3sShl1SG3HEeKYbI3fBWauCUgPRUpQ== + dependencies: + "@ethersproject/bignumber" "^5.0.13" + "@ethersproject/constants" "^5.0.8" + "@ethersproject/logger" "^5.0.8" + +"@ethersproject/wallet@5.0.10": version "5.0.10" - resolved "https://registry.yarnpkg.com/@ethersproject/web/-/web-5.0.10.tgz#ed4dc04ad9e81a68d44fc67afb38f1ed0578a647" - integrity sha512-j49TbzUJBggILUuZahNXG59ugktjfCJyJfNhmC068DwIG0k+ygYK2BV1CWP3uuh7H2DHZ6LMLC+IsWWKb8MDlA== + resolved "https://registry.yarnpkg.com/@ethersproject/wallet/-/wallet-5.0.10.tgz#16ad0864d9e0e2b57fb32d768ea4161891d62727" + integrity sha512-5siYr38NhqZKH6DUr6u4PdhgOKur8Q6sw+JID2TitEUmW0tOl8f6rpxAe77tw6SJT60D2UcvgsyLtl32+Nl+ig== + dependencies: + "@ethersproject/abstract-provider" "^5.0.8" + "@ethersproject/abstract-signer" "^5.0.10" + "@ethersproject/address" "^5.0.9" + "@ethersproject/bignumber" "^5.0.13" + "@ethersproject/bytes" "^5.0.9" + "@ethersproject/hash" "^5.0.10" + "@ethersproject/hdnode" "^5.0.8" + "@ethersproject/json-wallets" "^5.0.10" + "@ethersproject/keccak256" "^5.0.7" + "@ethersproject/logger" "^5.0.8" + "@ethersproject/properties" "^5.0.7" + "@ethersproject/random" "^5.0.7" + "@ethersproject/signing-key" "^5.0.8" + "@ethersproject/transactions" "^5.0.9" + "@ethersproject/wordlists" "^5.0.8" + +"@ethersproject/web@5.0.12", "@ethersproject/web@^5.0.12": + version "5.0.12" + resolved "https://registry.yarnpkg.com/@ethersproject/web/-/web-5.0.12.tgz#f123397c107f863c31fce5f31a97c66ec155e755" + integrity sha512-gVxS5iW0bgidZ76kr7LsTxj4uzN5XpCLzvZrLp8TP+4YgxHfCeetFyQkRPgBEAJdNrexdSBayvyJvzGvOq0O8g== + dependencies: + "@ethersproject/base64" "^5.0.7" + "@ethersproject/bytes" "^5.0.9" + "@ethersproject/logger" "^5.0.8" + "@ethersproject/properties" "^5.0.7" + "@ethersproject/strings" "^5.0.8" + +"@ethersproject/wordlists@5.0.8", "@ethersproject/wordlists@^5.0.8": + version "5.0.8" + resolved "https://registry.yarnpkg.com/@ethersproject/wordlists/-/wordlists-5.0.8.tgz#593319b710a5a1f4e839b72641aa765b4f111137" + integrity sha512-px2mloc1wAcdTbzv0ZotTx+Uh/dfnDO22D9Rx8xr7+/PUwAhZQjoJ9t7Hn72nsaN83rWBXsLvFcIRZju4GIaEQ== dependencies: - "@ethersproject/base64" "^5.0.3" - "@ethersproject/bytes" "^5.0.4" - "@ethersproject/logger" "^5.0.5" - "@ethersproject/properties" "^5.0.3" - "@ethersproject/strings" "^5.0.4" - -"@machinomy/types-safe-buffer@^0.0.1": - version "0.0.1" - resolved "https://registry.yarnpkg.com/@machinomy/types-safe-buffer/-/types-safe-buffer-0.0.1.tgz#bf80d94a2cc90b9d8438749aa3542dbf7a1f72b0" - integrity sha1-v4DZSizJC52EOHSao1Qtv3ofcrA= + "@ethersproject/bytes" "^5.0.9" + "@ethersproject/hash" "^5.0.10" + "@ethersproject/logger" "^5.0.8" + "@ethersproject/properties" "^5.0.7" + "@ethersproject/strings" "^5.0.8" -"@nodelib/fs.scandir@2.1.3": - version "2.1.3" - resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.3.tgz#3a582bdb53804c6ba6d146579c46e52130cf4a3b" - integrity sha512-eGmwYQn3gxo4r7jdQnkrrN6bY478C3P+a/y72IJukF8LjB6ZHeB3c+Ehacj3sYeSmUXGlnA67/PmbM9CVwL7Dw== +"@nodelib/fs.scandir@2.1.4": + version "2.1.4" + resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.4.tgz#d4b3549a5db5de2683e0c1071ab4f140904bbf69" + integrity sha512-33g3pMJk3bg5nXbL/+CY6I2eJDzZAni49PfJnL5fghPTggPvBd/pFNSgJsdAgWptuFu7qq/ERvOYFlhvsLTCKA== dependencies: - "@nodelib/fs.stat" "2.0.3" + "@nodelib/fs.stat" "2.0.4" run-parallel "^1.1.9" -"@nodelib/fs.stat@2.0.3", "@nodelib/fs.stat@^2.0.2": - version "2.0.3" - resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.3.tgz#34dc5f4cabbc720f4e60f75a747e7ecd6c175bd3" - integrity sha512-bQBFruR2TAwoevBEd/NWMoAAtNGzTRgdrqnYCc7dhzfoNvqPzLyqlEQnzZ3kVnNrSp25iyxE00/3h2fqGAGArA== +"@nodelib/fs.stat@2.0.4", "@nodelib/fs.stat@^2.0.2": + version "2.0.4" + resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.4.tgz#a3f2dd61bab43b8db8fa108a121cfffe4c676655" + integrity sha512-IYlHJA0clt2+Vg7bccq+TzRdJvv19c2INqBSsoOLp1je7xjtr7J26+WXR72MCdvU9q1qTzIWDfhMf+DRvQJK4Q== "@nodelib/fs.walk@^1.2.3": - version "1.2.4" - resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.4.tgz#011b9202a70a6366e436ca5c065844528ab04976" - integrity sha512-1V9XOY4rDW0rehzbrcqAmHnz8e7SKvX27gh8Gt2WgB0+pdzdiLV83p72kZPU+jvMbS1qU5mauP2iOvO8rhmurQ== + version "1.2.6" + resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.6.tgz#cce9396b30aa5afe9e3756608f5831adcb53d063" + integrity sha512-8Broas6vTtW4GIXTAHDoE32hnN2M5ykgCpWGbuXHQ15vEMqr23pB76e/GZcYsZCHALv50ktd24qhEyKr6wBtow== dependencies: - "@nodelib/fs.scandir" "2.1.3" + "@nodelib/fs.scandir" "2.1.4" fastq "^1.6.0" "@nomiclabs/ethereumjs-vm@^4.1.1": - version "4.2.0" - resolved "https://registry.yarnpkg.com/@nomiclabs/ethereumjs-vm/-/ethereumjs-vm-4.2.0.tgz#a853bdb4fb032529f810f32bb767551d19d7ce57" - integrity sha512-+XwqoO941bILTO4KDLIUJ37U42ySxw6it7jyoi0tKv0/VUcOrWKF1TCQWMv6dBDRlxpPQd273n9o5SVlYYLRWQ== + version "4.2.1" + resolved "https://registry.yarnpkg.com/@nomiclabs/ethereumjs-vm/-/ethereumjs-vm-4.2.1.tgz#768a6a071f88a9f3d27e560b899f86191d53bb72" + integrity sha512-vVloT6g/QNPasIrGWpR583b9nn1cBjNIQtaVdunEvwVFnEmTpsE0U67OiAiqYZmd0g7zqQrj2jepw0GEgnAz7Q== dependencies: async "^2.1.2" async-eventemitter "^0.2.2" @@ -305,209 +513,127 @@ safe-buffer "^5.1.1" util.promisify "^1.0.0" -"@nomiclabs/hardhat-truffle5@^2.0.0": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@nomiclabs/hardhat-truffle5/-/hardhat-truffle5-2.0.0.tgz#1363b7f4f90e3d5b049d22e5e6d3519ba1b91fdf" - integrity sha512-JLjyfeXTiSqa0oLHcN3i8kD4coJa4Gx6uAXybGv3aBiliEbHddLSzmBWx0EU69a1/Ad5YDdGSqVnjB8mkUCr/g== - dependencies: - "@nomiclabs/truffle-contract" "^4.2.23" - "@types/chai" "^4.2.0" - chai "^4.2.0" - ethereumjs-util "^6.1.0" - fs-extra "^7.0.1" - -"@nomiclabs/hardhat-web3@^2.0.0": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@nomiclabs/hardhat-web3/-/hardhat-web3-2.0.0.tgz#2d9850cb285a2cebe1bd718ef26a9523542e52a9" - integrity sha512-zt4xN+D+fKl3wW2YlTX3k9APR3XZgPkxJYf36AcliJn3oujnKEVRZaHu0PhgLjO+gR+F/kiYayo9fgd2L8970Q== - dependencies: - "@types/bignumber.js" "^5.0.0" - -"@nomiclabs/truffle-contract@^4.2.23": - version "4.2.23" - resolved "https://registry.yarnpkg.com/@nomiclabs/truffle-contract/-/truffle-contract-4.2.23.tgz#3431d09d2400413d3a14650494abc0a6233c16d4" - integrity sha512-Khj/Ts9r0LqEpGYhISbc+8WTOd6qJ4aFnDR+Ew+neqcjGnhwrIvuihNwPFWU6hDepW3Xod6Y+rTo90N8sLRDjw== - dependencies: - "@truffle/blockchain-utils" "^0.0.25" - "@truffle/contract-schema" "^3.2.5" - "@truffle/debug-utils" "^4.2.9" - "@truffle/error" "^0.0.11" - "@truffle/interface-adapter" "^0.4.16" - bignumber.js "^7.2.1" - ethereum-ens "^0.8.0" - ethers "^4.0.0-beta.1" - source-map-support "^0.5.19" +"@nomiclabs/hardhat-ethers@^2.0.1": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@nomiclabs/hardhat-ethers/-/hardhat-ethers-2.0.1.tgz#f86a6fa210dbe6270adffccc75e93ed60a856904" + integrity sha512-uTFHDhhvJ+UjfvvMeQxD3ZALuzuI3FXzTYT1Z5N3ebyZL5z4Ogwt55GB0R9tdKY0p5HhDhBjU/gsCjUEwIVoaw== -"@openzeppelin/contract-loader@^0.4.0": - version "0.4.0" - resolved "https://registry.yarnpkg.com/@openzeppelin/contract-loader/-/contract-loader-0.4.0.tgz#c28c05d09df94c634d968ed175b5777dfc675872" - integrity sha512-K+Pl4tn0FbxMSP0H9sgi61ayCbecpqhQmuBshelC7A3q2MlpcqWRJan0xijpwdtv6TORNd5oZNe/+f3l+GD6tw== +"@nomiclabs/hardhat-waffle@^2.0.1": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@nomiclabs/hardhat-waffle/-/hardhat-waffle-2.0.1.tgz#5d43654fba780720c5033dea240fe14f70ef4bd2" + integrity sha512-2YR2V5zTiztSH9n8BYWgtv3Q+EL0N5Ltm1PAr5z20uAY4SkkfylJ98CIqt18XFvxTD5x4K2wKBzddjV9ViDAZQ== dependencies: - find-up "^4.1.0" - fs-extra "^8.1.0" - try-require "^1.2.1" - -"@openzeppelin/contracts@2.5.0": - version "2.5.0" - resolved "https://registry.yarnpkg.com/@openzeppelin/contracts/-/contracts-2.5.0.tgz#e327a98ba1d26b7756ff62885a0aa0967a375449" - integrity sha512-t3jm8FrhL9tkkJTofkznTqo/XXdHi21w5yXwalEnaMOp22ZwZ0f/mmKdlgMMLPFa6bSVHbY88mKESwJT/7m5Lg== + "@types/sinon-chai" "^3.2.3" + "@types/web3" "1.0.19" -"@openzeppelin/test-helpers@git+https://git@github.com/alsco77/openzeppelin-test-helpers.git": - version "0.5.5" - resolved "git+https://git@github.com/alsco77/openzeppelin-test-helpers.git#ab4b86771431ce17592d5fb9f0a22ce913127517" - dependencies: - "@openzeppelin/contract-loader" "^0.4.0" - "@truffle/contract" "^4.0.35" - ansi-colors "^3.2.3" - chai "^4.2.0" - chai-bn "^0.2.1" - ethjs-abi "^0.2.1" - lodash.flatten "^4.4.0" - semver "^5.6.0" - web3 "^1.2.1" - web3-utils "^1.2.1" +"@openzeppelin/contracts-sol8@yarn:oz-fork@3.4.0": + version "3.4.0" + resolved "https://registry.yarnpkg.com/oz-fork/-/oz-fork-3.4.0.tgz#baab9f6f50fad2479e6b1aecb84875aa506fac0d" + integrity sha512-q1GRsuzY8F8upDw9vWrU4N8jY2o8CdYQRiFPm1vA8ZYUxqBkmJTs8JEujN3bc9kEUUt3zanLp+Sqpa/MlLjgGQ== -"@openzeppelin/upgrades@2.7.2": - version "2.7.2" - resolved "https://registry.yarnpkg.com/@openzeppelin/upgrades/-/upgrades-2.7.2.tgz#140124305af7aee935566e735f2aa970880ab3d1" - integrity sha512-RU63TpSLNRjoeC6M4IeaEA3lI8UP6DdWF5L+gru9uExU+A/OvrhfepHfNd5lFQtkCB77oQ2I1wauE75K5a/ysg== - dependencies: - "@types/cbor" "^2.0.0" - axios "^0.18.0" - bignumber.js "^7.2.0" - cbor "^4.1.5" - chalk "^2.4.1" - ethers "^4.0.20" - glob "^7.1.3" - lodash.concat "^4.5.0" - lodash.difference "^4.5.0" - lodash.every "^4.6.0" - lodash.findlast "^4.6.0" - lodash.flatten "^4.4.0" - lodash.includes "^4.3.0" - lodash.invertby "^4.7.0" - lodash.isempty "^4.4.0" - lodash.isequal "^4.5.0" - lodash.isstring "^4.0.1" - lodash.keys "^4.2.0" - lodash.map "^4.6.0" - lodash.omit "^4.5.0" - lodash.pick "^4.4.0" - lodash.pickby "^4.6.0" - lodash.random "^3.2.0" - lodash.reverse "^4.0.1" - lodash.some "^4.6.0" - lodash.uniq "^4.5.0" - lodash.values "^4.3.0" - lodash.without "^4.4.0" - semver "^5.5.1" - spinnies "^0.4.2" - truffle-flattener "^1.4.0" - web3 "1.2.2" - web3-eth "1.2.2" - web3-eth-contract "1.2.2" - web3-utils "1.2.2" - -"@resolver-engine/core@^0.2.1": - version "0.2.1" - resolved "https://registry.yarnpkg.com/@resolver-engine/core/-/core-0.2.1.tgz#0d71803f6d3b8cb2e9ed481a1bf0ca5f5256d0c0" - integrity sha512-nsLQHmPJ77QuifqsIvqjaF5B9aHnDzJjp73Q1z6apY3e9nqYrx4Dtowhpsf7Jwftg/XzVDEMQC+OzUBNTS+S1A== +"@resolver-engine/core@^0.3.3": + version "0.3.3" + resolved "https://registry.yarnpkg.com/@resolver-engine/core/-/core-0.3.3.tgz#590f77d85d45bc7ecc4e06c654f41345db6ca967" + integrity sha512-eB8nEbKDJJBi5p5SrvrvILn4a0h42bKtbCTri3ZxCGt6UvoQyp7HnGOfki944bUjBSHKK3RvgfViHn+kqdXtnQ== dependencies: debug "^3.1.0" + is-url "^1.2.4" request "^2.85.0" -"@resolver-engine/fs@^0.2.1": - version "0.2.1" - resolved "https://registry.yarnpkg.com/@resolver-engine/fs/-/fs-0.2.1.tgz#f98a308d77568cc02651d03636f46536b941b241" - integrity sha512-7kJInM1Qo2LJcKyDhuYzh9ZWd+mal/fynfL9BNjWOiTcOpX+jNfqb/UmGUqros5pceBITlWGqS4lU709yHFUbg== +"@resolver-engine/fs@^0.3.3": + version "0.3.3" + resolved "https://registry.yarnpkg.com/@resolver-engine/fs/-/fs-0.3.3.tgz#fbf83fa0c4f60154a82c817d2fe3f3b0c049a973" + integrity sha512-wQ9RhPUcny02Wm0IuJwYMyAG8fXVeKdmhm8xizNByD4ryZlx6PP6kRen+t/haF43cMfmaV7T3Cx6ChOdHEhFUQ== dependencies: - "@resolver-engine/core" "^0.2.1" + "@resolver-engine/core" "^0.3.3" debug "^3.1.0" -"@resolver-engine/imports-fs@^0.2.2": - version "0.2.2" - resolved "https://registry.yarnpkg.com/@resolver-engine/imports-fs/-/imports-fs-0.2.2.tgz#5a81ef3285dbf0411ab3b15205080a1ad7622d9e" - integrity sha512-gFCgMvCwyppjwq0UzIjde/WI+yDs3oatJhozG9xdjJdewwtd7LiF0T5i9lrHAUtqrQbqoFE4E+ZMRVHWpWHpKQ== +"@resolver-engine/imports-fs@^0.3.3": + version "0.3.3" + resolved "https://registry.yarnpkg.com/@resolver-engine/imports-fs/-/imports-fs-0.3.3.tgz#4085db4b8d3c03feb7a425fbfcf5325c0d1e6c1b" + integrity sha512-7Pjg/ZAZtxpeyCFlZR5zqYkz+Wdo84ugB5LApwriT8XFeQoLwGUj4tZFFvvCuxaNCcqZzCYbonJgmGObYBzyCA== dependencies: - "@resolver-engine/fs" "^0.2.1" - "@resolver-engine/imports" "^0.2.2" + "@resolver-engine/fs" "^0.3.3" + "@resolver-engine/imports" "^0.3.3" debug "^3.1.0" -"@resolver-engine/imports@^0.2.2": - version "0.2.2" - resolved "https://registry.yarnpkg.com/@resolver-engine/imports/-/imports-0.2.2.tgz#d3de55a1bb5f3beb7703fdde743298f321175843" - integrity sha512-u5/HUkvo8q34AA+hnxxqqXGfby5swnH0Myw91o3Sm2TETJlNKXibFGSKBavAH+wvWdBi4Z5gS2Odu0PowgVOUg== +"@resolver-engine/imports@^0.3.3": + version "0.3.3" + resolved "https://registry.yarnpkg.com/@resolver-engine/imports/-/imports-0.3.3.tgz#badfb513bb3ff3c1ee9fd56073e3144245588bcc" + integrity sha512-anHpS4wN4sRMwsAbMXhMfOD/y4a4Oo0Cw/5+rue7hSwGWsDOQaAU1ClK1OxjUC35/peazxEl8JaSRRS+Xb8t3Q== dependencies: - "@resolver-engine/core" "^0.2.1" + "@resolver-engine/core" "^0.3.3" debug "^3.1.0" hosted-git-info "^2.6.0" - -"@sentry/core@5.27.4": - version "5.27.4" - resolved "https://registry.yarnpkg.com/@sentry/core/-/core-5.27.4.tgz#4155ee09ee4deed7364918094bf81654dcf681c0" - integrity sha512-IbI37cIZU/qBQouuUXaLbGF/9xYFp5STqmj1Gv64l0IZe4JnEp06V3yD5GxQ/mJ78vSfOqfwLooVCUw9FA61sQ== - dependencies: - "@sentry/hub" "5.27.4" - "@sentry/minimal" "5.27.4" - "@sentry/types" "5.27.4" - "@sentry/utils" "5.27.4" + path-browserify "^1.0.0" + url "^0.11.0" + +"@sentry/core@5.30.0": + version "5.30.0" + resolved "https://registry.yarnpkg.com/@sentry/core/-/core-5.30.0.tgz#6b203664f69e75106ee8b5a2fe1d717379b331f3" + integrity sha512-TmfrII8w1PQZSZgPpUESqjB+jC6MvZJZdLtE/0hZ+SrnKhW3x5WlYLvTXZpcWePYBku7rl2wn1RZu6uT0qCTeg== + dependencies: + "@sentry/hub" "5.30.0" + "@sentry/minimal" "5.30.0" + "@sentry/types" "5.30.0" + "@sentry/utils" "5.30.0" tslib "^1.9.3" -"@sentry/hub@5.27.4": - version "5.27.4" - resolved "https://registry.yarnpkg.com/@sentry/hub/-/hub-5.27.4.tgz#15db6f504672edd70b793e4b3d370dca9cb2fef6" - integrity sha512-Ba1AqcjvSd2S+fpdXtXCrVXdrzq9E2Etb2eHUOkEYwSsq7StMOw7E8YHDPAo+to8zUbpMPz/Z9XGhFkyAbImGQ== +"@sentry/hub@5.30.0": + version "5.30.0" + resolved "https://registry.yarnpkg.com/@sentry/hub/-/hub-5.30.0.tgz#2453be9b9cb903404366e198bd30c7ca74cdc100" + integrity sha512-2tYrGnzb1gKz2EkMDQcfLrDTvmGcQPuWxLnJKXJvYTQDGLlEvi2tWz1VIHjunmOvJrB5aIQLhm+dcMRwFZDCqQ== dependencies: - "@sentry/types" "5.27.4" - "@sentry/utils" "5.27.4" + "@sentry/types" "5.30.0" + "@sentry/utils" "5.30.0" tslib "^1.9.3" -"@sentry/minimal@5.27.4": - version "5.27.4" - resolved "https://registry.yarnpkg.com/@sentry/minimal/-/minimal-5.27.4.tgz#2b331ed43d5f8999606fe9f8bf26a85155e8286c" - integrity sha512-biw5YfIQwvDoaRhLarfeRQ6MJ9UJOoDTmu8Kgg18prJy4rtfDowNJP0OBs5XAsTk6SWAXiE3g7vqUJBXgs7BWA== +"@sentry/minimal@5.30.0": + version "5.30.0" + resolved "https://registry.yarnpkg.com/@sentry/minimal/-/minimal-5.30.0.tgz#ce3d3a6a273428e0084adcb800bc12e72d34637b" + integrity sha512-BwWb/owZKtkDX+Sc4zCSTNcvZUq7YcH3uAVlmh/gtR9rmUvbzAA3ewLuB3myi4wWRAMEtny6+J/FN/x+2wn9Xw== dependencies: - "@sentry/hub" "5.27.4" - "@sentry/types" "5.27.4" + "@sentry/hub" "5.30.0" + "@sentry/types" "5.30.0" tslib "^1.9.3" "@sentry/node@^5.18.1": - version "5.27.4" - resolved "https://registry.yarnpkg.com/@sentry/node/-/node-5.27.4.tgz#7fe327a45f865bff7c4b7f0d74d94506ec0a05bc" - integrity sha512-fv3FfQ6FiNV56LKk6t48oNw8qgf7X5fEhqhvKAoU7w+BL9AhChzh9v7sWn9ppDtRFE45tFfsZh0J/8ox5jpnfQ== - dependencies: - "@sentry/core" "5.27.4" - "@sentry/hub" "5.27.4" - "@sentry/tracing" "5.27.4" - "@sentry/types" "5.27.4" - "@sentry/utils" "5.27.4" + version "5.30.0" + resolved "https://registry.yarnpkg.com/@sentry/node/-/node-5.30.0.tgz#4ca479e799b1021285d7fe12ac0858951c11cd48" + integrity sha512-Br5oyVBF0fZo6ZS9bxbJZG4ApAjRqAnqFFurMVJJdunNb80brh7a5Qva2kjhm+U6r9NJAB5OmDyPkA1Qnt+QVg== + dependencies: + "@sentry/core" "5.30.0" + "@sentry/hub" "5.30.0" + "@sentry/tracing" "5.30.0" + "@sentry/types" "5.30.0" + "@sentry/utils" "5.30.0" cookie "^0.4.1" https-proxy-agent "^5.0.0" lru_map "^0.3.3" tslib "^1.9.3" -"@sentry/tracing@5.27.4": - version "5.27.4" - resolved "https://registry.yarnpkg.com/@sentry/tracing/-/tracing-5.27.4.tgz#0f6b0ebfa90b9f5bf5bac1fcf0f196010dbdddac" - integrity sha512-f3nG8ozCdcbFOzsnBCZ8w+/WfoNiAd0Ctr643L0rsFbaSzPWxbPMe3LNVrWwFVo6mHacG3/2HYmJ3CYMiWyTKQ== +"@sentry/tracing@5.30.0": + version "5.30.0" + resolved "https://registry.yarnpkg.com/@sentry/tracing/-/tracing-5.30.0.tgz#501d21f00c3f3be7f7635d8710da70d9419d4e1f" + integrity sha512-dUFowCr0AIMwiLD7Fs314Mdzcug+gBVo/+NCMyDw8tFxJkwWAKl7Qa2OZxLQ0ZHjakcj1hNKfCQJ9rhyfOl4Aw== dependencies: - "@sentry/hub" "5.27.4" - "@sentry/minimal" "5.27.4" - "@sentry/types" "5.27.4" - "@sentry/utils" "5.27.4" + "@sentry/hub" "5.30.0" + "@sentry/minimal" "5.30.0" + "@sentry/types" "5.30.0" + "@sentry/utils" "5.30.0" tslib "^1.9.3" -"@sentry/types@5.27.4": - version "5.27.4" - resolved "https://registry.yarnpkg.com/@sentry/types/-/types-5.27.4.tgz#ba7cefae6f77bb39a0ac59aeba1bb23ce4ad5216" - integrity sha512-41h3c7tgtSS8UBmfvEckSr+7V7/IVOjt/EiydyOd6s0N18zSFfGY5HdA6g+eFtIJK3DhWkUHCHZNanD5IY5YCQ== +"@sentry/types@5.30.0": + version "5.30.0" + resolved "https://registry.yarnpkg.com/@sentry/types/-/types-5.30.0.tgz#19709bbe12a1a0115bc790b8942917da5636f402" + integrity sha512-R8xOqlSTZ+htqrfteCWU5Nk0CDN5ApUTvrlvBuiH1DyP6czDZ4ktbZB0hAgBlVcK0U+qpD3ag3Tqqpa5Q67rPw== -"@sentry/utils@5.27.4": - version "5.27.4" - resolved "https://registry.yarnpkg.com/@sentry/utils/-/utils-5.27.4.tgz#d57ccd72a56e2f97e109d632957f6cd11806e992" - integrity sha512-shV1I/q+Tob3hUxRj11DfMhe9PNDiv85hUUoRloZGGwu275dMwpswb2uwgSmjc2Ao4pnMKVx8TL1hC3kGLVHTQ== +"@sentry/utils@5.30.0": + version "5.30.0" + resolved "https://registry.yarnpkg.com/@sentry/utils/-/utils-5.30.0.tgz#9a5bd7ccff85ccfe7856d493bffa64cabc41e980" + integrity sha512-zaYmoH0NWWtvnJjC9/CBseXMtKHm/tm40sz3YfJRxeQjyzRqNQPgivpd9R/oDJCYj999mzdW382p/qi2ypjLww== dependencies: - "@sentry/types" "5.27.4" + "@sentry/types" "5.30.0" tslib "^1.9.3" "@sindresorhus/is@^0.14.0": @@ -515,12 +641,12 @@ resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-0.14.0.tgz#9fb3a3cf3132328151f353de4632e01e52102bea" integrity sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ== -"@solidity-parser/parser@^0.7.1": - version "0.7.1" - resolved "https://registry.yarnpkg.com/@solidity-parser/parser/-/parser-0.7.1.tgz#660210130e4237476cb55e2882064809f80f861e" - integrity sha512-5ma2uuwPAEX1TPl2rAPAAuGlBkKnn2oUKQvnhTFlDIB8U/KDWX77FpHtL6Rcz+OwqSCWx9IClxACgyIEJ/GhIw== +"@solidity-parser/parser@^0.11.0": + version "0.11.0" + resolved "https://registry.yarnpkg.com/@solidity-parser/parser/-/parser-0.11.0.tgz#28bc1972e1620f7b388b485bca76a78ac2cb5c59" + integrity sha512-IaC4IaW8uoOB8lmEkw6c19y1vJBK/+7SzAbGQ+LmBYRPXSLNB+UgpORvmcAJEXhB04kWKyz/Os1U8onqm6U/+w== -"@solidity-parser/parser@^0.8.0", "@solidity-parser/parser@^0.8.1": +"@solidity-parser/parser@^0.8.1", "@solidity-parser/parser@^0.8.2": version "0.8.2" resolved "https://registry.yarnpkg.com/@solidity-parser/parser/-/parser-0.8.2.tgz#a6a5e93ac8dca6884a99a532f133beba59b87b69" integrity sha512-8LySx3qrNXPgB5JiULfG10O3V7QTxI/TLzSw5hFQhXWSkVxZBAv4rZQ0sYgLEbc8g3L2lmnujj1hKul38Eu5NQ== @@ -533,132 +659,20 @@ defer-to-connect "^1.0.1" "@tenderly/hardhat-tenderly@^1.0.3": - version "1.0.3" - resolved "https://registry.yarnpkg.com/@tenderly/hardhat-tenderly/-/hardhat-tenderly-1.0.3.tgz#01c6251057bfc2e69bc1ca783dda6e74c7b1ad38" - integrity sha512-qSR9v0Irqk3BXCMR/txCOrTiQ8TYk2yolEBus5EGhsoLtkvFkeG8rSqnCKLW17fCsD1XUBFWggb3Qx66j+U0Kg== + version "1.0.6" + resolved "https://registry.yarnpkg.com/@tenderly/hardhat-tenderly/-/hardhat-tenderly-1.0.6.tgz#aafc598deb739fbd3f147b2f58108ee1dc581dfb" + integrity sha512-0HjPLSoRDCI0uem93MrFbBrI/VdejbkGAxLsKqQSBjPRaOsX3h8zyrNFZlQpAWtvb9MlDFHRP/UQ10AQ654Knw== dependencies: axios "^0.20.0" fs-extra "^9.0.1" js-yaml "^3.14.0" -"@truffle/blockchain-utils@^0.0.25": - version "0.0.25" - resolved "https://registry.yarnpkg.com/@truffle/blockchain-utils/-/blockchain-utils-0.0.25.tgz#f4b320890113d282f25f1a1ecd65b94a8b763ac1" - integrity sha512-XA5m0BfAWtysy5ChHyiAf1fXbJxJXphKk+eZ9Rb9Twi6fn3Jg4gnHNwYXJacYFEydqT5vr2s4Ou812JHlautpw== - dependencies: - source-map-support "^0.5.19" - -"@truffle/codec@^0.7.1": - version "0.7.1" - resolved "https://registry.yarnpkg.com/@truffle/codec/-/codec-0.7.1.tgz#2ef0fa40109040796afbebb8812c872122100ae4" - integrity sha512-mNd6KnW6J0UB1zafGBXDlTEbCMvWpmPAJmzv7aF/nAIaN/F8UePSCiQ1OTQP39Rprj6GFiCCaWVnBAwum6UGSg== - dependencies: - big.js "^5.2.2" - bn.js "^4.11.8" - borc "^2.1.2" - debug "^4.1.0" - lodash.clonedeep "^4.5.0" - lodash.escaperegexp "^4.1.2" - lodash.partition "^4.6.0" - lodash.sum "^4.0.2" - semver "^6.3.0" - source-map-support "^0.5.19" - utf8 "^3.0.0" - web3-utils "1.2.9" - -"@truffle/codec@^0.8.1": - version "0.8.1" - resolved "https://registry.yarnpkg.com/@truffle/codec/-/codec-0.8.1.tgz#1f7b62a9d4063ed1b91ecb81d2d83be4ff97389d" - integrity sha512-X6BcpS97zpmLWRoAg9zJJIPoEiAJ3MRRJd5zf+qTmLbYXVhek9frreDMhs4WoaQSe3/DOYjVxtPmwmY4+alVvw== - dependencies: - big.js "^5.2.2" - bn.js "^4.11.8" - borc "^2.1.2" - debug "^4.1.0" - lodash.clonedeep "^4.5.0" - lodash.escaperegexp "^4.1.2" - lodash.partition "^4.6.0" - lodash.sum "^4.0.2" - semver "^6.3.0" - source-map-support "^0.5.19" - utf8 "^3.0.0" - web3-utils "1.2.9" - -"@truffle/contract-schema@^3.2.5", "@truffle/contract-schema@^3.3.2": - version "3.3.2" - resolved "https://registry.yarnpkg.com/@truffle/contract-schema/-/contract-schema-3.3.2.tgz#6450738c35859ed087760d826031a8247f7bc907" - integrity sha512-PFNUHlcMFh6CDLDXTYCpm1G5rM5EJlneA9ml5y1TbkLgjLMICI2XLilimFZ/DC0THQekHpoQC+W/QMD/OTiTiw== - dependencies: - ajv "^6.10.0" - crypto-js "^3.1.9-1" - debug "^4.1.0" - -"@truffle/contract@^4.0.35": - version "4.2.31" - resolved "https://registry.yarnpkg.com/@truffle/contract/-/contract-4.2.31.tgz#85c6559a699a67ec0b2609c303981f503d97afec" - integrity sha512-wifJ343skGQpFJQlmRQyPRquguR0uDSIVaRPHXVsGnX+6p1BOGP2zhkSUjLo8WUqyfmw/1bZ/Z9GJZ7XM8PVOw== - dependencies: - "@truffle/blockchain-utils" "^0.0.25" - "@truffle/contract-schema" "^3.3.2" - "@truffle/debug-utils" "^5.0.2" - "@truffle/error" "^0.0.11" - "@truffle/interface-adapter" "^0.4.18" - bignumber.js "^7.2.1" - ethereum-ens "^0.8.0" - ethers "^4.0.0-beta.1" - source-map-support "^0.5.19" - web3 "1.2.9" - web3-core-helpers "1.2.9" - web3-core-promievent "1.2.9" - web3-eth-abi "1.2.9" - web3-utils "1.2.9" - -"@truffle/debug-utils@^4.2.9": - version "4.2.14" - resolved "https://registry.yarnpkg.com/@truffle/debug-utils/-/debug-utils-4.2.14.tgz#28431691bc3a96bad19e31733d957ac79059d4e7" - integrity sha512-g5UTX2DPTzrjRjBJkviGI2IrQRTTSvqjmNWCNZNXP+vgQKNxL9maLZhQ6oA3BuuByVW/kusgYeXt8+W1zynC8g== - dependencies: - "@truffle/codec" "^0.7.1" - "@trufflesuite/chromafi" "^2.2.1" - chalk "^2.4.2" - debug "^4.1.0" - highlight.js "^9.15.8" - highlightjs-solidity "^1.0.18" - -"@truffle/debug-utils@^5.0.2": - version "5.0.2" - resolved "https://registry.yarnpkg.com/@truffle/debug-utils/-/debug-utils-5.0.2.tgz#566d6d8a2000325810ff57c9302abdb6b6740061" - integrity sha512-VTnbmTcjUKR0uctqUiPDlIt+R/7ix78hntSZku/qZ/EO/b1ts8W2fA0M2uPU+G8cicvvUpidg1z+qk/u844rDQ== - dependencies: - "@truffle/codec" "^0.8.1" - "@trufflesuite/chromafi" "^2.2.1" - chalk "^2.4.2" - debug "^4.1.0" - highlight.js "^9.15.8" - highlightjs-solidity "^1.0.19" - "@truffle/error@^0.0.11": version "0.0.11" resolved "https://registry.yarnpkg.com/@truffle/error/-/error-0.0.11.tgz#2789c0042d7e796dcbb840c7a9b5d2bcd8e0e2d8" integrity sha512-ju6TucjlJkfYMmdraYY/IBJaFb+Sa+huhYtOoyOJ+G29KcgytUVnDzKGwC7Kgk6IsxQMm62Mc1E0GZzFbGGipw== -"@truffle/hdwallet-provider@^1.0.34": - version "1.2.0" - resolved "https://registry.yarnpkg.com/@truffle/hdwallet-provider/-/hdwallet-provider-1.2.0.tgz#7d4cc2038e1a2ca5cf08877f72a6383d14aff491" - integrity sha512-EPatDbyRuGbB/MLt9ZBokmtjyLjaNpuHfUIWuv4mQMrH1Nu82H5AAZYLh4Z1BZliDZpqB03a0yUMmK/4R0BN9g== - dependencies: - "@trufflesuite/web3-provider-engine" "15.0.13-1" - "@types/web3" "^1.0.20" - any-promise "^1.3.0" - bindings "^1.5.0" - ethereum-cryptography "^0.1.3" - ethereum-protocol "^1.0.1" - ethereumjs-tx "^1.0.0" - ethereumjs-util "^6.1.0" - ethereumjs-wallet "^0.6.3" - source-map-support "^0.5.19" - -"@truffle/interface-adapter@^0.4.16", "@truffle/interface-adapter@^0.4.18": +"@truffle/interface-adapter@^0.4.18": version "0.4.18" resolved "https://registry.yarnpkg.com/@truffle/interface-adapter/-/interface-adapter-0.4.18.tgz#1aac45596997d208085d5168f82b990624610646" integrity sha512-P9JVSYD/CX3V+NgTWu+Bf71sLh8pMwrCpbiYRB93pRw/1H3ZTvt5iDC2MVvVxCs8FkSiy4OZzQK/DJ8+hXAmYw== @@ -677,131 +691,26 @@ "@truffle/interface-adapter" "^0.4.18" web3 "1.2.9" -"@trufflesuite/chromafi@^2.2.1": - version "2.2.1" - resolved "https://registry.yarnpkg.com/@trufflesuite/chromafi/-/chromafi-2.2.1.tgz#6bad90d7cb52b3a414c9640346085482dbd41fd9" - integrity sha512-kODhM/LsjPrSRGQdaHe113v4xob/aheRmdwN0i6seVNavmHGBvC4ob3COlD1GjaklXsl9QWw4fengowIx1+07Q== - dependencies: - ansi-mark "^1.0.0" - ansi-regex "^3.0.0" - array-uniq "^1.0.3" - camelcase "^4.1.0" - chalk "^2.3.2" - cheerio "^1.0.0-rc.2" - detect-indent "^5.0.0" - he "^1.1.1" - highlight.js "^9.12.0" - lodash.merge "^4.6.2" - min-indent "^1.0.0" - strip-ansi "^4.0.0" - strip-indent "^2.0.0" - super-split "^1.1.0" - -"@trufflesuite/eth-json-rpc-filters@^4.1.2-1": - version "4.1.2-1" - resolved "https://registry.yarnpkg.com/@trufflesuite/eth-json-rpc-filters/-/eth-json-rpc-filters-4.1.2-1.tgz#61ab78c52e98a883e5cf086925b34a30297b1824" - integrity sha512-/MChvC5dw2ck9NU1cZmdovCz2VKbOeIyR4tcxDvA5sT+NaL0rA2/R5U0yI7zsbo1zD+pgqav77rQHTzpUdDNJQ== - dependencies: - "@trufflesuite/eth-json-rpc-middleware" "^4.4.2-0" - await-semaphore "^0.1.3" - eth-query "^2.1.2" - json-rpc-engine "^5.1.3" - lodash.flatmap "^4.5.0" - safe-event-emitter "^1.0.1" - -"@trufflesuite/eth-json-rpc-infura@^4.0.3-0": - version "4.0.3-0" - resolved "https://registry.yarnpkg.com/@trufflesuite/eth-json-rpc-infura/-/eth-json-rpc-infura-4.0.3-0.tgz#6d22122937cf60ec9d21a02351c101fdc608c4fe" - integrity sha512-xaUanOmo0YLqRsL0SfXpFienhdw5bpQ1WEXxMTRi57az4lwpZBv4tFUDvcerdwJrxX9wQqNmgUgd1BrR01dumw== - dependencies: - "@trufflesuite/eth-json-rpc-middleware" "^4.4.2-1" - cross-fetch "^2.1.1" - eth-json-rpc-errors "^1.0.1" - json-rpc-engine "^5.1.3" - -"@trufflesuite/eth-json-rpc-middleware@^4.4.2-0", "@trufflesuite/eth-json-rpc-middleware@^4.4.2-1": - version "4.4.2-1" - resolved "https://registry.yarnpkg.com/@trufflesuite/eth-json-rpc-middleware/-/eth-json-rpc-middleware-4.4.2-1.tgz#8c3638ed8a7ed89a1e5e71407de068a65bef0df2" - integrity sha512-iEy9H8ja7/8aYES5HfrepGBKU9n/Y4OabBJEklVd/zIBlhCCBAWBqkIZgXt11nBXO/rYAeKwYuE3puH3ByYnLA== - dependencies: - "@trufflesuite/eth-sig-util" "^1.4.2" - btoa "^1.2.1" - clone "^2.1.1" - eth-json-rpc-errors "^1.0.1" - eth-query "^2.1.2" - ethereumjs-block "^1.6.0" - ethereumjs-tx "^1.3.7" - ethereumjs-util "^5.1.2" - ethereumjs-vm "^2.6.0" - fetch-ponyfill "^4.0.0" - json-rpc-engine "^5.1.3" - json-stable-stringify "^1.0.1" - pify "^3.0.0" - safe-event-emitter "^1.0.1" - -"@trufflesuite/eth-sig-util@^1.4.2": - version "1.4.2" - resolved "https://registry.yarnpkg.com/@trufflesuite/eth-sig-util/-/eth-sig-util-1.4.2.tgz#b529e2f38ac08e652116f48981132a26242a4f08" - integrity sha512-+GyfN6b0LNW77hbQlH3ufZ/1eCON7mMrGym6tdYf7xiNw9Vv3jBO72bmmos1EId2NgBvPMhmYYm6DSLQFTmzrA== - dependencies: - ethereumjs-abi "^0.6.8" - ethereumjs-util "^5.1.1" - -"@trufflesuite/web3-provider-engine@15.0.13-1": - version "15.0.13-1" - resolved "https://registry.yarnpkg.com/@trufflesuite/web3-provider-engine/-/web3-provider-engine-15.0.13-1.tgz#f6a7f7131a2fdc4ab53976318ed13ce83e8e4bcb" - integrity sha512-6u3x/iIN5fyj8pib5QTUDmIOUiwAGhaqdSTXdqCu6v9zo2BEwdCqgEJd1uXDh3DBmPRDfiZ/ge8oUPy7LerpHg== - dependencies: - "@trufflesuite/eth-json-rpc-filters" "^4.1.2-1" - "@trufflesuite/eth-json-rpc-infura" "^4.0.3-0" - "@trufflesuite/eth-json-rpc-middleware" "^4.4.2-1" - "@trufflesuite/eth-sig-util" "^1.4.2" - async "^2.5.0" - backoff "^2.5.0" - clone "^2.0.0" - cross-fetch "^2.1.0" - eth-block-tracker "^4.4.2" - eth-json-rpc-errors "^2.0.2" - ethereumjs-block "^1.2.2" - ethereumjs-tx "^1.2.0" - ethereumjs-util "^5.1.5" - ethereumjs-vm "^2.3.4" - json-stable-stringify "^1.0.1" - promise-to-callback "^1.0.0" - readable-stream "^2.2.9" - request "^2.85.0" - semaphore "^1.0.3" - ws "^5.1.1" - xhr "^2.2.0" - xtend "^4.0.1" - -"@typechain/truffle-v5@^2.0.0": - version "2.0.2" - resolved "https://registry.yarnpkg.com/@typechain/truffle-v5/-/truffle-v5-2.0.2.tgz#709a78ffb120f52c693818fea72e0b0d146c3454" - integrity sha512-g4N2kfol1S3g/QUkmpzukCGZiKWUdXsSms1be/+W4+R0DPMz1Q/76tY+C6bD7G/KeLhkiDKcnZFmNVNcAgjIfQ== - -"@types/bignumber.js@^5.0.0": +"@typechain/ethers-v5@^5.0.0": version "5.0.0" - resolved "https://registry.yarnpkg.com/@types/bignumber.js/-/bignumber.js-5.0.0.tgz#d9f1a378509f3010a3255e9cc822ad0eeb4ab969" - integrity sha512-0DH7aPGCClywOFaxxjE6UwpN2kQYe9LwuDQMv+zYA97j5GkOMo8e66LYT+a8JYU7jfmUFRZLa9KycxHDsKXJCA== + resolved "https://registry.yarnpkg.com/@typechain/ethers-v5/-/ethers-v5-5.0.0.tgz#6c91766b76c19886cf2c4833ded09611e117f92c" + integrity sha512-SnLnq6BCq2NBgm5xsQP8kRIawJ7gppLux8EOMb2ceoB5EuoW87AOyi6r1J5LTYe65/J59HjOVtaGCqsO+38Xrw== + +"@types/bn.js@*": + version "5.1.0" + resolved "https://registry.yarnpkg.com/@types/bn.js/-/bn.js-5.1.0.tgz#32c5d271503a12653c62cf4d2b45e6eab8cebc68" + integrity sha512-QSSVYj7pYFN49kW77o2s9xTCwZ8F2xLbjLLSEVh8D2F4JUhZtPAGOFLTD+ffqksBx/u4cE/KImFjyhqCjn/LIA== dependencies: - bignumber.js "*" + "@types/node" "*" -"@types/bn.js@^4.11.3", "@types/bn.js@^4.11.4", "@types/bn.js@^4.11.5", "@types/bn.js@^4.11.6": +"@types/bn.js@^4.11.3", "@types/bn.js@^4.11.4", "@types/bn.js@^4.11.5": version "4.11.6" resolved "https://registry.yarnpkg.com/@types/bn.js/-/bn.js-4.11.6.tgz#c306c70d9358aaea33cd4eda092a742b9505967c" integrity sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg== dependencies: "@types/node" "*" -"@types/cbor@^2.0.0": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@types/cbor/-/cbor-2.0.0.tgz#c627afc2ee22f23f2337fecb34628a4f97c6afbb" - integrity sha1-xievwu4i8j8jN/7LNGKKT5fGr7s= - dependencies: - "@types/node" "*" - -"@types/chai@^4.1.4", "@types/chai@^4.2.0", "@types/chai@^4.2.2": +"@types/chai@*": version "4.2.14" resolved "https://registry.yarnpkg.com/@types/chai/-/chai-4.2.14.tgz#44d2dd0b5de6185089375d976b4ec5caf6861193" integrity sha512-G+ITQPXkwTrslfG5L/BksmbLUA0M1iybEsmCWPqzSxsRRhJZimBKJkoMi8fr/CPygPTj4zO5pJH7I2/cm9M7SQ== @@ -813,11 +722,6 @@ dependencies: "@types/node" "*" -"@types/eslint-visitor-keys@^1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@types/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz#1ee30d79544ca84d68d4b3cdb0af4f205663dd2d" - integrity sha512-OCutwjDZ4aFS6PB1UZ988C4YgwlBHJd6wCeQqaLdmadZ/7e+w79+hbMUFC1QXDNCmdyoRfAFdm0RypzwR+Qpag== - "@types/form-data@0.0.33": version "0.0.33" resolved "https://registry.yarnpkg.com/@types/form-data/-/form-data-0.0.33.tgz#c9ac85b2a5fd18435b8c85d9ecb50e6d6c893ff8" @@ -834,9 +738,9 @@ "@types/node" "*" "@types/json-schema@^7.0.3": - version "7.0.6" - resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.6.tgz#f4c7ec43e81b319a9815115031709f26987891f0" - integrity sha512-3c+yGKvVP5Y9TYBEibGNR+kLtijnj7mYrXRg+WpFb2X9xm04g/DXYkfg4hmzJQosc9snFNUPkbYIhu+KAm6jJw== + version "7.0.7" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.7.tgz#98a993516c859eb0d5c4c8f098317a9ea68db9ad" + integrity sha512-cxWFQVseBm6O9Gbw1IWb8r6OS4OhSt3hPZLkFApLjM8TEXROBuQGLAH2i2gZpcXdLBIrpXuTDhH7Vbm1iXmNGA== "@types/json5@^0.0.29": version "0.0.29" @@ -844,9 +748,9 @@ integrity sha1-7ihweulOEdK4J7y+UnC86n8+ce4= "@types/lodash@^4.14.138": - version "4.14.165" - resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.165.tgz#74d55d947452e2de0742bad65270433b63a8c30f" - integrity sha512-tjSSOTHhI5mCHTy/OOXYIhi2Wt1qcbHmuXD1Ha7q70CgI/I71afO4XtLb/cVexki1oVYchpul/TOuu3Arcdxrg== + version "4.14.168" + resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.168.tgz#fe24632e79b7ade3f132891afff86caa5e5ce008" + integrity sha512-oVfRvqHV/V6D1yifJbVRU3TMp8OT6o6BG+U9MkwuJ3U8/CsDHvalRpsxBqivn71ztOFZBTfJMvETbqHiaNSj7Q== "@types/lru-cache@^5.1.0": version "5.1.0" @@ -865,25 +769,33 @@ dependencies: "@types/node" "*" -"@types/mocha@^5.2.5", "@types/mocha@^5.2.7": - version "5.2.7" - resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-5.2.7.tgz#315d570ccb56c53452ff8638738df60726d5b6ea" - integrity sha512-NYrtPht0wGzhwe9+/idPaBB+TqkY9AhTvOLMkThm0IoEfLaiVQZwBwyJ5puCkO3AUCWrmcoePjp2mbFocKy4SQ== +"@types/mocha@^8.2.0": + version "8.2.0" + resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-8.2.0.tgz#3eb56d13a1de1d347ecb1957c6860c911704bc44" + integrity sha512-/Sge3BymXo4lKc31C8OINJgXLaw+7vL1/L1pGiBNpGrBiT8FQiaFpSYV0uhTaG4y78vcMBTMFsWaHDvuD+xGzQ== -"@types/node@*": - version "14.14.9" - resolved "https://registry.yarnpkg.com/@types/node/-/node-14.14.9.tgz#04afc9a25c6ff93da14deabd65dc44485b53c8d6" - integrity sha512-JsoLXFppG62tWTklIoO4knA+oDTYsmqWxHRvd4lpmfQRNhX6osheUOWETP2jMoV/2bEHuMra8Pp3Dmo/stBFcw== +"@types/node-fetch@^2.5.5": + version "2.5.8" + resolved "https://registry.yarnpkg.com/@types/node-fetch/-/node-fetch-2.5.8.tgz#e199c835d234c7eb0846f6618012e558544ee2fb" + integrity sha512-fbjI6ja0N5ZA8TV53RUqzsKNkl9fv8Oj3T7zxW7FGv1GSH7gwJaNF8dzCjrqKaxKeUpTz4yT1DaJFq/omNpGfw== + dependencies: + "@types/node" "*" + form-data "^3.0.0" -"@types/node@^10.0.3", "@types/node@^10.12.18", "@types/node@^10.3.2": - version "10.17.46" - resolved "https://registry.yarnpkg.com/@types/node/-/node-10.17.46.tgz#1cd867ebfe9957ab45951f2f715f8de5f3dab7a3" - integrity sha512-Tice8a+sJtlP9C1EUo0DYyjq52T37b3LexVu3p871+kfIBIN+OQ7PKPei1oF3MgF39olEpUfxaLtD+QFc1k69Q== +"@types/node@*", "@types/node@^14.14.22": + version "14.14.22" + resolved "https://registry.yarnpkg.com/@types/node/-/node-14.14.22.tgz#0d29f382472c4ccf3bd96ff0ce47daf5b7b84b18" + integrity sha512-g+f/qj/cNcqKkc3tFqlXOYjrmZA+jNBiDzbP3kH+B+otKFqAdPgVTGP1IeKRdMml/aE69as5S4FqtxAbl+LaMw== -"@types/node@^12.12.6", "@types/node@^12.6.1", "@types/node@^12.7.5": - version "12.19.6" - resolved "https://registry.yarnpkg.com/@types/node/-/node-12.19.6.tgz#fbf249fa46487dd8c7386d785231368b92a33a53" - integrity sha512-U2VopDdmBoYBmtm8Rz340mvvSz34VgX/K9+XCuckvcLGMkt3rbMX8soqFOikIPlPBc5lmw8By9NUK7bEFSBFlQ== +"@types/node@^10.0.3", "@types/node@^10.12.18": + version "10.17.51" + resolved "https://registry.yarnpkg.com/@types/node/-/node-10.17.51.tgz#639538575befbcf3d3861f95c41de8e47124d674" + integrity sha512-KANw+MkL626tq90l++hGelbl67irOJzGhUJk6a1Bt8QHOeh9tztJx+L0AqttraWKinmZn7Qi5lJZJzx45Gq0dg== + +"@types/node@^12.12.6", "@types/node@^12.6.1": + version "12.19.14" + resolved "https://registry.yarnpkg.com/@types/node/-/node-12.19.14.tgz#59e5029a3c2aea34f68b717955381692fd47cafb" + integrity sha512-2U9uLN46+7dv9PiS8VQJcHhuoOjiDPZOLAt0WuA1EanEknIMae+2QbMhayF7cgGqjvRVIfNpt+6jLPczJZFiRw== "@types/node@^8.0.0": version "8.10.66" @@ -898,9 +810,9 @@ "@types/node" "*" "@types/prettier@^2.1.1": - version "2.1.5" - resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.1.5.tgz#b6ab3bba29e16b821d84e09ecfaded462b816b00" - integrity sha512-UEyp8LwZ4Dg30kVU2Q3amHHyTn1jEdhCIE59ANed76GaT1Vp76DD3ZWSAxgCrw6wJ0TqeoBpqmfUHiUDPs//HQ== + version "2.1.6" + resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.1.6.tgz#f4b1efa784e8db479cdb8b14403e2144b1e9ff03" + integrity sha512-6gOkRe7OIioWAXfnO/2lFiv+SJichKVSys1mSsgyrYHSEjk8Ctv4tSR/Odvnu+HWlH2C8j53dahU03XmQdd5fA== "@types/qs@^6.2.31": version "6.9.5" @@ -921,64 +833,173 @@ dependencies: "@types/node" "*" -"@types/web3@^1.0.18", "@types/web3@^1.0.20": - version "1.2.2" - resolved "https://registry.yarnpkg.com/@types/web3/-/web3-1.2.2.tgz#d95a101547ce625c5ebd0470baa5dbd4b9f3c015" - integrity sha512-eFiYJKggNrOl0nsD+9cMh2MLk4zVBfXfGnVeRFbpiZzBE20eet4KLA3fXcjSuHaBn0RnQzwLAGdgzgzdet4C0A== +"@types/sinon-chai@^3.2.3": + version "3.2.5" + resolved "https://registry.yarnpkg.com/@types/sinon-chai/-/sinon-chai-3.2.5.tgz#df21ae57b10757da0b26f512145c065f2ad45c48" + integrity sha512-bKQqIpew7mmIGNRlxW6Zli/QVyc3zikpGzCa797B/tRnD9OtHvZ/ts8sYXV+Ilj9u3QRaUEM8xrjgd1gwm1BpQ== dependencies: - web3 "*" + "@types/chai" "*" + "@types/sinon" "*" -"@typescript-eslint/eslint-plugin-tslint@^2.21.0": - version "2.34.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin-tslint/-/eslint-plugin-tslint-2.34.0.tgz#0a2cea8e9a0726ae5a42cecd94095b41b749a8e7" - integrity sha512-sCPCbFm1qRTzloeMUlHEKfgQH/2u9bUcW7tX5wjzRw1LWzsr+iNXS8I+2or9ep8mlqqE0Vy6hsMm4vVF82M2jw== +"@types/sinon@*": + version "9.0.10" + resolved "https://registry.yarnpkg.com/@types/sinon/-/sinon-9.0.10.tgz#7fb9bcb6794262482859cab66d59132fca18fcf7" + integrity sha512-/faDC0erR06wMdybwI/uR8wEKV/E83T0k4sepIpB7gXuy2gzx2xiOjmztq6a2Y6rIGJ04D+6UU0VBmWy+4HEMA== dependencies: - "@typescript-eslint/experimental-utils" "2.34.0" + "@types/sinonjs__fake-timers" "*" + +"@types/sinonjs__fake-timers@*": + version "6.0.2" + resolved "https://registry.yarnpkg.com/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-6.0.2.tgz#3a84cf5ec3249439015e14049bd3161419bf9eae" + integrity sha512-dIPoZ3g5gcx9zZEszaxLSVTvMReD3xxyyDnQUjA6IYDG9Ba2AV0otMPs+77sG9ojB4Qr2N2Vk5RnKeuA0X/0bg== + +"@types/underscore@*": + version "1.10.24" + resolved "https://registry.yarnpkg.com/@types/underscore/-/underscore-1.10.24.tgz#dede004deed3b3f99c4db0bdb9ee21cae25befdd" + integrity sha512-T3NQD8hXNW2sRsSbLNjF/aBo18MyJlbw0lSpQHB/eZZtScPdexN4HSa8cByYwTw9Wy7KuOFr81mlDQcQQaZ79w== + +"@types/web3@1.0.19": + version "1.0.19" + resolved "https://registry.yarnpkg.com/@types/web3/-/web3-1.0.19.tgz#46b85d91d398ded9ab7c85a5dd57cb33ac558924" + integrity sha512-fhZ9DyvDYDwHZUp5/STa9XW2re0E8GxoioYJ4pEUZ13YHpApSagixj7IAdoYH5uAK+UalGq6Ml8LYzmgRA/q+A== + dependencies: + "@types/bn.js" "*" + "@types/underscore" "*" + +"@typescript-eslint/eslint-plugin-tslint@^4.14.0": + version "4.14.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin-tslint/-/eslint-plugin-tslint-4.14.0.tgz#c465ff418f2dd016c3890648784b6d35068adc84" + integrity sha512-d14sju1LLPvzyZItiXw7WhqKUkiJaf2Y2g5JlAx90NhNseTyElcTmZW5vo6gqLDPLb2VsKQ4KYMYKZNTXXJGpw== + dependencies: + "@typescript-eslint/experimental-utils" "4.14.0" lodash "^4.17.15" -"@typescript-eslint/eslint-plugin@^2.21.0": - version "2.34.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-2.34.0.tgz#6f8ce8a46c7dea4a6f1d171d2bb8fbae6dac2be9" - integrity sha512-4zY3Z88rEE99+CNvTbXSyovv2z9PNOVffTWD2W8QF5s2prBQtwN2zadqERcrHpcR7O/+KMI3fcTAmUUhK/iQcQ== +"@typescript-eslint/eslint-plugin@^4.14.0": + version "4.14.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.14.0.tgz#92db8e7c357ed7d69632d6843ca70b71be3a721d" + integrity sha512-IJ5e2W7uFNfg4qh9eHkHRUCbgZ8VKtGwD07kannJvM5t/GU8P8+24NX8gi3Hf5jST5oWPY8kyV1s/WtfiZ4+Ww== dependencies: - "@typescript-eslint/experimental-utils" "2.34.0" + "@typescript-eslint/experimental-utils" "4.14.0" + "@typescript-eslint/scope-manager" "4.14.0" + debug "^4.1.1" functional-red-black-tree "^1.0.1" + lodash "^4.17.15" regexpp "^3.0.0" + semver "^7.3.2" tsutils "^3.17.1" -"@typescript-eslint/experimental-utils@2.34.0": - version "2.34.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-2.34.0.tgz#d3524b644cdb40eebceca67f8cf3e4cc9c8f980f" - integrity sha512-eS6FTkq+wuMJ+sgtuNTtcqavWXqsflWcfBnlYhg/nS4aZ1leewkXGbvBhaapn1q6qf4M71bsR1tez5JTRMuqwA== +"@typescript-eslint/experimental-utils@4.14.0": + version "4.14.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-4.14.0.tgz#5aa7b006736634f588a69ee343ca959cd09988df" + integrity sha512-6i6eAoiPlXMKRbXzvoQD5Yn9L7k9ezzGRvzC/x1V3650rUk3c3AOjQyGYyF9BDxQQDK2ElmKOZRD0CbtdkMzQQ== dependencies: "@types/json-schema" "^7.0.3" - "@typescript-eslint/typescript-estree" "2.34.0" + "@typescript-eslint/scope-manager" "4.14.0" + "@typescript-eslint/types" "4.14.0" + "@typescript-eslint/typescript-estree" "4.14.0" eslint-scope "^5.0.0" eslint-utils "^2.0.0" -"@typescript-eslint/parser@^2.21.0", "@typescript-eslint/parser@^2.24.0": - version "2.34.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-2.34.0.tgz#50252630ca319685420e9a39ca05fe185a256bc8" - integrity sha512-03ilO0ucSD0EPTw2X4PntSIRFtDPWjrVq7C3/Z3VQHRC7+13YB55rcJI3Jt+YgeHbjUdJPcPa7b23rXCBokuyA== +"@typescript-eslint/parser@4.4.1": + version "4.4.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-4.4.1.tgz#25fde9c080611f303f2f33cedb145d2c59915b80" + integrity sha512-S0fuX5lDku28Au9REYUsV+hdJpW/rNW0gWlc4SXzF/kdrRaAVX9YCxKpziH7djeWT/HFAjLZcnY7NJD8xTeUEg== dependencies: - "@types/eslint-visitor-keys" "^1.0.0" - "@typescript-eslint/experimental-utils" "2.34.0" - "@typescript-eslint/typescript-estree" "2.34.0" - eslint-visitor-keys "^1.1.0" + "@typescript-eslint/scope-manager" "4.4.1" + "@typescript-eslint/types" "4.4.1" + "@typescript-eslint/typescript-estree" "4.4.1" + debug "^4.1.1" -"@typescript-eslint/typescript-estree@2.34.0": - version "2.34.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-2.34.0.tgz#14aeb6353b39ef0732cc7f1b8285294937cf37d5" - integrity sha512-OMAr+nJWKdlVM9LOqCqh3pQQPwxHAN7Du8DR6dmwCrAmxtiXQnhHJ6tBNtf+cggqfo51SG/FCwnKhXCIM7hnVg== +"@typescript-eslint/parser@^4.14.0": + version "4.14.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-4.14.0.tgz#62d4cd2079d5c06683e9bfb200c758f292c4dee7" + integrity sha512-sUDeuCjBU+ZF3Lzw0hphTyScmDDJ5QVkyE21pRoBo8iDl7WBtVFS+WDN3blY1CH3SBt7EmYCw6wfmJjF0l/uYg== dependencies: + "@typescript-eslint/scope-manager" "4.14.0" + "@typescript-eslint/types" "4.14.0" + "@typescript-eslint/typescript-estree" "4.14.0" debug "^4.1.1" - eslint-visitor-keys "^1.1.0" - glob "^7.1.6" + +"@typescript-eslint/scope-manager@4.14.0": + version "4.14.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-4.14.0.tgz#55a4743095d684e1f7b7180c4bac2a0a3727f517" + integrity sha512-/J+LlRMdbPh4RdL4hfP1eCwHN5bAhFAGOTsvE6SxsrM/47XQiPSgF5MDgLyp/i9kbZV9Lx80DW0OpPkzL+uf8Q== + dependencies: + "@typescript-eslint/types" "4.14.0" + "@typescript-eslint/visitor-keys" "4.14.0" + +"@typescript-eslint/scope-manager@4.4.1": + version "4.4.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-4.4.1.tgz#d19447e60db2ce9c425898d62fa03b2cce8ea3f9" + integrity sha512-2oD/ZqD4Gj41UdFeWZxegH3cVEEH/Z6Bhr/XvwTtGv66737XkR4C9IqEkebCuqArqBJQSj4AgNHHiN1okzD/wQ== + dependencies: + "@typescript-eslint/types" "4.4.1" + "@typescript-eslint/visitor-keys" "4.4.1" + +"@typescript-eslint/types@4.14.0": + version "4.14.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-4.14.0.tgz#d8a8202d9b58831d6fd9cee2ba12f8a5a5dd44b6" + integrity sha512-VsQE4VvpldHrTFuVPY1ZnHn/Txw6cZGjL48e+iBxTi2ksa9DmebKjAeFmTVAYoSkTk7gjA7UqJ7pIsyifTsI4A== + +"@typescript-eslint/types@4.4.1": + version "4.4.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-4.4.1.tgz#c507b35cf523bc7ba00aae5f75ee9b810cdabbc1" + integrity sha512-KNDfH2bCyax5db+KKIZT4rfA8rEk5N0EJ8P0T5AJjo5xrV26UAzaiqoJCxeaibqc0c/IvZxp7v2g3difn2Pn3w== + +"@typescript-eslint/typescript-estree@4.14.0": + version "4.14.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-4.14.0.tgz#4bcd67486e9acafc3d0c982b23a9ab8ac8911ed7" + integrity sha512-wRjZ5qLao+bvS2F7pX4qi2oLcOONIB+ru8RGBieDptq/SudYwshveORwCVU4/yMAd4GK7Fsf8Uq1tjV838erag== + dependencies: + "@typescript-eslint/types" "4.14.0" + "@typescript-eslint/visitor-keys" "4.14.0" + debug "^4.1.1" + globby "^11.0.1" + is-glob "^4.0.1" + lodash "^4.17.15" + semver "^7.3.2" + tsutils "^3.17.1" + +"@typescript-eslint/typescript-estree@4.4.1": + version "4.4.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-4.4.1.tgz#598f6de488106c2587d47ca2462c60f6e2797cb8" + integrity sha512-wP/V7ScKzgSdtcY1a0pZYBoCxrCstLrgRQ2O9MmCUZDtmgxCO/TCqOTGRVwpP4/2hVfqMz/Vw1ZYrG8cVxvN3g== + dependencies: + "@typescript-eslint/types" "4.4.1" + "@typescript-eslint/visitor-keys" "4.4.1" + debug "^4.1.1" + globby "^11.0.1" is-glob "^4.0.1" lodash "^4.17.15" semver "^7.3.2" tsutils "^3.17.1" +"@typescript-eslint/visitor-keys@4.14.0": + version "4.14.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-4.14.0.tgz#b1090d9d2955b044b2ea2904a22496849acbdf54" + integrity sha512-MeHHzUyRI50DuiPgV9+LxcM52FCJFYjJiWHtXlbyC27b80mfOwKeiKI+MHOTEpcpfmoPFm/vvQS88bYIx6PZTA== + dependencies: + "@typescript-eslint/types" "4.14.0" + eslint-visitor-keys "^2.0.0" + +"@typescript-eslint/visitor-keys@4.4.1": + version "4.4.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-4.4.1.tgz#1769dc7a9e2d7d2cfd3318b77ed8249187aed5c3" + integrity sha512-H2JMWhLaJNeaylSnMSQFEhT/S/FsJbebQALmoJxMPMxLtlVAMy2uJP/Z543n9IizhjRayLSqoInehCeNW9rWcw== + dependencies: + "@typescript-eslint/types" "4.4.1" + eslint-visitor-keys "^2.0.0" + +"@ungap/promise-all-settled@1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz#aa58042711d6e3275dd37dc597e5d31e8c290a44" + integrity sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q== + +"@yarnpkg/lockfile@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz#e77a97fbd345b76d83245edcd17d393b1b41fb31" + integrity sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ== + abbrev@1: version "1.1.1" resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" @@ -994,7 +1015,21 @@ abort-controller@^3.0.0: resolved "https://registry.yarnpkg.com/abort-controller/-/abort-controller-3.0.0.tgz#eaf54d53b62bae4138e809ca225c8439a6efb392" integrity sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg== dependencies: - event-target-shim "^5.0.0" + event-target-shim "^5.0.0" + +abstract-leveldown@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/abstract-leveldown/-/abstract-leveldown-3.0.0.tgz#5cb89f958a44f526779d740d1440e743e0c30a57" + integrity sha512-KUWx9UWGQD12zsmLNj64/pndaz4iJh/Pj7nopgkfDG6RlCcbMZvT6+9l7dchK4idog2Is8VdC/PvNbFuFmalIQ== + dependencies: + xtend "~4.0.0" + +abstract-leveldown@^2.4.1, abstract-leveldown@~2.7.1: + version "2.7.2" + resolved "https://registry.yarnpkg.com/abstract-leveldown/-/abstract-leveldown-2.7.2.tgz#87a44d7ebebc341d59665204834c8b7e0932cc93" + integrity sha512-+OVvxH2rHVEhWLdbudP6p0+dNMXu8JA1CbhP19T8paTYAcX7oJ4OVjT+ZUVpv7mITxXHqDMej+GdqXBmXkw09w== + dependencies: + xtend "~4.0.0" abstract-leveldown@^5.0.0, abstract-leveldown@~5.0.0: version "5.0.0" @@ -1010,13 +1045,6 @@ abstract-leveldown@~2.6.0: dependencies: xtend "~4.0.0" -abstract-leveldown@~2.7.1: - version "2.7.2" - resolved "https://registry.yarnpkg.com/abstract-leveldown/-/abstract-leveldown-2.7.2.tgz#87a44d7ebebc341d59665204834c8b7e0932cc93" - integrity sha512-+OVvxH2rHVEhWLdbudP6p0+dNMXu8JA1CbhP19T8paTYAcX7oJ4OVjT+ZUVpv7mITxXHqDMej+GdqXBmXkw09w== - dependencies: - xtend "~4.0.0" - accepts@~1.3.7: version "1.3.7" resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.7.tgz#531bc726517a3b2b41f850021c6cc15eaab507cd" @@ -1025,12 +1053,17 @@ accepts@~1.3.7: mime-types "~2.1.24" negotiator "0.6.2" -acorn-jsx@^5.2.0: +acorn-jsx@^5.0.0, acorn-jsx@^5.3.1: version "5.3.1" resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.1.tgz#fc8661e11b7ac1539c47dbfea2e72b3af34d267b" integrity sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng== -acorn@^7.1.1: +acorn@^6.0.7: + version "6.4.2" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.4.2.tgz#35866fd710528e92de10cf06016498e47e39e1e6" + integrity sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ== + +acorn@^7.4.0: version "7.4.1" resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== @@ -1062,17 +1095,7 @@ agent-base@6: dependencies: debug "4" -ajv@^5.2.2: - version "5.5.2" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.5.2.tgz#73b5eeca3fab653e3d3f9422b341ad42205dc965" - integrity sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU= - dependencies: - co "^4.6.0" - fast-deep-equal "^1.0.0" - fast-json-stable-stringify "^2.0.0" - json-schema-traverse "^0.3.0" - -ajv@^6.10.0, ajv@^6.10.2, ajv@^6.12.3: +ajv@^6.10.0, ajv@^6.10.2, ajv@^6.12.3, ajv@^6.12.4, ajv@^6.6.1, ajv@^6.9.1: version "6.12.6" resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== @@ -1082,6 +1105,16 @@ ajv@^6.10.0, ajv@^6.10.2, ajv@^6.12.3: json-schema-traverse "^0.4.1" uri-js "^4.2.2" +ajv@^7.0.2: + version "7.0.3" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-7.0.3.tgz#13ae747eff125cafb230ac504b2406cf371eece2" + integrity sha512-R50QRlXSxqXcQP5SvKUrw8VZeypvo12i2IX0EeR5PiZ7bEKeHWgzgo264LDadUsCU42lTJVhFikTqJwNeH34gQ== + dependencies: + fast-deep-equal "^3.1.1" + json-schema-traverse "^1.0.0" + require-from-string "^2.0.2" + uri-js "^4.2.2" + amdefine@>=0.0.4: version "1.0.1" resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5" @@ -1092,34 +1125,23 @@ ansi-colors@3.2.3: resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-3.2.3.tgz#57d35b8686e851e2cc04c403f1c00203976a1813" integrity sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw== -ansi-colors@^3.2.3: - version "3.2.4" - resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-3.2.4.tgz#e3a3da4bfbae6c86a9c285625de124a234026fbf" - integrity sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA== - -ansi-colors@^4.1.1: +ansi-colors@4.1.1, ansi-colors@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348" integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA== -ansi-escapes@^4.2.1, ansi-escapes@^4.3.0: +ansi-escapes@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.2.0.tgz#8780b98ff9dbf5638152d1f1fe5c1d7b4442976b" + integrity sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ== + +ansi-escapes@^4.3.0: version "4.3.1" resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.1.tgz#a5c47cc43181f1f38ffd7076837700d395522a61" integrity sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA== dependencies: type-fest "^0.11.0" -ansi-mark@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/ansi-mark/-/ansi-mark-1.0.4.tgz#1cd4ba8d57f15f109d6aaf6ec9ca9786c8a4ee6c" - integrity sha1-HNS6jVfxXxCdaq9uycqXhsik7mw= - dependencies: - ansi-regex "^3.0.0" - array-uniq "^1.0.3" - chalk "^2.3.2" - strip-ansi "^4.0.0" - super-split "^1.1.0" - ansi-regex@^2.0.0, ansi-regex@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" @@ -1140,6 +1162,11 @@ ansi-regex@^5.0.0: resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz#388539f55179bf39339c81af30a654d69f87cb75" integrity sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg== +ansi-styles@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" + integrity sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4= + ansi-styles@^3.2.0, ansi-styles@^3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" @@ -1147,30 +1174,22 @@ ansi-styles@^3.2.0, ansi-styles@^3.2.1: dependencies: color-convert "^1.9.0" -ansi-styles@^4.1.0: +ansi-styles@^4.0.0, ansi-styles@^4.1.0: version "4.3.0" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== dependencies: color-convert "^2.0.1" -antlr4ts@^0.5.0-alpha.3: - version "0.5.0-alpha.3" - resolved "https://registry.yarnpkg.com/antlr4ts/-/antlr4ts-0.5.0-alpha.3.tgz#fa6d39d88d6b96341a8afef45867af9abcb38766" - integrity sha512-La89tKkGcHFIVuruv4Bm1esc3zLmES2NOTEwwNS1pudz+zx/0FNqQeUu9p48i9/QHKPVqjN87LB+q3buTg7oDQ== - -any-promise@1.3.0, any-promise@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/any-promise/-/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f" - integrity sha1-q8av7tzqUugJzcA3au0845Y10X8= +antlr4@4.7.1: + version "4.7.1" + resolved "https://registry.yarnpkg.com/antlr4/-/antlr4-4.7.1.tgz#69984014f096e9e775f53dd9744bf994d8959773" + integrity sha512-haHyTW7Y9joE5MVs37P2lNYfU2RWBLfcRDD8OWldcdZm5TiCE91B5Xl1oWSwiDUSd4rlExpt2pu1fksYQjRBYQ== -anymatch@^1.3.0: - version "1.3.2" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-1.3.2.tgz#553dcb8f91e3c889845dfdba34c77721b90b9d7a" - integrity sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA== - dependencies: - micromatch "^2.1.5" - normalize-path "^2.0.0" +antlr4ts@^0.5.0-alpha.3: + version "0.5.0-alpha.4" + resolved "https://registry.yarnpkg.com/antlr4ts/-/antlr4ts-0.5.0-alpha.4.tgz#71702865a87478ed0b40c0709f422cf14d51652a" + integrity sha512-WPQDt1B74OfPv/IMS2ekXAKkTZIHl88uMetg6q3OTqgFxZ/dxDXI0EWLyZid/1Pe6hTftyg5N7gel5wNAGxXyQ== anymatch@~3.1.1: version "3.1.1" @@ -1180,11 +1199,6 @@ anymatch@~3.1.1: normalize-path "^3.0.0" picomatch "^2.0.4" -app-module-path@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/app-module-path/-/app-module-path-2.2.0.tgz#641aa55dfb7d6a6f0a8141c4b9c0aa50b6c24dd5" - integrity sha1-ZBqlXft9am8KgUHEucCqULbCTdU= - arg@^4.1.0: version "4.1.3" resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" @@ -1205,19 +1219,12 @@ aria-query@^4.2.2: "@babel/runtime" "^7.10.2" "@babel/runtime-corejs3" "^7.10.2" -arr-diff@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-2.0.0.tgz#8f3b827f955a8bd669697e4a4256ac3ceae356cf" - integrity sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8= - dependencies: - arr-flatten "^1.0.1" - arr-diff@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" integrity sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA= -arr-flatten@^1.0.1, arr-flatten@^1.1.0: +arr-flatten@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg== @@ -1246,13 +1253,15 @@ array-flatten@1.1.1: resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" integrity sha1-ml9pkFGx5wczKPKgCJaLZOopVdI= -array-includes@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.1.tgz#cdd67e6852bdf9c1215460786732255ed2459348" - integrity sha512-c2VXaCHl7zPsvpkFsw4nxvFie4fh1ur9bpcgsVkIjqn0H/Xwdg+7fv3n2r/isyS8EBj5b06M9kHyZuIr4El6WQ== +array-includes@^3.1.1, array-includes@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.2.tgz#a8db03e0b88c8c6aeddc49cb132f9bcab4ebf9c8" + integrity sha512-w2GspexNQpx+PutG3QpT437/BenZBj0M/MZGn5mzv/MofYqo0xmRHzn4lFsoDlWJ+THYsGJmFlW68WlDFx7VRw== dependencies: + call-bind "^1.0.0" define-properties "^1.1.3" - es-abstract "^1.17.0" + es-abstract "^1.18.0-next.1" + get-intrinsic "^1.0.1" is-string "^1.0.5" array-union@^2.1.0: @@ -1260,16 +1269,6 @@ array-union@^2.1.0: resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== -array-uniq@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" - integrity sha1-r2rId6Jcx/dOBYiUdThY39sk/bY= - -array-unique@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.2.1.tgz#a1d97ccafcbc2625cc70fadceb36a50c58b01a53" - integrity sha1-odl8yvy8JiXMcPrc6zalDFiwGlM= - array-unique@^0.3.2: version "0.3.2" resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" @@ -1331,6 +1330,11 @@ assign-symbols@^1.0.0: resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c= +ast-parents@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/ast-parents/-/ast-parents-0.0.1.tgz#508fd0f05d0c48775d9eccda2e174423261e8dd3" + integrity sha1-UI/Q8F0MSHddnszaLhdEIyYejdM= + ast-types-flow@^0.0.7: version "0.0.7" resolved "https://registry.yarnpkg.com/ast-types-flow/-/ast-types-flow-0.0.7.tgz#f70b735c6bca1a5c9c22d982c3e39e7feba3bdad" @@ -1341,10 +1345,10 @@ astral-regex@^1.0.0: resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9" integrity sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg== -async-each@^1.0.0: - version "1.0.3" - resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.3.tgz#b727dbf87d7651602f06f4d4ac387f47d91b0cbf" - integrity sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ== +astral-regex@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31" + integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== async-eventemitter@^0.2.2: version "0.2.4" @@ -1363,6 +1367,13 @@ async@1.x, async@^1.4.2: resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" integrity sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo= +async@2.6.2: + version "2.6.2" + resolved "https://registry.yarnpkg.com/async/-/async-2.6.2.tgz#18330ea7e6e313887f5d2f2a904bac6fe4dd5381" + integrity sha512-H1qVYh1MYhEEFLsP97cVKqCGo7KfCyTt6uEWqsTBr9SO84oK9Uwbyd/yCW+6rKJLHksBNUVWZDAjfS+Ccx0Bbg== + dependencies: + lodash "^4.17.11" + async@^2.0.1, async@^2.1.2, async@^2.4.0, async@^2.5.0, async@^2.6.1: version "2.6.3" resolved "https://registry.yarnpkg.com/async/-/async-2.6.3.tgz#d72625e2344a3656e3a3ad4fa749fa83299d82ff" @@ -1385,11 +1396,6 @@ atob@^2.1.2: resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== -await-semaphore@^0.1.3: - version "0.1.3" - resolved "https://registry.yarnpkg.com/await-semaphore/-/await-semaphore-0.1.3.tgz#2b88018cc8c28e06167ae1cdff02504f1f9688d3" - integrity sha512-d1W2aNSYcz/sxYO4pMGX9vq65qOTu0P800epMud+6cYYX0QcT7zyqcxec3VWzpgvdXo57UWmVbZpLMjX2m1I7Q== - aws-sign2@~0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" @@ -1401,24 +1407,9 @@ aws4@^1.8.0: integrity sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA== axe-core@^4.0.2: - version "4.1.0" - resolved "https://registry.yarnpkg.com/axe-core/-/axe-core-4.1.0.tgz#93d395e6262ecdde5cb52a5d06533d0a0c7bb4cd" - integrity sha512-9atDIOTDLsWL+1GbBec6omflaT5Cxh88J0GtJtGfCVIXpI02rXHkju59W5mMqWa7eiC5OR168v3TK3kUKBW98g== - -axios@0.19.2: - version "0.19.2" - resolved "https://registry.yarnpkg.com/axios/-/axios-0.19.2.tgz#3ea36c5d8818d0d5f8a8a97a6d36b86cdc00cb27" - integrity sha512-fjgm5MvRHLhx+osE2xoekY70AhARk3a6hkN+3Io1jc00jtquGvxYlKlsFUhmUET0V5te6CcZI7lcv2Ym61mjHA== - dependencies: - follow-redirects "1.5.10" - -axios@^0.18.0: - version "0.18.1" - resolved "https://registry.yarnpkg.com/axios/-/axios-0.18.1.tgz#ff3f0de2e7b5d180e757ad98000f1081b87bcea3" - integrity sha512-0BfJq4NSfQXd+SkFdrvFbG7addhYSBA2mQwISr46pD6E5iqkWg02RAs8vyTT/j0RTnoYmeXauBuSv1qKwR179g== - dependencies: - follow-redirects "1.5.10" - is-buffer "^2.0.2" + version "4.1.1" + resolved "https://registry.yarnpkg.com/axe-core/-/axe-core-4.1.1.tgz#70a7855888e287f7add66002211a423937063eaf" + integrity sha512-5Kgy8Cz6LPC9DJcNb3yjAXTu3XihQgEdnIg50c//zOC/MyLP0Clg+Y8Sh9ZjjnvBrDZU4DgXS9C3T9r4/scGZQ== axios@^0.20.0: version "0.20.0" @@ -1432,6 +1423,525 @@ axobject-query@^2.2.0: resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-2.2.0.tgz#943d47e10c0b704aa42275e20edf3722648989be" integrity sha512-Td525n+iPOOyUQIeBfcASuG6uJsDOITl7Mds5gFyerkWiX7qhUTdYUBlSgNMyVqtSJqwpt1kXGLdUt6SykLMRA== +babel-code-frame@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b" + integrity sha1-Y/1D99weO7fONZR9uP42mj9Yx0s= + dependencies: + chalk "^1.1.3" + esutils "^2.0.2" + js-tokens "^3.0.2" + +babel-core@^6.0.14, babel-core@^6.26.0: + version "6.26.3" + resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.26.3.tgz#b2e2f09e342d0f0c88e2f02e067794125e75c207" + integrity sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA== + dependencies: + babel-code-frame "^6.26.0" + babel-generator "^6.26.0" + babel-helpers "^6.24.1" + babel-messages "^6.23.0" + babel-register "^6.26.0" + babel-runtime "^6.26.0" + babel-template "^6.26.0" + babel-traverse "^6.26.0" + babel-types "^6.26.0" + babylon "^6.18.0" + convert-source-map "^1.5.1" + debug "^2.6.9" + json5 "^0.5.1" + lodash "^4.17.4" + minimatch "^3.0.4" + path-is-absolute "^1.0.1" + private "^0.1.8" + slash "^1.0.0" + source-map "^0.5.7" + +babel-generator@^6.26.0: + version "6.26.1" + resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.26.1.tgz#1844408d3b8f0d35a404ea7ac180f087a601bd90" + integrity sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA== + dependencies: + babel-messages "^6.23.0" + babel-runtime "^6.26.0" + babel-types "^6.26.0" + detect-indent "^4.0.0" + jsesc "^1.3.0" + lodash "^4.17.4" + source-map "^0.5.7" + trim-right "^1.0.1" + +babel-helper-builder-binary-assignment-operator-visitor@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz#cce4517ada356f4220bcae8a02c2b346f9a56664" + integrity sha1-zORReto1b0IgvK6KAsKzRvmlZmQ= + dependencies: + babel-helper-explode-assignable-expression "^6.24.1" + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-helper-call-delegate@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz#ece6aacddc76e41c3461f88bfc575bd0daa2df8d" + integrity sha1-7Oaqzdx25Bw0YfiL/Fdb0Nqi340= + dependencies: + babel-helper-hoist-variables "^6.24.1" + babel-runtime "^6.22.0" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-helper-define-map@^6.24.1: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz#a5f56dab41a25f97ecb498c7ebaca9819f95be5f" + integrity sha1-pfVtq0GiX5fstJjH66ypgZ+Vvl8= + dependencies: + babel-helper-function-name "^6.24.1" + babel-runtime "^6.26.0" + babel-types "^6.26.0" + lodash "^4.17.4" + +babel-helper-explode-assignable-expression@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz#f25b82cf7dc10433c55f70592d5746400ac22caa" + integrity sha1-8luCz33BBDPFX3BZLVdGQArCLKo= + dependencies: + babel-runtime "^6.22.0" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-helper-function-name@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz#d3475b8c03ed98242a25b48351ab18399d3580a9" + integrity sha1-00dbjAPtmCQqJbSDUasYOZ01gKk= + dependencies: + babel-helper-get-function-arity "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-helper-get-function-arity@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz#8f7782aa93407c41d3aa50908f89b031b1b6853d" + integrity sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0= + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-helper-hoist-variables@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz#1ecb27689c9d25513eadbc9914a73f5408be7a76" + integrity sha1-HssnaJydJVE+rbyZFKc/VAi+enY= + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-helper-optimise-call-expression@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz#f7a13427ba9f73f8f4fa993c54a97882d1244257" + integrity sha1-96E0J7qfc/j0+pk8VKl4gtEkQlc= + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-helper-regex@^6.24.1: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz#325c59f902f82f24b74faceed0363954f6495e72" + integrity sha1-MlxZ+QL4LyS3T6zu0DY5VPZJXnI= + dependencies: + babel-runtime "^6.26.0" + babel-types "^6.26.0" + lodash "^4.17.4" + +babel-helper-remap-async-to-generator@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz#5ec581827ad723fecdd381f1c928390676e4551b" + integrity sha1-XsWBgnrXI/7N04HxySg5BnbkVRs= + dependencies: + babel-helper-function-name "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-helper-replace-supers@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz#bf6dbfe43938d17369a213ca8a8bf74b6a90ab1a" + integrity sha1-v22/5Dk40XNpohPKiov3S2qQqxo= + dependencies: + babel-helper-optimise-call-expression "^6.24.1" + babel-messages "^6.23.0" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-helpers@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helpers/-/babel-helpers-6.24.1.tgz#3471de9caec388e5c850e597e58a26ddf37602b2" + integrity sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI= + dependencies: + babel-runtime "^6.22.0" + babel-template "^6.24.1" + +babel-messages@^6.23.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.23.0.tgz#f3cdf4703858035b2a2951c6ec5edf6c62f2630e" + integrity sha1-8830cDhYA1sqKVHG7F7fbGLyYw4= + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-check-es2015-constants@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz#35157b101426fd2ffd3da3f75c7d1e91835bbf8a" + integrity sha1-NRV7EBQm/S/9PaP3XH0ekYNbv4o= + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-syntax-async-functions@^6.8.0: + version "6.13.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz#cad9cad1191b5ad634bf30ae0872391e0647be95" + integrity sha1-ytnK0RkbWtY0vzCuCHI5HgZHvpU= + +babel-plugin-syntax-exponentiation-operator@^6.8.0: + version "6.13.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz#9ee7e8337290da95288201a6a57f4170317830de" + integrity sha1-nufoM3KQ2pUoggGmpX9BcDF4MN4= + +babel-plugin-syntax-trailing-function-commas@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz#ba0360937f8d06e40180a43fe0d5616fff532cf3" + integrity sha1-ugNgk3+NBuQBgKQ/4NVhb/9TLPM= + +babel-plugin-transform-async-to-generator@^6.22.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz#6536e378aff6cb1d5517ac0e40eb3e9fc8d08761" + integrity sha1-ZTbjeK/2yx1VF6wOQOs+n8jQh2E= + dependencies: + babel-helper-remap-async-to-generator "^6.24.1" + babel-plugin-syntax-async-functions "^6.8.0" + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-arrow-functions@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz#452692cb711d5f79dc7f85e440ce41b9f244d221" + integrity sha1-RSaSy3EdX3ncf4XkQM5BufJE0iE= + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-block-scoped-functions@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz#bbc51b49f964d70cb8d8e0b94e820246ce3a6141" + integrity sha1-u8UbSflk1wy42OC5ToICRs46YUE= + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-block-scoping@^6.23.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz#d70f5299c1308d05c12f463813b0a09e73b1895f" + integrity sha1-1w9SmcEwjQXBL0Y4E7CgnnOxiV8= + dependencies: + babel-runtime "^6.26.0" + babel-template "^6.26.0" + babel-traverse "^6.26.0" + babel-types "^6.26.0" + lodash "^4.17.4" + +babel-plugin-transform-es2015-classes@^6.23.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz#5a4c58a50c9c9461e564b4b2a3bfabc97a2584db" + integrity sha1-WkxYpQyclGHlZLSyo7+ryXolhNs= + dependencies: + babel-helper-define-map "^6.24.1" + babel-helper-function-name "^6.24.1" + babel-helper-optimise-call-expression "^6.24.1" + babel-helper-replace-supers "^6.24.1" + babel-messages "^6.23.0" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-computed-properties@^6.22.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz#6fe2a8d16895d5634f4cd999b6d3480a308159b3" + integrity sha1-b+Ko0WiV1WNPTNmZttNICjCBWbM= + dependencies: + babel-runtime "^6.22.0" + babel-template "^6.24.1" + +babel-plugin-transform-es2015-destructuring@^6.23.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz#997bb1f1ab967f682d2b0876fe358d60e765c56d" + integrity sha1-mXux8auWf2gtKwh2/jWNYOdlxW0= + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-duplicate-keys@^6.22.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz#73eb3d310ca969e3ef9ec91c53741a6f1576423e" + integrity sha1-c+s9MQypaePvnskcU3QabxV2Qj4= + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-for-of@^6.23.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz#f47c95b2b613df1d3ecc2fdb7573623c75248691" + integrity sha1-9HyVsrYT3x0+zC/bdXNiPHUkhpE= + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-function-name@^6.22.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz#834c89853bc36b1af0f3a4c5dbaa94fd8eacaa8b" + integrity sha1-g0yJhTvDaxrw86TF26qU/Y6sqos= + dependencies: + babel-helper-function-name "^6.24.1" + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-literals@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz#4f54a02d6cd66cf915280019a31d31925377ca2e" + integrity sha1-T1SgLWzWbPkVKAAZox0xklN3yi4= + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-modules-amd@^6.22.0, babel-plugin-transform-es2015-modules-amd@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz#3b3e54017239842d6d19c3011c4bd2f00a00d154" + integrity sha1-Oz5UAXI5hC1tGcMBHEvS8AoA0VQ= + dependencies: + babel-plugin-transform-es2015-modules-commonjs "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + +babel-plugin-transform-es2015-modules-commonjs@^6.23.0, babel-plugin-transform-es2015-modules-commonjs@^6.24.1: + version "6.26.2" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.2.tgz#58a793863a9e7ca870bdc5a881117ffac27db6f3" + integrity sha512-CV9ROOHEdrjcwhIaJNBGMBCodN+1cfkwtM1SbUHmvyy35KGT7fohbpOxkE2uLz1o6odKK2Ck/tz47z+VqQfi9Q== + dependencies: + babel-plugin-transform-strict-mode "^6.24.1" + babel-runtime "^6.26.0" + babel-template "^6.26.0" + babel-types "^6.26.0" + +babel-plugin-transform-es2015-modules-systemjs@^6.23.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz#ff89a142b9119a906195f5f106ecf305d9407d23" + integrity sha1-/4mhQrkRmpBhlfXxBuzzBdlAfSM= + dependencies: + babel-helper-hoist-variables "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + +babel-plugin-transform-es2015-modules-umd@^6.23.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz#ac997e6285cd18ed6176adb607d602344ad38468" + integrity sha1-rJl+YoXNGO1hdq22B9YCNErThGg= + dependencies: + babel-plugin-transform-es2015-modules-amd "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + +babel-plugin-transform-es2015-object-super@^6.22.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz#24cef69ae21cb83a7f8603dad021f572eb278f8d" + integrity sha1-JM72muIcuDp/hgPa0CH1cusnj40= + dependencies: + babel-helper-replace-supers "^6.24.1" + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-parameters@^6.23.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz#57ac351ab49caf14a97cd13b09f66fdf0a625f2b" + integrity sha1-V6w1GrScrxSpfNE7CfZv3wpiXys= + dependencies: + babel-helper-call-delegate "^6.24.1" + babel-helper-get-function-arity "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-shorthand-properties@^6.22.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz#24f875d6721c87661bbd99a4622e51f14de38aa0" + integrity sha1-JPh11nIch2YbvZmkYi5R8U3jiqA= + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-spread@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz#d6d68a99f89aedc4536c81a542e8dd9f1746f8d1" + integrity sha1-1taKmfia7cRTbIGlQujdnxdG+NE= + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-sticky-regex@^6.22.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz#00c1cdb1aca71112cdf0cf6126c2ed6b457ccdbc" + integrity sha1-AMHNsaynERLN8M9hJsLta0V8zbw= + dependencies: + babel-helper-regex "^6.24.1" + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-template-literals@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz#a84b3450f7e9f8f1f6839d6d687da84bb1236d8d" + integrity sha1-qEs0UPfp+PH2g51taH2oS7EjbY0= + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-typeof-symbol@^6.23.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz#dec09f1cddff94b52ac73d505c84df59dcceb372" + integrity sha1-3sCfHN3/lLUqxz1QXITfWdzOs3I= + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-unicode-regex@^6.22.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz#d38b12f42ea7323f729387f18a7c5ae1faeb35e9" + integrity sha1-04sS9C6nMj9yk4fxinxa4frrNek= + dependencies: + babel-helper-regex "^6.24.1" + babel-runtime "^6.22.0" + regexpu-core "^2.0.0" + +babel-plugin-transform-exponentiation-operator@^6.22.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz#2ab0c9c7f3098fa48907772bb813fe41e8de3a0e" + integrity sha1-KrDJx/MJj6SJB3cruBP+QejeOg4= + dependencies: + babel-helper-builder-binary-assignment-operator-visitor "^6.24.1" + babel-plugin-syntax-exponentiation-operator "^6.8.0" + babel-runtime "^6.22.0" + +babel-plugin-transform-regenerator@^6.22.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz#e0703696fbde27f0a3efcacf8b4dca2f7b3a8f2f" + integrity sha1-4HA2lvveJ/Cj78rPi03KL3s6jy8= + dependencies: + regenerator-transform "^0.10.0" + +babel-plugin-transform-strict-mode@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz#d5faf7aa578a65bbe591cf5edae04a0c67020758" + integrity sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g= + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-preset-env@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/babel-preset-env/-/babel-preset-env-1.7.0.tgz#dea79fa4ebeb883cd35dab07e260c1c9c04df77a" + integrity sha512-9OR2afuKDneX2/q2EurSftUYM0xGu4O2D9adAhVfADDhrYDaxXV0rBbevVYoY9n6nyX1PmQW/0jtpJvUNr9CHg== + dependencies: + babel-plugin-check-es2015-constants "^6.22.0" + babel-plugin-syntax-trailing-function-commas "^6.22.0" + babel-plugin-transform-async-to-generator "^6.22.0" + babel-plugin-transform-es2015-arrow-functions "^6.22.0" + babel-plugin-transform-es2015-block-scoped-functions "^6.22.0" + babel-plugin-transform-es2015-block-scoping "^6.23.0" + babel-plugin-transform-es2015-classes "^6.23.0" + babel-plugin-transform-es2015-computed-properties "^6.22.0" + babel-plugin-transform-es2015-destructuring "^6.23.0" + babel-plugin-transform-es2015-duplicate-keys "^6.22.0" + babel-plugin-transform-es2015-for-of "^6.23.0" + babel-plugin-transform-es2015-function-name "^6.22.0" + babel-plugin-transform-es2015-literals "^6.22.0" + babel-plugin-transform-es2015-modules-amd "^6.22.0" + babel-plugin-transform-es2015-modules-commonjs "^6.23.0" + babel-plugin-transform-es2015-modules-systemjs "^6.23.0" + babel-plugin-transform-es2015-modules-umd "^6.23.0" + babel-plugin-transform-es2015-object-super "^6.22.0" + babel-plugin-transform-es2015-parameters "^6.23.0" + babel-plugin-transform-es2015-shorthand-properties "^6.22.0" + babel-plugin-transform-es2015-spread "^6.22.0" + babel-plugin-transform-es2015-sticky-regex "^6.22.0" + babel-plugin-transform-es2015-template-literals "^6.22.0" + babel-plugin-transform-es2015-typeof-symbol "^6.23.0" + babel-plugin-transform-es2015-unicode-regex "^6.22.0" + babel-plugin-transform-exponentiation-operator "^6.22.0" + babel-plugin-transform-regenerator "^6.22.0" + browserslist "^3.2.6" + invariant "^2.2.2" + semver "^5.3.0" + +babel-register@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-register/-/babel-register-6.26.0.tgz#6ed021173e2fcb486d7acb45c6009a856f647071" + integrity sha1-btAhFz4vy0htestFxgCahW9kcHE= + dependencies: + babel-core "^6.26.0" + babel-runtime "^6.26.0" + core-js "^2.5.0" + home-or-tmp "^2.0.0" + lodash "^4.17.4" + mkdirp "^0.5.1" + source-map-support "^0.4.15" + +babel-runtime@^6.18.0, babel-runtime@^6.22.0, babel-runtime@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe" + integrity sha1-llxwWGaOgrVde/4E/yM3vItWR/4= + dependencies: + core-js "^2.4.0" + regenerator-runtime "^0.11.0" + +babel-template@^6.24.1, babel-template@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.26.0.tgz#de03e2d16396b069f46dd9fff8521fb1a0e35e02" + integrity sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI= + dependencies: + babel-runtime "^6.26.0" + babel-traverse "^6.26.0" + babel-types "^6.26.0" + babylon "^6.18.0" + lodash "^4.17.4" + +babel-traverse@^6.24.1, babel-traverse@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.26.0.tgz#46a9cbd7edcc62c8e5c064e2d2d8d0f4035766ee" + integrity sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4= + dependencies: + babel-code-frame "^6.26.0" + babel-messages "^6.23.0" + babel-runtime "^6.26.0" + babel-types "^6.26.0" + babylon "^6.18.0" + debug "^2.6.8" + globals "^9.18.0" + invariant "^2.2.2" + lodash "^4.17.4" + +babel-types@^6.19.0, babel-types@^6.24.1, babel-types@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.26.0.tgz#a3b073f94ab49eb6fa55cd65227a334380632497" + integrity sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc= + dependencies: + babel-runtime "^6.26.0" + esutils "^2.0.2" + lodash "^4.17.4" + to-fast-properties "^1.0.3" + +babelify@^7.3.0: + version "7.3.0" + resolved "https://registry.yarnpkg.com/babelify/-/babelify-7.3.0.tgz#aa56aede7067fd7bd549666ee16dc285087e88e5" + integrity sha1-qlau3nBn/XvVSWZu4W3ChQh+iOU= + dependencies: + babel-core "^6.0.14" + object-assign "^4.0.0" + +babylon@^6.18.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3" + integrity sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ== + backoff@^2.5.0: version "2.5.0" resolved "https://registry.yarnpkg.com/backoff/-/backoff-2.5.0.tgz#f616eda9d3e4b66b8ca7fca79f695722c5f8e26f" @@ -1476,30 +1986,20 @@ bcrypt-pbkdf@^1.0.0: dependencies: tweetnacl "^0.14.3" -big.js@^5.2.2: - version "5.2.2" - resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328" - integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ== +bech32@1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/bech32/-/bech32-1.1.4.tgz#e38c9f37bf179b8eb16ae3a772b40c356d4832e9" + integrity sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ== -bignumber.js@*, bignumber.js@^9.0.0: +bignumber.js@^9.0.0: version "9.0.1" resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-9.0.1.tgz#8d7ba124c882bfd8e43260c67475518d0689e4e5" integrity sha512-IdZR9mh6ahOBv/hYGiXyVuyCetmGJhtYkqLBpTStdhEGjegpPlUawydyaF3pbIOFynJTpllEs+NP+CS9jKFLjA== -bignumber.js@^7.2.0, bignumber.js@^7.2.1: - version "7.2.1" - resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-7.2.1.tgz#80c048759d826800807c4bfd521e50edbba57a5f" - integrity sha512-S4XzBk5sMB+Rcb/LNcpzXr57VRTxgAvaAEDAl1AwRx27j00hT84O6OkteE7u8UB3NuaaygCRrEpqox4uDOrbdQ== - -binary-extensions@^1.0.0: - version "1.13.1" - resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.13.1.tgz#598afe54755b2868a5330d2aff9d4ebb53209b65" - integrity sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw== - binary-extensions@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.1.0.tgz#30fa40c9e7fe07dbc895678cd287024dea241dd9" - integrity sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ== + version "2.2.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" + integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== bindings@^1.5.0: version "1.5.0" @@ -1508,6 +2008,17 @@ bindings@^1.5.0: dependencies: file-uri-to-path "1.0.0" +bip39@2.5.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/bip39/-/bip39-2.5.0.tgz#51cbd5179460504a63ea3c000db3f787ca051235" + integrity sha512-xwIx/8JKoT2+IPJpFEfXoWdYwP7UVAoUxxLNfGCfVowaJE7yg1Y5B1BVPqlUNsBq5/nGwmFkwRJ8xDW4sX8OdA== + dependencies: + create-hash "^1.1.0" + pbkdf2 "^3.0.9" + randombytes "^2.0.1" + safe-buffer "^5.0.1" + unorm "^1.3.3" + bip66@^1.1.5: version "1.1.5" resolved "https://registry.yarnpkg.com/bip66/-/bip66-1.1.5.tgz#01fa8748785ca70955d5011217d1b3139969ca22" @@ -1515,20 +2026,12 @@ bip66@^1.1.5: dependencies: safe-buffer "^5.0.1" -bl@^1.0.0: - version "1.2.3" - resolved "https://registry.yarnpkg.com/bl/-/bl-1.2.3.tgz#1e8dd80142eac80d7158c9dccc047fb620e035e7" - integrity sha512-pvcNpa0UU69UT341rO6AYy4FVAIkUHuZXRIWbq+zHnsVcRzDDjIAhGuuYoi0d//cwIwtt4pkpKycWEfjdV+vww== - dependencies: - readable-stream "^2.3.5" - safe-buffer "^5.1.1" - blakejs@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/blakejs/-/blakejs-1.1.0.tgz#69df92ef953aa88ca51a32df6ab1c54a155fc7a5" integrity sha1-ad+S75U6qIylGjLfarHFShVfx6U= -bluebird@^3.4.7, bluebird@^3.5.0: +bluebird@^3.5.0, bluebird@^3.5.2: version "3.7.2" resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== @@ -1538,17 +2041,12 @@ bn.js@4.11.6: resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.6.tgz#53344adb14617a13f6e8dd2ce28905d1c0ba3215" integrity sha1-UzRK2xRhehP26N0s4okF0cC6MhU= -bn.js@4.11.7: - version "4.11.7" - resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.7.tgz#ddb048e50d9482790094c13eb3fcfc833ce7ab46" - integrity sha512-LxFiV5mefv0ley0SzqkOPR1bC4EbpPx8LkOz5vMe/Yi15t5hzwgO/G+tc7wOtL4PZTYjwHu8JnEiSLumuSjSfA== - bn.js@4.11.8: version "4.11.8" resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.8.tgz#2cde09eb5ee341f484746bb0309b3253b1b1442f" integrity sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA== -bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.10.0, bn.js@^4.11.0, bn.js@^4.11.1, bn.js@^4.11.6, bn.js@^4.11.7, bn.js@^4.11.8, bn.js@^4.11.9, bn.js@^4.4.0, bn.js@^4.8.0: +bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.10.0, bn.js@^4.11.0, bn.js@^4.11.1, bn.js@^4.11.6, bn.js@^4.11.8, bn.js@^4.11.9, bn.js@^4.4.0, bn.js@^4.8.0: version "4.11.9" resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.9.tgz#26d556829458f9d1e81fc48952493d0ba3507828" integrity sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw== @@ -1574,24 +2072,6 @@ body-parser@1.19.0, body-parser@^1.16.0: raw-body "2.4.0" type-is "~1.6.17" -boolbase@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" - integrity sha1-aN/1++YMUes3cl6p4+0xDcwed24= - -borc@^2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/borc/-/borc-2.1.2.tgz#6ce75e7da5ce711b963755117dd1b187f6f8cf19" - integrity sha512-Sy9eoUi4OiKzq7VovMn246iTo17kzuyHJKomCfpWMlI6RpfN1gk95w7d7gH264nApVLg0HZfcpz62/g4VH1Y4w== - dependencies: - bignumber.js "^9.0.0" - buffer "^5.5.0" - commander "^2.15.0" - ieee754 "^1.1.13" - iso-url "~0.4.7" - json-text-sequence "~0.1.0" - readable-stream "^3.6.0" - brace-expansion@^1.1.7: version "1.1.11" resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" @@ -1600,15 +2080,6 @@ brace-expansion@^1.1.7: balanced-match "^1.0.0" concat-map "0.0.1" -braces@^1.8.2: - version "1.8.5" - resolved "https://registry.yarnpkg.com/braces/-/braces-1.8.5.tgz#ba77962e12dff969d6b76711e914b737857bf6a7" - integrity sha1-uneWLhLf+WnWt2cR6RS3N4V79qc= - dependencies: - expand-range "^1.8.1" - preserve "^0.2.0" - repeat-element "^1.1.2" - braces@^2.3.1: version "2.3.2" resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" @@ -1637,11 +2108,6 @@ brorand@^1.0.1: resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" integrity sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8= -browser-stdout@1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.0.tgz#f351d32969d32fa5d7a5567154263d928ae3bd1f" - integrity sha1-81HTKWnTL6XXpVZxVCY9korjvR8= - browser-stdout@1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" @@ -1701,6 +2167,14 @@ browserify-sign@^4.0.0: readable-stream "^3.6.0" safe-buffer "^5.2.0" +browserslist@^3.2.6: + version "3.2.8" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-3.2.8.tgz#b0005361d6471f0f5952797a76fc985f1f978fc6" + integrity sha512-WHVocJYavUwVgVViC0ORikPHQquXwVh939TaelZ4WDqpWgTX/FsGhl/+P4qBUAGcRvtOgDgC+xftNWWp2RUTAQ== + dependencies: + caniuse-lite "^1.0.30000844" + electron-to-chromium "^1.3.47" + bs58@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/bs58/-/bs58-4.0.1.tgz#be161e76c354f6f788ae4071f63f34e8c4f0a42a" @@ -1717,34 +2191,6 @@ bs58check@^2.1.2: create-hash "^1.1.0" safe-buffer "^5.1.2" -btoa@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/btoa/-/btoa-1.2.1.tgz#01a9909f8b2c93f6bf680ba26131eb30f7fa3d73" - integrity sha512-SB4/MIGlsiVkMcHmT+pSmIPoNDoHg+7cMzmt3Uxt628MTz2487DKSqK/fuhFBrkuqrYv5UCEnACpF4dTFNKc/g== - -buffer-alloc-unsafe@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz#bd7dc26ae2972d0eda253be061dba992349c19f0" - integrity sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg== - -buffer-alloc@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/buffer-alloc/-/buffer-alloc-1.2.0.tgz#890dd90d923a873e08e10e5fd51a57e5b7cce0ec" - integrity sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow== - dependencies: - buffer-alloc-unsafe "^1.1.0" - buffer-fill "^1.0.0" - -buffer-crc32@~0.2.3: - version "0.2.13" - resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242" - integrity sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI= - -buffer-fill@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/buffer-fill/-/buffer-fill-1.0.0.tgz#f8f78b76789888ef39f205cd637f68e702122b2c" - integrity sha1-+PeLdniYiO858gXNY39o5wISKyw= - buffer-from@^1.0.0: version "1.1.1" resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" @@ -1776,9 +2222,9 @@ buffer@^5.0.5, buffer@^5.2.1, buffer@^5.5.0, buffer@^5.6.0: ieee754 "^1.1.13" bufferutil@^4.0.1: - version "4.0.2" - resolved "https://registry.yarnpkg.com/bufferutil/-/bufferutil-4.0.2.tgz#79f68631910f6b993d870fc77dc0a2894eb96cd5" - integrity sha512-AtnG3W6M8B2n4xDQ5R+70EXvOpnXsFYg/AK2yTZd+HQ/oxAdz+GI+DvjmhBw3L0ole+LJ0ngqY4JMbDzkfNzhA== + version "4.0.3" + resolved "https://registry.yarnpkg.com/bufferutil/-/bufferutil-4.0.3.tgz#66724b756bed23cd7c28c4d306d7994f9943cc6b" + integrity sha512-yEYTwGndELGvfXsImMBLop58eaGW+YdONi1fNjTINSY98tmMmFijBG6WXgdkfuLNt4imzQNtIE+eBp1PVpMCSw== dependencies: node-gyp-build "^4.2.0" @@ -1787,6 +2233,21 @@ bytes@3.1.0: resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.0.tgz#f6cf7933a360e0588fa9fde85651cdc7f805d1f6" integrity sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg== +bytewise-core@^1.2.2: + version "1.2.3" + resolved "https://registry.yarnpkg.com/bytewise-core/-/bytewise-core-1.2.3.tgz#3fb410c7e91558eb1ab22a82834577aa6bd61d42" + integrity sha1-P7QQx+kVWOsasiqCg0V3qmvWHUI= + dependencies: + typewise-core "^1.2" + +bytewise@~1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/bytewise/-/bytewise-1.1.0.tgz#1d13cbff717ae7158094aa881b35d081b387253e" + integrity sha1-HRPL/3F65xWAlKqIGzXQgbOHJT4= + dependencies: + bytewise-core "^1.2.2" + typewise "^1.0.3" + cache-base@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" @@ -1815,49 +2276,71 @@ cacheable-request@^6.0.0: normalize-url "^4.1.0" responselike "^1.0.2" -call-bind@^1.0.0: +cachedown@1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.0.tgz#24127054bb3f9bdcb4b1fb82418186072f77b8ce" - integrity sha512-AEXsYIyyDY3MCzbwdhzG3Jx1R0J2wetQyUynn6dYHAO+bg8l1k7jwZtRv4ryryFs7EP+NDlikJlVe59jr0cM2w== + resolved "https://registry.yarnpkg.com/cachedown/-/cachedown-1.0.0.tgz#d43f036e4510696b31246d7db31ebf0f7ac32d15" + integrity sha1-1D8DbkUQaWsxJG19sx6/D3rDLRU= + dependencies: + abstract-leveldown "^2.4.1" + lru-cache "^3.2.0" + +call-bind@^1.0.0, call-bind@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" + integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== dependencies: function-bind "^1.1.1" - get-intrinsic "^1.0.0" + get-intrinsic "^1.0.2" + +caller-callsite@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/caller-callsite/-/caller-callsite-2.0.0.tgz#847e0fce0a223750a9a027c54b33731ad3154134" + integrity sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ= + dependencies: + callsites "^2.0.0" + +caller-path@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-2.0.0.tgz#468f83044e369ab2010fac5f06ceee15bb2cb1f4" + integrity sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ= + dependencies: + caller-callsite "^2.0.0" + +callsites@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-2.0.0.tgz#06eb84f00eea413da86affefacbffb36093b3c50" + integrity sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA= callsites@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== -camelcase@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd" - integrity sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0= +camelcase@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-3.0.0.tgz#32fc4b9fcdaf845fcdf7e73bb97cac2261f0ab0a" + integrity sha1-MvxLn82vhF/N9+c7uXysImHwqwo= camelcase@^5.0.0: version "5.3.1" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== +camelcase@^6.0.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.2.0.tgz#924af881c9d525ac9d87f40d964e5cea982a1809" + integrity sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg== + +caniuse-lite@^1.0.30000844: + version "1.0.30001178" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001178.tgz#3ad813b2b2c7d585b0be0a2440e1e233c6eabdbc" + integrity sha512-VtdZLC0vsXykKni8Uztx45xynytOi71Ufx9T8kHptSw9AL4dpqailUJJHavttuzUe1KYuBYtChiWv+BAb7mPmQ== + caseless@^0.12.0, caseless@~0.12.0: version "0.12.0" resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= -cbor@^4.1.5: - version "4.3.0" - resolved "https://registry.yarnpkg.com/cbor/-/cbor-4.3.0.tgz#0217c1cadd067d9112f44336dca07e72020bb804" - integrity sha512-CvzaxQlaJVa88sdtTWvLJ++MbdtPHtZOBBNjm7h3YKUHILMs9nQyD4AC6hvFZy7GBVB3I6bRibJcxeHydyT2IQ== - dependencies: - bignumber.js "^9.0.0" - commander "^3.0.0" - json-text-sequence "^0.1" - nofilter "^1.0.3" - -chai-bn@^0.2.0, chai-bn@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/chai-bn/-/chai-bn-0.2.1.tgz#1dad95e24c3afcd8139ab0262e9bbefff8a30ab7" - integrity sha512-01jt2gSXAw7UYFPT5K8d7HYjdXj2vyeIuE+0T/34FWzlNcVbs1JkPxRu7rYMfQnJhrHT8Nr6qjSf5ZwwLU2EYg== - chai@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/chai/-/chai-4.2.0.tgz#760aa72cf20e3795e84b12877ce0e83737aa29e5" @@ -1870,7 +2353,18 @@ chai@^4.2.0: pathval "^1.1.0" type-detect "^4.0.5" -chalk@^2.0.0, chalk@^2.1.0, chalk@^2.3.2, chalk@^2.4.1, chalk@^2.4.2: +chalk@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" + integrity sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg= + dependencies: + ansi-styles "^2.2.1" + escape-string-regexp "^1.0.2" + has-ansi "^2.0.0" + strip-ansi "^3.0.0" + supports-color "^2.0.0" + +chalk@^2.0.0, chalk@^2.1.0, chalk@^2.4.1, chalk@^2.4.2: version "2.4.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== @@ -1879,15 +2373,7 @@ chalk@^2.0.0, chalk@^2.1.0, chalk@^2.3.2, chalk@^2.4.1, chalk@^2.4.2: escape-string-regexp "^1.0.5" supports-color "^5.3.0" -chalk@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-3.0.0.tgz#3f73c2bf526591f574cc492c51e2456349f844e4" - integrity sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - -chalk@^4.1.0: +chalk@^4.0.0: version "4.1.0" resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.0.tgz#4e14870a618d9e2edd97dd8345fd9d9dc315646a" integrity sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A== @@ -1917,18 +2403,6 @@ checkpoint-store@^1.1.0: dependencies: functional-red-black-tree "^1.0.1" -cheerio@^1.0.0-rc.2: - version "1.0.0-rc.3" - resolved "https://registry.yarnpkg.com/cheerio/-/cheerio-1.0.0-rc.3.tgz#094636d425b2e9c0f4eb91a46c05630c9a1a8bf6" - integrity sha512-0td5ijfUPuubwLUu0OBoe98gZj8C/AA+RW3v67GPlGOrvxWjZmBXiBCRU+I8VEiNyJzjth40POfHiz2RB3gImA== - dependencies: - css-select "~1.2.0" - dom-serializer "~0.1.1" - entities "~1.1.1" - htmlparser2 "^3.9.1" - lodash "^4.15.0" - parse5 "^3.0.1" - chokidar@3.3.0: version "3.3.0" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.3.0.tgz#12c0714668c55800f659e262d4962a97faf554a6" @@ -1944,23 +2418,7 @@ chokidar@3.3.0: optionalDependencies: fsevents "~2.1.1" -chokidar@^1.6.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-1.7.0.tgz#798e689778151c8076b4b360e5edd28cda2bb468" - integrity sha1-eY5ol3gVHIB2tLNg5e3SjNortGg= - dependencies: - anymatch "^1.3.0" - async-each "^1.0.0" - glob-parent "^2.0.0" - inherits "^2.0.1" - is-binary-path "^1.0.0" - is-glob "^2.0.0" - path-is-absolute "^1.0.0" - readdirp "^2.0.0" - optionalDependencies: - fsevents "^1.0.0" - -chokidar@^3.4.0: +chokidar@3.4.3: version "3.4.3" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.4.3.tgz#c1df38231448e45ca4ac588e6c79573ba6a57d5b" integrity sha512-DtM3g7juCXQxFVSNPNByEC2+NImtBuxQQvWlHunpJIS5Ocr0lG306cC7FCi7cEA0fzmybPUIl4txBIobk1gGOQ== @@ -1975,6 +2433,21 @@ chokidar@^3.4.0: optionalDependencies: fsevents "~2.1.2" +chokidar@^3.4.0: + version "3.5.1" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.1.tgz#ee9ce7bbebd2b79f49f304799d5468e31e14e68a" + integrity sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw== + dependencies: + anymatch "~3.1.1" + braces "~3.0.2" + glob-parent "~5.1.0" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.5.0" + optionalDependencies: + fsevents "~2.3.1" + chownr@^1.1.1: version "1.1.4" resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b" @@ -2004,11 +2477,6 @@ cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: inherits "^2.0.1" safe-buffer "^5.0.1" -circular@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/circular/-/circular-1.0.5.tgz#7da77af98bbde9ce4b5b358cd556b5dded2d3149" - integrity sha1-fad6+Yu96c5LWzWM1Va13e0tMUk= - class-is@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/class-is/-/class-is-1.1.0.tgz#9d3c0fba0440d211d843cec3dedfa48055005825" @@ -2036,25 +2504,12 @@ cli-color@^1.4.0: memoizee "^0.4.14" timers-ext "^0.1.5" -cli-cursor@^3.0.0, cli-cursor@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307" - integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw== - dependencies: - restore-cursor "^3.1.0" - -cli-logger@0.5.40: - version "0.5.40" - resolved "https://registry.yarnpkg.com/cli-logger/-/cli-logger-0.5.40.tgz#097f0e11b072c7c698a26c47f588a29c20b48b0b" - integrity sha1-CX8OEbByx8aYomxH9YiinCC0iws= +cli-cursor@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5" + integrity sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU= dependencies: - circular "^1.0.5" - cli-util "~1.1.27" - -cli-regexp@~0.1.0: - version "0.1.2" - resolved "https://registry.yarnpkg.com/cli-regexp/-/cli-regexp-0.1.2.tgz#6bcd93b09fb2ed1025d30a1155d5997954a53512" - integrity sha1-a82TsJ+y7RAl0woRVdWZeVSlNRI= + restore-cursor "^2.0.0" cli-table3@^0.5.0: version "0.5.1" @@ -2066,25 +2521,18 @@ cli-table3@^0.5.0: optionalDependencies: colors "^1.1.2" -cli-util@~1.1.27: - version "1.1.27" - resolved "https://registry.yarnpkg.com/cli-util/-/cli-util-1.1.27.tgz#42d69e36a040a321fc9cf851c1513cadc5093054" - integrity sha1-QtaeNqBAoyH8nPhRwVE8rcUJMFQ= - dependencies: - cli-regexp "~0.1.0" - -cli-width@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-3.0.0.tgz#a2f48437a2caa9a22436e794bf071ec9e61cedf6" - integrity sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw== +cli-width@^2.0.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.1.tgz#b0433d0b4e9c847ef18868a4ef16fd5fc8271c48" + integrity sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw== -cliui@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-4.1.0.tgz#348422dbe82d800b3022eef4f6ac10bf2e4d1b49" - integrity sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ== +cliui@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-3.2.0.tgz#120601537a916d29940f934da3b48d585a39213d" + integrity sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0= dependencies: - string-width "^2.1.1" - strip-ansi "^4.0.0" + string-width "^1.0.1" + strip-ansi "^3.0.1" wrap-ansi "^2.0.0" cliui@^5.0.0: @@ -2103,16 +2551,11 @@ clone-response@^1.0.2: dependencies: mimic-response "^1.0.0" -clone@^2.0.0, clone@^2.1.1: +clone@2.1.2, clone@^2.0.0: version "2.1.2" resolved "https://registry.yarnpkg.com/clone/-/clone-2.1.2.tgz#1b7f4b9f591f1e8f83670401600345a02887435f" integrity sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18= -co@^4.6.0: - version "4.6.0" - resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" - integrity sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ= - code-point-at@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" @@ -2155,7 +2598,7 @@ colors@^1.1.2: resolved "https://registry.yarnpkg.com/colors/-/colors-1.4.0.tgz#c50491479d4c1bdaed2c9ced32cf7c7dc2360f78" integrity sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA== -combined-stream@^1.0.6, combined-stream@~1.0.6: +combined-stream@^1.0.6, combined-stream@^1.0.8, combined-stream@~1.0.6: version "1.0.8" resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== @@ -2176,26 +2619,16 @@ command-line-args@^4.0.7: find-replace "^1.0.3" typical "^2.6.1" -commander@2.11.0: - version "2.11.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.11.0.tgz#157152fd1e7a6c8d98a5b715cf376df928004563" - integrity sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ== - -commander@2.15.1: - version "2.15.1" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.15.1.tgz#df46e867d0fc2aec66a34662b406a9ccafff5b0f" - integrity sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag== +commander@2.18.0: + version "2.18.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.18.0.tgz#2bf063ddee7c7891176981a2cc798e5754bc6970" + integrity sha512-6CYPa+JP2ftfRU2qkDK+UTVeQYosOg/2GbcjIcKPHfinyOLPVGXu/ovN86RP49Re5ndJK1N0kuiidFFuepc4ZQ== -commander@3.0.2, commander@^3.0.0: +commander@3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/commander/-/commander-3.0.2.tgz#6837c3fb677ad9933d1cfba42dd14d5117d6b39e" integrity sha512-Gar0ASD4BDyKC4hl4DwHqDrmvjoxWKZigVnAbn5H1owvm4CxCPdb0HQDehwNYMJpla5+M2tPmPARzhtYuwpHow== -commander@^2.15.0, commander@^2.8.1, commander@^2.9.0: - version "2.20.3" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" - integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== - commander@^4.0.1: version "4.1.1" resolved "https://registry.yarnpkg.com/commander/-/commander-4.1.1.tgz#9fd602bd936294e9e9ef46a3f4d6964044b18068" @@ -2211,7 +2644,7 @@ concat-map@0.0.1: resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= -concat-stream@^1.6.0, concat-stream@^1.6.2: +concat-stream@^1.5.1, concat-stream@^1.6.0, concat-stream@^1.6.2: version "1.6.2" resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw== @@ -2221,7 +2654,7 @@ concat-stream@^1.6.0, concat-stream@^1.6.2: readable-stream "^2.2.2" typedarray "^0.0.6" -confusing-browser-globals@^1.0.10: +confusing-browser-globals@^1.0.10, confusing-browser-globals@^1.0.9: version "1.0.10" resolved "https://registry.yarnpkg.com/confusing-browser-globals/-/confusing-browser-globals-1.0.10.tgz#30d1e7f3d1b882b25ec4933d1d1adac353d20a59" integrity sha512-gNld/3lySHwuhaVluJUKLePYirM3QNCKzVxqAdhJII9/WXKVX5PURzMVJspS1jTslSqjeuG4KMVTSouit5YPHA== @@ -2252,6 +2685,13 @@ content-type@~1.0.4: resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== +convert-source-map@^1.5.1: + version "1.7.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.7.0.tgz#17a2cb882d7f77d3490585e2ce6c524424a3a442" + integrity sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA== + dependencies: + safe-buffer "~5.1.1" + cookie-signature@1.0.6: version "1.0.6" resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" @@ -2278,9 +2718,14 @@ copy-descriptor@^0.1.0: integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= core-js-pure@^3.0.0, core-js-pure@^3.0.1: - version "3.7.0" - resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.7.0.tgz#28a57c861d5698e053f0ff36905f7a3301b4191e" - integrity sha512-EZD2ckZysv8MMt4J6HSvS9K2GdtlZtdBncKAmF9lr2n0c9dJUaUN88PSTjvgwCgQPWKTkERXITgS6JJRAnljtg== + version "3.8.3" + resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.8.3.tgz#10e9e3b2592ecaede4283e8f3ad7020811587c02" + integrity sha512-V5qQZVAr9K0xu7jXg1M7qTEwuxUgqr7dUOezGaNa7i+Xn9oXAU/d1fzqD9ObuwpVQOaorO5s70ckyi1woP9lVA== + +core-js@^2.4.0, core-js@^2.5.0: + version "2.6.12" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.12.tgz#d9333dfa7b065e347cc5682219d6f690859cc2ec" + integrity sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ== core-util-is@1.0.2, core-util-is@~1.0.0: version "1.0.2" @@ -2295,6 +2740,16 @@ cors@^2.8.1: object-assign "^4" vary "^1" +cosmiconfig@^5.0.7: + version "5.2.1" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-5.2.1.tgz#040f726809c591e77a17c0a3626ca45b4f168b1a" + integrity sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA== + dependencies: + import-fresh "^2.0.0" + is-directory "^0.3.1" + js-yaml "^3.13.1" + parse-json "^4.0.0" + create-ecdh@^4.0.0: version "4.0.4" resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.4.tgz#d6e7f4bffa66736085a0762fd3a632684dabcc4e" @@ -2326,6 +2781,11 @@ create-hmac@^1.1.0, create-hmac@^1.1.4, create-hmac@^1.1.7: safe-buffer "^5.0.1" sha.js "^2.4.8" +create-require@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" + integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== + cross-fetch@^2.1.0, cross-fetch@^2.1.1: version "2.2.3" resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-2.2.3.tgz#e8a0b3c54598136e037f8650f8e823ccdfac198e" @@ -2334,15 +2794,6 @@ cross-fetch@^2.1.0, cross-fetch@^2.1.1: node-fetch "2.1.2" whatwg-fetch "2.0.4" -cross-spawn@^5.0.1: - version "5.1.0" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" - integrity sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk= - dependencies: - lru-cache "^4.0.1" - shebang-command "^1.2.0" - which "^1.2.9" - cross-spawn@^6.0.0, cross-spawn@^6.0.5: version "6.0.5" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" @@ -2354,6 +2805,15 @@ cross-spawn@^6.0.0, cross-spawn@^6.0.5: shebang-command "^1.2.0" which "^1.2.9" +cross-spawn@^7.0.2: + version "7.0.3" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" + integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + "crypt@>= 0.0.1": version "0.0.2" resolved "https://registry.yarnpkg.com/crypt/-/crypt-0.0.2.tgz#88d7ff7ec0dfb86f713dc87bbb42d044d3e6c41b" @@ -2376,25 +2836,10 @@ crypto-browserify@3.12.0: randombytes "^2.0.0" randomfill "^1.0.3" -crypto-js@^3.1.9-1: - version "3.3.0" - resolved "https://registry.yarnpkg.com/crypto-js/-/crypto-js-3.3.0.tgz#846dd1cce2f68aacfa156c8578f926a609b7976b" - integrity sha512-DIT51nX0dCfKltpRiXV+/TVZq+Qq2NgF4644+K7Ttnla7zEzqc+kjJyiB96BHNyUTBxyjzRcZYpUdZa+QAqi6Q== - -css-select@~1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/css-select/-/css-select-1.2.0.tgz#2b3a110539c5355f1cd8d314623e870b121ec858" - integrity sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg= - dependencies: - boolbase "~1.0.0" - css-what "2.1" - domutils "1.5.1" - nth-check "~1.0.1" - -css-what@2.1: - version "2.1.3" - resolved "https://registry.yarnpkg.com/css-what/-/css-what-2.1.3.tgz#a6d7604573365fe74686c3f311c56513d88285f2" - integrity sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg== +csv-parse@^4.15.0: + version "4.15.0" + resolved "https://registry.yarnpkg.com/csv-parse/-/csv-parse-4.15.0.tgz#d86d447e88d5f9a539e8768874f89a8d86d8fd78" + integrity sha512-y2wGeU/ybvUlyw6F+eanM6lxxE4JthCuHuaoTgPXdw6ImmfYXqtP0nrCLqd6Ew/a0FgPEz36y5HznI0W5oJ+cg== d@1, d@^1.0.1: version "1.0.1" @@ -2421,20 +2866,13 @@ death@^1.1.0: resolved "https://registry.yarnpkg.com/death/-/death-1.1.0.tgz#01aa9c401edd92750514470b8266390c66c67318" integrity sha1-AaqcQB7dknUFFEcLgmY5DGbGcxg= -debug@2.6.9, debug@^2.2.0, debug@^2.3.3, debug@^2.6.0, debug@^2.6.9: +debug@2.6.9, debug@^2.2.0, debug@^2.3.3, debug@^2.6.0, debug@^2.6.8, debug@^2.6.9: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== dependencies: ms "2.0.0" -debug@3.1.0, debug@=3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" - integrity sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g== - dependencies: - ms "2.0.0" - debug@3.2.6: version "3.2.6" resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" @@ -2442,13 +2880,20 @@ debug@3.2.6: dependencies: ms "^2.1.1" -debug@4, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1: +debug@4, debug@^4.0.1, debug@^4.1.1: version "4.3.1" resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.1.tgz#f0d229c505e0c6d8c49ac553d1b13dc183f6b2ee" integrity sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ== dependencies: ms "2.1.2" +debug@4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.2.0.tgz#7f150f93920e94c58f5574c2fd01a3110effe7f1" + integrity sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg== + dependencies: + ms "2.1.2" + debug@^3.1.0: version "3.2.7" resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" @@ -2461,70 +2906,22 @@ decamelize@^1.1.1, decamelize@^1.2.0: resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= +decamelize@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-4.0.0.tgz#aa472d7bf660eb15f3494efd531cab7f2a709837" + integrity sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ== + decode-uri-component@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" - integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU= - -decompress-response@^3.2.0, decompress-response@^3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-3.3.0.tgz#80a4dd323748384bfa248083622aedec982adff3" - integrity sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M= - dependencies: - mimic-response "^1.0.0" - -decompress-tar@^4.0.0, decompress-tar@^4.1.0, decompress-tar@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/decompress-tar/-/decompress-tar-4.1.1.tgz#718cbd3fcb16209716e70a26b84e7ba4592e5af1" - integrity sha512-JdJMaCrGpB5fESVyxwpCx4Jdj2AagLmv3y58Qy4GE6HMVjWz1FeVQk1Ct4Kye7PftcdOo/7U7UKzYBJgqnGeUQ== - dependencies: - file-type "^5.2.0" - is-stream "^1.1.0" - tar-stream "^1.5.2" - -decompress-tarbz2@^4.0.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/decompress-tarbz2/-/decompress-tarbz2-4.1.1.tgz#3082a5b880ea4043816349f378b56c516be1a39b" - integrity sha512-s88xLzf1r81ICXLAVQVzaN6ZmX4A6U4z2nMbOwobxkLoIIfjVMBg7TeguTUXkKeXni795B6y5rnvDw7rxhAq9A== - dependencies: - decompress-tar "^4.1.0" - file-type "^6.1.0" - is-stream "^1.1.0" - seek-bzip "^1.0.5" - unbzip2-stream "^1.0.9" - -decompress-targz@^4.0.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/decompress-targz/-/decompress-targz-4.1.1.tgz#c09bc35c4d11f3de09f2d2da53e9de23e7ce1eee" - integrity sha512-4z81Znfr6chWnRDNfFNqLwPvm4db3WuZkqV+UgXQzSngG3CEKdBkw5jrv3axjjL96glyiiKjsxJG3X6WBZwX3w== - dependencies: - decompress-tar "^4.1.1" - file-type "^5.2.0" - is-stream "^1.1.0" + integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU= -decompress-unzip@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/decompress-unzip/-/decompress-unzip-4.0.1.tgz#deaaccdfd14aeaf85578f733ae8210f9b4848f69" - integrity sha1-3qrM39FK6vhVePczroIQ+bSEj2k= +decompress-response@^3.2.0, decompress-response@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-3.3.0.tgz#80a4dd323748384bfa248083622aedec982adff3" + integrity sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M= dependencies: - file-type "^3.8.0" - get-stream "^2.2.0" - pify "^2.3.0" - yauzl "^2.4.2" - -decompress@^4.0.0: - version "4.2.1" - resolved "https://registry.yarnpkg.com/decompress/-/decompress-4.2.1.tgz#007f55cc6a62c055afa37c07eb6a4ee1b773f118" - integrity sha512-e48kc2IjU+2Zw8cTb6VZcJQ3lgVbS4uuB1TfCHbiZIP/haNXm+SVyhu+87jts5/3ROpd82GSVCoNs/z8l4ZOaQ== - dependencies: - decompress-tar "^4.0.0" - decompress-tarbz2 "^4.0.0" - decompress-targz "^4.0.0" - decompress-unzip "^4.0.1" - graceful-fs "^4.1.10" - make-dir "^1.0.0" - pify "^2.3.0" - strip-dirs "^2.0.0" + mimic-response "^1.0.0" deep-eql@^3.0.1: version "3.0.1" @@ -2533,7 +2930,19 @@ deep-eql@^3.0.1: dependencies: type-detect "^4.0.0" -deep-is@~0.1.3: +deep-equal@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.1.1.tgz#b5c98c942ceffaf7cb051e24e1434a25a2e6076a" + integrity sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g== + dependencies: + is-arguments "^1.0.4" + is-date-object "^1.0.1" + is-regex "^1.0.4" + object-is "^1.0.1" + object-keys "^1.1.1" + regexp.prototype.flags "^1.2.0" + +deep-is@^0.1.3, deep-is@~0.1.3: version "0.1.3" resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ= @@ -2587,21 +2996,16 @@ define-property@^2.0.2: is-descriptor "^1.0.2" isobject "^3.0.1" -delay@4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/delay/-/delay-4.3.0.tgz#efeebfb8f545579cb396b3a722443ec96d14c50e" - integrity sha512-Lwaf3zVFDMBop1yDuFZ19F9WyGcZcGacsbdlZtWjQmM50tOcMntm1njF/Nb/Vjij3KaSvCF+sEYGKrrjObu2NA== +defined@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/defined/-/defined-1.0.0.tgz#c98d9bcef75674188e110969151199e39b1fa693" + integrity sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM= delayed-stream@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= -delimit-stream@0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/delimit-stream/-/delimit-stream-0.1.0.tgz#9b8319477c0e5f8aeb3ce357ae305fc25ea1cd2b" - integrity sha1-m4MZR3wOX4rrPONXrjBfwl6hzSs= - depd@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" @@ -2620,10 +3024,12 @@ destroy@~1.0.4: resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA= -detect-indent@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-5.0.0.tgz#3871cc0a6a002e8c3e5b3cf7f336264675f06b9d" - integrity sha1-OHHMCmoALow+Wzz38zYmRnXwa50= +detect-indent@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-4.0.0.tgz#f76d064352cdf43a1cb6ce619c4ee3a9475de208" + integrity sha1-920GQ1LN9Docts5hnE7jqUdd4gg= + dependencies: + repeating "^2.0.0" detect-port@^1.3.0: version "1.3.0" @@ -2633,17 +3039,12 @@ detect-port@^1.3.0: address "^1.0.1" debug "^2.6.0" -diff@3.3.1: - version "3.3.1" - resolved "https://registry.yarnpkg.com/diff/-/diff-3.3.1.tgz#aa8567a6eed03c531fc89d3f711cd0e5259dec75" - integrity sha512-MKPHZDMB0o6yHyDryUOScqZibp914ksXwAMYMTHj6KO8UeKsRYNJD3oNCKjTqZon+V488P7N/HzXF8t7ZR95ww== - -diff@3.5.0, diff@^3.5.0: +diff@3.5.0: version "3.5.0" resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12" integrity sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA== -diff@^4.0.1: +diff@4.0.2, diff@^4.0.1: version "4.0.2" resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== @@ -2664,6 +3065,11 @@ dir-glob@^3.0.1: dependencies: path-type "^4.0.0" +dir-to-object@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/dir-to-object/-/dir-to-object-2.0.0.tgz#29723e9bd1c3e58e4f307bd04ff634c0370c8f8a" + integrity sha512-sXs0JKIhymON7T1UZuO2Ud6VTNAx/VTBXIl4+3mjb2RgfOpt+hectX0x04YqPOPdkeOAKoJuKqwqnXXURNPNEA== + doctrine@1.5.0: version "1.5.0" resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-1.5.0.tgz#379dce730f6166f76cefa4e6707a159b02c5a6fa" @@ -2686,59 +3092,17 @@ doctrine@^3.0.0: dependencies: esutils "^2.0.2" -dom-serializer@0: - version "0.2.2" - resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.2.2.tgz#1afb81f533717175d478655debc5e332d9f9bb51" - integrity sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g== - dependencies: - domelementtype "^2.0.1" - entities "^2.0.0" - -dom-serializer@~0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.1.1.tgz#1ec4059e284babed36eec2941d4a970a189ce7c0" - integrity sha512-l0IU0pPzLWSHBcieZbpOKgkIn3ts3vAh7ZuFyXNwJxJXk/c4Gwj9xaTJwIDVQCXawWD0qb3IzMGH5rglQaO0XA== - dependencies: - domelementtype "^1.3.0" - entities "^1.1.1" - dom-walk@^0.1.0: version "0.1.2" resolved "https://registry.yarnpkg.com/dom-walk/-/dom-walk-0.1.2.tgz#0c548bef048f4d1f2a97249002236060daa3fd84" integrity sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w== -domelementtype@1, domelementtype@^1.3.0, domelementtype@^1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.3.1.tgz#d048c44b37b0d10a7f2a3d5fee3f4333d790481f" - integrity sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w== - -domelementtype@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.0.2.tgz#f3b6e549201e46f588b59463dd77187131fe6971" - integrity sha512-wFwTwCVebUrMgGeAwRL/NhZtHAUyT9n9yg4IMDwf10+6iCMxSkVq9MGCVEH+QZWo1nNidy8kNvwmv4zWHDTqvA== - -domhandler@^2.3.0: - version "2.4.2" - resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-2.4.2.tgz#8805097e933d65e85546f726d60f5eb88b44f803" - integrity sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA== - dependencies: - domelementtype "1" - -domutils@1.5.1: - version "1.5.1" - resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.5.1.tgz#dcd8488a26f563d61079e48c9f7b7e32373682cf" - integrity sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8= - dependencies: - dom-serializer "0" - domelementtype "1" - -domutils@^1.5.1: - version "1.7.0" - resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.7.0.tgz#56ea341e834e06e6748af7a1cb25da67ea9f8c2a" - integrity sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg== +dotignore@~0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/dotignore/-/dotignore-0.1.2.tgz#f942f2200d28c3a76fbdd6f0ee9f3257c8a2e905" + integrity sha512-UGGGWfSauusaVJC+8fgV+NVvBXkCTmVv7sk6nojDZZvuOUNGUy0Zk4UpHQD6EDjS0jpBwcACvH4eofvyzBcRDw== dependencies: - dom-serializer "0" - domelementtype "1" + minimatch "^3.0.4" drbg.js@^1.0.1: version "1.0.1" @@ -2767,15 +3131,10 @@ ee-first@1.1.1: resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= -elliptic@6.3.3: - version "6.3.3" - resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.3.3.tgz#5482d9646d54bcb89fd7d994fc9e2e9568876e3f" - integrity sha1-VILZZG1UvLif19mU/J4ulWiHbj8= - dependencies: - bn.js "^4.4.0" - brorand "^1.0.1" - hash.js "^1.0.0" - inherits "^2.0.1" +electron-to-chromium@^1.3.47: + version "1.3.642" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.642.tgz#8b884f50296c2ae2a9997f024d0e3e57facc2b94" + integrity sha512-cev+jOrz/Zm1i+Yh334Hed6lQVOkkemk2wRozfMF4MtTR7pxf3r3L5Rbd7uX1zMcEqVJ7alJBnJL7+JffkC6FQ== elliptic@6.5.3, elliptic@^6.4.0, elliptic@^6.5.2, elliptic@^6.5.3: version "6.5.3" @@ -2810,7 +3169,7 @@ encodeurl@~1.0.2: resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= -encoding-down@~5.0.0: +encoding-down@5.0.4, encoding-down@~5.0.0: version "5.0.4" resolved "https://registry.yarnpkg.com/encoding-down/-/encoding-down-5.0.4.tgz#1e477da8e9e9d0f7c8293d320044f8b2cd8e9614" integrity sha512-8CIZLDcSKxgzT+zX8ZVfgNbu8Md2wq/iqa1Y7zyVR18QBEAc0Nmzuvj/N5ykSKpfGzjM8qxbaFntLPwnVoUhZw== @@ -2828,55 +3187,40 @@ encoding@^0.1.11: dependencies: iconv-lite "^0.6.2" -end-of-stream@^1.0.0, end-of-stream@^1.1.0: +end-of-stream@^1.1.0: version "1.4.4" resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== dependencies: once "^1.4.0" -enquirer@^2.3.0: +enquirer@^2.3.0, enquirer@^2.3.5: version "2.3.6" resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.3.6.tgz#2a7fe5dd634a1e4125a975ec994ff5456dc3734d" integrity sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg== dependencies: ansi-colors "^4.1.1" -entities@^1.1.1, entities@~1.1.1: - version "1.1.2" - resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.2.tgz#bdfa735299664dfafd34529ed4f8522a275fea56" - integrity sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w== - -entities@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/entities/-/entities-2.1.0.tgz#992d3129cf7df6870b96c57858c249a120f8b8b5" - integrity sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w== - env-paths@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-2.2.0.tgz#cdca557dc009152917d6166e2febe1f039685e43" integrity sha512-6u0VYSCo/OW6IoD5WCLLy9JUGARbamfSavcNXry/eu8aHVFei6CD3Sw+VGX5alea1i9pgPHW0mbu6Xj0uBh7gA== -eol@^0.9.1: - version "0.9.1" - resolved "https://registry.yarnpkg.com/eol/-/eol-0.9.1.tgz#f701912f504074be35c6117a5c4ade49cd547acd" - integrity sha512-Ds/TEoZjwggRoz/Q2O7SE3i4Jm66mqTDfmdHdq/7DKVk3bro9Q8h6WdXKdPqFLMoqxrDK5SVRzHVPOS6uuGtrg== - errno@~0.1.1: - version "0.1.7" - resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.7.tgz#4684d71779ad39af177e3f007996f7c67c852618" - integrity sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg== + version "0.1.8" + resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.8.tgz#8bb3e9c7d463be4976ff888f76b4809ebc2e811f" + integrity sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A== dependencies: prr "~1.0.1" -error-ex@^1.2.0: +error-ex@^1.2.0, error-ex@^1.3.1: version "1.3.2" resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== dependencies: is-arrayish "^0.2.1" -es-abstract@^1.17.0, es-abstract@^1.17.0-next.1, es-abstract@^1.17.2, es-abstract@^1.17.5: +es-abstract@^1.17.0-next.1: version "1.17.7" resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.17.7.tgz#a4de61b2f66989fc7421676c1cb9787573ace54c" integrity sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g== @@ -2893,23 +3237,25 @@ es-abstract@^1.17.0, es-abstract@^1.17.0-next.1, es-abstract@^1.17.2, es-abstrac string.prototype.trimend "^1.0.1" string.prototype.trimstart "^1.0.1" -es-abstract@^1.18.0-next.0, es-abstract@^1.18.0-next.1: - version "1.18.0-next.1" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.18.0-next.1.tgz#6e3a0a4bda717e5023ab3b8e90bec36108d22c68" - integrity sha512-I4UGspA0wpZXWENrdA0uHbnhte683t3qT/1VFH9aX2dA5PPSf6QW5HHXf5HImaqPmjXaVeVk4RGWnaylmV7uAA== +es-abstract@^1.18.0-next.1: + version "1.18.0-next.2" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.18.0-next.2.tgz#088101a55f0541f595e7e057199e27ddc8f3a5c2" + integrity sha512-Ih4ZMFHEtZupnUh6497zEL4y2+w8+1ljnCyaTa+adcoafI1GOvMwFlDjBLfWR7y9VLfrjRJe9ocuHY1PSR9jjw== dependencies: + call-bind "^1.0.2" es-to-primitive "^1.2.1" function-bind "^1.1.1" + get-intrinsic "^1.0.2" has "^1.0.3" has-symbols "^1.0.1" is-callable "^1.2.2" - is-negative-zero "^2.0.0" + is-negative-zero "^2.0.1" is-regex "^1.1.1" - object-inspect "^1.8.0" + object-inspect "^1.9.0" object-keys "^1.1.1" - object.assign "^4.1.1" - string.prototype.trimend "^1.0.1" - string.prototype.trimstart "^1.0.1" + object.assign "^4.1.2" + string.prototype.trimend "^1.0.3" + string.prototype.trimstart "^1.0.3" es-to-primitive@^1.2.1: version "1.2.1" @@ -2920,7 +3266,7 @@ es-to-primitive@^1.2.1: is-date-object "^1.0.1" is-symbol "^1.0.2" -es5-ext@^0.10.35, es5-ext@^0.10.45, es5-ext@^0.10.46, es5-ext@^0.10.50, es5-ext@~0.10.14, es5-ext@~0.10.2, es5-ext@~0.10.46: +es5-ext@^0.10.35, es5-ext@^0.10.46, es5-ext@^0.10.50, es5-ext@^0.10.53, es5-ext@~0.10.14, es5-ext@~0.10.2, es5-ext@~0.10.46: version "0.10.53" resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.53.tgz#93c5a3acfdbef275220ad72644ad02ee18368de1" integrity sha512-Xs2Stw6NiNHWypzRTY1MtaG/uJlwCk8kH81920ma8mvN8Xq1gsfhZvpkImLQArw8AHnv8MT2I45J3c0R8slE+Q== @@ -2946,7 +3292,7 @@ es6-symbol@^3.1.1, es6-symbol@~3.1.3: d "^1.0.1" ext "^1.1.2" -es6-weak-map@^2.0.2: +es6-weak-map@^2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/es6-weak-map/-/es6-weak-map-2.0.3.tgz#b6da1f16cc2cc0d9be43e6bdbfc5e7dfcdf31d53" integrity sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA== @@ -2961,11 +3307,16 @@ escape-html@~1.0.3: resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg= -escape-string-regexp@1.0.5, escape-string-regexp@^1.0.5: +escape-string-regexp@1.0.5, escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= +escape-string-regexp@4.0.0, escape-string-regexp@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" + integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== + escodegen@1.8.x: version "1.8.1" resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.8.1.tgz#5a5b53af4693110bebb0867aa3430dd3b70a1018" @@ -2978,7 +3329,16 @@ escodegen@1.8.x: optionalDependencies: source-map "~0.2.0" -eslint-config-airbnb-base@^14.1.0, eslint-config-airbnb-base@^14.2.1: +eslint-config-airbnb-base@14.2.0: + version "14.2.0" + resolved "https://registry.yarnpkg.com/eslint-config-airbnb-base/-/eslint-config-airbnb-base-14.2.0.tgz#fe89c24b3f9dc8008c9c0d0d88c28f95ed65e9c4" + integrity sha512-Snswd5oC6nJaevs3nZoLSTvGJBvzTfnBqOIArkf3cbyTyq9UD79wOk8s+RiL6bhca0p/eRO6veczhf6A/7Jy8Q== + dependencies: + confusing-browser-globals "^1.0.9" + object.assign "^4.1.0" + object.entries "^1.1.2" + +eslint-config-airbnb-base@^14.2.0: version "14.2.1" resolved "https://registry.yarnpkg.com/eslint-config-airbnb-base/-/eslint-config-airbnb-base-14.2.1.tgz#8a2eb38455dc5a312550193b319cdaeef042cd1e" integrity sha512-GOrQyDtVEc1Xy20U7vsB2yAoB4nBlfH5HZJeatRXHleO+OS5Ot+MWij4Dpltw4/DyIkqUfqz1epfhVR5XWWQPA== @@ -2987,30 +3347,28 @@ eslint-config-airbnb-base@^14.1.0, eslint-config-airbnb-base@^14.2.1: object.assign "^4.1.2" object.entries "^1.1.2" -eslint-config-airbnb-typescript@^7.0.0: - version "7.2.1" - resolved "https://registry.yarnpkg.com/eslint-config-airbnb-typescript/-/eslint-config-airbnb-typescript-7.2.1.tgz#bce3f02fa894d1ec2f31ac527992e03761a9b7d4" - integrity sha512-D3elVKUbdsCfkOVstSyWuiu+KGCVTrYxJPoenPIqZtL6Li/R4xBeVTXjZIui8B8D17bDN3Pz5dSr7jRLY5HqIg== +eslint-config-airbnb-typescript@^12.0.0: + version "12.0.0" + resolved "https://registry.yarnpkg.com/eslint-config-airbnb-typescript/-/eslint-config-airbnb-typescript-12.0.0.tgz#4bb6b4b72b1cfc45ef1fa0607735679ceb9a3814" + integrity sha512-TUCVru1Z09eKnVAX5i3XoNzjcCOU3nDQz2/jQGkg1jVYm+25fKClveziSl16celfCq+npU0MBPW/ZnXdGFZ9lw== dependencies: - "@typescript-eslint/parser" "^2.24.0" - eslint-config-airbnb "^18.1.0" - eslint-config-airbnb-base "^14.1.0" + "@typescript-eslint/parser" "4.4.1" + eslint-config-airbnb "18.2.0" + eslint-config-airbnb-base "14.2.0" -eslint-config-airbnb@^18.1.0: - version "18.2.1" - resolved "https://registry.yarnpkg.com/eslint-config-airbnb/-/eslint-config-airbnb-18.2.1.tgz#b7fe2b42f9f8173e825b73c8014b592e449c98d9" - integrity sha512-glZNDEZ36VdlZWoxn/bUR1r/sdFKPd1mHPbqUtkctgNG4yT2DLLtJ3D+yCV+jzZCc2V1nBVkmdknOJBZ5Hc0fg== +eslint-config-airbnb@18.2.0: + version "18.2.0" + resolved "https://registry.yarnpkg.com/eslint-config-airbnb/-/eslint-config-airbnb-18.2.0.tgz#8a82168713effce8fc08e10896a63f1235499dcd" + integrity sha512-Fz4JIUKkrhO0du2cg5opdyPKQXOI2MvF8KUvN2710nJMT6jaRUpRE2swrJftAjVGL7T1otLM5ieo5RqS1v9Udg== dependencies: - eslint-config-airbnb-base "^14.2.1" - object.assign "^4.1.2" + eslint-config-airbnb-base "^14.2.0" + object.assign "^4.1.0" object.entries "^1.1.2" -eslint-config-prettier@^6.10.0: - version "6.15.0" - resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-6.15.0.tgz#7f93f6cb7d45a92f1537a70ecc06366e1ac6fed9" - integrity sha512-a1+kOYLR8wMGustcgAjdydMsQ2A/2ipRPwRKUmfYaSxc9ZPcrku080Ctl6zrZzZNs/U82MjSv+qKREkoq3bJaw== - dependencies: - get-stdin "^6.0.0" +eslint-config-prettier@^7.2.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-7.2.0.tgz#f4a4bd2832e810e8cc7c1411ec85b3e85c0c53f9" + integrity sha512-rV4Qu0C3nfJKPOAhFujFxB7RMP+URFyQqqOZW9DMRD7ZDTFyjaIlETU3xzHELt++4ugC0+Jm084HQYkkJe+Ivg== eslint-import-resolver-alias@^1.1.2: version "1.1.2" @@ -3070,9 +3428,9 @@ eslint-plugin-jsx-a11y@^6.2.3: language-tags "^1.0.5" eslint-plugin-react@^7.18.3: - version "7.21.5" - resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.21.5.tgz#50b21a412b9574bfe05b21db176e8b7b3b15bff3" - integrity sha512-8MaEggC2et0wSF6bUeywF7qQ46ER81irOdWS4QWxnnlAEsnzeBevk1sWh7fhpCghPpXb+8Ks7hvaft6L/xsR6g== + version "7.22.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.22.0.tgz#3d1c542d1d3169c45421c1215d9470e341707269" + integrity sha512-p30tuX3VS+NWv9nQot9xIGAHBXR0+xJVaZriEsHoJrASGCJZDJ8JLNM0YqKqI0AKm6Uxaa1VUHoNEibxRCMQHA== dependencies: array-includes "^3.1.1" array.prototype.flatmap "^1.2.3" @@ -3086,7 +3444,15 @@ eslint-plugin-react@^7.18.3: resolve "^1.18.1" string.prototype.matchall "^4.0.2" -eslint-scope@^5.0.0: +eslint-scope@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-4.0.3.tgz#ca03833310f6889a3264781aa82e63eb9cfe7848" + integrity sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg== + dependencies: + esrecurse "^4.1.0" + estraverse "^4.1.1" + +eslint-scope@^5.0.0, eslint-scope@^5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== @@ -3094,76 +3460,132 @@ eslint-scope@^5.0.0: esrecurse "^4.3.0" estraverse "^4.1.1" -eslint-utils@^1.4.3: +eslint-utils@^1.3.1: version "1.4.3" resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-1.4.3.tgz#74fec7c54d0776b6f67e0251040b5806564e981f" integrity sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q== dependencies: eslint-visitor-keys "^1.1.0" -eslint-utils@^2.0.0: +eslint-utils@^2.0.0, eslint-utils@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-2.1.0.tgz#d2de5e03424e707dc10c74068ddedae708741b27" integrity sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg== dependencies: eslint-visitor-keys "^1.1.0" -eslint-visitor-keys@^1.1.0: +eslint-visitor-keys@^1.0.0, eslint-visitor-keys@^1.1.0, eslint-visitor-keys@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz#30ebd1ef7c2fdff01c3a4f151044af25fab0523e" integrity sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ== -eslint@^6.8.0: - version "6.8.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-6.8.0.tgz#62262d6729739f9275723824302fb227c8c93ffb" - integrity sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig== +eslint-visitor-keys@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.0.0.tgz#21fdc8fbcd9c795cc0321f0563702095751511a8" + integrity sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ== + +eslint@^5.6.0: + version "5.16.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-5.16.0.tgz#a1e3ac1aae4a3fbd8296fcf8f7ab7314cbb6abea" + integrity sha512-S3Rz11i7c8AA5JPv7xAH+dOyq/Cu/VXHiHXBPOU1k/JAM5dXqQPt3qcrhpHSorXmrpu2g0gkIBVXAqCpzfoZIg== dependencies: "@babel/code-frame" "^7.0.0" - ajv "^6.10.0" + ajv "^6.9.1" chalk "^2.1.0" cross-spawn "^6.0.5" debug "^4.0.1" doctrine "^3.0.0" - eslint-scope "^5.0.0" - eslint-utils "^1.4.3" - eslint-visitor-keys "^1.1.0" - espree "^6.1.2" + eslint-scope "^4.0.3" + eslint-utils "^1.3.1" + eslint-visitor-keys "^1.0.0" + espree "^5.0.1" esquery "^1.0.1" esutils "^2.0.2" file-entry-cache "^5.0.1" functional-red-black-tree "^1.0.1" - glob-parent "^5.0.0" - globals "^12.1.0" + glob "^7.1.2" + globals "^11.7.0" ignore "^4.0.6" import-fresh "^3.0.0" imurmurhash "^0.1.4" - inquirer "^7.0.0" - is-glob "^4.0.0" - js-yaml "^3.13.1" + inquirer "^6.2.2" + js-yaml "^3.13.0" json-stable-stringify-without-jsonify "^1.0.1" levn "^0.3.0" - lodash "^4.17.14" + lodash "^4.17.11" minimatch "^3.0.4" mkdirp "^0.5.1" natural-compare "^1.4.0" - optionator "^0.8.3" + optionator "^0.8.2" + path-is-inside "^1.0.2" progress "^2.0.0" regexpp "^2.0.1" - semver "^6.1.2" - strip-ansi "^5.2.0" - strip-json-comments "^3.0.1" + semver "^5.5.1" + strip-ansi "^4.0.0" + strip-json-comments "^2.0.1" table "^5.2.3" text-table "^0.2.0" + +eslint@^7.18.0: + version "7.18.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.18.0.tgz#7fdcd2f3715a41fe6295a16234bd69aed2c75e67" + integrity sha512-fbgTiE8BfUJZuBeq2Yi7J3RB3WGUQ9PNuNbmgi6jt9Iv8qrkxfy19Ds3OpL1Pm7zg3BtTVhvcUZbIRQ0wmSjAQ== + dependencies: + "@babel/code-frame" "^7.0.0" + "@eslint/eslintrc" "^0.3.0" + ajv "^6.10.0" + chalk "^4.0.0" + cross-spawn "^7.0.2" + debug "^4.0.1" + doctrine "^3.0.0" + enquirer "^2.3.5" + eslint-scope "^5.1.1" + eslint-utils "^2.1.0" + eslint-visitor-keys "^2.0.0" + espree "^7.3.1" + esquery "^1.2.0" + esutils "^2.0.2" + file-entry-cache "^6.0.0" + functional-red-black-tree "^1.0.1" + glob-parent "^5.0.0" + globals "^12.1.0" + ignore "^4.0.6" + import-fresh "^3.0.0" + imurmurhash "^0.1.4" + is-glob "^4.0.0" + js-yaml "^3.13.1" + json-stable-stringify-without-jsonify "^1.0.1" + levn "^0.4.1" + lodash "^4.17.20" + minimatch "^3.0.4" + natural-compare "^1.4.0" + optionator "^0.9.1" + progress "^2.0.0" + regexpp "^3.1.0" + semver "^7.2.1" + strip-ansi "^6.0.0" + strip-json-comments "^3.1.0" + table "^6.0.4" + text-table "^0.2.0" v8-compile-cache "^2.0.3" -espree@^6.1.2: - version "6.2.1" - resolved "https://registry.yarnpkg.com/espree/-/espree-6.2.1.tgz#77fc72e1fd744a2052c20f38a5b575832e82734a" - integrity sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw== +espree@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/espree/-/espree-5.0.1.tgz#5d6526fa4fc7f0788a5cf75b15f30323e2f81f7a" + integrity sha512-qWAZcWh4XE/RwzLJejfcofscgMc9CamR6Tn1+XRXNzrvUSSbiAjGOI/fggztjIi7y9VLPqnICMIPiGyr8JaZ0A== dependencies: - acorn "^7.1.1" - acorn-jsx "^5.2.0" - eslint-visitor-keys "^1.1.0" + acorn "^6.0.7" + acorn-jsx "^5.0.0" + eslint-visitor-keys "^1.0.0" + +espree@^7.3.0, espree@^7.3.1: + version "7.3.1" + resolved "https://registry.yarnpkg.com/espree/-/espree-7.3.1.tgz#f2df330b752c6f55019f8bd89b7660039c1bbbb6" + integrity sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g== + dependencies: + acorn "^7.4.0" + acorn-jsx "^5.3.1" + eslint-visitor-keys "^1.3.0" esprima@2.7.x, esprima@^2.7.1: version "2.7.3" @@ -3175,14 +3597,14 @@ esprima@^4.0.0: resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== -esquery@^1.0.1: +esquery@^1.0.1, esquery@^1.2.0: version "1.3.1" resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.3.1.tgz#b78b5828aa8e214e29fb74c4d5b752e1c033da57" integrity sha512-olpvt9QG0vniUBZspVRN6lwB7hOZoTRtT+jzR+tS4ffYx2mzbw+z0XCOk44aaLYKApNX5nMm+E+P6o25ip/DHQ== dependencies: estraverse "^5.1.0" -esrecurse@^4.3.0: +esrecurse@^4.1.0, esrecurse@^4.3.0: version "4.3.0" resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== @@ -3214,19 +3636,20 @@ etag@~1.8.1: resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= -eth-block-tracker@^4.4.2: - version "4.4.3" - resolved "https://registry.yarnpkg.com/eth-block-tracker/-/eth-block-tracker-4.4.3.tgz#766a0a0eb4a52c867a28328e9ae21353812cf626" - integrity sha512-A8tG4Z4iNg4mw5tP1Vung9N9IjgMNqpiMoJ/FouSFwNCGHv2X0mmOYwtQOJzki6XN7r7Tyo01S29p7b224I4jw== +eth-block-tracker@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/eth-block-tracker/-/eth-block-tracker-3.0.1.tgz#95cd5e763c7293e0b1b2790a2a39ac2ac188a5e1" + integrity sha512-WUVxWLuhMmsfenfZvFO5sbl1qFY2IqUlw/FPVmjjdElpqLsZtSG+wPe9Dz7W/sB6e80HgFKknOmKk2eNlznHug== dependencies: - "@babel/plugin-transform-runtime" "^7.5.5" - "@babel/runtime" "^7.5.5" eth-query "^2.1.0" - json-rpc-random-id "^1.0.1" - pify "^3.0.0" - safe-event-emitter "^1.0.1" + ethereumjs-tx "^1.3.3" + ethereumjs-util "^5.1.3" + ethjs-util "^0.1.3" + json-rpc-engine "^3.6.0" + pify "^2.3.0" + tape "^4.6.3" -eth-ens-namehash@2.0.8, eth-ens-namehash@^2.0.0: +eth-ens-namehash@2.0.8, eth-ens-namehash@^2.0.8: version "2.0.8" resolved "https://registry.yarnpkg.com/eth-ens-namehash/-/eth-ens-namehash-2.0.8.tgz#229ac46eca86d52e0c991e7cb2aef83ff0f68bcf" integrity sha1-IprEbsqG1S4MmR58sq74P/D2i88= @@ -3234,13 +3657,13 @@ eth-ens-namehash@2.0.8, eth-ens-namehash@^2.0.0: idna-uts46-hx "^2.3.1" js-sha3 "^0.5.7" -eth-gas-reporter@^0.2.19: - version "0.2.19" - resolved "https://registry.yarnpkg.com/eth-gas-reporter/-/eth-gas-reporter-0.2.19.tgz#57ce74e0617d021d04fd1789a4232837d0f41918" - integrity sha512-yQmbAa6O9/Yl/syNml2A0R+ZLQnJ9m9jogFXHzjMWVBMUVnAcEskOVyxaMYddkclZdYIMxE99tQy830C2jLsAQ== +eth-gas-reporter@^0.2.20: + version "0.2.20" + resolved "https://registry.yarnpkg.com/eth-gas-reporter/-/eth-gas-reporter-0.2.20.tgz#431c144f00cd01cc29ce211a10a4e5a539a84e25" + integrity sha512-gp/PhKrr3hYEEFg5emIQxbhQkVH2mg+iHcM6GvqhzFx5IkZGeQx+5oNzYDEfBXQefcA90rwWHId6eCty6jbdDA== dependencies: "@ethersproject/abi" "^5.0.0-beta.146" - "@solidity-parser/parser" "^0.8.0" + "@solidity-parser/parser" "^0.8.2" cli-table3 "^0.5.0" colors "^1.1.2" ethereumjs-util "6.2.0" @@ -3255,19 +3678,34 @@ eth-gas-reporter@^0.2.19: sha1 "^1.1.1" sync-request "^6.0.0" -eth-json-rpc-errors@^1.0.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/eth-json-rpc-errors/-/eth-json-rpc-errors-1.1.1.tgz#148377ef55155585981c21ff574a8937f9d6991f" - integrity sha512-WT5shJ5KfNqHi9jOZD+ID8I1kuYWNrigtZat7GOQkvwo99f8SzAVaEcWhJUv656WiZOAg3P1RiJQANtUmDmbIg== +eth-json-rpc-infura@^3.1.0: + version "3.2.1" + resolved "https://registry.yarnpkg.com/eth-json-rpc-infura/-/eth-json-rpc-infura-3.2.1.tgz#26702a821067862b72d979c016fd611502c6057f" + integrity sha512-W7zR4DZvyTn23Bxc0EWsq4XGDdD63+XPUCEhV2zQvQGavDVC4ZpFDK4k99qN7bd7/fjj37+rxmuBOBeIqCA5Mw== dependencies: - fast-safe-stringify "^2.0.6" + cross-fetch "^2.1.1" + eth-json-rpc-middleware "^1.5.0" + json-rpc-engine "^3.4.0" + json-rpc-error "^2.0.0" -eth-json-rpc-errors@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/eth-json-rpc-errors/-/eth-json-rpc-errors-2.0.2.tgz#c1965de0301fe941c058e928bebaba2e1285e3c4" - integrity sha512-uBCRM2w2ewusRHGxN8JhcuOb2RN3ueAOYH/0BhqdFmQkZx5lj5+fLKTz0mIVOzd4FG5/kUksCzCD7eTEim6gaA== +eth-json-rpc-middleware@^1.5.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/eth-json-rpc-middleware/-/eth-json-rpc-middleware-1.6.0.tgz#5c9d4c28f745ccb01630f0300ba945f4bef9593f" + integrity sha512-tDVCTlrUvdqHKqivYMjtFZsdD7TtpNLBCfKAcOpaVs7orBMS/A8HWro6dIzNtTZIR05FAbJ3bioFOnZpuCew9Q== dependencies: - fast-safe-stringify "^2.0.6" + async "^2.5.0" + eth-query "^2.1.2" + eth-tx-summary "^3.1.2" + ethereumjs-block "^1.6.0" + ethereumjs-tx "^1.3.3" + ethereumjs-util "^5.1.2" + ethereumjs-vm "^2.1.0" + fetch-ponyfill "^4.0.0" + json-rpc-engine "^3.6.0" + json-rpc-error "^2.0.0" + json-stable-stringify "^1.0.1" + promise-to-callback "^1.0.0" + tape "^4.6.3" eth-lib@0.2.7: version "0.2.7" @@ -3299,7 +3737,7 @@ eth-lib@^0.1.26: ws "^3.0.0" xhr-request-promise "^0.1.2" -eth-query@^2.1.0, eth-query@^2.1.2: +eth-query@^2.0.2, eth-query@^2.1.0, eth-query@^2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/eth-query/-/eth-query-2.1.2.tgz#d6741d9000106b51510c72db92d6365456a6da5e" integrity sha1-1nQdkAAQa1FRDHLbktY2VFam2l4= @@ -3307,12 +3745,25 @@ eth-query@^2.1.0, eth-query@^2.1.2: json-rpc-random-id "^1.0.0" xtend "^4.0.1" -eth-rpc-errors@^3.0.0: +eth-sig-util@3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/eth-rpc-errors/-/eth-rpc-errors-3.0.0.tgz#d7b22653c70dbf9defd4ef490fd08fe70608ca10" - integrity sha512-iPPNHPrLwUlR9xCSYm7HHQjWBasor3+KZfRvwEWxMz3ca0yqnlBeJrnyphkGIXZ4J7AMAaOLmwy4AWhnxOiLxg== + resolved "https://registry.yarnpkg.com/eth-sig-util/-/eth-sig-util-3.0.0.tgz#75133b3d7c20a5731af0690c385e184ab942b97e" + integrity sha512-4eFkMOhpGbTxBQ3AMzVf0haUX2uTur7DpWiHzWyTURa28BVJJtOkcb9Ok5TV0YvEPG61DODPW7ZUATbJTslioQ== + dependencies: + buffer "^5.2.1" + elliptic "^6.4.0" + ethereumjs-abi "0.6.5" + ethereumjs-util "^5.1.1" + tweetnacl "^1.0.0" + tweetnacl-util "^0.15.0" + +eth-sig-util@^1.4.2: + version "1.4.2" + resolved "https://registry.yarnpkg.com/eth-sig-util/-/eth-sig-util-1.4.2.tgz#8d958202c7edbaae839707fba6f09ff327606210" + integrity sha1-jZWCAsftuq6Dlwf7pvCf8ydgYhA= dependencies: - fast-safe-stringify "^2.0.6" + ethereumjs-abi "git+https://github.com/ethereumjs/ethereumjs-abi.git" + ethereumjs-util "^5.1.1" eth-sig-util@^2.5.2: version "2.5.3" @@ -3326,6 +3777,22 @@ eth-sig-util@^2.5.2: tweetnacl "^1.0.0" tweetnacl-util "^0.15.0" +eth-tx-summary@^3.1.2: + version "3.2.4" + resolved "https://registry.yarnpkg.com/eth-tx-summary/-/eth-tx-summary-3.2.4.tgz#e10eb95eb57cdfe549bf29f97f1e4f1db679035c" + integrity sha512-NtlDnaVZah146Rm8HMRUNMgIwG/ED4jiqk0TME9zFheMl1jOp6jL1m0NKGjJwehXQ6ZKCPr16MTr+qspKpEXNg== + dependencies: + async "^2.1.2" + clone "^2.0.0" + concat-stream "^1.5.1" + end-of-stream "^1.1.0" + eth-query "^2.0.2" + ethereumjs-block "^1.4.1" + ethereumjs-tx "^1.1.1" + ethereumjs-util "^5.0.1" + ethereumjs-vm "^2.6.0" + through2 "^2.0.3" + ethashjs@~0.0.7: version "0.0.8" resolved "https://registry.yarnpkg.com/ethashjs/-/ethashjs-0.0.8.tgz#227442f1bdee409a548fb04136e24c874f3aa6f9" @@ -3374,22 +3841,16 @@ ethereum-cryptography@^0.1.2, ethereum-cryptography@^0.1.3: secp256k1 "^4.0.1" setimmediate "^1.0.5" -ethereum-ens@^0.8.0: - version "0.8.0" - resolved "https://registry.yarnpkg.com/ethereum-ens/-/ethereum-ens-0.8.0.tgz#6d0f79acaa61fdbc87d2821779c4e550243d4c57" - integrity sha512-a8cBTF4AWw1Q1Y37V1LSCS9pRY4Mh3f8vCg5cbXCCEJ3eno1hbI/+Ccv9SZLISYpqQhaglP3Bxb/34lS4Qf7Bg== +ethereum-waffle@^3.0.0: + version "3.2.1" + resolved "https://registry.yarnpkg.com/ethereum-waffle/-/ethereum-waffle-3.2.1.tgz#9d6d6b93484c5e1b77dfdeb646c050ed877e836e" + integrity sha512-Fhg7BaBuV+Xo5XT+NEC3UTKGunvpq+iQPglZbIAJF6ZcwQwkiKfJUDuB0ZSkg5ntbRS4gpahfoXj1nTzdtx8UA== dependencies: - bluebird "^3.4.7" - eth-ens-namehash "^2.0.0" - js-sha3 "^0.5.7" - pako "^1.0.4" - underscore "^1.8.3" - web3 "^1.0.0-beta.34" - -ethereum-protocol@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/ethereum-protocol/-/ethereum-protocol-1.0.1.tgz#b7d68142f4105e0ae7b5e178cf42f8d4dc4b93cf" - integrity sha512-3KLX1mHuEsBW0dKG+c6EOJS1NBNqdCICvZW9sInmZTt5aY0oxmHVggYRE0lJu1tcnMD1K+AKHdLi6U43Awm1Vg== + "@ethereum-waffle/chai" "^3.2.1" + "@ethereum-waffle/compiler" "^3.2.1" + "@ethereum-waffle/mock-contract" "^3.2.1" + "@ethereum-waffle/provider" "^3.2.1" + ethers "^5.0.1" ethereumjs-abi@0.6.5: version "0.6.5" @@ -3399,7 +3860,7 @@ ethereumjs-abi@0.6.5: bn.js "^4.10.0" ethereumjs-util "^4.3.0" -ethereumjs-abi@^0.6.8: +ethereumjs-abi@0.6.8, ethereumjs-abi@^0.6.8: version "0.6.8" resolved "https://registry.yarnpkg.com/ethereumjs-abi/-/ethereumjs-abi-0.6.8.tgz#71bc152db099f70e62f108b7cdfca1b362c6fcae" integrity sha512-Tx0r/iXI6r+lRsdvkFDlut0N08jWMnKRZ6Gkq+Nmw75lZe4e6o3EkSnkaBP5NF6+m5PTGAr9JP43N3LyeoglsA== @@ -3407,16 +3868,14 @@ ethereumjs-abi@^0.6.8: bn.js "^4.11.8" ethereumjs-util "^6.0.0" -ethereumjs-account@^2.0.3: - version "2.0.5" - resolved "https://registry.yarnpkg.com/ethereumjs-account/-/ethereumjs-account-2.0.5.tgz#eeafc62de544cb07b0ee44b10f572c9c49e00a84" - integrity sha512-bgDojnXGjhMwo6eXQC0bY6UK2liSFUSMwwylOmQvZbSl/D7NXQ3+vrGO46ZeOgjGfxXmgIeVNDIiHw7fNZM4VA== +"ethereumjs-abi@git+https://github.com/ethereumjs/ethereumjs-abi.git": + version "0.6.8" + resolved "git+https://github.com/ethereumjs/ethereumjs-abi.git#1ce6a1d64235fabe2aaf827fd606def55693508f" dependencies: - ethereumjs-util "^5.0.0" - rlp "^2.0.0" - safe-buffer "^5.1.1" + bn.js "^4.11.8" + ethereumjs-util "^6.0.0" -ethereumjs-account@^3.0.0: +ethereumjs-account@3.0.0, ethereumjs-account@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/ethereumjs-account/-/ethereumjs-account-3.0.0.tgz#728f060c8e0c6e87f1e987f751d3da25422570a9" integrity sha512-WP6BdscjiiPkQfF9PVfMcwx/rDvfZTjFKY0Uwc09zSQr9JfIVH87dYIJu0gNhBhpmovV4yq295fdllS925fnBA== @@ -3425,18 +3884,16 @@ ethereumjs-account@^3.0.0: rlp "^2.2.1" safe-buffer "^5.1.1" -ethereumjs-block@^1.2.2, ethereumjs-block@^1.6.0: - version "1.7.1" - resolved "https://registry.yarnpkg.com/ethereumjs-block/-/ethereumjs-block-1.7.1.tgz#78b88e6cc56de29a6b4884ee75379b6860333c3f" - integrity sha512-B+sSdtqm78fmKkBq78/QLKJbu/4Ts4P2KFISdgcuZUPDm9x+N7qgBPIIFUGbaakQh8bzuquiRVbdmvPKqbILRg== +ethereumjs-account@^2.0.3: + version "2.0.5" + resolved "https://registry.yarnpkg.com/ethereumjs-account/-/ethereumjs-account-2.0.5.tgz#eeafc62de544cb07b0ee44b10f572c9c49e00a84" + integrity sha512-bgDojnXGjhMwo6eXQC0bY6UK2liSFUSMwwylOmQvZbSl/D7NXQ3+vrGO46ZeOgjGfxXmgIeVNDIiHw7fNZM4VA== dependencies: - async "^2.0.1" - ethereum-common "0.2.0" - ethereumjs-tx "^1.2.2" ethereumjs-util "^5.0.0" - merkle-patricia-tree "^2.1.2" + rlp "^2.0.0" + safe-buffer "^5.1.1" -ethereumjs-block@^2.2.0, ethereumjs-block@^2.2.2, ethereumjs-block@~2.2.0, ethereumjs-block@~2.2.2: +ethereumjs-block@2.2.2, ethereumjs-block@^2.2.0, ethereumjs-block@^2.2.2, ethereumjs-block@~2.2.0, ethereumjs-block@~2.2.2: version "2.2.2" resolved "https://registry.yarnpkg.com/ethereumjs-block/-/ethereumjs-block-2.2.2.tgz#c7654be7e22df489fda206139ecd63e2e9c04965" integrity sha512-2p49ifhek3h2zeg/+da6XpdFR3GlqY3BIEiqxGF8j9aSRIgkb7M1Ky+yULBKJOu8PAZxfhsYA+HxUk2aCQp3vg== @@ -3447,6 +3904,17 @@ ethereumjs-block@^2.2.0, ethereumjs-block@^2.2.2, ethereumjs-block@~2.2.0, ether ethereumjs-util "^5.0.0" merkle-patricia-tree "^2.1.2" +ethereumjs-block@^1.2.2, ethereumjs-block@^1.4.1, ethereumjs-block@^1.6.0: + version "1.7.1" + resolved "https://registry.yarnpkg.com/ethereumjs-block/-/ethereumjs-block-1.7.1.tgz#78b88e6cc56de29a6b4884ee75379b6860333c3f" + integrity sha512-B+sSdtqm78fmKkBq78/QLKJbu/4Ts4P2KFISdgcuZUPDm9x+N7qgBPIIFUGbaakQh8bzuquiRVbdmvPKqbILRg== + dependencies: + async "^2.0.1" + ethereum-common "0.2.0" + ethereumjs-tx "^1.2.2" + ethereumjs-util "^5.0.0" + merkle-patricia-tree "^2.1.2" + ethereumjs-blockchain@^4.0.3: version "4.0.4" resolved "https://registry.yarnpkg.com/ethereumjs-blockchain/-/ethereumjs-blockchain-4.0.4.tgz#30f2228dc35f6dcf94423692a6902604ae34960f" @@ -3463,20 +3931,17 @@ ethereumjs-blockchain@^4.0.3: rlp "^2.2.2" semaphore "^1.1.0" +ethereumjs-common@1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/ethereumjs-common/-/ethereumjs-common-1.5.0.tgz#d3e82fc7c47c0cef95047f431a99485abc9bb1cd" + integrity sha512-SZOjgK1356hIY7MRj3/ma5qtfr/4B5BL+G4rP/XSMYr2z1H5el4RX5GReYCKmQmYI/nSBmRnwrZ17IfHuG0viQ== + ethereumjs-common@^1.1.0, ethereumjs-common@^1.3.2, ethereumjs-common@^1.5.0: version "1.5.2" resolved "https://registry.yarnpkg.com/ethereumjs-common/-/ethereumjs-common-1.5.2.tgz#2065dbe9214e850f2e955a80e650cb6999066979" integrity sha512-hTfZjwGX52GS2jcVO6E2sx4YuFnf0Fhp5ylo4pEPhEffNln7vS59Hr5sLnp3/QCazFLluuBZ+FZ6J5HTp0EqCA== -ethereumjs-tx@^1.0.0, ethereumjs-tx@^1.2.0, ethereumjs-tx@^1.2.2, ethereumjs-tx@^1.3.7: - version "1.3.7" - resolved "https://registry.yarnpkg.com/ethereumjs-tx/-/ethereumjs-tx-1.3.7.tgz#88323a2d875b10549b8347e09f4862b546f3d89a" - integrity sha512-wvLMxzt1RPhAQ9Yi3/HKZTn0FZYpnsmQdbKYfUUpi4j1SEIcbkd9tndVjcPrufY3V7j2IebOpC00Zp2P/Ay2kA== - dependencies: - ethereum-common "^0.0.18" - ethereumjs-util "^5.0.0" - -ethereumjs-tx@^2.1.1, ethereumjs-tx@^2.1.2: +ethereumjs-tx@2.1.2, ethereumjs-tx@^2.1.1, ethereumjs-tx@^2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/ethereumjs-tx/-/ethereumjs-tx-2.1.2.tgz#5dfe7688bf177b45c9a23f86cf9104d47ea35fed" integrity sha512-zZEK1onCeiORb0wyCXUvg94Ve5It/K6GD1K+26KfFKodiBiS6d9lfCXlUKGBBdQ+bv7Day+JK0tj1K+BeNFRAw== @@ -3484,6 +3949,14 @@ ethereumjs-tx@^2.1.1, ethereumjs-tx@^2.1.2: ethereumjs-common "^1.5.0" ethereumjs-util "^6.0.0" +ethereumjs-tx@^1.1.1, ethereumjs-tx@^1.2.0, ethereumjs-tx@^1.2.2, ethereumjs-tx@^1.3.3: + version "1.3.7" + resolved "https://registry.yarnpkg.com/ethereumjs-tx/-/ethereumjs-tx-1.3.7.tgz#88323a2d875b10549b8347e09f4862b546f3d89a" + integrity sha512-wvLMxzt1RPhAQ9Yi3/HKZTn0FZYpnsmQdbKYfUUpi4j1SEIcbkd9tndVjcPrufY3V7j2IebOpC00Zp2P/Ay2kA== + dependencies: + ethereum-common "^0.0.18" + ethereumjs-util "^5.0.0" + ethereumjs-util@6.2.0: version "6.2.0" resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-6.2.0.tgz#23ec79b2488a7d041242f01e25f24e5ad0357960" @@ -3521,7 +3994,7 @@ ethereumjs-util@^4.3.0: ethereum-cryptography "^0.1.3" rlp "^2.0.0" -ethereumjs-util@^5.0.0, ethereumjs-util@^5.1.1, ethereumjs-util@^5.1.2, ethereumjs-util@^5.1.5, ethereumjs-util@^5.2.0: +ethereumjs-util@^5.0.0, ethereumjs-util@^5.0.1, ethereumjs-util@^5.1.1, ethereumjs-util@^5.1.2, ethereumjs-util@^5.1.3, ethereumjs-util@^5.1.5, ethereumjs-util@^5.2.0: version "5.2.1" resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-5.2.1.tgz#a833f0e5fca7e5b361384dc76301a721f537bf65" integrity sha512-v3kT+7zdyCm1HIqWlLNrHGqHGLpGYIhjeHxQjnDXjLT2FyGJDsd3LWMYUo7pAFRrk86CR3nUJfhC81CCoJNNGQ== @@ -3546,7 +4019,28 @@ ethereumjs-util@^7.0.2: ethjs-util "0.1.6" rlp "^2.2.4" -ethereumjs-vm@^2.3.4, ethereumjs-vm@^2.6.0: +ethereumjs-vm@4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/ethereumjs-vm/-/ethereumjs-vm-4.2.0.tgz#e885e861424e373dbc556278f7259ff3fca5edab" + integrity sha512-X6qqZbsY33p5FTuZqCnQ4+lo957iUJMM6Mpa6bL4UW0dxM6WmDSHuI4j/zOp1E2TDKImBGCJA9QPfc08PaNubA== + dependencies: + async "^2.1.2" + async-eventemitter "^0.2.2" + core-js-pure "^3.0.1" + ethereumjs-account "^3.0.0" + ethereumjs-block "^2.2.2" + ethereumjs-blockchain "^4.0.3" + ethereumjs-common "^1.5.0" + ethereumjs-tx "^2.1.2" + ethereumjs-util "^6.2.0" + fake-merkle-patricia-tree "^1.0.1" + functional-red-black-tree "^1.0.1" + merkle-patricia-tree "^2.3.2" + rustbn.js "~0.2.0" + safe-buffer "^5.1.1" + util.promisify "^1.0.0" + +ethereumjs-vm@^2.1.0, ethereumjs-vm@^2.3.4, ethereumjs-vm@^2.6.0: version "2.6.0" resolved "https://registry.yarnpkg.com/ethereumjs-vm/-/ethereumjs-vm-2.6.0.tgz#76243ed8de031b408793ac33907fb3407fe400c6" integrity sha512-r/XIUik/ynGbxS3y+mvGnbOKnuLo40V5Mj1J25+HEO63aWYREIqvWeRO/hnROlMBE5WoniQmPmhiaN0ctiHaXw== @@ -3563,7 +4057,7 @@ ethereumjs-vm@^2.3.4, ethereumjs-vm@^2.6.0: rustbn.js "~0.2.0" safe-buffer "^5.1.1" -ethereumjs-wallet@^0.6.3: +ethereumjs-wallet@0.6.5: version "0.6.5" resolved "https://registry.yarnpkg.com/ethereumjs-wallet/-/ethereumjs-wallet-0.6.5.tgz#685e9091645cee230ad125c007658833991ed474" integrity sha512-MDwjwB9VQVnpp/Dc1XzA6J1a3wgHQ4hSvA1uWNatdpOrtCbPVuQSKSyRnjLvS0a+KKMw2pvQ9Ybqpb3+eW8oNA== @@ -3578,23 +4072,7 @@ ethereumjs-wallet@^0.6.3: utf8 "^3.0.0" uuid "^3.3.2" -ethers@4.0.0-beta.3: - version "4.0.0-beta.3" - resolved "https://registry.yarnpkg.com/ethers/-/ethers-4.0.0-beta.3.tgz#15bef14e57e94ecbeb7f9b39dd0a4bd435bc9066" - integrity sha512-YYPogooSknTwvHg3+Mv71gM/3Wcrx+ZpCzarBj3mqs9njjRkrOo2/eufzhHloOCo3JSoNI4TQJJ6yU5ABm3Uog== - dependencies: - "@types/node" "^10.3.2" - aes-js "3.0.0" - bn.js "^4.4.0" - elliptic "6.3.3" - hash.js "1.1.3" - js-sha3 "0.5.7" - scrypt-js "2.0.3" - setimmediate "1.0.4" - uuid "2.0.1" - xmlhttprequest "1.8.0" - -ethers@^4.0.0-beta.1, ethers@^4.0.20, ethers@^4.0.32, ethers@^4.0.40: +ethers@^4.0.32, ethers@^4.0.40: version "4.0.48" resolved "https://registry.yarnpkg.com/ethers/-/ethers-4.0.48.tgz#330c65b8133e112b0613156e57e92d9009d8fbbe" integrity sha512-sZD5K8H28dOrcidzx9f8KYh8083n5BexIO3+SbE4jK83L85FxtpXZBCQdXb8gkg+7sBqomcLhhkU7UHL+F7I2g== @@ -3609,14 +4087,41 @@ ethers@^4.0.0-beta.1, ethers@^4.0.20, ethers@^4.0.32, ethers@^4.0.40: uuid "2.0.1" xmlhttprequest "1.8.0" -ethjs-abi@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/ethjs-abi/-/ethjs-abi-0.2.1.tgz#e0a7a93a7e81163a94477bad56ede524ab6de533" - integrity sha1-4KepOn6BFjqUR3utVu3lJKtt5TM= - dependencies: - bn.js "4.11.6" - js-sha3 "0.5.5" - number-to-bn "1.7.0" +ethers@^5.0.0, ethers@^5.0.1, ethers@^5.0.26: + version "5.0.26" + resolved "https://registry.yarnpkg.com/ethers/-/ethers-5.0.26.tgz#ef43c6b6aad71f10c1a184003f69b142d7d03bae" + integrity sha512-MqA8Fvutn3qEW0yBJOHeV6KZmRpF2rqlL2B5058AGkUFsuu6j5Ns/FRlMsbGeQwBz801IB23jQp7vjRfFsKSkg== + dependencies: + "@ethersproject/abi" "5.0.10" + "@ethersproject/abstract-provider" "5.0.8" + "@ethersproject/abstract-signer" "5.0.11" + "@ethersproject/address" "5.0.9" + "@ethersproject/base64" "5.0.7" + "@ethersproject/basex" "5.0.7" + "@ethersproject/bignumber" "5.0.13" + "@ethersproject/bytes" "5.0.9" + "@ethersproject/constants" "5.0.8" + "@ethersproject/contracts" "5.0.9" + "@ethersproject/hash" "5.0.10" + "@ethersproject/hdnode" "5.0.8" + "@ethersproject/json-wallets" "5.0.10" + "@ethersproject/keccak256" "5.0.7" + "@ethersproject/logger" "5.0.8" + "@ethersproject/networks" "5.0.7" + "@ethersproject/pbkdf2" "5.0.7" + "@ethersproject/properties" "5.0.7" + "@ethersproject/providers" "5.0.19" + "@ethersproject/random" "5.0.7" + "@ethersproject/rlp" "5.0.7" + "@ethersproject/sha2" "5.0.7" + "@ethersproject/signing-key" "5.0.8" + "@ethersproject/solidity" "5.0.8" + "@ethersproject/strings" "5.0.8" + "@ethersproject/transactions" "5.0.9" + "@ethersproject/units" "5.0.9" + "@ethersproject/wallet" "5.0.10" + "@ethersproject/web" "5.0.12" + "@ethersproject/wordlists" "5.0.8" ethjs-unit@0.1.6: version "0.1.6" @@ -3634,25 +4139,6 @@ ethjs-util@0.1.6, ethjs-util@^0.1.3: is-hex-prefixed "1.0.0" strip-hex-prefix "1.0.0" -ethlint@^1.2.5: - version "1.2.5" - resolved "https://registry.yarnpkg.com/ethlint/-/ethlint-1.2.5.tgz#375b77d1e5971e7c574037e07ff7ddad8e17858f" - integrity sha512-x2nKK98zmd72SFWL3Ul1S6scWYf5QqG221N6/mFNMO661g7ASvTRINGIWVvHzsvflW6y4tvgMSjnTN5RCTuZug== - dependencies: - ajv "^5.2.2" - chokidar "^1.6.0" - colors "^1.1.2" - commander "^2.9.0" - diff "^3.5.0" - eol "^0.9.1" - js-string-escape "^1.0.1" - lodash "^4.14.2" - sol-digger "0.0.2" - sol-explore "1.6.1" - solium-plugin-security "0.1.1" - solparse "2.2.8" - text-table "^0.2.0" - event-emitter@^0.3.5: version "0.3.5" resolved "https://registry.yarnpkg.com/event-emitter/-/event-emitter-0.3.5.tgz#df8c69eef1647923c7157b9ce83840610b02cc39" @@ -3694,19 +4180,6 @@ evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: md5.js "^1.3.4" safe-buffer "^5.1.1" -execa@^0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/execa/-/execa-0.7.0.tgz#944becd34cc41ee32a63a9faf27ad5a65fc59777" - integrity sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c= - dependencies: - cross-spawn "^5.0.1" - get-stream "^3.0.0" - is-stream "^1.1.0" - npm-run-path "^2.0.0" - p-finally "^1.0.0" - signal-exit "^3.0.0" - strip-eof "^1.0.0" - execa@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/execa/-/execa-1.0.0.tgz#c6236a5bb4df6d6f15e88e7f017798216749ddd8" @@ -3720,13 +4193,6 @@ execa@^1.0.0: signal-exit "^3.0.0" strip-eof "^1.0.0" -expand-brackets@^0.1.4: - version "0.1.5" - resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-0.1.5.tgz#df07284e342a807cd733ac5af72411e581d1177b" - integrity sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s= - dependencies: - is-posix-bracket "^0.1.0" - expand-brackets@^2.1.4: version "2.1.4" resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" @@ -3740,13 +4206,6 @@ expand-brackets@^2.1.4: snapdragon "^0.8.1" to-regex "^3.0.1" -expand-range@^1.8.1: - version "1.8.2" - resolved "https://registry.yarnpkg.com/expand-range/-/expand-range-1.8.2.tgz#a299effd335fe2721ebae8e257ec79644fc85337" - integrity sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc= - dependencies: - fill-range "^2.1.0" - express@^4.14.0: version "4.17.1" resolved "https://registry.yarnpkg.com/express/-/express-4.17.1.tgz#4491fc38605cf51f8629d39c2b5d026f98a4c134" @@ -3819,13 +4278,6 @@ external-editor@^3.0.3: iconv-lite "^0.4.24" tmp "^0.0.33" -extglob@^0.3.1: - version "0.3.2" - resolved "https://registry.yarnpkg.com/extglob/-/extglob-0.3.2.tgz#2e18ff3d2f49ab2765cec9023f011daa8d8349a1" - integrity sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE= - dependencies: - is-extglob "^1.0.0" - extglob@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" @@ -3857,20 +4309,20 @@ fake-merkle-patricia-tree@^1.0.1: dependencies: checkpoint-store "^1.1.0" -fast-deep-equal@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz#c053477817c86b51daa853c81e059b733d023614" - integrity sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ= - fast-deep-equal@^3.1.1: version "3.1.3" resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== -fast-glob@^3.0.3: - version "3.2.4" - resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.4.tgz#d20aefbf99579383e7f3cc66529158c9b98554d3" - integrity sha512-kr/Oo6PX51265qeuCYsyGypiO5uJFgBS0jksyG7FUeCyQzNwYnzrNIMR1NXfkZXsMYXYLRAHgISHBz8gQcxKHQ== +fast-diff@^1.1.2: + version "1.2.0" + resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.2.0.tgz#73ee11982d86caaf7959828d519cfe927fac5f03" + integrity sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w== + +fast-glob@^3.0.3, fast-glob@^3.1.1: + version "3.2.5" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.5.tgz#7939af2a656de79a4f1901903ee8adcaa7cb9661" + integrity sha512-2DtFcgT68wiTTiwZ2hNdJfcHNke9XOfnwmBRWXhmeKM8rF0TGwmC/Qto3S7RoZKp5cilZbxzO5iTNTQsJ+EeDg== dependencies: "@nodelib/fs.stat" "^2.0.2" "@nodelib/fs.walk" "^1.2.3" @@ -3884,30 +4336,18 @@ fast-json-stable-stringify@^2.0.0: resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== -fast-levenshtein@~2.0.6: +fast-levenshtein@^2.0.6, fast-levenshtein@~2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= -fast-safe-stringify@^2.0.6: - version "2.0.7" - resolved "https://registry.yarnpkg.com/fast-safe-stringify/-/fast-safe-stringify-2.0.7.tgz#124aa885899261f68aedb42a7c080de9da608743" - integrity sha512-Utm6CdzT+6xsDk2m8S6uL8VHxNwI6Jub+e9NYTcAms28T84pTa25GJQV9j0CY0N1rM8hK4x6grpF2BQf+2qwVA== - fastq@^1.6.0: - version "1.9.0" - resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.9.0.tgz#e16a72f338eaca48e91b5c23593bcc2ef66b7947" - integrity sha512-i7FVWL8HhVY+CTkwFxkN2mk3h+787ixS5S63eb78diVRc1MCssarHq3W5cj0av7YDSwmaV928RNag+U1etRQ7w== + version "1.10.0" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.10.0.tgz#74dbefccade964932cdf500473ef302719c652bb" + integrity sha512-NL2Qc5L3iQEsyYzweq7qfgy5OtXCmGzGvhElGEd/SoFWEMOEczNh5s5ocaF01HDetxz+p8ecjNPA6cZxxIHmzA== dependencies: reusify "^1.0.4" -fd-slicer@~1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/fd-slicer/-/fd-slicer-1.1.0.tgz#25c7c89cb1f9077f8891bbe61d8f390eae256f1e" - integrity sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4= - dependencies: - pend "~1.2.0" - fetch-ponyfill@^4.0.0: version "4.1.0" resolved "https://registry.yarnpkg.com/fetch-ponyfill/-/fetch-ponyfill-4.1.0.tgz#ae3ce5f732c645eab87e4ae8793414709b239893" @@ -3915,10 +4355,10 @@ fetch-ponyfill@^4.0.0: dependencies: node-fetch "~1.7.1" -figures@^3.0.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/figures/-/figures-3.2.0.tgz#625c18bd293c604dc4a8ddb2febf0c88341746af" - integrity sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg== +figures@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962" + integrity sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI= dependencies: escape-string-regexp "^1.0.5" @@ -3929,42 +4369,18 @@ file-entry-cache@^5.0.1: dependencies: flat-cache "^2.0.1" -file-type@^3.8.0: - version "3.9.0" - resolved "https://registry.yarnpkg.com/file-type/-/file-type-3.9.0.tgz#257a078384d1db8087bc449d107d52a52672b9e9" - integrity sha1-JXoHg4TR24CHvESdEH1SpSZyuek= - -file-type@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/file-type/-/file-type-5.2.0.tgz#2ddbea7c73ffe36368dfae49dc338c058c2b8ad6" - integrity sha1-LdvqfHP/42No365J3DOMBYwritY= - -file-type@^6.1.0: - version "6.2.0" - resolved "https://registry.yarnpkg.com/file-type/-/file-type-6.2.0.tgz#e50cd75d356ffed4e306dc4f5bcf52a79903a919" - integrity sha512-YPcTBDV+2Tm0VqjybVd32MHdlEGAtuxS3VAYsumFokDSMG+ROT5wawGlnHDoz7bfMcMDt9hxuXvXwoKUx2fkOg== +file-entry-cache@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.0.tgz#7921a89c391c6d93efec2169ac6bf300c527ea0a" + integrity sha512-fqoO76jZ3ZnYrXLDRxBR1YvOvc0k844kcOg40bgsPrE25LAb/PDqTY+ho64Xh2c8ZXgIKldchCFHczG2UVRcWA== + dependencies: + flat-cache "^3.0.4" file-uri-to-path@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd" integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw== -filename-regex@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.1.tgz#c1c4b9bee3e09725ddb106b75c1e301fe2f18b26" - integrity sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY= - -fill-range@^2.1.0: - version "2.2.4" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.4.tgz#eb1e773abb056dcd8df2bfdf6af59b8b3a936565" - integrity sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q== - dependencies: - is-number "^2.1.0" - isobject "^2.0.0" - randomatic "^3.0.0" - repeat-element "^1.1.2" - repeat-string "^1.5.2" - fill-range@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" @@ -4010,6 +4426,22 @@ find-up@3.0.0, find-up@^3.0.0: dependencies: locate-path "^3.0.0" +find-up@5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" + integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== + dependencies: + locate-path "^6.0.0" + path-exists "^4.0.0" + +find-up@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f" + integrity sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8= + dependencies: + path-exists "^2.0.0" + pinkie-promise "^2.0.0" + find-up@^2.0.0, find-up@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" @@ -4017,13 +4449,13 @@ find-up@^2.0.0, find-up@^2.1.0: dependencies: locate-path "^2.0.0" -find-up@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" - integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== +find-yarn-workspace-root@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/find-yarn-workspace-root/-/find-yarn-workspace-root-1.2.1.tgz#40eb8e6e7c2502ddfaa2577c176f221422f860db" + integrity sha512-dVtfb0WuQG+8Ag2uWkbG79hOUzEsRrhBzgfn86g2sJPkzmcpGdghbNTfUKGTxymFrY/tLIodDzLoW9nOJ4FY8Q== dependencies: - locate-path "^5.0.0" - path-exists "^4.0.0" + fs-extra "^4.0.3" + micromatch "^3.1.4" flat-cache@^2.0.1: version "2.0.1" @@ -4034,6 +4466,14 @@ flat-cache@^2.0.1: rimraf "2.6.3" write "1.0.3" +flat-cache@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.0.4.tgz#61b0338302b2fe9f957dcc32fc2a87f1c3048b11" + integrity sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg== + dependencies: + flatted "^3.1.0" + rimraf "^3.0.2" + flat@^4.1.0: version "4.1.1" resolved "https://registry.yarnpkg.com/flat/-/flat-4.1.1.tgz#a392059cc382881ff98642f5da4dde0a959f309b" @@ -4041,40 +4481,43 @@ flat@^4.1.0: dependencies: is-buffer "~2.0.3" +flat@^5.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241" + integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== + flatted@^2.0.0: version "2.0.2" resolved "https://registry.yarnpkg.com/flatted/-/flatted-2.0.2.tgz#4575b21e2bcee7434aa9be662f4b7b5f9c2b5138" integrity sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA== +flatted@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.1.1.tgz#c4b489e80096d9df1dfc97c79871aea7c617c469" + integrity sha512-zAoAQiudy+r5SvnSw3KJy5os/oRJYHzrzja/tBDqrZtNhUw8bt6y8OBzMWcjWr+8liV8Eb6yOhw8WZ7VFZ5ZzA== + flow-stoplight@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/flow-stoplight/-/flow-stoplight-1.0.0.tgz#4a292c5bcff8b39fa6cc0cb1a853d86f27eeff7b" integrity sha1-SiksW8/4s5+mzAyxqFPYbyfu/3s= -follow-redirects@1.5.10: - version "1.5.10" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.5.10.tgz#7b7a9f9aea2fdff36786a94ff643ed07f4ff5e2a" - integrity sha512-0V5l4Cizzvqt5D44aTXbFZz+FtyXV1vrDN6qrelxtfYQKW0KO0W2T/hkE8xvGa/540LkZlkaUjO4ailYTFtHVQ== - dependencies: - debug "=3.1.0" - follow-redirects@^1.10.0, follow-redirects@^1.12.1: - version "1.13.0" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.13.0.tgz#b42e8d93a2a7eea5ed88633676d6597bc8e384db" - integrity sha512-aq6gF1BEKje4a9i9+5jimNFIpq4Q1WiwBToeRK5NvZBd/TRsmW8BsJfOEGkr76TbOyPVD3OVDN910EcUNtRYEA== + version "1.13.1" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.13.1.tgz#5f69b813376cee4fd0474a3aba835df04ab763b7" + integrity sha512-SSG5xmZh1mkPGyKzjZP8zLjltIfpW32Y5QpdNJyjcfGxK3qo3NDDkZOZSFiGn1A6SclQxY9GzEwAHQ3dmYRWpg== -for-in@^1.0.1, for-in@^1.0.2: +for-each@^0.3.3, for-each@~0.3.3: + version "0.3.3" + resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" + integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw== + dependencies: + is-callable "^1.1.3" + +for-in@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA= -for-own@^0.1.4: - version "0.1.5" - resolved "https://registry.yarnpkg.com/for-own/-/for-own-0.1.5.tgz#5265c681a4f294dabbf17c9509b6763aa84510ce" - integrity sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4= - dependencies: - for-in "^1.0.1" - forever-agent@~0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" @@ -4089,6 +4532,15 @@ form-data@^2.2.0: combined-stream "^1.0.6" mime-types "^2.1.12" +form-data@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-3.0.0.tgz#31b7e39c85f1355b7139ee0c647cf0de7f83c682" + integrity sha512-CKMFDglpbMi6PyN+brwB9Q/GOw0eAnsrEZDgcsH5Krhz5Od/haKHAX0NmQfha2zPPz0JpWzA7GJHGSnvCRLWsg== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.8" + mime-types "^2.1.12" + form-data@~2.3.2: version "2.3.3" resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" @@ -4125,11 +4577,6 @@ fresh@0.5.2: resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac= -fs-constants@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad" - integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow== - fs-extra@^0.30.0: version "0.30.0" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-0.30.0.tgz#f233ffcc08d4da7d432daa449776989db1df93f0" @@ -4141,7 +4588,7 @@ fs-extra@^0.30.0: path-is-absolute "^1.0.0" rimraf "^2.2.8" -fs-extra@^4.0.2: +fs-extra@^4.0.2, fs-extra@^4.0.3: version "4.0.3" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-4.0.3.tgz#0d852122e5bc5beb453fb028e9c0c9bf36340c94" integrity sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg== @@ -4169,14 +4616,14 @@ fs-extra@^8.0.1, fs-extra@^8.1.0: universalify "^0.1.0" fs-extra@^9.0.1: - version "9.0.1" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.0.1.tgz#910da0062437ba4c39fedd863f1675ccfefcb9fc" - integrity sha512-h2iAoN838FqAFJY2/qVpzFXy+EBxfVE220PalAqQLDVsFOHLJrZvut5puAbCdNv6WJk+B8ihI+k0c7JK5erwqQ== + version "9.1.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.1.0.tgz#5954460c764a8da2094ba3554bf839e6b9a7c86d" + integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ== dependencies: at-least-node "^1.0.0" graceful-fs "^4.2.0" jsonfile "^6.0.1" - universalify "^1.0.0" + universalify "^2.0.0" fs-minipass@^1.2.5: version "1.2.7" @@ -4195,20 +4642,17 @@ fs.realpath@^1.0.0: resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= -fsevents@^1.0.0: - version "1.2.13" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.13.tgz#f325cb0455592428bcf11b383370ef70e3bfcc38" - integrity sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw== - dependencies: - bindings "^1.5.0" - nan "^2.12.1" - fsevents@~2.1.1, fsevents@~2.1.2: version "2.1.3" resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.1.3.tgz#fb738703ae8d2f9fe900c33836ddebee8b97f23e" integrity sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ== -function-bind@^1.1.1: +fsevents@~2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.1.tgz#b209ab14c61012636c8863507edf7fb68cc54e9f" + integrity sha512-YR47Eg4hChJGAB1O3yEAOkGO+rlzutoICGqGo9EZ4lKWokzZRSyIW1QmTzqjtw8MJdj9srP869CuWw/hyzSiBw== + +function-bind@^1.1.1, function-bind@~1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== @@ -4219,14 +4663,51 @@ functional-red-black-tree@^1.0.1, functional-red-black-tree@~1.0.1: integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= ganache-cli@^6.11.0: - version "6.12.1" - resolved "https://registry.yarnpkg.com/ganache-cli/-/ganache-cli-6.12.1.tgz#148cf6541494ef1691bd68a77e4414981910cb3e" - integrity sha512-zoefZLQpQyEJH9jgtVYgM+ENFLAC9iwys07IDCsju2Ieq9KSTLH89RxSP4bhizXKV/h/+qaWpfyCBGWnBfqgIQ== + version "6.12.2" + resolved "https://registry.yarnpkg.com/ganache-cli/-/ganache-cli-6.12.2.tgz#c0920f7db0d4ac062ffe2375cb004089806f627a" + integrity sha512-bnmwnJDBDsOWBUP8E/BExWf85TsdDEFelQSzihSJm9VChVO1SHp94YXLP5BlA4j/OTxp0wR4R1Tje9OHOuAJVw== dependencies: ethereumjs-util "6.2.1" source-map-support "0.5.12" yargs "13.2.4" +ganache-core@^2.10.2: + version "2.13.2" + resolved "https://registry.yarnpkg.com/ganache-core/-/ganache-core-2.13.2.tgz#27e6fc5417c10e6e76e2e646671869d7665814a3" + integrity sha512-tIF5cR+ANQz0+3pHWxHjIwHqFXcVo0Mb+kcsNhglNFALcYo49aQpnS9dqHartqPfMFjiHh/qFoD3mYK0d/qGgw== + dependencies: + abstract-leveldown "3.0.0" + async "2.6.2" + bip39 "2.5.0" + cachedown "1.0.0" + clone "2.1.2" + debug "3.2.6" + encoding-down "5.0.4" + eth-sig-util "3.0.0" + ethereumjs-abi "0.6.8" + ethereumjs-account "3.0.0" + ethereumjs-block "2.2.2" + ethereumjs-common "1.5.0" + ethereumjs-tx "2.1.2" + ethereumjs-util "6.2.1" + ethereumjs-vm "4.2.0" + heap "0.2.6" + keccak "3.0.1" + level-sublevel "6.6.4" + levelup "3.1.1" + lodash "4.17.20" + lru-cache "5.1.1" + merkle-patricia-tree "3.0.0" + patch-package "6.2.2" + seedrandom "3.0.1" + source-map-support "0.5.12" + tmp "0.1.0" + web3-provider-engine "14.2.1" + websocket "1.0.32" + optionalDependencies: + ethereumjs-wallet "0.6.5" + web3 "1.2.11" + get-caller-file@^1.0.1: version "1.0.3" resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.3.tgz#f978fa4c90d1dfe7ff2d6beda2a515e713bdcf4a" @@ -4242,10 +4723,10 @@ get-func-name@^2.0.0: resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.0.tgz#ead774abee72e20409433a066366023dd6887a41" integrity sha1-6td0q+5y4gQJQzoGY2YCPdaIekE= -get-intrinsic@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.0.1.tgz#94a9768fcbdd0595a1c9273aacf4c89d075631be" - integrity sha512-ZnWP+AmS1VUaLgTRy47+zKtjTxz+0xMpx3I52i+aalBK1QP19ggLF3Db89KJX7kjfOfP2eoa01qc++GwPgufPg== +get-intrinsic@^1.0.1, get-intrinsic@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.0.2.tgz#6820da226e50b24894e08859469dc68361545d49" + integrity sha512-aeX0vrFm21ILl3+JpFFRNe9aUvp6VFZb2/CTbgLb8j75kOhvoNYjt9d8KA/tJG4gSo8nzEDedRl0h7vDmBYRVg== dependencies: function-bind "^1.1.1" has "^1.0.3" @@ -4256,19 +4737,6 @@ get-port@^3.1.0: resolved "https://registry.yarnpkg.com/get-port/-/get-port-3.2.0.tgz#dd7ce7de187c06c8bf353796ac71e099f0980ebc" integrity sha1-3Xzn3hh8Bsi/NTeWrHHgmfCYDrw= -get-stdin@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-6.0.0.tgz#9e09bf712b360ab9225e812048f71fde9c89657b" - integrity sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g== - -get-stream@^2.2.0: - version "2.3.1" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-2.3.1.tgz#5f38f93f346009666ee0150a054167f91bdd95de" - integrity sha1-Xzj5PzRgCWZu4BUKBUFn+Rvdld4= - dependencies: - object-assign "^4.0.1" - pinkie-promise "^2.0.0" - get-stream@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" @@ -4308,21 +4776,6 @@ ghost-testrpc@^0.0.2: chalk "^2.4.2" node-emoji "^1.10.0" -glob-base@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/glob-base/-/glob-base-0.3.0.tgz#dbb164f6221b1c0b1ccf82aea328b497df0ea3c4" - integrity sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q= - dependencies: - glob-parent "^2.0.0" - is-glob "^2.0.0" - -glob-parent@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-2.0.0.tgz#81383d72db054fcccf5336daa902f182f6edbb28" - integrity sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg= - dependencies: - is-glob "^2.0.0" - glob-parent@^5.0.0, glob-parent@^5.1.0, glob-parent@~5.1.0: version "5.1.1" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.1.tgz#b6c1ef417c4e5663ea498f1c45afac6916bbc229" @@ -4330,10 +4783,10 @@ glob-parent@^5.0.0, glob-parent@^5.1.0, glob-parent@~5.1.0: dependencies: is-glob "^4.0.1" -glob@7.1.2: - version "7.1.2" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15" - integrity sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ== +glob@7.1.3: + version "7.1.3" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.3.tgz#3960832d3f1574108342dafd3a67b332c0969df1" + integrity sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ== dependencies: fs.realpath "^1.0.0" inflight "^1.0.4" @@ -4342,10 +4795,10 @@ glob@7.1.2: once "^1.3.0" path-is-absolute "^1.0.0" -glob@7.1.3: - version "7.1.3" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.3.tgz#3960832d3f1574108342dafd3a67b332c0969df1" - integrity sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ== +glob@7.1.6, glob@^7.0.0, glob@^7.1.2, glob@^7.1.3, glob@~7.1.6: + version "7.1.6" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" + integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== dependencies: fs.realpath "^1.0.0" inflight "^1.0.4" @@ -4365,18 +4818,6 @@ glob@^5.0.15: once "^1.3.0" path-is-absolute "^1.0.0" -glob@^7.0.0, glob@^7.1.2, glob@^7.1.3, glob@^7.1.6: - version "7.1.6" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" - integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.0.4" - once "^1.3.0" - path-is-absolute "^1.0.0" - global-modules@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-2.0.0.tgz#997605ad2345f27f51539bea26574421215c7780" @@ -4393,13 +4834,18 @@ global-prefix@^3.0.0: kind-of "^6.0.2" which "^1.3.1" -global@~4.3.0: - version "4.3.2" - resolved "https://registry.yarnpkg.com/global/-/global-4.3.2.tgz#e76989268a6c74c38908b1305b10fc0e394e9d0f" - integrity sha1-52mJJopsdMOJCLEwWxD8DjlOnQ8= +global@~4.4.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/global/-/global-4.4.0.tgz#3e7b105179006a323ed71aafca3e9c57a5cc6406" + integrity sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w== dependencies: min-document "^2.19.0" - process "~0.5.1" + process "^0.11.10" + +globals@^11.7.0: + version "11.12.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" + integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== globals@^12.1.0: version "12.4.0" @@ -4408,6 +4854,11 @@ globals@^12.1.0: dependencies: type-fest "^0.8.1" +globals@^9.18.0: + version "9.18.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a" + integrity sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ== + globby@^10.0.1: version "10.0.2" resolved "https://registry.yarnpkg.com/globby/-/globby-10.0.2.tgz#277593e745acaa4646c3ab411289ec47a0392543" @@ -4422,6 +4873,18 @@ globby@^10.0.1: merge2 "^1.2.3" slash "^3.0.0" +globby@^11.0.1: + version "11.0.2" + resolved "https://registry.yarnpkg.com/globby/-/globby-11.0.2.tgz#1af538b766a3b540ebfb58a32b2e2d5897321d83" + integrity sha512-2ZThXDvvV8fYFRVIxnrMQBipZQDr7MxKAmQK1vujaj9/7eF0efG7BPUKJ7jP7G5SLF37xKDXvO4S/KKLj/Z0og== + dependencies: + array-union "^2.1.0" + dir-glob "^3.0.1" + fast-glob "^3.1.1" + ignore "^5.1.4" + merge2 "^1.3.0" + slash "^3.0.0" + got@9.6.0: version "9.6.0" resolved "https://registry.yarnpkg.com/got/-/got-9.6.0.tgz#edf45e7d67f99545705de1f7bbeeeb121765ed85" @@ -4459,16 +4922,11 @@ got@^7.1.0: url-parse-lax "^1.0.0" url-to-options "^1.0.1" -graceful-fs@^4.1.10, graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.1.9, graceful-fs@^4.2.0: +graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.1.9, graceful-fs@^4.2.0: version "4.2.4" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.4.tgz#2256bde14d3632958c465ebc96dc467ca07a29fb" integrity sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw== -growl@1.10.3: - version "1.10.3" - resolved "https://registry.yarnpkg.com/growl/-/growl-1.10.3.tgz#1926ba90cf3edfe2adb4927f5880bc22c66c790f" - integrity sha512-hKlsbA5Vu3xsh1Cg3J7jSmX/WaW6A5oBeqzM88oNbCRQFz+zUaXm6yxS4RVytp1scBoJzSYl4YAEOQIt6O8V1Q== - growl@1.10.5: version "1.10.5" resolved "https://registry.yarnpkg.com/growl/-/growl-1.10.5.tgz#f2735dc2283674fa67478b10181059355c369e5e" @@ -4500,25 +4958,26 @@ har-validator@~5.1.3: har-schema "^2.0.0" hardhat-gas-reporter@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/hardhat-gas-reporter/-/hardhat-gas-reporter-1.0.1.tgz#37f96da5f11e5ae34b28a68c5d972d3168165c95" - integrity sha512-YC+SCYIkBdRtISNbisU2BwDSelUdCrIKRsJXt3M9Jw1VF5CmtSZb8VuuOc2Zl4AMcEV2jEy6ZuAksYomPiApYQ== + version "1.0.4" + resolved "https://registry.yarnpkg.com/hardhat-gas-reporter/-/hardhat-gas-reporter-1.0.4.tgz#59e3137e38e0dfeac2e4f90d5c74160b50ad4829" + integrity sha512-G376zKh81G3K9WtDA+SoTLWsoygikH++tD1E7llx+X7J+GbIqfwhDKKgvJjcnEesMrtR9UqQHK02lJuXY1RTxw== dependencies: - eth-gas-reporter "^0.2.19" + eth-gas-reporter "^0.2.20" + sha1 "^1.1.1" -hardhat-typechain@^0.3.3: +hardhat-typechain@0.3.3: version "0.3.3" resolved "https://registry.yarnpkg.com/hardhat-typechain/-/hardhat-typechain-0.3.3.tgz#cef7996d2054aecd5e6b7677130b2f2b1fe9d352" integrity sha512-NrqP7Zng28prV3YT0lXoo1pXtZxoNCMfiZIWkf1HXjjID42JLLfSOTsvlb0okDMpz4tJaEEkgADJO69sKZxw+Q== -hardhat@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/hardhat/-/hardhat-2.0.3.tgz#35e07060d9854d4182f201aeaa1c05316bd7e4d3" - integrity sha512-mDygAl+1qd5KBdXQBfc3R5XmC/rVdYYbEuOTSQY3rlncVu9gfockZVDsHtAMPw/FiBIRMApLcOceK7D1XQmHRw== +hardhat@^2.0.8: + version "2.0.8" + resolved "https://registry.yarnpkg.com/hardhat/-/hardhat-2.0.8.tgz#6ec232293dd6b3ca7baeadb095ba4afce4b9b2e0" + integrity sha512-2tDAtOfshrBzP103dx7PQrhTwv2sqjhQStZAPwkkQTic25o2EH6HYE2++LuOG98YwqSjr0WvhvdBvKl3dCSkYA== dependencies: "@nomiclabs/ethereumjs-vm" "^4.1.1" "@sentry/node" "^5.18.1" - "@solidity-parser/parser" "^0.7.1" + "@solidity-parser/parser" "^0.11.0" "@types/bn.js" "^4.11.5" "@types/lru-cache" "^5.1.0" abort-controller "^3.0.0" @@ -4561,16 +5020,18 @@ hardhat@^2.0.3: uuid "^3.3.2" ws "^7.2.1" +has-ansi@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" + integrity sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE= + dependencies: + ansi-regex "^2.0.0" + has-flag@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa" integrity sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo= -has-flag@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-2.0.0.tgz#e8207af1cc7b30d446cc70b734b5e8be18f88d51" - integrity sha1-6CB68cx7MNRGzHC3NLXovhj4jVE= - has-flag@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" @@ -4629,7 +5090,7 @@ has-values@^1.0.0: is-number "^3.0.0" kind-of "^4.0.0" -has@^1.0.3: +has@^1.0.3, has@~1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== @@ -4661,25 +5122,15 @@ hash.js@^1.0.0, hash.js@^1.0.3, hash.js@^1.1.7: inherits "^2.0.3" minimalistic-assert "^1.0.1" -he@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/he/-/he-1.1.1.tgz#93410fd21b009735151f8868c2f271f3427e23fd" - integrity sha1-k0EP0hsAlzUVH4howvJx80J+I/0= - -he@1.2.0, he@^1.1.1: +he@1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== -highlight.js@^9.12.0, highlight.js@^9.15.8: - version "9.18.5" - resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-9.18.5.tgz#d18a359867f378c138d6819edfc2a8acd5f29825" - integrity sha512-a5bFyofd/BHCX52/8i8uJkjr9DYwXIPnM/plwI6W7ezItLGqzt7X2G2nXuYSfsIJdkwwj/g9DG1LkcGJI/dDoA== - -highlightjs-solidity@^1.0.18, highlightjs-solidity@^1.0.19: - version "1.0.19" - resolved "https://registry.yarnpkg.com/highlightjs-solidity/-/highlightjs-solidity-1.0.19.tgz#a2f05bcfadd295a8eefb9cc20dcb18a3ba48e49c" - integrity sha512-ZIzMlxZxkcNnzWC1LeOeUjQjywzXnGyDxexOPKzz8hWFqdE2uRvz1BxD0joOkr41z4SU2ABXVGDx6EWlbzTBLQ== +heap@0.2.6: + version "0.2.6" + resolved "https://registry.yarnpkg.com/heap/-/heap-0.2.6.tgz#087e1f10b046932fc8594dd9e6d378afc9d1e5ac" + integrity sha1-CH4fELBGky/IWU3Z5tN4r8nR5aw= hmac-drbg@^1.0.0: version "1.0.1" @@ -4690,23 +5141,19 @@ hmac-drbg@^1.0.0: minimalistic-assert "^1.0.0" minimalistic-crypto-utils "^1.0.1" +home-or-tmp@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/home-or-tmp/-/home-or-tmp-2.0.0.tgz#e36c3f2d2cae7d746a857e38d18d5f32a7882db8" + integrity sha1-42w/LSyufXRqhX440Y1fMqeILbg= + dependencies: + os-homedir "^1.0.0" + os-tmpdir "^1.0.1" + hosted-git-info@^2.1.4, hosted-git-info@^2.6.0: version "2.8.8" resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.8.tgz#7539bd4bc1e0e0a895815a2e0262420b12858488" integrity sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg== -htmlparser2@^3.9.1: - version "3.10.1" - resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-3.10.1.tgz#bd679dc3f59897b6a34bb10749c855bb53a9392f" - integrity sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ== - dependencies: - domelementtype "^1.3.1" - domhandler "^2.3.0" - domutils "^1.5.1" - entities "^1.1.1" - inherits "^2.0.1" - readable-stream "^3.1.1" - http-basic@^8.1.1: version "8.1.3" resolved "https://registry.yarnpkg.com/http-basic/-/http-basic-8.1.3.tgz#a7cabee7526869b9b710136970805b1004261bbf" @@ -4774,9 +5221,9 @@ https-proxy-agent@^5.0.0: debug "4" humanize-duration@^3.21.0: - version "3.24.0" - resolved "https://registry.yarnpkg.com/humanize-duration/-/humanize-duration-3.24.0.tgz#d851ca6fb93277e30ad789e88bd2019655f514c1" - integrity sha512-B3udnqisaDeRsvUSb+5n2hjxhABI9jotB+i1IEhgHhguTeM5LxIUKoVIu7UpeyaPOygr/Fnv7UhOi45kYYG+tg== + version "3.25.1" + resolved "https://registry.yarnpkg.com/humanize-duration/-/humanize-duration-3.25.1.tgz#50e12bf4b3f515ec91106107ee981e8cfe955d6f" + integrity sha512-P+dRo48gpLgc2R9tMRgiDRNULPKCmqFYgguwqOO2C0fjO35TgdURDQDANSR1Nt92iHlbHGMxOTnsB8H8xnMa2Q== iconv-lite@0.4.24, iconv-lite@^0.4.24: version "0.4.24" @@ -4809,7 +5256,7 @@ ignore@^4.0.6: resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== -ignore@^5.1.1: +ignore@^5.1.1, ignore@^5.1.4: version "5.1.8" resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.8.tgz#f150a8b50a34289b33e22f5889abd4d8016f0e57" integrity sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw== @@ -4829,10 +5276,18 @@ immutable@^4.0.0-rc.12: resolved "https://registry.yarnpkg.com/immutable/-/immutable-4.0.0-rc.12.tgz#ca59a7e4c19ae8d9bf74a97bdf0f6e2f2a5d0217" integrity sha512-0M2XxkZLx/mi3t8NVwIm1g8nHoEmM9p9UBl/G9k4+hm0kBgOVdMV/B3CY5dQ8qG8qc80NN4gDV4HQv6FTJ5q7A== -import-fresh@^3.0.0: - version "3.2.2" - resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.2.2.tgz#fc129c160c5d68235507f4331a6baad186bdbc3e" - integrity sha512-cTPNrlvJT6twpYy+YmKUKrTSjWFs3bjYjAhCwm+z4EOCubZxAuO+hHpRN64TqjEaYSHs7tJAE0w1CKMGmsG/lw== +import-fresh@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-2.0.0.tgz#d81355c15612d386c61f9ddd3922d4304822a546" + integrity sha1-2BNVwVYS04bGH53dOSLUMEgipUY= + dependencies: + caller-path "^2.0.0" + resolve-from "^3.0.0" + +import-fresh@^3.0.0, import-fresh@^3.2.1: + version "3.3.0" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" + integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== dependencies: parent-module "^1.0.0" resolve-from "^4.0.0" @@ -4850,7 +5305,7 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.1, inherits@~2.0.3: +inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.1, inherits@~2.0.3, inherits@~2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== @@ -4860,28 +5315,28 @@ inherits@2.0.3: resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= -ini@^1.3.4, ini@^1.3.5, ini@~1.3.0: +ini@^1.3.5: version "1.3.8" resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== -inquirer@^7.0.0: - version "7.3.3" - resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-7.3.3.tgz#04d176b2af04afc157a83fd7c100e98ee0aad003" - integrity sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA== +inquirer@^6.2.2: + version "6.5.2" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-6.5.2.tgz#ad50942375d036d327ff528c08bd5fab089928ca" + integrity sha512-cntlB5ghuB0iuO65Ovoi8ogLHiWGs/5yNrtUcKjFhSSiVeAIVpD7koaSU9RM8mpXw5YDi9RdYXGQMaOURB7ycQ== dependencies: - ansi-escapes "^4.2.1" - chalk "^4.1.0" - cli-cursor "^3.1.0" - cli-width "^3.0.0" + ansi-escapes "^3.2.0" + chalk "^2.4.2" + cli-cursor "^2.1.0" + cli-width "^2.0.0" external-editor "^3.0.3" - figures "^3.0.0" - lodash "^4.17.19" - mute-stream "0.0.8" - run-async "^2.4.0" - rxjs "^6.6.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" + figures "^2.0.0" + lodash "^4.17.12" + mute-stream "0.0.7" + run-async "^2.2.0" + rxjs "^6.4.0" + string-width "^2.1.0" + strip-ansi "^5.1.0" through "^2.3.6" internal-slot@^1.0.2: @@ -4898,6 +5353,13 @@ interpret@^1.0.0: resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.4.0.tgz#665ab8bc4da27a774a40584e812e3e0fa45b1a1e" integrity sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA== +invariant@^2.2.2: + version "2.2.4" + resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" + integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== + dependencies: + loose-envify "^1.0.0" + invert-kv@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6" @@ -4934,18 +5396,18 @@ is-accessor-descriptor@^1.0.0: dependencies: kind-of "^6.0.0" +is-arguments@^1.0.4: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.1.0.tgz#62353031dfbee07ceb34656a6bde59efecae8dd9" + integrity sha512-1Ij4lOMPl/xB5kBDn7I+b2ttPMKa8szhEIrXDuXQD/oe3HJLTLhqhgGspwgyGd6MOywBUqVvYicF72lkgDnIHg== + dependencies: + call-bind "^1.0.0" + is-arrayish@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= -is-binary-path@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" - integrity sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg= - dependencies: - binary-extensions "^1.0.0" - is-binary-path@~2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" @@ -4958,20 +5420,27 @@ is-buffer@^1.1.5: resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== -is-buffer@^2.0.2, is-buffer@~2.0.3: +is-buffer@~2.0.3: version "2.0.5" resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.5.tgz#ebc252e400d22ff8d77fa09888821a24a658c191" integrity sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ== -is-callable@^1.1.4, is-callable@^1.2.2: +is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.2: version "1.2.2" resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.2.tgz#c7c6715cd22d4ddb48d3e19970223aceabb080d9" integrity sha512-dnMqspv5nU3LoewK2N/y7KLtxtakvTuaCsU9FU50/QDmdbHNy/4/JuRtMHqRU22o3q+W89YQndQEeCVwK+3qrA== +is-ci@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-2.0.0.tgz#6bc6334181810e04b5c22b3d589fdca55026404c" + integrity sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w== + dependencies: + ci-info "^2.0.0" + is-core-module@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.1.0.tgz#a4cc031d9b1aca63eecbd18a650e13cb4eeab946" - integrity sha512-YcV7BgVMRFRua2FqQzKtTDMz8iCuLEyGKjr70q8Zm1yy2qKcurbFEd79PAdHV77oL3NrAaOVQIbMmiHQCHB7ZA== + version "2.2.0" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.2.0.tgz#97037ef3d52224d85163f5597b2b63d9afed981a" + integrity sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ== dependencies: has "^1.0.3" @@ -5012,17 +5481,10 @@ is-descriptor@^1.0.0, is-descriptor@^1.0.2: is-data-descriptor "^1.0.0" kind-of "^6.0.2" -is-dotfile@^1.0.0: - version "1.0.3" - resolved "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.3.tgz#a6a2f32ffd2dfb04f5ca25ecd0f6b83cf798a1e1" - integrity sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE= - -is-equal-shallow@^0.1.3: - version "0.1.3" - resolved "https://registry.yarnpkg.com/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz#2238098fc221de0bcfa5d9eac4c45d638aa1c534" - integrity sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ= - dependencies: - is-primitive "^2.0.0" +is-directory@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/is-directory/-/is-directory-0.3.1.tgz#61339b6f2475fc772fd9c9d83f5c8575dc154ae1" + integrity sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE= is-extendable@^0.1.0, is-extendable@^0.1.1: version "0.1.1" @@ -5036,16 +5498,16 @@ is-extendable@^1.0.1: dependencies: is-plain-object "^2.0.4" -is-extglob@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0" - integrity sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA= - is-extglob@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= +is-finite@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.1.0.tgz#904135c77fb42c0641d6aa1bcdbc4daa8da082f3" + integrity sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w== + is-fn@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-fn/-/is-fn-1.0.0.tgz#9543d5de7bcf5b08a22ec8a20bae6e286d510d8c" @@ -5073,13 +5535,6 @@ is-function@^1.0.1: resolved "https://registry.yarnpkg.com/is-function/-/is-function-1.0.2.tgz#4f097f30abf6efadac9833b17ca5dc03f8144e08" integrity sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ== -is-glob@^2.0.0, is-glob@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863" - integrity sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM= - dependencies: - is-extglob "^1.0.0" - is-glob@^4.0.0, is-glob@^4.0.1, is-glob@~4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc" @@ -5092,22 +5547,10 @@ is-hex-prefixed@1.0.0: resolved "https://registry.yarnpkg.com/is-hex-prefixed/-/is-hex-prefixed-1.0.0.tgz#7d8d37e6ad77e5d127148913c573e082d777f554" integrity sha1-fY035q135dEnFIkTxXPggtd39VQ= -is-natural-number@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/is-natural-number/-/is-natural-number-4.0.1.tgz#ab9d76e1db4ced51e35de0c72ebecf09f734cde8" - integrity sha1-q5124dtM7VHjXeDHLr7PCfc0zeg= - -is-negative-zero@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.0.tgz#9553b121b0fac28869da9ed459e20c7543788461" - integrity sha1-lVOxIbD6wohp2p7UWeIMdUN4hGE= - -is-number@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908f" - integrity sha1-Afy7s5NGOlSPL0ZszhbezknbkI8= - dependencies: - kind-of "^3.0.2" +is-negative-zero@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.1.tgz#3de746c18dda2319241a53675908d8f766f11c24" + integrity sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w== is-number@^3.0.0: version "3.0.0" @@ -5116,26 +5559,26 @@ is-number@^3.0.0: dependencies: kind-of "^3.0.2" -is-number@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-4.0.0.tgz#0026e37f5454d73e356dfe6564699867c6a7f0ff" - integrity sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ== - is-number@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== is-object@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-object/-/is-object-1.0.1.tgz#8952688c5ec2ffd6b03ecc85e769e02903083470" - integrity sha1-iVJojF7C/9awPsyF52ngKQMINHA= + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-object/-/is-object-1.0.2.tgz#a56552e1c665c9e950b4a025461da87e72f86fcf" + integrity sha512-2rRIahhZr2UWb45fIOuvZGpFtz0TyOZLf32KxBbSoUCeZR495zCKlWUKKUByk3geS2eAs7ZAABt0Y/Rx0GiQGA== is-plain-obj@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" integrity sha1-caUMhCnfync8kqOQpKA7OfzVHT4= +is-plain-obj@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287" + integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== + is-plain-object@^2.0.3, is-plain-object@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" @@ -5143,28 +5586,25 @@ is-plain-object@^2.0.3, is-plain-object@^2.0.4: dependencies: isobject "^3.0.1" -is-posix-bracket@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz#3334dc79774368e92f016e6fbc0a88f5cd6e6bc4" - integrity sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q= - -is-primitive@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-primitive/-/is-primitive-2.0.0.tgz#207bab91638499c07b2adf240a41a87210034575" - integrity sha1-IHurkWOEmcB7Kt8kCkGochADRXU= - -is-promise@^2.1: +is-promise@^2.2.2: version "2.2.2" resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.2.2.tgz#39ab959ccbf9a774cf079f7b40c7a26f763135f1" integrity sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ== -is-regex@^1.1.1: +is-regex@^1.0.4, is-regex@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.1.tgz#c6f98aacc546f6cec5468a07b7b153ab564a57b9" integrity sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg== dependencies: has-symbols "^1.0.1" +is-regex@~1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.5.tgz#39d589a358bf18967f726967120b8fc1aed74eae" + integrity sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ== + dependencies: + has "^1.0.3" + is-retry-allowed@^1.0.0: version "1.2.0" resolved "https://registry.yarnpkg.com/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz#d778488bd0a4666a3be8a1482b9f2baafedea8b4" @@ -5192,6 +5632,16 @@ is-typedarray@^1.0.0, is-typedarray@~1.0.0: resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= +is-url@^1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/is-url/-/is-url-1.2.4.tgz#04a4df46d28c4cff3d73d01ff06abeb318a1aa52" + integrity sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww== + +is-utf8@^0.2.0: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" + integrity sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI= + is-windows@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" @@ -5212,11 +5662,6 @@ isexe@^2.0.0: resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= -iso-url@~0.4.7: - version "0.4.7" - resolved "https://registry.yarnpkg.com/iso-url/-/iso-url-0.4.7.tgz#de7e48120dae46921079fe78f325ac9e9217a385" - integrity sha512-27fFRDnPAMnHGLq36bWTpKET+eiXct3ENlCcdcMdk+mjXrb2kw3mhBUg1B7ewAC0kVzlOPhADzQgz1SE6Tglog== - isobject@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" @@ -5242,11 +5687,6 @@ isurl@^1.0.0-alpha5: has-to-string-tag-x "^1.2.0" is-object "^1.0.1" -js-sha3@0.5.5: - version "0.5.5" - resolved "https://registry.yarnpkg.com/js-sha3/-/js-sha3-0.5.5.tgz#baf0c0e8c54ad5903447df96ade7a4a1bca79a4a" - integrity sha1-uvDA6MVK1ZA0R9+Wreekobynmko= - js-sha3@0.5.7, js-sha3@^0.5.7: version "0.5.7" resolved "https://registry.yarnpkg.com/js-sha3/-/js-sha3-0.5.7.tgz#0d4ffd8002d5333aabaf4a23eed2f6374c9f28e7" @@ -5257,16 +5697,16 @@ js-sha3@0.8.0, js-sha3@^0.8.0: resolved "https://registry.yarnpkg.com/js-sha3/-/js-sha3-0.8.0.tgz#b9b7a5da73afad7dedd0f8c463954cbde6818840" integrity sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q== -js-string-escape@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/js-string-escape/-/js-string-escape-1.0.1.tgz#e2625badbc0d67c7533e9edc1068c587ae4137ef" - integrity sha1-4mJbrbwNZ8dTPp7cEGjFh65BN+8= - "js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== +js-tokens@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" + integrity sha1-mGbfOVECEw449/mWvOtlRDIJwls= + js-yaml@3.13.1: version "3.13.1" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.1.tgz#aff151b30bfdfa8e49e05da22e7415e9dfa37847" @@ -5275,7 +5715,7 @@ js-yaml@3.13.1: argparse "^1.0.7" esprima "^4.0.0" -js-yaml@3.x, js-yaml@^3.13.1, js-yaml@^3.14.0: +js-yaml@3.14.0: version "3.14.0" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.0.tgz#a7a34170f26a21bb162424d8adacb4113a69e482" integrity sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A== @@ -5283,39 +5723,73 @@ js-yaml@3.x, js-yaml@^3.13.1, js-yaml@^3.14.0: argparse "^1.0.7" esprima "^4.0.0" +js-yaml@3.x, js-yaml@^3.12.0, js-yaml@^3.13.0, js-yaml@^3.13.1, js-yaml@^3.14.0: + version "3.14.1" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" + integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + jsbn@~0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM= +jsesc@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b" + integrity sha1-RsP+yMGJKxKwgz25vHYiF226s0s= + +jsesc@~0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" + integrity sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0= + json-buffer@3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.0.tgz#5b1f397afc75d677bde8bcfc0e47e1f9a3d9a898" integrity sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg= -json-rpc-engine@^5.1.3: - version "5.4.0" - resolved "https://registry.yarnpkg.com/json-rpc-engine/-/json-rpc-engine-5.4.0.tgz#75758609d849e1dba1e09021ae473f3ab63161e5" - integrity sha512-rAffKbPoNDjuRnXkecTjnsE3xLLrb00rEkdgalINhaYVYIxDwWtvYBr9UFbhTvPB1B2qUOLoFd/cV6f4Q7mh7g== +json-parse-better-errors@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" + integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== + +json-rpc-engine@^3.4.0, json-rpc-engine@^3.6.0: + version "3.8.0" + resolved "https://registry.yarnpkg.com/json-rpc-engine/-/json-rpc-engine-3.8.0.tgz#9d4ff447241792e1d0a232f6ef927302bb0c62a9" + integrity sha512-6QNcvm2gFuuK4TKU1uwfH0Qd/cOSb9c1lls0gbnIhciktIUQJwz6NQNAW4B1KiGPenv7IKu97V222Yo1bNhGuA== dependencies: - eth-rpc-errors "^3.0.0" + async "^2.0.1" + babel-preset-env "^1.7.0" + babelify "^7.3.0" + json-rpc-error "^2.0.0" + promise-to-callback "^1.0.0" safe-event-emitter "^1.0.1" -json-rpc-random-id@^1.0.0, json-rpc-random-id@^1.0.1: +json-rpc-error@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/json-rpc-error/-/json-rpc-error-2.0.0.tgz#a7af9c202838b5e905c7250e547f1aff77258a02" + integrity sha1-p6+cICg4tekFxyUOVH8a/3cligI= + dependencies: + inherits "^2.0.1" + +json-rpc-random-id@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/json-rpc-random-id/-/json-rpc-random-id-1.0.1.tgz#ba49d96aded1444dbb8da3d203748acbbcdec8c8" integrity sha1-uknZat7RRE27jaPSA3SKy7zeyMg= -json-schema-traverse@^0.3.0: - version "0.3.1" - resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz#349a6d44c53a51de89b40805c5d5e59b417d3340" - integrity sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A= - json-schema-traverse@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== +json-schema-traverse@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" + integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== + json-schema@0.2.3: version "0.2.3" resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" @@ -5338,12 +5812,10 @@ json-stringify-safe@~5.0.1: resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= -json-text-sequence@^0.1, json-text-sequence@~0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/json-text-sequence/-/json-text-sequence-0.1.1.tgz#a72f217dc4afc4629fff5feb304dc1bd51a2f3d2" - integrity sha1-py8hfcSvxGKf/1/rME3BvVGi89I= - dependencies: - delimit-stream "0.1.0" +json5@^0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" + integrity sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE= json5@^1.0.1: version "1.0.1" @@ -5396,12 +5868,20 @@ jsprim@^1.2.2: verror "1.10.0" "jsx-ast-utils@^2.4.1 || ^3.0.0", jsx-ast-utils@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-3.1.0.tgz#642f1d7b88aa6d7eb9d8f2210e166478444fa891" - integrity sha512-d4/UOjg+mxAWxCiF0c5UTSwyqbchkbqCvK87aBovhnh8GtysTjWmgC63tY0cJx/HzGgm9qnA147jVBdpOiQ2RA== + version "3.2.0" + resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-3.2.0.tgz#41108d2cec408c3453c1bbe8a4aae9e1e2bd8f82" + integrity sha512-EIsmt3O3ljsU6sot/J4E1zDRxfBNrhjyf/OKjlydwgEimQuznlM4Wv7U+ueONJMyEn1WRE0K8dhi3dVAXYT24Q== dependencies: - array-includes "^3.1.1" - object.assign "^4.1.1" + array-includes "^3.1.2" + object.assign "^4.1.2" + +keccak@3.0.1, keccak@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/keccak/-/keccak-3.0.1.tgz#ae30a0e94dbe43414f741375cff6d64c8bea0bff" + integrity sha512-epq90L9jlFWCW7+pQa6JOnKn2Xgl2mtI664seYR6MHskvI9agt7AnDqmAlp9TqU4/caMYbA08Hi5DMZAl5zdkA== + dependencies: + node-addon-api "^2.0.0" + node-gyp-build "^4.2.0" keccak@^2.0.0: version "2.1.0" @@ -5413,14 +5893,6 @@ keccak@^2.0.0: nan "^2.14.0" safe-buffer "^5.2.0" -keccak@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/keccak/-/keccak-3.0.1.tgz#ae30a0e94dbe43414f741375cff6d64c8bea0bff" - integrity sha512-epq90L9jlFWCW7+pQa6JOnKn2Xgl2mtI664seYR6MHskvI9agt7AnDqmAlp9TqU4/caMYbA08Hi5DMZAl5zdkA== - dependencies: - node-addon-api "^2.0.0" - node-gyp-build "^4.2.0" - keyv@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/keyv/-/keyv-3.1.0.tgz#ecc228486f69991e49e9476485a5be1e8fc5c4d9" @@ -5452,6 +5924,13 @@ kind-of@^6.0.0, kind-of@^6.0.2: resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== +klaw-sync@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/klaw-sync/-/klaw-sync-6.0.0.tgz#1fd2cfd56ebb6250181114f0a581167099c2b28c" + integrity sha512-nIeuVSzdCCs6TDPTqI8w1Yre34sSq7AkZ4B3sfOBbI2CgVSB4Du4aLQijFU2+lhAFCwt9+42Hel6lQNIv6AntQ== + dependencies: + graceful-fs "^4.1.11" + klaw@^1.0.0: version "1.3.1" resolved "https://registry.yarnpkg.com/klaw/-/klaw-1.3.1.tgz#4088433b46b3b1ba259d78785d8e96f73ba02439" @@ -5518,6 +5997,15 @@ level-errors@~1.0.3: dependencies: errno "~0.1.1" +level-iterator-stream@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/level-iterator-stream/-/level-iterator-stream-2.0.3.tgz#ccfff7c046dcf47955ae9a86f46dfa06a31688b4" + integrity sha512-I6Heg70nfF+e5Y3/qfthJFexhRw/Gi3bIymCoXAlijZdAcLaPuWSJs3KXyTYf23ID6g0o2QF62Yh+grOXY3Rig== + dependencies: + inherits "^2.0.1" + readable-stream "^2.0.5" + xtend "^4.0.0" + level-iterator-stream@~1.3.0: version "1.3.1" resolved "https://registry.yarnpkg.com/level-iterator-stream/-/level-iterator-stream-1.3.1.tgz#e43b78b1a8143e6fa97a4f485eb8ea530352f2ed" @@ -5553,6 +6041,29 @@ level-packager@~4.0.0: encoding-down "~5.0.0" levelup "^3.0.0" +level-post@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/level-post/-/level-post-1.0.7.tgz#19ccca9441a7cc527879a0635000f06d5e8f27d0" + integrity sha512-PWYqG4Q00asOrLhX7BejSajByB4EmG2GaKHfj3h5UmmZ2duciXLPGYWIjBzLECFWUGOZWlm5B20h/n3Gs3HKew== + dependencies: + ltgt "^2.1.2" + +level-sublevel@6.6.4: + version "6.6.4" + resolved "https://registry.yarnpkg.com/level-sublevel/-/level-sublevel-6.6.4.tgz#f7844ae893919cd9d69ae19d7159499afd5352ba" + integrity sha512-pcCrTUOiO48+Kp6F1+UAzF/OtWqLcQVTVF39HLdZ3RO8XBoXt+XVPKZO1vVr1aUoxHZA9OtD2e1v7G+3S5KFDA== + dependencies: + bytewise "~1.1.0" + level-codec "^9.0.0" + level-errors "^2.0.0" + level-iterator-stream "^2.0.3" + ltgt "~2.1.1" + pull-defer "^0.2.2" + pull-level "^2.0.3" + pull-stream "^3.6.8" + typewiselite "~1.0.0" + xtend "~4.0.0" + level-ws@0.0.0: version "0.0.0" resolved "https://registry.yarnpkg.com/level-ws/-/level-ws-0.0.0.tgz#372e512177924a00424b0b43aef2bb42496d228b" @@ -5570,6 +6081,16 @@ level-ws@^1.0.0: readable-stream "^2.2.8" xtend "^4.0.1" +levelup@3.1.1, levelup@^3.0.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/levelup/-/levelup-3.1.1.tgz#c2c0b3be2b4dc316647c53b42e2f559e232d2189" + integrity sha512-9N10xRkUU4dShSRRFTBdNaBxofz+PGaIZO962ckboJZiNmLuhVT6FZ6ZKAsICKfUBO76ySaYU6fJWX/jnj3Lcg== + dependencies: + deferred-leveldown "~4.0.0" + level-errors "~2.0.0" + level-iterator-stream "~3.0.0" + xtend "~4.0.0" + levelup@^1.2.1: version "1.3.9" resolved "https://registry.yarnpkg.com/levelup/-/levelup-1.3.9.tgz#2dbcae845b2bb2b6bea84df334c475533bbd82ab" @@ -5583,16 +6104,6 @@ levelup@^1.2.1: semver "~5.4.1" xtend "~4.0.0" -levelup@^3.0.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/levelup/-/levelup-3.1.1.tgz#c2c0b3be2b4dc316647c53b42e2f559e232d2189" - integrity sha512-9N10xRkUU4dShSRRFTBdNaBxofz+PGaIZO962ckboJZiNmLuhVT6FZ6ZKAsICKfUBO76ySaYU6fJWX/jnj3Lcg== - dependencies: - deferred-leveldown "~4.0.0" - level-errors "~2.0.0" - level-iterator-stream "~3.0.0" - xtend "~4.0.0" - levn@^0.3.0, levn@~0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" @@ -5601,6 +6112,25 @@ levn@^0.3.0, levn@~0.3.0: prelude-ls "~1.1.2" type-check "~0.3.2" +levn@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" + integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== + dependencies: + prelude-ls "^1.2.1" + type-check "~0.4.0" + +load-json-file@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0" + integrity sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA= + dependencies: + graceful-fs "^4.1.2" + parse-json "^2.2.0" + pify "^2.0.0" + pinkie-promise "^2.0.0" + strip-bom "^2.0.0" + load-json-file@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-2.0.0.tgz#7947e42149af80d696cbf797bcaabcfe1fe29ca8" @@ -5627,154 +6157,24 @@ locate-path@^3.0.0: p-locate "^3.0.0" path-exists "^3.0.0" -locate-path@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" - integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== +locate-path@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" + integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== dependencies: - p-locate "^4.1.0" - -lodash.clonedeep@^4.5.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef" - integrity sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8= - -lodash.concat@^4.5.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/lodash.concat/-/lodash.concat-4.5.0.tgz#b053ae02e4a8008582e7256b9d02bda6d0380395" - integrity sha1-sFOuAuSoAIWC5yVrnQK9ptA4A5U= - -lodash.difference@^4.5.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/lodash.difference/-/lodash.difference-4.5.0.tgz#9ccb4e505d486b91651345772885a2df27fd017c" - integrity sha1-nMtOUF1Ia5FlE0V3KIWi3yf9AXw= - -lodash.escaperegexp@^4.1.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/lodash.escaperegexp/-/lodash.escaperegexp-4.1.2.tgz#64762c48618082518ac3df4ccf5d5886dae20347" - integrity sha1-ZHYsSGGAglGKw99Mz11YhtriA0c= - -lodash.every@^4.6.0: - version "4.6.0" - resolved "https://registry.yarnpkg.com/lodash.every/-/lodash.every-4.6.0.tgz#eb89984bebc4364279bb3aefbbd1ca19bfa6c6a7" - integrity sha1-64mYS+vENkJ5uzrvu9HKGb+mxqc= - -lodash.findlast@^4.6.0: - version "4.6.0" - resolved "https://registry.yarnpkg.com/lodash.findlast/-/lodash.findlast-4.6.0.tgz#ea8bb78cf2e7e7804fc8aeb7d1953e07fe31fbc8" - integrity sha1-6ou3jPLn54BPyK630ZU+B/4x+8g= - -lodash.flatmap@^4.5.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/lodash.flatmap/-/lodash.flatmap-4.5.0.tgz#ef8cbf408f6e48268663345305c6acc0b778702e" - integrity sha1-74y/QI9uSCaGYzRTBcaswLd4cC4= - -lodash.flatten@^4.4.0: - version "4.4.0" - resolved "https://registry.yarnpkg.com/lodash.flatten/-/lodash.flatten-4.4.0.tgz#f31c22225a9632d2bbf8e4addbef240aa765a61f" - integrity sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8= - -lodash.includes@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/lodash.includes/-/lodash.includes-4.3.0.tgz#60bb98a87cb923c68ca1e51325483314849f553f" - integrity sha1-YLuYqHy5I8aMoeUTJUgzFISfVT8= - -lodash.invertby@^4.7.0: - version "4.7.0" - resolved "https://registry.yarnpkg.com/lodash.invertby/-/lodash.invertby-4.7.0.tgz#cdebb6cd4942aa6b8df2c74be1c5d948682718b0" - integrity sha1-zeu2zUlCqmuN8sdL4cXZSGgnGLA= + p-locate "^5.0.0" -lodash.isempty@^4.4.0: - version "4.4.0" - resolved "https://registry.yarnpkg.com/lodash.isempty/-/lodash.isempty-4.4.0.tgz#6f86cbedd8be4ec987be9aaf33c9684db1b31e7e" - integrity sha1-b4bL7di+TsmHvpqvM8loTbGzHn4= - -lodash.isequal@^4.5.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz#415c4478f2bcc30120c22ce10ed3226f7d3e18e0" - integrity sha1-QVxEePK8wwEgwizhDtMib30+GOA= - -lodash.isstring@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/lodash.isstring/-/lodash.isstring-4.0.1.tgz#d527dfb5456eca7cc9bb95d5daeaf88ba54a5451" - integrity sha1-1SfftUVuynzJu5XV2ur4i6VKVFE= - -lodash.keys@^4.2.0: +lodash.assign@^4.0.3, lodash.assign@^4.0.6: version "4.2.0" - resolved "https://registry.yarnpkg.com/lodash.keys/-/lodash.keys-4.2.0.tgz#a08602ac12e4fb83f91fc1fb7a360a4d9ba35205" - integrity sha1-oIYCrBLk+4P5H8H7ejYKTZujUgU= - -lodash.map@^4.6.0: - version "4.6.0" - resolved "https://registry.yarnpkg.com/lodash.map/-/lodash.map-4.6.0.tgz#771ec7839e3473d9c4cde28b19394c3562f4f6d3" - integrity sha1-dx7Hg540c9nEzeKLGTlMNWL09tM= - -lodash.merge@^4.6.2: - version "4.6.2" - resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" - integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== - -lodash.omit@^4.5.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/lodash.omit/-/lodash.omit-4.5.0.tgz#6eb19ae5a1ee1dd9df0b969e66ce0b7fa30b5e60" - integrity sha1-brGa5aHuHdnfC5aeZs4Lf6MLXmA= - -lodash.partition@^4.6.0: - version "4.6.0" - resolved "https://registry.yarnpkg.com/lodash.partition/-/lodash.partition-4.6.0.tgz#a38e46b73469e0420b0da1212e66d414be364ba4" - integrity sha1-o45GtzRp4EILDaEhLmbUFL42S6Q= - -lodash.pick@^4.4.0: - version "4.4.0" - resolved "https://registry.yarnpkg.com/lodash.pick/-/lodash.pick-4.4.0.tgz#52f05610fff9ded422611441ed1fc123a03001b3" - integrity sha1-UvBWEP/53tQiYRRB7R/BI6AwAbM= - -lodash.pickby@^4.6.0: - version "4.6.0" - resolved "https://registry.yarnpkg.com/lodash.pickby/-/lodash.pickby-4.6.0.tgz#7dea21d8c18d7703a27c704c15d3b84a67e33aff" - integrity sha1-feoh2MGNdwOifHBMFdO4SmfjOv8= - -lodash.random@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/lodash.random/-/lodash.random-3.2.0.tgz#96e24e763333199130d2c9e2fd57f91703cc262d" - integrity sha1-luJOdjMzGZEw0sni/Vf5FwPMJi0= - -lodash.reverse@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/lodash.reverse/-/lodash.reverse-4.0.1.tgz#1f2afedace2e16e660f3aa7c59d3300a6f25d13c" - integrity sha1-Hyr+2s4uFuZg86p8WdMwCm8l0Tw= - -lodash.some@^4.6.0: - version "4.6.0" - resolved "https://registry.yarnpkg.com/lodash.some/-/lodash.some-4.6.0.tgz#1bb9f314ef6b8baded13b549169b2a945eb68e4d" - integrity sha1-G7nzFO9ri63tE7VJFpsqlF62jk0= - -lodash.sum@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/lodash.sum/-/lodash.sum-4.0.2.tgz#ad90e397965d803d4f1ff7aa5b2d0197f3b4637b" - integrity sha1-rZDjl5ZdgD1PH/eqWy0Bl/O0Y3s= + resolved "https://registry.yarnpkg.com/lodash.assign/-/lodash.assign-4.2.0.tgz#0d99f3ccd7a6d261d19bdaeb9245005d285808e7" + integrity sha1-DZnzzNem0mHRm9rrkkUAXShYCOc= lodash.toarray@^4.4.0: version "4.4.0" resolved "https://registry.yarnpkg.com/lodash.toarray/-/lodash.toarray-4.4.0.tgz#24c4bfcd6b2fba38bfd0594db1179d8e9b656561" integrity sha1-JMS/zWsvuji/0FlNsRedjptlZWE= -lodash.uniq@^4.5.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" - integrity sha1-0CJTc662Uq3BvILklFM5qEJ1R3M= - -lodash.values@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/lodash.values/-/lodash.values-4.3.0.tgz#a3a6c2b0ebecc5c2cba1c17e6e620fe81b53d347" - integrity sha1-o6bCsOvsxcLLocF+bmIP6BtT00c= - -lodash.without@^4.4.0: - version "4.4.0" - resolved "https://registry.yarnpkg.com/lodash.without/-/lodash.without-4.4.0.tgz#3cd4574a00b67bae373a94b748772640507b7aac" - integrity sha1-PNRXSgC2e643OpS3SHcmQFB7eqw= - -lodash@^4.14.2, lodash@^4.15.0, lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19: +lodash@4.17.20, lodash@^4.17.11, lodash@^4.17.12, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.4: version "4.17.20" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.20.tgz#b44a9b6297bcb698f1c51a3545a2b3b368d59c52" integrity sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA== @@ -5786,7 +6186,24 @@ log-symbols@3.0.0: dependencies: chalk "^2.4.2" -loose-envify@^1.4.0: +log-symbols@4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.0.0.tgz#69b3cc46d20f448eccdb75ea1fa733d9e821c920" + integrity sha512-FN8JBzLx6CzeMrB0tg6pqlGU1wCrXW+ZXGH481kfsBqer0hToTIiHdjH4Mq8xJUbvATujKCvaREGWpGUionraA== + dependencies: + chalk "^4.0.0" + +looper@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/looper/-/looper-2.0.0.tgz#66cd0c774af3d4fedac53794f742db56da8f09ec" + integrity sha1-Zs0Md0rz1P7axTeU90LbVtqPCew= + +looper@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/looper/-/looper-3.0.0.tgz#2efa54c3b1cbaba9b94aee2e5914b0be57fbb749" + integrity sha1-LvpUw7HLq6m5Su4uWRSwvlf7t0k= + +loose-envify@^1.0.0, loose-envify@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== @@ -5803,22 +6220,28 @@ lowercase-keys@^2.0.0: resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-2.0.0.tgz#2603e78b7b4b0006cbca2fbcc8a3202558ac9479" integrity sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA== -lru-cache@^4.0.1: - version "4.1.5" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd" - integrity sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g== - dependencies: - pseudomap "^1.0.2" - yallist "^2.1.2" - -lru-cache@^5.1.1: +lru-cache@5.1.1, lru-cache@^5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== dependencies: yallist "^3.0.2" -lru-queue@0.1: +lru-cache@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-3.2.0.tgz#71789b3b7f5399bec8565dda38aa30d2a097efee" + integrity sha1-cXibO39Tmb7IVl3aOKow0qCX7+4= + dependencies: + pseudomap "^1.0.1" + +lru-cache@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" + integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== + dependencies: + yallist "^4.0.0" + +lru-queue@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/lru-queue/-/lru-queue-0.1.0.tgz#2738bd9f0d3cf4f84490c5736c48699ac632cda3" integrity sha1-Jzi9nw089PhEkMVzbEhpmsYyzaM= @@ -5830,17 +6253,15 @@ lru_map@^0.3.3: resolved "https://registry.yarnpkg.com/lru_map/-/lru_map-0.3.3.tgz#b5c8351b9464cbd750335a79650a0ec0e56118dd" integrity sha1-tcg1G5Rky9dQM1p5ZQoOwOVhGN0= -ltgt@~2.2.0: +ltgt@^2.1.2, ltgt@~2.2.0: version "2.2.1" resolved "https://registry.yarnpkg.com/ltgt/-/ltgt-2.2.1.tgz#f35ca91c493f7b73da0e07495304f17b31f87ee5" integrity sha1-81ypHEk/e3PaDgdJUwTxezH4fuU= -make-dir@^1.0.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.3.0.tgz#79c1033b80515bd6d24ec9933e860ca75ee27f0c" - integrity sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ== - dependencies: - pify "^3.0.0" +ltgt@~2.1.1: + version "2.1.3" + resolved "https://registry.yarnpkg.com/ltgt/-/ltgt-2.1.3.tgz#10851a06d9964b971178441c23c9e52698eece34" + integrity sha1-EIUaBtmWS5cReEQcI8nlJpjuzjQ= make-error@^1.1.1: version "1.3.6" @@ -5871,11 +6292,6 @@ markdown-table@^1.1.3: resolved "https://registry.yarnpkg.com/markdown-table/-/markdown-table-1.1.3.tgz#9fcb69bcfdb8717bfd0398c6ec2d93036ef8de60" integrity sha512-1RUZVgQlpJSPWYbFSpmudq5nHY1doEIv89gBtF0s4gW1GF2XorxcA/70M5vq7rLv0a6mhOUccRsqkwhwLCIQ2Q== -math-random@^1.0.1: - version "1.0.4" - resolved "https://registry.yarnpkg.com/math-random/-/math-random-1.0.4.tgz#5dd6943c938548267016d4e34f057583080c514c" - integrity sha512-rUxjysqif/BZQH2yhd5Aaq7vXMSx9NdEsQcyA07uEzIvxgI7zIr33gGsh+RU0/XjmQpCW7RsVof1vlkvQVCK5A== - md5.js@^1.3.4: version "1.3.5" resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f" @@ -5890,13 +6306,6 @@ media-typer@0.3.0: resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g= -mem@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/mem/-/mem-1.1.0.tgz#5edd52b485ca1d900fe64895505399a0dfa45f76" - integrity sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y= - dependencies: - mimic-fn "^1.0.0" - mem@^4.0.0: version "4.3.0" resolved "https://registry.yarnpkg.com/mem/-/mem-4.3.0.tgz#461af497bc4ae09608cdb2e60eefb69bff744178" @@ -5931,18 +6340,18 @@ memdown@~3.0.0: safe-buffer "~5.1.1" memoizee@^0.4.14: - version "0.4.14" - resolved "https://registry.yarnpkg.com/memoizee/-/memoizee-0.4.14.tgz#07a00f204699f9a95c2d9e77218271c7cd610d57" - integrity sha512-/SWFvWegAIYAO4NQMpcX+gcra0yEZu4OntmUdrBaWrJncxOqAziGFlHxc7yjKVK2uu3lpPW27P27wkR82wA8mg== + version "0.4.15" + resolved "https://registry.yarnpkg.com/memoizee/-/memoizee-0.4.15.tgz#e6f3d2da863f318d02225391829a6c5956555b72" + integrity sha512-UBWmJpLZd5STPm7PMUlOw/TSy972M+z8gcyQ5veOnSDRREz/0bmpyTfKt3/51DhEBqCZQn1udM/5flcSPYhkdQ== dependencies: - d "1" - es5-ext "^0.10.45" - es6-weak-map "^2.0.2" + d "^1.0.1" + es5-ext "^0.10.53" + es6-weak-map "^2.0.3" event-emitter "^0.3.5" - is-promise "^2.1" - lru-queue "0.1" - next-tick "1" - timers-ext "^0.1.5" + is-promise "^2.2.2" + lru-queue "^0.1.0" + next-tick "^1.1.0" + timers-ext "^0.1.7" memorystream@^0.3.1: version "0.3.1" @@ -5959,6 +6368,19 @@ merge2@^1.2.3, merge2@^1.3.0: resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== +merkle-patricia-tree@3.0.0, merkle-patricia-tree@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/merkle-patricia-tree/-/merkle-patricia-tree-3.0.0.tgz#448d85415565df72febc33ca362b8b614f5a58f8" + integrity sha512-soRaMuNf/ILmw3KWbybaCjhx86EYeBbD8ph0edQCTed0JN/rxDt1EBN52Ajre3VyGo+91f8+/rfPIRQnnGMqmQ== + dependencies: + async "^2.6.1" + ethereumjs-util "^5.2.0" + level-mem "^3.0.1" + level-ws "^1.0.0" + readable-stream "^3.0.6" + rlp "^2.0.0" + semaphore ">=1.0.1" + merkle-patricia-tree@^2.1.2, merkle-patricia-tree@^2.3.2: version "2.3.2" resolved "https://registry.yarnpkg.com/merkle-patricia-tree/-/merkle-patricia-tree-2.3.2.tgz#982ca1b5a0fde00eed2f6aeed1f9152860b8208a" @@ -5973,44 +6395,12 @@ merkle-patricia-tree@^2.1.2, merkle-patricia-tree@^2.3.2: rlp "^2.0.0" semaphore ">=1.0.1" -merkle-patricia-tree@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/merkle-patricia-tree/-/merkle-patricia-tree-3.0.0.tgz#448d85415565df72febc33ca362b8b614f5a58f8" - integrity sha512-soRaMuNf/ILmw3KWbybaCjhx86EYeBbD8ph0edQCTed0JN/rxDt1EBN52Ajre3VyGo+91f8+/rfPIRQnnGMqmQ== - dependencies: - async "^2.6.1" - ethereumjs-util "^5.2.0" - level-mem "^3.0.1" - level-ws "^1.0.0" - readable-stream "^3.0.6" - rlp "^2.0.0" - semaphore ">=1.0.1" - methods@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= -micromatch@^2.1.5: - version "2.3.11" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c1565" - integrity sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU= - dependencies: - arr-diff "^2.0.0" - array-unique "^0.2.1" - braces "^1.8.2" - expand-brackets "^0.1.4" - extglob "^0.3.1" - filename-regex "^2.0.0" - is-extglob "^1.0.0" - is-glob "^2.0.1" - kind-of "^3.0.2" - normalize-path "^2.0.1" - object.omit "^2.0.0" - parse-glob "^3.0.4" - regex-cache "^0.4.2" - -micromatch@^3.1.10: +micromatch@^3.1.4: version "3.1.10" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg== @@ -6045,17 +6435,17 @@ miller-rabin@^4.0.0: bn.js "^4.0.0" brorand "^1.0.1" -mime-db@1.44.0: - version "1.44.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.44.0.tgz#fa11c5eb0aca1334b4233cb4d52f10c5a6272f92" - integrity sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg== +mime-db@1.45.0: + version "1.45.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.45.0.tgz#cceeda21ccd7c3a745eba2decd55d4b73e7879ea" + integrity sha512-CkqLUxUk15hofLoLyljJSrukZi8mAtgd+yE5uO4tqRZsdsAJKv0O+rFMhVDRJgozy+yG6md5KwuXhD4ocIoP+w== mime-types@^2.1.12, mime-types@^2.1.16, mime-types@~2.1.19, mime-types@~2.1.24: - version "2.1.27" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.27.tgz#47949f98e279ea53119f5722e0f34e529bec009f" - integrity sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w== + version "2.1.28" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.28.tgz#1160c4757eab2c5363888e005273ecf79d2a0ecd" + integrity sha512-0TO2yJ5YHYr7M2zzT7gDU1tbwHxEUWBCLt0lscSNpcdAfFyJOVEpRYNS7EXVcTLNj/25QO8gulHC5JtTzSE2UQ== dependencies: - mime-db "1.44.0" + mime-db "1.45.0" mime@1.6.0: version "1.6.0" @@ -6067,7 +6457,7 @@ mimic-fn@^1.0.0: resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" integrity sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ== -mimic-fn@^2.0.0, mimic-fn@^2.1.0: +mimic-fn@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== @@ -6084,11 +6474,6 @@ min-document@^2.19.0: dependencies: dom-walk "^0.1.0" -min-indent@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/min-indent/-/min-indent-1.0.1.tgz#a63f681673b30571fbe8bc25686ae746eefa9869" - integrity sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg== - minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" @@ -6106,12 +6491,7 @@ minimalistic-crypto-utils@^1.0.0, minimalistic-crypto-utils@^1.0.1: dependencies: brace-expansion "^1.1.7" -minimist@0.0.8: - version "0.0.8" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" - integrity sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0= - -minimist@^1.2.0, minimist@^1.2.5: +minimist@^1.2.0, minimist@^1.2.5, minimist@~1.2.5: version "1.2.5" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== @@ -6146,18 +6526,11 @@ mkdirp-promise@^5.0.1: dependencies: mkdirp "*" -mkdirp@*, mkdirp@^1.0.4: +mkdirp@*: version "1.0.4" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== -mkdirp@0.5.1: - version "0.5.1" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" - integrity sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM= - dependencies: - minimist "0.0.8" - mkdirp@0.5.5, mkdirp@0.5.x, mkdirp@^0.5.0, mkdirp@^0.5.1: version "0.5.5" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" @@ -6165,40 +6538,7 @@ mkdirp@0.5.5, mkdirp@0.5.x, mkdirp@^0.5.0, mkdirp@^0.5.1: dependencies: minimist "^1.2.5" -mocha@5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/mocha/-/mocha-5.2.0.tgz#6d8ae508f59167f940f2b5b3c4a612ae50c90ae6" - integrity sha512-2IUgKDhc3J7Uug+FxMXuqIyYzH7gJjXECKe/w43IGgQHTSj3InJi+yAA7T24L9bQMRKiUEHxEX37G5JpVUGLcQ== - dependencies: - browser-stdout "1.3.1" - commander "2.15.1" - debug "3.1.0" - diff "3.5.0" - escape-string-regexp "1.0.5" - glob "7.1.2" - growl "1.10.5" - he "1.1.1" - minimatch "3.0.4" - mkdirp "0.5.1" - supports-color "5.4.0" - -mocha@^4.0.1: - version "4.1.0" - resolved "https://registry.yarnpkg.com/mocha/-/mocha-4.1.0.tgz#7d86cfbcf35cb829e2754c32e17355ec05338794" - integrity sha512-0RVnjg1HJsXY2YFDoTNzcc1NKhYuXKRrBAG2gDygmJJA136Cs2QlRliZG1mA0ap7cuaT30mw16luAeln+4RiNA== - dependencies: - browser-stdout "1.3.0" - commander "2.11.0" - debug "3.1.0" - diff "3.3.1" - escape-string-regexp "1.0.5" - glob "7.1.2" - growl "1.10.3" - he "1.1.1" - mkdirp "0.5.1" - supports-color "4.4.0" - -mocha@^7.0.1, mocha@^7.1.1, mocha@^7.1.2: +mocha@^7.1.1, mocha@^7.1.2: version "7.2.0" resolved "https://registry.yarnpkg.com/mocha/-/mocha-7.2.0.tgz#01cc227b00d875ab1eed03a75106689cfed5a604" integrity sha512-O9CIypScywTVpNaRrCAgoUnJgozpIofjKUYmJhiCIJMiuYnLI6otcb1/kpW9/n/tJODHGZ7i8aLQoDVsMtOKQQ== @@ -6228,6 +6568,37 @@ mocha@^7.0.1, mocha@^7.1.1, mocha@^7.1.2: yargs-parser "13.1.2" yargs-unparser "1.6.0" +mocha@^8.2.1: + version "8.2.1" + resolved "https://registry.yarnpkg.com/mocha/-/mocha-8.2.1.tgz#f2fa68817ed0e53343d989df65ccd358bc3a4b39" + integrity sha512-cuLBVfyFfFqbNR0uUKbDGXKGk+UDFe6aR4os78XIrMQpZl/nv7JYHcvP5MFIAb374b2zFXsdgEGwmzMtP0Xg8w== + dependencies: + "@ungap/promise-all-settled" "1.1.2" + ansi-colors "4.1.1" + browser-stdout "1.3.1" + chokidar "3.4.3" + debug "4.2.0" + diff "4.0.2" + escape-string-regexp "4.0.0" + find-up "5.0.0" + glob "7.1.6" + growl "1.10.5" + he "1.2.0" + js-yaml "3.14.0" + log-symbols "4.0.0" + minimatch "3.0.4" + ms "2.1.2" + nanoid "3.1.12" + serialize-javascript "5.0.1" + strip-json-comments "3.1.1" + supports-color "7.2.0" + which "2.0.2" + wide-align "1.1.3" + workerpool "6.0.2" + yargs "13.3.2" + yargs-parser "13.1.2" + yargs-unparser "2.0.0" + mock-fs@^4.1.0: version "4.13.0" resolved "https://registry.yarnpkg.com/mock-fs/-/mock-fs-4.13.0.tgz#31c02263673ec3789f90eb7b6963676aa407a598" @@ -6243,11 +6614,16 @@ ms@2.1.1: resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== -ms@2.1.2, ms@^2.1.1: +ms@2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== +ms@^2.1.1: + version "2.1.3" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + multibase@^0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/multibase/-/multibase-0.7.0.tgz#1adfc1c50abe05eefeb5091ac0c2728d6b84581b" @@ -6288,12 +6664,12 @@ multihashes@^0.4.15, multihashes@~0.4.15: multibase "^0.7.0" varint "^5.0.0" -mute-stream@0.0.8: - version "0.0.8" - resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" - integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== +mute-stream@0.0.7: + version "0.0.7" + resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" + integrity sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s= -nan@^2.12.1, nan@^2.14.0: +nan@^2.14.0: version "2.14.2" resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.2.tgz#f5376400695168f4cc694ac9393d0c9585eeea19" integrity sha512-M2ufzIiINKCuDfBSAUr1vWQ+vuVcA9kqx8JJUsbQi6yf1uGRyb7HfpdfUr5qLXf3B/t8dPvcjhKMmlfnP47EzQ== @@ -6303,6 +6679,11 @@ nano-json-stream-parser@^0.1.2: resolved "https://registry.yarnpkg.com/nano-json-stream-parser/-/nano-json-stream-parser-0.1.2.tgz#0cc8f6d0e2b622b479c40d499c46d64b755c6f5f" integrity sha1-DMj20OK2IrR5xA1JnEbWS3Vcb18= +nanoid@3.1.12: + version "3.1.12" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.1.12.tgz#6f7736c62e8d39421601e4a0c77623a97ea69654" + integrity sha512-1qstj9z5+x491jfiC4Nelk+f8XBad7LN20PmyWINJEMRSf3wcAjAWysw1qaA8z6NSKe2sjq1hRSDpBH5paCb6A== + nanomatch@^1.2.9: version "1.2.13" resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" @@ -6335,7 +6716,7 @@ neo-async@^2.6.0: resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== -next-tick@1: +next-tick@1, next-tick@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/next-tick/-/next-tick-1.1.0.tgz#1836ee30ad56d67ef281b22bd199f709449b35eb" integrity sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ== @@ -6393,11 +6774,6 @@ node-gyp-build@^4.2.0: resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.2.3.tgz#ce6277f853835f718829efb47db20f3e4d9c4739" integrity sha512-MN6ZpzmfNCRM+3t57PTJHgHyw/h4OWnZ6mR8P5j/uZtqQr46RRuDE/P+g3n0YR/AiYXeWixZZzaip77gdICfRg== -nofilter@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/nofilter/-/nofilter-1.0.4.tgz#78d6f4b6a613e7ced8b015cec534625f7667006e" - integrity sha512-N8lidFp+fCz+TD51+haYdbDGrcBWwuHX40F5+z0qkUjMJ5Tp+rdSuAkMJ9N9eoolDlEVTf6u5icM+cNKkKW2mA== - nopt@3.x: version "3.0.6" resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9" @@ -6415,13 +6791,6 @@ normalize-package-data@^2.3.2: semver "2 || 3 || 4 || 5" validate-npm-package-license "^3.0.1" -normalize-path@^2.0.0, normalize-path@^2.0.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" - integrity sha1-GrKLVW4Zg2Oowab35vogE3/mrtk= - dependencies: - remove-trailing-separator "^1.0.1" - normalize-path@^3.0.0, normalize-path@~3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" @@ -6439,13 +6808,6 @@ npm-run-path@^2.0.0: dependencies: path-key "^2.0.0" -nth-check@~1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-1.0.2.tgz#b2bd295c37e3dd58a3bf0700376663ba4d9cf05c" - integrity sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg== - dependencies: - boolbase "~1.0.0" - number-is-nan@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" @@ -6464,7 +6826,7 @@ oauth-sign@~0.9.0: resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== -object-assign@^4, object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1: +object-assign@^4, object-assign@^4.0.0, object-assign@^4.1.0, object-assign@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= @@ -6478,10 +6840,23 @@ object-copy@^0.1.0: define-property "^0.2.5" kind-of "^3.0.3" -object-inspect@^1.8.0: - version "1.8.0" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.8.0.tgz#df807e5ecf53a609cc6bfe93eac3cc7be5b3a9d0" - integrity sha512-jLdtEOB112fORuypAyl/50VRVIBIdVQOSUUGQHzJ4xBSbit81zRarz7GThkEFZy1RceYrWYcPcBFPQwHyAc1gA== +object-inspect@^1.8.0, object-inspect@^1.9.0: + version "1.9.0" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.9.0.tgz#c90521d74e1127b67266ded3394ad6116986533a" + integrity sha512-i3Bp9iTqwhaLZBxGkRfo5ZbE07BQRT7MGu8+nNgwW9ItGp1TzCTw2DLEoWwjClxBjOFI/hWljTAmYGCEwmtnOw== + +object-inspect@~1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.7.0.tgz#f4f6bd181ad77f006b5ece60bd0b6f398ff74a67" + integrity sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw== + +object-is@^1.0.1: + version "1.1.4" + resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.1.4.tgz#63d6c83c00a43f4cbc9434eb9757c8a5b8565068" + integrity sha512-1ZvAZ4wlF7IyPVOcE1Omikt7UpaFlOQq0HlSti+ZvDH3UiD2brwGMwDbyV43jao2bKJ+4+WdPJHSd7kgzKYVqg== + dependencies: + call-bind "^1.0.0" + define-properties "^1.1.3" object-keys@^1.0.11, object-keys@^1.0.12, object-keys@^1.1.1: version "1.1.1" @@ -6510,7 +6885,7 @@ object.assign@4.1.0: has-symbols "^1.0.0" object-keys "^1.0.11" -object.assign@^4.1.1, object.assign@^4.1.2: +object.assign@^4.1.0, object.assign@^4.1.1, object.assign@^4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.2.tgz#0ed54a342eceb37b38ff76eb831a0e788cb63940" integrity sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ== @@ -6521,39 +6896,33 @@ object.assign@^4.1.1, object.assign@^4.1.2: object-keys "^1.1.1" object.entries@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.2.tgz#bc73f00acb6b6bb16c203434b10f9a7e797d3add" - integrity sha512-BQdB9qKmb/HyNdMNWVr7O3+z5MUIx3aiegEIJqjMBbBf0YT9RRxTJSim4mzFqtyr7PDAHigq0N9dO0m0tRakQA== + version "1.1.3" + resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.3.tgz#c601c7f168b62374541a07ddbd3e2d5e4f7711a6" + integrity sha512-ym7h7OZebNS96hn5IJeyUmaWhaSM4SVtAPPfNLQEI2MYWCO2egsITb9nab2+i/Pwibx+R0mtn+ltKJXRSeTMGg== dependencies: + call-bind "^1.0.0" define-properties "^1.1.3" - es-abstract "^1.17.5" + es-abstract "^1.18.0-next.1" has "^1.0.3" object.fromentries@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.2.tgz#4a09c9b9bb3843dd0f89acdb517a794d4f355ac9" - integrity sha512-r3ZiBH7MQppDJVLx6fhD618GKNG40CZYH9wgwdhKxBDDbQgjeWGGd4AtkZad84d291YxvWe7bJGuE65Anh0dxQ== + version "2.0.3" + resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.3.tgz#13cefcffa702dc67750314a3305e8cb3fad1d072" + integrity sha512-IDUSMXs6LOSJBWE++L0lzIbSqHl9KDCfff2x/JSEIDtEUavUnyMYC2ZGay/04Zq4UT8lvd4xNhU4/YHKibAOlw== dependencies: + call-bind "^1.0.0" define-properties "^1.1.3" - es-abstract "^1.17.0-next.1" - function-bind "^1.1.1" + es-abstract "^1.18.0-next.1" has "^1.0.3" -object.getownpropertydescriptors@^2.0.3, object.getownpropertydescriptors@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.0.tgz#369bf1f9592d8ab89d712dced5cb81c7c5352649" - integrity sha512-Z53Oah9A3TdLoblT7VKJaTDdXdT+lQO+cNpKVnya5JDe9uLvzu1YyY1yFDFrcxrlRgWrEFH0jJtD/IbuwjcEVg== +object.getownpropertydescriptors@^2.0.3, object.getownpropertydescriptors@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.1.tgz#0dfda8d108074d9c563e80490c883b6661091544" + integrity sha512-6DtXgZ/lIZ9hqx4GtZETobXLR/ZLaa0aqV0kzbn80Rf8Z2e/XFnhA0I7p07N2wH8bBBltr2xQPi6sbKWAY2Eng== dependencies: + call-bind "^1.0.0" define-properties "^1.1.3" - es-abstract "^1.17.0-next.1" - -object.omit@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/object.omit/-/object.omit-2.0.1.tgz#1a9c744829f39dbb858c76ca3579ae2a54ebd1fa" - integrity sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo= - dependencies: - for-own "^0.1.4" - is-extendable "^0.1.1" + es-abstract "^1.18.0-next.1" object.pick@^1.3.0: version "1.3.0" @@ -6563,13 +6932,13 @@ object.pick@^1.3.0: isobject "^3.0.1" object.values@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.1.tgz#68a99ecde356b7e9295a3c5e0ce31dc8c953de5e" - integrity sha512-WTa54g2K8iu0kmS/us18jEmdv1a4Wi//BZ/DTVYEcH0XhLM5NYdpDHja3gt57VrZLcNAO2WGA+KpWsDBaHt6eA== + version "1.1.2" + resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.2.tgz#7a2015e06fcb0f546bd652486ce8583a4731c731" + integrity sha512-MYC0jvJopr8EK6dPBiO8Nb9mvjdypOachO5REGk6MXzujbBrAisKo3HmdEI6kZDL6fC31Mwee/5YbtMebixeag== dependencies: + call-bind "^1.0.0" define-properties "^1.1.3" - es-abstract "^1.17.0-next.1" - function-bind "^1.1.1" + es-abstract "^1.18.0-next.1" has "^1.0.3" oboe@2.1.4: @@ -6579,13 +6948,6 @@ oboe@2.1.4: dependencies: http-https "^1.0.0" -oboe@2.1.5: - version "2.1.5" - resolved "https://registry.yarnpkg.com/oboe/-/oboe-2.1.5.tgz#5554284c543a2266d7a38f17e073821fbde393cd" - integrity sha1-VVQoTFQ6ImbXo48X4HOCH73jk80= - dependencies: - http-https "^1.0.0" - on-finished@~2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" @@ -6600,14 +6962,14 @@ once@1.x, once@^1.3.0, once@^1.3.1, once@^1.4.0: dependencies: wrappy "1" -onetime@^5.1.0: - version "5.1.2" - resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" - integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== +onetime@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4" + integrity sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ= dependencies: - mimic-fn "^2.1.0" + mimic-fn "^1.0.0" -optionator@^0.8.1, optionator@^0.8.3: +optionator@^0.8.1, optionator@^0.8.2: version "0.8.3" resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495" integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA== @@ -6619,19 +6981,29 @@ optionator@^0.8.1, optionator@^0.8.3: type-check "~0.3.2" word-wrap "~1.2.3" -original-require@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/original-require/-/original-require-1.0.1.tgz#0f130471584cd33511c5ec38c8d59213f9ac5e20" - integrity sha1-DxMEcVhM0zURxew4yNWSE/msXiA= +optionator@^0.9.1: + version "0.9.1" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.1.tgz#4f236a6373dae0566a6d43e1326674f50c291499" + integrity sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw== + dependencies: + deep-is "^0.1.3" + fast-levenshtein "^2.0.6" + levn "^0.4.1" + prelude-ls "^1.2.1" + type-check "^0.4.0" + word-wrap "^1.2.3" -os-locale@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-2.1.0.tgz#42bc2900a6b5b8bd17376c8e882b65afccf24bf2" - integrity sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA== +os-homedir@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" + integrity sha1-/7xJiDNuDoM94MFox+8VISGqf7M= + +os-locale@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-1.4.0.tgz#20f9f17ae29ed345e8bde583b13d2009803c14d9" + integrity sha1-IPnxeuKe00XoveWDsT0gCYA8FNk= dependencies: - execa "^0.7.0" lcid "^1.0.0" - mem "^1.1.0" os-locale@^3.1.0: version "3.1.0" @@ -6642,7 +7014,7 @@ os-locale@^3.1.0: lcid "^2.0.0" mem "^4.0.0" -os-tmpdir@~1.0.2: +os-tmpdir@^1.0.1, os-tmpdir@~1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= @@ -6679,13 +7051,20 @@ p-limit@^1.1.0: dependencies: p-try "^1.0.0" -p-limit@^2.0.0, p-limit@^2.2.0: +p-limit@^2.0.0: version "2.3.0" resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== dependencies: p-try "^2.0.0" +p-limit@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" + integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== + dependencies: + yocto-queue "^0.1.0" + p-locate@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" @@ -6700,12 +7079,12 @@ p-locate@^3.0.0: dependencies: p-limit "^2.0.0" -p-locate@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" - integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== +p-locate@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" + integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== dependencies: - p-limit "^2.2.0" + p-limit "^3.0.2" p-timeout@^1.1.1: version "1.2.1" @@ -6724,11 +7103,6 @@ p-try@^2.0.0: resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== -pako@^1.0.4: - version "1.0.11" - resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.11.tgz#6c9599d340d54dfd3946380252a35705a6b992bf" - integrity sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw== - parent-module@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" @@ -6752,21 +7126,6 @@ parse-cache-control@^1.0.1: resolved "https://registry.yarnpkg.com/parse-cache-control/-/parse-cache-control-1.0.1.tgz#8eeab3e54fa56920fe16ba38f77fa21aacc2d74e" integrity sha1-juqz5U+laSD+Fro493+iGqzC104= -parse-duration@^0.1.2: - version "0.1.3" - resolved "https://registry.yarnpkg.com/parse-duration/-/parse-duration-0.1.3.tgz#c2c4d45d49513d544e129b2a5a07b9473545d19a" - integrity sha512-hMOZHfUmjxO5hMKn7Eft+ckP2M4nV4yzauLXiw3PndpkASnx5r8pDAMcOAiqxoemqWjMWmz4fOHQM6n6WwETXw== - -parse-glob@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/parse-glob/-/parse-glob-3.0.4.tgz#b2c376cfb11f35513badd173ef0bb6e3a388391c" - integrity sha1-ssN2z7EfNVE7rdFz7wu246OIORw= - dependencies: - glob-base "^0.3.0" - is-dotfile "^1.0.0" - is-extglob "^1.0.0" - is-glob "^2.0.0" - parse-headers@^2.0.0: version "2.0.3" resolved "https://registry.yarnpkg.com/parse-headers/-/parse-headers-2.0.3.tgz#5e8e7512383d140ba02f0c7aa9f49b4399c92515" @@ -6779,12 +7138,13 @@ parse-json@^2.2.0: dependencies: error-ex "^1.2.0" -parse5@^3.0.1: - version "3.0.3" - resolved "https://registry.yarnpkg.com/parse5/-/parse5-3.0.3.tgz#042f792ffdd36851551cf4e9e066b3874ab45b5c" - integrity sha512-rgO9Zg5LLLkfJF9E6CCmXlSE4UVceloys8JrFqCcHloC3usd/kJCyPDwH2SOlzix2j3xaP9sUX3e8+kvkuleAA== +parse-json@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0" + integrity sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA= dependencies: - "@types/node" "*" + error-ex "^1.3.1" + json-parse-better-errors "^1.0.1" parseurl@~1.3.3: version "1.3.3" @@ -6796,6 +7156,36 @@ pascalcase@^0.1.1: resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ= +patch-package@6.2.2, patch-package@^6.2.2: + version "6.2.2" + resolved "https://registry.yarnpkg.com/patch-package/-/patch-package-6.2.2.tgz#71d170d650c65c26556f0d0fbbb48d92b6cc5f39" + integrity sha512-YqScVYkVcClUY0v8fF0kWOjDYopzIM8e3bj/RU1DPeEF14+dCGm6UeOYm4jvCyxqIEQ5/eJzmbWfDWnUleFNMg== + dependencies: + "@yarnpkg/lockfile" "^1.1.0" + chalk "^2.4.2" + cross-spawn "^6.0.5" + find-yarn-workspace-root "^1.2.1" + fs-extra "^7.0.1" + is-ci "^2.0.0" + klaw-sync "^6.0.0" + minimist "^1.2.0" + rimraf "^2.6.3" + semver "^5.6.0" + slash "^2.0.0" + tmp "^0.0.33" + +path-browserify@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-1.0.1.tgz#d98454a9c3753d5790860f16f68867b9e46be1fd" + integrity sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g== + +path-exists@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b" + integrity sha1-D+tsZPD8UY2adU3V77YscCJ2H0s= + dependencies: + pinkie-promise "^2.0.0" + path-exists@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" @@ -6806,16 +7196,26 @@ path-exists@^4.0.0: resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== -path-is-absolute@^1.0.0: +path-is-absolute@^1.0.0, path-is-absolute@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= +path-is-inside@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" + integrity sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM= + path-key@^2.0.0, path-key@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= +path-key@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" + integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== + path-parse@^1.0.6: version "1.0.6" resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" @@ -6826,6 +7226,15 @@ path-to-regexp@0.1.7: resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" integrity sha1-32BBeABfUi8V60SQ5yR6G/qmf4w= +path-type@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441" + integrity sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE= + dependencies: + graceful-fs "^4.1.2" + pify "^2.0.0" + pinkie-promise "^2.0.0" + path-type@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/path-type/-/path-type-2.0.0.tgz#f012ccb8415b7096fc2daa1054c3d72389594c73" @@ -6843,7 +7252,7 @@ pathval@^1.1.0: resolved "https://registry.yarnpkg.com/pathval/-/pathval-1.1.0.tgz#b942e6d4bde653005ef6b71361def8727d0645e0" integrity sha1-uULm1L3mUwBe9rcTYd74cn0GReA= -pbkdf2@^3.0.17, pbkdf2@^3.0.3: +pbkdf2@^3.0.17, pbkdf2@^3.0.3, pbkdf2@^3.0.9: version "3.1.1" resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.1.1.tgz#cb8724b0fada984596856d1a6ebafd3584654b94" integrity sha512-4Ejy1OPxi9f2tt1rRV7Go7zmfDQ+ZectEQz3VGUQhgq62HtIRPDyG/JtnwIxs6x3uNMwo2V7q1fMvKjb+Tnpqg== @@ -6854,16 +7263,6 @@ pbkdf2@^3.0.17, pbkdf2@^3.0.3: safe-buffer "^5.0.1" sha.js "^2.4.8" -pegjs@^0.10.0: - version "0.10.0" - resolved "https://registry.yarnpkg.com/pegjs/-/pegjs-0.10.0.tgz#cf8bafae6eddff4b5a7efb185269eaaf4610ddbd" - integrity sha1-z4uvrm7d/0tafvsYUmnqr0YQ3b0= - -pend@~1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50" - integrity sha1-elfrVQpng/kRUzH89GY9XI4AelA= - performance-now@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" @@ -6879,11 +7278,6 @@ pify@^2.0.0, pify@^2.3.0: resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw= -pify@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" - integrity sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY= - pify@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" @@ -6913,11 +7307,21 @@ posix-character-classes@^0.1.0: resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs= +postinstall-postinstall@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/postinstall-postinstall/-/postinstall-postinstall-2.1.0.tgz#4f7f77441ef539d1512c40bd04c71b06a4704ca3" + integrity sha512-7hQX6ZlZXIoRiWNrbMQaLzUUfH+sSx39u8EJ9HYuDc1kLo9IXKWjM5RSquZN1ad5GnH8CGFM78fsAAQi3OKEEQ== + precond@0.2: version "0.2.3" resolved "https://registry.yarnpkg.com/precond/-/precond-0.2.3.tgz#aa9591bcaa24923f1e0f4849d240f47efc1075ac" integrity sha1-qpWRvKokkj8eD0hJ0kD0fvwQdaw= +prelude-ls@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" + integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== + prelude-ls@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" @@ -6933,30 +7337,44 @@ prepend-http@^2.0.0: resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-2.0.0.tgz#e92434bfa5ea8c19f41cdfd401d741a3c819d897" integrity sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc= -preserve@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b" - integrity sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks= +prettier-plugin-solidity@^1.0.0-beta.3: + version "1.0.0-beta.3" + resolved "https://registry.yarnpkg.com/prettier-plugin-solidity/-/prettier-plugin-solidity-1.0.0-beta.3.tgz#bb0385d75c7762eb29c638c1ba55c48687c13be0" + integrity sha512-iLbf5ZqwSUqi/BQuRGh+fHy0y3VLX9WayI7qB3wqakSUHItbiKsUKyXbTeho4pfTJVr0D3M4c8BNuEr2OMAOVg== + dependencies: + "@solidity-parser/parser" "^0.11.0" + dir-to-object "^2.0.0" + emoji-regex "^9.0.0" + escape-string-regexp "^4.0.0" + prettier "^2.0.5" + semver "^7.3.2" + solidity-comments-extractor "^0.0.4" + string-width "^4.2.0" -prettier@^1.18.2: +prettier@^1.14.3: version "1.19.1" resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.19.1.tgz#f7d7f5ff8a9cd872a7be4ca142095956a60797cb" integrity sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew== -prettier@^2.1.2: - version "2.2.0" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.2.0.tgz#8a03c7777883b29b37fb2c4348c66a78e980418b" - integrity sha512-yYerpkvseM4iKD/BXLYUkQV5aKt4tQPqaGW6EsZjzyu0r7sVZZNPJW4Y8MyKmicp6t42XUPcBVA+H6sB3gqndw== +prettier@^2.0.5, prettier@^2.1.2, prettier@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.2.1.tgz#795a1a78dd52f073da0cd42b21f9c91381923ff5" + integrity sha512-PqyhM2yCjg/oKkFPtTGUojv7gnZAoG80ttl45O6x2Ug/rMJw4wcc9k6aaf2hibP7BGVCCM33gZoGjyvt9mm16Q== + +private@^0.1.6, private@^0.1.8: + version "0.1.8" + resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff" + integrity sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg== process-nextick-args@~2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== -process@~0.5.1: - version "0.5.2" - resolved "https://registry.yarnpkg.com/process/-/process-0.5.2.tgz#1638d8a8e34c2f440a91db95ab9aeb677fc185cf" - integrity sha1-FjjYqONML0QKkduVq5rrZ3/Bhc8= +process@^0.11.10: + version "0.11.10" + resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" + integrity sha1-czIwDoQBYb2j5podHZGn1LwW8YI= progress@^2.0.0: version "2.0.3" @@ -7000,7 +7418,7 @@ prr@~1.0.1: resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" integrity sha1-0/wRS6BplaRexok/SEzrHXj19HY= -pseudomap@^1.0.2: +pseudomap@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" integrity sha1-8FKijacOYYkX7wqKw0wa5aaChrM= @@ -7022,6 +7440,54 @@ public-encrypt@^4.0.0: randombytes "^2.0.1" safe-buffer "^5.1.2" +pull-cat@^1.1.9: + version "1.1.11" + resolved "https://registry.yarnpkg.com/pull-cat/-/pull-cat-1.1.11.tgz#b642dd1255da376a706b6db4fa962f5fdb74c31b" + integrity sha1-tkLdElXaN2pwa220+pYvX9t0wxs= + +pull-defer@^0.2.2: + version "0.2.3" + resolved "https://registry.yarnpkg.com/pull-defer/-/pull-defer-0.2.3.tgz#4ee09c6d9e227bede9938db80391c3dac489d113" + integrity sha512-/An3KE7mVjZCqNhZsr22k1Tx8MACnUnHZZNPSJ0S62td8JtYr/AiRG42Vz7Syu31SoTLUzVIe61jtT/pNdjVYA== + +pull-level@^2.0.3: + version "2.0.4" + resolved "https://registry.yarnpkg.com/pull-level/-/pull-level-2.0.4.tgz#4822e61757c10bdcc7cf4a03af04c92734c9afac" + integrity sha512-fW6pljDeUThpq5KXwKbRG3X7Ogk3vc75d5OQU/TvXXui65ykm+Bn+fiktg+MOx2jJ85cd+sheufPL+rw9QSVZg== + dependencies: + level-post "^1.0.7" + pull-cat "^1.1.9" + pull-live "^1.0.1" + pull-pushable "^2.0.0" + pull-stream "^3.4.0" + pull-window "^2.1.4" + stream-to-pull-stream "^1.7.1" + +pull-live@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/pull-live/-/pull-live-1.0.1.tgz#a4ecee01e330155e9124bbbcf4761f21b38f51f5" + integrity sha1-pOzuAeMwFV6RJLu89HYfIbOPUfU= + dependencies: + pull-cat "^1.1.9" + pull-stream "^3.4.0" + +pull-pushable@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/pull-pushable/-/pull-pushable-2.2.0.tgz#5f2f3aed47ad86919f01b12a2e99d6f1bd776581" + integrity sha1-Xy867UethpGfAbEqLpnW8b13ZYE= + +pull-stream@^3.2.3, pull-stream@^3.4.0, pull-stream@^3.6.8: + version "3.6.14" + resolved "https://registry.yarnpkg.com/pull-stream/-/pull-stream-3.6.14.tgz#529dbd5b86131f4a5ed636fdf7f6af00781357ee" + integrity sha512-KIqdvpqHHaTUA2mCYcLG1ibEbu/LCKoJZsBWyv9lSYtPkJPBq8m3Hxa103xHi6D2thj5YXa0TqK3L3GUkwgnew== + +pull-window@^2.1.4: + version "2.1.4" + resolved "https://registry.yarnpkg.com/pull-window/-/pull-window-2.1.4.tgz#fc3b86feebd1920c7ae297691e23f705f88552f0" + integrity sha1-/DuG/uvRkgx64pdpHiP3BfiFUvA= + dependencies: + looper "^2.0.0" + pump@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" @@ -7030,6 +7496,11 @@ pump@^3.0.0: end-of-stream "^1.1.0" once "^1.3.1" +punycode@1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" + integrity sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0= + punycode@2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.0.tgz#5f863edc89b96db09074bad7947bf09056ca4e7d" @@ -7046,9 +7517,9 @@ qs@6.7.0: integrity sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ== qs@^6.4.0, qs@^6.7.0: - version "6.9.4" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.9.4.tgz#9090b290d1f91728d3c22e54843ca44aea5ab687" - integrity sha512-A1kFqHekCTM7cz0udomYUoYNWjBebHm/5wzU/XqrBRBNWectVH0QIiN+NEcZ0Dte5hvzHwbr8+XQmguPhJ6WdQ== + version "6.9.6" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.9.6.tgz#26ed3c8243a431b2924aca84cc90471f35d5a0ee" + integrity sha512-TIRk4aqYLNoJUbd+g2lEdz5kLWIuTMRagAXxl78Q0RiVjAOugHmeKNGdd3cwo/ktpf9aL9epCfFqWDEKysUlLQ== qs@~6.5.2: version "6.5.2" @@ -7069,15 +7540,6 @@ querystring@0.2.0: resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" integrity sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA= -randomatic@^3.0.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-3.1.1.tgz#b776efc59375984e36c537b2f51a1f0aff0da1ed" - integrity sha512-TuDE5KxZ0J461RVjrJZCJc+J+zCkTb1MbH9AQUq68sMhOMcy9jLcb3BrZKgp9q9Ncltdg4QVqWrH02W2EFFVYw== - dependencies: - is-number "^4.0.0" - kind-of "^6.0.0" - math-random "^1.0.1" - randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5, randombytes@^2.0.6, randombytes@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" @@ -7123,6 +7585,14 @@ react-is@^16.8.1: resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== +read-pkg-up@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02" + integrity sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI= + dependencies: + find-up "^1.0.0" + read-pkg "^1.0.0" + read-pkg-up@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-2.0.0.tgz#6b72a8048984e0c41e79510fd5e9fa99b3b549be" @@ -7131,6 +7601,15 @@ read-pkg-up@^2.0.0: find-up "^2.0.0" read-pkg "^2.0.0" +read-pkg@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28" + integrity sha1-9f+qXs0pyzHAR0vKfXVra7KePyg= + dependencies: + load-json-file "^1.0.0" + normalize-package-data "^2.3.2" + path-type "^1.0.0" + read-pkg@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-2.0.0.tgz#8ef1c0623c6a6db0dc6713c4bfac46332b2368f8" @@ -7150,7 +7629,7 @@ readable-stream@^1.0.33: isarray "0.0.1" string_decoder "~0.10.x" -readable-stream@^2.0.0, readable-stream@^2.0.2, readable-stream@^2.2.2, readable-stream@^2.2.8, readable-stream@^2.2.9, readable-stream@^2.3.0, readable-stream@^2.3.5, readable-stream@^2.3.6: +readable-stream@^2.0.0, readable-stream@^2.0.5, readable-stream@^2.2.2, readable-stream@^2.2.8, readable-stream@^2.2.9, readable-stream@^2.3.6, readable-stream@~2.3.6: version "2.3.7" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== @@ -7163,7 +7642,7 @@ readable-stream@^2.0.0, readable-stream@^2.0.2, readable-stream@^2.2.2, readable string_decoder "~1.1.1" util-deprecate "~1.0.1" -readable-stream@^3.0.6, readable-stream@^3.1.1, readable-stream@^3.6.0: +readable-stream@^3.0.6, readable-stream@^3.6.0: version "3.6.0" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== @@ -7182,15 +7661,6 @@ readable-stream@~1.0.15: isarray "0.0.1" string_decoder "~0.10.x" -readdirp@^2.0.0: - version "2.2.1" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.2.1.tgz#0e87622a3325aa33e892285caf8b4e846529a525" - integrity sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ== - dependencies: - graceful-fs "^4.1.11" - micromatch "^3.1.10" - readable-stream "^2.0.2" - readdirp@~3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.2.0.tgz#c30c33352b12c96dfb4b895421a49fd5a9593839" @@ -7219,17 +7689,29 @@ recursive-readdir@^2.2.2: dependencies: minimatch "3.0.4" +regenerate@^1.2.1: + version "1.4.2" + resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.2.tgz#b9346d8827e8f5a32f7ba29637d398b69014848a" + integrity sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A== + +regenerator-runtime@^0.11.0: + version "0.11.1" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9" + integrity sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg== + regenerator-runtime@^0.13.4: version "0.13.7" resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz#cac2dacc8a1ea675feaabaeb8ae833898ae46f55" integrity sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew== -regex-cache@^0.4.2: - version "0.4.4" - resolved "https://registry.yarnpkg.com/regex-cache/-/regex-cache-0.4.4.tgz#75bdc58a2a1496cec48a12835bc54c8d562336dd" - integrity sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ== +regenerator-transform@^0.10.0: + version "0.10.1" + resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.10.1.tgz#1e4996837231da8b7f3cf4114d71b5691a0680dd" + integrity sha512-PJepbvDbuK1xgIgnau7Y90cwaAmO/LCLMI2mPvaXq2heGMR3aWW5/BQvYrhJ8jgmQjXewXvBjzfqKcVOmhjZ6Q== dependencies: - is-equal-shallow "^0.1.3" + babel-runtime "^6.18.0" + babel-types "^6.19.0" + private "^0.1.6" regex-not@^1.0.0, regex-not@^1.0.2: version "1.0.2" @@ -7239,39 +7721,62 @@ regex-not@^1.0.0, regex-not@^1.0.2: extend-shallow "^3.0.2" safe-regex "^1.1.0" -regexp.prototype.flags@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.3.0.tgz#7aba89b3c13a64509dabcf3ca8d9fbb9bdf5cb75" - integrity sha512-2+Q0C5g951OlYlJz6yu5/M33IcsESLlLfsyIaLJaG4FA2r4yP8MvVMJUUP/fVBkSpbbbZlS5gynbEWLipiiXiQ== +regexp.prototype.flags@^1.2.0, regexp.prototype.flags@^1.3.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.3.1.tgz#7ef352ae8d159e758c0eadca6f8fcb4eef07be26" + integrity sha512-JiBdRBq91WlY7uRJ0ds7R+dU02i6LKi8r3BuQhNXn+kmeLN+EfHhfjqMRis1zJxnlu88hq/4dx0P2OP3APRTOA== dependencies: + call-bind "^1.0.2" define-properties "^1.1.3" - es-abstract "^1.17.0-next.1" regexpp@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-2.0.1.tgz#8d19d31cf632482b589049f8281f93dbcba4d07f" integrity sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw== -regexpp@^3.0.0: +regexpp@^3.0.0, regexpp@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.1.0.tgz#206d0ad0a5648cffbdb8ae46438f3dc51c9f78e2" integrity sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q== -remove-trailing-separator@^1.0.1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" - integrity sha1-wkvOKig62tW8P1jg1IJJuSN52O8= +regexpu-core@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-2.0.0.tgz#49d038837b8dcf8bfa5b9a42139938e6ea2ae240" + integrity sha1-SdA4g3uNz4v6W5pCE5k45uoq4kA= + dependencies: + regenerate "^1.2.1" + regjsgen "^0.2.0" + regjsparser "^0.1.4" + +regjsgen@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.2.0.tgz#6c016adeac554f75823fe37ac05b92d5a4edb1f7" + integrity sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc= + +regjsparser@^0.1.4: + version "0.1.5" + resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.1.5.tgz#7ee8f84dc6fa792d3fd0ae228d24bd949ead205c" + integrity sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw= + dependencies: + jsesc "~0.5.0" repeat-element@^1.1.2: version "1.1.3" resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.3.tgz#782e0d825c0c5a3bb39731f84efee6b742e6b1ce" integrity sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g== -repeat-string@^1.5.2, repeat-string@^1.6.1: +repeat-string@^1.6.1: version "1.6.1" resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc= +repeating@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda" + integrity sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo= + dependencies: + is-finite "^1.0.0" + req-cwd@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/req-cwd/-/req-cwd-2.0.0.tgz#d4082b4d44598036640fb73ddea01ed53db49ebc" @@ -7333,7 +7838,12 @@ require-directory@^2.1.1: resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= -require-from-string@^2.0.0: +require-from-string@^1.1.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-1.2.1.tgz#529c9ccef27380adfec9a2f965b649bbee636418" + integrity sha1-UpyczvJzgK3+yaL5ZbZJu+5jZBg= + +require-from-string@^2.0.0, require-from-string@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== @@ -7368,7 +7878,7 @@ resolve@1.1.x: resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" integrity sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs= -resolve@1.17.0: +resolve@1.17.0, resolve@~1.17.0: version "1.17.0" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.17.0.tgz#b25941b54968231cc2d1bb76a79cb7f2c0bf8444" integrity sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w== @@ -7390,14 +7900,21 @@ responselike@^1.0.2: dependencies: lowercase-keys "^1.0.0" -restore-cursor@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" - integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA== +restore-cursor@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf" + integrity sha1-n37ih/gv0ybU/RYpI9YhKe7g368= dependencies: - onetime "^5.1.0" + onetime "^2.0.0" signal-exit "^3.0.2" +resumer@~0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/resumer/-/resumer-0.0.0.tgz#f1e8f461e4064ba39e82af3cdc2a8c893d076759" + integrity sha1-8ej0YeQGS6Oegq883CqMiT0HZ1k= + dependencies: + through "~2.3.4" + ret@~0.1.10: version "0.1.15" resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" @@ -7415,13 +7932,20 @@ rimraf@2.6.3: dependencies: glob "^7.1.3" -rimraf@^2.2.8: +rimraf@^2.2.8, rimraf@^2.6.3: version "2.7.1" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== dependencies: glob "^7.1.3" +rimraf@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" + integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== + dependencies: + glob "^7.1.3" + ripemd160@^2.0.0, ripemd160@^2.0.1: version "2.0.2" resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c" @@ -7437,7 +7961,7 @@ rlp@^2.0.0, rlp@^2.2.1, rlp@^2.2.2, rlp@^2.2.3, rlp@^2.2.4: dependencies: bn.js "^4.11.1" -run-async@^2.4.0: +run-async@^2.2.0: version "2.4.1" resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.4.1.tgz#8440eccf99ea3e70bd409d49aab88e10c189a455" integrity sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ== @@ -7452,7 +7976,7 @@ rustbn.js@~0.2.0: resolved "https://registry.yarnpkg.com/rustbn.js/-/rustbn.js-0.2.0.tgz#8082cb886e707155fd1cb6f23bd591ab8d55d0ca" integrity sha512-4VlvkRUuCJvr2J6Y0ImW7NvTCriMi7ErOAqWk1y69vAdoNIzCF3yPmgeNzx+RQTLEDFq5sHfscn1MwHxP9hNfA== -rxjs@^6.6.0: +rxjs@^6.4.0: version "6.6.3" resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.6.3.tgz#8ca84635c4daa900c0d3967a6ee7ac60271ee552" integrity sha512-trsQc+xYYXZ3urjOiJOuCOa5N3jAZ3eiSpQB5hIT8zGlL2QfnHLJ2r7GMkBGuIausdJN1OneaI6gQlsqNHHmZQ== @@ -7508,28 +8032,16 @@ sc-istanbul@^0.4.5: which "^1.1.1" wordwrap "^1.0.0" -scrypt-js@2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/scrypt-js/-/scrypt-js-2.0.3.tgz#bb0040be03043da9a012a2cea9fc9f852cfc87d4" - integrity sha1-uwBAvgMEPamgEqLOqfyfhSz8h9Q= - scrypt-js@2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/scrypt-js/-/scrypt-js-2.0.4.tgz#32f8c5149f0797672e551c07e230f834b6af5f16" integrity sha512-4KsaGcPnuhtCZQCxFxN3GVYIhKFPTdLd8PLC552XwbMndtD0cjRFAhDuuydXQ0h08ZfPgzqe6EKHozpuH74iDw== -scrypt-js@^3.0.0, scrypt-js@^3.0.1: +scrypt-js@3.0.1, scrypt-js@^3.0.0, scrypt-js@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/scrypt-js/-/scrypt-js-3.0.1.tgz#d314a57c2aef69d1ad98a138a21fe9eafa9ee312" integrity sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA== -"scrypt-shim@github:web3-js/scrypt-shim": - version "0.1.0" - resolved "https://codeload.github.com/web3-js/scrypt-shim/tar.gz/aafdadda13e660e25e1c525d1f5b2443f5eb1ebb" - dependencies: - scryptsy "^2.1.0" - semver "^6.3.0" - scryptsy@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/scryptsy/-/scryptsy-1.2.1.tgz#a3225fa4b2524f802700761e2855bdf3b2d92163" @@ -7537,11 +8049,6 @@ scryptsy@^1.2.1: dependencies: pbkdf2 "^3.0.3" -scryptsy@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/scryptsy/-/scryptsy-2.1.0.tgz#8d1e8d0c025b58fdd25b6fa9a0dc905ee8faa790" - integrity sha512-1CdSqHQowJBnMAFyPEBRfqag/YP9OF394FV+4YREIJX4ljD7OxvQRDayyoyyCk+senRjSkP6VnUNQmVQqB6g7w== - secp256k1@^3.0.1: version "3.8.0" resolved "https://registry.yarnpkg.com/secp256k1/-/secp256k1-3.8.0.tgz#28f59f4b01dbee9575f56a47034b7d2e3b3b352d" @@ -7565,32 +8072,32 @@ secp256k1@^4.0.1: node-addon-api "^2.0.0" node-gyp-build "^4.2.0" -seek-bzip@^1.0.5: - version "1.0.6" - resolved "https://registry.yarnpkg.com/seek-bzip/-/seek-bzip-1.0.6.tgz#35c4171f55a680916b52a07859ecf3b5857f21c4" - integrity sha512-e1QtP3YL5tWww8uKaOCQ18UxIT2laNBXHjV/S2WYCiK4udiv8lkG89KRIoCjUagnAmCBurjF4zEVX2ByBbnCjQ== - dependencies: - commander "^2.8.1" +seedrandom@3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/seedrandom/-/seedrandom-3.0.1.tgz#eb3dde015bcf55df05a233514e5df44ef9dce083" + integrity sha512-1/02Y/rUeU1CJBAGLebiC5Lbo5FnB22gQbIFFYTLkwvp1xdABZJH1sn4ZT1MzXmPpzv+Rf/Lu2NcsLJiK4rcDg== semaphore@>=1.0.1, semaphore@^1.0.3, semaphore@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/semaphore/-/semaphore-1.1.0.tgz#aaad8b86b20fe8e9b32b16dc2ee682a8cd26a8aa" integrity sha512-O4OZEaNtkMd/K0i6js9SL+gqy0ZCBMgUvlSqHKi4IBdjhe7wB8pwztUk1BbZ1fmrvpwFrPbHzqd2w5pTcJH6LA== -"semver@2 || 3 || 4 || 5", semver@^5.5.0, semver@^5.5.1, semver@^5.6.0, semver@^5.7.0: +"semver@2 || 3 || 4 || 5", semver@^5.3.0, semver@^5.5.0, semver@^5.5.1, semver@^5.6.0, semver@^5.7.0: version "5.7.1" resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== -semver@^6.1.2, semver@^6.3.0: +semver@^6.3.0: version "6.3.0" resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== -semver@^7.3.2: - version "7.3.2" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.2.tgz#604962b052b81ed0786aae84389ffba70ffd3938" - integrity sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ== +semver@^7.2.1, semver@^7.3.2: + version "7.3.4" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.4.tgz#27aaa7d2e4ca76452f98d3add093a72c943edc97" + integrity sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw== + dependencies: + lru-cache "^6.0.0" semver@~5.4.1: version "5.4.1" @@ -7616,6 +8123,13 @@ send@0.17.1: range-parser "~1.2.1" statuses "~1.5.0" +serialize-javascript@5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-5.0.1.tgz#7886ec848049a462467a97d3d918ebb2aaf934f4" + integrity sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA== + dependencies: + randombytes "^2.1.0" + serve-static@1.14.1: version "1.14.1" resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.14.1.tgz#666e636dc4f010f7ef29970a88a674320898b2f9" @@ -7695,11 +8209,23 @@ shebang-command@^1.2.0: dependencies: shebang-regex "^1.0.0" +shebang-command@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" + integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== + dependencies: + shebang-regex "^3.0.0" + shebang-regex@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= +shebang-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" + integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== + shelljs@^0.8.3: version "0.8.4" resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.8.4.tgz#de7684feeb767f8716b326078a8a00875890e3c2" @@ -7710,12 +8236,13 @@ shelljs@^0.8.3: rechoir "^0.6.2" side-channel@^1.0.2, side-channel@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.3.tgz#cdc46b057550bbab63706210838df5d4c19519c3" - integrity sha512-A6+ByhlLkksFoUepsGxfj5x1gTSrs+OydsRptUxeNCabQpCFUvcwIczgOigI8vhY/OJCnPnyE9rGiwgvr9cS1g== + version "1.0.4" + resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" + integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== dependencies: - es-abstract "^1.18.0-next.0" - object-inspect "^1.8.0" + call-bind "^1.0.0" + get-intrinsic "^1.0.2" + object-inspect "^1.9.0" signal-exit@^3.0.0, signal-exit@^3.0.2: version "3.0.3" @@ -7736,6 +8263,16 @@ simple-get@^2.7.0: once "^1.3.1" simple-concat "^1.0.0" +slash@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" + integrity sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU= + +slash@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-2.0.0.tgz#de552851a1759df3a8f206535442f5ec4ddeab44" + integrity sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A== + slash@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" @@ -7750,6 +8287,15 @@ slice-ansi@^2.1.0: astral-regex "^1.0.0" is-fullwidth-code-point "^2.0.0" +slice-ansi@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-4.0.0.tgz#500e8dd0fd55b05815086255b3195adf2a45fe6b" + integrity sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ== + dependencies: + ansi-styles "^4.0.0" + astral-regex "^2.0.0" + is-fullwidth-code-point "^3.0.0" + snapdragon-node@^2.0.1: version "2.1.1" resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" @@ -7780,29 +8326,6 @@ snapdragon@^0.8.1: source-map-resolve "^0.5.0" use "^3.1.0" -sol-digger@0.0.2: - version "0.0.2" - resolved "https://registry.yarnpkg.com/sol-digger/-/sol-digger-0.0.2.tgz#406c4a9d31e269e7f88eb1c2ea101318e5e09025" - integrity sha1-QGxKnTHiaef4jrHC6hATGOXgkCU= - -sol-explore@1.6.1: - version "1.6.1" - resolved "https://registry.yarnpkg.com/sol-explore/-/sol-explore-1.6.1.tgz#b59f073c69fe332560d5a10c32ba8ca7f2986cfb" - integrity sha1-tZ8HPGn+MyVg1aEMMrqMp/KYbPs= - -sol-merger@3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/sol-merger/-/sol-merger-3.0.1.tgz#b87cdd15dbcc4aa741fd1ac307a7e178f0356a87" - integrity sha512-zVYm51Kym+lruM5DLuhRjYeiQ014TXM3iWpVluR6oVjTEFKF/Q/LmrcQZK7JF/ceK9zpYpcU1YJPdZRvEsvV5w== - dependencies: - antlr4ts "^0.5.0-alpha.3" - cli-color "^1.4.0" - commander "^4.0.1" - debug "^4.1.1" - fs-extra "^8.0.1" - glob "^7.1.2" - strip-json-comments "^3.0.1" - sol-merger@^3.0.1: version "3.1.0" resolved "https://registry.yarnpkg.com/sol-merger/-/sol-merger-3.1.0.tgz#547b282a616d106c0fa8869e0a275fd7db0213d8" @@ -7816,13 +8339,14 @@ sol-merger@^3.0.1: glob "^7.1.2" strip-json-comments "^3.0.1" -solc@0.5.16: - version "0.5.16" - resolved "https://registry.yarnpkg.com/solc/-/solc-0.5.16.tgz#6c8d710a3792ccc79db924606b558a1149b1c603" - integrity sha512-weEtRtisJyf+8UjELs7S4ST1KK7UIq6SRB7tpprfJBL9b5mTrZAT7m4gJKi2h6MiBpuSWfnraK8BnkyWzuTMRA== +solc@0.7.3: + version "0.7.3" + resolved "https://registry.yarnpkg.com/solc/-/solc-0.7.3.tgz#04646961bd867a744f63d2b4e3c0701ffdc7d78a" + integrity sha512-GAsWNAjGzIDg7VxzP6mPjdurby3IkGCjQcM8GFYZT6RyaoUZKmMU6Y7YwG+tFGhv7dwZ8rmR4iwFDrrD99JwqA== dependencies: command-exists "^1.2.8" commander "3.0.2" + follow-redirects "^1.12.1" fs-extra "^0.30.0" js-sha3 "0.8.0" memorystream "^0.3.1" @@ -7830,10 +8354,10 @@ solc@0.5.16: semver "^5.5.0" tmp "0.0.33" -solc@0.7.3: - version "0.7.3" - resolved "https://registry.yarnpkg.com/solc/-/solc-0.7.3.tgz#04646961bd867a744f63d2b4e3c0701ffdc7d78a" - integrity sha512-GAsWNAjGzIDg7VxzP6mPjdurby3IkGCjQcM8GFYZT6RyaoUZKmMU6Y7YwG+tFGhv7dwZ8rmR4iwFDrrD99JwqA== +solc@0.8.0: + version "0.8.0" + resolved "https://registry.yarnpkg.com/solc/-/solc-0.8.0.tgz#99828ebf4f61d298875936e8649ebe4a09f029f7" + integrity sha512-ypgvqYZhb/i5BM6cw9/5QkSlDJm/rLynsbWGP3kz6HeB6oNxPK6UMiB7jMr+tNVbQbBM/8l47vrI3XaDCHShjQ== dependencies: command-exists "^1.2.8" commander "3.0.2" @@ -7845,7 +8369,59 @@ solc@0.7.3: semver "^5.5.0" tmp "0.0.33" -solidity-coverage@^0.7.12: +solc@^0.4.20: + version "0.4.26" + resolved "https://registry.yarnpkg.com/solc/-/solc-0.4.26.tgz#5390a62a99f40806b86258c737c1cf653cc35cb5" + integrity sha512-o+c6FpkiHd+HPjmjEVpQgH7fqZ14tJpXhho+/bQXlXbliLIS/xjXb42Vxh+qQY1WCSTMQ0+a5vR9vi0MfhU6mA== + dependencies: + fs-extra "^0.30.0" + memorystream "^0.3.1" + require-from-string "^1.1.0" + semver "^5.3.0" + yargs "^4.7.1" + +solc@^0.6.3: + version "0.6.12" + resolved "https://registry.yarnpkg.com/solc/-/solc-0.6.12.tgz#48ac854e0c729361b22a7483645077f58cba080e" + integrity sha512-Lm0Ql2G9Qc7yPP2Ba+WNmzw2jwsrd3u4PobHYlSOxaut3TtUbj9+5ZrT6f4DUpNPEoBaFUOEg9Op9C0mk7ge9g== + dependencies: + command-exists "^1.2.8" + commander "3.0.2" + fs-extra "^0.30.0" + js-sha3 "0.8.0" + memorystream "^0.3.1" + require-from-string "^2.0.0" + semver "^5.5.0" + tmp "0.0.33" + +solhint@^3.3.2: + version "3.3.2" + resolved "https://registry.yarnpkg.com/solhint/-/solhint-3.3.2.tgz#ebd7270bb50fd378b427d7a6fc9f2a7fd00216c0" + integrity sha512-8tHCkIAk1axLLG6Qu2WIH3GgNABonj9eAWejJbov3o3ujkZQRNHeHU1cC4/Dmjsh3Om7UzFFeADUHu2i7ZJeiw== + dependencies: + "@solidity-parser/parser" "^0.8.2" + ajv "^6.6.1" + antlr4 "4.7.1" + ast-parents "0.0.1" + chalk "^2.4.2" + commander "2.18.0" + cosmiconfig "^5.0.7" + eslint "^5.6.0" + fast-diff "^1.1.2" + glob "^7.1.3" + ignore "^4.0.6" + js-yaml "^3.12.0" + lodash "^4.17.11" + semver "^6.3.0" + optionalDependencies: + prettier "^1.14.3" + +solidity-comments-extractor@^0.0.4: + version "0.0.4" + resolved "https://registry.yarnpkg.com/solidity-comments-extractor/-/solidity-comments-extractor-0.0.4.tgz#ce420aef23641ffd0131c7d80ba85b6e1e42147e" + integrity sha512-58glBODwXIKMaQ7rfcJOrWtFQMMOK28tJ0/LcB5Xhu7WtAxk4UX2fpgKPuaL41XjMp/y0gAa1MTLqk018wuSzA== + +solidity-coverage@0.7.12: version "0.7.12" resolved "https://registry.yarnpkg.com/solidity-coverage/-/solidity-coverage-0.7.12.tgz#0c6ca866cc6e15bfebecd71725666b3bc121f263" integrity sha512-9iCiZU1rppeZEaprN9j7QSNWzOyMqipQ1VYMPbeipVr2HI0qdxkmg/QtizyJyHz35eClmuxyBNEzXTMaFnldTA== @@ -7869,20 +8445,6 @@ solidity-coverage@^0.7.12: shelljs "^0.8.3" web3-utils "^1.3.0" -solium-plugin-security@0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/solium-plugin-security/-/solium-plugin-security-0.1.1.tgz#2a87bcf8f8c3abf7d198e292e4ac080284e3f3f6" - integrity sha512-kpLirBwIq4mhxk0Y/nn5cQ6qdJTI+U1LO3gpoNIcqNaW+sI058moXBe2UiHs+9wvF9IzYD49jcKhFTxcR9u9SQ== - -solparse@2.2.8: - version "2.2.8" - resolved "https://registry.yarnpkg.com/solparse/-/solparse-2.2.8.tgz#d13e42dbed95ce32f43894f5ec53f00d14cf9f11" - integrity sha512-Tm6hdfG72DOxD40SD+T5ddbekWglNWjzDRSNq7ZDIOHVsyaJSeeunUuWNj4DE7uDrJK3tGQuX0ZTDZWNYsGPMA== - dependencies: - mocha "^4.0.1" - pegjs "^0.10.0" - yargs "^10.0.3" - source-map-resolve@^0.5.0: version "0.5.3" resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.3.tgz#190866bece7553e1f8f267a2ee82c606b5509a1a" @@ -7902,6 +8464,13 @@ source-map-support@0.5.12: buffer-from "^1.0.0" source-map "^0.6.0" +source-map-support@^0.4.15: + version "0.4.18" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.18.tgz#0286a6de8be42641338594e97ccea75f0a2c585f" + integrity sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA== + dependencies: + source-map "^0.5.6" + source-map-support@^0.5.13, source-map-support@^0.5.17, source-map-support@^0.5.19: version "0.5.19" resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.19.tgz#a98b62f86dcaf4f67399648c085291ab9e8fed61" @@ -7915,7 +8484,7 @@ source-map-url@^0.4.0: resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3" integrity sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM= -source-map@^0.5.6: +source-map@^0.5.6, source-map@^0.5.7: version "0.5.7" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= @@ -7954,18 +8523,9 @@ spdx-expression-parse@^3.0.0: spdx-license-ids "^3.0.0" spdx-license-ids@^3.0.0: - version "3.0.6" - resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.6.tgz#c80757383c28abf7296744998cbc106ae8b854ce" - integrity sha512-+orQK83kyMva3WyPf59k1+Y525csj5JejicWut55zeTWANuN17qSiSLUXWtzHeNWORSvT7GLDJ/E/XiIWoXBTw== - -spinnies@^0.4.2: - version "0.4.3" - resolved "https://registry.yarnpkg.com/spinnies/-/spinnies-0.4.3.tgz#2ea0ad148e78353ddf621dec3951a6f4c3cbf66e" - integrity sha512-TTA2vWXrXJpfThWAl2t2hchBnCMI1JM5Wmb2uyI7Zkefdw/xO98LDy6/SBYwQPiYXL3swx3Eb44ZxgoS8X5wpA== - dependencies: - chalk "^2.4.2" - cli-cursor "^3.0.0" - strip-ansi "^5.2.0" + version "3.0.7" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.7.tgz#e9c18a410e5ed7e12442a549fbd8afa767038d65" + integrity sha512-U+MTEOO0AiDzxwFvoa4JVnMV6mZlJKk2sBLt90s7G0Gd0Mlknc7kxEn3nuDPNZRta7O2uy8oLcZLVT+4sqNZHQ== split-string@^3.0.1, split-string@^3.0.2: version "3.1.0" @@ -8019,6 +8579,14 @@ stealthy-require@^1.1.1: resolved "https://registry.yarnpkg.com/stealthy-require/-/stealthy-require-1.1.1.tgz#35b09875b4ff49f26a777e509b3090a3226bf24b" integrity sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks= +stream-to-pull-stream@^1.7.1: + version "1.7.3" + resolved "https://registry.yarnpkg.com/stream-to-pull-stream/-/stream-to-pull-stream-1.7.3.tgz#4161aa2d2eb9964de60bfa1af7feaf917e874ece" + integrity sha512-6sNyqJpr5dIOQdgNy/xcDWwDuzAsAwVzhzrWlAPAQ7Lkjx/rv0wgvxEyKwTq6FmNd5rjTrELt/CLmaSw7crMGg== + dependencies: + looper "^3.0.0" + pull-stream "^3.2.3" + strict-uri-encode@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713" @@ -8033,7 +8601,7 @@ string-width@^1.0.1: is-fullwidth-code-point "^1.0.0" strip-ansi "^3.0.0" -"string-width@^1.0.2 || 2", string-width@^2.0.0, string-width@^2.1.1: +"string-width@^1.0.2 || 2", string-width@^2.1.0, string-width@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== @@ -8050,7 +8618,7 @@ string-width@^3.0.0, string-width@^3.1.0: is-fullwidth-code-point "^2.0.0" strip-ansi "^5.1.0" -string-width@^4.1.0: +string-width@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.0.tgz#952182c46cc7b2c313d1596e623992bd163b72b5" integrity sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg== @@ -8072,21 +8640,30 @@ string.prototype.matchall@^4.0.2: regexp.prototype.flags "^1.3.0" side-channel "^1.0.3" -string.prototype.trimend@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.2.tgz#6ddd9a8796bc714b489a3ae22246a208f37bfa46" - integrity sha512-8oAG/hi14Z4nOVP0z6mdiVZ/wqjDtWSLygMigTzAb+7aPEDTleeFf+WrF+alzecxIRkckkJVn+dTlwzJXORATw== +string.prototype.trim@~1.2.1: + version "1.2.3" + resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.3.tgz#d23a22fde01c1e6571a7fadcb9be11decd8061a7" + integrity sha512-16IL9pIBA5asNOSukPfxX2W68BaBvxyiRK16H3RA/lWW9BDosh+w7f+LhomPHpXJ82QEe7w7/rY/S1CV97raLg== dependencies: + call-bind "^1.0.0" define-properties "^1.1.3" es-abstract "^1.18.0-next.1" -string.prototype.trimstart@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.2.tgz#22d45da81015309cd0cdd79787e8919fc5c613e7" - integrity sha512-7F6CdBTl5zyu30BJFdzSTlSlLPwODC23Od+iLoVH8X6+3fvDPPuBVVj9iaB1GOsSTSIgVfsfm27R2FGrAPznWg== +string.prototype.trimend@^1.0.1, string.prototype.trimend@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.3.tgz#a22bd53cca5c7cf44d7c9d5c732118873d6cd18b" + integrity sha512-ayH0pB+uf0U28CtjlLvL7NaohvR1amUvVZk+y3DYb0Ey2PUV5zPkkKy9+U1ndVEIXO8hNg18eIv9Jntbii+dKw== dependencies: + call-bind "^1.0.0" + define-properties "^1.1.3" + +string.prototype.trimstart@^1.0.1, string.prototype.trimstart@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.3.tgz#9b4cb590e123bb36564401d59824298de50fd5aa" + integrity sha512-oBIBUy5lea5tt0ovtOFiEQaBkoBBkyJhZXzJYrSmDo5IUUqbOPvVezuRs/agBIdZ2p2Eo1FD6bD9USyBLfl3xg== + dependencies: + call-bind "^1.0.0" define-properties "^1.1.3" - es-abstract "^1.18.0-next.1" string_decoder@^1.1.1: version "1.3.0" @@ -8135,18 +8712,18 @@ strip-ansi@^6.0.0: dependencies: ansi-regex "^5.0.0" +strip-bom@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e" + integrity sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4= + dependencies: + is-utf8 "^0.2.0" + strip-bom@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" integrity sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM= -strip-dirs@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/strip-dirs/-/strip-dirs-2.1.0.tgz#4987736264fc344cf20f6c34aca9d13d1d4ed6c5" - integrity sha512-JOCxOeKLm2CAS73y/U4ZeZPTkE+gNVCzKt7Eox84Iej1LT/2pTWYpZKJuxwQpvX1LiZb1xokNR7RLfuBAa7T3g== - dependencies: - is-natural-number "^4.0.1" - strip-eof@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" @@ -8159,40 +8736,16 @@ strip-hex-prefix@1.0.0: dependencies: is-hex-prefixed "1.0.0" -strip-indent@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-2.0.0.tgz#5ef8db295d01e6ed6cbf7aab96998d7822527b68" - integrity sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g= - -strip-json-comments@2.0.1: +strip-json-comments@2.0.1, strip-json-comments@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= -strip-json-comments@^3.0.1: +strip-json-comments@3.1.1, strip-json-comments@^3.0.1, strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== -super-split@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/super-split/-/super-split-1.1.0.tgz#43b3ba719155f4d43891a32729d59b213d9155fc" - integrity sha512-I4bA5mgcb6Fw5UJ+EkpzqXfiuvVGS/7MuND+oBxNFmxu3ugLNrdIatzBLfhFRMVMLxgSsRy+TjIktgkF9RFSNQ== - -supports-color@4.4.0: - version "4.4.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-4.4.0.tgz#883f7ddabc165142b2a61427f3352ded195d1a3e" - integrity sha512-rKC3+DyXWgK0ZLKwmRsrkyHVZAjNkfzeehuFWdGGcqGDTZFH73+RH6S/RDAAxl9GusSjZSUWYLmT9N5pzXFOXQ== - dependencies: - has-flag "^2.0.0" - -supports-color@5.4.0: - version "5.4.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.4.0.tgz#1c6b337402c2137605efe19f10fec390f6faab54" - integrity sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w== - dependencies: - has-flag "^3.0.0" - supports-color@6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-6.0.0.tgz#76cfe742cf1f41bb9b1c29ad03068c05b4c0e40a" @@ -8200,6 +8753,18 @@ supports-color@6.0.0: dependencies: has-flag "^3.0.0" +supports-color@7.2.0, supports-color@^7.1.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" + integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== + dependencies: + has-flag "^4.0.0" + +supports-color@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" + integrity sha1-U10EXOa2Nj+kARcIRimZXp3zJMc= + supports-color@^3.1.0: version "3.2.3" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.2.3.tgz#65ac0504b3954171d8a64946b2ae3cbb8a5f54f6" @@ -8214,31 +8779,6 @@ supports-color@^5.3.0: dependencies: has-flag "^3.0.0" -supports-color@^7.1.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" - integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== - dependencies: - has-flag "^4.0.0" - -swarm-js@0.1.39: - version "0.1.39" - resolved "https://registry.yarnpkg.com/swarm-js/-/swarm-js-0.1.39.tgz#79becb07f291d4b2a178c50fee7aa6e10342c0e8" - integrity sha512-QLMqL2rzF6n5s50BptyD6Oi0R1aWlJC5Y17SRIVXRj6OR1DRIPM7nepvrxxkjA1zNzFz6mUOMjfeqeDaWB7OOg== - dependencies: - bluebird "^3.5.0" - buffer "^5.0.5" - decompress "^4.0.0" - eth-lib "^0.1.26" - fs-extra "^4.0.2" - got "^7.1.0" - mime-types "^2.1.16" - mkdirp-promise "^5.0.1" - mock-fs "^4.1.0" - setimmediate "^1.0.5" - tar "^4.0.2" - xhr-request-promise "^0.1.2" - swarm-js@^0.1.40: version "0.1.40" resolved "https://registry.yarnpkg.com/swarm-js/-/swarm-js-0.1.40.tgz#b1bc7b6dcc76061f6c772203e004c11997e06b99" @@ -8282,18 +8822,36 @@ table@^5.2.3: slice-ansi "^2.1.0" string-width "^3.0.0" -tar-stream@^1.5.2: - version "1.6.2" - resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-1.6.2.tgz#8ea55dab37972253d9a9af90fdcd559ae435c555" - integrity sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A== - dependencies: - bl "^1.0.0" - buffer-alloc "^1.2.0" - end-of-stream "^1.0.0" - fs-constants "^1.0.0" - readable-stream "^2.3.0" - to-buffer "^1.1.1" - xtend "^4.0.0" +table@^6.0.4: + version "6.0.7" + resolved "https://registry.yarnpkg.com/table/-/table-6.0.7.tgz#e45897ffbcc1bcf9e8a87bf420f2c9e5a7a52a34" + integrity sha512-rxZevLGTUzWna/qBLObOe16kB2RTnnbhciwgPbMMlazz1yZGVEgnZK762xyVdVznhqxrfCeBMmMkgOOaPwjH7g== + dependencies: + ajv "^7.0.2" + lodash "^4.17.20" + slice-ansi "^4.0.0" + string-width "^4.2.0" + +tape@^4.6.3: + version "4.13.3" + resolved "https://registry.yarnpkg.com/tape/-/tape-4.13.3.tgz#51b3d91c83668c7a45b1a594b607dee0a0b46278" + integrity sha512-0/Y20PwRIUkQcTCSi4AASs+OANZZwqPKaipGCEwp10dQMipVvSZwUUCi01Y/OklIGyHKFhIcjock+DKnBfLAFw== + dependencies: + deep-equal "~1.1.1" + defined "~1.0.0" + dotignore "~0.1.2" + for-each "~0.3.3" + function-bind "~1.1.1" + glob "~7.1.6" + has "~1.0.3" + inherits "~2.0.4" + is-regex "~1.0.5" + minimist "~1.2.5" + object-inspect "~1.7.0" + resolve "~1.17.0" + resumer "~0.0.0" + string.prototype.trim "~1.2.1" + through "~2.3.8" tar@^4.0.2: version "4.4.13" @@ -8316,6 +8874,11 @@ test-value@^2.1.0: array-back "^1.0.3" typical "^2.6.0" +testrpc@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/testrpc/-/testrpc-0.0.1.tgz#83e2195b1f5873aec7be1af8cbe6dcf39edb7aed" + integrity sha512-afH1hO+SQ/VPlmaLUFj2636QMeDvPCeQMc/9RBMW0IfjNe9gFD9Ra3ShqYkB7py0do1ZcCna/9acHyzTJ+GcNA== + text-table@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" @@ -8338,7 +8901,15 @@ then-request@^6.0.0: promise "^8.0.0" qs "^6.4.0" -through@^2.3.6, through@^2.3.8: +through2@^2.0.3: + version "2.0.5" + resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd" + integrity sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ== + dependencies: + readable-stream "~2.3.6" + xtend "~4.0.1" + +through@^2.3.6, through@~2.3.4, through@~2.3.8: version "2.3.8" resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= @@ -8348,7 +8919,7 @@ timed-out@^4.0.0, timed-out@^4.0.1: resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-4.0.1.tgz#f32eacac5a175bea25d7fab565ab3ed8741ef56f" integrity sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8= -timers-ext@^0.1.5: +timers-ext@^0.1.5, timers-ext@^0.1.7: version "0.1.7" resolved "https://registry.yarnpkg.com/timers-ext/-/timers-ext-0.1.7.tgz#6f57ad8578e07a3fb9f91d9387d65647555e25c6" integrity sha512-b85NUNzTSdodShTIbky6ZF02e8STtVVfD+fu4aXXShEELpozH+bCpJLYMPZbsABN2wDH7fJpqIoXxJpzbf0NqQ== @@ -8363,15 +8934,17 @@ tmp@0.0.33, tmp@^0.0.33: dependencies: os-tmpdir "~1.0.2" -to-buffer@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/to-buffer/-/to-buffer-1.1.1.tgz#493bd48f62d7c43fcded313a03dcadb2e1213a80" - integrity sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg== +tmp@0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.1.0.tgz#ee434a4e22543082e294ba6201dcc6eafefa2877" + integrity sha512-J7Z2K08jbGcdA1kkQpJSqLF6T0tdQqpR2pnSUXsIchbPdTI9v3e85cLW0d6WDhwuAleOV71j2xWs8qMPfK7nKw== + dependencies: + rimraf "^2.6.3" -to-fast-properties@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" - integrity sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4= +to-fast-properties@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47" + integrity sha1-uDVx+k2MJbguIxsG46MFXeTKGkc= to-object-path@^0.3.0: version "0.3.0" @@ -8423,56 +8996,16 @@ tough-cookie@^2.3.3, tough-cookie@~2.5.0: psl "^1.1.28" punycode "^2.1.1" +trim-right@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" + integrity sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM= + "true-case-path@^2.2.1": version "2.2.1" resolved "https://registry.yarnpkg.com/true-case-path/-/true-case-path-2.2.1.tgz#c5bf04a5bbec3fd118be4084461b3a27c4d796bf" integrity sha512-0z3j8R7MCjy10kc/g+qg7Ln3alJTodw9aDuVWZa3uiWqfuBMKeAeP2ocWcxoyM3D73yz3Jt/Pu4qPr4wHSdB/Q== -truffle-flattener@^1.4.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/truffle-flattener/-/truffle-flattener-1.5.0.tgz#c358fa3e5cb0a663429f7912a58c4f0879414e64" - integrity sha512-vmzWG/L5OXoNruMV6u2l2IaheI091e+t+fFCOR9sl46EE3epkSRIwGCmIP/EYDtPsFBIG7e6exttC9/GlfmxEQ== - dependencies: - "@resolver-engine/imports-fs" "^0.2.2" - "@solidity-parser/parser" "^0.8.0" - find-up "^2.1.0" - mkdirp "^1.0.4" - tsort "0.0.1" - -truffle-plugin-verify@^0.3.10: - version "0.3.11" - resolved "https://registry.yarnpkg.com/truffle-plugin-verify/-/truffle-plugin-verify-0.3.11.tgz#7e8e46b932c21924ee829af18d85d0edd3cce5a1" - integrity sha512-RN18HcPSuxcdP1oDlRjIu56fEx+Bo1Rf0h+Ra/cI1dQ8rQcdikpdy4r+CHxT/mvUy8vEwS39doB5vWDNvydpPA== - dependencies: - axios "0.19.2" - cli-logger "0.5.40" - delay "4.3.0" - querystring "0.2.0" - sol-merger "3.0.1" - -truffle-typings@^1.0.8: - version "1.0.8" - resolved "https://registry.yarnpkg.com/truffle-typings/-/truffle-typings-1.0.8.tgz#0b92d86a86a77c43771cdbce2544b67a25e3f2e2" - integrity sha512-75yFYNt0ws1TTehrGxhOqH3tutvBCAs+RG2SrhVIqQvU72kLAb4ercl32dES8yKbXBVHjzv3OXNg5gsbak+3Dg== - dependencies: - "@types/chai" "^4.1.4" - "@types/mocha" "^5.2.5" - "@types/web3" "^1.0.18" - -truffle@5.1.22: - version "5.1.22" - resolved "https://registry.yarnpkg.com/truffle/-/truffle-5.1.22.tgz#564e3e245b9b5ceb53ad1075e00ec68682bd3509" - integrity sha512-E1Kz7b2y1ApxytKmEDL04Xdmz+zEjTqWNTbp0DLFh928yzxL47xzDmuZyinx4pPNrt9vnnhoHMHqeh36IFkK1Q== - dependencies: - app-module-path "^2.2.0" - mocha "5.2.0" - original-require "1.0.1" - -try-require@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/try-require/-/try-require-1.2.1.tgz#34489a2cac0c09c1cc10ed91ba011594d4333be2" - integrity sha1-NEiaLKwMCcHMEO2RugEVlNQzO+I= - ts-essentials@^1.0.0: version "1.0.4" resolved "https://registry.yarnpkg.com/ts-essentials/-/ts-essentials-1.0.4.tgz#ce3b5dade5f5d97cf69889c11bf7d2da8555b15a" @@ -8498,12 +9031,13 @@ ts-generator@^0.1.1: resolve "^1.8.1" ts-essentials "^1.0.0" -ts-node@^8.4.1: - version "8.10.2" - resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-8.10.2.tgz#eee03764633b1234ddd37f8db9ec10b75ec7fb8d" - integrity sha512-ISJJGgkIpDdBhWVu3jufsWpK3Rzo7bdiIXJjQc0ynKxVOVcg2oIrf2H2cejminGrptVc6q6/uynAHNCuWGbpVA== +ts-node@^9.1.1: + version "9.1.1" + resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-9.1.1.tgz#51a9a450a3e959401bda5f004a72d54b936d376d" + integrity sha512-hPlt7ZACERQGf03M253ytLY3dHbGNGrAq9qIHWUY9XHYl1z7wYngSr3OQ5xmui8o2AaxsONxIzjafLUiWBo1Fg== dependencies: arg "^4.1.0" + create-require "^1.1.0" diff "^4.0.1" make-error "^1.1.1" source-map-support "^0.5.17" @@ -8530,9 +9064,9 @@ tsort@0.0.1: integrity sha1-4igPXoF/i/QnVlf9D5rr1E9aJ4Y= tsutils@^3.17.1: - version "3.17.1" - resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.17.1.tgz#ed719917f11ca0dee586272b2ac49e015a2dd759" - integrity sha512-kzeQ5B8H3w60nFY2g8cJIuH7JDpsALXySGtwGJ0p2LSjLgay3NdIpqq5SoOBe46bKDW2iq25irHCr8wjomUS2g== + version "3.19.1" + resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.19.1.tgz#d8566e0c51c82f32f9c25a4d367cd62409a547a9" + integrity sha512-GEdoBf5XI324lu7ycad7s6laADfnAqCw6wLGI+knxvw9vsIYBaJfYdmeCEG3FMMUiSm3OGgNb+m6utsWf5h9Vw== dependencies: tslib "^1.8.1" @@ -8558,6 +9092,13 @@ tweetnacl@^1.0.0: resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-1.0.3.tgz#ac0af71680458d8a6378d0d0d050ab1407d35596" integrity sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw== +type-check@^0.4.0, type-check@~0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" + integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== + dependencies: + prelude-ls "^1.2.1" + type-check@~0.3.2: version "0.3.2" resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" @@ -8603,7 +9144,7 @@ type@^2.0.0: resolved "https://registry.yarnpkg.com/type/-/type-2.1.0.tgz#9bdc22c648cf8cf86dd23d32336a41cfb6475e3f" integrity sha512-G9absDWvhAWCV2gmF1zKud3OyC61nZDwWvBL2DApaVFogI07CprggiQAOOjvp2NRjYWFzPyu7vwtDrQFq8jeSA== -typechain@^4.0.0: +typechain@4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/typechain/-/typechain-4.0.0.tgz#8a81fe40c4020b370f0c4671b7f966134d20c58c" integrity sha512-XQUojf02bXyxXNGI0WeCphnh++5eWr9wYH8jm0XqHNv8yENpFrRyX8ffVlkhCnDOOB/jEJJVQytLAOU+Qn0N9Q== @@ -8628,26 +9169,27 @@ typedarray@^0.0.6: resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= -"types-bn@https://github.com/machinomy/types-bn.git": - version "0.0.1" - resolved "https://github.com/machinomy/types-bn.git#08ede69e138640d332b0dae0dc2e2fffee5f7160" - dependencies: - bn.js "4.11.7" +typescript@^4.1.3: + version "4.1.3" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.1.3.tgz#519d582bd94cba0cf8934c7d8e8467e473f53bb7" + integrity sha512-B3ZIOf1IKeH2ixgHhj6la6xdwR9QrLC5d1VKeCSY4tvkqhF2eqd9O7txNlS0PO3GrBAFIdr3L1ndNwteUbZLYg== -types-ethereumjs-util@^0.0.8: - version "0.0.8" - resolved "https://registry.yarnpkg.com/types-ethereumjs-util/-/types-ethereumjs-util-0.0.8.tgz#4530c4fe069da3ea93748baa3e18ea70133e4560" - integrity sha1-RTDE/gado+qTdIuqPhjqcBM+RWA= +typewise-core@^1.2, typewise-core@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/typewise-core/-/typewise-core-1.2.0.tgz#97eb91805c7f55d2f941748fa50d315d991ef195" + integrity sha1-l+uRgFx/VdL5QXSPpQ0xXZke8ZU= + +typewise@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/typewise/-/typewise-1.0.3.tgz#1067936540af97937cc5dcf9922486e9fa284651" + integrity sha1-EGeTZUCvl5N8xdz5kiSG6fooRlE= dependencies: - "@machinomy/types-safe-buffer" "^0.0.1" - bn.js "^4.11.7" - rlp "^2.0.0" - types-bn "https://github.com/machinomy/types-bn.git" + typewise-core "^1.2.0" -typescript@^3.6.3: - version "3.9.7" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.9.7.tgz#98d600a5ebdc38f40cb277522f12dc800e9e25fa" - integrity sha512-BLbiRkiBzAwsjut4x/dsibSTB6yWpwT5qWmC2OfuCg3GgVQCSgMs4vEctYPhsaGtd0AeuuHMkjZ2h2WG8MSzRw== +typewiselite@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/typewiselite/-/typewiselite-1.0.0.tgz#c8882fa1bb1092c06005a97f34ef5c8508e3664e" + integrity sha1-yIgvobsQksBgBal/NO9chQjjZk4= typical@^2.6.0, typical@^2.6.1: version "2.6.1" @@ -8655,33 +9197,20 @@ typical@^2.6.0, typical@^2.6.1: integrity sha1-XAgOXWYcu+OCWdLnCjxyU+hziB0= uglify-js@^3.1.4: - version "3.11.6" - resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.11.6.tgz#144b50d3e05eadd3ad4dd047c60ca541a8cd4e9c" - integrity sha512-oASI1FOJ7BBFkSCNDZ446EgkSuHkOZBuqRFrwXIKWCoXw8ZXQETooTQjkAcBS03Acab7ubCKsXnwuV2svy061g== + version "3.12.5" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.12.5.tgz#83241496087c640efe9dfc934832e71725aba008" + integrity sha512-SgpgScL4T7Hj/w/GexjnBHi3Ien9WS1Rpfg5y91WXMj9SY997ZCQU76mH4TpLwwfmMvoOU8wiaRkIf6NaH3mtg== ultron@~1.1.0: version "1.1.1" resolved "https://registry.yarnpkg.com/ultron/-/ultron-1.1.1.tgz#9fe1536a10a664a65266a1e3ccf85fd36302bc9c" integrity sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og== -unbzip2-stream@^1.0.9: - version "1.4.3" - resolved "https://registry.yarnpkg.com/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz#b0da04c4371311df771cdc215e87f2130991ace7" - integrity sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg== - dependencies: - buffer "^5.2.1" - through "^2.3.8" - underscore@1.9.1: version "1.9.1" resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.9.1.tgz#06dce34a0e68a7babc29b365b8e74b8925203961" integrity sha512-5/4etnCkd9c8gwgowi5/om/mYO5ajCaOgdzj/oW+0eQV9WxKBDZw5+ycmKmeaTXjInS/W0BzpGLo2xR2aBwZdg== -underscore@^1.8.3: - version "1.11.0" - resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.11.0.tgz#dd7c23a195db34267186044649870ff1bab5929e" - integrity sha512-xY96SsN3NA461qIRKZ/+qox37YXPtSBswMGfiNptr+wrt6ds4HaMw23TP612fEyGekRE6LNRiLYr/aqbHXNedw== - union-value@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.1.tgz#0b6fe7b835aecda61c6ea4d4f02c14221e109847" @@ -8697,16 +9226,16 @@ universalify@^0.1.0: resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== -universalify@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/universalify/-/universalify-1.0.0.tgz#b61a1da173e8435b2fe3c67d29b9adf8594bd16d" - integrity sha512-rb6X1W158d7pRQBg5gkR8uPaSfiids68LTJQYOtEUhoJUWBdaQHsuT/EUduxXYxcrt4r5PJ4fuHW1MHT6p0qug== - universalify@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717" integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ== +unorm@^1.3.3: + version "1.6.0" + resolved "https://registry.yarnpkg.com/unorm/-/unorm-1.6.0.tgz#029b289661fba714f1a9af439eb51d9b16c205af" + integrity sha512-b2/KCUlYZUeA7JFUuRJZPUtr4gZvBh7tavtv4fvk4+KV9pfGiR6CQAQAWl49ZpR3ts2dk4FYkP7EIgDJoiOLDA== + unpipe@1.0.0, unpipe@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" @@ -8721,9 +9250,9 @@ unset-value@^1.0.0: isobject "^3.0.0" uri-js@^4.2.2: - version "4.4.0" - resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.0.tgz#aa714261de793e8a82347a7bcc9ce74e86f28602" - integrity sha512-B0yRTzYdUCCn9n+F4+Gh4yIDtMQcaJsmYBDsTSG8g/OejKBodLQ2IHfN3bM7jUsRXndopT7OIXWdYqc1fjmV6g== + version "4.4.1" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" + integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== dependencies: punycode "^2.1.0" @@ -8756,15 +9285,23 @@ url-to-options@^1.0.1: resolved "https://registry.yarnpkg.com/url-to-options/-/url-to-options-1.0.1.tgz#1505a03a289a48cbd7a434efbaeec5055f5633a9" integrity sha1-FQWgOiiaSMvXpDTvuu7FBV9WM6k= +url@^0.11.0: + version "0.11.0" + resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1" + integrity sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE= + dependencies: + punycode "1.3.2" + querystring "0.2.0" + use@^3.1.0: version "3.1.1" resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== utf-8-validate@^5.0.2: - version "5.0.3" - resolved "https://registry.yarnpkg.com/utf-8-validate/-/utf-8-validate-5.0.3.tgz#3b64e418ad2ff829809025fdfef595eab2f03a27" - integrity sha512-jtJM6fpGv8C1SoH4PtG22pGto6x+Y8uPprW0tw3//gGFhDDTiuksgradgFN6yRayDP4SyZZa6ZMGHLIa17+M8A== + version "5.0.4" + resolved "https://registry.yarnpkg.com/utf-8-validate/-/utf-8-validate-5.0.4.tgz#72a1735983ddf7a05a43a9c6b67c5ce1c910f9b8" + integrity sha512-MEF05cPSq3AwJ2C7B7sHAA6i53vONoZbMGX8My5auEVm6W+dJ2Jd/TZPyGJ5CH42V2XtbI5FD28HeHeqlPzZ3Q== dependencies: node-gyp-build "^4.2.0" @@ -8779,14 +9316,15 @@ util-deprecate@^1.0.1, util-deprecate@~1.0.1: integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= util.promisify@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/util.promisify/-/util.promisify-1.0.1.tgz#6baf7774b80eeb0f7520d8b81d07982a59abbaee" - integrity sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA== + version "1.1.1" + resolved "https://registry.yarnpkg.com/util.promisify/-/util.promisify-1.1.1.tgz#77832f57ced2c9478174149cae9b96e9918cd54b" + integrity sha512-/s3UsZUrIfa6xDhr7zZhnE9SLQ5RIXyYfiVnMMyMDzOc8WhWN4Nbh36H842OyurKbCDAesZOJaVyvmSl6fhGQw== dependencies: + call-bind "^1.0.0" define-properties "^1.1.3" - es-abstract "^1.17.2" + for-each "^0.3.3" has-symbols "^1.0.1" - object.getownpropertydescriptors "^2.1.0" + object.getownpropertydescriptors "^2.1.1" utils-merge@1.0.1: version "1.0.1" @@ -8840,14 +9378,14 @@ verror@1.10.0: core-util-is "1.0.2" extsprintf "^1.2.0" -web3-bzz@1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/web3-bzz/-/web3-bzz-1.2.2.tgz#a3b9f613c49fd3e120e0997088a73557d5adb724" - integrity sha512-b1O2ObsqUN1lJxmFSjvnEC4TsaCbmh7Owj3IAIWTKqL9qhVgx7Qsu5O9cD13pBiSPNZJ68uJPaKq380QB4NWeA== +web3-bzz@1.2.11: + version "1.2.11" + resolved "https://registry.yarnpkg.com/web3-bzz/-/web3-bzz-1.2.11.tgz#41bc19a77444bd5365744596d778b811880f707f" + integrity sha512-XGpWUEElGypBjeFyUhTkiPXFbDVD6Nr/S5jznE3t8cWUA0FxRf1n3n/NuIZeb0H9RkN2Ctd/jNma/k8XGa3YKg== dependencies: - "@types/node" "^10.12.18" + "@types/node" "^12.12.6" got "9.6.0" - swarm-js "0.1.39" + swarm-js "^0.1.40" underscore "1.9.1" web3-bzz@1.2.9: @@ -8860,24 +9398,14 @@ web3-bzz@1.2.9: swarm-js "^0.1.40" underscore "1.9.1" -web3-bzz@1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/web3-bzz/-/web3-bzz-1.3.0.tgz#83dfd77fa8a64bbb660462dffd0fee2a02ef1051" - integrity sha512-ibYAnKab+sgTo/UdfbrvYfWblXjjgSMgyy9/FHa6WXS14n/HVB+HfWqGz2EM3fok8Wy5XoKGMvdqvERQ/mzq1w== - dependencies: - "@types/node" "^12.12.6" - got "9.6.0" - swarm-js "^0.1.40" - underscore "1.9.1" - -web3-core-helpers@1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/web3-core-helpers/-/web3-core-helpers-1.2.2.tgz#484974f4bd4a487217b85b0d7cfe841af0907619" - integrity sha512-HJrRsIGgZa1jGUIhvGz4S5Yh6wtOIo/TMIsSLe+Xay+KVnbseJpPprDI5W3s7H2ODhMQTbogmmUFquZweW2ImQ== +web3-core-helpers@1.2.11: + version "1.2.11" + resolved "https://registry.yarnpkg.com/web3-core-helpers/-/web3-core-helpers-1.2.11.tgz#84c681ed0b942c0203f3b324a245a127e8c67a99" + integrity sha512-PEPoAoZd5ME7UfbnCZBdzIerpe74GEvlwT4AjOmHeCVZoIFk7EqvOZDejJHt+feJA6kMVTdd0xzRNN295UhC1A== dependencies: underscore "1.9.1" - web3-eth-iban "1.2.2" - web3-utils "1.2.2" + web3-eth-iban "1.2.11" + web3-utils "1.2.11" web3-core-helpers@1.2.9: version "1.2.9" @@ -8888,25 +9416,17 @@ web3-core-helpers@1.2.9: web3-eth-iban "1.2.9" web3-utils "1.2.9" -web3-core-helpers@1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/web3-core-helpers/-/web3-core-helpers-1.3.0.tgz#697cc3246a7eaaaac64ea506828d861c981c3f31" - integrity sha512-+MFb1kZCrRctf7UYE7NCG4rGhSXaQJ/KF07di9GVK1pxy1K0+rFi61ZobuV1ky9uQp+uhhSPts4Zp55kRDB5sw== - dependencies: - underscore "1.9.1" - web3-eth-iban "1.3.0" - web3-utils "1.3.0" - -web3-core-method@1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/web3-core-method/-/web3-core-method-1.2.2.tgz#d4fe2bb1945b7152e5f08e4ea568b171132a1e56" - integrity sha512-szR4fDSBxNHaF1DFqE+j6sFR/afv9Aa36OW93saHZnrh+iXSrYeUUDfugeNcRlugEKeUCkd4CZylfgbK2SKYJA== +web3-core-method@1.2.11: + version "1.2.11" + resolved "https://registry.yarnpkg.com/web3-core-method/-/web3-core-method-1.2.11.tgz#f880137d1507a0124912bf052534f168b8d8fbb6" + integrity sha512-ff0q76Cde94HAxLDZ6DbdmKniYCQVtvuaYh+rtOUMB6kssa5FX0q3vPmixi7NPooFnbKmmZCM6NvXg4IreTPIw== dependencies: + "@ethersproject/transactions" "^5.0.0-beta.135" underscore "1.9.1" - web3-core-helpers "1.2.2" - web3-core-promievent "1.2.2" - web3-core-subscriptions "1.2.2" - web3-utils "1.2.2" + web3-core-helpers "1.2.11" + web3-core-promievent "1.2.11" + web3-core-subscriptions "1.2.11" + web3-utils "1.2.11" web3-core-method@1.2.9: version "1.2.9" @@ -8920,25 +9440,12 @@ web3-core-method@1.2.9: web3-core-subscriptions "1.2.9" web3-utils "1.2.9" -web3-core-method@1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/web3-core-method/-/web3-core-method-1.3.0.tgz#a71387af842aec7dbad5dbbd1130c14cc6c8beb3" - integrity sha512-h0yFDrYVzy5WkLxC/C3q+hiMnzxdWm9p1T1rslnuHgOp6nYfqzu/6mUIXrsS4h/OWiGJt+BZ0xVZmtC31HDWtg== - dependencies: - "@ethersproject/transactions" "^5.0.0-beta.135" - underscore "1.9.1" - web3-core-helpers "1.3.0" - web3-core-promievent "1.3.0" - web3-core-subscriptions "1.3.0" - web3-utils "1.3.0" - -web3-core-promievent@1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/web3-core-promievent/-/web3-core-promievent-1.2.2.tgz#3b60e3f2a0c96db8a891c927899d29d39e66ab1c" - integrity sha512-tKvYeT8bkUfKABcQswK6/X79blKTKYGk949urZKcLvLDEaWrM3uuzDwdQT3BNKzQ3vIvTggFPX9BwYh0F1WwqQ== +web3-core-promievent@1.2.11: + version "1.2.11" + resolved "https://registry.yarnpkg.com/web3-core-promievent/-/web3-core-promievent-1.2.11.tgz#51fe97ca0ddec2f99bf8c3306a7a8e4b094ea3cf" + integrity sha512-il4McoDa/Ox9Agh4kyfQ8Ak/9ABYpnF8poBLL33R/EnxLsJOGQG2nZhkJa3I067hocrPSjEdlPt/0bHXsln4qA== dependencies: - any-promise "1.3.0" - eventemitter3 "3.1.2" + eventemitter3 "4.0.4" web3-core-promievent@1.2.9: version "1.2.9" @@ -8947,23 +9454,16 @@ web3-core-promievent@1.2.9: dependencies: eventemitter3 "3.1.2" -web3-core-promievent@1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/web3-core-promievent/-/web3-core-promievent-1.3.0.tgz#e0442dd0a8989b6bdce09293976cee6d9237a484" - integrity sha512-blv69wrXw447TP3iPvYJpllkhW6B18nfuEbrfcr3n2Y0v1Jx8VJacNZFDFsFIcgXcgUIVCtOpimU7w9v4+rtaw== - dependencies: - eventemitter3 "4.0.4" - -web3-core-requestmanager@1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/web3-core-requestmanager/-/web3-core-requestmanager-1.2.2.tgz#667ba9ac724c9c76fa8965ae8a3c61f66e68d8d6" - integrity sha512-a+gSbiBRHtHvkp78U2bsntMGYGF2eCb6219aMufuZWeAZGXJ63Wc2321PCbA8hF9cQrZI4EoZ4kVLRI4OF15Hw== +web3-core-requestmanager@1.2.11: + version "1.2.11" + resolved "https://registry.yarnpkg.com/web3-core-requestmanager/-/web3-core-requestmanager-1.2.11.tgz#fe6eb603fbaee18530293a91f8cf26d8ae28c45a" + integrity sha512-oFhBtLfOiIbmfl6T6gYjjj9igOvtyxJ+fjS+byRxiwFJyJ5BQOz4/9/17gWR1Cq74paTlI7vDGxYfuvfE/mKvA== dependencies: underscore "1.9.1" - web3-core-helpers "1.2.2" - web3-providers-http "1.2.2" - web3-providers-ipc "1.2.2" - web3-providers-ws "1.2.2" + web3-core-helpers "1.2.11" + web3-providers-http "1.2.11" + web3-providers-ipc "1.2.11" + web3-providers-ws "1.2.11" web3-core-requestmanager@1.2.9: version "1.2.9" @@ -8976,25 +9476,14 @@ web3-core-requestmanager@1.2.9: web3-providers-ipc "1.2.9" web3-providers-ws "1.2.9" -web3-core-requestmanager@1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/web3-core-requestmanager/-/web3-core-requestmanager-1.3.0.tgz#c5b9a0304504c0e6cce6c90bc1a3bff82732aa1f" - integrity sha512-3yMbuGcomtzlmvTVqNRydxsx7oPlw3ioRL6ReF9PeNYDkUsZaUib+6Dp5eBt7UXh5X+SIn/xa1smhDHz5/HpAw== - dependencies: - underscore "1.9.1" - web3-core-helpers "1.3.0" - web3-providers-http "1.3.0" - web3-providers-ipc "1.3.0" - web3-providers-ws "1.3.0" - -web3-core-subscriptions@1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/web3-core-subscriptions/-/web3-core-subscriptions-1.2.2.tgz#bf4ba23a653a003bdc3551649958cc0b080b068e" - integrity sha512-QbTgigNuT4eicAWWr7ahVpJyM8GbICsR1Ys9mJqzBEwpqS+RXTRVSkwZ2IsxO+iqv6liMNwGregbJLq4urMFcQ== +web3-core-subscriptions@1.2.11: + version "1.2.11" + resolved "https://registry.yarnpkg.com/web3-core-subscriptions/-/web3-core-subscriptions-1.2.11.tgz#beca908fbfcb050c16f45f3f0f4c205e8505accd" + integrity sha512-qEF/OVqkCvQ7MPs1JylIZCZkin0aKK9lDxpAtQ1F8niEDGFqn7DT8E/vzbIa0GsOjL2fZjDhWJsaW+BSoAW1gg== dependencies: - eventemitter3 "3.1.2" + eventemitter3 "4.0.4" underscore "1.9.1" - web3-core-helpers "1.2.2" + web3-core-helpers "1.2.11" web3-core-subscriptions@1.2.9: version "1.2.9" @@ -9005,26 +9494,18 @@ web3-core-subscriptions@1.2.9: underscore "1.9.1" web3-core-helpers "1.2.9" -web3-core-subscriptions@1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/web3-core-subscriptions/-/web3-core-subscriptions-1.3.0.tgz#c2622ccd2b84f4687475398ff966b579dba0847e" - integrity sha512-MUUQUAhJDb+Nz3S97ExVWveH4utoUnsbPWP+q1HJH437hEGb4vunIb9KvN3hFHLB+aHJfPeStM/4yYTz5PeuyQ== - dependencies: - eventemitter3 "4.0.4" - underscore "1.9.1" - web3-core-helpers "1.3.0" - -web3-core@1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/web3-core/-/web3-core-1.2.2.tgz#334b99c8222ef9cfd0339e27352f0b58ea789a2f" - integrity sha512-miHAX3qUgxV+KYfaOY93Hlc3kLW2j5fH8FJy6kSxAv+d4d5aH0wwrU2IIoJylQdT+FeenQ38sgsCnFu9iZ1hCQ== +web3-core@1.2.11: + version "1.2.11" + resolved "https://registry.yarnpkg.com/web3-core/-/web3-core-1.2.11.tgz#1043cacc1becb80638453cc5b2a14be9050288a7" + integrity sha512-CN7MEYOY5ryo5iVleIWRE3a3cZqVaLlIbIzDPsvQRUfzYnvzZQRZBm9Mq+ttDi2STOOzc1MKylspz/o3yq/LjQ== dependencies: - "@types/bn.js" "^4.11.4" - "@types/node" "^12.6.1" - web3-core-helpers "1.2.2" - web3-core-method "1.2.2" - web3-core-requestmanager "1.2.2" - web3-utils "1.2.2" + "@types/bn.js" "^4.11.5" + "@types/node" "^12.12.6" + bignumber.js "^9.0.0" + web3-core-helpers "1.2.11" + web3-core-method "1.2.11" + web3-core-requestmanager "1.2.11" + web3-utils "1.2.11" web3-core@1.2.9: version "1.2.9" @@ -9039,27 +9520,14 @@ web3-core@1.2.9: web3-core-requestmanager "1.2.9" web3-utils "1.2.9" -web3-core@1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/web3-core/-/web3-core-1.3.0.tgz#b818903738461c1cca0163339e1d6d3fa51242cf" - integrity sha512-BwWvAaKJf4KFG9QsKRi3MNoNgzjI6szyUlgme1qNPxUdCkaS3Rdpa0VKYNHP7M/YTk82/59kNE66mH5vmoaXjA== - dependencies: - "@types/bn.js" "^4.11.5" - "@types/node" "^12.12.6" - bignumber.js "^9.0.0" - web3-core-helpers "1.3.0" - web3-core-method "1.3.0" - web3-core-requestmanager "1.3.0" - web3-utils "1.3.0" - -web3-eth-abi@1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/web3-eth-abi/-/web3-eth-abi-1.2.2.tgz#d5616d88a90020f894763423a9769f2da11fe37a" - integrity sha512-Yn/ZMgoOLxhTVxIYtPJ0eS6pnAnkTAaJgUJh1JhZS4ekzgswMfEYXOwpMaD5eiqPJLpuxmZFnXnBZlnQ1JMXsw== +web3-eth-abi@1.2.11: + version "1.2.11" + resolved "https://registry.yarnpkg.com/web3-eth-abi/-/web3-eth-abi-1.2.11.tgz#a887494e5d447c2926d557a3834edd66e17af9b0" + integrity sha512-PkRYc0+MjuLSgg03QVWqWlQivJqRwKItKtEpRUaxUAeLE7i/uU39gmzm2keHGcQXo3POXAbOnMqkDvOep89Crg== dependencies: - ethers "4.0.0-beta.3" + "@ethersproject/abi" "5.0.0-beta.153" underscore "1.9.1" - web3-utils "1.2.2" + web3-utils "1.2.11" web3-eth-abi@1.2.9: version "1.2.9" @@ -9070,32 +9538,22 @@ web3-eth-abi@1.2.9: underscore "1.9.1" web3-utils "1.2.9" -web3-eth-abi@1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/web3-eth-abi/-/web3-eth-abi-1.3.0.tgz#387b7ea9b38be69ad8856bc7b4e9a6a69bb4d22b" - integrity sha512-1OrZ9+KGrBeBRd3lO8upkpNua9+7cBsQAgor9wbA25UrcUYSyL8teV66JNRu9gFxaTbkpdrGqM7J/LXpraXWrg== - dependencies: - "@ethersproject/abi" "5.0.0-beta.153" - underscore "1.9.1" - web3-utils "1.3.0" - -web3-eth-accounts@1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/web3-eth-accounts/-/web3-eth-accounts-1.2.2.tgz#c187e14bff6baa698ac352220290222dbfd332e5" - integrity sha512-KzHOEyXOEZ13ZOkWN3skZKqSo5f4Z1ogPFNn9uZbKCz+kSp+gCAEKxyfbOsB/JMAp5h7o7pb6eYsPCUBJmFFiA== +web3-eth-accounts@1.2.11: + version "1.2.11" + resolved "https://registry.yarnpkg.com/web3-eth-accounts/-/web3-eth-accounts-1.2.11.tgz#a9e3044da442d31903a7ce035a86d8fa33f90520" + integrity sha512-6FwPqEpCfKIh3nSSGeo3uBm2iFSnFJDfwL3oS9pyegRBXNsGRVpgiW63yhNzL0796StsvjHWwQnQHsZNxWAkGw== dependencies: - any-promise "1.3.0" crypto-browserify "3.12.0" - eth-lib "0.2.7" + eth-lib "0.2.8" ethereumjs-common "^1.3.2" ethereumjs-tx "^2.1.1" - scrypt-shim "github:web3-js/scrypt-shim" + scrypt-js "^3.0.1" underscore "1.9.1" uuid "3.3.2" - web3-core "1.2.2" - web3-core-helpers "1.2.2" - web3-core-method "1.2.2" - web3-utils "1.2.2" + web3-core "1.2.11" + web3-core-helpers "1.2.11" + web3-core-method "1.2.11" + web3-utils "1.2.11" web3-eth-accounts@1.2.9: version "1.2.9" @@ -9114,37 +9572,20 @@ web3-eth-accounts@1.2.9: web3-core-method "1.2.9" web3-utils "1.2.9" -web3-eth-accounts@1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/web3-eth-accounts/-/web3-eth-accounts-1.3.0.tgz#010acf389b2bee6d5e1aecb2fe78bfa5c8f26c7a" - integrity sha512-/Q7EVW4L2wWUbNRtOTwAIrYvJid/5UnKMw67x/JpvRMwYC+e+744P536Ja6SG4X3MnzFvd3E/jruV4qa6k+zIw== - dependencies: - crypto-browserify "3.12.0" - eth-lib "0.2.8" - ethereumjs-common "^1.3.2" - ethereumjs-tx "^2.1.1" - scrypt-js "^3.0.1" - underscore "1.9.1" - uuid "3.3.2" - web3-core "1.3.0" - web3-core-helpers "1.3.0" - web3-core-method "1.3.0" - web3-utils "1.3.0" - -web3-eth-contract@1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/web3-eth-contract/-/web3-eth-contract-1.2.2.tgz#84e92714918a29e1028ee7718f0712536e14e9a1" - integrity sha512-EKT2yVFws3FEdotDQoNsXTYL798+ogJqR2//CaGwx3p0/RvQIgfzEwp8nbgA6dMxCsn9KOQi7OtklzpnJMkjtA== +web3-eth-contract@1.2.11: + version "1.2.11" + resolved "https://registry.yarnpkg.com/web3-eth-contract/-/web3-eth-contract-1.2.11.tgz#917065902bc27ce89da9a1da26e62ef663663b90" + integrity sha512-MzYuI/Rq2o6gn7vCGcnQgco63isPNK5lMAan2E51AJLknjSLnOxwNY3gM8BcKoy4Z+v5Dv00a03Xuk78JowFow== dependencies: - "@types/bn.js" "^4.11.4" + "@types/bn.js" "^4.11.5" underscore "1.9.1" - web3-core "1.2.2" - web3-core-helpers "1.2.2" - web3-core-method "1.2.2" - web3-core-promievent "1.2.2" - web3-core-subscriptions "1.2.2" - web3-eth-abi "1.2.2" - web3-utils "1.2.2" + web3-core "1.2.11" + web3-core-helpers "1.2.11" + web3-core-method "1.2.11" + web3-core-promievent "1.2.11" + web3-core-subscriptions "1.2.11" + web3-eth-abi "1.2.11" + web3-utils "1.2.11" web3-eth-contract@1.2.9: version "1.2.9" @@ -9161,34 +9602,20 @@ web3-eth-contract@1.2.9: web3-eth-abi "1.2.9" web3-utils "1.2.9" -web3-eth-contract@1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/web3-eth-contract/-/web3-eth-contract-1.3.0.tgz#c758340ac800788e29fa29edc8b0c0ac957b741c" - integrity sha512-3SCge4SRNCnzLxf0R+sXk6vyTOl05g80Z5+9/B5pERwtPpPWaQGw8w01vqYqsYBKC7zH+dxhMaUgVzU2Dgf7bQ== - dependencies: - "@types/bn.js" "^4.11.5" - underscore "1.9.1" - web3-core "1.3.0" - web3-core-helpers "1.3.0" - web3-core-method "1.3.0" - web3-core-promievent "1.3.0" - web3-core-subscriptions "1.3.0" - web3-eth-abi "1.3.0" - web3-utils "1.3.0" - -web3-eth-ens@1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/web3-eth-ens/-/web3-eth-ens-1.2.2.tgz#0a4abed1d4cbdacbf5e1ab06e502d806d1192bc6" - integrity sha512-CFjkr2HnuyMoMFBoNUWojyguD4Ef+NkyovcnUc/iAb9GP4LHohKrODG4pl76R5u61TkJGobC2ij6TyibtsyVYg== +web3-eth-ens@1.2.11: + version "1.2.11" + resolved "https://registry.yarnpkg.com/web3-eth-ens/-/web3-eth-ens-1.2.11.tgz#26d4d7f16d6cbcfff918e39832b939edc3162532" + integrity sha512-dbW7dXP6HqT1EAPvnniZVnmw6TmQEKF6/1KgAxbo8iBBYrVTMDGFQUUnZ+C4VETGrwwaqtX4L9d/FrQhZ6SUiA== dependencies: + content-hash "^2.5.2" eth-ens-namehash "2.0.8" underscore "1.9.1" - web3-core "1.2.2" - web3-core-helpers "1.2.2" - web3-core-promievent "1.2.2" - web3-eth-abi "1.2.2" - web3-eth-contract "1.2.2" - web3-utils "1.2.2" + web3-core "1.2.11" + web3-core-helpers "1.2.11" + web3-core-promievent "1.2.11" + web3-eth-abi "1.2.11" + web3-eth-contract "1.2.11" + web3-utils "1.2.11" web3-eth-ens@1.2.9: version "1.2.9" @@ -9205,28 +9632,13 @@ web3-eth-ens@1.2.9: web3-eth-contract "1.2.9" web3-utils "1.2.9" -web3-eth-ens@1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/web3-eth-ens/-/web3-eth-ens-1.3.0.tgz#0887ba38473c104cf5fb8a715828b3b354fa02a2" - integrity sha512-WnOru+EcuM5dteiVYJcHXo/I7Wq+ei8RrlS2nir49M0QpYvUPGbCGgTbifcjJQTWamgORtWdljSA1s2Asdb74w== +web3-eth-iban@1.2.11: + version "1.2.11" + resolved "https://registry.yarnpkg.com/web3-eth-iban/-/web3-eth-iban-1.2.11.tgz#f5f73298305bc7392e2f188bf38a7362b42144ef" + integrity sha512-ozuVlZ5jwFC2hJY4+fH9pIcuH1xP0HEFhtWsR69u9uDIANHLPQQtWYmdj7xQ3p2YT4bQLq/axKhZi7EZVetmxQ== dependencies: - content-hash "^2.5.2" - eth-ens-namehash "2.0.8" - underscore "1.9.1" - web3-core "1.3.0" - web3-core-helpers "1.3.0" - web3-core-promievent "1.3.0" - web3-eth-abi "1.3.0" - web3-eth-contract "1.3.0" - web3-utils "1.3.0" - -web3-eth-iban@1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/web3-eth-iban/-/web3-eth-iban-1.2.2.tgz#76bec73bad214df7c4192388979a59fc98b96c5a" - integrity sha512-gxKXBoUhaTFHr0vJB/5sd4i8ejF/7gIsbM/VvemHT3tF5smnmY6hcwSMmn7sl5Gs+83XVb/BngnnGkf+I/rsrQ== - dependencies: - bn.js "4.11.8" - web3-utils "1.2.2" + bn.js "^4.11.9" + web3-utils "1.2.11" web3-eth-iban@1.2.9: version "1.2.9" @@ -9236,25 +9648,17 @@ web3-eth-iban@1.2.9: bn.js "4.11.8" web3-utils "1.2.9" -web3-eth-iban@1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/web3-eth-iban/-/web3-eth-iban-1.3.0.tgz#15b782dfaf273ebc4e3f389f1367f4e88ddce4a5" - integrity sha512-v9mZWhR4fPF17/KhHLiWir4YHWLe09O3B/NTdhWqw3fdAMJNztzMHGzgHxA/4fU+rhrs/FhDzc4yt32zMEXBZw== - dependencies: - bn.js "^4.11.9" - web3-utils "1.3.0" - -web3-eth-personal@1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/web3-eth-personal/-/web3-eth-personal-1.2.2.tgz#eee1c86a8132fa16b5e34c6d421ca92e684f0be6" - integrity sha512-4w+GLvTlFqW3+q4xDUXvCEMU7kRZ+xm/iJC8gm1Li1nXxwwFbs+Y+KBK6ZYtoN1qqAnHR+plYpIoVo27ixI5Rg== +web3-eth-personal@1.2.11: + version "1.2.11" + resolved "https://registry.yarnpkg.com/web3-eth-personal/-/web3-eth-personal-1.2.11.tgz#a38b3942a1d87a62070ce0622a941553c3d5aa70" + integrity sha512-42IzUtKq9iHZ8K9VN0vAI50iSU9tOA1V7XU2BhF/tb7We2iKBVdkley2fg26TxlOcKNEHm7o6HRtiiFsVK4Ifw== dependencies: - "@types/node" "^12.6.1" - web3-core "1.2.2" - web3-core-helpers "1.2.2" - web3-core-method "1.2.2" - web3-net "1.2.2" - web3-utils "1.2.2" + "@types/node" "^12.12.6" + web3-core "1.2.11" + web3-core-helpers "1.2.11" + web3-core-method "1.2.11" + web3-net "1.2.11" + web3-utils "1.2.11" web3-eth-personal@1.2.9: version "1.2.9" @@ -9268,36 +9672,24 @@ web3-eth-personal@1.2.9: web3-net "1.2.9" web3-utils "1.2.9" -web3-eth-personal@1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/web3-eth-personal/-/web3-eth-personal-1.3.0.tgz#d376e03dc737d961ff1f8d1aca866efad8477135" - integrity sha512-2czUhElsJdLpuNfun9GeLiClo5O6Xw+bLSjl3f4bNG5X2V4wcIjX2ygep/nfstLLtkz8jSkgl/bV7esANJyeRA== - dependencies: - "@types/node" "^12.12.6" - web3-core "1.3.0" - web3-core-helpers "1.3.0" - web3-core-method "1.3.0" - web3-net "1.3.0" - web3-utils "1.3.0" - -web3-eth@1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/web3-eth/-/web3-eth-1.2.2.tgz#65a1564634a23b990efd1655bf94ad513904286c" - integrity sha512-UXpC74mBQvZzd4b+baD4Ocp7g+BlwxhBHumy9seyE/LMIcMlePXwCKzxve9yReNpjaU16Mmyya6ZYlyiKKV8UA== +web3-eth@1.2.11: + version "1.2.11" + resolved "https://registry.yarnpkg.com/web3-eth/-/web3-eth-1.2.11.tgz#4c81fcb6285b8caf544058fba3ae802968fdc793" + integrity sha512-REvxW1wJ58AgHPcXPJOL49d1K/dPmuw4LjPLBPStOVkQjzDTVmJEIsiLwn2YeuNDd4pfakBwT8L3bz1G1/wVsQ== dependencies: underscore "1.9.1" - web3-core "1.2.2" - web3-core-helpers "1.2.2" - web3-core-method "1.2.2" - web3-core-subscriptions "1.2.2" - web3-eth-abi "1.2.2" - web3-eth-accounts "1.2.2" - web3-eth-contract "1.2.2" - web3-eth-ens "1.2.2" - web3-eth-iban "1.2.2" - web3-eth-personal "1.2.2" - web3-net "1.2.2" - web3-utils "1.2.2" + web3-core "1.2.11" + web3-core-helpers "1.2.11" + web3-core-method "1.2.11" + web3-core-subscriptions "1.2.11" + web3-eth-abi "1.2.11" + web3-eth-accounts "1.2.11" + web3-eth-contract "1.2.11" + web3-eth-ens "1.2.11" + web3-eth-iban "1.2.11" + web3-eth-personal "1.2.11" + web3-net "1.2.11" + web3-utils "1.2.11" web3-eth@1.2.9: version "1.2.9" @@ -9318,33 +9710,14 @@ web3-eth@1.2.9: web3-net "1.2.9" web3-utils "1.2.9" -web3-eth@1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/web3-eth/-/web3-eth-1.3.0.tgz#898e5f5a8827f9bc6844e267a52eb388916a6771" - integrity sha512-/bzJcxXPM9EM18JM5kO2JjZ3nEqVo3HxqU93aWAEgJNqaP/Lltmufl2GpvIB2Hvj+FXAjAXquxUdQ2/xP7BzHQ== +web3-net@1.2.11: + version "1.2.11" + resolved "https://registry.yarnpkg.com/web3-net/-/web3-net-1.2.11.tgz#eda68ef25e5cdb64c96c39085cdb74669aabbe1b" + integrity sha512-sjrSDj0pTfZouR5BSTItCuZ5K/oZPVdVciPQ6981PPPIwJJkCMeVjD7I4zO3qDPCnBjBSbWvVnLdwqUBPtHxyg== dependencies: - underscore "1.9.1" - web3-core "1.3.0" - web3-core-helpers "1.3.0" - web3-core-method "1.3.0" - web3-core-subscriptions "1.3.0" - web3-eth-abi "1.3.0" - web3-eth-accounts "1.3.0" - web3-eth-contract "1.3.0" - web3-eth-ens "1.3.0" - web3-eth-iban "1.3.0" - web3-eth-personal "1.3.0" - web3-net "1.3.0" - web3-utils "1.3.0" - -web3-net@1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/web3-net/-/web3-net-1.2.2.tgz#5c3226ca72df7c591422440ce6f1203fd42ddad9" - integrity sha512-K07j2DXq0x4UOJgae65rWZKraOznhk8v5EGSTdFqASTx7vWE/m+NqBijBYGEsQY1lSMlVaAY9UEQlcXK5HzXTw== - dependencies: - web3-core "1.2.2" - web3-core-method "1.2.2" - web3-utils "1.2.2" + web3-core "1.2.11" + web3-core-method "1.2.11" + web3-utils "1.2.11" web3-net@1.2.9: version "1.2.9" @@ -9355,21 +9728,38 @@ web3-net@1.2.9: web3-core-method "1.2.9" web3-utils "1.2.9" -web3-net@1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/web3-net/-/web3-net-1.3.0.tgz#b69068cccffab58911c2f08ca4abfbefb0f948c6" - integrity sha512-Xz02KylOyrB2YZzCkysEDrY7RbKxb7LADzx3Zlovfvuby7HBwtXVexXKtoGqksa+ns1lvjQLLQGb+OeLi7Sr7w== +web3-provider-engine@14.2.1: + version "14.2.1" + resolved "https://registry.yarnpkg.com/web3-provider-engine/-/web3-provider-engine-14.2.1.tgz#ef351578797bf170e08d529cb5b02f8751329b95" + integrity sha512-iSv31h2qXkr9vrL6UZDm4leZMc32SjWJFGOp/D92JXfcEboCqraZyuExDkpxKw8ziTufXieNM7LSXNHzszYdJw== dependencies: - web3-core "1.3.0" - web3-core-method "1.3.0" - web3-utils "1.3.0" + async "^2.5.0" + backoff "^2.5.0" + clone "^2.0.0" + cross-fetch "^2.1.0" + eth-block-tracker "^3.0.0" + eth-json-rpc-infura "^3.1.0" + eth-sig-util "^1.4.2" + ethereumjs-block "^1.2.2" + ethereumjs-tx "^1.2.0" + ethereumjs-util "^5.1.5" + ethereumjs-vm "^2.3.4" + json-rpc-error "^2.0.0" + json-stable-stringify "^1.0.1" + promise-to-callback "^1.0.0" + readable-stream "^2.2.9" + request "^2.85.0" + semaphore "^1.0.3" + ws "^5.1.1" + xhr "^2.2.0" + xtend "^4.0.1" -web3-providers-http@1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/web3-providers-http/-/web3-providers-http-1.2.2.tgz#155e55c1d69f4c5cc0b411ede40dea3d06720956" - integrity sha512-BNZ7Hguy3eBszsarH5gqr9SIZNvqk9eKwqwmGH1LQS1FL3NdoOn7tgPPdddrXec4fL94CwgNk4rCU+OjjZRNDg== +web3-providers-http@1.2.11: + version "1.2.11" + resolved "https://registry.yarnpkg.com/web3-providers-http/-/web3-providers-http-1.2.11.tgz#1cd03442c61670572d40e4dcdf1faff8bd91e7c6" + integrity sha512-psh4hYGb1+ijWywfwpB2cvvOIMISlR44F/rJtYkRmQ5jMvG4FOCPlQJPiHQZo+2cc3HbktvvSJzIhkWQJdmvrA== dependencies: - web3-core-helpers "1.2.2" + web3-core-helpers "1.2.11" xhr2-cookies "1.1.0" web3-providers-http@1.2.9: @@ -9380,22 +9770,14 @@ web3-providers-http@1.2.9: web3-core-helpers "1.2.9" xhr2-cookies "1.1.0" -web3-providers-http@1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/web3-providers-http/-/web3-providers-http-1.3.0.tgz#88227f64c88b32abed4359383c2663616e0dc531" - integrity sha512-cMKhUI6PqlY/EC+ZDacAxajySBu8AzW8jOjt1Pe/mbRQgS0rcZyvLePGTTuoyaA8C21F8UW+EE5jj7YsNgOuqA== - dependencies: - web3-core-helpers "1.3.0" - xhr2-cookies "1.1.0" - -web3-providers-ipc@1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/web3-providers-ipc/-/web3-providers-ipc-1.2.2.tgz#c6d165a12bc68674b4cdd543ea18aec79cafc2e8" - integrity sha512-t97w3zi5Kn/LEWGA6D9qxoO0LBOG+lK2FjlEdCwDQatffB/+vYrzZ/CLYVQSoyFZAlsDoBasVoYSWZK1n39aHA== +web3-providers-ipc@1.2.11: + version "1.2.11" + resolved "https://registry.yarnpkg.com/web3-providers-ipc/-/web3-providers-ipc-1.2.11.tgz#d16d6c9be1be6e0b4f4536c4acc16b0f4f27ef21" + integrity sha512-yhc7Y/k8hBV/KlELxynWjJDzmgDEDjIjBzXK+e0rHBsYEhdCNdIH5Psa456c+l0qTEU2YzycF8VAjYpWfPnBpQ== dependencies: oboe "2.1.4" underscore "1.9.1" - web3-core-helpers "1.2.2" + web3-core-helpers "1.2.11" web3-providers-ipc@1.2.9: version "1.2.9" @@ -9406,23 +9788,15 @@ web3-providers-ipc@1.2.9: underscore "1.9.1" web3-core-helpers "1.2.9" -web3-providers-ipc@1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/web3-providers-ipc/-/web3-providers-ipc-1.3.0.tgz#d7c2b203733b46f7b4e7b15633d891648cf9a293" - integrity sha512-0CrLuRofR+1J38nEj4WsId/oolwQEM6Yl1sOt41S/6bNI7htdkwgVhSloFIMJMDFHtRw229QIJ6wIaKQz0X1Og== - dependencies: - oboe "2.1.5" - underscore "1.9.1" - web3-core-helpers "1.3.0" - -web3-providers-ws@1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/web3-providers-ws/-/web3-providers-ws-1.2.2.tgz#d2c05c68598cea5ad3fa6ef076c3bcb3ca300d29" - integrity sha512-Wb1mrWTGMTXOpJkL0yGvL/WYLt8fUIXx8k/l52QB2IiKzvyd42dTWn4+j8IKXGSYYzOm7NMqv6nhA5VDk12VfA== +web3-providers-ws@1.2.11: + version "1.2.11" + resolved "https://registry.yarnpkg.com/web3-providers-ws/-/web3-providers-ws-1.2.11.tgz#a1dfd6d9778d840561d9ec13dd453046451a96bb" + integrity sha512-ZxnjIY1Er8Ty+cE4migzr43zA/+72AF1myzsLaU5eVgdsfV7Jqx7Dix1hbevNZDKFlSoEyq/3j/jYalh3So1Zg== dependencies: + eventemitter3 "4.0.4" underscore "1.9.1" - web3-core-helpers "1.2.2" - websocket "github:web3-js/WebSocket-Node#polyfill/globalThis" + web3-core-helpers "1.2.11" + websocket "^1.0.31" web3-providers-ws@1.2.9: version "1.2.9" @@ -9434,25 +9808,15 @@ web3-providers-ws@1.2.9: web3-core-helpers "1.2.9" websocket "^1.0.31" -web3-providers-ws@1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/web3-providers-ws/-/web3-providers-ws-1.3.0.tgz#84adeff65acd4624d7f5bb43c5b2b22d8f0f63a4" - integrity sha512-Im5MthhJnJst8nSoq0TgbyOdaiFQFa5r6sHPOVllhgIgViDqzbnlAFW9sNzQ0Q8VXPNfPIQKi9cOrHlSRNPjRw== - dependencies: - eventemitter3 "4.0.4" - underscore "1.9.1" - web3-core-helpers "1.3.0" - websocket "^1.0.32" - -web3-shh@1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/web3-shh/-/web3-shh-1.2.2.tgz#44ed998f2a6ba0ec5cb9d455184a0f647826a49c" - integrity sha512-og258NPhlBn8yYrDWjoWBBb6zo1OlBgoWGT+LL5/LPqRbjPe09hlOYHgscAAr9zZGtohTOty7RrxYw6Z6oDWCg== +web3-shh@1.2.11: + version "1.2.11" + resolved "https://registry.yarnpkg.com/web3-shh/-/web3-shh-1.2.11.tgz#f5d086f9621c9a47e98d438010385b5f059fd88f" + integrity sha512-B3OrO3oG1L+bv3E1sTwCx66injW1A8hhwpknDUbV+sw3fehFazA06z9SGXUefuFI1kVs4q2vRi0n4oCcI4dZDg== dependencies: - web3-core "1.2.2" - web3-core-method "1.2.2" - web3-core-subscriptions "1.2.2" - web3-net "1.2.2" + web3-core "1.2.11" + web3-core-method "1.2.11" + web3-core-subscriptions "1.2.11" + web3-net "1.2.11" web3-shh@1.2.9: version "1.2.9" @@ -9464,37 +9828,13 @@ web3-shh@1.2.9: web3-core-subscriptions "1.2.9" web3-net "1.2.9" -web3-shh@1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/web3-shh/-/web3-shh-1.3.0.tgz#62d15297da8fb5f733dd1b98f9ade300590f4d49" - integrity sha512-IZTojA4VCwVq+7eEIHuL1tJXtU+LJDhO8Y2QmuwetEWW1iBgWCGPHZasipWP+7kDpSm/5lo5GRxL72FF/Os/tA== - dependencies: - web3-core "1.3.0" - web3-core-method "1.3.0" - web3-core-subscriptions "1.3.0" - web3-net "1.3.0" - -web3-utils@1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/web3-utils/-/web3-utils-1.2.2.tgz#b53a08c40d2c3f31d3c4a28e7d749405df99c8c0" - integrity sha512-joF+s3243TY5cL7Z7y4h1JsJpUCf/kmFmj+eJar7Y2yNIGVcW961VyrAms75tjUysSuHaUQ3eQXjBEUJueT52A== - dependencies: - bn.js "4.11.8" - eth-lib "0.2.7" - ethereum-bloom-filters "^1.0.6" - ethjs-unit "0.1.6" - number-to-bn "1.7.0" - randombytes "^2.1.0" - underscore "1.9.1" - utf8 "3.0.0" - -web3-utils@1.2.6: - version "1.2.6" - resolved "https://registry.yarnpkg.com/web3-utils/-/web3-utils-1.2.6.tgz#b9a25432da00976457fcc1094c4af8ac6d486db9" - integrity sha512-8/HnqG/l7dGmKMgEL9JeKPTtjScxOePTzopv5aaKFExPfaBrYRkgoMqhoowCiAl/s16QaTn4DoIF1QC4YsT7Mg== +web3-utils@1.2.11: + version "1.2.11" + resolved "https://registry.yarnpkg.com/web3-utils/-/web3-utils-1.2.11.tgz#af1942aead3fb166ae851a985bed8ef2c2d95a82" + integrity sha512-3Tq09izhD+ThqHEaWYX4VOT7dNPdZiO+c/1QMA0s5X2lDFKK/xHJb7cyTRRVzN2LvlHbR7baS1tmQhSua51TcQ== dependencies: - bn.js "4.11.8" - eth-lib "0.2.7" + bn.js "^4.11.9" + eth-lib "0.2.8" ethereum-bloom-filters "^1.0.6" ethjs-unit "0.1.6" number-to-bn "1.7.0" @@ -9516,10 +9856,10 @@ web3-utils@1.2.9: underscore "1.9.1" utf8 "3.0.0" -web3-utils@1.3.0, web3-utils@^1.2.1, web3-utils@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/web3-utils/-/web3-utils-1.3.0.tgz#5bac16e5e0ec9fe7bdcfadb621655e8aa3cf14e1" - integrity sha512-2mS5axFCbkhicmoDRuJeuo0TVGQDgC2sPi/5dblfVC+PMtX0efrb8Xlttv/eGkq7X4E83Pds34FH98TP2WOUZA== +web3-utils@^1.0.0-beta.31, web3-utils@^1.3.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/web3-utils/-/web3-utils-1.3.1.tgz#9aa880dd8c9463fe5c099107889f86a085370c2e" + integrity sha512-9gPwFm8SXtIJuzdrZ37PRlalu40fufXxo+H2PiCwaO6RpKGAvlUlWU0qQbyToFNXg7W2H8djEgoAVac8NLMCKQ== dependencies: bn.js "^4.11.9" eth-lib "0.2.8" @@ -9530,32 +9870,18 @@ web3-utils@1.3.0, web3-utils@^1.2.1, web3-utils@^1.3.0: underscore "1.9.1" utf8 "3.0.0" -web3@*, web3@^1.0.0-beta.34, web3@^1.2.1, web3@^1.2.6: - version "1.3.0" - resolved "https://registry.yarnpkg.com/web3/-/web3-1.3.0.tgz#8fe4cd6e2a21c91904f343ba75717ee4c76bb349" - integrity sha512-4q9dna0RecnrlgD/bD1C5S+81Untbd6Z/TBD7rb+D5Bvvc0Wxjr4OP70x+LlnwuRDjDtzBwJbNUblh2grlVArw== - dependencies: - web3-bzz "1.3.0" - web3-core "1.3.0" - web3-eth "1.3.0" - web3-eth-personal "1.3.0" - web3-net "1.3.0" - web3-shh "1.3.0" - web3-utils "1.3.0" - -web3@1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/web3/-/web3-1.2.2.tgz#b1b8b69aafdf94cbaeadbb68a8aa1df2ef266aec" - integrity sha512-/ChbmB6qZpfGx6eNpczt5YSUBHEA5V2+iUCbn85EVb3Zv6FVxrOo5Tv7Lw0gE2tW7EEjASbCyp3mZeiZaCCngg== +web3@1.2.11: + version "1.2.11" + resolved "https://registry.yarnpkg.com/web3/-/web3-1.2.11.tgz#50f458b2e8b11aa37302071c170ed61cff332975" + integrity sha512-mjQ8HeU41G6hgOYm1pmeH0mRAeNKJGnJEUzDMoerkpw7QUQT4exVREgF1MYPvL/z6vAshOXei25LE/t/Bxl8yQ== dependencies: - "@types/node" "^12.6.1" - web3-bzz "1.2.2" - web3-core "1.2.2" - web3-eth "1.2.2" - web3-eth-personal "1.2.2" - web3-net "1.2.2" - web3-shh "1.2.2" - web3-utils "1.2.2" + web3-bzz "1.2.11" + web3-core "1.2.11" + web3-eth "1.2.11" + web3-eth-personal "1.2.11" + web3-net "1.2.11" + web3-shh "1.2.11" + web3-utils "1.2.11" web3@1.2.9: version "1.2.9" @@ -9570,7 +9896,7 @@ web3@1.2.9: web3-shh "1.2.9" web3-utils "1.2.9" -websocket@^1.0.31, websocket@^1.0.32: +websocket@1.0.32: version "1.0.32" resolved "https://registry.yarnpkg.com/websocket/-/websocket-1.0.32.tgz#1f16ddab3a21a2d929dec1687ab21cfdc6d3dbb1" integrity sha512-i4yhcllSP4wrpoPMU2N0TQ/q0O94LRG/eUQjEAamRltjQ1oT1PFFKOG4i877OlJgCG8rw6LrrowJp+TYCEWF7Q== @@ -9582,14 +9908,16 @@ websocket@^1.0.31, websocket@^1.0.32: utf-8-validate "^5.0.2" yaeti "^0.0.6" -"websocket@github:web3-js/WebSocket-Node#polyfill/globalThis": - version "1.0.29" - resolved "https://codeload.github.com/web3-js/WebSocket-Node/tar.gz/ef5ea2f41daf4a2113b80c9223df884b4d56c400" +websocket@^1.0.31: + version "1.0.33" + resolved "https://registry.yarnpkg.com/websocket/-/websocket-1.0.33.tgz#407f763fc58e74a3fa41ca3ae5d78d3f5e3b82a5" + integrity sha512-XwNqM2rN5eh3G2CUQE3OHZj+0xfdH42+OFK6LdC2yqiC0YU8e5UK0nYre220T0IyyN031V/XOvtHvXozvJYFWA== dependencies: + bufferutil "^4.0.1" debug "^2.2.0" es5-ext "^0.10.50" - nan "^2.14.0" typedarray-to-buffer "^3.1.5" + utf-8-validate "^5.0.2" yaeti "^0.0.6" whatwg-fetch@2.0.4: @@ -9597,6 +9925,11 @@ whatwg-fetch@2.0.4: resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-2.0.4.tgz#dde6a5df315f9d39991aa17621853d720b85566f" integrity sha512-dcQ1GWpOD/eEQ97k66aiEVpNnapVj90/+R+SXTPYGHpYBBypfKJEQjLrvMZ7YXbKm21gXd4NcuxUTjiv1YtLng== +which-module@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/which-module/-/which-module-1.0.0.tgz#bba63ca861948994ff307736089e3b96026c2a4f" + integrity sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8= + which-module@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" @@ -9609,6 +9942,13 @@ which@1.3.1, which@^1.1.1, which@^1.2.9, which@^1.3.1: dependencies: isexe "^2.0.0" +which@2.0.2, which@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== + dependencies: + isexe "^2.0.0" + wide-align@1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457" @@ -9616,7 +9956,12 @@ wide-align@1.1.3: dependencies: string-width "^1.0.2 || 2" -word-wrap@~1.2.3: +window-size@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.2.0.tgz#b4315bb4214a3d7058ebeee892e13fa24d98b075" + integrity sha1-tDFbtCFKPXBY6+7okuE/ok2YsHU= + +word-wrap@^1.2.3, word-wrap@~1.2.3: version "1.2.3" resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== @@ -9626,6 +9971,11 @@ wordwrap@^1.0.0: resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" integrity sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus= +workerpool@6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.0.2.tgz#e241b43d8d033f1beb52c7851069456039d1d438" + integrity sha512-DSNyvOpFKrNusaaUwk+ej6cBj1bmhLcBfj80elGk+ZIo5JSkq+unB1dLKEOcNfJDZgjGICfhQ0Q5TbP0PvF4+Q== + wrap-ansi@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85" @@ -9655,6 +10005,11 @@ write@1.0.3: dependencies: mkdirp "^0.5.1" +ws@7.2.3: + version "7.2.3" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.2.3.tgz#a5411e1fb04d5ed0efee76d26d5c46d830c39b46" + integrity sha512-HTDl9G9hbkNDk98naoR/cHDws7+EyYMOdL1BmjsZXRUjf7d+MficC4B7HLUPlSiho0vg+CWKrGIt/VJBd1xunQ== + ws@^3.0.0: version "3.3.3" resolved "https://registry.yarnpkg.com/ws/-/ws-3.3.3.tgz#f1cf84fe2d5e901ebce94efaece785f187a228f2" @@ -9672,9 +10027,9 @@ ws@^5.1.1: async-limiter "~1.0.0" ws@^7.2.1: - version "7.4.0" - resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.0.tgz#a5dd76a24197940d4a8bb9e0e152bb4503764da7" - integrity sha512-kyFwXuV/5ymf+IXhS6f0+eAFvydbaBW3zjpT6hUdAh/hbVjTIB5EHBGi0bPoCLSK2wcuz3BrEkB9LrYv1Nm4NQ== + version "7.4.2" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.2.tgz#782100048e54eb36fe9843363ab1c68672b261dd" + integrity sha512-T4tewALS3+qsrpGI/8dqNMLIVdq/g/85U98HPMa6F0m6xTbvhXU6RCQLqPH3+SlomNV/LdY6RXEbBpMH6EOJnA== xhr-request-promise@^0.1.2: version "0.1.3" @@ -9704,11 +10059,11 @@ xhr2-cookies@1.1.0: cookiejar "^2.1.1" xhr@^2.0.4, xhr@^2.2.0, xhr@^2.3.3: - version "2.5.0" - resolved "https://registry.yarnpkg.com/xhr/-/xhr-2.5.0.tgz#bed8d1676d5ca36108667692b74b316c496e49dd" - integrity sha512-4nlO/14t3BNUZRXIXfXe+3N6w3s1KoxcJUUURctd64BLRe67E4gRwp4PjywtDY72fXpZ1y6Ch0VZQRY/gMPzzQ== + version "2.6.0" + resolved "https://registry.yarnpkg.com/xhr/-/xhr-2.6.0.tgz#b69d4395e792b4173d6b7df077f0fc5e4e2b249d" + integrity sha512-/eCGLb5rxjx5e3mF1A7s+pLlR6CGyqWN91fv1JgER5mVWg1MZmlhBvy9kjcsOdRk8RrIujotWyJamfyrp+WIcA== dependencies: - global "~4.3.0" + global "~4.4.0" is-function "^1.0.1" parse-headers "^2.0.0" xtend "^4.0.0" @@ -9718,7 +10073,7 @@ xmlhttprequest@1.8.0: resolved "https://registry.yarnpkg.com/xmlhttprequest/-/xmlhttprequest-1.8.0.tgz#67fe075c5c24fef39f9d65f5f7b7fe75171968fc" integrity sha1-Z/4HXFwk/vOfnWX197f+dRcZaPw= -xtend@^4.0.0, xtend@^4.0.1, xtend@~4.0.0: +xtend@^4.0.0, xtend@^4.0.1, xtend@~4.0.0, xtend@~4.0.1: version "4.0.2" resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== @@ -9731,30 +10086,30 @@ xtend@~2.1.1: object-keys "~0.4.0" y18n@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41" - integrity sha1-bRX7qITAhnnA136I53WegR4H+kE= + version "3.2.2" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.2.tgz#85c901bd6470ce71fc4bb723ad209b70f7f28696" + integrity sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ== y18n@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b" - integrity sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w== + version "4.0.1" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.1.tgz#8db2b83c31c5d75099bb890b23f3094891e247d4" + integrity sha512-wNcy4NvjMYL8gogWWYAO7ZFWFfHcbdbE57tZO8e4cbpj8tfUcwrwqSl3ad8HxpYWCdXcJUCeKKZS62Av1affwQ== yaeti@^0.0.6: version "0.0.6" resolved "https://registry.yarnpkg.com/yaeti/-/yaeti-0.0.6.tgz#f26f484d72684cf42bedfb76970aa1608fbf9577" integrity sha1-8m9ITXJoTPQr7ft2lwqhYI+/lXc= -yallist@^2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" - integrity sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI= - yallist@^3.0.0, yallist@^3.0.2, yallist@^3.0.3: version "3.1.1" resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== +yallist@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" + integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== + yargs-parser@13.1.2, yargs-parser@^13.1.0, yargs-parser@^13.1.2: version "13.1.2" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.2.tgz#130f09702ebaeef2650d54ce6e3e5706f7a4fb38" @@ -9763,12 +10118,13 @@ yargs-parser@13.1.2, yargs-parser@^13.1.0, yargs-parser@^13.1.2: camelcase "^5.0.0" decamelize "^1.2.0" -yargs-parser@^8.1.0: - version "8.1.0" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-8.1.0.tgz#f1376a33b6629a5d063782944da732631e966950" - integrity sha512-yP+6QqN8BmrgW2ggLtTbdrOyBNSI7zBa4IykmiV5R1wl1JWNxQvWhMfMdmzIYtKU7oP3OOInY/tl2ov3BDjnJQ== +yargs-parser@^2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-2.4.1.tgz#85568de3cf150ff49fa51825f03a8c880ddcc5c4" + integrity sha1-hVaN488VD/SfpRgl8DqMiA3cxcQ= dependencies: - camelcase "^4.1.0" + camelcase "^3.0.0" + lodash.assign "^4.0.6" yargs-unparser@1.6.0: version "1.6.0" @@ -9779,6 +10135,16 @@ yargs-unparser@1.6.0: lodash "^4.17.15" yargs "^13.3.0" +yargs-unparser@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/yargs-unparser/-/yargs-unparser-2.0.0.tgz#f131f9226911ae5d9ad38c432fe809366c2325eb" + integrity sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA== + dependencies: + camelcase "^6.0.0" + decamelize "^4.0.0" + flat "^5.0.2" + is-plain-obj "^2.1.0" + yargs@13.2.4: version "13.2.4" resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.2.4.tgz#0b562b794016eb9651b98bd37acf364aa5d6dc83" @@ -9812,33 +10178,32 @@ yargs@13.3.2, yargs@^13.3.0: y18n "^4.0.0" yargs-parser "^13.1.2" -yargs@^10.0.3: - version "10.1.2" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-10.1.2.tgz#454d074c2b16a51a43e2fb7807e4f9de69ccb5c5" - integrity sha512-ivSoxqBGYOqQVruxD35+EyCFDYNEFL/Uo6FcOnz+9xZdZzK0Zzw4r4KhbrME1Oo2gOggwJod2MnsdamSG7H9ig== +yargs@^4.7.1: + version "4.8.1" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-4.8.1.tgz#c0c42924ca4aaa6b0e6da1739dfb216439f9ddc0" + integrity sha1-wMQpJMpKqmsObaFznfshZDn53cA= dependencies: - cliui "^4.0.0" + cliui "^3.2.0" decamelize "^1.1.1" - find-up "^2.1.0" get-caller-file "^1.0.1" - os-locale "^2.0.0" + lodash.assign "^4.0.3" + os-locale "^1.4.0" + read-pkg-up "^1.0.1" require-directory "^2.1.1" require-main-filename "^1.0.1" set-blocking "^2.0.0" - string-width "^2.0.0" - which-module "^2.0.0" + string-width "^1.0.1" + which-module "^1.0.0" + window-size "^0.2.0" y18n "^3.2.1" - yargs-parser "^8.1.0" - -yauzl@^2.4.2: - version "2.10.0" - resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.10.0.tgz#c7eb17c93e112cb1086fa6d8e51fb0667b79a5f9" - integrity sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk= - dependencies: - buffer-crc32 "~0.2.3" - fd-slicer "~1.1.0" + yargs-parser "^2.4.1" yn@3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== + +yocto-queue@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" + integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==