@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/api/http.ts
CHANGED
package/src/api/index.ts
CHANGED
|
@@ -19,7 +19,10 @@ export type {
|
|
|
19
19
|
TimeseriesMeta,
|
|
20
20
|
TimeWindowOptions,
|
|
21
21
|
TokenRef,
|
|
22
|
+
TvlBreakdownMode,
|
|
22
23
|
TvlResponse,
|
|
24
|
+
TvlTimeseriesPoint,
|
|
25
|
+
TvlTimeseriesResponse,
|
|
23
26
|
UserActivity,
|
|
24
27
|
UserActivityResponse,
|
|
25
28
|
UserAllPositionsResponse,
|
|
@@ -28,7 +31,12 @@ export type {
|
|
|
28
31
|
UserPositionsTimeseriesResponse,
|
|
29
32
|
VaultDetail,
|
|
30
33
|
VaultDetailResponse,
|
|
34
|
+
VaultAllocations,
|
|
35
|
+
VaultAllocationsResponse,
|
|
31
36
|
VaultMetrics,
|
|
37
|
+
VaultsOptions,
|
|
38
|
+
VaultGroupTimeseriesPoint,
|
|
39
|
+
VaultGroupTimeseriesResponse,
|
|
32
40
|
VaultTimeseriesPoint,
|
|
33
41
|
VaultTimeseriesResponse,
|
|
34
42
|
} from './client';
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { activityLifecycles, orderActivityRows, requireSameToken } from './activityRows';
|
|
1
2
|
import { GauntletSDKError } from '../errors';
|
|
2
3
|
import type { GauntletApi, TokenRef, UserActivity } from './client';
|
|
3
4
|
import { bigIntToDecimal, decimalToBigInt, sharesToBigInt } from './decimal';
|
|
@@ -57,8 +58,11 @@ export function buildPositionHistory(rows: UserActivity[]): PositionHistory {
|
|
|
57
58
|
);
|
|
58
59
|
}
|
|
59
60
|
|
|
60
|
-
const ordered =
|
|
61
|
-
|
|
61
|
+
const ordered = orderActivityRows(rows);
|
|
62
|
+
activityLifecycles(ordered);
|
|
63
|
+
const tokenRow = ordered.find((r) => r.assets_delta.token) ?? ordered[0];
|
|
64
|
+
const token = tokenRow.assets_delta.token ?? null;
|
|
65
|
+
for (const row of ordered) requireSameToken(tokenRow, row);
|
|
62
66
|
|
|
63
67
|
let sharesBalance = 0n;
|
|
64
68
|
let pendingDepositAssets = 0n;
|
|
@@ -95,9 +99,14 @@ export function buildPositionHistory(rows: UserActivity[]): PositionHistory {
|
|
|
95
99
|
if (row.request_hash != null) pendingDepositByHash.set(row.request_hash, assetsDelta);
|
|
96
100
|
break;
|
|
97
101
|
case 'deposit_refunded':
|
|
98
|
-
|
|
102
|
+
if (
|
|
103
|
+
row.request_hash == null ||
|
|
104
|
+
pendingDepositByHash.get(row.request_hash) !== -assetsDelta
|
|
105
|
+
) {
|
|
106
|
+
throw new GauntletSDKError('The deposit refund does not match its escrow');
|
|
107
|
+
}
|
|
99
108
|
pendingDepositAssets += assetsDelta;
|
|
100
|
-
|
|
109
|
+
pendingDepositByHash.delete(row.request_hash);
|
|
101
110
|
break;
|
|
102
111
|
case 'withdraw':
|
|
103
112
|
// Sync withdraws and async terminal solves both carry the asset
|
|
@@ -121,8 +130,11 @@ export function buildPositionHistory(rows: UserActivity[]): PositionHistory {
|
|
|
121
130
|
break;
|
|
122
131
|
}
|
|
123
132
|
case 'withdraw_refunded':
|
|
133
|
+
if (row.request_hash == null || pendingRedeemByHash.get(row.request_hash) !== sharesDelta) {
|
|
134
|
+
throw new GauntletSDKError('The withdrawal refund does not match its escrow');
|
|
135
|
+
}
|
|
124
136
|
pendingRedeemShares -= sharesDelta;
|
|
125
|
-
|
|
137
|
+
pendingRedeemByHash.delete(row.request_hash);
|
|
126
138
|
break;
|
|
127
139
|
case 'transfer_in':
|
|
128
140
|
case 'transfer_out':
|
|
@@ -131,6 +143,9 @@ export function buildPositionHistory(rows: UserActivity[]): PositionHistory {
|
|
|
131
143
|
throw new GauntletSDKError(`Unknown activity row type "${row.type}"`);
|
|
132
144
|
}
|
|
133
145
|
|
|
146
|
+
if (sharesBalance < 0n || pendingDepositAssets < 0n || pendingRedeemShares < 0n) {
|
|
147
|
+
throw new GauntletSDKError('The activity history produces a negative position balance');
|
|
148
|
+
}
|
|
134
149
|
points.push({
|
|
135
150
|
timestamp: new Date(row.block_timestamp * 1000),
|
|
136
151
|
txHash: row.tx_hash,
|
package/src/attribution/index.ts
CHANGED
|
@@ -8,13 +8,14 @@ export { encodeBuilderCode } from './erc8021';
|
|
|
8
8
|
export type PreparedPayloadWithAttribution = {
|
|
9
9
|
type: string;
|
|
10
10
|
to: Address;
|
|
11
|
+
chainId: number;
|
|
11
12
|
data: Hex;
|
|
12
13
|
account?: Address;
|
|
13
14
|
};
|
|
14
15
|
|
|
15
16
|
export type PreparedTx = {
|
|
16
17
|
payload: PreparedPayloadWithAttribution;
|
|
17
|
-
tx: TxStep;
|
|
18
|
+
tx: TxStep & { chainId: number };
|
|
18
19
|
};
|
|
19
20
|
|
|
20
21
|
/**
|
|
@@ -38,7 +39,8 @@ export async function buildAttribution(client: GauntletClient): Promise<Hex> {
|
|
|
38
39
|
|
|
39
40
|
export async function encodeTransactionWithAttribution(
|
|
40
41
|
client: GauntletClient,
|
|
41
|
-
transaction: TxStep
|
|
42
|
+
transaction: TxStep,
|
|
43
|
+
chainId: number
|
|
42
44
|
): Promise<PreparedTx> {
|
|
43
45
|
const customAttribution = await buildAttribution(client);
|
|
44
46
|
const encodedTx = encodeFunctionData({
|
|
@@ -52,10 +54,12 @@ export async function encodeTransactionWithAttribution(
|
|
|
52
54
|
type: transaction.type,
|
|
53
55
|
account: transaction.account,
|
|
54
56
|
to: transaction.address,
|
|
57
|
+
chainId,
|
|
55
58
|
data: encodedTxWithAttribution,
|
|
56
59
|
},
|
|
57
60
|
tx: {
|
|
58
61
|
...transaction,
|
|
62
|
+
chainId,
|
|
59
63
|
attribution: customAttribution,
|
|
60
64
|
},
|
|
61
65
|
};
|
package/src/client.ts
CHANGED
|
@@ -20,6 +20,9 @@ export enum AttributionMode {
|
|
|
20
20
|
|
|
21
21
|
export type ChainId = string | number;
|
|
22
22
|
|
|
23
|
+
/** The static vault manifest bundled with this SDK release; the GauntletClient default. */
|
|
24
|
+
export const bundledVaultManifest = bundledManifest as VaultManifest;
|
|
25
|
+
|
|
23
26
|
export interface GauntletClientConfig {
|
|
24
27
|
/** Gaia API key, sent as `x-api-key` on `client.api` requests. Anonymous access is rate-limited. */
|
|
25
28
|
apiKey?: string;
|
|
@@ -68,7 +71,7 @@ export class GauntletClient {
|
|
|
68
71
|
/** Typed client for the Gaia REST API (vaults, positions, activity, tvl, prices). */
|
|
69
72
|
readonly api: GauntletApi;
|
|
70
73
|
|
|
71
|
-
private _manifest: VaultManifest =
|
|
74
|
+
private _manifest: VaultManifest = bundledVaultManifest;
|
|
72
75
|
|
|
73
76
|
constructor(config: GauntletClientConfig) {
|
|
74
77
|
this.apiKey = config.apiKey;
|
package/src/constants.ts
CHANGED
|
@@ -17,6 +17,7 @@ export const CHAIN_NAMES: Record<number, string> = {
|
|
|
17
17
|
8453: 'base',
|
|
18
18
|
42161: 'arbitrum',
|
|
19
19
|
10: 'optimism',
|
|
20
|
+
5042: 'arc',
|
|
20
21
|
};
|
|
21
22
|
|
|
22
23
|
// Approximate 3-day block lookback per chain based on avg block time.
|
|
@@ -25,6 +26,7 @@ export const BLOCKS_3_DAYS: Record<number, bigint> = {
|
|
|
25
26
|
8453: 129_600n,
|
|
26
27
|
42161: 1_036_800n,
|
|
27
28
|
10: 129_600n,
|
|
29
|
+
5042: 518_400n,
|
|
28
30
|
};
|
|
29
31
|
export const DEFAULT_BLOCKS_3_DAYS = 129_600n;
|
|
30
32
|
|
package/src/errors.ts
CHANGED
|
@@ -202,3 +202,10 @@ export class InvalidSlippageBPSError extends GauntletSDKError {
|
|
|
202
202
|
this.slippage = slippage;
|
|
203
203
|
}
|
|
204
204
|
}
|
|
205
|
+
|
|
206
|
+
export class InvalidSyncDepositBoundError extends GauntletSDKError {
|
|
207
|
+
constructor() {
|
|
208
|
+
super('Sync deposit minUnitsOut requires explicit sync mode and must be greater than zero');
|
|
209
|
+
this.name = 'InvalidSyncDepositBoundError';
|
|
210
|
+
}
|
|
211
|
+
}
|
package/src/evm/adapters/aera.ts
CHANGED
|
@@ -225,6 +225,7 @@ export const aeraAdapter: EvmProtocolAdapter = {
|
|
|
225
225
|
solverTip = DEFAULT_SOLVER_TIP,
|
|
226
226
|
maxPriceAge = DEFAULT_MAX_PRICE_AGE,
|
|
227
227
|
aeraRuntime,
|
|
228
|
+
minUnitsOut: requestedMinUnitsOut,
|
|
228
229
|
} = params;
|
|
229
230
|
|
|
230
231
|
const runtime = requireAeraRuntime(aeraRuntime);
|
|
@@ -238,17 +239,19 @@ export const aeraAdapter: EvmProtocolAdapter = {
|
|
|
238
239
|
throw new UnsupportedFeatureError('Aera: sync operations on V1');
|
|
239
240
|
}
|
|
240
241
|
|
|
241
|
-
const
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
242
|
+
const minUnitsOut =
|
|
243
|
+
requestedMinUnitsOut ??
|
|
244
|
+
applySlippageDown(
|
|
245
|
+
await getDepositUnitsOut({
|
|
246
|
+
publicClient,
|
|
247
|
+
runtime,
|
|
248
|
+
vault: vault.vaultAddress,
|
|
249
|
+
token: asset.address,
|
|
250
|
+
tokensIn: isAsync ? subtractSolverTip(amount, solverTip) : amount,
|
|
251
|
+
isAsync,
|
|
252
|
+
}),
|
|
253
|
+
slippageBps
|
|
254
|
+
);
|
|
252
255
|
|
|
253
256
|
if (isAsync) {
|
|
254
257
|
const deadline = getRequestDeadline(vault.expirationDays);
|
|
@@ -427,17 +430,35 @@ export const aeraAdapter: EvmProtocolAdapter = {
|
|
|
427
430
|
throw new InvalidWithdrawParamsError();
|
|
428
431
|
}
|
|
429
432
|
|
|
430
|
-
const
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
433
|
+
const tokensOut =
|
|
434
|
+
'amount' in params && params.amount != null
|
|
435
|
+
? params.amount
|
|
436
|
+
: subtractSolverTip(
|
|
437
|
+
await getAsyncRedeemTokenOut(
|
|
438
|
+
publicClient,
|
|
439
|
+
runtime,
|
|
440
|
+
vault.vaultAddress,
|
|
441
|
+
asset.address,
|
|
442
|
+
shares
|
|
443
|
+
),
|
|
444
|
+
solverTip
|
|
445
|
+
);
|
|
446
|
+
minTokenOut = applySlippageDown(tokensOut, slippageBps);
|
|
438
447
|
maxUnitsIn = shares;
|
|
439
448
|
}
|
|
440
449
|
|
|
450
|
+
if (params.maxShares !== undefined) {
|
|
451
|
+
if (
|
|
452
|
+
isAsync ||
|
|
453
|
+
typeof params.maxShares !== 'bigint' ||
|
|
454
|
+
params.maxShares <= 0n ||
|
|
455
|
+
(!isV2ExactTokenWithdraw && shares !== undefined && shares > params.maxShares)
|
|
456
|
+
) {
|
|
457
|
+
throw new InvalidWithdrawParamsError();
|
|
458
|
+
}
|
|
459
|
+
if (maxUnitsIn > params.maxShares) maxUnitsIn = params.maxShares;
|
|
460
|
+
}
|
|
461
|
+
|
|
441
462
|
const steps: EvmTxStep[] = [];
|
|
442
463
|
|
|
443
464
|
if (isAsync) {
|
|
@@ -38,6 +38,8 @@ export interface AdapterDepositParams {
|
|
|
38
38
|
/** Maximum price age passed to async Aera provisioner requests. Defaults to 10 days. */
|
|
39
39
|
maxPriceAge?: bigint;
|
|
40
40
|
aeraRuntime?: AeraRuntimeContracts;
|
|
41
|
+
/** Caller-reviewed minimum output for an explicit synchronous deposit. */
|
|
42
|
+
minUnitsOut?: bigint;
|
|
41
43
|
}
|
|
42
44
|
|
|
43
45
|
export type AdapterWithdrawParams = {
|
|
@@ -55,6 +57,7 @@ export type AdapterWithdrawParams = {
|
|
|
55
57
|
maxPriceAge?: bigint;
|
|
56
58
|
aeraRuntime?: AeraRuntimeContracts;
|
|
57
59
|
syncWithdrawQuote?: SyncWithdrawQuoteBounds;
|
|
60
|
+
maxShares?: bigint;
|
|
58
61
|
} & (
|
|
59
62
|
| { shares: bigint; amount?: never; entireAmount?: never }
|
|
60
63
|
| { amount: bigint; shares?: never; entireAmount?: never }
|
|
@@ -4,11 +4,14 @@ 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';
|
|
@@ -74,7 +77,31 @@ async function getTokenDetails(
|
|
|
74
77
|
});
|
|
75
78
|
}
|
|
76
79
|
|
|
77
|
-
|
|
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
|
+
});
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
async function getDepositQuote({
|
|
78
105
|
client,
|
|
79
106
|
provisioner,
|
|
80
107
|
feeCalculator,
|
|
@@ -94,12 +121,12 @@ async function getDepositUnitsOut({
|
|
|
94
121
|
tokensIn: bigint;
|
|
95
122
|
multiplierIndex: 4 | 6;
|
|
96
123
|
options?: SyncRedeemReadOptions;
|
|
97
|
-
}): Promise<bigint> {
|
|
124
|
+
}): Promise<{ unitsOut: bigint; multiplierBps: bigint }> {
|
|
98
125
|
const tokenDetails = await getTokenDetails(client, provisioner, token, options);
|
|
99
|
-
const
|
|
100
|
-
const adjustedTokensIn = (tokensIn *
|
|
126
|
+
const multiplierBps = BigInt(tokenDetails[multiplierIndex]);
|
|
127
|
+
const adjustedTokensIn = (tokensIn * multiplierBps) / MAX_BPS;
|
|
101
128
|
|
|
102
|
-
|
|
129
|
+
const unitsOut = await convertTokenToUnitsIfActive(
|
|
103
130
|
client,
|
|
104
131
|
feeCalculator,
|
|
105
132
|
feeCalculatorVersion,
|
|
@@ -109,6 +136,8 @@ async function getDepositUnitsOut({
|
|
|
109
136
|
Rounding.Floor,
|
|
110
137
|
options
|
|
111
138
|
);
|
|
139
|
+
|
|
140
|
+
return { unitsOut, multiplierBps };
|
|
112
141
|
}
|
|
113
142
|
|
|
114
143
|
async function getRedeemTokenOut({
|
|
@@ -198,20 +227,22 @@ export interface SyncRedeemRate {
|
|
|
198
227
|
}
|
|
199
228
|
|
|
200
229
|
/**
|
|
201
|
-
* Reads the live sync redeem rate
|
|
202
|
-
*
|
|
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.
|
|
203
234
|
*
|
|
204
235
|
* @throws {StalePriceError} If the oracle price is older than the configured max age,
|
|
205
236
|
* in which case the on-chain sync redeem would revert.
|
|
206
237
|
*/
|
|
207
|
-
export async function
|
|
238
|
+
export async function getSyncRedeemRateContext(
|
|
208
239
|
client: PublicClient,
|
|
209
240
|
provisioner: Address,
|
|
210
241
|
vault: Address,
|
|
211
242
|
token: Address,
|
|
212
243
|
feeCalculator: Address,
|
|
213
244
|
options: SyncRedeemReadOptions = {}
|
|
214
|
-
): Promise<SyncRedeemRate> {
|
|
245
|
+
): Promise<{ rate: SyncRedeemRate; hasPullFundsSubmitData: boolean }> {
|
|
215
246
|
const readContext = await resolveReadContext(client, options);
|
|
216
247
|
const [tokenDetails, syncRedeemDetails, anchorTimestamp] = await client.multicall({
|
|
217
248
|
contracts: [
|
|
@@ -256,12 +287,28 @@ export async function getSyncRedeemRate(
|
|
|
256
287
|
: ((blockTimestamp - priceTimestamp) * maxDynamicPremiumBps + maxPriceAge - 1n) / maxPriceAge;
|
|
257
288
|
|
|
258
289
|
return {
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
290
|
+
rate: {
|
|
291
|
+
baseMultiplierBps,
|
|
292
|
+
dynamicPremiumBps,
|
|
293
|
+
effectiveMultiplierBps: baseMultiplierBps - dynamicPremiumBps,
|
|
294
|
+
},
|
|
295
|
+
hasPullFundsSubmitData: tokenDetails[9] !== zeroAddress,
|
|
262
296
|
};
|
|
263
297
|
}
|
|
264
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
|
+
|
|
265
312
|
async function getSyncRedeemMultiplier(
|
|
266
313
|
client: PublicClient,
|
|
267
314
|
provisioner: Address,
|
|
@@ -315,7 +362,7 @@ export async function getAsyncDepositUnitsOut(
|
|
|
315
362
|
token: Address,
|
|
316
363
|
tokensIn: bigint
|
|
317
364
|
): Promise<bigint> {
|
|
318
|
-
|
|
365
|
+
const quote = await getDepositQuote({
|
|
319
366
|
client,
|
|
320
367
|
provisioner,
|
|
321
368
|
feeCalculator,
|
|
@@ -325,9 +372,10 @@ export async function getAsyncDepositUnitsOut(
|
|
|
325
372
|
tokensIn,
|
|
326
373
|
multiplierIndex: 4,
|
|
327
374
|
});
|
|
375
|
+
return quote.unitsOut;
|
|
328
376
|
}
|
|
329
377
|
|
|
330
|
-
|
|
378
|
+
const getSyncDepositQuote = (
|
|
331
379
|
client: PublicClient,
|
|
332
380
|
provisioner: Address,
|
|
333
381
|
feeCalculator: Address,
|
|
@@ -335,8 +383,8 @@ export async function getSyncDepositUnitsOut(
|
|
|
335
383
|
vault: Address,
|
|
336
384
|
token: Address,
|
|
337
385
|
tokensIn: bigint
|
|
338
|
-
)
|
|
339
|
-
|
|
386
|
+
) =>
|
|
387
|
+
getDepositQuote({
|
|
340
388
|
client,
|
|
341
389
|
provisioner,
|
|
342
390
|
feeCalculator,
|
|
@@ -346,6 +394,66 @@ export async function getSyncDepositUnitsOut(
|
|
|
346
394
|
tokensIn,
|
|
347
395
|
multiplierIndex: 6,
|
|
348
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]);
|
|
349
457
|
}
|
|
350
458
|
|
|
351
459
|
export async function getAsyncRedeemTokenOut(
|
package/src/evm/aeraContracts.ts
CHANGED
|
@@ -17,8 +17,6 @@ import { MAX_BPS } from '../constants';
|
|
|
17
17
|
import { ContractVersion, type EvmVaultDeployment } from './types';
|
|
18
18
|
import { readAtBlock } from './aeraContracts/readOptions';
|
|
19
19
|
|
|
20
|
-
const contractVersionCache = new Map<string, ContractVersion>();
|
|
21
|
-
|
|
22
20
|
const contractVersionAbi = [
|
|
23
21
|
{
|
|
24
22
|
type: 'function',
|
|
@@ -81,10 +79,6 @@ export function applySlippageUp(amount: bigint, slippageBps: number): bigint {
|
|
|
81
79
|
return (amount * (MAX_BPS + BigInt(slippageBps)) + MAX_BPS - 1n) / MAX_BPS;
|
|
82
80
|
}
|
|
83
81
|
|
|
84
|
-
function contractVersionCacheKey(client: PublicClient, address: Address): string {
|
|
85
|
-
return `${client.chain?.id ?? 'unknown'}:${address.toLowerCase()}`;
|
|
86
|
-
}
|
|
87
|
-
|
|
88
82
|
function isVersionUnavailableError(error: unknown): boolean {
|
|
89
83
|
if (!(error instanceof ContractFunctionExecutionError) || error.functionName !== 'version') {
|
|
90
84
|
return false;
|
|
@@ -122,15 +116,35 @@ export function getMultiDepositorVault<T extends Client>(
|
|
|
122
116
|
});
|
|
123
117
|
}
|
|
124
118
|
|
|
119
|
+
// Latest-block versions per client. Historical reads and failed reads are not cached.
|
|
120
|
+
const latestContractVersions = new WeakMap<PublicClient, Map<string, ContractVersion>>();
|
|
121
|
+
|
|
125
122
|
export async function resolveContractVersion(
|
|
126
123
|
client: PublicClient,
|
|
127
124
|
address: Address,
|
|
128
125
|
options: AeraReadOptions = {}
|
|
129
126
|
): Promise<ContractVersion> {
|
|
130
|
-
|
|
131
|
-
const cached = contractVersionCache.get(cacheKey);
|
|
132
|
-
if (cached) return cached;
|
|
127
|
+
if (options.blockNumber !== undefined) return readContractVersion(client, address, options);
|
|
133
128
|
|
|
129
|
+
let versions = latestContractVersions.get(client);
|
|
130
|
+
if (versions === undefined) {
|
|
131
|
+
versions = new Map();
|
|
132
|
+
latestContractVersions.set(client, versions);
|
|
133
|
+
}
|
|
134
|
+
const key = address.toLowerCase();
|
|
135
|
+
const cached = versions.get(key);
|
|
136
|
+
if (cached !== undefined) return cached;
|
|
137
|
+
|
|
138
|
+
const version = await readContractVersion(client, address, options);
|
|
139
|
+
versions.set(key, version);
|
|
140
|
+
return version;
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
async function readContractVersion(
|
|
144
|
+
client: PublicClient,
|
|
145
|
+
address: Address,
|
|
146
|
+
options: AeraReadOptions
|
|
147
|
+
): Promise<ContractVersion> {
|
|
134
148
|
try {
|
|
135
149
|
const versionString = await client.readContract({
|
|
136
150
|
address,
|
|
@@ -138,14 +152,15 @@ export async function resolveContractVersion(
|
|
|
138
152
|
functionName: 'version',
|
|
139
153
|
...readAtBlock(options),
|
|
140
154
|
});
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
return
|
|
155
|
+
if (!/^[12]\./.test(versionString)) {
|
|
156
|
+
throw new UnsupportedFeatureError(`Aera: unsupported contract version ${versionString}`);
|
|
157
|
+
}
|
|
158
|
+
return versionString.startsWith('2.') ? ContractVersion.V2 : ContractVersion.V1;
|
|
145
159
|
} catch (error) {
|
|
146
160
|
if (!isVersionUnavailableError(error)) throw error;
|
|
147
161
|
|
|
148
|
-
|
|
162
|
+
const code = await client.getCode({ address, ...readAtBlock(options) });
|
|
163
|
+
if (code === undefined || code === '0x') throw error;
|
|
149
164
|
return ContractVersion.V1;
|
|
150
165
|
}
|
|
151
166
|
}
|