@gauntlet-xyz/sdk 2.5.0 → 3.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +121 -7
- package/dist/api/activity.d.ts +4 -2
- package/dist/api/activity.d.ts.map +1 -1
- package/dist/api/activityRows.d.ts +11 -0
- package/dist/api/activityRows.d.ts.map +1 -0
- package/dist/api/caip.d.ts +1 -1
- package/dist/api/caip.d.ts.map +1 -1
- package/dist/api/client.d.ts +43 -5
- package/dist/api/client.d.ts.map +1 -1
- package/dist/api/decimal.d.ts.map +1 -1
- package/dist/api/errors.d.ts +1 -1
- package/dist/api/errors.d.ts.map +1 -1
- package/dist/api/generated.d.ts +570 -7
- package/dist/api/generated.d.ts.map +1 -1
- package/dist/api/http.d.ts.map +1 -1
- package/dist/api/index.d.ts +13 -13
- package/dist/api/index.d.ts.map +1 -1
- package/dist/api/index.js +47 -8
- package/dist/api/index.js.map +7 -1
- package/dist/api/positionHistory.d.ts +1 -1
- package/dist/api/positionHistory.d.ts.map +1 -1
- package/dist/attribution/index.d.ts +8 -5
- package/dist/attribution/index.d.ts.map +1 -1
- package/dist/chunk-JJOLVL5V.js +546 -0
- package/dist/chunk-JJOLVL5V.js.map +7 -0
- package/dist/chunk-JRSNLXFY.js +2009 -0
- package/dist/chunk-JRSNLXFY.js.map +7 -0
- package/dist/chunk-MEKISE2T.js +367 -0
- package/dist/chunk-MEKISE2T.js.map +7 -0
- package/dist/chunk-YQXTLIJA.js +4477 -0
- package/dist/chunk-YQXTLIJA.js.map +7 -0
- package/dist/cjs/api/activity.d.ts +72 -0
- package/dist/cjs/api/activity.d.ts.map +1 -0
- package/dist/cjs/api/activity.js +138 -0
- package/dist/cjs/api/activity.js.map +7 -0
- package/dist/cjs/api/activityRows.d.ts +11 -0
- package/dist/cjs/api/activityRows.d.ts.map +1 -0
- package/dist/cjs/api/activityRows.js +139 -0
- package/dist/cjs/api/activityRows.js.map +7 -0
- package/dist/cjs/api/caip.d.ts +29 -0
- package/dist/cjs/api/caip.d.ts.map +1 -0
- package/dist/cjs/api/caip.js +61 -0
- package/dist/cjs/api/caip.js.map +7 -0
- package/dist/cjs/api/client.d.ts +173 -0
- package/dist/cjs/api/client.d.ts.map +1 -0
- package/dist/cjs/api/client.js +199 -0
- package/dist/cjs/api/client.js.map +7 -0
- package/dist/cjs/api/decimal.d.ts +21 -0
- package/dist/cjs/api/decimal.d.ts.map +1 -0
- package/dist/cjs/api/decimal.js +61 -0
- package/dist/cjs/api/decimal.js.map +7 -0
- package/dist/cjs/api/errors.d.ts +32 -0
- package/dist/cjs/api/errors.d.ts.map +1 -0
- package/dist/cjs/api/errors.js +80 -0
- package/dist/cjs/api/errors.js.map +7 -0
- package/dist/cjs/api/generated.d.ts +2068 -0
- package/dist/cjs/api/generated.d.ts.map +1 -0
- package/dist/cjs/api/generated.js +17 -0
- package/dist/cjs/api/generated.js.map +7 -0
- package/dist/cjs/api/http.d.ts +16 -0
- package/dist/cjs/api/http.d.ts.map +1 -0
- package/dist/cjs/api/http.js +65 -0
- package/dist/cjs/api/http.js.map +7 -0
- package/dist/cjs/api/index.d.ts +14 -0
- package/dist/cjs/api/index.d.ts.map +1 -0
- package/dist/cjs/api/index.js +73 -0
- package/dist/cjs/api/index.js.map +7 -0
- package/dist/cjs/api/positionHistory.d.ts +44 -0
- package/dist/cjs/api/positionHistory.d.ts.map +1 -0
- package/dist/cjs/api/positionHistory.js +144 -0
- package/dist/cjs/api/positionHistory.js.map +7 -0
- package/dist/cjs/attribution/erc8021.d.ts +9 -0
- package/dist/cjs/attribution/erc8021.d.ts.map +1 -0
- package/dist/cjs/attribution/erc8021.js +37 -0
- package/dist/cjs/attribution/erc8021.js.map +7 -0
- package/dist/cjs/attribution/index.d.ts +28 -0
- package/dist/cjs/attribution/index.d.ts.map +1 -0
- package/dist/cjs/attribution/index.js +70 -0
- package/dist/cjs/attribution/index.js.map +7 -0
- package/dist/cjs/client.d.ts +72 -0
- package/dist/cjs/client.d.ts.map +1 -0
- package/dist/cjs/client.js +80 -0
- package/dist/cjs/client.js.map +7 -0
- package/dist/cjs/constants.d.ts +16 -0
- package/dist/cjs/constants.d.ts.map +1 -0
- package/dist/cjs/constants.js +83 -0
- package/dist/cjs/constants.js.map +7 -0
- package/dist/cjs/errors.d.ts +85 -0
- package/dist/cjs/errors.d.ts.map +1 -0
- package/dist/cjs/errors.js +210 -0
- package/dist/cjs/errors.js.map +7 -0
- package/dist/cjs/evm/abis/erc20.d.ts +41 -0
- package/dist/cjs/evm/abis/erc20.d.ts.map +1 -0
- package/dist/cjs/evm/abis/erc20.js +57 -0
- package/dist/cjs/evm/abis/erc20.js.map +7 -0
- package/dist/cjs/evm/abis/erc4626.d.ts +105 -0
- package/dist/cjs/evm/abis/erc4626.d.ts.map +1 -0
- package/dist/cjs/evm/abis/erc4626.js +97 -0
- package/dist/cjs/evm/abis/erc4626.js.map +7 -0
- package/dist/cjs/evm/abis/multiDepositorVault.d.ts +1048 -0
- package/dist/cjs/evm/abis/multiDepositorVault.d.ts.map +1 -0
- package/dist/cjs/evm/abis/multiDepositorVault.js +614 -0
- package/dist/cjs/evm/abis/multiDepositorVault.js.map +7 -0
- package/dist/cjs/evm/abis/priceAndFeeCalculator.d.ts +910 -0
- package/dist/cjs/evm/abis/priceAndFeeCalculator.d.ts.map +1 -0
- package/dist/cjs/evm/abis/priceAndFeeCalculator.js +517 -0
- package/dist/cjs/evm/abis/priceAndFeeCalculator.js.map +7 -0
- package/dist/cjs/evm/abis/priceAndFeeCalculatorV2.d.ts +277 -0
- package/dist/cjs/evm/abis/priceAndFeeCalculatorV2.d.ts.map +1 -0
- package/dist/cjs/evm/abis/priceAndFeeCalculatorV2.js +166 -0
- package/dist/cjs/evm/abis/priceAndFeeCalculatorV2.js.map +7 -0
- package/dist/cjs/evm/abis/provisioner.d.ts +4984 -0
- package/dist/cjs/evm/abis/provisioner.d.ts.map +1 -0
- package/dist/cjs/evm/abis/provisioner.js +2785 -0
- package/dist/cjs/evm/abis/provisioner.js.map +7 -0
- package/dist/cjs/evm/abis/provisionerV2.d.ts +740 -0
- package/dist/cjs/evm/abis/provisionerV2.d.ts.map +1 -0
- package/dist/cjs/evm/abis/provisionerV2.js +320 -0
- package/dist/cjs/evm/abis/provisionerV2.js.map +7 -0
- package/dist/cjs/evm/adapters/aera.d.ts +6 -0
- package/dist/cjs/evm/adapters/aera.d.ts.map +1 -0
- package/dist/cjs/evm/adapters/aera.js +500 -0
- package/dist/cjs/evm/adapters/aera.js.map +7 -0
- package/dist/cjs/evm/adapters/index.d.ts +3 -0
- package/dist/cjs/evm/adapters/index.d.ts.map +1 -0
- package/dist/cjs/evm/adapters/index.js +41 -0
- package/dist/cjs/evm/adapters/index.js.map +7 -0
- package/dist/cjs/evm/adapters/morpho.d.ts +3 -0
- package/dist/cjs/evm/adapters/morpho.d.ts.map +1 -0
- package/dist/cjs/evm/adapters/morpho.js +103 -0
- package/dist/cjs/evm/adapters/morpho.js.map +7 -0
- package/dist/cjs/evm/adapters/types.d.ts +85 -0
- package/dist/cjs/evm/adapters/types.d.ts.map +1 -0
- package/dist/cjs/evm/adapters/types.js +17 -0
- package/dist/cjs/evm/adapters/types.js.map +7 -0
- package/dist/cjs/evm/aeraContracts/priceAndFeeCalculator.d.ts +46 -0
- package/dist/cjs/evm/aeraContracts/priceAndFeeCalculator.d.ts.map +1 -0
- package/dist/cjs/evm/aeraContracts/priceAndFeeCalculator.js +223 -0
- package/dist/cjs/evm/aeraContracts/priceAndFeeCalculator.js.map +7 -0
- package/dist/cjs/evm/aeraContracts/readOptions.d.ts +8 -0
- package/dist/cjs/evm/aeraContracts/readOptions.d.ts.map +1 -0
- package/dist/cjs/evm/aeraContracts/readOptions.js +31 -0
- package/dist/cjs/evm/aeraContracts/readOptions.js.map +7 -0
- package/dist/cjs/evm/aeraContracts/v1.d.ts +2317 -0
- package/dist/cjs/evm/aeraContracts/v1.d.ts.map +1 -0
- package/dist/cjs/evm/aeraContracts/v1.js +120 -0
- package/dist/cjs/evm/aeraContracts/v1.js.map +7 -0
- package/dist/cjs/evm/aeraContracts/v2.d.ts +4538 -0
- package/dist/cjs/evm/aeraContracts/v2.d.ts.map +1 -0
- package/dist/cjs/evm/aeraContracts/v2.js +449 -0
- package/dist/cjs/evm/aeraContracts/v2.js.map +7 -0
- package/dist/cjs/evm/aeraContracts.d.ts +33 -0
- package/dist/cjs/evm/aeraContracts.d.ts.map +1 -0
- package/dist/cjs/evm/aeraContracts.js +234 -0
- package/dist/cjs/evm/aeraContracts.js.map +7 -0
- package/dist/cjs/evm/deposit.d.ts +51 -0
- package/dist/cjs/evm/deposit.d.ts.map +1 -0
- package/dist/cjs/evm/deposit.js +142 -0
- package/dist/cjs/evm/deposit.js.map +7 -0
- package/dist/cjs/evm/depositQuote.d.ts +32 -0
- package/dist/cjs/evm/depositQuote.d.ts.map +1 -0
- package/dist/cjs/evm/depositQuote.js +97 -0
- package/dist/cjs/evm/depositQuote.js.map +7 -0
- package/dist/cjs/evm/depositReceiverApproval.d.ts +17 -0
- package/dist/cjs/evm/depositReceiverApproval.d.ts.map +1 -0
- package/dist/cjs/evm/depositReceiverApproval.js +71 -0
- package/dist/cjs/evm/depositReceiverApproval.js.map +7 -0
- package/dist/cjs/evm/index.d.ts +28 -0
- package/dist/cjs/evm/index.d.ts.map +1 -0
- package/dist/cjs/evm/index.js +116 -0
- package/dist/cjs/evm/index.js.map +7 -0
- package/dist/cjs/evm/operationMode.d.ts +9 -0
- package/dist/cjs/evm/operationMode.d.ts.map +1 -0
- package/dist/cjs/evm/operationMode.js +65 -0
- package/dist/cjs/evm/operationMode.js.map +7 -0
- package/dist/cjs/evm/tokenModes.d.ts +22 -0
- package/dist/cjs/evm/tokenModes.d.ts.map +1 -0
- package/dist/cjs/evm/tokenModes.js +47 -0
- package/dist/cjs/evm/tokenModes.js.map +7 -0
- package/dist/cjs/evm/types.d.ts +34 -0
- package/dist/cjs/evm/types.d.ts.map +1 -0
- package/dist/cjs/evm/types.js +32 -0
- package/dist/cjs/evm/types.js.map +7 -0
- package/dist/cjs/evm/userCurrentBalance.d.ts +69 -0
- package/dist/cjs/evm/userCurrentBalance.d.ts.map +1 -0
- package/dist/cjs/evm/userCurrentBalance.js +268 -0
- package/dist/cjs/evm/userCurrentBalance.js.map +7 -0
- package/dist/cjs/evm/vaults.d.ts +44 -0
- package/dist/cjs/evm/vaults.d.ts.map +1 -0
- package/dist/cjs/evm/vaults.js +78 -0
- package/dist/cjs/evm/vaults.js.map +7 -0
- package/dist/cjs/evm/withdraw.d.ts +75 -0
- package/dist/cjs/evm/withdraw.d.ts.map +1 -0
- package/dist/cjs/evm/withdraw.js +174 -0
- package/dist/cjs/evm/withdraw.js.map +7 -0
- package/dist/cjs/evm/withdrawQuote.d.ts +135 -0
- package/dist/cjs/evm/withdrawQuote.d.ts.map +1 -0
- package/dist/cjs/evm/withdrawQuote.js +257 -0
- package/dist/cjs/evm/withdrawQuote.js.map +7 -0
- package/dist/cjs/index.d.ts +31 -0
- package/dist/cjs/index.d.ts.map +1 -0
- package/dist/cjs/index.js +128 -0
- package/dist/cjs/index.js.map +7 -0
- package/dist/cjs/package.json +1 -0
- package/dist/cjs/privy/index.d.ts +52 -0
- package/dist/cjs/privy/index.d.ts.map +1 -0
- package/dist/cjs/privy/index.js +57 -0
- package/dist/cjs/privy/index.js.map +7 -0
- package/dist/client.d.ts +4 -2
- package/dist/client.d.ts.map +1 -1
- package/dist/constants.d.ts.map +1 -1
- package/dist/errors.d.ts +4 -1
- package/dist/errors.d.ts.map +1 -1
- package/dist/evm/adapters/aera.d.ts +1 -1
- package/dist/evm/adapters/aera.d.ts.map +1 -1
- package/dist/evm/adapters/index.d.ts +1 -1
- package/dist/evm/adapters/index.d.ts.map +1 -1
- package/dist/evm/adapters/morpho.d.ts +1 -1
- package/dist/evm/adapters/morpho.d.ts.map +1 -1
- package/dist/evm/adapters/types.d.ts +6 -3
- package/dist/evm/adapters/types.d.ts.map +1 -1
- package/dist/evm/aeraContracts/priceAndFeeCalculator.d.ts +1 -1
- package/dist/evm/aeraContracts/priceAndFeeCalculator.d.ts.map +1 -1
- package/dist/evm/aeraContracts/v1.d.ts +2 -2
- package/dist/evm/aeraContracts/v1.d.ts.map +1 -1
- package/dist/evm/aeraContracts/v2.d.ts +25 -4
- package/dist/evm/aeraContracts/v2.d.ts.map +1 -1
- package/dist/evm/aeraContracts.d.ts +2 -2
- package/dist/evm/aeraContracts.d.ts.map +1 -1
- package/dist/evm/deposit.d.ts +7 -4
- package/dist/evm/deposit.d.ts.map +1 -1
- package/dist/evm/depositQuote.d.ts +32 -0
- package/dist/evm/depositQuote.d.ts.map +1 -0
- package/dist/evm/depositReceiverApproval.d.ts +2 -2
- package/dist/evm/depositReceiverApproval.d.ts.map +1 -1
- package/dist/evm/index.d.ts +27 -25
- package/dist/evm/index.d.ts.map +1 -1
- package/dist/evm/index.js +86 -12
- package/dist/evm/index.js.map +7 -1
- package/dist/evm/tokenModes.d.ts +2 -2
- package/dist/evm/tokenModes.d.ts.map +1 -1
- package/dist/evm/userCurrentBalance.d.ts +21 -3
- package/dist/evm/userCurrentBalance.d.ts.map +1 -1
- package/dist/evm/vaults.d.ts +2 -9
- package/dist/evm/vaults.d.ts.map +1 -1
- package/dist/evm/withdraw.d.ts +5 -3
- package/dist/evm/withdraw.d.ts.map +1 -1
- package/dist/evm/withdrawQuote.d.ts +14 -6
- package/dist/evm/withdrawQuote.d.ts.map +1 -1
- package/dist/index.d.ts +30 -28
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +137 -14
- package/dist/index.js.map +7 -1
- package/dist/manifest/vaults.json +1958 -0
- package/dist/privy/index.d.ts +1 -1
- package/dist/privy/index.d.ts.map +1 -1
- package/dist/privy/index.js +39 -48
- package/dist/privy/index.js.map +7 -1
- package/manifest/vaults.json +22 -395
- package/package.json +43 -9
- package/src/api/activity.ts +18 -15
- package/src/api/activityRows.ts +143 -0
- package/src/api/caip.ts +3 -1
- package/src/api/client.ts +105 -6
- package/src/api/decimal.ts +1 -0
- package/src/api/generated.ts +570 -7
- package/src/api/http.ts +1 -0
- package/src/api/index.ts +8 -0
- package/src/api/positionHistory.ts +20 -5
- package/src/attribution/index.ts +6 -2
- package/src/client.ts +4 -1
- package/src/constants.ts +2 -0
- package/src/errors.ts +7 -0
- package/src/evm/adapters/aera.ts +40 -19
- package/src/evm/adapters/types.ts +3 -0
- package/src/evm/aeraContracts/v2.ts +124 -16
- package/src/evm/aeraContracts.ts +29 -14
- package/src/evm/deposit.ts +61 -18
- package/src/evm/depositQuote.ts +138 -0
- package/src/evm/depositReceiverApproval.ts +14 -9
- package/src/evm/index.ts +10 -1
- package/src/evm/userCurrentBalance.ts +155 -60
- package/src/evm/vaults.ts +0 -7
- package/src/evm/withdraw.ts +20 -1
- package/src/evm/withdrawQuote.ts +126 -51
- package/src/index.ts +11 -2
- package/dist/api/activity.js +0 -154
- package/dist/api/activity.js.map +0 -1
- package/dist/api/caip.js +0 -38
- package/dist/api/caip.js.map +0 -1
- package/dist/api/client.js +0 -119
- package/dist/api/client.js.map +0 -1
- package/dist/api/decimal.js +0 -44
- package/dist/api/decimal.js.map +0 -1
- package/dist/api/errors.js +0 -41
- package/dist/api/errors.js.map +0 -1
- package/dist/api/generated.js +0 -6
- package/dist/api/generated.js.map +0 -1
- package/dist/api/http.js +0 -39
- package/dist/api/http.js.map +0 -1
- package/dist/api/positionHistory.js +0 -126
- package/dist/api/positionHistory.js.map +0 -1
- package/dist/attribution/erc8021.js +0 -17
- package/dist/attribution/erc8021.js.map +0 -1
- package/dist/attribution/index.js +0 -45
- package/dist/attribution/index.js.map +0 -1
- package/dist/client.js +0 -72
- package/dist/client.js.map +0 -1
- package/dist/constants.js +0 -28
- package/dist/constants.js.map +0 -1
- package/dist/errors.js +0 -134
- package/dist/errors.js.map +0 -1
- package/dist/evm/abis/erc20.js +0 -30
- package/dist/evm/abis/erc20.js.map +0 -1
- package/dist/evm/abis/erc4626.js +0 -70
- package/dist/evm/abis/erc4626.js.map +0 -1
- package/dist/evm/abis/multiDepositorVault.js +0 -587
- package/dist/evm/abis/multiDepositorVault.js.map +0 -1
- package/dist/evm/abis/priceAndFeeCalculator.js +0 -490
- package/dist/evm/abis/priceAndFeeCalculator.js.map +0 -1
- package/dist/evm/abis/priceAndFeeCalculatorV2.js +0 -141
- package/dist/evm/abis/priceAndFeeCalculatorV2.js.map +0 -1
- package/dist/evm/abis/provisioner.js +0 -2768
- package/dist/evm/abis/provisioner.js.map +0 -1
- package/dist/evm/abis/provisionerV2.js +0 -295
- package/dist/evm/abis/provisionerV2.js.map +0 -1
- package/dist/evm/adapters/aera.js +0 -280
- package/dist/evm/adapters/aera.js.map +0 -1
- package/dist/evm/adapters/index.js +0 -14
- package/dist/evm/adapters/index.js.map +0 -1
- package/dist/evm/adapters/morpho.js +0 -79
- package/dist/evm/adapters/morpho.js.map +0 -1
- package/dist/evm/adapters/types.js +0 -2
- package/dist/evm/adapters/types.js.map +0 -1
- package/dist/evm/aeraContracts/priceAndFeeCalculator.js +0 -174
- package/dist/evm/aeraContracts/priceAndFeeCalculator.js.map +0 -1
- package/dist/evm/aeraContracts/readOptions.js +0 -4
- package/dist/evm/aeraContracts/readOptions.js.map +0 -1
- package/dist/evm/aeraContracts/v1.js +0 -59
- package/dist/evm/aeraContracts/v1.js.map +0 -1
- package/dist/evm/aeraContracts/v2.js +0 -273
- package/dist/evm/aeraContracts/v2.js.map +0 -1
- package/dist/evm/aeraContracts.js +0 -195
- package/dist/evm/aeraContracts.js.map +0 -1
- package/dist/evm/deposit.js +0 -109
- package/dist/evm/deposit.js.map +0 -1
- package/dist/evm/depositReceiverApproval.js +0 -32
- package/dist/evm/depositReceiverApproval.js.map +0 -1
- package/dist/evm/operationMode.js +0 -41
- package/dist/evm/operationMode.js.map +0 -1
- package/dist/evm/tokenModes.js +0 -34
- package/dist/evm/tokenModes.js.map +0 -1
- package/dist/evm/types.js +0 -5
- package/dist/evm/types.js.map +0 -1
- package/dist/evm/userCurrentBalance.js +0 -211
- package/dist/evm/userCurrentBalance.js.map +0 -1
- package/dist/evm/vaults.js +0 -75
- package/dist/evm/vaults.js.map +0 -1
- package/dist/evm/withdraw.js +0 -177
- package/dist/evm/withdraw.js.map +0 -1
- package/dist/evm/withdrawQuote.js +0 -164
- package/dist/evm/withdrawQuote.js.map +0 -1
package/src/evm/deposit.ts
CHANGED
|
@@ -8,6 +8,7 @@ import {
|
|
|
8
8
|
VaultNotFoundError,
|
|
9
9
|
UnsupportedAssetError,
|
|
10
10
|
InvalidSlippageBPSError,
|
|
11
|
+
InvalidSyncDepositBoundError,
|
|
11
12
|
} from '../errors';
|
|
12
13
|
import {
|
|
13
14
|
resolveAeraRuntimeContracts,
|
|
@@ -40,13 +41,16 @@ export interface EvmDepositParams {
|
|
|
40
41
|
solverTip?: bigint;
|
|
41
42
|
/** Maximum price age passed to async Aera provisioner requests. Defaults to 10 days. */
|
|
42
43
|
maxPriceAge?: bigint;
|
|
44
|
+
/** Caller-reviewed minimum output for an explicit Aera synchronous deposit. */
|
|
45
|
+
minUnitsOut?: bigint;
|
|
43
46
|
}
|
|
44
47
|
|
|
45
48
|
/**
|
|
46
49
|
* Builds the ordered list of EVM transactions required to deposit into a Gauntlet vault.
|
|
47
50
|
*
|
|
48
|
-
* Returns
|
|
49
|
-
*
|
|
51
|
+
* Returns ordered transactions: ERC-20 approvals (if the allowance is insufficient),
|
|
52
|
+
* followed by the deposit or async deposit request. Some tokens require an approval
|
|
53
|
+
* of zero before a new nonzero approval. Each transaction is
|
|
50
54
|
* returned as a `PreparedTx` object ready to be signed and sent.
|
|
51
55
|
*
|
|
52
56
|
* @param client - A configured `GauntletClient` instance with an EVM public client and wallet.
|
|
@@ -74,13 +78,16 @@ export async function getDepositTx(
|
|
|
74
78
|
client: GauntletClient,
|
|
75
79
|
params: EvmDepositParams
|
|
76
80
|
): Promise<PreparedTx[]> {
|
|
81
|
+
params = structuredClone(params);
|
|
82
|
+
const slippageBps = params.slippageBps ?? DEFAULT_BPS;
|
|
83
|
+
if (!Number.isInteger(slippageBps) || slippageBps < 0 || slippageBps > Number(MAX_BPS)) {
|
|
84
|
+
throw new InvalidSlippageBPSError(slippageBps);
|
|
85
|
+
}
|
|
77
86
|
if (
|
|
78
|
-
params.
|
|
79
|
-
(
|
|
80
|
-
params.slippageBps < 0 ||
|
|
81
|
-
params.slippageBps > Number(MAX_BPS))
|
|
87
|
+
params.minUnitsOut !== undefined &&
|
|
88
|
+
(typeof params.minUnitsOut !== 'bigint' || params.minUnitsOut <= 0n)
|
|
82
89
|
) {
|
|
83
|
-
throw new
|
|
90
|
+
throw new InvalidSyncDepositBoundError();
|
|
84
91
|
}
|
|
85
92
|
|
|
86
93
|
const resolved = await resolveVault(client, params.vaultId, params.chainId);
|
|
@@ -105,6 +112,12 @@ export async function getDepositTx(
|
|
|
105
112
|
}
|
|
106
113
|
|
|
107
114
|
const requestedDepositMode = parseOperationMode(params.vaultId, params.depositMode);
|
|
115
|
+
if (
|
|
116
|
+
params.minUnitsOut !== undefined &&
|
|
117
|
+
(protocol !== 'aera' || requestedDepositMode !== 'sync')
|
|
118
|
+
) {
|
|
119
|
+
throw new InvalidSyncDepositBoundError();
|
|
120
|
+
}
|
|
108
121
|
let modifiedDepositMode: OperationMode;
|
|
109
122
|
let aeraRuntime: AeraRuntimeContracts | undefined;
|
|
110
123
|
|
|
@@ -130,7 +143,7 @@ export async function getDepositTx(
|
|
|
130
143
|
: vault.vaultAddress;
|
|
131
144
|
|
|
132
145
|
// NOTE: this could be moved to the buildDeposit level
|
|
133
|
-
const { sufficient } = await adapter.checkAllowance({
|
|
146
|
+
const { sufficient, current } = await adapter.checkAllowance({
|
|
134
147
|
publicClient,
|
|
135
148
|
token: token.address,
|
|
136
149
|
owner: account,
|
|
@@ -141,14 +154,43 @@ export async function getDepositTx(
|
|
|
141
154
|
const steps: EvmTxStep[] = [];
|
|
142
155
|
|
|
143
156
|
if (!sufficient) {
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
157
|
+
const approval = adapter.buildApproval({
|
|
158
|
+
token: token.address,
|
|
159
|
+
spender,
|
|
160
|
+
amount: params.amount,
|
|
161
|
+
account,
|
|
162
|
+
});
|
|
163
|
+
if (current > 0n && params.amount > 0n) {
|
|
164
|
+
try {
|
|
165
|
+
await publicClient.estimateContractGas({
|
|
166
|
+
address: approval.address,
|
|
167
|
+
abi: approval.abi,
|
|
168
|
+
functionName: 'approve',
|
|
169
|
+
args: approval.args,
|
|
170
|
+
account,
|
|
171
|
+
});
|
|
172
|
+
} catch (approvalError) {
|
|
173
|
+
const reset = adapter.buildApproval({
|
|
174
|
+
token: token.address,
|
|
175
|
+
spender,
|
|
176
|
+
amount: 0n,
|
|
177
|
+
account,
|
|
178
|
+
});
|
|
179
|
+
try {
|
|
180
|
+
await publicClient.estimateContractGas({
|
|
181
|
+
address: reset.address,
|
|
182
|
+
abi: reset.abi,
|
|
183
|
+
functionName: 'approve',
|
|
184
|
+
args: reset.args,
|
|
185
|
+
account,
|
|
186
|
+
});
|
|
187
|
+
} catch {
|
|
188
|
+
throw approvalError;
|
|
189
|
+
}
|
|
190
|
+
steps.push(reset);
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
steps.push(approval);
|
|
152
194
|
}
|
|
153
195
|
|
|
154
196
|
const depositSteps = await adapter.buildDeposit({
|
|
@@ -159,12 +201,13 @@ export async function getDepositTx(
|
|
|
159
201
|
async: modifiedDepositMode === 'async',
|
|
160
202
|
asset: token,
|
|
161
203
|
publicClient,
|
|
162
|
-
slippageBps
|
|
204
|
+
slippageBps,
|
|
163
205
|
solverTip: params.solverTip,
|
|
164
206
|
maxPriceAge: params.maxPriceAge,
|
|
165
207
|
aeraRuntime,
|
|
208
|
+
minUnitsOut: params.minUnitsOut,
|
|
166
209
|
});
|
|
167
210
|
steps.push(...depositSteps);
|
|
168
211
|
|
|
169
|
-
return
|
|
212
|
+
return Promise.all(steps.map((step) => encodeTransactionWithAttribution(client, step, chainId)));
|
|
170
213
|
}
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
import type { GauntletClient } from '../client';
|
|
2
|
+
import { DEFAULT_BPS, MAX_BPS } from '../constants';
|
|
3
|
+
import {
|
|
4
|
+
InvalidSlippageBPSError,
|
|
5
|
+
InvalidSyncDepositBoundError,
|
|
6
|
+
UnsupportedAssetError,
|
|
7
|
+
UnsupportedFeatureError,
|
|
8
|
+
VaultNotFoundError,
|
|
9
|
+
} from '../errors';
|
|
10
|
+
import {
|
|
11
|
+
applySlippageDown,
|
|
12
|
+
resolveAeraRuntimeContracts,
|
|
13
|
+
resolveAeraTokenModeSupport,
|
|
14
|
+
} from './aeraContracts';
|
|
15
|
+
import { getSyncDepositFeeBps, getSyncDepositQuoteValues } from './aeraContracts/v2';
|
|
16
|
+
import { resolveOperationMode } from './operationMode';
|
|
17
|
+
import { ContractVersion } from './types';
|
|
18
|
+
import { resolveVault } from './vaults';
|
|
19
|
+
|
|
20
|
+
export type SyncDepositQuote = Readonly<{
|
|
21
|
+
unitsOut: bigint;
|
|
22
|
+
minUnitsOut: bigint;
|
|
23
|
+
/** Deposit amount converted to the vault's numeraire, after the Instant Supply fee. */
|
|
24
|
+
numeraireOut: bigint;
|
|
25
|
+
/** Instant Supply fee applied to the deposited token amount, in basis points. */
|
|
26
|
+
feeBps: bigint;
|
|
27
|
+
/** Slippage tolerance used to derive `minUnitsOut`, in basis points. */
|
|
28
|
+
slippageBps: number;
|
|
29
|
+
}>;
|
|
30
|
+
|
|
31
|
+
export type SyncDepositQuoteParams = {
|
|
32
|
+
vaultId: string;
|
|
33
|
+
chainId?: number;
|
|
34
|
+
assetSymbol?: string;
|
|
35
|
+
amount: bigint;
|
|
36
|
+
slippageBps?: number;
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
export type SyncDepositRateParams = {
|
|
40
|
+
vaultId: string;
|
|
41
|
+
chainId?: number;
|
|
42
|
+
assetSymbol?: string;
|
|
43
|
+
};
|
|
44
|
+
|
|
45
|
+
export type SyncDepositRate = Readonly<{
|
|
46
|
+
/** Instant Supply fee, in basis points. Independent of the deposit amount. */
|
|
47
|
+
feeBps: bigint;
|
|
48
|
+
}>;
|
|
49
|
+
|
|
50
|
+
async function resolveSyncDepositContext(
|
|
51
|
+
client: GauntletClient,
|
|
52
|
+
params: SyncDepositRateParams,
|
|
53
|
+
readKind: 'quote' | 'rate'
|
|
54
|
+
) {
|
|
55
|
+
const resolved = await resolveVault(client, params.vaultId, params.chainId);
|
|
56
|
+
if (!resolved) throw new VaultNotFoundError(params.vaultId, params.chainId);
|
|
57
|
+
if (resolved.protocol !== 'aera') {
|
|
58
|
+
throw new UnsupportedFeatureError(
|
|
59
|
+
readKind === 'quote'
|
|
60
|
+
? 'Sync deposit quote is only available for Aera vaults'
|
|
61
|
+
: 'Sync deposit rate is only available for Aera vaults'
|
|
62
|
+
);
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
const { vault } = resolved;
|
|
66
|
+
const token =
|
|
67
|
+
vault.supplyToken.length > 1
|
|
68
|
+
? vault.supplyToken.find(({ symbol }) => symbol === params.assetSymbol)
|
|
69
|
+
: vault.supplyToken[0];
|
|
70
|
+
if (!token) throw new UnsupportedAssetError(params.assetSymbol ?? 'unknown', params.vaultId);
|
|
71
|
+
|
|
72
|
+
const publicClient = client.getPublicClient(params.chainId ?? vault.chainId);
|
|
73
|
+
const runtime = await resolveAeraRuntimeContracts(publicClient, vault);
|
|
74
|
+
if (runtime.provisioner.version !== ContractVersion.V2) {
|
|
75
|
+
throw new UnsupportedFeatureError(
|
|
76
|
+
readKind === 'quote'
|
|
77
|
+
? 'Sync deposit quote requires an Aera V2 provisioner'
|
|
78
|
+
: 'Sync deposit rate requires an Aera V2 provisioner'
|
|
79
|
+
);
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
const tokenModeSupport = await resolveAeraTokenModeSupport(publicClient, runtime, token.address, {
|
|
83
|
+
includeSyncModes: true,
|
|
84
|
+
});
|
|
85
|
+
resolveOperationMode(params.vaultId, 'sync', {
|
|
86
|
+
async: tokenModeSupport.asyncDeposit,
|
|
87
|
+
sync: tokenModeSupport.syncDeposit,
|
|
88
|
+
});
|
|
89
|
+
|
|
90
|
+
return { publicClient, vault, token, runtime };
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
/** Quotes an Aera synchronous deposit and its execution bounds. */
|
|
94
|
+
export async function getSyncDepositQuote(
|
|
95
|
+
client: GauntletClient,
|
|
96
|
+
params: SyncDepositQuoteParams
|
|
97
|
+
): Promise<SyncDepositQuote> {
|
|
98
|
+
params = structuredClone(params);
|
|
99
|
+
const slippageBps = params.slippageBps ?? DEFAULT_BPS;
|
|
100
|
+
if (!Number.isInteger(slippageBps) || slippageBps < 0 || slippageBps > Number(MAX_BPS)) {
|
|
101
|
+
throw new InvalidSlippageBPSError(slippageBps);
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
const { publicClient, vault, token, runtime } = await resolveSyncDepositContext(
|
|
105
|
+
client,
|
|
106
|
+
params,
|
|
107
|
+
'quote'
|
|
108
|
+
);
|
|
109
|
+
|
|
110
|
+
const { unitsOut, feeBps, numeraireOut } = await getSyncDepositQuoteValues(
|
|
111
|
+
publicClient,
|
|
112
|
+
runtime.provisioner.address,
|
|
113
|
+
runtime.feeCalculator.address,
|
|
114
|
+
runtime.feeCalculator.version,
|
|
115
|
+
vault.vaultAddress,
|
|
116
|
+
token.address,
|
|
117
|
+
params.amount
|
|
118
|
+
);
|
|
119
|
+
const minUnitsOut = applySlippageDown(unitsOut, slippageBps);
|
|
120
|
+
if (minUnitsOut <= 0n) throw new InvalidSyncDepositBoundError();
|
|
121
|
+
|
|
122
|
+
return { unitsOut, minUnitsOut, numeraireOut, feeBps, slippageBps };
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
/** Reads the live Instant Supply fee for a vault token, without requiring a deposit amount. */
|
|
126
|
+
export async function getSyncDepositRate(
|
|
127
|
+
client: GauntletClient,
|
|
128
|
+
params: SyncDepositRateParams
|
|
129
|
+
): Promise<SyncDepositRate> {
|
|
130
|
+
const { publicClient, runtime, token } = await resolveSyncDepositContext(client, params, 'rate');
|
|
131
|
+
|
|
132
|
+
const feeBps = await getSyncDepositFeeBps(
|
|
133
|
+
publicClient,
|
|
134
|
+
runtime.provisioner.address,
|
|
135
|
+
token.address
|
|
136
|
+
);
|
|
137
|
+
return { feeBps };
|
|
138
|
+
}
|
|
@@ -25,6 +25,7 @@ export async function getDepositReceiverApprovalTx(
|
|
|
25
25
|
client: GauntletClient,
|
|
26
26
|
params: EvmDepositReceiverApprovalParams
|
|
27
27
|
): Promise<PreparedTx> {
|
|
28
|
+
params = { ...params };
|
|
28
29
|
const resolved = await resolveVault(client, params.vaultId, params.chainId);
|
|
29
30
|
if (!resolved) throw new VaultNotFoundError(params.vaultId);
|
|
30
31
|
|
|
@@ -39,13 +40,17 @@ export async function getDepositReceiverApprovalTx(
|
|
|
39
40
|
throw new UnsupportedFeatureError('Aera: deposit receiver approval on V1');
|
|
40
41
|
}
|
|
41
42
|
|
|
42
|
-
return encodeTransactionWithAttribution(
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
43
|
+
return encodeTransactionWithAttribution(
|
|
44
|
+
client,
|
|
45
|
+
{
|
|
46
|
+
type: 'setDepositReceiverApproval',
|
|
47
|
+
...provisionerV2.setDepositReceiverApprovalTxRequest(
|
|
48
|
+
runtime.provisioner.address,
|
|
49
|
+
params.depositor,
|
|
50
|
+
params.approved ?? true,
|
|
51
|
+
receiver
|
|
52
|
+
),
|
|
53
|
+
},
|
|
54
|
+
chainId
|
|
55
|
+
);
|
|
51
56
|
}
|
package/src/evm/index.ts
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
export { getDepositTx } from './deposit';
|
|
2
2
|
export { getDepositReceiverApprovalTx } from './depositReceiverApproval';
|
|
3
|
+
export { getSyncDepositQuote, getSyncDepositRate } from './depositQuote';
|
|
3
4
|
export { getWithdrawTx } from './withdraw';
|
|
4
|
-
export { getSyncWithdrawQuote } from './withdrawQuote';
|
|
5
|
+
export { getSyncWithdrawQuote, getSyncWithdrawRate } from './withdrawQuote';
|
|
5
6
|
export { getAeraTokenModeSupport } from './tokenModes';
|
|
6
7
|
export { getUserCurrentBalance } from './userCurrentBalance';
|
|
7
8
|
export { getVaults, VaultId } from './vaults';
|
|
@@ -14,6 +15,7 @@ export {
|
|
|
14
15
|
ChainMismatchError,
|
|
15
16
|
InvalidSlippageBPSError,
|
|
16
17
|
InvalidSolverTipError,
|
|
18
|
+
InvalidSyncDepositBoundError,
|
|
17
19
|
InvalidSyncWithdrawBoundError,
|
|
18
20
|
InvalidWithdrawParamsError,
|
|
19
21
|
RpcNotConfiguredError,
|
|
@@ -38,6 +40,12 @@ export {
|
|
|
38
40
|
|
|
39
41
|
export type { EvmDepositParams } from './deposit';
|
|
40
42
|
export type { EvmDepositReceiverApprovalParams } from './depositReceiverApproval';
|
|
43
|
+
export type {
|
|
44
|
+
SyncDepositQuote,
|
|
45
|
+
SyncDepositQuoteParams,
|
|
46
|
+
SyncDepositRate,
|
|
47
|
+
SyncDepositRateParams,
|
|
48
|
+
} from './depositQuote';
|
|
41
49
|
export type { EvmWithdrawParams } from './withdraw';
|
|
42
50
|
export type {
|
|
43
51
|
SyncWithdrawQuote,
|
|
@@ -46,6 +54,7 @@ export type {
|
|
|
46
54
|
SyncWithdrawQuoteContext,
|
|
47
55
|
SyncWithdrawQuoteRequest,
|
|
48
56
|
SyncWithdrawQuoteBounds,
|
|
57
|
+
SyncWithdrawRateParams,
|
|
49
58
|
} from './withdrawQuote';
|
|
50
59
|
export type { AeraTokenModeSupportParams } from './tokenModes';
|
|
51
60
|
export type { SyncRedeemRate } from './aeraContracts/v2';
|
|
@@ -1,12 +1,28 @@
|
|
|
1
1
|
import { parseAbi, type Address } from 'viem';
|
|
2
2
|
import type { GauntletClient } from '../client';
|
|
3
3
|
import type { EvmVaultDeployment } from './types';
|
|
4
|
-
import {
|
|
4
|
+
import {
|
|
5
|
+
ChainMismatchError,
|
|
6
|
+
GauntletSDKError,
|
|
7
|
+
UnsupportedAssetError,
|
|
8
|
+
UnsupportedProtocolError,
|
|
9
|
+
VaultNotFoundError,
|
|
10
|
+
} from '../errors';
|
|
5
11
|
import { getMultiDepositorVault, resolveAeraRuntimeContracts } from './aeraContracts';
|
|
6
12
|
import { convertUnitsToToken } from './aeraContracts/priceAndFeeCalculator';
|
|
13
|
+
import { getUserUnitsRefundableUntil } from './aeraContracts/v2';
|
|
7
14
|
import { provisionerV2Abi } from './abis/provisionerV2';
|
|
8
15
|
import { ContractVersion } from './types';
|
|
9
|
-
import {
|
|
16
|
+
import {
|
|
17
|
+
BLOCKS_3_DAYS,
|
|
18
|
+
CHAIN_NAMES,
|
|
19
|
+
DAY,
|
|
20
|
+
DEFAULT_BLOCKS_3_DAYS,
|
|
21
|
+
LOG_PAGE_SIZE,
|
|
22
|
+
} from '../constants';
|
|
23
|
+
|
|
24
|
+
// Log chunks fetched at once per event type.
|
|
25
|
+
const LOG_CHUNK_CONCURRENCY = 16;
|
|
10
26
|
|
|
11
27
|
// Inline as-const ABI items give viem full type inference for args and return types.
|
|
12
28
|
const DEPOSIT_REQUESTED_V1_ABI = [
|
|
@@ -54,11 +70,24 @@ export interface UserCurrentBalanceParams {
|
|
|
54
70
|
vaultId: string;
|
|
55
71
|
address: Address;
|
|
56
72
|
chainId?: number;
|
|
73
|
+
/** Required for deployments that support multiple assets, ignored otherwise. */
|
|
74
|
+
assetSymbol?: string;
|
|
75
|
+
/**
|
|
76
|
+
* Scan from this block, including expired requests that still hold escrow.
|
|
77
|
+
* Requires `chainId` for a vault with more than one deployment.
|
|
78
|
+
*/
|
|
79
|
+
fromBlock?: bigint;
|
|
57
80
|
}
|
|
58
81
|
|
|
59
82
|
export interface UserCurrentBalance {
|
|
83
|
+
/** Block used for balances, conversions, and request state. */
|
|
84
|
+
blockNumber: bigint;
|
|
85
|
+
/** First block included in the request scan. Older escrow is outside this result. */
|
|
86
|
+
fromBlock: bigint;
|
|
60
87
|
/** Chain identifier, e.g. "base" */
|
|
61
88
|
chain: string;
|
|
89
|
+
/** EVM chain id of the deployment, e.g. 8453 */
|
|
90
|
+
chainId: number;
|
|
62
91
|
token: Address;
|
|
63
92
|
decimals: number;
|
|
64
93
|
/** Assets queued via async deposit, not yet earning */
|
|
@@ -67,6 +96,8 @@ export interface UserCurrentBalance {
|
|
|
67
96
|
balance: bigint;
|
|
68
97
|
/** Assets queued via async withdraw, not yet claimable */
|
|
69
98
|
pendingWithdraw: bigint;
|
|
99
|
+
/** Timestamp until which this account cannot redeem vault units. */
|
|
100
|
+
unitsLockedUntil?: bigint;
|
|
70
101
|
}
|
|
71
102
|
|
|
72
103
|
// V2 legacy wrapper calls can emit both receiver-aware and legacy events for one request.
|
|
@@ -86,21 +117,78 @@ function dedupeByRequestHash<TLog extends { args: { [key: string]: unknown } }>(
|
|
|
86
117
|
});
|
|
87
118
|
}
|
|
88
119
|
|
|
120
|
+
/** Step back by the expected block count, and widen until the block predates the cutoff. */
|
|
121
|
+
async function requestScanStart(
|
|
122
|
+
publicClient: ReturnType<GauntletClient['getPublicClient']>,
|
|
123
|
+
chainId: number,
|
|
124
|
+
blockNumber: bigint,
|
|
125
|
+
days: number,
|
|
126
|
+
cutoff: bigint
|
|
127
|
+
): Promise<bigint> {
|
|
128
|
+
let span = ((BLOCKS_3_DAYS[chainId] ?? DEFAULT_BLOCKS_3_DAYS) * BigInt(days)) / 3n;
|
|
129
|
+
for (;;) {
|
|
130
|
+
if (span >= blockNumber) return 0n;
|
|
131
|
+
const start = blockNumber - span;
|
|
132
|
+
const block = await publicClient.getBlock({ blockNumber: start });
|
|
133
|
+
if (block.timestamp <= cutoff) return start;
|
|
134
|
+
span *= 2n;
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
async function mapInBatches<T, P extends Promise<unknown>>(
|
|
139
|
+
items: T[],
|
|
140
|
+
size: number,
|
|
141
|
+
fn: (item: T) => P
|
|
142
|
+
): Promise<Awaited<P>[]> {
|
|
143
|
+
const results: Awaited<P>[] = [];
|
|
144
|
+
for (let i = 0; i < items.length; i += size) {
|
|
145
|
+
results.push(...(await Promise.all(items.slice(i, i + size).map(fn))));
|
|
146
|
+
}
|
|
147
|
+
return results;
|
|
148
|
+
}
|
|
149
|
+
|
|
89
150
|
async function queryDeploymentBalance(
|
|
90
151
|
client: GauntletClient,
|
|
91
152
|
deployment: EvmVaultDeployment,
|
|
92
|
-
|
|
153
|
+
params: UserCurrentBalanceParams
|
|
93
154
|
): Promise<UserCurrentBalance> {
|
|
94
155
|
const publicClient = client.getPublicClient(deployment.chainId);
|
|
95
|
-
const
|
|
156
|
+
const { address } = params;
|
|
157
|
+
const token =
|
|
158
|
+
deployment.supplyToken.length > 1
|
|
159
|
+
? deployment.supplyToken.find((candidate) => candidate.symbol === params.assetSymbol)
|
|
160
|
+
: deployment.supplyToken[0];
|
|
161
|
+
if (token === undefined)
|
|
162
|
+
throw new UnsupportedAssetError(params.assetSymbol ?? 'unknown', params.vaultId);
|
|
163
|
+
const snapshot = await publicClient.getBlock({ blockTag: 'latest' });
|
|
164
|
+
if (snapshot.number === null) {
|
|
165
|
+
throw new GauntletSDKError('The balance snapshot has no block number');
|
|
166
|
+
}
|
|
167
|
+
const blockNumber = snapshot.number;
|
|
168
|
+
const readOptions = { blockNumber };
|
|
169
|
+
const expirationDays = deployment.expirationDays ?? 3;
|
|
170
|
+
if (!Number.isSafeInteger(expirationDays) || expirationDays <= 0) {
|
|
171
|
+
throw new GauntletSDKError('The request expiration must be a positive integer number of days');
|
|
172
|
+
}
|
|
173
|
+
const scanDays = Math.max(3, expirationDays);
|
|
174
|
+
const cutoff = snapshot.timestamp - BigInt(DAY) * BigInt(scanDays);
|
|
175
|
+
const fromBlock =
|
|
176
|
+
params.fromBlock ??
|
|
177
|
+
(await requestScanStart(publicClient, deployment.chainId, blockNumber, scanDays, cutoff));
|
|
178
|
+
if (fromBlock < 0n || fromBlock > blockNumber) {
|
|
179
|
+
throw new GauntletSDKError('The request scan range is invalid');
|
|
180
|
+
}
|
|
96
181
|
|
|
97
182
|
const vaultContract = getMultiDepositorVault(publicClient, deployment.vaultAddress);
|
|
98
183
|
const [runtime, units] = await Promise.all([
|
|
99
|
-
resolveAeraRuntimeContracts(publicClient, deployment),
|
|
100
|
-
vaultContract.read.balanceOf([address]),
|
|
184
|
+
resolveAeraRuntimeContracts(publicClient, deployment, readOptions),
|
|
185
|
+
vaultContract.read.balanceOf([address], readOptions),
|
|
101
186
|
]);
|
|
102
187
|
const provisionerAddress = runtime.provisioner.address;
|
|
103
188
|
const isV2 = runtime.provisioner.version === ContractVersion.V2;
|
|
189
|
+
const unitsLockedUntilPromise = isV2
|
|
190
|
+
? getUserUnitsRefundableUntil(publicClient, provisionerAddress, address, readOptions)
|
|
191
|
+
: Promise.resolve(undefined);
|
|
104
192
|
|
|
105
193
|
const balance = await convertUnitsToToken(
|
|
106
194
|
publicClient,
|
|
@@ -108,63 +196,56 @@ async function queryDeploymentBalance(
|
|
|
108
196
|
runtime.feeCalculator.version,
|
|
109
197
|
deployment.vaultAddress,
|
|
110
198
|
token.address,
|
|
111
|
-
units
|
|
199
|
+
units,
|
|
200
|
+
readOptions
|
|
112
201
|
);
|
|
113
202
|
|
|
114
|
-
//
|
|
115
|
-
const currentBlock = await publicClient.getBlockNumber();
|
|
116
|
-
const lookback = BLOCKS_3_DAYS[deployment.chainId] ?? DEFAULT_BLOCKS_3_DAYS;
|
|
117
|
-
const fromBlock = currentBlock > lookback ? currentBlock - lookback : 0n;
|
|
118
|
-
|
|
119
|
-
// Compute block-range chunks to stay within the 10,000-block RPC limit, then fetch in parallel
|
|
203
|
+
// Compute block-range chunks to stay within the 10,000-block RPC limit, then fetch in bounded batches
|
|
120
204
|
const chunks: [bigint, bigint][] = [];
|
|
121
|
-
for (let cursor = fromBlock; cursor <=
|
|
122
|
-
const end = cursor + LOG_PAGE_SIZE <=
|
|
205
|
+
for (let cursor = fromBlock; cursor <= blockNumber; cursor += LOG_PAGE_SIZE + 1n) {
|
|
206
|
+
const end = cursor + LOG_PAGE_SIZE <= blockNumber ? cursor + LOG_PAGE_SIZE : blockNumber;
|
|
123
207
|
chunks.push([cursor, end]);
|
|
124
208
|
}
|
|
125
209
|
|
|
210
|
+
// Each map keeps LOG_CHUNK_CONCURRENCY queries in flight.
|
|
126
211
|
const [depositPages, redeemPages] = await Promise.all([
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
})
|
|
146
|
-
)
|
|
212
|
+
mapInBatches(chunks, LOG_CHUNK_CONCURRENCY, ([from, to]) =>
|
|
213
|
+
isV2
|
|
214
|
+
? publicClient.getContractEvents({
|
|
215
|
+
address: provisionerAddress,
|
|
216
|
+
abi: provisionerV2Abi,
|
|
217
|
+
eventName: 'DepositRequested',
|
|
218
|
+
args: { receiver: address, token: token.address },
|
|
219
|
+
fromBlock: from,
|
|
220
|
+
toBlock: to,
|
|
221
|
+
})
|
|
222
|
+
: publicClient.getContractEvents({
|
|
223
|
+
address: provisionerAddress,
|
|
224
|
+
abi: DEPOSIT_REQUESTED_V1_ABI,
|
|
225
|
+
eventName: 'DepositRequested',
|
|
226
|
+
args: { user: address, token: token.address },
|
|
227
|
+
fromBlock: from,
|
|
228
|
+
toBlock: to,
|
|
229
|
+
})
|
|
147
230
|
),
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
})
|
|
167
|
-
)
|
|
231
|
+
mapInBatches(chunks, LOG_CHUNK_CONCURRENCY, ([from, to]) =>
|
|
232
|
+
isV2
|
|
233
|
+
? publicClient.getContractEvents({
|
|
234
|
+
address: provisionerAddress,
|
|
235
|
+
abi: provisionerV2Abi,
|
|
236
|
+
eventName: 'RedeemRequested',
|
|
237
|
+
args: { user: address, token: token.address },
|
|
238
|
+
fromBlock: from,
|
|
239
|
+
toBlock: to,
|
|
240
|
+
})
|
|
241
|
+
: publicClient.getContractEvents({
|
|
242
|
+
address: provisionerAddress,
|
|
243
|
+
abi: REDEEM_REQUESTED_V1_ABI,
|
|
244
|
+
eventName: 'RedeemRequested',
|
|
245
|
+
args: { user: address, token: token.address },
|
|
246
|
+
fromBlock: from,
|
|
247
|
+
toBlock: to,
|
|
248
|
+
})
|
|
168
249
|
),
|
|
169
250
|
]);
|
|
170
251
|
|
|
@@ -188,6 +269,7 @@ async function queryDeploymentBalance(
|
|
|
188
269
|
})),
|
|
189
270
|
],
|
|
190
271
|
allowFailure: false,
|
|
272
|
+
blockNumber,
|
|
191
273
|
});
|
|
192
274
|
|
|
193
275
|
const depositChecks = pendingChecks.slice(0, depositLogs.length);
|
|
@@ -215,17 +297,23 @@ async function queryDeploymentBalance(
|
|
|
215
297
|
runtime.feeCalculator.version,
|
|
216
298
|
deployment.vaultAddress,
|
|
217
299
|
token.address,
|
|
218
|
-
pendingWithdrawUnits
|
|
300
|
+
pendingWithdrawUnits,
|
|
301
|
+
readOptions
|
|
219
302
|
)
|
|
220
303
|
: 0n;
|
|
304
|
+
const unitsLockedUntil = await unitsLockedUntilPromise;
|
|
221
305
|
|
|
222
306
|
return {
|
|
307
|
+
blockNumber,
|
|
308
|
+
fromBlock,
|
|
223
309
|
chain: CHAIN_NAMES[deployment.chainId] ?? `chain-${deployment.chainId}`,
|
|
310
|
+
chainId: deployment.chainId,
|
|
224
311
|
token: token.address,
|
|
225
312
|
decimals: token.decimals,
|
|
226
313
|
pendingDeposit,
|
|
227
314
|
balance,
|
|
228
315
|
pendingWithdraw,
|
|
316
|
+
...(unitsLockedUntil !== undefined ? { unitsLockedUntil } : {}),
|
|
229
317
|
};
|
|
230
318
|
}
|
|
231
319
|
|
|
@@ -238,7 +326,9 @@ async function queryDeploymentBalance(
|
|
|
238
326
|
* - `pendingWithdraw` — vault units locked in a pending async redeem request (converted to tokens).
|
|
239
327
|
*
|
|
240
328
|
* Only supported for Aera multi-depositor vaults. Pending amounts are detected by scanning
|
|
241
|
-
* the
|
|
329
|
+
* the configured request lifetime, with a minimum of three days. Set `fromBlock` (with `chainId`
|
|
330
|
+
* on a multi-chain vault) for older escrow.
|
|
331
|
+
* All state reads use one block. The returned range identifies the scanned history.
|
|
242
332
|
*
|
|
243
333
|
* @param client - A configured `GauntletClient` instance with an EVM public client for each
|
|
244
334
|
* chain the vault is deployed on.
|
|
@@ -249,6 +339,7 @@ async function queryDeploymentBalance(
|
|
|
249
339
|
* @throws {VaultNotFoundError} If the vault ID is not found in the manifest.
|
|
250
340
|
* @throws {UnsupportedProtocolError} If the vault is not an Aera multi-depositor vault.
|
|
251
341
|
* @throws {ChainMismatchError} If `chainId` is specified but no deployment exists for that chain.
|
|
342
|
+
* @throws {UnsupportedAssetError} If a multi-asset deployment gets no matching `assetSymbol`.
|
|
252
343
|
*
|
|
253
344
|
* @example
|
|
254
345
|
* ```ts
|
|
@@ -256,13 +347,14 @@ async function queryDeploymentBalance(
|
|
|
256
347
|
* vaultId: 'baseUsdcPrime',
|
|
257
348
|
* address: '0xYourWalletAddress',
|
|
258
349
|
* });
|
|
259
|
-
* // [{ chain: 'base', token: '0x...', decimals: 6, balance: 100_000_000n, pendingDeposit: 0n, pendingWithdraw: 0n }]
|
|
350
|
+
* // [{ chain: 'base', chainId: 8453, token: '0x...', decimals: 6, balance: 100_000_000n, pendingDeposit: 0n, pendingWithdraw: 0n }]
|
|
260
351
|
* ```
|
|
261
352
|
*/
|
|
262
353
|
export async function getUserCurrentBalance(
|
|
263
354
|
client: GauntletClient,
|
|
264
355
|
params: UserCurrentBalanceParams
|
|
265
356
|
): Promise<UserCurrentBalance[]> {
|
|
357
|
+
params = { ...params };
|
|
266
358
|
const manifest = await client.manifest;
|
|
267
359
|
const vaultInfo = manifest.vaults.find((v) => v.vaultId === params.vaultId);
|
|
268
360
|
if (!vaultInfo) throw new VaultNotFoundError(params.vaultId);
|
|
@@ -283,8 +375,11 @@ export async function getUserCurrentBalance(
|
|
|
283
375
|
evmDeployments.map((d) => `${d.chainId}`).join(', ')
|
|
284
376
|
);
|
|
285
377
|
}
|
|
286
|
-
return [await queryDeploymentBalance(client, deployment, params
|
|
378
|
+
return [await queryDeploymentBalance(client, deployment, params)];
|
|
379
|
+
}
|
|
380
|
+
if (params.fromBlock !== undefined && evmDeployments.length > 1) {
|
|
381
|
+
throw new GauntletSDKError('fromBlock requires chainId for a vault with several deployments');
|
|
287
382
|
}
|
|
288
383
|
|
|
289
|
-
return Promise.all(evmDeployments.map((d) => queryDeploymentBalance(client, d, params
|
|
384
|
+
return Promise.all(evmDeployments.map((d) => queryDeploymentBalance(client, d, params)));
|
|
290
385
|
}
|