@guru-fund/sdk 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +226 -0
- package/dist/GuruProtocol.d.ts +44 -0
- package/dist/GuruProtocol.js +75 -0
- package/dist/addresses.d.ts +40 -0
- package/dist/addresses.js +111 -0
- package/dist/constants.d.ts +22 -0
- package/dist/constants.js +23 -0
- package/dist/helpers/FundDataFetcher.d.ts +24 -0
- package/dist/helpers/FundDataFetcher.js +66 -0
- package/dist/helpers/ReceiptParser.d.ts +23 -0
- package/dist/helpers/ReceiptParser.js +59 -0
- package/dist/helpers/Token.d.ts +18 -0
- package/dist/helpers/Token.js +43 -0
- package/dist/helpers/compareAddresses.d.ts +1 -0
- package/dist/helpers/compareAddresses.js +15 -0
- package/dist/index.d.ts +17 -0
- package/dist/index.js +3 -0
- package/dist/quotes/quoteDeposit.d.ts +41 -0
- package/dist/quotes/quoteDeposit.js +186 -0
- package/dist/quotes/quoteHarvest.d.ts +34 -0
- package/dist/quotes/quoteHarvest.js +105 -0
- package/dist/quotes/quoteRebalance.d.ts +51 -0
- package/dist/quotes/quoteRebalance.js +201 -0
- package/dist/quotes/quoteTrade.d.ts +18 -0
- package/dist/quotes/quoteTrade.js +51 -0
- package/dist/quotes/quoteWithdrawal.d.ts +41 -0
- package/dist/quotes/quoteWithdrawal.js +113 -0
- package/dist/router/constants.d.ts +18 -0
- package/dist/router/constants.js +25 -0
- package/dist/router/finalizeRoute.d.ts +16 -0
- package/dist/router/finalizeRoute.js +29 -0
- package/dist/router/getFallbackRoutes.d.ts +10 -0
- package/dist/router/getFallbackRoutes.js +91 -0
- package/dist/router/getUniswapV4Route.d.ts +42 -0
- package/dist/router/getUniswapV4Route.js +324 -0
- package/dist/router/getVeloraRoute.d.ts +10 -0
- package/dist/router/getVeloraRoute.js +68 -0
- package/dist/router/helpers.d.ts +11 -0
- package/dist/router/helpers.js +30 -0
- package/dist/router/index.d.ts +22 -0
- package/dist/router/index.js +135 -0
- package/dist/router/pathCache.d.ts +16 -0
- package/dist/router/pathCache.js +116 -0
- package/dist/router/poolHelper.d.ts +126 -0
- package/dist/router/poolHelper.js +807 -0
- package/dist/router/quoteWethTrade.d.ts +14 -0
- package/dist/router/quoteWethTrade.js +125 -0
- package/dist/router/simulation.d.ts +43 -0
- package/dist/router/simulation.js +70 -0
- package/dist/router/types.d.ts +149 -0
- package/dist/router/types.js +1 -0
- package/dist/router/v4PoolDiscovery.d.ts +30 -0
- package/dist/router/v4PoolDiscovery.js +147 -0
- package/dist/router/velora.d.ts +42 -0
- package/dist/router/velora.js +279 -0
- package/dist/schemas/index.d.ts +6 -0
- package/dist/schemas/index.js +6 -0
- package/dist/schemas/primitives.d.ts +3 -0
- package/dist/schemas/primitives.js +9 -0
- package/dist/schemas/quoteDeposit.d.ts +23 -0
- package/dist/schemas/quoteDeposit.js +10 -0
- package/dist/schemas/quoteHarvest.d.ts +17 -0
- package/dist/schemas/quoteHarvest.js +8 -0
- package/dist/schemas/quoteRebalance.d.ts +29 -0
- package/dist/schemas/quoteRebalance.js +10 -0
- package/dist/schemas/quoteTrade.d.ts +20 -0
- package/dist/schemas/quoteTrade.js +9 -0
- package/dist/schemas/quoteWithdrawal.d.ts +23 -0
- package/dist/schemas/quoteWithdrawal.js +10 -0
- package/dist/txBuilders/buildDepositTx.d.ts +17 -0
- package/dist/txBuilders/buildDepositTx.js +18 -0
- package/dist/txBuilders/buildHarvestTx.d.ts +16 -0
- package/dist/txBuilders/buildHarvestTx.js +17 -0
- package/dist/txBuilders/buildTradeTx.d.ts +9 -0
- package/dist/txBuilders/buildTradeTx.js +9 -0
- package/dist/txBuilders/buildWithdrawTx.d.ts +16 -0
- package/dist/txBuilders/buildWithdrawTx.js +17 -0
- package/dist/txBuilders/index.d.ts +8 -0
- package/dist/txBuilders/index.js +4 -0
- package/dist/typechain/common.d.ts +50 -0
- package/dist/typechain/common.js +1 -0
- package/dist/typechain/factories/include/IPancakeQuoterV2__factory.d.ts +225 -0
- package/dist/typechain/factories/include/IPancakeQuoterV2__factory.js +295 -0
- package/dist/typechain/factories/include/ISwapRouter02__factory.d.ts +826 -0
- package/dist/typechain/factories/include/ISwapRouter02__factory.js +1073 -0
- package/dist/typechain/factories/include/index.d.ts +2 -0
- package/dist/typechain/factories/include/index.js +2 -0
- package/dist/typechain/factories/index.d.ts +2 -0
- package/dist/typechain/factories/index.js +2 -0
- package/dist/typechain/factories/out/Adapter__factory.d.ts +31 -0
- package/dist/typechain/factories/out/Adapter__factory.js +43 -0
- package/dist/typechain/factories/out/AerodromeV2Adapter__factory.d.ts +179 -0
- package/dist/typechain/factories/out/AerodromeV2Adapter__factory.js +237 -0
- package/dist/typechain/factories/out/AerodromeV3Adapter__factory.d.ts +162 -0
- package/dist/typechain/factories/out/AerodromeV3Adapter__factory.js +215 -0
- package/dist/typechain/factories/out/AssetManager.sol/LedgerAssetManager__factory.d.ts +1032 -0
- package/dist/typechain/factories/out/AssetManager.sol/LedgerAssetManager__factory.js +1357 -0
- package/dist/typechain/factories/out/AssetManager.sol/index.d.ts +1 -0
- package/dist/typechain/factories/out/AssetManager.sol/index.js +1 -0
- package/dist/typechain/factories/out/Bookkeeper.sol/LedgerBookkeeper__factory.d.ts +950 -0
- package/dist/typechain/factories/out/Bookkeeper.sol/LedgerBookkeeper__factory.js +1250 -0
- package/dist/typechain/factories/out/Bookkeeper.sol/index.d.ts +1 -0
- package/dist/typechain/factories/out/Bookkeeper.sol/index.js +1 -0
- package/dist/typechain/factories/out/Checkpoint.sol/CheckpointController__factory.d.ts +33 -0
- package/dist/typechain/factories/out/Checkpoint.sol/CheckpointController__factory.js +47 -0
- package/dist/typechain/factories/out/Checkpoint.sol/index.d.ts +1 -0
- package/dist/typechain/factories/out/Checkpoint.sol/index.js +1 -0
- package/dist/typechain/factories/out/Closure.sol/ClosureController__factory.d.ts +459 -0
- package/dist/typechain/factories/out/Closure.sol/ClosureController__factory.js +603 -0
- package/dist/typechain/factories/out/Closure.sol/index.d.ts +1 -0
- package/dist/typechain/factories/out/Closure.sol/index.js +1 -0
- package/dist/typechain/factories/out/ContextBuilder__factory.d.ts +671 -0
- package/dist/typechain/factories/out/ContextBuilder__factory.js +870 -0
- package/dist/typechain/factories/out/Control.sol/Controllable__factory.d.ts +107 -0
- package/dist/typechain/factories/out/Control.sol/Controllable__factory.js +141 -0
- package/dist/typechain/factories/out/Control.sol/Controller__factory.d.ts +21 -0
- package/dist/typechain/factories/out/Control.sol/Controller__factory.js +30 -0
- package/dist/typechain/factories/out/Control.sol/index.d.ts +2 -0
- package/dist/typechain/factories/out/Control.sol/index.js +2 -0
- package/dist/typechain/factories/out/Controller.sol/ClosureDelegate__factory.d.ts +57 -0
- package/dist/typechain/factories/out/Controller.sol/ClosureDelegate__factory.js +77 -0
- package/dist/typechain/factories/out/Controller.sol/CreationDelegate__factory.d.ts +58 -0
- package/dist/typechain/factories/out/Controller.sol/CreationDelegate__factory.js +77 -0
- package/dist/typechain/factories/out/Controller.sol/DepositDelegate__factory.d.ts +55 -0
- package/dist/typechain/factories/out/Controller.sol/DepositDelegate__factory.js +74 -0
- package/dist/typechain/factories/out/Controller.sol/FundController__factory.d.ts +703 -0
- package/dist/typechain/factories/out/Controller.sol/FundController__factory.js +911 -0
- package/dist/typechain/factories/out/Controller.sol/HarvestDelegate__factory.d.ts +234 -0
- package/dist/typechain/factories/out/Controller.sol/HarvestDelegate__factory.js +303 -0
- package/dist/typechain/factories/out/Controller.sol/TradeDelegate__factory.d.ts +61 -0
- package/dist/typechain/factories/out/Controller.sol/TradeDelegate__factory.js +81 -0
- package/dist/typechain/factories/out/Controller.sol/TransferDelegate__factory.d.ts +29 -0
- package/dist/typechain/factories/out/Controller.sol/TransferDelegate__factory.js +40 -0
- package/dist/typechain/factories/out/Controller.sol/WithdrawalDelegate__factory.d.ts +51 -0
- package/dist/typechain/factories/out/Controller.sol/WithdrawalDelegate__factory.js +69 -0
- package/dist/typechain/factories/out/Controller.sol/index.d.ts +8 -0
- package/dist/typechain/factories/out/Controller.sol/index.js +8 -0
- package/dist/typechain/factories/out/Cooldown.sol/LedgerCooldown__factory.d.ts +747 -0
- package/dist/typechain/factories/out/Cooldown.sol/LedgerCooldown__factory.js +982 -0
- package/dist/typechain/factories/out/Cooldown.sol/index.d.ts +1 -0
- package/dist/typechain/factories/out/Cooldown.sol/index.js +1 -0
- package/dist/typechain/factories/out/Creation.sol/CreationController__factory.d.ts +172 -0
- package/dist/typechain/factories/out/Creation.sol/CreationController__factory.js +225 -0
- package/dist/typechain/factories/out/Creation.sol/index.d.ts +1 -0
- package/dist/typechain/factories/out/Creation.sol/index.js +1 -0
- package/dist/typechain/factories/out/Deposit.sol/DepositController__factory.d.ts +162 -0
- package/dist/typechain/factories/out/Deposit.sol/DepositController__factory.js +223 -0
- package/dist/typechain/factories/out/Deposit.sol/index.d.ts +1 -0
- package/dist/typechain/factories/out/Deposit.sol/index.js +1 -0
- package/dist/typechain/factories/out/Error__factory.d.ts +318 -0
- package/dist/typechain/factories/out/Error__factory.js +423 -0
- package/dist/typechain/factories/out/Harvest.sol/HarvestController__factory.d.ts +401 -0
- package/dist/typechain/factories/out/Harvest.sol/HarvestController__factory.js +527 -0
- package/dist/typechain/factories/out/Harvest.sol/index.d.ts +1 -0
- package/dist/typechain/factories/out/Harvest.sol/index.js +1 -0
- package/dist/typechain/factories/out/IAerodromeRouter__factory.d.ts +85 -0
- package/dist/typechain/factories/out/IAerodromeRouter__factory.js +113 -0
- package/dist/typechain/factories/out/IAerodromeSwapRouter__factory.d.ts +89 -0
- package/dist/typechain/factories/out/IAerodromeSwapRouter__factory.js +119 -0
- package/dist/typechain/factories/out/IUniswapV4.sol/IPermit2__factory.d.ts +29 -0
- package/dist/typechain/factories/out/IUniswapV4.sol/IPermit2__factory.js +40 -0
- package/dist/typechain/factories/out/IUniswapV4.sol/IUniversalRouter__factory.d.ts +25 -0
- package/dist/typechain/factories/out/IUniswapV4.sol/IUniversalRouter__factory.js +35 -0
- package/dist/typechain/factories/out/IUniswapV4.sol/index.d.ts +2 -0
- package/dist/typechain/factories/out/IUniswapV4.sol/index.js +2 -0
- package/dist/typechain/factories/out/IV0Fund__factory.d.ts +129 -0
- package/dist/typechain/factories/out/IV0Fund__factory.js +173 -0
- package/dist/typechain/factories/out/IV3SwapRouter__factory.d.ts +38 -0
- package/dist/typechain/factories/out/IV3SwapRouter__factory.js +53 -0
- package/dist/typechain/factories/out/Initializer.sol/LedgerInitializer__factory.d.ts +655 -0
- package/dist/typechain/factories/out/Initializer.sol/LedgerInitializer__factory.js +859 -0
- package/dist/typechain/factories/out/Initializer.sol/VaultInitializer__factory.d.ts +141 -0
- package/dist/typechain/factories/out/Initializer.sol/VaultInitializer__factory.js +185 -0
- package/dist/typechain/factories/out/Initializer.sol/index.d.ts +2 -0
- package/dist/typechain/factories/out/Initializer.sol/index.js +2 -0
- package/dist/typechain/factories/out/Ledger.sol/FundLedger__factory.d.ts +1502 -0
- package/dist/typechain/factories/out/Ledger.sol/FundLedger__factory.js +1959 -0
- package/dist/typechain/factories/out/Ledger.sol/index.d.ts +1 -0
- package/dist/typechain/factories/out/Ledger.sol/index.js +1 -0
- package/dist/typechain/factories/out/LotusP2P__factory.d.ts +847 -0
- package/dist/typechain/factories/out/LotusP2P__factory.js +1095 -0
- package/dist/typechain/factories/out/MulticallStatic__factory.d.ts +29 -0
- package/dist/typechain/factories/out/MulticallStatic__factory.js +42 -0
- package/dist/typechain/factories/out/Operator.sol/VaultOperator__factory.d.ts +235 -0
- package/dist/typechain/factories/out/Operator.sol/VaultOperator__factory.js +308 -0
- package/dist/typechain/factories/out/Operator.sol/index.d.ts +1 -0
- package/dist/typechain/factories/out/Operator.sol/index.js +1 -0
- package/dist/typechain/factories/out/P2PAdapter__factory.d.ts +216 -0
- package/dist/typechain/factories/out/P2PAdapter__factory.js +287 -0
- package/dist/typechain/factories/out/ProtocolMigrationExtension__factory.d.ts +1084 -0
- package/dist/typechain/factories/out/ProtocolMigrationExtension__factory.js +1409 -0
- package/dist/typechain/factories/out/ProtocolProvider__factory.d.ts +21 -0
- package/dist/typechain/factories/out/ProtocolProvider__factory.js +30 -0
- package/dist/typechain/factories/out/Protocol__factory.d.ts +1095 -0
- package/dist/typechain/factories/out/Protocol__factory.js +1424 -0
- package/dist/typechain/factories/out/Registrar.sol/LedgerRegistrar__factory.d.ts +1375 -0
- package/dist/typechain/factories/out/Registrar.sol/LedgerRegistrar__factory.js +1791 -0
- package/dist/typechain/factories/out/Registrar.sol/index.d.ts +1 -0
- package/dist/typechain/factories/out/Registrar.sol/index.js +1 -0
- package/dist/typechain/factories/out/Settings.sol/SettingsController__factory.d.ts +143 -0
- package/dist/typechain/factories/out/Settings.sol/SettingsController__factory.js +188 -0
- package/dist/typechain/factories/out/Settings.sol/index.d.ts +1 -0
- package/dist/typechain/factories/out/Settings.sol/index.js +1 -0
- package/dist/typechain/factories/out/Shares.sol/ICheckpointController__factory.d.ts +21 -0
- package/dist/typechain/factories/out/Shares.sol/ICheckpointController__factory.js +31 -0
- package/dist/typechain/factories/out/Shares.sol/ITransferController__factory.d.ts +25 -0
- package/dist/typechain/factories/out/Shares.sol/ITransferController__factory.js +35 -0
- package/dist/typechain/factories/out/Shares.sol/LedgerShares__factory.d.ts +829 -0
- package/dist/typechain/factories/out/Shares.sol/LedgerShares__factory.js +1089 -0
- package/dist/typechain/factories/out/Shares.sol/index.d.ts +3 -0
- package/dist/typechain/factories/out/Shares.sol/index.js +3 -0
- package/dist/typechain/factories/out/SignatureVerifier__factory.d.ts +171 -0
- package/dist/typechain/factories/out/SignatureVerifier__factory.js +224 -0
- package/dist/typechain/factories/out/Storage.sol/LedgerStorage__factory.d.ts +527 -0
- package/dist/typechain/factories/out/Storage.sol/LedgerStorage__factory.js +695 -0
- package/dist/typechain/factories/out/Storage.sol/index.d.ts +1 -0
- package/dist/typechain/factories/out/Storage.sol/index.js +1 -0
- package/dist/typechain/factories/out/Trade.sol/TradeController__factory.d.ts +200 -0
- package/dist/typechain/factories/out/Trade.sol/TradeController__factory.js +262 -0
- package/dist/typechain/factories/out/Trade.sol/index.d.ts +1 -0
- package/dist/typechain/factories/out/Trade.sol/index.js +1 -0
- package/dist/typechain/factories/out/Transfer.sol/TransferController__factory.d.ts +100 -0
- package/dist/typechain/factories/out/Transfer.sol/TransferController__factory.js +141 -0
- package/dist/typechain/factories/out/Transfer.sol/index.d.ts +1 -0
- package/dist/typechain/factories/out/Transfer.sol/index.js +1 -0
- package/dist/typechain/factories/out/UniswapV2Adapter__factory.d.ts +162 -0
- package/dist/typechain/factories/out/UniswapV2Adapter__factory.js +215 -0
- package/dist/typechain/factories/out/UniswapV3Adapter__factory.d.ts +162 -0
- package/dist/typechain/factories/out/UniswapV3Adapter__factory.js +215 -0
- package/dist/typechain/factories/out/UniswapV3SwapRouter02Adapter__factory.d.ts +162 -0
- package/dist/typechain/factories/out/UniswapV3SwapRouter02Adapter__factory.js +215 -0
- package/dist/typechain/factories/out/UniswapV4Adapter__factory.d.ts +203 -0
- package/dist/typechain/factories/out/UniswapV4Adapter__factory.js +268 -0
- package/dist/typechain/factories/out/V0ToLotusMigrator__factory.d.ts +216 -0
- package/dist/typechain/factories/out/V0ToLotusMigrator__factory.js +284 -0
- package/dist/typechain/factories/out/Vault.sol/FundVault__factory.d.ts +258 -0
- package/dist/typechain/factories/out/Vault.sol/FundVault__factory.js +339 -0
- package/dist/typechain/factories/out/Vault.sol/index.d.ts +1 -0
- package/dist/typechain/factories/out/Vault.sol/index.js +1 -0
- package/dist/typechain/factories/out/Withdrawal.sol/WithdrawalController__factory.d.ts +285 -0
- package/dist/typechain/factories/out/Withdrawal.sol/WithdrawalController__factory.js +377 -0
- package/dist/typechain/factories/out/Withdrawal.sol/index.d.ts +1 -0
- package/dist/typechain/factories/out/Withdrawal.sol/index.js +1 -0
- package/dist/typechain/factories/out/index.d.ts +43 -0
- package/dist/typechain/factories/out/index.js +43 -0
- package/dist/typechain/include/IPancakeQuoterV2.d.ts +223 -0
- package/dist/typechain/include/IPancakeQuoterV2.js +1 -0
- package/dist/typechain/include/ISwapRouter02.d.ts +682 -0
- package/dist/typechain/include/ISwapRouter02.js +1 -0
- package/dist/typechain/include/index.d.ts +2 -0
- package/dist/typechain/include/index.js +1 -0
- package/dist/typechain/index.d.ts +119 -0
- package/dist/typechain/index.js +58 -0
- package/dist/typechain/out/Adapter.d.ts +29 -0
- package/dist/typechain/out/Adapter.js +1 -0
- package/dist/typechain/out/AerodromeV2Adapter.d.ts +106 -0
- package/dist/typechain/out/AerodromeV2Adapter.js +1 -0
- package/dist/typechain/out/AerodromeV3Adapter.d.ts +87 -0
- package/dist/typechain/out/AerodromeV3Adapter.js +1 -0
- package/dist/typechain/out/AssetManager.sol/LedgerAssetManager.d.ts +604 -0
- package/dist/typechain/out/AssetManager.sol/LedgerAssetManager.js +1 -0
- package/dist/typechain/out/AssetManager.sol/index.d.ts +1 -0
- package/dist/typechain/out/AssetManager.sol/index.js +1 -0
- package/dist/typechain/out/Bookkeeper.sol/LedgerBookkeeper.d.ts +548 -0
- package/dist/typechain/out/Bookkeeper.sol/LedgerBookkeeper.js +1 -0
- package/dist/typechain/out/Bookkeeper.sol/index.d.ts +1 -0
- package/dist/typechain/out/Bookkeeper.sol/index.js +1 -0
- package/dist/typechain/out/Checkpoint.sol/CheckpointController.d.ts +29 -0
- package/dist/typechain/out/Checkpoint.sol/CheckpointController.js +1 -0
- package/dist/typechain/out/Checkpoint.sol/index.d.ts +1 -0
- package/dist/typechain/out/Checkpoint.sol/index.js +1 -0
- package/dist/typechain/out/Closure.sol/ClosureController.d.ts +273 -0
- package/dist/typechain/out/Closure.sol/ClosureController.js +1 -0
- package/dist/typechain/out/Closure.sol/index.d.ts +1 -0
- package/dist/typechain/out/Closure.sol/index.js +1 -0
- package/dist/typechain/out/ContextBuilder.d.ts +403 -0
- package/dist/typechain/out/ContextBuilder.js +1 -0
- package/dist/typechain/out/Control.sol/Controllable.d.ts +97 -0
- package/dist/typechain/out/Control.sol/Controllable.js +1 -0
- package/dist/typechain/out/Control.sol/Controller.d.ts +25 -0
- package/dist/typechain/out/Control.sol/Controller.js +1 -0
- package/dist/typechain/out/Control.sol/index.d.ts +2 -0
- package/dist/typechain/out/Control.sol/index.js +1 -0
- package/dist/typechain/out/Controller.sol/ClosureDelegate.d.ts +61 -0
- package/dist/typechain/out/Controller.sol/ClosureDelegate.js +1 -0
- package/dist/typechain/out/Controller.sol/CreationDelegate.d.ts +61 -0
- package/dist/typechain/out/Controller.sol/CreationDelegate.js +1 -0
- package/dist/typechain/out/Controller.sol/DepositDelegate.d.ts +56 -0
- package/dist/typechain/out/Controller.sol/DepositDelegate.js +1 -0
- package/dist/typechain/out/Controller.sol/FundController.d.ts +464 -0
- package/dist/typechain/out/Controller.sol/FundController.js +1 -0
- package/dist/typechain/out/Controller.sol/HarvestDelegate.d.ts +163 -0
- package/dist/typechain/out/Controller.sol/HarvestDelegate.js +1 -0
- package/dist/typechain/out/Controller.sol/TradeDelegate.d.ts +67 -0
- package/dist/typechain/out/Controller.sol/TradeDelegate.js +1 -0
- package/dist/typechain/out/Controller.sol/TransferDelegate.d.ts +37 -0
- package/dist/typechain/out/Controller.sol/TransferDelegate.js +1 -0
- package/dist/typechain/out/Controller.sol/WithdrawalDelegate.d.ts +53 -0
- package/dist/typechain/out/Controller.sol/WithdrawalDelegate.js +1 -0
- package/dist/typechain/out/Controller.sol/index.d.ts +8 -0
- package/dist/typechain/out/Controller.sol/index.js +1 -0
- package/dist/typechain/out/Cooldown.sol/LedgerCooldown.d.ts +446 -0
- package/dist/typechain/out/Cooldown.sol/LedgerCooldown.js +1 -0
- package/dist/typechain/out/Cooldown.sol/index.d.ts +1 -0
- package/dist/typechain/out/Cooldown.sol/index.js +1 -0
- package/dist/typechain/out/Creation.sol/CreationController.d.ts +102 -0
- package/dist/typechain/out/Creation.sol/CreationController.js +1 -0
- package/dist/typechain/out/Creation.sol/index.d.ts +1 -0
- package/dist/typechain/out/Creation.sol/index.js +1 -0
- package/dist/typechain/out/Deposit.sol/DepositController.d.ts +68 -0
- package/dist/typechain/out/Deposit.sol/DepositController.js +1 -0
- package/dist/typechain/out/Deposit.sol/index.d.ts +1 -0
- package/dist/typechain/out/Deposit.sol/index.js +1 -0
- package/dist/typechain/out/Error.d.ts +20 -0
- package/dist/typechain/out/Error.js +1 -0
- package/dist/typechain/out/Harvest.sol/HarvestController.d.ts +241 -0
- package/dist/typechain/out/Harvest.sol/HarvestController.js +1 -0
- package/dist/typechain/out/Harvest.sol/index.d.ts +1 -0
- package/dist/typechain/out/Harvest.sol/index.js +1 -0
- package/dist/typechain/out/IAerodromeRouter.d.ts +80 -0
- package/dist/typechain/out/IAerodromeRouter.js +1 -0
- package/dist/typechain/out/IAerodromeSwapRouter.d.ts +96 -0
- package/dist/typechain/out/IAerodromeSwapRouter.js +1 -0
- package/dist/typechain/out/IUniswapV4.sol/IPermit2.d.ts +39 -0
- package/dist/typechain/out/IUniswapV4.sol/IPermit2.js +1 -0
- package/dist/typechain/out/IUniswapV4.sol/IUniversalRouter.d.ts +37 -0
- package/dist/typechain/out/IUniswapV4.sol/IUniversalRouter.js +1 -0
- package/dist/typechain/out/IUniswapV4.sol/index.d.ts +2 -0
- package/dist/typechain/out/IUniswapV4.sol/index.js +1 -0
- package/dist/typechain/out/IV0Fund.d.ts +69 -0
- package/dist/typechain/out/IV0Fund.js +1 -0
- package/dist/typechain/out/IV3SwapRouter.d.ts +52 -0
- package/dist/typechain/out/IV3SwapRouter.js +1 -0
- package/dist/typechain/out/Initializer.sol/LedgerInitializer.d.ts +379 -0
- package/dist/typechain/out/Initializer.sol/LedgerInitializer.js +1 -0
- package/dist/typechain/out/Initializer.sol/VaultInitializer.d.ts +129 -0
- package/dist/typechain/out/Initializer.sol/VaultInitializer.js +1 -0
- package/dist/typechain/out/Initializer.sol/index.d.ts +2 -0
- package/dist/typechain/out/Initializer.sol/index.js +1 -0
- package/dist/typechain/out/Ledger.sol/FundLedger.d.ts +926 -0
- package/dist/typechain/out/Ledger.sol/FundLedger.js +1 -0
- package/dist/typechain/out/Ledger.sol/index.d.ts +1 -0
- package/dist/typechain/out/Ledger.sol/index.js +1 -0
- package/dist/typechain/out/LotusP2P.d.ts +610 -0
- package/dist/typechain/out/LotusP2P.js +1 -0
- package/dist/typechain/out/MulticallStatic.d.ts +25 -0
- package/dist/typechain/out/MulticallStatic.js +1 -0
- package/dist/typechain/out/Operator.sol/VaultOperator.d.ts +197 -0
- package/dist/typechain/out/Operator.sol/VaultOperator.js +1 -0
- package/dist/typechain/out/Operator.sol/index.d.ts +1 -0
- package/dist/typechain/out/Operator.sol/index.js +1 -0
- package/dist/typechain/out/P2PAdapter.d.ts +100 -0
- package/dist/typechain/out/P2PAdapter.js +1 -0
- package/dist/typechain/out/Protocol.d.ts +815 -0
- package/dist/typechain/out/Protocol.js +1 -0
- package/dist/typechain/out/ProtocolMigrationExtension.d.ts +806 -0
- package/dist/typechain/out/ProtocolMigrationExtension.js +1 -0
- package/dist/typechain/out/ProtocolProvider.d.ts +25 -0
- package/dist/typechain/out/ProtocolProvider.js +1 -0
- package/dist/typechain/out/Registrar.sol/LedgerRegistrar.d.ts +866 -0
- package/dist/typechain/out/Registrar.sol/LedgerRegistrar.js +1 -0
- package/dist/typechain/out/Registrar.sol/index.d.ts +1 -0
- package/dist/typechain/out/Registrar.sol/index.js +1 -0
- package/dist/typechain/out/Settings.sol/SettingsController.d.ts +97 -0
- package/dist/typechain/out/Settings.sol/SettingsController.js +1 -0
- package/dist/typechain/out/Settings.sol/index.d.ts +1 -0
- package/dist/typechain/out/Settings.sol/index.js +1 -0
- package/dist/typechain/out/Shares.sol/ICheckpointController.d.ts +29 -0
- package/dist/typechain/out/Shares.sol/ICheckpointController.js +1 -0
- package/dist/typechain/out/Shares.sol/ITransferController.d.ts +37 -0
- package/dist/typechain/out/Shares.sol/ITransferController.js +1 -0
- package/dist/typechain/out/Shares.sol/LedgerShares.d.ts +494 -0
- package/dist/typechain/out/Shares.sol/LedgerShares.js +1 -0
- package/dist/typechain/out/Shares.sol/index.d.ts +3 -0
- package/dist/typechain/out/Shares.sol/index.js +1 -0
- package/dist/typechain/out/SignatureVerifier.d.ts +139 -0
- package/dist/typechain/out/SignatureVerifier.js +1 -0
- package/dist/typechain/out/Storage.sol/LedgerStorage.d.ts +281 -0
- package/dist/typechain/out/Storage.sol/LedgerStorage.js +1 -0
- package/dist/typechain/out/Storage.sol/index.d.ts +1 -0
- package/dist/typechain/out/Storage.sol/index.js +1 -0
- package/dist/typechain/out/Trade.sol/TradeController.d.ts +137 -0
- package/dist/typechain/out/Trade.sol/TradeController.js +1 -0
- package/dist/typechain/out/Trade.sol/index.d.ts +1 -0
- package/dist/typechain/out/Trade.sol/index.js +1 -0
- package/dist/typechain/out/Transfer.sol/TransferController.d.ts +49 -0
- package/dist/typechain/out/Transfer.sol/TransferController.js +1 -0
- package/dist/typechain/out/Transfer.sol/index.d.ts +1 -0
- package/dist/typechain/out/Transfer.sol/index.js +1 -0
- package/dist/typechain/out/UniswapV2Adapter.d.ts +87 -0
- package/dist/typechain/out/UniswapV2Adapter.js +1 -0
- package/dist/typechain/out/UniswapV3Adapter.d.ts +87 -0
- package/dist/typechain/out/UniswapV3Adapter.js +1 -0
- package/dist/typechain/out/UniswapV3SwapRouter02Adapter.d.ts +87 -0
- package/dist/typechain/out/UniswapV3SwapRouter02Adapter.js +1 -0
- package/dist/typechain/out/UniswapV4Adapter.d.ts +110 -0
- package/dist/typechain/out/UniswapV4Adapter.js +1 -0
- package/dist/typechain/out/V0ToLotusMigrator.d.ts +94 -0
- package/dist/typechain/out/V0ToLotusMigrator.js +1 -0
- package/dist/typechain/out/Vault.sol/FundVault.d.ts +197 -0
- package/dist/typechain/out/Vault.sol/FundVault.js +1 -0
- package/dist/typechain/out/Vault.sol/index.d.ts +1 -0
- package/dist/typechain/out/Vault.sol/index.js +1 -0
- package/dist/typechain/out/Withdrawal.sol/WithdrawalController.d.ts +152 -0
- package/dist/typechain/out/Withdrawal.sol/WithdrawalController.js +1 -0
- package/dist/typechain/out/Withdrawal.sol/index.d.ts +1 -0
- package/dist/typechain/out/Withdrawal.sol/index.js +1 -0
- package/dist/typechain/out/index.d.ts +65 -0
- package/dist/typechain/out/index.js +1 -0
- package/dist/types/Fund.d.ts +27 -0
- package/dist/types/Fund.js +1 -0
- package/package.json +67 -0
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { ContractTransactionReceipt, Interface } from 'ethers';
|
|
2
|
+
import { TypedContractEvent } from '../typechain/common';
|
|
3
|
+
type TypechainOutputObject<T> = T extends TypedContractEvent<infer _U, infer _W, infer V> ? V : never;
|
|
4
|
+
export default class ReceiptParser {
|
|
5
|
+
private receipt;
|
|
6
|
+
constructor(receipt: ContractTransactionReceipt);
|
|
7
|
+
static fromSimulationLogs(logs: {
|
|
8
|
+
address: string;
|
|
9
|
+
data: string;
|
|
10
|
+
topics: string[];
|
|
11
|
+
}[]): ReceiptParser;
|
|
12
|
+
getDecodedLog<T extends TypedContractEvent>(contractInterface: Interface, typedContractEvent: T): TypechainOutputObject<T>;
|
|
13
|
+
getDecodedLogAndEmitter<T extends TypedContractEvent>(contractInterface: Interface, typedContractEvent: T): {
|
|
14
|
+
emitter: string;
|
|
15
|
+
decodedLog: TypechainOutputObject<T>;
|
|
16
|
+
};
|
|
17
|
+
getDecodedLogs<T extends TypedContractEvent>(contractInterface: Interface, typedContractEvent: T): TypechainOutputObject<T>[];
|
|
18
|
+
getDecodedLogsAndEmitters<T extends TypedContractEvent>(contractInterface: Interface, typedContractEvent: T): {
|
|
19
|
+
emitter: string;
|
|
20
|
+
decodedLog: TypechainOutputObject<T>;
|
|
21
|
+
}[];
|
|
22
|
+
}
|
|
23
|
+
export {};
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
export default class ReceiptParser {
|
|
2
|
+
receipt;
|
|
3
|
+
constructor(receipt) {
|
|
4
|
+
this.receipt = receipt;
|
|
5
|
+
}
|
|
6
|
+
static fromSimulationLogs(logs) {
|
|
7
|
+
const padded = logs.map((l) => ({
|
|
8
|
+
...l,
|
|
9
|
+
topics: l.topics.map((t) => t.length < 66 ? '0x' + t.slice(2).padStart(64, '0') : t),
|
|
10
|
+
}));
|
|
11
|
+
return new ReceiptParser({
|
|
12
|
+
logs: padded,
|
|
13
|
+
});
|
|
14
|
+
}
|
|
15
|
+
getDecodedLog(contractInterface, typedContractEvent) {
|
|
16
|
+
for (const log of this.receipt.logs) {
|
|
17
|
+
const parsedLog = contractInterface.parseLog(log);
|
|
18
|
+
if (parsedLog?.name === typedContractEvent.name) {
|
|
19
|
+
return parsedLog.args.toObject(true);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
throw new Error(`Event ${typedContractEvent.name} not found`);
|
|
23
|
+
}
|
|
24
|
+
getDecodedLogAndEmitter(contractInterface, typedContractEvent) {
|
|
25
|
+
for (const log of this.receipt.logs) {
|
|
26
|
+
const parsedLog = contractInterface.parseLog(log);
|
|
27
|
+
if (parsedLog?.name === typedContractEvent.name) {
|
|
28
|
+
return {
|
|
29
|
+
emitter: log.address,
|
|
30
|
+
decodedLog: parsedLog.args.toObject(true),
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
throw new Error(`Event ${typedContractEvent.name} not found`);
|
|
35
|
+
}
|
|
36
|
+
getDecodedLogs(contractInterface, typedContractEvent) {
|
|
37
|
+
const logs = [];
|
|
38
|
+
for (const log of this.receipt.logs) {
|
|
39
|
+
const parsedLog = contractInterface.parseLog(log);
|
|
40
|
+
if (parsedLog?.name === typedContractEvent.name) {
|
|
41
|
+
logs.push(parsedLog.args.toObject(true));
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
return logs;
|
|
45
|
+
}
|
|
46
|
+
getDecodedLogsAndEmitters(contractInterface, typedContractEvent) {
|
|
47
|
+
const logs = [];
|
|
48
|
+
for (const log of this.receipt.logs) {
|
|
49
|
+
const parsedLog = contractInterface.parseLog(log);
|
|
50
|
+
if (parsedLog?.name === typedContractEvent.name) {
|
|
51
|
+
logs.push({
|
|
52
|
+
emitter: log.address,
|
|
53
|
+
decodedLog: parsedLog.args.toObject(true),
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
return logs;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { Interface, type Provider } from 'ethers';
|
|
2
|
+
export interface TokenMetadata {
|
|
3
|
+
address: string;
|
|
4
|
+
decimals: number;
|
|
5
|
+
symbol: string;
|
|
6
|
+
name: string;
|
|
7
|
+
}
|
|
8
|
+
export declare class Token {
|
|
9
|
+
readonly address: string;
|
|
10
|
+
static readonly interface: Interface;
|
|
11
|
+
static unitFor(decimals: number): bigint;
|
|
12
|
+
static format(amount: bigint, decimals: number): string;
|
|
13
|
+
private readonly contract;
|
|
14
|
+
constructor(address: string, provider: Provider);
|
|
15
|
+
metadata(): Promise<TokenMetadata>;
|
|
16
|
+
balanceOf(account: string): Promise<bigint>;
|
|
17
|
+
allowance(owner: string, spender: string): Promise<bigint>;
|
|
18
|
+
}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { Contract, formatUnits, Interface } from 'ethers';
|
|
2
|
+
const ERC20_ABI = [
|
|
3
|
+
'function decimals() view returns (uint8)',
|
|
4
|
+
'function symbol() view returns (string)',
|
|
5
|
+
'function name() view returns (string)',
|
|
6
|
+
'function balanceOf(address) view returns (uint256)',
|
|
7
|
+
'function allowance(address,address) view returns (uint256)',
|
|
8
|
+
'function approve(address spender, uint256 amount) returns (bool)',
|
|
9
|
+
];
|
|
10
|
+
export class Token {
|
|
11
|
+
address;
|
|
12
|
+
static interface = new Interface(ERC20_ABI);
|
|
13
|
+
static unitFor(decimals) {
|
|
14
|
+
return 10n ** BigInt(decimals);
|
|
15
|
+
}
|
|
16
|
+
static format(amount, decimals) {
|
|
17
|
+
return formatUnits(amount, decimals);
|
|
18
|
+
}
|
|
19
|
+
contract;
|
|
20
|
+
constructor(address, provider) {
|
|
21
|
+
this.address = address;
|
|
22
|
+
this.contract = new Contract(address, ERC20_ABI, provider);
|
|
23
|
+
}
|
|
24
|
+
async metadata() {
|
|
25
|
+
const [decimals, symbol, name] = await Promise.all([
|
|
26
|
+
this.contract.decimals(),
|
|
27
|
+
this.contract.symbol(),
|
|
28
|
+
this.contract.name(),
|
|
29
|
+
]);
|
|
30
|
+
return {
|
|
31
|
+
address: this.address,
|
|
32
|
+
decimals: Number(decimals),
|
|
33
|
+
symbol,
|
|
34
|
+
name,
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
balanceOf(account) {
|
|
38
|
+
return this.contract.balanceOf(account);
|
|
39
|
+
}
|
|
40
|
+
allowance(owner, spender) {
|
|
41
|
+
return this.contract.allowance(owner, spender);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export default function compareAddresses(a: string, b: string): boolean;
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export default function compareAddresses(a, b) {
|
|
2
|
+
if (!a.match(/^0x[0-9a-fA-F]{40}$/) || !b.match(/^0x[0-9a-fA-F]{40}$/)) {
|
|
3
|
+
console.error('Invalid address');
|
|
4
|
+
console.table({
|
|
5
|
+
A: {
|
|
6
|
+
Address: a,
|
|
7
|
+
},
|
|
8
|
+
B: {
|
|
9
|
+
Address: b,
|
|
10
|
+
},
|
|
11
|
+
});
|
|
12
|
+
throw new Error('Invalid address');
|
|
13
|
+
}
|
|
14
|
+
return a.toLowerCase() === b.toLowerCase();
|
|
15
|
+
}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export { default as ReceiptParser } from './helpers/ReceiptParser';
|
|
2
|
+
export { GURU_PROTOCOL_ADDRESSES, SUPPORTED_CHAIN_IDS, UnsupportedChainError, getGuruProtocolAddresses, isSupportedChainId, } from './addresses';
|
|
3
|
+
export type { GuruProtocolAddresses, GuruProtocolChainId } from './addresses';
|
|
4
|
+
export { GuruProtocol } from './GuruProtocol';
|
|
5
|
+
export type { GuruProtocolOptions } from './GuruProtocol';
|
|
6
|
+
export type { BuildDepositTxParams, BuildHarvestTxParams, BuildTradeTxParams, BuildWithdrawTxParams, } from './txBuilders';
|
|
7
|
+
export type { QuoteDepositParams, QuoteDepositResult, QuoteDepositLogs, } from './quotes/quoteDeposit';
|
|
8
|
+
export type { QuoteWithdrawalParams, QuoteWithdrawalResult, QuoteWithdrawalLogs, } from './quotes/quoteWithdrawal';
|
|
9
|
+
export type { QuoteTradeParams, QuoteTradeResult } from './quotes/quoteTrade';
|
|
10
|
+
export type { QuoteHarvestParams, QuoteHarvestResult, QuoteHarvestLogs, } from './quotes/quoteHarvest';
|
|
11
|
+
export type { QuoteRebalanceParams, QuoteRebalanceResult, QuoteRebalanceLogs, QuoteRebalanceTrade, QuoteRebalanceLogTrade, QuoteRebalanceEmptyReason, QuoteRebalanceTargetWeight, } from './quotes/quoteRebalance';
|
|
12
|
+
export type { Route, RouteSearchParams, V2Path, V3Path, V3PathHop, CachedPath, } from './router/types';
|
|
13
|
+
export type { PathFetcher, GetPathParams } from './router/pathCache';
|
|
14
|
+
export type { PrefixTx, SwapSimulator, SimulateSwapParams, SimulateSwapResult, } from './router/simulation';
|
|
15
|
+
export type { ExternalCallStruct } from './quotes/quoteRebalance';
|
|
16
|
+
export type { Fund } from './types/Fund';
|
|
17
|
+
export type { TransactionRequest } from 'ethers';
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import type { AddressLike, BytesLike, TransactionRequest } from 'ethers';
|
|
2
|
+
import type { GuruProtocolChainId } from '../addresses';
|
|
3
|
+
import { type GetPriceUsd1e18 } from '../helpers/FundDataFetcher';
|
|
4
|
+
import { type RouterContext } from '../router';
|
|
5
|
+
import type { Fund } from '../types/Fund';
|
|
6
|
+
export type ExternalCallStruct = {
|
|
7
|
+
adapter: AddressLike;
|
|
8
|
+
callData: BytesLike;
|
|
9
|
+
};
|
|
10
|
+
export interface QuoteDepositParams {
|
|
11
|
+
ledger: string;
|
|
12
|
+
account: string;
|
|
13
|
+
coin: string;
|
|
14
|
+
amount: bigint;
|
|
15
|
+
referrerFeeBps: bigint;
|
|
16
|
+
slippageSettings?: Record<string, string | number | bigint>;
|
|
17
|
+
}
|
|
18
|
+
export interface QuoteDepositContext extends RouterContext {
|
|
19
|
+
chainId: GuruProtocolChainId;
|
|
20
|
+
getPriceUsd1e18: GetPriceUsd1e18;
|
|
21
|
+
}
|
|
22
|
+
export interface QuoteDepositLogs {
|
|
23
|
+
expectedShares: bigint;
|
|
24
|
+
}
|
|
25
|
+
export type SimulationLog = {
|
|
26
|
+
address: string;
|
|
27
|
+
data: string;
|
|
28
|
+
topics: string[];
|
|
29
|
+
};
|
|
30
|
+
export interface QuoteDepositResult {
|
|
31
|
+
sharesOutMin: bigint;
|
|
32
|
+
extCalls: ExternalCallStruct[];
|
|
33
|
+
fees: bigint;
|
|
34
|
+
referrerFeeBps: bigint;
|
|
35
|
+
cumulativeSlippageBps: bigint;
|
|
36
|
+
perAssetSlippageBps: Record<string, bigint>;
|
|
37
|
+
txData: TransactionRequest;
|
|
38
|
+
decodeLogs: (logs: SimulationLog[]) => QuoteDepositLogs | null;
|
|
39
|
+
}
|
|
40
|
+
export declare function allocateDepositInputAmounts(assets: Fund.Asset[], totalAmount: bigint, totalValueLocked: bigint): Map<string, bigint>;
|
|
41
|
+
export default function quoteDeposit(params: QuoteDepositParams, ctx: QuoteDepositContext): Promise<QuoteDepositResult>;
|
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
import { MAX_BPS, UNIT } from '../constants.js';
|
|
2
|
+
import compareAddresses from '../helpers/compareAddresses.js';
|
|
3
|
+
import FundDataFetcher, { WEIGHT_DENOMINATOR, } from '../helpers/FundDataFetcher.js';
|
|
4
|
+
import ReceiptParser from '../helpers/ReceiptParser.js';
|
|
5
|
+
import { Token } from '../helpers/Token.js';
|
|
6
|
+
import { getRouteIn } from '../router/index.js';
|
|
7
|
+
import { quoteDepositSchema } from '../schemas/quoteDeposit.js';
|
|
8
|
+
import buildDepositTx from '../txBuilders/buildDepositTx.js';
|
|
9
|
+
import { FundLedger__factory } from '../typechain/index.js';
|
|
10
|
+
const MAX_UINT256 = (1n << 256n) - 1n;
|
|
11
|
+
const minBigint = (a, b) => (a < b ? a : b);
|
|
12
|
+
const slippageE2For = (settings, token) => {
|
|
13
|
+
const slippage = settings?.[token.toLowerCase()];
|
|
14
|
+
return slippage == null ? undefined : Number(BigInt(slippage) / 10n);
|
|
15
|
+
};
|
|
16
|
+
const assetUsd1e18Value = (asset) => (asset.usd1e18Price * asset.balance) / Token.unitFor(asset.token.decimals);
|
|
17
|
+
export function allocateDepositInputAmounts(assets, totalAmount, totalValueLocked) {
|
|
18
|
+
const allocations = new Map();
|
|
19
|
+
if (totalAmount === 0n || totalValueLocked === 0n) {
|
|
20
|
+
for (const asset of assets) {
|
|
21
|
+
allocations.set(asset.token.address.toLowerCase(), 0n);
|
|
22
|
+
}
|
|
23
|
+
return allocations;
|
|
24
|
+
}
|
|
25
|
+
const weighted = assets.map((asset) => {
|
|
26
|
+
const usdValue = assetUsd1e18Value(asset);
|
|
27
|
+
const weightedAmount = totalAmount * usdValue;
|
|
28
|
+
const amount = weightedAmount / totalValueLocked;
|
|
29
|
+
return {
|
|
30
|
+
asset,
|
|
31
|
+
amount,
|
|
32
|
+
remainder: weightedAmount % totalValueLocked,
|
|
33
|
+
};
|
|
34
|
+
});
|
|
35
|
+
const allocated = weighted.reduce((sum, item) => sum + item.amount, 0n);
|
|
36
|
+
let remainder = totalAmount - allocated;
|
|
37
|
+
weighted
|
|
38
|
+
.sort((a, b) => a.remainder === b.remainder ? 0 : a.remainder > b.remainder ? -1 : 1)
|
|
39
|
+
.forEach((item) => {
|
|
40
|
+
const extra = remainder > 0n ? 1n : 0n;
|
|
41
|
+
allocations.set(item.asset.token.address.toLowerCase(), item.amount + extra);
|
|
42
|
+
remainder -= extra;
|
|
43
|
+
});
|
|
44
|
+
return allocations;
|
|
45
|
+
}
|
|
46
|
+
export default async function quoteDeposit(params, ctx) {
|
|
47
|
+
const parsed = quoteDepositSchema.parse(params);
|
|
48
|
+
if (parsed.referrerFeeBps < 0n || parsed.referrerFeeBps > MAX_BPS) {
|
|
49
|
+
throw new Error(`referrerFeeBps must be between 0 and ${MAX_BPS}, got ${parsed.referrerFeeBps}`);
|
|
50
|
+
}
|
|
51
|
+
const provider = ctx.provider;
|
|
52
|
+
const ledger = FundLedger__factory.connect(parsed.ledger, provider);
|
|
53
|
+
const fetcher = new FundDataFetcher({
|
|
54
|
+
chainId: ctx.chainId,
|
|
55
|
+
provider,
|
|
56
|
+
getPriceUsd1e18: ctx.getPriceUsd1e18,
|
|
57
|
+
});
|
|
58
|
+
const [fundData, vault, controllerAddress] = await Promise.all([
|
|
59
|
+
fetcher.fetchFundData(ledger),
|
|
60
|
+
ledger.vault(),
|
|
61
|
+
ledger.controller(),
|
|
62
|
+
]);
|
|
63
|
+
const referrerFeeBps = parsed.referrerFeeBps;
|
|
64
|
+
const originalAmount = parsed.amount;
|
|
65
|
+
let fees = (originalAmount * referrerFeeBps) / MAX_BPS;
|
|
66
|
+
const adjustedAmount = originalAmount - fees;
|
|
67
|
+
const coinData = fundData.assets.find((asset) => compareAddresses(asset.token.address, parsed.coin));
|
|
68
|
+
const inputAllocations = allocateDepositInputAmounts(fundData.assets, adjustedAmount, fundData.totalValueLocked);
|
|
69
|
+
const coinInputAmount = coinData
|
|
70
|
+
? (inputAllocations.get(coinData.token.address.toLowerCase()) ?? 0n)
|
|
71
|
+
: 0n;
|
|
72
|
+
if (coinData && coinData.balance > 0n && coinInputAmount === 0n) {
|
|
73
|
+
throw new Error(`Deposit amount is too small to allocate input for asset ${coinData.token.address}`);
|
|
74
|
+
}
|
|
75
|
+
let lowestInputRatio = coinData && coinData.balance > 0n
|
|
76
|
+
? (coinInputAmount * UNIT) / coinData.balance
|
|
77
|
+
: MAX_UINT256;
|
|
78
|
+
const assetsToSwap = fundData.assets.filter((asset) => !compareAddresses(asset.token.address, parsed.coin));
|
|
79
|
+
const routeResults = await Promise.all(assetsToSwap.map(async (asset) => {
|
|
80
|
+
const amountIn = inputAllocations.get(asset.token.address.toLowerCase()) ?? 0n;
|
|
81
|
+
if (asset.balance > 0n && amountIn === 0n) {
|
|
82
|
+
throw new Error(`Deposit amount is too small to allocate input for asset ${asset.token.address}`);
|
|
83
|
+
}
|
|
84
|
+
const route = await getRouteIn({
|
|
85
|
+
chainId: ctx.chainId,
|
|
86
|
+
tokenIn: parsed.coin,
|
|
87
|
+
tokenOut: asset.token.address,
|
|
88
|
+
amountIn,
|
|
89
|
+
account: parsed.account,
|
|
90
|
+
vault,
|
|
91
|
+
}, ctx);
|
|
92
|
+
return { asset, route };
|
|
93
|
+
}));
|
|
94
|
+
const coinToken = await new Token(parsed.coin, provider).metadata();
|
|
95
|
+
const coinUsd1e18Price = await ctx.getPriceUsd1e18(parsed.coin);
|
|
96
|
+
const externalTokenMetadata = new Map();
|
|
97
|
+
const externalUsd1e18Prices = new Map();
|
|
98
|
+
const getTokenMetadata = async (address) => {
|
|
99
|
+
const existingAsset = fundData.assets.find((asset) => compareAddresses(asset.token.address, address));
|
|
100
|
+
if (existingAsset)
|
|
101
|
+
return existingAsset.token;
|
|
102
|
+
const key = address.toLowerCase();
|
|
103
|
+
const cached = externalTokenMetadata.get(key);
|
|
104
|
+
if (cached)
|
|
105
|
+
return cached;
|
|
106
|
+
const metadata = await new Token(address, provider).metadata();
|
|
107
|
+
externalTokenMetadata.set(key, metadata);
|
|
108
|
+
return metadata;
|
|
109
|
+
};
|
|
110
|
+
const getUsd1e18Price = async (address) => {
|
|
111
|
+
const existingAsset = fundData.assets.find((asset) => compareAddresses(asset.token.address, address));
|
|
112
|
+
if (existingAsset)
|
|
113
|
+
return existingAsset.usd1e18Price;
|
|
114
|
+
const key = address.toLowerCase();
|
|
115
|
+
const cached = externalUsd1e18Prices.get(key);
|
|
116
|
+
if (cached != null)
|
|
117
|
+
return cached;
|
|
118
|
+
const price = await ctx.getPriceUsd1e18(address);
|
|
119
|
+
externalUsd1e18Prices.set(key, price);
|
|
120
|
+
return price;
|
|
121
|
+
};
|
|
122
|
+
const tollToCoinUnits = async (amount, currency) => {
|
|
123
|
+
const currencyAddress = String(currency);
|
|
124
|
+
if (amount === 0n || compareAddresses(currencyAddress, parsed.coin)) {
|
|
125
|
+
return amount;
|
|
126
|
+
}
|
|
127
|
+
if (coinUsd1e18Price === 0n)
|
|
128
|
+
return 0n;
|
|
129
|
+
const [tollToken, tollUsd1e18Price] = await Promise.all([
|
|
130
|
+
getTokenMetadata(currencyAddress),
|
|
131
|
+
getUsd1e18Price(currencyAddress),
|
|
132
|
+
]);
|
|
133
|
+
const tollUsd1e18 = (amount * tollUsd1e18Price) / Token.unitFor(tollToken.decimals);
|
|
134
|
+
return ((tollUsd1e18 * Token.unitFor(coinToken.decimals)) / coinUsd1e18Price);
|
|
135
|
+
};
|
|
136
|
+
const extCalls = [];
|
|
137
|
+
const perAssetSlippageBps = {};
|
|
138
|
+
let cumulativeSlippageBps = 0n;
|
|
139
|
+
for (const { asset, route } of routeResults) {
|
|
140
|
+
extCalls.push({
|
|
141
|
+
adapter: route.adapter,
|
|
142
|
+
callData: route.callData,
|
|
143
|
+
});
|
|
144
|
+
fees += await tollToCoinUnits(route.toll.amount, route.toll.currency);
|
|
145
|
+
lowestInputRatio = minBigint(lowestInputRatio, (BigInt(route.data.amountToReceive) * UNIT) / asset.balance);
|
|
146
|
+
const bps = route.effectiveSlippageBps;
|
|
147
|
+
if (bps != null) {
|
|
148
|
+
const bpsN = BigInt(bps);
|
|
149
|
+
const assetKey = asset.token.address.toLowerCase();
|
|
150
|
+
perAssetSlippageBps[assetKey] = bpsN;
|
|
151
|
+
cumulativeSlippageBps += (bpsN * asset.weight) / WEIGHT_DENOMINATOR;
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
const sharesOutMin = (fundData.tokenTotalSupply * lowestInputRatio) / UNIT;
|
|
155
|
+
const txData = buildDepositTx({
|
|
156
|
+
controller: controllerAddress,
|
|
157
|
+
ledger: parsed.ledger,
|
|
158
|
+
coin: parsed.coin,
|
|
159
|
+
amount: originalAmount,
|
|
160
|
+
sharesOutMin,
|
|
161
|
+
extCalls,
|
|
162
|
+
referrerFeeBps,
|
|
163
|
+
from: parsed.account,
|
|
164
|
+
});
|
|
165
|
+
const depositedEvent = ledger.getEvent('Deposited');
|
|
166
|
+
const decodeLogs = (logs) => {
|
|
167
|
+
try {
|
|
168
|
+
const parser = ReceiptParser.fromSimulationLogs(logs);
|
|
169
|
+
const deposited = parser.getDecodedLog(ledger.interface, depositedEvent);
|
|
170
|
+
return { expectedShares: deposited.shares };
|
|
171
|
+
}
|
|
172
|
+
catch {
|
|
173
|
+
return null;
|
|
174
|
+
}
|
|
175
|
+
};
|
|
176
|
+
return {
|
|
177
|
+
sharesOutMin,
|
|
178
|
+
extCalls,
|
|
179
|
+
fees,
|
|
180
|
+
referrerFeeBps,
|
|
181
|
+
cumulativeSlippageBps,
|
|
182
|
+
perAssetSlippageBps,
|
|
183
|
+
txData,
|
|
184
|
+
decodeLogs,
|
|
185
|
+
};
|
|
186
|
+
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { type AddressLike, type BytesLike, type TransactionRequest } from 'ethers';
|
|
2
|
+
import { type GuruProtocolChainId } from '../addresses';
|
|
3
|
+
import { type GetPriceUsd1e18 } from '../helpers/FundDataFetcher';
|
|
4
|
+
import { type RouterContext } from '../router';
|
|
5
|
+
export type ExternalCallStruct = {
|
|
6
|
+
adapter: AddressLike;
|
|
7
|
+
callData: BytesLike;
|
|
8
|
+
};
|
|
9
|
+
export interface QuoteHarvestParams {
|
|
10
|
+
ledger: string;
|
|
11
|
+
coin: string;
|
|
12
|
+
isManagementFeeEligible?: boolean;
|
|
13
|
+
slippageSettings?: Record<string, bigint>;
|
|
14
|
+
}
|
|
15
|
+
export interface QuoteHarvestContext extends RouterContext {
|
|
16
|
+
chainId: GuruProtocolChainId;
|
|
17
|
+
getPriceUsd1e18: GetPriceUsd1e18;
|
|
18
|
+
}
|
|
19
|
+
export interface QuoteHarvestLogs {
|
|
20
|
+
harvestableAmount: bigint;
|
|
21
|
+
}
|
|
22
|
+
export type SimulationLog = {
|
|
23
|
+
address: string;
|
|
24
|
+
data: string;
|
|
25
|
+
topics: string[];
|
|
26
|
+
};
|
|
27
|
+
export interface QuoteHarvestResult {
|
|
28
|
+
extCalls: ExternalCallStruct[];
|
|
29
|
+
harvestableFraction: bigint;
|
|
30
|
+
managementFee: bigint;
|
|
31
|
+
txData: TransactionRequest;
|
|
32
|
+
decodeLogs: (logs: SimulationLog[]) => QuoteHarvestLogs | null;
|
|
33
|
+
}
|
|
34
|
+
export default function quoteHarvest(params: QuoteHarvestParams, ctx: QuoteHarvestContext): Promise<QuoteHarvestResult>;
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
import { ZeroAddress, } from 'ethers';
|
|
2
|
+
import { getGuruProtocolAddresses, } from '../addresses.js';
|
|
3
|
+
import { GURU_TOKEN_MAINNET, MANAGEMENT_FEE_COOLDOWN_DAYS, MANAGEMENT_FEE_ELIGIBLE_GOVERNANCE_TOKEN_RATIO, MAX_BPS, UNIT, } from '../constants.js';
|
|
4
|
+
import compareAddresses from '../helpers/compareAddresses.js';
|
|
5
|
+
import FundDataFetcher, { WEIGHT_DENOMINATOR, } from '../helpers/FundDataFetcher.js';
|
|
6
|
+
import { getRouteOut } from '../router/index.js';
|
|
7
|
+
import { quoteHarvestSchema } from '../schemas/quoteHarvest.js';
|
|
8
|
+
import buildHarvestTx from '../txBuilders/buildHarvestTx.js';
|
|
9
|
+
import { FundLedger__factory, HarvestController__factory } from '../typechain/index.js';
|
|
10
|
+
import ReceiptParser from '../helpers/ReceiptParser.js';
|
|
11
|
+
const NORMALIZER = BigInt(1e12);
|
|
12
|
+
const ONE_DAY_IN_MS = 86400n * 1000n;
|
|
13
|
+
const slippageE2For = (settings, token) => {
|
|
14
|
+
const slippage = settings?.[token.toLowerCase()];
|
|
15
|
+
return slippage == null ? undefined : Number(slippage / 10n);
|
|
16
|
+
};
|
|
17
|
+
export default async function quoteHarvest(params, ctx) {
|
|
18
|
+
const parsed = quoteHarvestSchema.parse(params);
|
|
19
|
+
const addresses = getGuruProtocolAddresses(ctx.chainId);
|
|
20
|
+
const isStablecoin = compareAddresses(parsed.coin, addresses.tokens.USDC) ||
|
|
21
|
+
compareAddresses(parsed.coin, addresses.tokens.USDT);
|
|
22
|
+
if (!isStablecoin) {
|
|
23
|
+
throw new Error(`[@guru-fund/sdk] quoteHarvest: coin ${parsed.coin} is not a supported stablecoin on chainId ${ctx.chainId}`);
|
|
24
|
+
}
|
|
25
|
+
const provider = ctx.provider;
|
|
26
|
+
const ledger = FundLedger__factory.connect(parsed.ledger, provider);
|
|
27
|
+
const fetcher = new FundDataFetcher({
|
|
28
|
+
chainId: ctx.chainId,
|
|
29
|
+
provider,
|
|
30
|
+
getPriceUsd1e18: ctx.getPriceUsd1e18,
|
|
31
|
+
});
|
|
32
|
+
const [fundData, vault, manager, controllerAddress, profitFeeBps, totalPrincipal, totalVirtualBuffer, latestManagementFeeTimestamp,] = await Promise.all([
|
|
33
|
+
fetcher.fetchFundData(ledger),
|
|
34
|
+
ledger.vault(),
|
|
35
|
+
ledger.manager(),
|
|
36
|
+
ledger.controller(),
|
|
37
|
+
ledger.profitFeeBps(),
|
|
38
|
+
ledger.totalPrincipal(),
|
|
39
|
+
ledger.totalVirtualBuffer(),
|
|
40
|
+
ledger.latestManagementFeeTimestamp(),
|
|
41
|
+
]);
|
|
42
|
+
const tvl = fundData.totalValueLocked * NORMALIZER;
|
|
43
|
+
const guruWeight1e18 = ((fundData.assets.find((asset) => compareAddresses(asset.token.address, GURU_TOKEN_MAINNET))?.weight ?? 0n) *
|
|
44
|
+
UNIT) /
|
|
45
|
+
WEIGHT_DENOMINATOR;
|
|
46
|
+
const isManagementFeeEligible = parsed.isManagementFeeEligible ??
|
|
47
|
+
guruWeight1e18 >= MANAGEMENT_FEE_ELIGIBLE_GOVERNANCE_TOKEN_RATIO;
|
|
48
|
+
const latestManagementFeeMs = Number(latestManagementFeeTimestamp) * 1000;
|
|
49
|
+
const nextManagementFeeTimestampMs = BigInt(latestManagementFeeMs) +
|
|
50
|
+
ONE_DAY_IN_MS * MANAGEMENT_FEE_COOLDOWN_DAYS;
|
|
51
|
+
const ledgerBalance = await ledger.balanceOf(ledger.target);
|
|
52
|
+
const managementFee = BigInt(Date.now()) >= nextManagementFeeTimestampMs
|
|
53
|
+
? (fundData.tokenPrice * ledgerBalance) / UNIT
|
|
54
|
+
: 0n;
|
|
55
|
+
const feeApplicableAmount = tvl - (totalPrincipal + totalVirtualBuffer);
|
|
56
|
+
const harvestProjection = managementFee + (profitFeeBps * feeApplicableAmount) / MAX_BPS;
|
|
57
|
+
const harvestableFraction = tvl > 0n && harvestProjection > 0n
|
|
58
|
+
? (harvestProjection * UNIT) / tvl
|
|
59
|
+
: 0n;
|
|
60
|
+
const isNoOp = harvestProjection <= 0n && managementFee <= 0n;
|
|
61
|
+
const extCalls = isNoOp
|
|
62
|
+
? []
|
|
63
|
+
: await Promise.all(fundData.assets.map(async (asset) => {
|
|
64
|
+
if (compareAddresses(asset.token.address, parsed.coin)) {
|
|
65
|
+
return { adapter: ZeroAddress, callData: '0x' };
|
|
66
|
+
}
|
|
67
|
+
const route = await getRouteOut({
|
|
68
|
+
chainId: ctx.chainId,
|
|
69
|
+
tokenIn: asset.token.address,
|
|
70
|
+
tokenOut: parsed.coin,
|
|
71
|
+
amountIn: (harvestableFraction * asset.balance) / UNIT,
|
|
72
|
+
slippageE2: slippageE2For(parsed.slippageSettings, asset.token.address),
|
|
73
|
+
account: vault,
|
|
74
|
+
vault,
|
|
75
|
+
}, ctx);
|
|
76
|
+
return { adapter: route.adapter, callData: route.callData };
|
|
77
|
+
}));
|
|
78
|
+
const txData = buildHarvestTx({
|
|
79
|
+
controller: controllerAddress,
|
|
80
|
+
ledger: parsed.ledger,
|
|
81
|
+
coin: parsed.coin,
|
|
82
|
+
fraction: isNoOp ? 0n : harvestableFraction,
|
|
83
|
+
isManagementFeeEligible,
|
|
84
|
+
extCalls,
|
|
85
|
+
from: manager,
|
|
86
|
+
});
|
|
87
|
+
const decodeLogs = (logs) => {
|
|
88
|
+
try {
|
|
89
|
+
const parser = ReceiptParser.fromSimulationLogs(logs);
|
|
90
|
+
const controller = HarvestController__factory.connect(controllerAddress, provider);
|
|
91
|
+
const harvested = parser.getDecodedLog(controller.interface, controller.getEvent('Harvested'));
|
|
92
|
+
return { harvestableAmount: harvested.managerFee / NORMALIZER };
|
|
93
|
+
}
|
|
94
|
+
catch {
|
|
95
|
+
return null;
|
|
96
|
+
}
|
|
97
|
+
};
|
|
98
|
+
return {
|
|
99
|
+
extCalls,
|
|
100
|
+
harvestableFraction: isNoOp ? 0n : harvestableFraction,
|
|
101
|
+
managementFee: isNoOp ? 0n : managementFee,
|
|
102
|
+
txData,
|
|
103
|
+
decodeLogs,
|
|
104
|
+
};
|
|
105
|
+
}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import type { AddressLike, BytesLike, TransactionRequest } from 'ethers';
|
|
2
|
+
import { type GuruProtocolChainId } from '../addresses';
|
|
3
|
+
import { type GetPriceUsd1e18 } from '../helpers/FundDataFetcher';
|
|
4
|
+
import { type RouterContext } from '../router';
|
|
5
|
+
export type ExternalCallStruct = {
|
|
6
|
+
adapter: AddressLike;
|
|
7
|
+
callData: BytesLike;
|
|
8
|
+
};
|
|
9
|
+
export interface QuoteRebalanceTargetWeight {
|
|
10
|
+
token: string;
|
|
11
|
+
weight: number | bigint;
|
|
12
|
+
}
|
|
13
|
+
export interface QuoteRebalanceParams {
|
|
14
|
+
ledger: string;
|
|
15
|
+
targetWeights: QuoteRebalanceTargetWeight[];
|
|
16
|
+
slippageSettings?: Record<string, string | number | bigint>;
|
|
17
|
+
}
|
|
18
|
+
export interface QuoteRebalanceContext extends RouterContext {
|
|
19
|
+
chainId: GuruProtocolChainId;
|
|
20
|
+
getPriceUsd1e18: GetPriceUsd1e18;
|
|
21
|
+
}
|
|
22
|
+
export interface QuoteRebalanceTrade {
|
|
23
|
+
tokenIn: string;
|
|
24
|
+
tokenOut: string;
|
|
25
|
+
amountIn: bigint;
|
|
26
|
+
expectedAmountOut: bigint;
|
|
27
|
+
}
|
|
28
|
+
export interface QuoteRebalanceLogTrade {
|
|
29
|
+
tokenIn: string;
|
|
30
|
+
tokenOut: string;
|
|
31
|
+
amountIn: bigint;
|
|
32
|
+
amountOut: bigint;
|
|
33
|
+
}
|
|
34
|
+
export interface QuoteRebalanceLogs {
|
|
35
|
+
trades: QuoteRebalanceLogTrade[];
|
|
36
|
+
}
|
|
37
|
+
export type SimulationLog = {
|
|
38
|
+
address: string;
|
|
39
|
+
data: string;
|
|
40
|
+
topics: string[];
|
|
41
|
+
};
|
|
42
|
+
export type QuoteRebalanceEmptyReason = 'balanced' | 'dust' | null;
|
|
43
|
+
export interface QuoteRebalanceResult {
|
|
44
|
+
extCalls: ExternalCallStruct[];
|
|
45
|
+
trades: QuoteRebalanceTrade[];
|
|
46
|
+
cumulativeSlippageBps: bigint;
|
|
47
|
+
txData: TransactionRequest;
|
|
48
|
+
decodeLogs: (logs: SimulationLog[]) => QuoteRebalanceLogs | null;
|
|
49
|
+
emptyReason: QuoteRebalanceEmptyReason;
|
|
50
|
+
}
|
|
51
|
+
export default function quoteRebalance(params: QuoteRebalanceParams, ctx: QuoteRebalanceContext): Promise<QuoteRebalanceResult>;
|