@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
|
@@ -4,17 +4,21 @@ import {
|
|
|
4
4
|
type GetContractReturnType,
|
|
5
5
|
type PublicClient,
|
|
6
6
|
getContract,
|
|
7
|
+
zeroAddress,
|
|
7
8
|
} from 'viem';
|
|
9
|
+
import { erc20Abi } from '../abis/erc20';
|
|
8
10
|
import { priceAndFeeCalculatorV2Abi } from '../abis/priceAndFeeCalculatorV2';
|
|
9
11
|
import { provisionerV2Abi } from '../abis/provisionerV2';
|
|
10
12
|
import {
|
|
11
13
|
Rounding,
|
|
14
|
+
convertTokenToNumeraire,
|
|
12
15
|
convertTokenToUnitsIfActive,
|
|
13
16
|
convertUnitsToTokenIfActive,
|
|
14
17
|
} from './priceAndFeeCalculator';
|
|
15
18
|
import { MAX_BPS } from '../../constants';
|
|
16
|
-
import { StalePriceError } from '../../errors';
|
|
19
|
+
import { StalePriceError, UnsupportedFeatureError } from '../../errors';
|
|
17
20
|
import type { ContractVersion } from '../types';
|
|
21
|
+
import { readAtBlock } from './readOptions';
|
|
18
22
|
|
|
19
23
|
export type PriceAndFeeCalculatorContract<T extends Client> = GetContractReturnType<
|
|
20
24
|
typeof priceAndFeeCalculatorV2Abi,
|
|
@@ -33,19 +37,71 @@ export function getPriceAndFeeCalculator<T extends Client>(
|
|
|
33
37
|
});
|
|
34
38
|
}
|
|
35
39
|
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
40
|
+
type SyncRedeemReadOptions = {
|
|
41
|
+
blockNumber?: bigint;
|
|
42
|
+
blockTimestamp?: bigint;
|
|
43
|
+
};
|
|
44
|
+
|
|
45
|
+
async function resolveReadContext(
|
|
46
|
+
client: PublicClient,
|
|
47
|
+
options: SyncRedeemReadOptions = {}
|
|
48
|
+
): Promise<Required<SyncRedeemReadOptions>> {
|
|
49
|
+
if (options.blockNumber !== undefined && options.blockTimestamp !== undefined) {
|
|
50
|
+
return { blockNumber: options.blockNumber, blockTimestamp: options.blockTimestamp };
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
const block =
|
|
54
|
+
options.blockNumber === undefined ? await client.getBlock() : await client.getBlock(options);
|
|
55
|
+
if (block.number === null) {
|
|
56
|
+
throw new UnsupportedFeatureError('Aera: sync redeem reads require a numbered block');
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
return {
|
|
60
|
+
blockNumber: options.blockNumber ?? block.number,
|
|
61
|
+
blockTimestamp: options.blockTimestamp ?? BigInt(block.timestamp),
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
async function getTokenDetails(
|
|
66
|
+
client: PublicClient,
|
|
67
|
+
provisioner: Address,
|
|
68
|
+
token: Address,
|
|
69
|
+
options: SyncRedeemReadOptions = {}
|
|
70
|
+
) {
|
|
71
|
+
return client.readContract({
|
|
72
|
+
address: provisioner,
|
|
39
73
|
abi: provisionerV2Abi,
|
|
40
|
-
|
|
74
|
+
functionName: 'tokensDetails',
|
|
75
|
+
args: [token],
|
|
76
|
+
...readAtBlock(options),
|
|
41
77
|
});
|
|
42
78
|
}
|
|
43
79
|
|
|
44
|
-
|
|
45
|
-
|
|
80
|
+
/**
|
|
81
|
+
* Returns the vault's currently known sync-redeem liquidity in tokens.
|
|
82
|
+
*
|
|
83
|
+
* When a pull-funds pointer is configured, the provisioner may source more tokens during the
|
|
84
|
+
* redemption, so the vault's current token balance is not a reliable liquidity limit.
|
|
85
|
+
*/
|
|
86
|
+
export async function getKnownSyncRedeemLiquidityTokens(
|
|
87
|
+
client: PublicClient,
|
|
88
|
+
vault: Address,
|
|
89
|
+
token: Address,
|
|
90
|
+
hasPullFundsSubmitData: boolean,
|
|
91
|
+
options: SyncRedeemReadOptions = {}
|
|
92
|
+
): Promise<bigint | undefined> {
|
|
93
|
+
if (hasPullFundsSubmitData) return undefined;
|
|
94
|
+
|
|
95
|
+
return client.readContract({
|
|
96
|
+
address: token,
|
|
97
|
+
abi: erc20Abi,
|
|
98
|
+
functionName: 'balanceOf',
|
|
99
|
+
args: [vault],
|
|
100
|
+
...readAtBlock(options),
|
|
101
|
+
});
|
|
46
102
|
}
|
|
47
103
|
|
|
48
|
-
async function
|
|
104
|
+
async function getDepositQuote({
|
|
49
105
|
client,
|
|
50
106
|
provisioner,
|
|
51
107
|
feeCalculator,
|
|
@@ -54,6 +110,7 @@ async function getDepositUnitsOut({
|
|
|
54
110
|
token,
|
|
55
111
|
tokensIn,
|
|
56
112
|
multiplierIndex,
|
|
113
|
+
options,
|
|
57
114
|
}: {
|
|
58
115
|
client: PublicClient;
|
|
59
116
|
provisioner: Address;
|
|
@@ -63,20 +120,24 @@ async function getDepositUnitsOut({
|
|
|
63
120
|
token: Address;
|
|
64
121
|
tokensIn: bigint;
|
|
65
122
|
multiplierIndex: 4 | 6;
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
const
|
|
69
|
-
const
|
|
123
|
+
options?: SyncRedeemReadOptions;
|
|
124
|
+
}): Promise<{ unitsOut: bigint; multiplierBps: bigint }> {
|
|
125
|
+
const tokenDetails = await getTokenDetails(client, provisioner, token, options);
|
|
126
|
+
const multiplierBps = BigInt(tokenDetails[multiplierIndex]);
|
|
127
|
+
const adjustedTokensIn = (tokensIn * multiplierBps) / MAX_BPS;
|
|
70
128
|
|
|
71
|
-
|
|
129
|
+
const unitsOut = await convertTokenToUnitsIfActive(
|
|
72
130
|
client,
|
|
73
131
|
feeCalculator,
|
|
74
132
|
feeCalculatorVersion,
|
|
75
133
|
vault,
|
|
76
134
|
token,
|
|
77
135
|
adjustedTokensIn,
|
|
78
|
-
Rounding.Floor
|
|
136
|
+
Rounding.Floor,
|
|
137
|
+
options
|
|
79
138
|
);
|
|
139
|
+
|
|
140
|
+
return { unitsOut, multiplierBps };
|
|
80
141
|
}
|
|
81
142
|
|
|
82
143
|
async function getRedeemTokenOut({
|
|
@@ -88,6 +149,7 @@ async function getRedeemTokenOut({
|
|
|
88
149
|
token,
|
|
89
150
|
unitsIn,
|
|
90
151
|
multiplierIndex,
|
|
152
|
+
options,
|
|
91
153
|
}: {
|
|
92
154
|
client: PublicClient;
|
|
93
155
|
provisioner: Address;
|
|
@@ -97,9 +159,10 @@ async function getRedeemTokenOut({
|
|
|
97
159
|
token: Address;
|
|
98
160
|
unitsIn: bigint;
|
|
99
161
|
multiplierIndex: 5 | 7;
|
|
162
|
+
options?: SyncRedeemReadOptions;
|
|
100
163
|
}): Promise<bigint> {
|
|
101
164
|
const [tokenDetails, tokensOut] = await Promise.all([
|
|
102
|
-
getTokenDetails(client, provisioner, token),
|
|
165
|
+
getTokenDetails(client, provisioner, token, options),
|
|
103
166
|
convertUnitsToTokenIfActive(
|
|
104
167
|
client,
|
|
105
168
|
feeCalculator,
|
|
@@ -107,7 +170,8 @@ async function getRedeemTokenOut({
|
|
|
107
170
|
vault,
|
|
108
171
|
token,
|
|
109
172
|
unitsIn,
|
|
110
|
-
Rounding.Floor
|
|
173
|
+
Rounding.Floor,
|
|
174
|
+
options
|
|
111
175
|
),
|
|
112
176
|
]);
|
|
113
177
|
const multiplier = BigInt(tokenDetails[multiplierIndex]);
|
|
@@ -124,6 +188,7 @@ async function getWithdrawUnitsIn({
|
|
|
124
188
|
token,
|
|
125
189
|
tokensOut,
|
|
126
190
|
multiplierIndex,
|
|
191
|
+
options,
|
|
127
192
|
}: {
|
|
128
193
|
client: PublicClient;
|
|
129
194
|
provisioner: Address;
|
|
@@ -133,8 +198,9 @@ async function getWithdrawUnitsIn({
|
|
|
133
198
|
token: Address;
|
|
134
199
|
tokensOut: bigint;
|
|
135
200
|
multiplierIndex: 5 | 7;
|
|
201
|
+
options?: SyncRedeemReadOptions;
|
|
136
202
|
}): Promise<bigint> {
|
|
137
|
-
const tokenDetails = await getTokenDetails(client, provisioner, token);
|
|
203
|
+
const tokenDetails = await getTokenDetails(client, provisioner, token, options);
|
|
138
204
|
const multiplier = BigInt(tokenDetails[multiplierIndex]);
|
|
139
205
|
const preMultiplierTokens = (tokensOut * MAX_BPS + multiplier - 1n) / multiplier;
|
|
140
206
|
|
|
@@ -145,17 +211,39 @@ async function getWithdrawUnitsIn({
|
|
|
145
211
|
vault,
|
|
146
212
|
token,
|
|
147
213
|
preMultiplierTokens,
|
|
148
|
-
Rounding.Ceil
|
|
214
|
+
Rounding.Ceil,
|
|
215
|
+
options
|
|
149
216
|
);
|
|
150
217
|
}
|
|
151
218
|
|
|
152
|
-
|
|
219
|
+
/** Breakdown of the effective sync redeem multiplier, in basis points. */
|
|
220
|
+
export interface SyncRedeemRate {
|
|
221
|
+
/** Base sync redeem multiplier (tokensDetails.syncRedeemMultiplier). */
|
|
222
|
+
baseMultiplierBps: bigint;
|
|
223
|
+
/** Dynamic premium charged for the current oracle price age. */
|
|
224
|
+
dynamicPremiumBps: bigint;
|
|
225
|
+
/** Multiplier actually applied to size the redemption (base - dynamic premium). */
|
|
226
|
+
effectiveMultiplierBps: bigint;
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
/**
|
|
230
|
+
* Reads the live sync redeem rate and whether pull-funds calldata is configured.
|
|
231
|
+
*
|
|
232
|
+
* Both values come from the same token-details read, avoiding another RPC request when a quote
|
|
233
|
+
* needs to determine whether the vault balance is a reliable liquidity limit.
|
|
234
|
+
*
|
|
235
|
+
* @throws {StalePriceError} If the oracle price is older than the configured max age,
|
|
236
|
+
* in which case the on-chain sync redeem would revert.
|
|
237
|
+
*/
|
|
238
|
+
export async function getSyncRedeemRateContext(
|
|
153
239
|
client: PublicClient,
|
|
154
240
|
provisioner: Address,
|
|
155
241
|
vault: Address,
|
|
156
242
|
token: Address,
|
|
157
|
-
feeCalculator: Address
|
|
158
|
-
|
|
243
|
+
feeCalculator: Address,
|
|
244
|
+
options: SyncRedeemReadOptions = {}
|
|
245
|
+
): Promise<{ rate: SyncRedeemRate; hasPullFundsSubmitData: boolean }> {
|
|
246
|
+
const readContext = await resolveReadContext(client, options);
|
|
159
247
|
const [tokenDetails, syncRedeemDetails, anchorTimestamp] = await client.multicall({
|
|
160
248
|
contracts: [
|
|
161
249
|
{
|
|
@@ -177,12 +265,12 @@ async function getSyncRedeemMultiplier(
|
|
|
177
265
|
},
|
|
178
266
|
],
|
|
179
267
|
allowFailure: false,
|
|
268
|
+
blockNumber: readContext.blockNumber,
|
|
180
269
|
});
|
|
181
|
-
const
|
|
182
|
-
const syncRedeemMultiplier = BigInt(tokenDetails[7]);
|
|
270
|
+
const baseMultiplierBps = BigInt(tokenDetails[7]);
|
|
183
271
|
const maxPriceAge = BigInt(syncRedeemDetails[0]);
|
|
184
272
|
const maxDynamicPremiumBps = BigInt(syncRedeemDetails[2]);
|
|
185
|
-
const blockTimestamp =
|
|
273
|
+
const blockTimestamp = readContext.blockTimestamp;
|
|
186
274
|
const priceTimestamp = BigInt(anchorTimestamp);
|
|
187
275
|
|
|
188
276
|
if (priceTimestamp + maxPriceAge < blockTimestamp) {
|
|
@@ -198,7 +286,39 @@ async function getSyncRedeemMultiplier(
|
|
|
198
286
|
? 0n
|
|
199
287
|
: ((blockTimestamp - priceTimestamp) * maxDynamicPremiumBps + maxPriceAge - 1n) / maxPriceAge;
|
|
200
288
|
|
|
201
|
-
return
|
|
289
|
+
return {
|
|
290
|
+
rate: {
|
|
291
|
+
baseMultiplierBps,
|
|
292
|
+
dynamicPremiumBps,
|
|
293
|
+
effectiveMultiplierBps: baseMultiplierBps - dynamicPremiumBps,
|
|
294
|
+
},
|
|
295
|
+
hasPullFundsSubmitData: tokenDetails[9] !== zeroAddress,
|
|
296
|
+
};
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
/** Preserves the existing rate-only API for callers that do not need pull-funds state. */
|
|
300
|
+
export async function getSyncRedeemRate(
|
|
301
|
+
client: PublicClient,
|
|
302
|
+
provisioner: Address,
|
|
303
|
+
vault: Address,
|
|
304
|
+
token: Address,
|
|
305
|
+
feeCalculator: Address,
|
|
306
|
+
options: SyncRedeemReadOptions = {}
|
|
307
|
+
): Promise<SyncRedeemRate> {
|
|
308
|
+
return (await getSyncRedeemRateContext(client, provisioner, vault, token, feeCalculator, options))
|
|
309
|
+
.rate;
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
async function getSyncRedeemMultiplier(
|
|
313
|
+
client: PublicClient,
|
|
314
|
+
provisioner: Address,
|
|
315
|
+
vault: Address,
|
|
316
|
+
token: Address,
|
|
317
|
+
feeCalculator: Address,
|
|
318
|
+
options: SyncRedeemReadOptions = {}
|
|
319
|
+
): Promise<bigint> {
|
|
320
|
+
return (await getSyncRedeemRate(client, provisioner, vault, token, feeCalculator, options))
|
|
321
|
+
.effectiveMultiplierBps;
|
|
202
322
|
}
|
|
203
323
|
|
|
204
324
|
export async function getSyncRedeemTokenOut(
|
|
@@ -208,8 +328,12 @@ export async function getSyncRedeemTokenOut(
|
|
|
208
328
|
feeCalculatorVersion: ContractVersion,
|
|
209
329
|
vault: Address,
|
|
210
330
|
token: Address,
|
|
211
|
-
unitsIn: bigint
|
|
331
|
+
unitsIn: bigint,
|
|
332
|
+
effectiveMultiplierBps?: bigint,
|
|
333
|
+
options: SyncRedeemReadOptions = {}
|
|
212
334
|
): Promise<bigint> {
|
|
335
|
+
const readContext =
|
|
336
|
+
effectiveMultiplierBps === undefined ? await resolveReadContext(client, options) : options;
|
|
213
337
|
const [tokenAmount, multiplier] = await Promise.all([
|
|
214
338
|
convertUnitsToTokenIfActive(
|
|
215
339
|
client,
|
|
@@ -218,9 +342,12 @@ export async function getSyncRedeemTokenOut(
|
|
|
218
342
|
vault,
|
|
219
343
|
token,
|
|
220
344
|
unitsIn,
|
|
221
|
-
Rounding.Floor
|
|
345
|
+
Rounding.Floor,
|
|
346
|
+
readContext
|
|
222
347
|
),
|
|
223
|
-
|
|
348
|
+
effectiveMultiplierBps !== undefined
|
|
349
|
+
? Promise.resolve(effectiveMultiplierBps)
|
|
350
|
+
: getSyncRedeemMultiplier(client, provisioner, vault, token, feeCalculator, readContext),
|
|
224
351
|
]);
|
|
225
352
|
|
|
226
353
|
return (tokenAmount * multiplier) / MAX_BPS;
|
|
@@ -235,7 +362,7 @@ export async function getAsyncDepositUnitsOut(
|
|
|
235
362
|
token: Address,
|
|
236
363
|
tokensIn: bigint
|
|
237
364
|
): Promise<bigint> {
|
|
238
|
-
|
|
365
|
+
const quote = await getDepositQuote({
|
|
239
366
|
client,
|
|
240
367
|
provisioner,
|
|
241
368
|
feeCalculator,
|
|
@@ -245,9 +372,10 @@ export async function getAsyncDepositUnitsOut(
|
|
|
245
372
|
tokensIn,
|
|
246
373
|
multiplierIndex: 4,
|
|
247
374
|
});
|
|
375
|
+
return quote.unitsOut;
|
|
248
376
|
}
|
|
249
377
|
|
|
250
|
-
|
|
378
|
+
const getSyncDepositQuote = (
|
|
251
379
|
client: PublicClient,
|
|
252
380
|
provisioner: Address,
|
|
253
381
|
feeCalculator: Address,
|
|
@@ -255,8 +383,8 @@ export async function getSyncDepositUnitsOut(
|
|
|
255
383
|
vault: Address,
|
|
256
384
|
token: Address,
|
|
257
385
|
tokensIn: bigint
|
|
258
|
-
)
|
|
259
|
-
|
|
386
|
+
) =>
|
|
387
|
+
getDepositQuote({
|
|
260
388
|
client,
|
|
261
389
|
provisioner,
|
|
262
390
|
feeCalculator,
|
|
@@ -266,6 +394,66 @@ export async function getSyncDepositUnitsOut(
|
|
|
266
394
|
tokensIn,
|
|
267
395
|
multiplierIndex: 6,
|
|
268
396
|
});
|
|
397
|
+
|
|
398
|
+
export async function getSyncDepositUnitsOut(
|
|
399
|
+
client: PublicClient,
|
|
400
|
+
provisioner: Address,
|
|
401
|
+
feeCalculator: Address,
|
|
402
|
+
feeCalculatorVersion: ContractVersion,
|
|
403
|
+
vault: Address,
|
|
404
|
+
token: Address,
|
|
405
|
+
tokensIn: bigint
|
|
406
|
+
): Promise<bigint> {
|
|
407
|
+
const quote = await getSyncDepositQuote(
|
|
408
|
+
client,
|
|
409
|
+
provisioner,
|
|
410
|
+
feeCalculator,
|
|
411
|
+
feeCalculatorVersion,
|
|
412
|
+
vault,
|
|
413
|
+
token,
|
|
414
|
+
tokensIn
|
|
415
|
+
);
|
|
416
|
+
return quote.unitsOut;
|
|
417
|
+
}
|
|
418
|
+
|
|
419
|
+
export async function getSyncDepositQuoteValues(
|
|
420
|
+
client: PublicClient,
|
|
421
|
+
provisioner: Address,
|
|
422
|
+
feeCalculator: Address,
|
|
423
|
+
feeCalculatorVersion: ContractVersion,
|
|
424
|
+
vault: Address,
|
|
425
|
+
token: Address,
|
|
426
|
+
tokensIn: bigint
|
|
427
|
+
): Promise<{ unitsOut: bigint; feeBps: bigint; numeraireOut: bigint }> {
|
|
428
|
+
const { unitsOut, multiplierBps } = await getSyncDepositQuote(
|
|
429
|
+
client,
|
|
430
|
+
provisioner,
|
|
431
|
+
feeCalculator,
|
|
432
|
+
feeCalculatorVersion,
|
|
433
|
+
vault,
|
|
434
|
+
token,
|
|
435
|
+
tokensIn
|
|
436
|
+
);
|
|
437
|
+
const numeraireOut = await convertTokenToNumeraire(
|
|
438
|
+
client,
|
|
439
|
+
feeCalculator,
|
|
440
|
+
feeCalculatorVersion,
|
|
441
|
+
vault,
|
|
442
|
+
token,
|
|
443
|
+
(tokensIn * multiplierBps) / MAX_BPS
|
|
444
|
+
);
|
|
445
|
+
return { unitsOut, feeBps: MAX_BPS - multiplierBps, numeraireOut };
|
|
446
|
+
}
|
|
447
|
+
|
|
448
|
+
/** Reads the live Instant Supply fee for a vault token, independent of the deposit amount. */
|
|
449
|
+
export async function getSyncDepositFeeBps(
|
|
450
|
+
client: PublicClient,
|
|
451
|
+
provisioner: Address,
|
|
452
|
+
token: Address,
|
|
453
|
+
options: SyncRedeemReadOptions = {}
|
|
454
|
+
): Promise<bigint> {
|
|
455
|
+
const tokenDetails = await getTokenDetails(client, provisioner, token, options);
|
|
456
|
+
return MAX_BPS - BigInt(tokenDetails[6]);
|
|
269
457
|
}
|
|
270
458
|
|
|
271
459
|
export async function getAsyncRedeemTokenOut(
|
|
@@ -317,15 +505,15 @@ export async function getSyncWithdrawUnitsIn(
|
|
|
317
505
|
feeCalculatorVersion: ContractVersion,
|
|
318
506
|
vault: Address,
|
|
319
507
|
token: Address,
|
|
320
|
-
tokensOut: bigint
|
|
508
|
+
tokensOut: bigint,
|
|
509
|
+
effectiveMultiplierBps?: bigint,
|
|
510
|
+
options: SyncRedeemReadOptions = {}
|
|
321
511
|
): Promise<bigint> {
|
|
322
|
-
const
|
|
323
|
-
client,
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
token,
|
|
327
|
-
feeCalculator
|
|
328
|
-
);
|
|
512
|
+
const readContext =
|
|
513
|
+
effectiveMultiplierBps === undefined ? await resolveReadContext(client, options) : options;
|
|
514
|
+
const multiplier =
|
|
515
|
+
effectiveMultiplierBps ??
|
|
516
|
+
(await getSyncRedeemMultiplier(client, provisioner, vault, token, feeCalculator, readContext));
|
|
329
517
|
const prePremiumTokens = (tokensOut * MAX_BPS + multiplier - 1n) / multiplier;
|
|
330
518
|
|
|
331
519
|
return convertTokenToUnitsIfActive(
|
|
@@ -335,10 +523,54 @@ export async function getSyncWithdrawUnitsIn(
|
|
|
335
523
|
vault,
|
|
336
524
|
token,
|
|
337
525
|
prePremiumTokens,
|
|
338
|
-
Rounding.Ceil
|
|
526
|
+
Rounding.Ceil,
|
|
527
|
+
readContext
|
|
339
528
|
);
|
|
340
529
|
}
|
|
341
530
|
|
|
531
|
+
/** Current sync redeem epoch accounting, in numeraire (all values uint256). */
|
|
532
|
+
export interface SyncRedeemEpochState {
|
|
533
|
+
epochTimestamp: bigint;
|
|
534
|
+
epochStartTvlNumeraire: bigint;
|
|
535
|
+
epochRedeemedNumeraire: bigint;
|
|
536
|
+
epochCapNumeraire: bigint;
|
|
537
|
+
}
|
|
538
|
+
|
|
539
|
+
export async function getSyncRedeemEpochState(
|
|
540
|
+
client: PublicClient,
|
|
541
|
+
provisioner: Address,
|
|
542
|
+
options: SyncRedeemReadOptions = {}
|
|
543
|
+
): Promise<SyncRedeemEpochState> {
|
|
544
|
+
const [epochTimestamp, epochStartTvlNumeraire, epochRedeemedNumeraire, epochCapNumeraire] =
|
|
545
|
+
await client.readContract({
|
|
546
|
+
address: provisioner,
|
|
547
|
+
abi: provisionerV2Abi,
|
|
548
|
+
functionName: 'getSyncRedeemEpochState',
|
|
549
|
+
...readAtBlock(options),
|
|
550
|
+
});
|
|
551
|
+
|
|
552
|
+
return { epochTimestamp, epochStartTvlNumeraire, epochRedeemedNumeraire, epochCapNumeraire };
|
|
553
|
+
}
|
|
554
|
+
|
|
555
|
+
/**
|
|
556
|
+
* Raw expiry timestamp for the user's latest sync-deposit lock (0 if none was recorded).
|
|
557
|
+
* The user is locked while this value is greater than or equal to the relevant block timestamp.
|
|
558
|
+
*/
|
|
559
|
+
export async function getUserUnitsRefundableUntil(
|
|
560
|
+
client: PublicClient,
|
|
561
|
+
provisioner: Address,
|
|
562
|
+
user: Address,
|
|
563
|
+
options: SyncRedeemReadOptions = {}
|
|
564
|
+
): Promise<bigint> {
|
|
565
|
+
return client.readContract({
|
|
566
|
+
address: provisioner,
|
|
567
|
+
abi: provisionerV2Abi,
|
|
568
|
+
functionName: 'userUnitsRefundableUntil',
|
|
569
|
+
args: [user],
|
|
570
|
+
...readAtBlock(options),
|
|
571
|
+
});
|
|
572
|
+
}
|
|
573
|
+
|
|
342
574
|
export function depositTxRequest(
|
|
343
575
|
provisioner: Address,
|
|
344
576
|
token: Address,
|
package/src/evm/aeraContracts.ts
CHANGED
|
@@ -15,6 +15,7 @@ import { provisionerAbi } from './abis/provisioner';
|
|
|
15
15
|
import { provisionerV2Abi } from './abis/provisionerV2';
|
|
16
16
|
import { MAX_BPS } from '../constants';
|
|
17
17
|
import { ContractVersion, type EvmVaultDeployment } from './types';
|
|
18
|
+
import { readAtBlock } from './aeraContracts/readOptions';
|
|
18
19
|
|
|
19
20
|
const contractVersionCache = new Map<string, ContractVersion>();
|
|
20
21
|
|
|
@@ -28,6 +29,19 @@ const contractVersionAbi = [
|
|
|
28
29
|
},
|
|
29
30
|
] as const;
|
|
30
31
|
|
|
32
|
+
const solvingGateAbi = [
|
|
33
|
+
{
|
|
34
|
+
type: 'function',
|
|
35
|
+
inputs: [
|
|
36
|
+
{ name: 'provisioner', internalType: 'address', type: 'address' },
|
|
37
|
+
{ name: 'token', internalType: 'address', type: 'address' },
|
|
38
|
+
],
|
|
39
|
+
name: 'paused',
|
|
40
|
+
outputs: [{ name: '', internalType: 'bool', type: 'bool' }],
|
|
41
|
+
stateMutability: 'view',
|
|
42
|
+
},
|
|
43
|
+
] as const;
|
|
44
|
+
|
|
31
45
|
export interface AeraRuntimeContracts {
|
|
32
46
|
provisioner: {
|
|
33
47
|
address: Address;
|
|
@@ -46,6 +60,19 @@ export interface AeraTokenModeSupport {
|
|
|
46
60
|
syncRedeem: boolean;
|
|
47
61
|
}
|
|
48
62
|
|
|
63
|
+
export function requireAeraSyncRedeemRuntime(runtime: AeraRuntimeContracts): void {
|
|
64
|
+
if (runtime.provisioner.version !== ContractVersion.V2) {
|
|
65
|
+
throw new UnsupportedFeatureError('Aera: sync redeem requires a V2 provisioner');
|
|
66
|
+
}
|
|
67
|
+
if (runtime.feeCalculator.version !== ContractVersion.V2) {
|
|
68
|
+
throw new UnsupportedFeatureError('Aera: sync redeem requires a V2 price and fee calculator');
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
export type AeraReadOptions = {
|
|
73
|
+
blockNumber?: bigint;
|
|
74
|
+
};
|
|
75
|
+
|
|
49
76
|
export function applySlippageDown(amount: bigint, slippageBps: number): bigint {
|
|
50
77
|
return (amount * (MAX_BPS - BigInt(slippageBps))) / MAX_BPS;
|
|
51
78
|
}
|
|
@@ -97,7 +124,8 @@ export function getMultiDepositorVault<T extends Client>(
|
|
|
97
124
|
|
|
98
125
|
export async function resolveContractVersion(
|
|
99
126
|
client: PublicClient,
|
|
100
|
-
address: Address
|
|
127
|
+
address: Address,
|
|
128
|
+
options: AeraReadOptions = {}
|
|
101
129
|
): Promise<ContractVersion> {
|
|
102
130
|
const cacheKey = contractVersionCacheKey(client, address);
|
|
103
131
|
const cached = contractVersionCache.get(cacheKey);
|
|
@@ -108,6 +136,7 @@ export async function resolveContractVersion(
|
|
|
108
136
|
address,
|
|
109
137
|
abi: contractVersionAbi,
|
|
110
138
|
functionName: 'version',
|
|
139
|
+
...readAtBlock(options),
|
|
111
140
|
});
|
|
112
141
|
const version = versionString.startsWith('2.') ? ContractVersion.V2 : ContractVersion.V1;
|
|
113
142
|
contractVersionCache.set(cacheKey, version);
|
|
@@ -123,7 +152,8 @@ export async function resolveContractVersion(
|
|
|
123
152
|
|
|
124
153
|
export async function resolveAeraRuntimeContracts(
|
|
125
154
|
client: PublicClient,
|
|
126
|
-
vault: EvmVaultDeployment
|
|
155
|
+
vault: EvmVaultDeployment,
|
|
156
|
+
options: AeraReadOptions = {}
|
|
127
157
|
): Promise<AeraRuntimeContracts> {
|
|
128
158
|
if (vault.vaultType !== 'multi-depositor') {
|
|
129
159
|
throw new UnimplementedFeatureError('Aera: single depositor vaults');
|
|
@@ -134,11 +164,13 @@ export async function resolveAeraRuntimeContracts(
|
|
|
134
164
|
address: vault.vaultAddress,
|
|
135
165
|
abi: multiDepositorVaultAbi,
|
|
136
166
|
functionName: 'provisioner',
|
|
167
|
+
...readAtBlock(options),
|
|
137
168
|
}),
|
|
138
169
|
client.readContract({
|
|
139
170
|
address: vault.vaultAddress,
|
|
140
171
|
abi: multiDepositorVaultAbi,
|
|
141
172
|
functionName: 'feeCalculator',
|
|
173
|
+
...readAtBlock(options),
|
|
142
174
|
}),
|
|
143
175
|
]);
|
|
144
176
|
|
|
@@ -150,8 +182,8 @@ export async function resolveAeraRuntimeContracts(
|
|
|
150
182
|
}
|
|
151
183
|
|
|
152
184
|
const [provisionerVersion, feeCalculatorVersion] = await Promise.all([
|
|
153
|
-
resolveContractVersion(client, provisionerAddress),
|
|
154
|
-
resolveContractVersion(client, feeCalculatorAddress),
|
|
185
|
+
resolveContractVersion(client, provisionerAddress, options),
|
|
186
|
+
resolveContractVersion(client, feeCalculatorAddress, options),
|
|
155
187
|
]);
|
|
156
188
|
|
|
157
189
|
return {
|
|
@@ -169,21 +201,61 @@ export async function resolveAeraRuntimeContracts(
|
|
|
169
201
|
export async function resolveAeraTokenModeSupport(
|
|
170
202
|
client: PublicClient,
|
|
171
203
|
runtime: AeraRuntimeContracts,
|
|
172
|
-
token: Address
|
|
204
|
+
token: Address,
|
|
205
|
+
options: AeraReadOptions & { includeSyncModes?: boolean } = {}
|
|
173
206
|
): Promise<AeraTokenModeSupport> {
|
|
174
207
|
if (runtime.provisioner.version === ContractVersion.V2) {
|
|
175
|
-
const
|
|
208
|
+
const tokenDetailsPromise = client.readContract({
|
|
176
209
|
address: runtime.provisioner.address,
|
|
177
210
|
abi: provisionerV2Abi,
|
|
178
211
|
functionName: 'tokensDetails',
|
|
179
212
|
args: [token],
|
|
213
|
+
...readAtBlock(options),
|
|
180
214
|
});
|
|
215
|
+
if (options.includeSyncModes === false) {
|
|
216
|
+
const tokenDetails = await tokenDetailsPromise;
|
|
217
|
+
return {
|
|
218
|
+
asyncDeposit: Boolean(tokenDetails[0]),
|
|
219
|
+
asyncRedeem: Boolean(tokenDetails[1]),
|
|
220
|
+
syncDeposit: false,
|
|
221
|
+
syncRedeem: false,
|
|
222
|
+
};
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
const [tokenDetails, solvingGateEnabled, solvingGate] = await Promise.all([
|
|
226
|
+
tokenDetailsPromise,
|
|
227
|
+
client.readContract({
|
|
228
|
+
address: runtime.provisioner.address,
|
|
229
|
+
abi: provisionerV2Abi,
|
|
230
|
+
functionName: 'SOLVING_GATE_ENABLED',
|
|
231
|
+
...readAtBlock(options),
|
|
232
|
+
}),
|
|
233
|
+
client.readContract({
|
|
234
|
+
address: runtime.provisioner.address,
|
|
235
|
+
abi: provisionerV2Abi,
|
|
236
|
+
functionName: 'solvingGate',
|
|
237
|
+
...readAtBlock(options),
|
|
238
|
+
}),
|
|
239
|
+
]);
|
|
240
|
+
const solvingPaused =
|
|
241
|
+
solvingGateEnabled && solvingGate !== zeroAddress
|
|
242
|
+
? await client.readContract({
|
|
243
|
+
address: solvingGate,
|
|
244
|
+
abi: solvingGateAbi,
|
|
245
|
+
functionName: 'paused',
|
|
246
|
+
args: [runtime.provisioner.address, token],
|
|
247
|
+
...readAtBlock(options),
|
|
248
|
+
})
|
|
249
|
+
: false;
|
|
181
250
|
|
|
182
251
|
return {
|
|
183
252
|
asyncDeposit: Boolean(tokenDetails[0]),
|
|
184
253
|
asyncRedeem: Boolean(tokenDetails[1]),
|
|
185
|
-
syncDeposit: Boolean(tokenDetails[2]),
|
|
186
|
-
syncRedeem:
|
|
254
|
+
syncDeposit: Boolean(tokenDetails[2]) && !solvingPaused,
|
|
255
|
+
syncRedeem:
|
|
256
|
+
Boolean(tokenDetails[3]) &&
|
|
257
|
+
!solvingPaused &&
|
|
258
|
+
runtime.feeCalculator.version === ContractVersion.V2,
|
|
187
259
|
};
|
|
188
260
|
}
|
|
189
261
|
|
|
@@ -192,6 +264,7 @@ export async function resolveAeraTokenModeSupport(
|
|
|
192
264
|
abi: provisionerAbi,
|
|
193
265
|
functionName: 'tokensDetails',
|
|
194
266
|
args: [token],
|
|
267
|
+
...readAtBlock(options),
|
|
195
268
|
});
|
|
196
269
|
|
|
197
270
|
return {
|