@gauntlet-xyz/sdk 2.3.0 → 3.0.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 +135 -0
- package/dist/api/activity.d.ts +1 -1
- package/dist/api/activity.d.ts.map +1 -1
- package/dist/api/caip.d.ts +1 -1
- package/dist/api/caip.d.ts.map +1 -1
- package/dist/api/client.d.ts +65 -6
- package/dist/api/client.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 +621 -14
- package/dist/api/generated.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 +48 -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 +3 -3
- package/dist/attribution/index.d.ts.map +1 -1
- package/dist/chunk-7TA2OJUK.js +4364 -0
- package/dist/chunk-7TA2OJUK.js.map +7 -0
- package/dist/chunk-HC2BS7MK.js +439 -0
- package/dist/chunk-HC2BS7MK.js.map +7 -0
- package/dist/chunk-S2TTA45N.js +2009 -0
- package/dist/chunk-S2TTA45N.js.map +7 -0
- package/dist/chunk-STIV2CC4.js +57 -0
- package/dist/chunk-STIV2CC4.js.map +7 -0
- package/dist/chunk-SU6JAKIA.js +283 -0
- package/dist/chunk-SU6JAKIA.js.map +7 -0
- package/dist/cjs/api/activity.d.ts +70 -0
- package/dist/cjs/api/activity.d.ts.map +1 -0
- package/dist/cjs/api/activity.js +136 -0
- package/dist/cjs/api/activity.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 +59 -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 +171 -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 +60 -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 +64 -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 +131 -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 +25 -0
- package/dist/cjs/attribution/index.d.ts.map +1 -0
- package/dist/cjs/attribution/index.js +68 -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 +491 -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 +84 -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 +224 -0
- package/dist/cjs/evm/aeraContracts.js.map +7 -0
- package/dist/cjs/evm/deposit.d.ts +50 -0
- package/dist/cjs/evm/deposit.d.ts.map +1 -0
- package/dist/cjs/evm/deposit.js +112 -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 +96 -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 +66 -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 +55 -0
- package/dist/cjs/evm/userCurrentBalance.d.ts.map +1 -0
- package/dist/cjs/evm/userCurrentBalance.js +225 -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 +73 -0
- package/dist/cjs/evm/withdraw.d.ts.map +1 -0
- package/dist/cjs/evm/withdraw.js +161 -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 +256 -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 +15 -1
- package/dist/errors.d.ts.map +1 -1
- package/dist/evm/abis/priceAndFeeCalculatorV2.d.ts +44 -0
- package/dist/evm/abis/priceAndFeeCalculatorV2.d.ts.map +1 -1
- package/dist/evm/abis/provisionerV2.d.ts +56 -0
- package/dist/evm/abis/provisionerV2.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 -2
- package/dist/evm/adapters/types.d.ts.map +1 -1
- package/dist/evm/aeraContracts/priceAndFeeCalculator.d.ts +11 -6
- package/dist/evm/aeraContracts/priceAndFeeCalculator.d.ts.map +1 -1
- package/dist/evm/aeraContracts/readOptions.d.ts +8 -0
- package/dist/evm/aeraContracts/readOptions.d.ts.map +1 -0
- 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 +396 -4
- package/dist/evm/aeraContracts/v2.d.ts.map +1 -1
- package/dist/evm/aeraContracts.d.ts +11 -5
- package/dist/evm/aeraContracts.d.ts.map +1 -1
- package/dist/evm/deposit.d.ts +4 -2
- 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 -17
- package/dist/evm/index.d.ts.map +1 -1
- package/dist/evm/index.js +88 -9
- package/dist/evm/index.js.map +7 -1
- package/dist/evm/tokenModes.d.ts +22 -0
- package/dist/evm/tokenModes.d.ts.map +1 -0
- package/dist/evm/userCurrentBalance.d.ts +6 -2
- 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 +10 -2
- package/dist/evm/withdraw.d.ts.map +1 -1
- package/dist/evm/withdrawQuote.d.ts +135 -0
- package/dist/evm/withdrawQuote.d.ts.map +1 -0
- package/dist/index.d.ts +30 -22
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +139 -12
- 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 +45 -460
- package/package.json +43 -9
- package/src/api/client.ts +104 -7
- package/src/api/generated.ts +621 -14
- package/src/api/index.ts +13 -0
- package/src/client.ts +4 -1
- package/src/constants.ts +2 -0
- package/src/errors.ts +39 -2
- package/src/evm/abis/priceAndFeeCalculatorV2.ts +22 -0
- package/src/evm/abis/provisionerV2.ts +33 -0
- package/src/evm/adapters/aera.ts +64 -34
- package/src/evm/adapters/types.ts +4 -0
- package/src/evm/aeraContracts/priceAndFeeCalculator.ts +72 -5
- package/src/evm/aeraContracts/readOptions.ts +3 -0
- package/src/evm/aeraContracts/v2.ts +273 -41
- package/src/evm/aeraContracts.ts +81 -8
- package/src/evm/deposit.ts +21 -8
- package/src/evm/depositQuote.ts +137 -0
- package/src/evm/index.ts +41 -0
- package/src/evm/tokenModes.ts +54 -0
- package/src/evm/userCurrentBalance.ts +12 -1
- package/src/evm/vaults.ts +0 -7
- package/src/evm/withdraw.ts +131 -7
- package/src/evm/withdrawQuote.ts +434 -0
- package/src/index.ts +26 -1
- 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 -109
- 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 -115
- 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 -119
- 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 -262
- package/dist/evm/abis/provisionerV2.js.map +0 -1
- package/dist/evm/adapters/aera.js +0 -249
- 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 -140
- package/dist/evm/aeraContracts/priceAndFeeCalculator.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 -217
- package/dist/evm/aeraContracts/v2.js.map +0 -1
- package/dist/evm/aeraContracts.js +0 -134
- 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/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 -97
- package/dist/evm/withdraw.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,6 +41,8 @@ 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
|
/**
|
|
@@ -74,13 +77,15 @@ export async function getDepositTx(
|
|
|
74
77
|
client: GauntletClient,
|
|
75
78
|
params: EvmDepositParams
|
|
76
79
|
): Promise<PreparedTx[]> {
|
|
80
|
+
const slippageBps = params.slippageBps ?? DEFAULT_BPS;
|
|
81
|
+
if (!Number.isInteger(slippageBps) || slippageBps < 0 || slippageBps > Number(MAX_BPS)) {
|
|
82
|
+
throw new InvalidSlippageBPSError(slippageBps);
|
|
83
|
+
}
|
|
77
84
|
if (
|
|
78
|
-
params.
|
|
79
|
-
(
|
|
80
|
-
params.slippageBps < 0 ||
|
|
81
|
-
params.slippageBps > Number(MAX_BPS))
|
|
85
|
+
params.minUnitsOut !== undefined &&
|
|
86
|
+
(typeof params.minUnitsOut !== 'bigint' || params.minUnitsOut <= 0n)
|
|
82
87
|
) {
|
|
83
|
-
throw new
|
|
88
|
+
throw new InvalidSyncDepositBoundError();
|
|
84
89
|
}
|
|
85
90
|
|
|
86
91
|
const resolved = await resolveVault(client, params.vaultId, params.chainId);
|
|
@@ -105,6 +110,12 @@ export async function getDepositTx(
|
|
|
105
110
|
}
|
|
106
111
|
|
|
107
112
|
const requestedDepositMode = parseOperationMode(params.vaultId, params.depositMode);
|
|
113
|
+
if (
|
|
114
|
+
params.minUnitsOut !== undefined &&
|
|
115
|
+
(protocol !== 'aera' || requestedDepositMode !== 'sync')
|
|
116
|
+
) {
|
|
117
|
+
throw new InvalidSyncDepositBoundError();
|
|
118
|
+
}
|
|
108
119
|
let modifiedDepositMode: OperationMode;
|
|
109
120
|
let aeraRuntime: AeraRuntimeContracts | undefined;
|
|
110
121
|
|
|
@@ -113,7 +124,8 @@ export async function getDepositTx(
|
|
|
113
124
|
const tokenModeSupport = await resolveAeraTokenModeSupport(
|
|
114
125
|
publicClient,
|
|
115
126
|
aeraRuntime,
|
|
116
|
-
token.address
|
|
127
|
+
token.address,
|
|
128
|
+
{ includeSyncModes: requestedDepositMode !== 'async' }
|
|
117
129
|
);
|
|
118
130
|
modifiedDepositMode = resolveOperationMode(params.vaultId, requestedDepositMode, {
|
|
119
131
|
async: tokenModeSupport.asyncDeposit,
|
|
@@ -158,12 +170,13 @@ export async function getDepositTx(
|
|
|
158
170
|
async: modifiedDepositMode === 'async',
|
|
159
171
|
asset: token,
|
|
160
172
|
publicClient,
|
|
161
|
-
slippageBps
|
|
173
|
+
slippageBps,
|
|
162
174
|
solverTip: params.solverTip,
|
|
163
175
|
maxPriceAge: params.maxPriceAge,
|
|
164
176
|
aeraRuntime,
|
|
177
|
+
minUnitsOut: params.minUnitsOut,
|
|
165
178
|
});
|
|
166
179
|
steps.push(...depositSteps);
|
|
167
180
|
|
|
168
|
-
return
|
|
181
|
+
return Promise.all(steps.map((step) => encodeTransactionWithAttribution(client, step)));
|
|
169
182
|
}
|
|
@@ -0,0 +1,137 @@
|
|
|
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
|
+
const slippageBps = params.slippageBps ?? DEFAULT_BPS;
|
|
99
|
+
if (!Number.isInteger(slippageBps) || slippageBps < 0 || slippageBps > Number(MAX_BPS)) {
|
|
100
|
+
throw new InvalidSlippageBPSError(slippageBps);
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
const { publicClient, vault, token, runtime } = await resolveSyncDepositContext(
|
|
104
|
+
client,
|
|
105
|
+
params,
|
|
106
|
+
'quote'
|
|
107
|
+
);
|
|
108
|
+
|
|
109
|
+
const { unitsOut, feeBps, numeraireOut } = await getSyncDepositQuoteValues(
|
|
110
|
+
publicClient,
|
|
111
|
+
runtime.provisioner.address,
|
|
112
|
+
runtime.feeCalculator.address,
|
|
113
|
+
runtime.feeCalculator.version,
|
|
114
|
+
vault.vaultAddress,
|
|
115
|
+
token.address,
|
|
116
|
+
params.amount
|
|
117
|
+
);
|
|
118
|
+
const minUnitsOut = applySlippageDown(unitsOut, slippageBps);
|
|
119
|
+
if (minUnitsOut <= 0n) throw new InvalidSyncDepositBoundError();
|
|
120
|
+
|
|
121
|
+
return { unitsOut, minUnitsOut, numeraireOut, feeBps, slippageBps };
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
/** Reads the live Instant Supply fee for a vault token, without requiring a deposit amount. */
|
|
125
|
+
export async function getSyncDepositRate(
|
|
126
|
+
client: GauntletClient,
|
|
127
|
+
params: SyncDepositRateParams
|
|
128
|
+
): Promise<SyncDepositRate> {
|
|
129
|
+
const { publicClient, runtime, token } = await resolveSyncDepositContext(client, params, 'rate');
|
|
130
|
+
|
|
131
|
+
const feeBps = await getSyncDepositFeeBps(
|
|
132
|
+
publicClient,
|
|
133
|
+
runtime.provisioner.address,
|
|
134
|
+
token.address
|
|
135
|
+
);
|
|
136
|
+
return { feeBps };
|
|
137
|
+
}
|
package/src/evm/index.ts
CHANGED
|
@@ -1,10 +1,32 @@
|
|
|
1
1
|
export { getDepositTx } from './deposit';
|
|
2
2
|
export { getDepositReceiverApprovalTx } from './depositReceiverApproval';
|
|
3
|
+
export { getSyncDepositQuote, getSyncDepositRate } from './depositQuote';
|
|
3
4
|
export { getWithdrawTx } from './withdraw';
|
|
5
|
+
export { getSyncWithdrawQuote, getSyncWithdrawRate } from './withdrawQuote';
|
|
6
|
+
export { getAeraTokenModeSupport } from './tokenModes';
|
|
4
7
|
export { getUserCurrentBalance } from './userCurrentBalance';
|
|
5
8
|
export { getVaults, VaultId } from './vaults';
|
|
6
9
|
export { ContractVersion } from './types';
|
|
7
10
|
export { resolveAeraRuntimeContracts, resolveContractVersion } from './aeraContracts';
|
|
11
|
+
export {
|
|
12
|
+
GauntletSDKError,
|
|
13
|
+
AccountRequiredError,
|
|
14
|
+
AccountMismatchError,
|
|
15
|
+
ChainMismatchError,
|
|
16
|
+
InvalidSlippageBPSError,
|
|
17
|
+
InvalidSolverTipError,
|
|
18
|
+
InvalidSyncDepositBoundError,
|
|
19
|
+
InvalidSyncWithdrawBoundError,
|
|
20
|
+
InvalidWithdrawParamsError,
|
|
21
|
+
RpcNotConfiguredError,
|
|
22
|
+
StalePriceError,
|
|
23
|
+
UnsupportedAssetError,
|
|
24
|
+
UnsupportedDepositModeError,
|
|
25
|
+
UnsupportedFeatureError,
|
|
26
|
+
UnsupportedProtocolError,
|
|
27
|
+
UnimplementedFeatureError,
|
|
28
|
+
VaultNotFoundError,
|
|
29
|
+
} from '../errors';
|
|
8
30
|
export {
|
|
9
31
|
Rounding,
|
|
10
32
|
convertTokenToUnits,
|
|
@@ -18,8 +40,26 @@ export {
|
|
|
18
40
|
|
|
19
41
|
export type { EvmDepositParams } from './deposit';
|
|
20
42
|
export type { EvmDepositReceiverApprovalParams } from './depositReceiverApproval';
|
|
43
|
+
export type {
|
|
44
|
+
SyncDepositQuote,
|
|
45
|
+
SyncDepositQuoteParams,
|
|
46
|
+
SyncDepositRate,
|
|
47
|
+
SyncDepositRateParams,
|
|
48
|
+
} from './depositQuote';
|
|
21
49
|
export type { EvmWithdrawParams } from './withdraw';
|
|
50
|
+
export type {
|
|
51
|
+
SyncWithdrawQuote,
|
|
52
|
+
SyncWithdrawQuoteParams,
|
|
53
|
+
SyncWithdrawCapacity,
|
|
54
|
+
SyncWithdrawQuoteContext,
|
|
55
|
+
SyncWithdrawQuoteRequest,
|
|
56
|
+
SyncWithdrawQuoteBounds,
|
|
57
|
+
SyncWithdrawRateParams,
|
|
58
|
+
} from './withdrawQuote';
|
|
59
|
+
export type { AeraTokenModeSupportParams } from './tokenModes';
|
|
60
|
+
export type { SyncRedeemRate } from './aeraContracts/v2';
|
|
22
61
|
export type { EvmTxStep } from './adapters/types';
|
|
62
|
+
export type { PreparedTx } from '../attribution';
|
|
23
63
|
export type {
|
|
24
64
|
VaultInfo,
|
|
25
65
|
VaultDeployment,
|
|
@@ -31,3 +71,4 @@ export type { VaultFilter } from './vaults';
|
|
|
31
71
|
export type { UserCurrentBalanceParams, UserCurrentBalance } from './userCurrentBalance';
|
|
32
72
|
export type { AeraRuntimeContracts, AeraTokenModeSupport } from './aeraContracts';
|
|
33
73
|
export type { NormalizedVaultPriceState } from './aeraContracts/priceAndFeeCalculator';
|
|
74
|
+
export type { SyncWithdrawBound } from '../errors';
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import type { GauntletClient } from '../client';
|
|
2
|
+
import { UnsupportedAssetError, UnsupportedFeatureError, VaultNotFoundError } from '../errors';
|
|
3
|
+
import { resolveVault } from './vaults';
|
|
4
|
+
import {
|
|
5
|
+
resolveAeraRuntimeContracts,
|
|
6
|
+
resolveAeraTokenModeSupport,
|
|
7
|
+
type AeraTokenModeSupport,
|
|
8
|
+
} from './aeraContracts';
|
|
9
|
+
|
|
10
|
+
export interface AeraTokenModeSupportParams {
|
|
11
|
+
vaultId: string;
|
|
12
|
+
/** EVM chain ID. Defaults to the vault's primary chain (Base for current multichain vaults). */
|
|
13
|
+
chainId?: number;
|
|
14
|
+
/** Required for multiasset vaults. */
|
|
15
|
+
assetSymbol?: string;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Reads which deposit/redeem modes (sync vs async) are currently enabled on-chain for a vault token.
|
|
20
|
+
*
|
|
21
|
+
* Use this to decide which entry points to offer a user (e.g. whether an instant withdraw is
|
|
22
|
+
* available) before any amount is entered. Mode availability includes the provisioner's token
|
|
23
|
+
* settings and live runtime gates. A paused V2 solving gate disables both sync modes.
|
|
24
|
+
*
|
|
25
|
+
* @throws {VaultNotFoundError} If the vault ID is not found.
|
|
26
|
+
* @throws {UnsupportedFeatureError} If the vault is not an Aera deployment.
|
|
27
|
+
* @throws {UnsupportedAssetError} If the asset symbol is not accepted by the vault.
|
|
28
|
+
*/
|
|
29
|
+
export async function getAeraTokenModeSupport(
|
|
30
|
+
client: GauntletClient,
|
|
31
|
+
params: AeraTokenModeSupportParams
|
|
32
|
+
): Promise<AeraTokenModeSupport> {
|
|
33
|
+
const resolved = await resolveVault(client, params.vaultId, params.chainId);
|
|
34
|
+
if (!resolved) throw new VaultNotFoundError(params.vaultId);
|
|
35
|
+
|
|
36
|
+
const { vault, protocol } = resolved;
|
|
37
|
+
if (protocol !== 'aera') {
|
|
38
|
+
throw new UnsupportedFeatureError('Token mode support is only available for Aera vaults');
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
const chainId = params.chainId ?? vault.chainId;
|
|
42
|
+
const publicClient = client.getPublicClient(chainId);
|
|
43
|
+
|
|
44
|
+
const token =
|
|
45
|
+
vault.supplyToken.length > 1
|
|
46
|
+
? vault.supplyToken.find((tInfo) => tInfo.symbol === params.assetSymbol)
|
|
47
|
+
: vault.supplyToken[0];
|
|
48
|
+
if (token === undefined) {
|
|
49
|
+
throw new UnsupportedAssetError(params.assetSymbol ?? 'unknown', params.vaultId);
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
const runtime = await resolveAeraRuntimeContracts(publicClient, vault);
|
|
53
|
+
return resolveAeraTokenModeSupport(publicClient, runtime, token.address);
|
|
54
|
+
}
|
|
@@ -4,6 +4,7 @@ import type { EvmVaultDeployment } from './types';
|
|
|
4
4
|
import { ChainMismatchError, UnsupportedProtocolError, VaultNotFoundError } from '../errors';
|
|
5
5
|
import { getMultiDepositorVault, resolveAeraRuntimeContracts } from './aeraContracts';
|
|
6
6
|
import { convertUnitsToToken } from './aeraContracts/priceAndFeeCalculator';
|
|
7
|
+
import { getUserUnitsRefundableUntil } from './aeraContracts/v2';
|
|
7
8
|
import { provisionerV2Abi } from './abis/provisionerV2';
|
|
8
9
|
import { ContractVersion } from './types';
|
|
9
10
|
import { BLOCKS_3_DAYS, CHAIN_NAMES, DEFAULT_BLOCKS_3_DAYS, LOG_PAGE_SIZE } from '../constants';
|
|
@@ -59,6 +60,8 @@ export interface UserCurrentBalanceParams {
|
|
|
59
60
|
export interface UserCurrentBalance {
|
|
60
61
|
/** Chain identifier, e.g. "base" */
|
|
61
62
|
chain: string;
|
|
63
|
+
/** EVM chain id of the deployment, e.g. 8453 */
|
|
64
|
+
chainId: number;
|
|
62
65
|
token: Address;
|
|
63
66
|
decimals: number;
|
|
64
67
|
/** Assets queued via async deposit, not yet earning */
|
|
@@ -67,6 +70,8 @@ export interface UserCurrentBalance {
|
|
|
67
70
|
balance: bigint;
|
|
68
71
|
/** Assets queued via async withdraw, not yet claimable */
|
|
69
72
|
pendingWithdraw: bigint;
|
|
73
|
+
/** Timestamp until which this account cannot redeem vault units. */
|
|
74
|
+
unitsLockedUntil?: bigint;
|
|
70
75
|
}
|
|
71
76
|
|
|
72
77
|
// V2 legacy wrapper calls can emit both receiver-aware and legacy events for one request.
|
|
@@ -101,6 +106,9 @@ async function queryDeploymentBalance(
|
|
|
101
106
|
]);
|
|
102
107
|
const provisionerAddress = runtime.provisioner.address;
|
|
103
108
|
const isV2 = runtime.provisioner.version === ContractVersion.V2;
|
|
109
|
+
const unitsLockedUntilPromise = isV2
|
|
110
|
+
? getUserUnitsRefundableUntil(publicClient, provisionerAddress, address)
|
|
111
|
+
: Promise.resolve(undefined);
|
|
104
112
|
|
|
105
113
|
const balance = await convertUnitsToToken(
|
|
106
114
|
publicClient,
|
|
@@ -218,14 +226,17 @@ async function queryDeploymentBalance(
|
|
|
218
226
|
pendingWithdrawUnits
|
|
219
227
|
)
|
|
220
228
|
: 0n;
|
|
229
|
+
const unitsLockedUntil = await unitsLockedUntilPromise;
|
|
221
230
|
|
|
222
231
|
return {
|
|
223
232
|
chain: CHAIN_NAMES[deployment.chainId] ?? `chain-${deployment.chainId}`,
|
|
233
|
+
chainId: deployment.chainId,
|
|
224
234
|
token: token.address,
|
|
225
235
|
decimals: token.decimals,
|
|
226
236
|
pendingDeposit,
|
|
227
237
|
balance,
|
|
228
238
|
pendingWithdraw,
|
|
239
|
+
...(unitsLockedUntil !== undefined ? { unitsLockedUntil } : {}),
|
|
229
240
|
};
|
|
230
241
|
}
|
|
231
242
|
|
|
@@ -256,7 +267,7 @@ async function queryDeploymentBalance(
|
|
|
256
267
|
* vaultId: 'baseUsdcPrime',
|
|
257
268
|
* address: '0xYourWalletAddress',
|
|
258
269
|
* });
|
|
259
|
-
* // [{ chain: 'base', token: '0x...', decimals: 6, balance: 100_000_000n, pendingDeposit: 0n, pendingWithdraw: 0n }]
|
|
270
|
+
* // [{ chain: 'base', chainId: 8453, token: '0x...', decimals: 6, balance: 100_000_000n, pendingDeposit: 0n, pendingWithdraw: 0n }]
|
|
260
271
|
* ```
|
|
261
272
|
*/
|
|
262
273
|
export async function getUserCurrentBalance(
|
package/src/evm/vaults.ts
CHANGED
|
@@ -8,16 +8,9 @@ export enum VaultId {
|
|
|
8
8
|
EthUsdcPrime = 'ethUsdcPrime',
|
|
9
9
|
AeraUsdAlpha = 'gtusda',
|
|
10
10
|
EthUsdcPrimeV2 = 'ethUsdcPrimeV2',
|
|
11
|
-
AeraUsdAlphaStaging = 'stgusda',
|
|
12
|
-
AeraUsdAlphaDev = 'devusda',
|
|
13
|
-
AeraUsdAlphaDevDeux = 'devusda2',
|
|
14
11
|
AeraLeveredFalconX = 'gpaafalconx',
|
|
15
|
-
AeraLeveredFalconXStaging = 'pytstg',
|
|
16
12
|
AeraSyrupUsdc = 'gpsyrupusdc',
|
|
17
|
-
AeraSyrupUsdcStaging = 'syruppytstg',
|
|
18
13
|
AeraBtcYield = 'gtbtc',
|
|
19
|
-
AeraBtcYieldStaging = 'gtbtcstaging',
|
|
20
|
-
AeraLeveredUsccStaging = 'gtusccstg',
|
|
21
14
|
AeraLeveredUscc = 'gtuscc',
|
|
22
15
|
AeraLend = 'gtlend',
|
|
23
16
|
AeraKastEth = 'kasteth',
|
package/src/evm/withdraw.ts
CHANGED
|
@@ -1,15 +1,19 @@
|
|
|
1
1
|
import type { Address } from 'viem';
|
|
2
2
|
import type { GauntletClient } from '../client';
|
|
3
3
|
import type { AdapterWithdrawParams } from './adapters/types';
|
|
4
|
+
import type { SyncWithdrawQuoteBounds } from './withdrawQuote';
|
|
4
5
|
import { getAdapter } from './adapters';
|
|
5
6
|
import { encodeTransactionWithAttribution, PreparedTx } from '../attribution';
|
|
6
7
|
import {
|
|
8
|
+
AccountMismatchError,
|
|
7
9
|
AccountRequiredError,
|
|
8
10
|
VaultNotFoundError,
|
|
9
11
|
UnsupportedAssetError,
|
|
10
12
|
InvalidSlippageBPSError,
|
|
13
|
+
InvalidWithdrawParamsError,
|
|
11
14
|
} from '../errors';
|
|
12
15
|
import {
|
|
16
|
+
requireAeraSyncRedeemRuntime,
|
|
13
17
|
resolveAeraRuntimeContracts,
|
|
14
18
|
resolveAeraTokenModeSupport,
|
|
15
19
|
type AeraRuntimeContracts,
|
|
@@ -22,6 +26,7 @@ import {
|
|
|
22
26
|
resolveSyncOnlyOperationMode,
|
|
23
27
|
type OperationMode,
|
|
24
28
|
} from './operationMode';
|
|
29
|
+
import { ContractVersion } from './types';
|
|
25
30
|
|
|
26
31
|
export type EvmWithdrawParams = {
|
|
27
32
|
vaultId: string;
|
|
@@ -39,12 +44,94 @@ export type EvmWithdrawParams = {
|
|
|
39
44
|
solverTip?: bigint;
|
|
40
45
|
/** Maximum price age passed to async Aera provisioner requests. Defaults to 10 days. */
|
|
41
46
|
maxPriceAge?: bigint;
|
|
47
|
+
/**
|
|
48
|
+
* Current sync quote bounds to pin instant withdraw transaction construction.
|
|
49
|
+
* Supplying bounds implies `depositMode: 'sync'`; explicit async requests are rejected.
|
|
50
|
+
*/
|
|
51
|
+
syncWithdrawQuote?: SyncWithdrawQuoteBounds;
|
|
42
52
|
} & (
|
|
43
53
|
| { shares: bigint; amount?: never; entireAmount?: never }
|
|
44
54
|
| { amount: bigint; shares?: never; entireAmount?: never }
|
|
45
|
-
| { entireAmount: true; shares?: never; amount?: never }
|
|
55
|
+
| { account?: Address; entireAmount: true; shares?: never; amount?: never }
|
|
46
56
|
);
|
|
47
57
|
|
|
58
|
+
function validateWithdrawParams(params: EvmWithdrawParams) {
|
|
59
|
+
const modes = [
|
|
60
|
+
'amount' in params && params.amount != null,
|
|
61
|
+
'shares' in params && params.shares != null,
|
|
62
|
+
'entireAmount' in params && params.entireAmount === true,
|
|
63
|
+
].filter(Boolean).length;
|
|
64
|
+
|
|
65
|
+
if (modes !== 1) throw new InvalidWithdrawParamsError();
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
function sameAddress(left: Address, right: Address): boolean {
|
|
69
|
+
return left.toLowerCase() === right.toLowerCase();
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
function validateSyncWithdrawQuote({
|
|
73
|
+
params,
|
|
74
|
+
account,
|
|
75
|
+
chainId,
|
|
76
|
+
slippageBps,
|
|
77
|
+
tokenAddress,
|
|
78
|
+
}: {
|
|
79
|
+
params: EvmWithdrawParams;
|
|
80
|
+
account: Address;
|
|
81
|
+
chainId: number;
|
|
82
|
+
slippageBps: number;
|
|
83
|
+
tokenAddress: Address;
|
|
84
|
+
}) {
|
|
85
|
+
const quote = params.syncWithdrawQuote;
|
|
86
|
+
if (quote === undefined) return;
|
|
87
|
+
|
|
88
|
+
const { context } = quote;
|
|
89
|
+
if (
|
|
90
|
+
context.vaultId !== params.vaultId ||
|
|
91
|
+
context.chainId !== chainId ||
|
|
92
|
+
!sameAddress(context.tokenAddress, tokenAddress) ||
|
|
93
|
+
context.slippageBps !== slippageBps
|
|
94
|
+
) {
|
|
95
|
+
throw new InvalidWithdrawParamsError();
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
if (context.account !== undefined && !sameAddress(context.account, account)) {
|
|
99
|
+
throw new InvalidWithdrawParamsError();
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
switch (context.request.mode) {
|
|
103
|
+
case 'amount':
|
|
104
|
+
if (
|
|
105
|
+
quote.kind !== 'withdraw' ||
|
|
106
|
+
!('amount' in params && params.amount != null) ||
|
|
107
|
+
context.request.amount !== params.amount ||
|
|
108
|
+
quote.tokensOut !== params.amount
|
|
109
|
+
) {
|
|
110
|
+
throw new InvalidWithdrawParamsError();
|
|
111
|
+
}
|
|
112
|
+
return;
|
|
113
|
+
case 'shares':
|
|
114
|
+
if (
|
|
115
|
+
quote.kind !== 'redeem' ||
|
|
116
|
+
!('shares' in params && params.shares != null) ||
|
|
117
|
+
context.request.shares !== params.shares ||
|
|
118
|
+
quote.shares !== params.shares
|
|
119
|
+
) {
|
|
120
|
+
throw new InvalidWithdrawParamsError();
|
|
121
|
+
}
|
|
122
|
+
return;
|
|
123
|
+
case 'entireAmount':
|
|
124
|
+
if (
|
|
125
|
+
quote.kind !== 'redeem' ||
|
|
126
|
+
!('entireAmount' in params && params.entireAmount) ||
|
|
127
|
+
!sameAddress(context.request.account, account)
|
|
128
|
+
) {
|
|
129
|
+
throw new InvalidWithdrawParamsError();
|
|
130
|
+
}
|
|
131
|
+
return;
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
|
|
48
135
|
/**
|
|
49
136
|
* Builds the ordered list of EVM transactions required to withdraw from a Gauntlet vault.
|
|
50
137
|
*
|
|
@@ -76,6 +163,7 @@ export type EvmWithdrawParams = {
|
|
|
76
163
|
* const txs = await getWithdrawTx(client, {
|
|
77
164
|
* vaultId: 'baseUsdcPrime',
|
|
78
165
|
* entireAmount: true,
|
|
166
|
+
* account: walletAddress,
|
|
79
167
|
* });
|
|
80
168
|
* ```
|
|
81
169
|
*/
|
|
@@ -83,6 +171,8 @@ export async function getWithdrawTx(
|
|
|
83
171
|
client: GauntletClient,
|
|
84
172
|
params: EvmWithdrawParams
|
|
85
173
|
): Promise<PreparedTx[]> {
|
|
174
|
+
validateWithdrawParams(params);
|
|
175
|
+
|
|
86
176
|
if (
|
|
87
177
|
params.slippageBps !== undefined &&
|
|
88
178
|
(!Number.isInteger(params.slippageBps) ||
|
|
@@ -99,6 +189,11 @@ export async function getWithdrawTx(
|
|
|
99
189
|
|
|
100
190
|
const account = client.wallet?.account?.address;
|
|
101
191
|
if (!account) throw new AccountRequiredError();
|
|
192
|
+
if ('entireAmount' in params && params.entireAmount && params.account !== undefined) {
|
|
193
|
+
if (!sameAddress(params.account, account)) {
|
|
194
|
+
throw new AccountMismatchError(account, params.account);
|
|
195
|
+
}
|
|
196
|
+
}
|
|
102
197
|
|
|
103
198
|
const { vault, protocol } = resolved;
|
|
104
199
|
|
|
@@ -114,20 +209,48 @@ export async function getWithdrawTx(
|
|
|
114
209
|
const adapter = getAdapter(protocol);
|
|
115
210
|
const publicClient = client.getPublicClient(chainId);
|
|
116
211
|
const requestedWithdrawMode = parseOperationMode(params.vaultId, params.depositMode);
|
|
212
|
+
const slippageBps =
|
|
213
|
+
params.slippageBps ?? params.syncWithdrawQuote?.context.slippageBps ?? DEFAULT_BPS;
|
|
117
214
|
let modifiedDepositMode: OperationMode;
|
|
118
215
|
let aeraRuntime: AeraRuntimeContracts | undefined;
|
|
119
216
|
|
|
217
|
+
if (params.syncWithdrawQuote !== undefined) {
|
|
218
|
+
if (protocol !== 'aera' || requestedWithdrawMode === 'async') {
|
|
219
|
+
throw new InvalidWithdrawParamsError();
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
validateSyncWithdrawQuote({
|
|
223
|
+
params,
|
|
224
|
+
account,
|
|
225
|
+
chainId,
|
|
226
|
+
slippageBps,
|
|
227
|
+
tokenAddress: token.address,
|
|
228
|
+
});
|
|
229
|
+
}
|
|
230
|
+
|
|
120
231
|
if (protocol === 'aera') {
|
|
121
232
|
aeraRuntime = await resolveAeraRuntimeContracts(publicClient, vault);
|
|
233
|
+
if (
|
|
234
|
+
aeraRuntime.provisioner.version === ContractVersion.V2 &&
|
|
235
|
+
(requestedWithdrawMode === 'sync' || params.syncWithdrawQuote !== undefined)
|
|
236
|
+
) {
|
|
237
|
+
requireAeraSyncRedeemRuntime(aeraRuntime);
|
|
238
|
+
}
|
|
122
239
|
const tokenModeSupport = await resolveAeraTokenModeSupport(
|
|
123
240
|
publicClient,
|
|
124
241
|
aeraRuntime,
|
|
125
|
-
token.address
|
|
242
|
+
token.address,
|
|
243
|
+
{ includeSyncModes: requestedWithdrawMode !== 'async' }
|
|
126
244
|
);
|
|
127
|
-
modifiedDepositMode = resolveOperationMode(
|
|
128
|
-
|
|
129
|
-
sync:
|
|
130
|
-
|
|
245
|
+
modifiedDepositMode = resolveOperationMode(
|
|
246
|
+
params.vaultId,
|
|
247
|
+
params.syncWithdrawQuote !== undefined ? 'sync' : requestedWithdrawMode,
|
|
248
|
+
{
|
|
249
|
+
async: tokenModeSupport.asyncRedeem,
|
|
250
|
+
sync: tokenModeSupport.syncRedeem,
|
|
251
|
+
}
|
|
252
|
+
);
|
|
253
|
+
if (modifiedDepositMode === 'sync') requireAeraSyncRedeemRuntime(aeraRuntime);
|
|
131
254
|
} else {
|
|
132
255
|
modifiedDepositMode = resolveSyncOnlyOperationMode(params.vaultId, requestedWithdrawMode);
|
|
133
256
|
}
|
|
@@ -139,10 +262,11 @@ export async function getWithdrawTx(
|
|
|
139
262
|
async: modifiedDepositMode === 'async',
|
|
140
263
|
asset: token,
|
|
141
264
|
publicClient,
|
|
142
|
-
slippageBps
|
|
265
|
+
slippageBps,
|
|
143
266
|
solverTip: params.solverTip,
|
|
144
267
|
maxPriceAge: params.maxPriceAge,
|
|
145
268
|
aeraRuntime,
|
|
269
|
+
syncWithdrawQuote: params.syncWithdrawQuote,
|
|
146
270
|
...('shares' in params && params.shares != null ? { shares: params.shares } : {}),
|
|
147
271
|
...('amount' in params && params.amount != null ? { amount: params.amount } : {}),
|
|
148
272
|
...('entireAmount' in params && params.entireAmount ? { entireAmount: true as const } : {}),
|