@gauntlet-xyz/sdk 3.0.1 → 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.
Files changed (117) hide show
  1. package/README.md +34 -3
  2. package/dist/api/activity.d.ts +3 -1
  3. package/dist/api/activity.d.ts.map +1 -1
  4. package/dist/api/activityRows.d.ts +11 -0
  5. package/dist/api/activityRows.d.ts.map +1 -0
  6. package/dist/api/caip.d.ts.map +1 -1
  7. package/dist/api/client.d.ts.map +1 -1
  8. package/dist/api/decimal.d.ts.map +1 -1
  9. package/dist/api/http.d.ts.map +1 -1
  10. package/dist/api/index.js +7 -8
  11. package/dist/api/positionHistory.d.ts.map +1 -1
  12. package/dist/attribution/index.d.ts +5 -2
  13. package/dist/attribution/index.d.ts.map +1 -1
  14. package/dist/{chunk-HC2BS7MK.js → chunk-JJOLVL5V.js} +113 -6
  15. package/dist/chunk-JJOLVL5V.js.map +7 -0
  16. package/dist/{chunk-S2TTA45N.js → chunk-JRSNLXFY.js} +2 -2
  17. package/dist/{chunk-SU6JAKIA.js → chunk-MEKISE2T.js} +131 -47
  18. package/dist/chunk-MEKISE2T.js.map +7 -0
  19. package/dist/{chunk-7TA2OJUK.js → chunk-YQXTLIJA.js} +209 -96
  20. package/dist/chunk-YQXTLIJA.js.map +7 -0
  21. package/dist/cjs/api/activity.d.ts +3 -1
  22. package/dist/cjs/api/activity.d.ts.map +1 -1
  23. package/dist/cjs/api/activity.js +14 -12
  24. package/dist/cjs/api/activity.js.map +2 -2
  25. package/dist/cjs/api/activityRows.d.ts +11 -0
  26. package/dist/cjs/api/activityRows.d.ts.map +1 -0
  27. package/dist/cjs/api/activityRows.js +139 -0
  28. package/dist/cjs/api/activityRows.js.map +7 -0
  29. package/dist/cjs/api/caip.d.ts.map +1 -1
  30. package/dist/cjs/api/caip.js +3 -1
  31. package/dist/cjs/api/caip.js.map +2 -2
  32. package/dist/cjs/api/client.d.ts.map +1 -1
  33. package/dist/cjs/api/client.js +29 -1
  34. package/dist/cjs/api/client.js.map +2 -2
  35. package/dist/cjs/api/decimal.d.ts.map +1 -1
  36. package/dist/cjs/api/decimal.js +1 -0
  37. package/dist/cjs/api/decimal.js.map +2 -2
  38. package/dist/cjs/api/http.d.ts.map +1 -1
  39. package/dist/cjs/api/http.js +1 -0
  40. package/dist/cjs/api/http.js.map +2 -2
  41. package/dist/cjs/api/positionHistory.d.ts.map +1 -1
  42. package/dist/cjs/api/positionHistory.js +17 -4
  43. package/dist/cjs/api/positionHistory.js.map +2 -2
  44. package/dist/cjs/attribution/index.d.ts +5 -2
  45. package/dist/cjs/attribution/index.d.ts.map +1 -1
  46. package/dist/cjs/attribution/index.js +3 -1
  47. package/dist/cjs/attribution/index.js.map +2 -2
  48. package/dist/cjs/evm/adapters/aera.d.ts.map +1 -1
  49. package/dist/cjs/evm/adapters/aera.js +16 -7
  50. package/dist/cjs/evm/adapters/aera.js.map +2 -2
  51. package/dist/cjs/evm/adapters/types.d.ts +1 -0
  52. package/dist/cjs/evm/adapters/types.d.ts.map +1 -1
  53. package/dist/cjs/evm/adapters/types.js.map +1 -1
  54. package/dist/cjs/evm/aeraContracts.d.ts.map +1 -1
  55. package/dist/cjs/evm/aeraContracts.js +21 -11
  56. package/dist/cjs/evm/aeraContracts.js.map +2 -2
  57. package/dist/cjs/evm/deposit.d.ts +3 -2
  58. package/dist/cjs/evm/deposit.d.ts.map +1 -1
  59. package/dist/cjs/evm/deposit.js +40 -10
  60. package/dist/cjs/evm/deposit.js.map +2 -2
  61. package/dist/cjs/evm/depositQuote.d.ts.map +1 -1
  62. package/dist/cjs/evm/depositQuote.js +1 -0
  63. package/dist/cjs/evm/depositQuote.js.map +2 -2
  64. package/dist/cjs/evm/depositReceiverApproval.d.ts.map +1 -1
  65. package/dist/cjs/evm/depositReceiverApproval.js +14 -9
  66. package/dist/cjs/evm/depositReceiverApproval.js.map +2 -2
  67. package/dist/cjs/evm/userCurrentBalance.d.ts +15 -1
  68. package/dist/cjs/evm/userCurrentBalance.d.ts.map +1 -1
  69. package/dist/cjs/evm/userCurrentBalance.js +94 -51
  70. package/dist/cjs/evm/userCurrentBalance.js.map +2 -2
  71. package/dist/cjs/evm/withdraw.d.ts +2 -0
  72. package/dist/cjs/evm/withdraw.d.ts.map +1 -1
  73. package/dist/cjs/evm/withdraw.js +14 -1
  74. package/dist/cjs/evm/withdraw.js.map +2 -2
  75. package/dist/cjs/evm/withdrawQuote.d.ts.map +1 -1
  76. package/dist/cjs/evm/withdrawQuote.js +1 -0
  77. package/dist/cjs/evm/withdrawQuote.js.map +2 -2
  78. package/dist/evm/adapters/aera.d.ts.map +1 -1
  79. package/dist/evm/adapters/types.d.ts +1 -0
  80. package/dist/evm/adapters/types.d.ts.map +1 -1
  81. package/dist/evm/aeraContracts.d.ts.map +1 -1
  82. package/dist/evm/deposit.d.ts +3 -2
  83. package/dist/evm/deposit.d.ts.map +1 -1
  84. package/dist/evm/depositQuote.d.ts.map +1 -1
  85. package/dist/evm/depositReceiverApproval.d.ts.map +1 -1
  86. package/dist/evm/index.js +6 -8
  87. package/dist/evm/userCurrentBalance.d.ts +15 -1
  88. package/dist/evm/userCurrentBalance.d.ts.map +1 -1
  89. package/dist/evm/withdraw.d.ts +2 -0
  90. package/dist/evm/withdraw.d.ts.map +1 -1
  91. package/dist/evm/withdrawQuote.d.ts.map +1 -1
  92. package/dist/index.js +11 -13
  93. package/dist/privy/index.js +2 -2
  94. package/package.json +1 -1
  95. package/src/api/activity.ts +18 -15
  96. package/src/api/activityRows.ts +143 -0
  97. package/src/api/caip.ts +3 -1
  98. package/src/api/client.ts +36 -1
  99. package/src/api/decimal.ts +1 -0
  100. package/src/api/http.ts +1 -0
  101. package/src/api/positionHistory.ts +20 -5
  102. package/src/attribution/index.ts +6 -2
  103. package/src/evm/adapters/aera.ts +26 -8
  104. package/src/evm/adapters/types.ts +1 -0
  105. package/src/evm/aeraContracts.ts +29 -14
  106. package/src/evm/deposit.ts +43 -12
  107. package/src/evm/depositQuote.ts +1 -0
  108. package/src/evm/depositReceiverApproval.ts +14 -9
  109. package/src/evm/userCurrentBalance.ts +144 -60
  110. package/src/evm/withdraw.ts +20 -1
  111. package/src/evm/withdrawQuote.ts +1 -0
  112. package/dist/chunk-7TA2OJUK.js.map +0 -7
  113. package/dist/chunk-HC2BS7MK.js.map +0 -7
  114. package/dist/chunk-STIV2CC4.js +0 -57
  115. package/dist/chunk-STIV2CC4.js.map +0 -7
  116. package/dist/chunk-SU6JAKIA.js.map +0 -7
  117. /package/dist/{chunk-S2TTA45N.js.map → chunk-JRSNLXFY.js.map} +0 -0
@@ -20,6 +20,8 @@ export type EvmWithdrawParams = {
20
20
  * Supplying bounds implies `depositMode: 'sync'`; explicit async requests are rejected.
21
21
  */
22
22
  syncWithdrawQuote?: SyncWithdrawQuoteBounds;
23
+ /** Limit a sync withdrawal to the shares reviewed before a rate change. */
24
+ maxShares?: bigint;
23
25
  } & ({
24
26
  shares: bigint;
25
27
  amount?: never;
@@ -1 +1 @@
1
- {"version":3,"file":"withdraw.d.ts","sourceRoot":"","sources":["../../../src/evm/withdraw.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AACpC,OAAO,KAAK,EAAE,cAAc,EAAE,qBAAkB;AAEhD,OAAO,KAAK,EAAE,uBAAuB,EAAE,2BAAwB;AAE/D,OAAO,EAAoC,UAAU,EAAE,gCAAuB;AAyB9E,MAAM,MAAM,iBAAiB,GAAG;IAC9B,OAAO,EAAE,MAAM,CAAC;IAEhB,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,mGAAmG;IACnG,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,2EAA2E;IAC3E,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,2EAA2E;IAC3E,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,wFAAwF;IACxF,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;OAGG;IACH,iBAAiB,CAAC,EAAE,uBAAuB,CAAC;CAC7C,GAAG,CACA;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,KAAK,CAAC;IAAC,YAAY,CAAC,EAAE,KAAK,CAAA;CAAE,GACxD;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,KAAK,CAAC;IAAC,YAAY,CAAC,EAAE,KAAK,CAAA;CAAE,GACxD;IAAE,OAAO,CAAC,EAAE,OAAO,CAAC;IAAC,YAAY,EAAE,IAAI,CAAC;IAAC,MAAM,CAAC,EAAE,KAAK,CAAC;IAAC,MAAM,CAAC,EAAE,KAAK,CAAA;CAAE,CAC5E,CAAC;AA+EF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AACH,wBAAsB,aAAa,CACjC,MAAM,EAAE,cAAc,EACtB,MAAM,EAAE,iBAAiB,GACxB,OAAO,CAAC,UAAU,EAAE,CAAC,CAyGvB"}
1
+ {"version":3,"file":"withdraw.d.ts","sourceRoot":"","sources":["../../../src/evm/withdraw.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AACpC,OAAO,KAAK,EAAE,cAAc,EAAE,qBAAkB;AAEhD,OAAO,KAAK,EAAE,uBAAuB,EAAE,2BAAwB;AAE/D,OAAO,EAAoC,UAAU,EAAE,gCAAuB;AA0B9E,MAAM,MAAM,iBAAiB,GAAG;IAC9B,OAAO,EAAE,MAAM,CAAC;IAEhB,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,mGAAmG;IACnG,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,2EAA2E;IAC3E,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,2EAA2E;IAC3E,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,wFAAwF;IACxF,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;OAGG;IACH,iBAAiB,CAAC,EAAE,uBAAuB,CAAC;IAC5C,2EAA2E;IAC3E,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,GAAG,CACA;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,KAAK,CAAC;IAAC,YAAY,CAAC,EAAE,KAAK,CAAA;CAAE,GACxD;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,KAAK,CAAC;IAAC,YAAY,CAAC,EAAE,KAAK,CAAA;CAAE,GACxD;IAAE,OAAO,CAAC,EAAE,OAAO,CAAC;IAAC,YAAY,EAAE,IAAI,CAAC;IAAC,MAAM,CAAC,EAAE,KAAK,CAAC;IAAC,MAAM,CAAC,EAAE,KAAK,CAAA;CAAE,CAC5E,CAAC;AAwFF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AACH,wBAAsB,aAAa,CACjC,MAAM,EAAE,cAAc,EACtB,MAAM,EAAE,iBAAiB,GACxB,OAAO,CAAC,UAAU,EAAE,CAAC,CAgHvB"}
@@ -30,6 +30,12 @@ var import_constants = require("../constants");
30
30
  var import_operationMode = require("./operationMode");
31
31
  var import_types = require("./types");
32
32
  function validateWithdrawParams(params) {
33
+ if (params.entireAmount !== void 0 && typeof params.entireAmount !== "boolean") {
34
+ throw new import_errors.InvalidWithdrawParamsError();
35
+ }
36
+ if (params.amount !== void 0 && params.amount < 0n || params.shares !== void 0 && params.shares < 0n) {
37
+ throw new import_errors.InvalidWithdrawParamsError();
38
+ }
33
39
  const modes = [
34
40
  "amount" in params && params.amount != null,
35
41
  "shares" in params && params.shares != null,
@@ -75,6 +81,7 @@ function validateSyncWithdrawQuote({
75
81
  }
76
82
  }
77
83
  async function getWithdrawTx(client, params) {
84
+ params = structuredClone(params);
78
85
  validateWithdrawParams(params);
79
86
  if (params.slippageBps !== void 0 && (!Number.isInteger(params.slippageBps) || params.slippageBps < 0 || params.slippageBps > Number(import_constants.MAX_BPS))) {
80
87
  throw new import_errors.InvalidSlippageBPSError(params.slippageBps);
@@ -90,6 +97,9 @@ async function getWithdrawTx(client, params) {
90
97
  }
91
98
  }
92
99
  const { vault, protocol } = resolved;
100
+ if (params.maxShares !== void 0 && protocol !== "aera") {
101
+ throw new import_errors.UnsupportedFeatureError("maxShares requires an Aera sync withdrawal");
102
+ }
93
103
  const token = vault.supplyToken.length > 1 ? vault.supplyToken.find((tInfo) => tInfo.symbol === params.assetSymbol) : vault.supplyToken[0];
94
104
  if (token === void 0) {
95
105
  throw new import_errors.UnsupportedAssetError(params.assetSymbol ?? "unknown", params.vaultId);
@@ -147,12 +157,15 @@ async function getWithdrawTx(client, params) {
147
157
  maxPriceAge: params.maxPriceAge,
148
158
  aeraRuntime,
149
159
  syncWithdrawQuote: params.syncWithdrawQuote,
160
+ maxShares: params.maxShares,
150
161
  ..."shares" in params && params.shares != null ? { shares: params.shares } : {},
151
162
  ..."amount" in params && params.amount != null ? { amount: params.amount } : {},
152
163
  ..."entireAmount" in params && params.entireAmount ? { entireAmount: true } : {}
153
164
  };
154
165
  const steps = await adapter.buildWithdraw(withdrawParams);
155
- return await Promise.all(steps.map((step) => (0, import_attribution.encodeTransactionWithAttribution)(client, step)));
166
+ return await Promise.all(
167
+ steps.map((step) => (0, import_attribution.encodeTransactionWithAttribution)(client, step, chainId))
168
+ );
156
169
  }
157
170
  // Annotate the CommonJS export names for ESM import in node:
158
171
  0 && (module.exports = {
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/evm/withdraw.ts"],
4
- "sourcesContent": ["import type { Address } from 'viem';\nimport type { GauntletClient } from '../client';\nimport type { AdapterWithdrawParams } from './adapters/types';\nimport type { SyncWithdrawQuoteBounds } from './withdrawQuote';\nimport { getAdapter } from './adapters';\nimport { encodeTransactionWithAttribution, PreparedTx } from '../attribution';\nimport {\n AccountMismatchError,\n AccountRequiredError,\n VaultNotFoundError,\n UnsupportedAssetError,\n InvalidSlippageBPSError,\n InvalidWithdrawParamsError,\n} from '../errors';\nimport {\n requireAeraSyncRedeemRuntime,\n resolveAeraRuntimeContracts,\n resolveAeraTokenModeSupport,\n type AeraRuntimeContracts,\n} from './aeraContracts';\nimport { resolveVault } from './vaults';\nimport { DEFAULT_BPS, MAX_BPS } from '../constants';\nimport {\n parseOperationMode,\n resolveOperationMode,\n resolveSyncOnlyOperationMode,\n type OperationMode,\n} from './operationMode';\nimport { ContractVersion } from './types';\n\nexport type EvmWithdrawParams = {\n vaultId: string;\n // Required for multichain vaults, will default to base\n chainId?: number;\n // Required for multiasset vaults, not utilized yet\n assetSymbol?: string;\n /** Request async (queued) or sync withdraw. Availability is read from live vault configuration. */\n depositMode?: string;\n // So a developer is able to specify a separate receiver than the tx sender\n receiver?: Address;\n /** Slippage tolerance in basis points (e.g. 100 = 1%). Defaults to 100. */\n slippageBps?: number;\n /** Solver tip passed to async Aera provisioner requests. Defaults to 0. */\n solverTip?: bigint;\n /** Maximum price age passed to async Aera provisioner requests. Defaults to 10 days. */\n maxPriceAge?: bigint;\n /**\n * Current sync quote bounds to pin instant withdraw transaction construction.\n * Supplying bounds implies `depositMode: 'sync'`; explicit async requests are rejected.\n */\n syncWithdrawQuote?: SyncWithdrawQuoteBounds;\n} & (\n | { shares: bigint; amount?: never; entireAmount?: never }\n | { amount: bigint; shares?: never; entireAmount?: never }\n | { account?: Address; entireAmount: true; shares?: never; amount?: never }\n);\n\nfunction validateWithdrawParams(params: EvmWithdrawParams) {\n const modes = [\n 'amount' in params && params.amount != null,\n 'shares' in params && params.shares != null,\n 'entireAmount' in params && params.entireAmount === true,\n ].filter(Boolean).length;\n\n if (modes !== 1) throw new InvalidWithdrawParamsError();\n}\n\nfunction sameAddress(left: Address, right: Address): boolean {\n return left.toLowerCase() === right.toLowerCase();\n}\n\nfunction validateSyncWithdrawQuote({\n params,\n account,\n chainId,\n slippageBps,\n tokenAddress,\n}: {\n params: EvmWithdrawParams;\n account: Address;\n chainId: number;\n slippageBps: number;\n tokenAddress: Address;\n}) {\n const quote = params.syncWithdrawQuote;\n if (quote === undefined) return;\n\n const { context } = quote;\n if (\n context.vaultId !== params.vaultId ||\n context.chainId !== chainId ||\n !sameAddress(context.tokenAddress, tokenAddress) ||\n context.slippageBps !== slippageBps\n ) {\n throw new InvalidWithdrawParamsError();\n }\n\n if (context.account !== undefined && !sameAddress(context.account, account)) {\n throw new InvalidWithdrawParamsError();\n }\n\n switch (context.request.mode) {\n case 'amount':\n if (\n quote.kind !== 'withdraw' ||\n !('amount' in params && params.amount != null) ||\n context.request.amount !== params.amount ||\n quote.tokensOut !== params.amount\n ) {\n throw new InvalidWithdrawParamsError();\n }\n return;\n case 'shares':\n if (\n quote.kind !== 'redeem' ||\n !('shares' in params && params.shares != null) ||\n context.request.shares !== params.shares ||\n quote.shares !== params.shares\n ) {\n throw new InvalidWithdrawParamsError();\n }\n return;\n case 'entireAmount':\n if (\n quote.kind !== 'redeem' ||\n !('entireAmount' in params && params.entireAmount) ||\n !sameAddress(context.request.account, account)\n ) {\n throw new InvalidWithdrawParamsError();\n }\n return;\n }\n}\n\n/**\n * Builds the ordered list of EVM transactions required to withdraw from a Gauntlet vault.\n *\n * Specify the withdrawal amount as one of: `shares` (vault units), `amount` (underlying\n * token amount), or `entireAmount: true` (full balance). Returns an ERC-20 approval\n * (only when needed for async redeem) followed by the withdraw or async redeem request,\n * each returned as a `PreparedTx` ready to be signed and sent.\n *\n * @param client - A configured `GauntletClient` instance with an EVM public client and wallet.\n * @param params - Withdrawal parameters including the vault identifier and exactly one of\n * `shares`, `amount`, or `entireAmount`, plus optional chain, asset symbol, deposit mode,\n * and receiver address.\n * @returns Ordered array of prepared transactions to execute in sequence.\n *\n * @throws {VaultNotFoundError} If the vault ID is not found in the manifest.\n * @throws {AccountRequiredError} If no wallet account is set on the client.\n * @throws {UnsupportedDepositModeError} If the requested withdrawal mode is not supported.\n * @throws {UnsupportedAssetError} If the specified asset symbol is not accepted by the vault.\n *\n * @example\n * ```ts\n * // Withdraw by token amount\n * const txs = await getWithdrawTx(client, {\n * vaultId: 'baseUsdcPrime',\n * amount: 50_000_000n, // 50 USDC (6 decimals)\n * });\n *\n * // Withdraw entire balance\n * const txs = await getWithdrawTx(client, {\n * vaultId: 'baseUsdcPrime',\n * entireAmount: true,\n * account: walletAddress,\n * });\n * ```\n */\nexport async function getWithdrawTx(\n client: GauntletClient,\n params: EvmWithdrawParams\n): Promise<PreparedTx[]> {\n validateWithdrawParams(params);\n\n if (\n params.slippageBps !== undefined &&\n (!Number.isInteger(params.slippageBps) ||\n params.slippageBps < 0 ||\n params.slippageBps > Number(MAX_BPS))\n ) {\n throw new InvalidSlippageBPSError(params.slippageBps);\n }\n\n const resolved = await resolveVault(client, params.vaultId, params.chainId);\n if (!resolved) throw new VaultNotFoundError(params.vaultId);\n\n const chainId = params.chainId ?? resolved.vault.chainId;\n\n const account = client.wallet?.account?.address;\n if (!account) throw new AccountRequiredError();\n if ('entireAmount' in params && params.entireAmount && params.account !== undefined) {\n if (!sameAddress(params.account, account)) {\n throw new AccountMismatchError(account, params.account);\n }\n }\n\n const { vault, protocol } = resolved;\n\n const token =\n vault.supplyToken.length > 1\n ? vault.supplyToken.find((tInfo) => tInfo.symbol === params.assetSymbol)\n : vault.supplyToken[0];\n\n if (token === undefined) {\n throw new UnsupportedAssetError(params.assetSymbol ?? 'unknown', params.vaultId);\n }\n\n const adapter = getAdapter(protocol);\n const publicClient = client.getPublicClient(chainId);\n const requestedWithdrawMode = parseOperationMode(params.vaultId, params.depositMode);\n const slippageBps =\n params.slippageBps ?? params.syncWithdrawQuote?.context.slippageBps ?? DEFAULT_BPS;\n let modifiedDepositMode: OperationMode;\n let aeraRuntime: AeraRuntimeContracts | undefined;\n\n if (params.syncWithdrawQuote !== undefined) {\n if (protocol !== 'aera' || requestedWithdrawMode === 'async') {\n throw new InvalidWithdrawParamsError();\n }\n\n validateSyncWithdrawQuote({\n params,\n account,\n chainId,\n slippageBps,\n tokenAddress: token.address,\n });\n }\n\n if (protocol === 'aera') {\n aeraRuntime = await resolveAeraRuntimeContracts(publicClient, vault);\n if (\n aeraRuntime.provisioner.version === ContractVersion.V2 &&\n (requestedWithdrawMode === 'sync' || params.syncWithdrawQuote !== undefined)\n ) {\n requireAeraSyncRedeemRuntime(aeraRuntime);\n }\n const tokenModeSupport = await resolveAeraTokenModeSupport(\n publicClient,\n aeraRuntime,\n token.address,\n { includeSyncModes: requestedWithdrawMode !== 'async' }\n );\n modifiedDepositMode = resolveOperationMode(\n params.vaultId,\n params.syncWithdrawQuote !== undefined ? 'sync' : requestedWithdrawMode,\n {\n async: tokenModeSupport.asyncRedeem,\n sync: tokenModeSupport.syncRedeem,\n }\n );\n if (modifiedDepositMode === 'sync') requireAeraSyncRedeemRuntime(aeraRuntime);\n } else {\n modifiedDepositMode = resolveSyncOnlyOperationMode(params.vaultId, requestedWithdrawMode);\n }\n\n const withdrawParams = {\n vault,\n receiver: params.receiver ?? account,\n account,\n async: modifiedDepositMode === 'async',\n asset: token,\n publicClient,\n slippageBps,\n solverTip: params.solverTip,\n maxPriceAge: params.maxPriceAge,\n aeraRuntime,\n syncWithdrawQuote: params.syncWithdrawQuote,\n ...('shares' in params && params.shares != null ? { shares: params.shares } : {}),\n ...('amount' in params && params.amount != null ? { amount: params.amount } : {}),\n ...('entireAmount' in params && params.entireAmount ? { entireAmount: true as const } : {}),\n };\n\n const steps = await adapter.buildWithdraw(withdrawParams as AdapterWithdrawParams);\n\n return await Promise.all(steps.map((step) => encodeTransactionWithAttribution(client, step)));\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import type { Address } from 'viem';\nimport type { GauntletClient } from '../client';\nimport type { AdapterWithdrawParams } from './adapters/types';\nimport type { SyncWithdrawQuoteBounds } from './withdrawQuote';\nimport { getAdapter } from './adapters';\nimport { encodeTransactionWithAttribution, PreparedTx } from '../attribution';\nimport {\n AccountMismatchError,\n AccountRequiredError,\n VaultNotFoundError,\n UnsupportedAssetError,\n UnsupportedFeatureError,\n InvalidSlippageBPSError,\n InvalidWithdrawParamsError,\n} from '../errors';\nimport {\n requireAeraSyncRedeemRuntime,\n resolveAeraRuntimeContracts,\n resolveAeraTokenModeSupport,\n type AeraRuntimeContracts,\n} from './aeraContracts';\nimport { resolveVault } from './vaults';\nimport { DEFAULT_BPS, MAX_BPS } from '../constants';\nimport {\n parseOperationMode,\n resolveOperationMode,\n resolveSyncOnlyOperationMode,\n type OperationMode,\n} from './operationMode';\nimport { ContractVersion } from './types';\n\nexport type EvmWithdrawParams = {\n vaultId: string;\n // Required for multichain vaults, will default to base\n chainId?: number;\n // Required for multiasset vaults, not utilized yet\n assetSymbol?: string;\n /** Request async (queued) or sync withdraw. Availability is read from live vault configuration. */\n depositMode?: string;\n // So a developer is able to specify a separate receiver than the tx sender\n receiver?: Address;\n /** Slippage tolerance in basis points (e.g. 100 = 1%). Defaults to 100. */\n slippageBps?: number;\n /** Solver tip passed to async Aera provisioner requests. Defaults to 0. */\n solverTip?: bigint;\n /** Maximum price age passed to async Aera provisioner requests. Defaults to 10 days. */\n maxPriceAge?: bigint;\n /**\n * Current sync quote bounds to pin instant withdraw transaction construction.\n * Supplying bounds implies `depositMode: 'sync'`; explicit async requests are rejected.\n */\n syncWithdrawQuote?: SyncWithdrawQuoteBounds;\n /** Limit a sync withdrawal to the shares reviewed before a rate change. */\n maxShares?: bigint;\n} & (\n | { shares: bigint; amount?: never; entireAmount?: never }\n | { amount: bigint; shares?: never; entireAmount?: never }\n | { account?: Address; entireAmount: true; shares?: never; amount?: never }\n);\n\nfunction validateWithdrawParams(params: EvmWithdrawParams) {\n if (params.entireAmount !== undefined && typeof params.entireAmount !== 'boolean') {\n throw new InvalidWithdrawParamsError();\n }\n if (\n (params.amount !== undefined && params.amount < 0n) ||\n (params.shares !== undefined && params.shares < 0n)\n ) {\n throw new InvalidWithdrawParamsError();\n }\n const modes = [\n 'amount' in params && params.amount != null,\n 'shares' in params && params.shares != null,\n 'entireAmount' in params && params.entireAmount === true,\n ].filter(Boolean).length;\n\n if (modes !== 1) throw new InvalidWithdrawParamsError();\n}\n\nfunction sameAddress(left: Address, right: Address): boolean {\n return left.toLowerCase() === right.toLowerCase();\n}\n\nfunction validateSyncWithdrawQuote({\n params,\n account,\n chainId,\n slippageBps,\n tokenAddress,\n}: {\n params: EvmWithdrawParams;\n account: Address;\n chainId: number;\n slippageBps: number;\n tokenAddress: Address;\n}) {\n const quote = params.syncWithdrawQuote;\n if (quote === undefined) return;\n\n const { context } = quote;\n if (\n context.vaultId !== params.vaultId ||\n context.chainId !== chainId ||\n !sameAddress(context.tokenAddress, tokenAddress) ||\n context.slippageBps !== slippageBps\n ) {\n throw new InvalidWithdrawParamsError();\n }\n\n if (context.account !== undefined && !sameAddress(context.account, account)) {\n throw new InvalidWithdrawParamsError();\n }\n\n switch (context.request.mode) {\n case 'amount':\n if (\n quote.kind !== 'withdraw' ||\n !('amount' in params && params.amount != null) ||\n context.request.amount !== params.amount ||\n quote.tokensOut !== params.amount\n ) {\n throw new InvalidWithdrawParamsError();\n }\n return;\n case 'shares':\n if (\n quote.kind !== 'redeem' ||\n !('shares' in params && params.shares != null) ||\n context.request.shares !== params.shares ||\n quote.shares !== params.shares\n ) {\n throw new InvalidWithdrawParamsError();\n }\n return;\n case 'entireAmount':\n if (\n quote.kind !== 'redeem' ||\n !('entireAmount' in params && params.entireAmount) ||\n !sameAddress(context.request.account, account)\n ) {\n throw new InvalidWithdrawParamsError();\n }\n return;\n }\n}\n\n/**\n * Builds the ordered list of EVM transactions required to withdraw from a Gauntlet vault.\n *\n * Specify the withdrawal amount as one of: `shares` (vault units), `amount` (underlying\n * token amount), or `entireAmount: true` (full balance). Returns an ERC-20 approval\n * (only when needed for async redeem) followed by the withdraw or async redeem request,\n * each returned as a `PreparedTx` ready to be signed and sent.\n *\n * @param client - A configured `GauntletClient` instance with an EVM public client and wallet.\n * @param params - Withdrawal parameters including the vault identifier and exactly one of\n * `shares`, `amount`, or `entireAmount`, plus optional chain, asset symbol, deposit mode,\n * and receiver address.\n * @returns Ordered array of prepared transactions to execute in sequence.\n *\n * @throws {VaultNotFoundError} If the vault ID is not found in the manifest.\n * @throws {AccountRequiredError} If no wallet account is set on the client.\n * @throws {UnsupportedDepositModeError} If the requested withdrawal mode is not supported.\n * @throws {UnsupportedAssetError} If the specified asset symbol is not accepted by the vault.\n *\n * @example\n * ```ts\n * // Withdraw by token amount\n * const txs = await getWithdrawTx(client, {\n * vaultId: 'baseUsdcPrime',\n * amount: 50_000_000n, // 50 USDC (6 decimals)\n * });\n *\n * // Withdraw entire balance\n * const txs = await getWithdrawTx(client, {\n * vaultId: 'baseUsdcPrime',\n * entireAmount: true,\n * account: walletAddress,\n * });\n * ```\n */\nexport async function getWithdrawTx(\n client: GauntletClient,\n params: EvmWithdrawParams\n): Promise<PreparedTx[]> {\n params = structuredClone(params);\n validateWithdrawParams(params);\n\n if (\n params.slippageBps !== undefined &&\n (!Number.isInteger(params.slippageBps) ||\n params.slippageBps < 0 ||\n params.slippageBps > Number(MAX_BPS))\n ) {\n throw new InvalidSlippageBPSError(params.slippageBps);\n }\n\n const resolved = await resolveVault(client, params.vaultId, params.chainId);\n if (!resolved) throw new VaultNotFoundError(params.vaultId);\n\n const chainId = params.chainId ?? resolved.vault.chainId;\n\n const account = client.wallet?.account?.address;\n if (!account) throw new AccountRequiredError();\n if ('entireAmount' in params && params.entireAmount && params.account !== undefined) {\n if (!sameAddress(params.account, account)) {\n throw new AccountMismatchError(account, params.account);\n }\n }\n\n const { vault, protocol } = resolved;\n if (params.maxShares !== undefined && protocol !== 'aera') {\n throw new UnsupportedFeatureError('maxShares requires an Aera sync withdrawal');\n }\n\n const token =\n vault.supplyToken.length > 1\n ? vault.supplyToken.find((tInfo) => tInfo.symbol === params.assetSymbol)\n : vault.supplyToken[0];\n\n if (token === undefined) {\n throw new UnsupportedAssetError(params.assetSymbol ?? 'unknown', params.vaultId);\n }\n\n const adapter = getAdapter(protocol);\n const publicClient = client.getPublicClient(chainId);\n const requestedWithdrawMode = parseOperationMode(params.vaultId, params.depositMode);\n const slippageBps =\n params.slippageBps ?? params.syncWithdrawQuote?.context.slippageBps ?? DEFAULT_BPS;\n let modifiedDepositMode: OperationMode;\n let aeraRuntime: AeraRuntimeContracts | undefined;\n\n if (params.syncWithdrawQuote !== undefined) {\n if (protocol !== 'aera' || requestedWithdrawMode === 'async') {\n throw new InvalidWithdrawParamsError();\n }\n\n validateSyncWithdrawQuote({\n params,\n account,\n chainId,\n slippageBps,\n tokenAddress: token.address,\n });\n }\n\n if (protocol === 'aera') {\n aeraRuntime = await resolveAeraRuntimeContracts(publicClient, vault);\n if (\n aeraRuntime.provisioner.version === ContractVersion.V2 &&\n (requestedWithdrawMode === 'sync' || params.syncWithdrawQuote !== undefined)\n ) {\n requireAeraSyncRedeemRuntime(aeraRuntime);\n }\n const tokenModeSupport = await resolveAeraTokenModeSupport(\n publicClient,\n aeraRuntime,\n token.address,\n { includeSyncModes: requestedWithdrawMode !== 'async' }\n );\n modifiedDepositMode = resolveOperationMode(\n params.vaultId,\n params.syncWithdrawQuote !== undefined ? 'sync' : requestedWithdrawMode,\n {\n async: tokenModeSupport.asyncRedeem,\n sync: tokenModeSupport.syncRedeem,\n }\n );\n if (modifiedDepositMode === 'sync') requireAeraSyncRedeemRuntime(aeraRuntime);\n } else {\n modifiedDepositMode = resolveSyncOnlyOperationMode(params.vaultId, requestedWithdrawMode);\n }\n\n const withdrawParams = {\n vault,\n receiver: params.receiver ?? account,\n account,\n async: modifiedDepositMode === 'async',\n asset: token,\n publicClient,\n slippageBps,\n solverTip: params.solverTip,\n maxPriceAge: params.maxPriceAge,\n aeraRuntime,\n syncWithdrawQuote: params.syncWithdrawQuote,\n maxShares: params.maxShares,\n ...('shares' in params && params.shares != null ? { shares: params.shares } : {}),\n ...('amount' in params && params.amount != null ? { amount: params.amount } : {}),\n ...('entireAmount' in params && params.entireAmount ? { entireAmount: true as const } : {}),\n };\n\n const steps = await adapter.buildWithdraw(withdrawParams as AdapterWithdrawParams);\n\n return await Promise.all(\n steps.map((step) => encodeTransactionWithAttribution(client, step, chainId))\n );\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -1 +1 @@
1
- {"version":3,"file":"withdrawQuote.d.ts","sourceRoot":"","sources":["../../../src/evm/withdrawQuote.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"withdrawQuote.d.ts","sourceRoot":"","sources":["../../../src/evm/withdrawQuote.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AACpC,OAAO,KAAK,EAAE,cAAc,EAAE,qBAAkB;AAwBhD,OAAO,EAQL,KAAK,cAAc,EACpB,8BAA2B;AAG5B,8EAA8E;AAC9E,MAAM,WAAW,oBAAoB;IACnC,wEAAwE;IACxE,iBAAiB,EAAE,MAAM,CAAC;IAC1B,gEAAgE;IAChE,sBAAsB,EAAE,MAAM,CAAC;IAC/B,sEAAsE;IACtE,kBAAkB,EAAE,MAAM,CAAC;IAC3B,0DAA0D;IAC1D,eAAe,EAAE,MAAM,CAAC;IACxB,wFAAwF;IACxF,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,mFAAmF;IACnF,gBAAgB,EAAE,MAAM,CAAC;IACzB,8FAA8F;IAC9F,eAAe,EAAE,OAAO,CAAC;CAC1B;AAED,MAAM,MAAM,wBAAwB,GAChC;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAClC;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAClC;IAAE,IAAI,EAAE,cAAc,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,CAAC;AAE/C,MAAM,WAAW,wBAAwB;IACvC,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,OAAO,CAAC;IACtB,gFAAgF;IAChF,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,wEAAwE;IACxE,WAAW,EAAE,MAAM,CAAC;IACpB,+CAA+C;IAC/C,WAAW,EAAE,MAAM,CAAC;IACpB,qDAAqD;IACrD,OAAO,EAAE,wBAAwB,CAAC;CACnC;AAED,UAAU,wBAAwB;IAChC,qFAAqF;IACrF,MAAM,EAAE,MAAM,CAAC;IACf,oFAAoF;IACpF,UAAU,EAAE,MAAM,CAAC;IACnB,qFAAqF;IACrF,SAAS,EAAE,MAAM,CAAC;IAClB,2FAA2F;IAC3F,YAAY,EAAE,MAAM,CAAC;IACrB,yFAAyF;IACzF,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,4EAA4E;IAC5E,IAAI,EAAE,cAAc,CAAC;IACrB,QAAQ,EAAE,oBAAoB,CAAC;IAC/B,kGAAkG;IAClG,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,8EAA8E;IAC9E,OAAO,EAAE,wBAAwB,CAAC;CACnC;AAED,6EAA6E;AAC7E,MAAM,MAAM,uBAAuB,GAC/B;IACE,IAAI,EAAE,QAAQ,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,wBAAwB,CAAC;CACnC,GACD;IACE,IAAI,EAAE,UAAU,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,wBAAwB,CAAC;CACnC,CAAC;AAEN;;;;;;GAMG;AACH,MAAM,MAAM,iBAAiB,GACzB,CAAC,wBAAwB,GAAG;IAAE,IAAI,EAAE,QAAQ,CAAA;CAAE,CAAC,GAC/C,CAAC,wBAAwB,GAAG;IAAE,IAAI,EAAE,UAAU,CAAA;CAAE,CAAC,CAAC;AAEtD,MAAM,MAAM,sBAAsB,GAAG;IACnC,OAAO,EAAE,MAAM,CAAC;IAChB,gGAAgG;IAChG,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,sCAAsC;IACtC,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,CAAC;AAEF,KAAK,2BAA2B,GAAG,sBAAsB,GAAG;IAC1D,qFAAqF;IACrF,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,CAAC;AAEF,MAAM,MAAM,uBAAuB,GAC/B,CAAC,2BAA2B,GAAG;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,KAAK,CAAC;IAAC,YAAY,CAAC,EAAE,KAAK,CAAA;CAAE,CAAC,GACxF,CAAC,2BAA2B,GAAG;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,KAAK,CAAC;IAAC,YAAY,CAAC,EAAE,KAAK,CAAA;CAAE,CAAC,GACxF,CAAC,2BAA2B,GAAG;IAC7B,OAAO,EAAE,OAAO,CAAC;IACjB,YAAY,EAAE,IAAI,CAAC;IACnB,MAAM,CAAC,EAAE,KAAK,CAAC;IACf,MAAM,CAAC,EAAE,KAAK,CAAC;CAChB,CAAC,CAAC;AAwEP,iGAAiG;AACjG,wBAAsB,mBAAmB,CACvC,MAAM,EAAE,cAAc,EACtB,MAAM,EAAE,sBAAsB,GAC7B,OAAO,CAAC,cAAc,CAAC,CAezB;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAsB,oBAAoB,CACxC,MAAM,EAAE,cAAc,EACtB,MAAM,EAAE,uBAAuB,GAC9B,OAAO,CAAC,iBAAiB,CAAC,CAkL5B"}
@@ -96,6 +96,7 @@ async function getSyncWithdrawRate(client, params) {
96
96
  );
97
97
  }
98
98
  async function getSyncWithdrawQuote(client, params) {
99
+ params = structuredClone(params);
99
100
  validateSyncWithdrawQuoteParams(params);
100
101
  if (params.slippageBps !== void 0 && (!Number.isInteger(params.slippageBps) || params.slippageBps < 0 || params.slippageBps > Number(import_constants.MAX_BPS))) {
101
102
  throw new import_errors.InvalidSlippageBPSError(params.slippageBps);
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/evm/withdrawQuote.ts"],
4
- "sourcesContent": ["import type { Address } from 'viem';\nimport type { GauntletClient } from '../client';\nimport {\n AccountRequiredError,\n InvalidSlippageBPSError,\n InvalidWithdrawParamsError,\n requireNonZeroSyncWithdrawBound,\n UnsupportedAssetError,\n UnsupportedFeatureError,\n VaultNotFoundError,\n} from '../errors';\nimport { DEFAULT_BPS, MAX_BPS } from '../constants';\nimport { resolveVault } from './vaults';\nimport {\n applySlippageDown,\n applySlippageUp,\n requireAeraSyncRedeemRuntime,\n resolveAeraRuntimeContracts,\n resolveAeraTokenModeSupport,\n} from './aeraContracts';\nimport { multiDepositorVaultAbi } from './abis/multiDepositorVault';\nimport {\n convertNumeraireToToken,\n convertTokenToNumeraire,\n} from './aeraContracts/priceAndFeeCalculator';\nimport {\n getKnownSyncRedeemLiquidityTokens,\n getSyncRedeemEpochState,\n getSyncRedeemRate,\n getSyncRedeemRateContext,\n getSyncRedeemTokenOut,\n getSyncWithdrawUnitsIn,\n getUserUnitsRefundableUntil,\n type SyncRedeemRate,\n} from './aeraContracts/v2';\nimport { resolveOperationMode } from './operationMode';\n\n/** Epoch-cap accounting plus any liquid-token balance known to the caller. */\nexport interface SyncWithdrawCapacity {\n /** Effective epoch cap (min of relative and absolute), in numeraire. */\n epochCapNumeraire: bigint;\n /** Numeraire already redeemed globally in the current epoch. */\n epochRedeemedNumeraire: bigint;\n /** Remaining global sync redeem capacity this epoch, in numeraire. */\n remainingNumeraire: bigint;\n /** Remaining capacity expressed in the withdraw token. */\n remainingTokens: bigint;\n /** Vault token balance when no pull-funds calldata is configured; otherwise unknown. */\n knownLiquidityTokens?: bigint;\n /** This redemption's size in numeraire (matches the on-chain epoch accounting). */\n requestNumeraire: bigint;\n /** True when this redemption alone exceeds remaining epoch capacity (the tx would revert). */\n exceedsCapacity: boolean;\n}\n\nexport type SyncWithdrawQuoteRequest =\n | { mode: 'amount'; amount: bigint }\n | { mode: 'shares'; shares: bigint }\n | { mode: 'entireAmount'; account: Address };\n\nexport interface SyncWithdrawQuoteContext {\n vaultId: string;\n chainId: number;\n tokenAddress: Address;\n /** Account used for balance and lock reads when the quote is account-scoped. */\n account?: Address;\n /** Slippage tolerance used to derive `minTokensOut` or `maxUnitsIn`. */\n slippageBps: number;\n /** Block snapshot used for all quote reads. */\n blockNumber: bigint;\n /** Exact sizing request that produced this quote. */\n request: SyncWithdrawQuoteRequest;\n}\n\ninterface SyncWithdrawQuoteDetails {\n /** Vault units (shares) burned: exact for `'redeem'`, estimated for `'withdraw'`. */\n shares: bigint;\n /** Upper bound on shares burned after slippage (equals `shares` for `'redeem'`). */\n maxUnitsIn: bigint;\n /** Tokens received: exact (requested) for `'withdraw'`, estimated for `'redeem'`. */\n tokensOut: bigint;\n /** Lower bound on tokens received after slippage (equals `tokensOut` for `'withdraw'`). */\n minTokensOut: bigint;\n /** Largest exact-token withdrawal that fits `shares`; only set for `'redeem'` quotes. */\n shareSafeTokensOut?: bigint;\n /** Live multiplier breakdown (base, dynamic premium, effective), in bps. */\n rate: SyncRedeemRate;\n capacity: SyncWithdrawCapacity;\n /** Timestamp until which the account's units are locked; undefined when no account was quoted. */\n unitsLockedUntil?: bigint;\n /** Context that must match any transaction build using these quote bounds. */\n context: SyncWithdrawQuoteContext;\n}\n\n/** Bounds consumed by one of the two on-chain sync withdraw entry points. */\nexport type SyncWithdrawQuoteBounds =\n | {\n kind: 'redeem';\n shares: bigint;\n minTokensOut: bigint;\n context: SyncWithdrawQuoteContext;\n }\n | {\n kind: 'withdraw';\n tokensOut: bigint;\n maxUnitsIn: bigint;\n context: SyncWithdrawQuoteContext;\n };\n\n/**\n * A live quote for an instant (sync) withdraw.\n *\n * `kind` distinguishes the two on-chain entry points:\n * - `'redeem'`: exact shares burned, estimated tokens out (used for by-shares / entire-balance exits)\n * - `'withdraw'`: exact tokens out, estimated shares burned (used for by-token-amount exits)\n */\nexport type SyncWithdrawQuote =\n | (SyncWithdrawQuoteDetails & { kind: 'redeem' })\n | (SyncWithdrawQuoteDetails & { kind: 'withdraw' });\n\nexport type SyncWithdrawRateParams = {\n vaultId: string;\n /** EVM chain ID. Defaults to the vault's primary chain (Base for current multichain vaults). */\n chainId?: number;\n /** Required for multiasset vaults. */\n assetSymbol?: string;\n};\n\ntype SyncWithdrawQuoteBaseParams = SyncWithdrawRateParams & {\n /** Optional for explicit amount/shares quotes; required for full-position quotes. */\n account?: Address;\n /**\n * Slippage tolerance in basis points (e.g. 100 = 1%). Defaults to 100.\n * A value of 10000 is invalid for share-sized quotes because it makes `minTokensOut` zero.\n */\n slippageBps?: number;\n};\n\nexport type SyncWithdrawQuoteParams =\n | (SyncWithdrawQuoteBaseParams & { shares: bigint; amount?: never; entireAmount?: never })\n | (SyncWithdrawQuoteBaseParams & { amount: bigint; shares?: never; entireAmount?: never })\n | (SyncWithdrawQuoteBaseParams & {\n account: Address;\n entireAmount: true;\n shares?: never;\n amount?: never;\n });\n\nfunction validateSyncWithdrawQuoteParams(params: SyncWithdrawQuoteParams) {\n const modes = [\n 'amount' in params && params.amount != null,\n 'shares' in params && params.shares != null,\n 'entireAmount' in params && params.entireAmount === true,\n ].filter(Boolean).length;\n\n if (modes !== 1) throw new InvalidWithdrawParamsError();\n if ('entireAmount' in params && params.entireAmount === true && !params.account) {\n throw new AccountRequiredError();\n }\n}\n\nasync function resolveSyncWithdrawContext(\n client: GauntletClient,\n params: SyncWithdrawRateParams,\n readKind: 'quote' | 'rate'\n) {\n const resolved = await resolveVault(client, params.vaultId, params.chainId);\n if (!resolved) throw new VaultNotFoundError(params.vaultId);\n\n const { vault, protocol } = resolved;\n if (protocol !== 'aera') {\n throw new UnsupportedFeatureError(\n readKind === 'quote'\n ? 'Sync withdraw quote is only available for Aera vaults'\n : 'Sync withdraw rate is only available for Aera vaults'\n );\n }\n\n const chainId = params.chainId ?? vault.chainId;\n const publicClient = client.getPublicClient(chainId);\n const token =\n vault.supplyToken.length > 1\n ? vault.supplyToken.find((tInfo) => tInfo.symbol === params.assetSymbol)\n : vault.supplyToken[0];\n if (token === undefined) {\n throw new UnsupportedAssetError(params.assetSymbol ?? 'unknown', params.vaultId);\n }\n\n const quoteBlock = await publicClient.getBlock();\n if (quoteBlock.number === null) {\n throw new UnsupportedFeatureError(\n readKind === 'quote'\n ? 'Aera: sync withdraw quote requires a numbered block'\n : 'Aera: sync withdraw rate requires a numbered block'\n );\n }\n const readContext = {\n blockNumber: quoteBlock.number,\n blockTimestamp: BigInt(quoteBlock.timestamp),\n };\n\n const runtime = await resolveAeraRuntimeContracts(publicClient, vault, readContext);\n requireAeraSyncRedeemRuntime(runtime);\n\n const support = await resolveAeraTokenModeSupport(\n publicClient,\n runtime,\n token.address,\n readContext\n );\n resolveOperationMode(params.vaultId, 'sync', {\n async: support.asyncRedeem,\n sync: support.syncRedeem,\n });\n\n return { publicClient, vault, token, runtime, chainId, readContext };\n}\n\n/** Reads the live instant-withdraw fee rate without requiring a withdrawal amount or account. */\nexport async function getSyncWithdrawRate(\n client: GauntletClient,\n params: SyncWithdrawRateParams\n): Promise<SyncRedeemRate> {\n const { publicClient, vault, token, runtime, readContext } = await resolveSyncWithdrawContext(\n client,\n params,\n 'rate'\n );\n\n return getSyncRedeemRate(\n publicClient,\n runtime.provisioner.address,\n vault.vaultAddress,\n token.address,\n runtime.feeCalculator.address,\n readContext\n );\n}\n\n/**\n * Builds a live quote for an instant (sync) withdraw without sending a transaction.\n *\n * Surfaces everything the on-chain `redeem`/`withdraw` would apply or check but that a plain\n * transaction build does not pre-validate: the effective rate (including the price-age dynamic\n * premium), slippage bounds, the global per-epoch redeem capacity, any known vault-balance limit,\n * and whether the caller's units are still locked from a recent sync deposit.\n *\n * @throws {VaultNotFoundError} If the vault ID is not found.\n * @throws {UnsupportedAssetError} If the asset symbol is not accepted by the vault.\n * @throws {UnsupportedFeatureError} If the vault is not an Aera V2 deployment.\n * @throws {UnsupportedDepositModeError} If sync redeem is not enabled for the token.\n * @throws {StalePriceError} If the oracle price is too stale for an instant redeem.\n */\nexport async function getSyncWithdrawQuote(\n client: GauntletClient,\n params: SyncWithdrawQuoteParams\n): Promise<SyncWithdrawQuote> {\n validateSyncWithdrawQuoteParams(params);\n\n if (\n params.slippageBps !== undefined &&\n (!Number.isInteger(params.slippageBps) ||\n params.slippageBps < 0 ||\n params.slippageBps > Number(MAX_BPS))\n ) {\n throw new InvalidSlippageBPSError(params.slippageBps);\n }\n const slippageBps = params.slippageBps ?? DEFAULT_BPS;\n\n const {\n publicClient,\n vault,\n token,\n runtime,\n chainId,\n readContext: quoteReadContext,\n } = await resolveSyncWithdrawContext(client, params, 'quote');\n\n const provisioner = runtime.provisioner.address;\n const feeCalculator = runtime.feeCalculator.address;\n const feeVersion = runtime.feeCalculator.version;\n const vaultAddress = vault.vaultAddress;\n\n const { rate, hasPullFundsSubmitData } = await getSyncRedeemRateContext(\n publicClient,\n provisioner,\n vaultAddress,\n token.address,\n feeCalculator,\n quoteReadContext\n );\n\n let kind: SyncWithdrawQuote['kind'];\n let shares: bigint;\n let tokensOut: bigint;\n let minTokensOut: bigint;\n let maxUnitsIn: bigint;\n let request: SyncWithdrawQuoteRequest;\n let shareSafeTokensOut: bigint | undefined;\n\n if ('amount' in params && params.amount != null) {\n // Exact token out: shares burned is the estimate, bounded above by slippage.\n kind = 'withdraw';\n request = { mode: 'amount', amount: params.amount };\n tokensOut = params.amount;\n requireNonZeroSyncWithdrawBound(tokensOut, 'tokensOut');\n minTokensOut = params.amount;\n shares = await getSyncWithdrawUnitsIn(\n publicClient,\n provisioner,\n feeCalculator,\n feeVersion,\n vaultAddress,\n token.address,\n params.amount,\n rate.effectiveMultiplierBps,\n quoteReadContext\n );\n maxUnitsIn = applySlippageUp(shares, slippageBps);\n requireNonZeroSyncWithdrawBound(maxUnitsIn, 'maxUnitsIn');\n } else {\n // Exact shares in: tokens out is the estimate, bounded below by slippage.\n kind = 'redeem';\n if ('entireAmount' in params && params.entireAmount) {\n if (!params.account) throw new AccountRequiredError();\n request = { mode: 'entireAmount', account: params.account };\n shares = await publicClient.readContract({\n address: vaultAddress,\n abi: multiDepositorVaultAbi,\n functionName: 'balanceOf',\n args: [params.account],\n blockNumber: quoteReadContext.blockNumber,\n });\n } else if ('shares' in params && params.shares != null) {\n request = { mode: 'shares', shares: params.shares };\n shares = params.shares;\n } else {\n throw new InvalidWithdrawParamsError();\n }\n requireNonZeroSyncWithdrawBound(shares, 'unitsIn');\n const getTokensOut = (unitsIn: bigint) =>\n getSyncRedeemTokenOut(\n publicClient,\n provisioner,\n feeCalculator,\n feeVersion,\n vaultAddress,\n token.address,\n unitsIn,\n rate.effectiveMultiplierBps,\n quoteReadContext\n );\n // A capacity-limited Max is submitted as an exact-token withdraw. Reserve slippage headroom so\n // its maximum share cost cannot exceed the user's share balance.\n const shareSafeUnitsIn = (shares * MAX_BPS) / (MAX_BPS + BigInt(slippageBps));\n const tokensOutPromise = getTokensOut(shares);\n const shareSafeTokensOutPromise =\n shareSafeUnitsIn === shares ? tokensOutPromise : getTokensOut(shareSafeUnitsIn);\n [tokensOut, shareSafeTokensOut] = await Promise.all([\n tokensOutPromise,\n shareSafeTokensOutPromise,\n ]);\n minTokensOut = applySlippageDown(tokensOut, slippageBps);\n requireNonZeroSyncWithdrawBound(minTokensOut, 'minTokensOut');\n maxUnitsIn = shares;\n }\n\n const [epoch, requestNumeraire, unitsLockedUntil, knownLiquidityTokens] = await Promise.all([\n getSyncRedeemEpochState(publicClient, provisioner, quoteReadContext),\n convertTokenToNumeraire(\n publicClient,\n feeCalculator,\n feeVersion,\n vaultAddress,\n token.address,\n tokensOut,\n quoteReadContext\n ),\n params.account\n ? getUserUnitsRefundableUntil(publicClient, provisioner, params.account, quoteReadContext)\n : Promise.resolve(undefined),\n getKnownSyncRedeemLiquidityTokens(\n publicClient,\n vaultAddress,\n token.address,\n hasPullFundsSubmitData,\n quoteReadContext\n ),\n ]);\n\n const remainingNumeraire =\n epoch.epochCapNumeraire > epoch.epochRedeemedNumeraire\n ? epoch.epochCapNumeraire - epoch.epochRedeemedNumeraire\n : 0n;\n const remainingTokens = await convertNumeraireToToken(\n publicClient,\n feeCalculator,\n feeVersion,\n vaultAddress,\n token.address,\n remainingNumeraire,\n quoteReadContext\n );\n const quoteDetails: SyncWithdrawQuoteDetails = {\n shares,\n maxUnitsIn,\n tokensOut,\n minTokensOut,\n shareSafeTokensOut,\n rate,\n capacity: {\n epochCapNumeraire: epoch.epochCapNumeraire,\n epochRedeemedNumeraire: epoch.epochRedeemedNumeraire,\n remainingNumeraire,\n remainingTokens,\n knownLiquidityTokens,\n requestNumeraire,\n exceedsCapacity: requestNumeraire > remainingNumeraire,\n },\n unitsLockedUntil,\n context: {\n vaultId: params.vaultId,\n chainId,\n tokenAddress: token.address,\n ...(params.account ? { account: params.account } : {}),\n slippageBps,\n blockNumber: quoteReadContext.blockNumber,\n request,\n },\n };\n\n if (kind === 'redeem') return { kind, ...quoteDetails };\n return { kind, ...quoteDetails };\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import type { Address } from 'viem';\nimport type { GauntletClient } from '../client';\nimport {\n AccountRequiredError,\n InvalidSlippageBPSError,\n InvalidWithdrawParamsError,\n requireNonZeroSyncWithdrawBound,\n UnsupportedAssetError,\n UnsupportedFeatureError,\n VaultNotFoundError,\n} from '../errors';\nimport { DEFAULT_BPS, MAX_BPS } from '../constants';\nimport { resolveVault } from './vaults';\nimport {\n applySlippageDown,\n applySlippageUp,\n requireAeraSyncRedeemRuntime,\n resolveAeraRuntimeContracts,\n resolveAeraTokenModeSupport,\n} from './aeraContracts';\nimport { multiDepositorVaultAbi } from './abis/multiDepositorVault';\nimport {\n convertNumeraireToToken,\n convertTokenToNumeraire,\n} from './aeraContracts/priceAndFeeCalculator';\nimport {\n getKnownSyncRedeemLiquidityTokens,\n getSyncRedeemEpochState,\n getSyncRedeemRate,\n getSyncRedeemRateContext,\n getSyncRedeemTokenOut,\n getSyncWithdrawUnitsIn,\n getUserUnitsRefundableUntil,\n type SyncRedeemRate,\n} from './aeraContracts/v2';\nimport { resolveOperationMode } from './operationMode';\n\n/** Epoch-cap accounting plus any liquid-token balance known to the caller. */\nexport interface SyncWithdrawCapacity {\n /** Effective epoch cap (min of relative and absolute), in numeraire. */\n epochCapNumeraire: bigint;\n /** Numeraire already redeemed globally in the current epoch. */\n epochRedeemedNumeraire: bigint;\n /** Remaining global sync redeem capacity this epoch, in numeraire. */\n remainingNumeraire: bigint;\n /** Remaining capacity expressed in the withdraw token. */\n remainingTokens: bigint;\n /** Vault token balance when no pull-funds calldata is configured; otherwise unknown. */\n knownLiquidityTokens?: bigint;\n /** This redemption's size in numeraire (matches the on-chain epoch accounting). */\n requestNumeraire: bigint;\n /** True when this redemption alone exceeds remaining epoch capacity (the tx would revert). */\n exceedsCapacity: boolean;\n}\n\nexport type SyncWithdrawQuoteRequest =\n | { mode: 'amount'; amount: bigint }\n | { mode: 'shares'; shares: bigint }\n | { mode: 'entireAmount'; account: Address };\n\nexport interface SyncWithdrawQuoteContext {\n vaultId: string;\n chainId: number;\n tokenAddress: Address;\n /** Account used for balance and lock reads when the quote is account-scoped. */\n account?: Address;\n /** Slippage tolerance used to derive `minTokensOut` or `maxUnitsIn`. */\n slippageBps: number;\n /** Block snapshot used for all quote reads. */\n blockNumber: bigint;\n /** Exact sizing request that produced this quote. */\n request: SyncWithdrawQuoteRequest;\n}\n\ninterface SyncWithdrawQuoteDetails {\n /** Vault units (shares) burned: exact for `'redeem'`, estimated for `'withdraw'`. */\n shares: bigint;\n /** Upper bound on shares burned after slippage (equals `shares` for `'redeem'`). */\n maxUnitsIn: bigint;\n /** Tokens received: exact (requested) for `'withdraw'`, estimated for `'redeem'`. */\n tokensOut: bigint;\n /** Lower bound on tokens received after slippage (equals `tokensOut` for `'withdraw'`). */\n minTokensOut: bigint;\n /** Largest exact-token withdrawal that fits `shares`; only set for `'redeem'` quotes. */\n shareSafeTokensOut?: bigint;\n /** Live multiplier breakdown (base, dynamic premium, effective), in bps. */\n rate: SyncRedeemRate;\n capacity: SyncWithdrawCapacity;\n /** Timestamp until which the account's units are locked; undefined when no account was quoted. */\n unitsLockedUntil?: bigint;\n /** Context that must match any transaction build using these quote bounds. */\n context: SyncWithdrawQuoteContext;\n}\n\n/** Bounds consumed by one of the two on-chain sync withdraw entry points. */\nexport type SyncWithdrawQuoteBounds =\n | {\n kind: 'redeem';\n shares: bigint;\n minTokensOut: bigint;\n context: SyncWithdrawQuoteContext;\n }\n | {\n kind: 'withdraw';\n tokensOut: bigint;\n maxUnitsIn: bigint;\n context: SyncWithdrawQuoteContext;\n };\n\n/**\n * A live quote for an instant (sync) withdraw.\n *\n * `kind` distinguishes the two on-chain entry points:\n * - `'redeem'`: exact shares burned, estimated tokens out (used for by-shares / entire-balance exits)\n * - `'withdraw'`: exact tokens out, estimated shares burned (used for by-token-amount exits)\n */\nexport type SyncWithdrawQuote =\n | (SyncWithdrawQuoteDetails & { kind: 'redeem' })\n | (SyncWithdrawQuoteDetails & { kind: 'withdraw' });\n\nexport type SyncWithdrawRateParams = {\n vaultId: string;\n /** EVM chain ID. Defaults to the vault's primary chain (Base for current multichain vaults). */\n chainId?: number;\n /** Required for multiasset vaults. */\n assetSymbol?: string;\n};\n\ntype SyncWithdrawQuoteBaseParams = SyncWithdrawRateParams & {\n /** Optional for explicit amount/shares quotes; required for full-position quotes. */\n account?: Address;\n /**\n * Slippage tolerance in basis points (e.g. 100 = 1%). Defaults to 100.\n * A value of 10000 is invalid for share-sized quotes because it makes `minTokensOut` zero.\n */\n slippageBps?: number;\n};\n\nexport type SyncWithdrawQuoteParams =\n | (SyncWithdrawQuoteBaseParams & { shares: bigint; amount?: never; entireAmount?: never })\n | (SyncWithdrawQuoteBaseParams & { amount: bigint; shares?: never; entireAmount?: never })\n | (SyncWithdrawQuoteBaseParams & {\n account: Address;\n entireAmount: true;\n shares?: never;\n amount?: never;\n });\n\nfunction validateSyncWithdrawQuoteParams(params: SyncWithdrawQuoteParams) {\n const modes = [\n 'amount' in params && params.amount != null,\n 'shares' in params && params.shares != null,\n 'entireAmount' in params && params.entireAmount === true,\n ].filter(Boolean).length;\n\n if (modes !== 1) throw new InvalidWithdrawParamsError();\n if ('entireAmount' in params && params.entireAmount === true && !params.account) {\n throw new AccountRequiredError();\n }\n}\n\nasync function resolveSyncWithdrawContext(\n client: GauntletClient,\n params: SyncWithdrawRateParams,\n readKind: 'quote' | 'rate'\n) {\n const resolved = await resolveVault(client, params.vaultId, params.chainId);\n if (!resolved) throw new VaultNotFoundError(params.vaultId);\n\n const { vault, protocol } = resolved;\n if (protocol !== 'aera') {\n throw new UnsupportedFeatureError(\n readKind === 'quote'\n ? 'Sync withdraw quote is only available for Aera vaults'\n : 'Sync withdraw rate is only available for Aera vaults'\n );\n }\n\n const chainId = params.chainId ?? vault.chainId;\n const publicClient = client.getPublicClient(chainId);\n const token =\n vault.supplyToken.length > 1\n ? vault.supplyToken.find((tInfo) => tInfo.symbol === params.assetSymbol)\n : vault.supplyToken[0];\n if (token === undefined) {\n throw new UnsupportedAssetError(params.assetSymbol ?? 'unknown', params.vaultId);\n }\n\n const quoteBlock = await publicClient.getBlock();\n if (quoteBlock.number === null) {\n throw new UnsupportedFeatureError(\n readKind === 'quote'\n ? 'Aera: sync withdraw quote requires a numbered block'\n : 'Aera: sync withdraw rate requires a numbered block'\n );\n }\n const readContext = {\n blockNumber: quoteBlock.number,\n blockTimestamp: BigInt(quoteBlock.timestamp),\n };\n\n const runtime = await resolveAeraRuntimeContracts(publicClient, vault, readContext);\n requireAeraSyncRedeemRuntime(runtime);\n\n const support = await resolveAeraTokenModeSupport(\n publicClient,\n runtime,\n token.address,\n readContext\n );\n resolveOperationMode(params.vaultId, 'sync', {\n async: support.asyncRedeem,\n sync: support.syncRedeem,\n });\n\n return { publicClient, vault, token, runtime, chainId, readContext };\n}\n\n/** Reads the live instant-withdraw fee rate without requiring a withdrawal amount or account. */\nexport async function getSyncWithdrawRate(\n client: GauntletClient,\n params: SyncWithdrawRateParams\n): Promise<SyncRedeemRate> {\n const { publicClient, vault, token, runtime, readContext } = await resolveSyncWithdrawContext(\n client,\n params,\n 'rate'\n );\n\n return getSyncRedeemRate(\n publicClient,\n runtime.provisioner.address,\n vault.vaultAddress,\n token.address,\n runtime.feeCalculator.address,\n readContext\n );\n}\n\n/**\n * Builds a live quote for an instant (sync) withdraw without sending a transaction.\n *\n * Surfaces everything the on-chain `redeem`/`withdraw` would apply or check but that a plain\n * transaction build does not pre-validate: the effective rate (including the price-age dynamic\n * premium), slippage bounds, the global per-epoch redeem capacity, any known vault-balance limit,\n * and whether the caller's units are still locked from a recent sync deposit.\n *\n * @throws {VaultNotFoundError} If the vault ID is not found.\n * @throws {UnsupportedAssetError} If the asset symbol is not accepted by the vault.\n * @throws {UnsupportedFeatureError} If the vault is not an Aera V2 deployment.\n * @throws {UnsupportedDepositModeError} If sync redeem is not enabled for the token.\n * @throws {StalePriceError} If the oracle price is too stale for an instant redeem.\n */\nexport async function getSyncWithdrawQuote(\n client: GauntletClient,\n params: SyncWithdrawQuoteParams\n): Promise<SyncWithdrawQuote> {\n params = structuredClone(params);\n validateSyncWithdrawQuoteParams(params);\n\n if (\n params.slippageBps !== undefined &&\n (!Number.isInteger(params.slippageBps) ||\n params.slippageBps < 0 ||\n params.slippageBps > Number(MAX_BPS))\n ) {\n throw new InvalidSlippageBPSError(params.slippageBps);\n }\n const slippageBps = params.slippageBps ?? DEFAULT_BPS;\n\n const {\n publicClient,\n vault,\n token,\n runtime,\n chainId,\n readContext: quoteReadContext,\n } = await resolveSyncWithdrawContext(client, params, 'quote');\n\n const provisioner = runtime.provisioner.address;\n const feeCalculator = runtime.feeCalculator.address;\n const feeVersion = runtime.feeCalculator.version;\n const vaultAddress = vault.vaultAddress;\n\n const { rate, hasPullFundsSubmitData } = await getSyncRedeemRateContext(\n publicClient,\n provisioner,\n vaultAddress,\n token.address,\n feeCalculator,\n quoteReadContext\n );\n\n let kind: SyncWithdrawQuote['kind'];\n let shares: bigint;\n let tokensOut: bigint;\n let minTokensOut: bigint;\n let maxUnitsIn: bigint;\n let request: SyncWithdrawQuoteRequest;\n let shareSafeTokensOut: bigint | undefined;\n\n if ('amount' in params && params.amount != null) {\n // Exact token out: shares burned is the estimate, bounded above by slippage.\n kind = 'withdraw';\n request = { mode: 'amount', amount: params.amount };\n tokensOut = params.amount;\n requireNonZeroSyncWithdrawBound(tokensOut, 'tokensOut');\n minTokensOut = params.amount;\n shares = await getSyncWithdrawUnitsIn(\n publicClient,\n provisioner,\n feeCalculator,\n feeVersion,\n vaultAddress,\n token.address,\n params.amount,\n rate.effectiveMultiplierBps,\n quoteReadContext\n );\n maxUnitsIn = applySlippageUp(shares, slippageBps);\n requireNonZeroSyncWithdrawBound(maxUnitsIn, 'maxUnitsIn');\n } else {\n // Exact shares in: tokens out is the estimate, bounded below by slippage.\n kind = 'redeem';\n if ('entireAmount' in params && params.entireAmount) {\n if (!params.account) throw new AccountRequiredError();\n request = { mode: 'entireAmount', account: params.account };\n shares = await publicClient.readContract({\n address: vaultAddress,\n abi: multiDepositorVaultAbi,\n functionName: 'balanceOf',\n args: [params.account],\n blockNumber: quoteReadContext.blockNumber,\n });\n } else if ('shares' in params && params.shares != null) {\n request = { mode: 'shares', shares: params.shares };\n shares = params.shares;\n } else {\n throw new InvalidWithdrawParamsError();\n }\n requireNonZeroSyncWithdrawBound(shares, 'unitsIn');\n const getTokensOut = (unitsIn: bigint) =>\n getSyncRedeemTokenOut(\n publicClient,\n provisioner,\n feeCalculator,\n feeVersion,\n vaultAddress,\n token.address,\n unitsIn,\n rate.effectiveMultiplierBps,\n quoteReadContext\n );\n // A capacity-limited Max is submitted as an exact-token withdraw. Reserve slippage headroom so\n // its maximum share cost cannot exceed the user's share balance.\n const shareSafeUnitsIn = (shares * MAX_BPS) / (MAX_BPS + BigInt(slippageBps));\n const tokensOutPromise = getTokensOut(shares);\n const shareSafeTokensOutPromise =\n shareSafeUnitsIn === shares ? tokensOutPromise : getTokensOut(shareSafeUnitsIn);\n [tokensOut, shareSafeTokensOut] = await Promise.all([\n tokensOutPromise,\n shareSafeTokensOutPromise,\n ]);\n minTokensOut = applySlippageDown(tokensOut, slippageBps);\n requireNonZeroSyncWithdrawBound(minTokensOut, 'minTokensOut');\n maxUnitsIn = shares;\n }\n\n const [epoch, requestNumeraire, unitsLockedUntil, knownLiquidityTokens] = await Promise.all([\n getSyncRedeemEpochState(publicClient, provisioner, quoteReadContext),\n convertTokenToNumeraire(\n publicClient,\n feeCalculator,\n feeVersion,\n vaultAddress,\n token.address,\n tokensOut,\n quoteReadContext\n ),\n params.account\n ? getUserUnitsRefundableUntil(publicClient, provisioner, params.account, quoteReadContext)\n : Promise.resolve(undefined),\n getKnownSyncRedeemLiquidityTokens(\n publicClient,\n vaultAddress,\n token.address,\n hasPullFundsSubmitData,\n quoteReadContext\n ),\n ]);\n\n const remainingNumeraire =\n epoch.epochCapNumeraire > epoch.epochRedeemedNumeraire\n ? epoch.epochCapNumeraire - epoch.epochRedeemedNumeraire\n : 0n;\n const remainingTokens = await convertNumeraireToToken(\n publicClient,\n feeCalculator,\n feeVersion,\n vaultAddress,\n token.address,\n remainingNumeraire,\n quoteReadContext\n );\n const quoteDetails: SyncWithdrawQuoteDetails = {\n shares,\n maxUnitsIn,\n tokensOut,\n minTokensOut,\n shareSafeTokensOut,\n rate,\n capacity: {\n epochCapNumeraire: epoch.epochCapNumeraire,\n epochRedeemedNumeraire: epoch.epochRedeemedNumeraire,\n remainingNumeraire,\n remainingTokens,\n knownLiquidityTokens,\n requestNumeraire,\n exceedsCapacity: requestNumeraire > remainingNumeraire,\n },\n unitsLockedUntil,\n context: {\n vaultId: params.vaultId,\n chainId,\n tokenAddress: token.address,\n ...(params.account ? { account: params.account } : {}),\n slippageBps,\n blockNumber: quoteReadContext.blockNumber,\n request,\n },\n };\n\n if (kind === 'redeem') return { kind, ...quoteDetails };\n return { kind, ...quoteDetails };\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -1 +1 @@
1
- {"version":3,"file":"aera.d.ts","sourceRoot":"","sources":["../../../src/evm/adapters/aera.ts"],"names":[],"mappings":"AAmBA,OAAO,KAAK,EACV,kBAAkB,EAMnB,mBAAgB;AACjB,OAAO,KAAK,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,MAAM,CAAC;AAWlD,eAAO,MAAM,yBAAyB,iBACtB,YAAY,eACb,MAAM,gBACL,OAAO,gBACP,OAAO,gCAmBtB,CAAC;AAEF,eAAO,MAAM,yBAAyB,iBACtB,YAAY,eACb,MAAM,gBACL,OAAO,gBACP,OAAO,gCAiBtB,CAAC;AAiIF,eAAO,MAAM,WAAW,EAAE,kBAgWzB,CAAC"}
1
+ {"version":3,"file":"aera.d.ts","sourceRoot":"","sources":["../../../src/evm/adapters/aera.ts"],"names":[],"mappings":"AAmBA,OAAO,KAAK,EACV,kBAAkB,EAMnB,mBAAgB;AACjB,OAAO,KAAK,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,MAAM,CAAC;AAWlD,eAAO,MAAM,yBAAyB,iBACtB,YAAY,eACb,MAAM,gBACL,OAAO,gBACP,OAAO,gCAmBtB,CAAC;AAEF,eAAO,MAAM,yBAAyB,iBACtB,YAAY,eACb,MAAM,gBACL,OAAO,gBACP,OAAO,gCAiBtB,CAAC;AAiIF,eAAO,MAAM,WAAW,EAAE,kBAkXzB,CAAC"}
@@ -46,6 +46,7 @@ export type AdapterWithdrawParams = {
46
46
  maxPriceAge?: bigint;
47
47
  aeraRuntime?: AeraRuntimeContracts;
48
48
  syncWithdrawQuote?: SyncWithdrawQuoteBounds;
49
+ maxShares?: bigint;
49
50
  } & ({
50
51
  shares: bigint;
51
52
  amount?: never;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/evm/adapters/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/evm/adapters/types.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"aeraContracts.d.ts","sourceRoot":"","sources":["../../src/evm/aeraContracts.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,KAAK,OAAO,EACZ,KAAK,MAAM,EACX,KAAK,qBAAqB,EAC1B,KAAK,YAAY,EAGlB,MAAM,MAAM,CAAC;AAEd,OAAO,EAAE,sBAAsB,EAAE,sCAAmC;AAIpE,OAAO,EAAE,eAAe,EAAE,KAAK,kBAAkB,EAAE,mBAAgB;AA4BnE,MAAM,WAAW,oBAAoB;IACnC,WAAW,EAAE;QACX,OAAO,EAAE,OAAO,CAAC;QACjB,OAAO,EAAE,eAAe,CAAC;KAC1B,CAAC;IACF,aAAa,EAAE;QACb,OAAO,EAAE,OAAO,CAAC;QACjB,OAAO,EAAE,eAAe,CAAC;KAC1B,CAAC;CACH;AAED,MAAM,WAAW,oBAAoB;IACnC,YAAY,EAAE,OAAO,CAAC;IACtB,WAAW,EAAE,OAAO,CAAC;IACrB,WAAW,EAAE,OAAO,CAAC;IACrB,UAAU,EAAE,OAAO,CAAC;CACrB;AAED,wBAAgB,4BAA4B,CAAC,OAAO,EAAE,oBAAoB,GAAG,IAAI,CAOhF;AAED,MAAM,MAAM,eAAe,GAAG;IAC5B,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,CAAC;AAEF,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,CAE7E;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,CAE3E;AA0BD,MAAM,MAAM,2BAA2B,CAAC,CAAC,SAAS,MAAM,IAAI,qBAAqB,CAC/E,OAAO,sBAAsB,EAC7B,CAAC,EACD,OAAO,CACR,CAAC;AAEF,wBAAgB,sBAAsB,CAAC,CAAC,SAAS,MAAM,EACrD,MAAM,EAAE,CAAC,EACT,YAAY,EAAE,OAAO,GACpB,2BAA2B,CAAC,CAAC,CAAC,CAMhC;AAED,wBAAsB,sBAAsB,CAC1C,MAAM,EAAE,YAAY,EACpB,OAAO,EAAE,OAAO,EAChB,OAAO,GAAE,eAAoB,GAC5B,OAAO,CAAC,eAAe,CAAC,CAsB1B;AAED,wBAAsB,2BAA2B,CAC/C,MAAM,EAAE,YAAY,EACpB,KAAK,EAAE,kBAAkB,EACzB,OAAO,GAAE,eAAoB,GAC5B,OAAO,CAAC,oBAAoB,CAAC,CA0C/B;AAED,wBAAsB,2BAA2B,CAC/C,MAAM,EAAE,YAAY,EACpB,OAAO,EAAE,oBAAoB,EAC7B,KAAK,EAAE,OAAO,EACd,OAAO,GAAE,eAAe,GAAG;IAAE,gBAAgB,CAAC,EAAE,OAAO,CAAA;CAAO,GAC7D,OAAO,CAAC,oBAAoB,CAAC,CAsE/B"}
1
+ {"version":3,"file":"aeraContracts.d.ts","sourceRoot":"","sources":["../../src/evm/aeraContracts.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,KAAK,OAAO,EACZ,KAAK,MAAM,EACX,KAAK,qBAAqB,EAC1B,KAAK,YAAY,EAGlB,MAAM,MAAM,CAAC;AAEd,OAAO,EAAE,sBAAsB,EAAE,sCAAmC;AAIpE,OAAO,EAAE,eAAe,EAAE,KAAK,kBAAkB,EAAE,mBAAgB;AA0BnE,MAAM,WAAW,oBAAoB;IACnC,WAAW,EAAE;QACX,OAAO,EAAE,OAAO,CAAC;QACjB,OAAO,EAAE,eAAe,CAAC;KAC1B,CAAC;IACF,aAAa,EAAE;QACb,OAAO,EAAE,OAAO,CAAC;QACjB,OAAO,EAAE,eAAe,CAAC;KAC1B,CAAC;CACH;AAED,MAAM,WAAW,oBAAoB;IACnC,YAAY,EAAE,OAAO,CAAC;IACtB,WAAW,EAAE,OAAO,CAAC;IACrB,WAAW,EAAE,OAAO,CAAC;IACrB,UAAU,EAAE,OAAO,CAAC;CACrB;AAED,wBAAgB,4BAA4B,CAAC,OAAO,EAAE,oBAAoB,GAAG,IAAI,CAOhF;AAED,MAAM,MAAM,eAAe,GAAG;IAC5B,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,CAAC;AAEF,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,CAE7E;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,CAE3E;AAsBD,MAAM,MAAM,2BAA2B,CAAC,CAAC,SAAS,MAAM,IAAI,qBAAqB,CAC/E,OAAO,sBAAsB,EAC7B,CAAC,EACD,OAAO,CACR,CAAC;AAEF,wBAAgB,sBAAsB,CAAC,CAAC,SAAS,MAAM,EACrD,MAAM,EAAE,CAAC,EACT,YAAY,EAAE,OAAO,GACpB,2BAA2B,CAAC,CAAC,CAAC,CAMhC;AAKD,wBAAsB,sBAAsB,CAC1C,MAAM,EAAE,YAAY,EACpB,OAAO,EAAE,OAAO,EAChB,OAAO,GAAE,eAAoB,GAC5B,OAAO,CAAC,eAAe,CAAC,CAe1B;AA2BD,wBAAsB,2BAA2B,CAC/C,MAAM,EAAE,YAAY,EACpB,KAAK,EAAE,kBAAkB,EACzB,OAAO,GAAE,eAAoB,GAC5B,OAAO,CAAC,oBAAoB,CAAC,CA0C/B;AAED,wBAAsB,2BAA2B,CAC/C,MAAM,EAAE,YAAY,EACpB,OAAO,EAAE,oBAAoB,EAC7B,KAAK,EAAE,OAAO,EACd,OAAO,GAAE,eAAe,GAAG;IAAE,gBAAgB,CAAC,EAAE,OAAO,CAAA;CAAO,GAC7D,OAAO,CAAC,oBAAoB,CAAC,CAsE/B"}
@@ -21,8 +21,9 @@ export interface EvmDepositParams {
21
21
  /**
22
22
  * Builds the ordered list of EVM transactions required to deposit into a Gauntlet vault.
23
23
  *
24
- * Returns one or two transactions: an ERC-20 approval (only if the current allowance is
25
- * insufficient) followed by the deposit or async deposit request. Each transaction is
24
+ * Returns ordered transactions: ERC-20 approvals (if the allowance is insufficient),
25
+ * followed by the deposit or async deposit request. Some tokens require an approval
26
+ * of zero before a new nonzero approval. Each transaction is
26
27
  * returned as a `PreparedTx` object ready to be signed and sent.
27
28
  *
28
29
  * @param client - A configured `GauntletClient` instance with an EVM public client and wallet.
@@ -1 +1 @@
1
- {"version":3,"file":"deposit.d.ts","sourceRoot":"","sources":["../../src/evm/deposit.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AACpC,OAAO,KAAK,EAAE,cAAc,EAAE,qBAAkB;AAGhD,OAAO,EAAoC,UAAU,EAAE,gCAAuB;AAsB9E,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IAEf,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,kGAAkG;IAClG,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,2EAA2E;IAC3E,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,2EAA2E;IAC3E,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,wFAAwF;IACxF,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,+EAA+E;IAC/E,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,wBAAsB,YAAY,CAChC,MAAM,EAAE,cAAc,EACtB,MAAM,EAAE,gBAAgB,GACvB,OAAO,CAAC,UAAU,EAAE,CAAC,CAuGvB"}
1
+ {"version":3,"file":"deposit.d.ts","sourceRoot":"","sources":["../../src/evm/deposit.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AACpC,OAAO,KAAK,EAAE,cAAc,EAAE,qBAAkB;AAGhD,OAAO,EAAoC,UAAU,EAAE,gCAAuB;AAsB9E,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IAEf,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,kGAAkG;IAClG,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,2EAA2E;IAC3E,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,2EAA2E;IAC3E,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,wFAAwF;IACxF,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,+EAA+E;IAC/E,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,wBAAsB,YAAY,CAChC,MAAM,EAAE,cAAc,EACtB,MAAM,EAAE,gBAAgB,GACvB,OAAO,CAAC,UAAU,EAAE,CAAC,CAqIvB"}
@@ -1 +1 @@
1
- {"version":3,"file":"depositQuote.d.ts","sourceRoot":"","sources":["../../src/evm/depositQuote.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,qBAAkB;AAmBhD,MAAM,MAAM,gBAAgB,GAAG,QAAQ,CAAC;IACtC,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,uFAAuF;IACvF,YAAY,EAAE,MAAM,CAAC;IACrB,iFAAiF;IACjF,MAAM,EAAE,MAAM,CAAC;IACf,wEAAwE;IACxE,WAAW,EAAE,MAAM,CAAC;CACrB,CAAC,CAAC;AAEH,MAAM,MAAM,sBAAsB,GAAG;IACnC,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,CAAC;AAEF,MAAM,MAAM,qBAAqB,GAAG;IAClC,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG,QAAQ,CAAC;IACrC,8EAA8E;IAC9E,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC,CAAC;AA6CH,mEAAmE;AACnE,wBAAsB,mBAAmB,CACvC,MAAM,EAAE,cAAc,EACtB,MAAM,EAAE,sBAAsB,GAC7B,OAAO,CAAC,gBAAgB,CAAC,CAyB3B;AAED,+FAA+F;AAC/F,wBAAsB,kBAAkB,CACtC,MAAM,EAAE,cAAc,EACtB,MAAM,EAAE,qBAAqB,GAC5B,OAAO,CAAC,eAAe,CAAC,CAS1B"}
1
+ {"version":3,"file":"depositQuote.d.ts","sourceRoot":"","sources":["../../src/evm/depositQuote.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,qBAAkB;AAmBhD,MAAM,MAAM,gBAAgB,GAAG,QAAQ,CAAC;IACtC,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,uFAAuF;IACvF,YAAY,EAAE,MAAM,CAAC;IACrB,iFAAiF;IACjF,MAAM,EAAE,MAAM,CAAC;IACf,wEAAwE;IACxE,WAAW,EAAE,MAAM,CAAC;CACrB,CAAC,CAAC;AAEH,MAAM,MAAM,sBAAsB,GAAG;IACnC,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,CAAC;AAEF,MAAM,MAAM,qBAAqB,GAAG;IAClC,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG,QAAQ,CAAC;IACrC,8EAA8E;IAC9E,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC,CAAC;AA6CH,mEAAmE;AACnE,wBAAsB,mBAAmB,CACvC,MAAM,EAAE,cAAc,EACtB,MAAM,EAAE,sBAAsB,GAC7B,OAAO,CAAC,gBAAgB,CAAC,CA0B3B;AAED,+FAA+F;AAC/F,wBAAsB,kBAAkB,CACtC,MAAM,EAAE,cAAc,EACtB,MAAM,EAAE,qBAAqB,GAC5B,OAAO,CAAC,eAAe,CAAC,CAS1B"}
@@ -1 +1 @@
1
- {"version":3,"file":"depositReceiverApproval.d.ts","sourceRoot":"","sources":["../../src/evm/depositReceiverApproval.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AACpC,OAAO,KAAK,EAAE,cAAc,EAAE,qBAAkB;AAChD,OAAO,KAAK,EAAE,UAAU,EAAE,gCAAuB;AAQjD,MAAM,WAAW,gCAAgC;IAC/C,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;;;;GAKG;AACH,wBAAsB,4BAA4B,CAChD,MAAM,EAAE,cAAc,EACtB,MAAM,EAAE,gCAAgC,GACvC,OAAO,CAAC,UAAU,CAAC,CAwBrB"}
1
+ {"version":3,"file":"depositReceiverApproval.d.ts","sourceRoot":"","sources":["../../src/evm/depositReceiverApproval.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AACpC,OAAO,KAAK,EAAE,cAAc,EAAE,qBAAkB;AAChD,OAAO,KAAK,EAAE,UAAU,EAAE,gCAAuB;AAQjD,MAAM,WAAW,gCAAgC;IAC/C,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;;;;GAKG;AACH,wBAAsB,4BAA4B,CAChD,MAAM,EAAE,cAAc,EACtB,MAAM,EAAE,gCAAgC,GACvC,OAAO,CAAC,UAAU,CAAC,CA6BrB"}
package/dist/evm/index.js CHANGED
@@ -19,12 +19,8 @@ import {
19
19
  isVaultPaused,
20
20
  resolveAeraRuntimeContracts,
21
21
  resolveContractVersion
22
- } from "../chunk-7TA2OJUK.js";
23
- import {
24
- VaultId,
25
- getVaults
26
- } from "../chunk-STIV2CC4.js";
27
- import "../chunk-S2TTA45N.js";
22
+ } from "../chunk-YQXTLIJA.js";
23
+ import "../chunk-JRSNLXFY.js";
28
24
  import {
29
25
  AccountMismatchError,
30
26
  AccountRequiredError,
@@ -42,8 +38,10 @@ import {
42
38
  UnsupportedDepositModeError,
43
39
  UnsupportedFeatureError,
44
40
  UnsupportedProtocolError,
45
- VaultNotFoundError
46
- } from "../chunk-HC2BS7MK.js";
41
+ VaultId,
42
+ VaultNotFoundError,
43
+ getVaults
44
+ } from "../chunk-JJOLVL5V.js";
47
45
  export {
48
46
  AccountMismatchError,
49
47
  AccountRequiredError,
@@ -4,8 +4,19 @@ export interface UserCurrentBalanceParams {
4
4
  vaultId: string;
5
5
  address: Address;
6
6
  chainId?: number;
7
+ /** Required for deployments that support multiple assets, ignored otherwise. */
8
+ assetSymbol?: string;
9
+ /**
10
+ * Scan from this block, including expired requests that still hold escrow.
11
+ * Requires `chainId` for a vault with more than one deployment.
12
+ */
13
+ fromBlock?: bigint;
7
14
  }
8
15
  export interface UserCurrentBalance {
16
+ /** Block used for balances, conversions, and request state. */
17
+ blockNumber: bigint;
18
+ /** First block included in the request scan. Older escrow is outside this result. */
19
+ fromBlock: bigint;
9
20
  /** Chain identifier, e.g. "base" */
10
21
  chain: string;
11
22
  /** EVM chain id of the deployment, e.g. 8453 */
@@ -30,7 +41,9 @@ export interface UserCurrentBalance {
30
41
  * - `pendingWithdraw` — vault units locked in a pending async redeem request (converted to tokens).
31
42
  *
32
43
  * Only supported for Aera multi-depositor vaults. Pending amounts are detected by scanning
33
- * the last ~3 days of provisioner events and cross-checking hash existence on-chain.
44
+ * the configured request lifetime, with a minimum of three days. Set `fromBlock` (with `chainId`
45
+ * on a multi-chain vault) for older escrow.
46
+ * All state reads use one block. The returned range identifies the scanned history.
34
47
  *
35
48
  * @param client - A configured `GauntletClient` instance with an EVM public client for each
36
49
  * chain the vault is deployed on.
@@ -41,6 +54,7 @@ export interface UserCurrentBalance {
41
54
  * @throws {VaultNotFoundError} If the vault ID is not found in the manifest.
42
55
  * @throws {UnsupportedProtocolError} If the vault is not an Aera multi-depositor vault.
43
56
  * @throws {ChainMismatchError} If `chainId` is specified but no deployment exists for that chain.
57
+ * @throws {UnsupportedAssetError} If a multi-asset deployment gets no matching `assetSymbol`.
44
58
  *
45
59
  * @example
46
60
  * ```ts
@@ -1 +1 @@
1
- {"version":3,"file":"userCurrentBalance.d.ts","sourceRoot":"","sources":["../../src/evm/userCurrentBalance.ts"],"names":[],"mappings":"AAAA,OAAO,EAAY,KAAK,OAAO,EAAE,MAAM,MAAM,CAAC;AAC9C,OAAO,KAAK,EAAE,cAAc,EAAE,qBAAkB;AAoDhD,MAAM,WAAW,wBAAwB;IACvC,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,kBAAkB;IACjC,oCAAoC;IACpC,KAAK,EAAE,MAAM,CAAC;IACd,gDAAgD;IAChD,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,OAAO,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,uDAAuD;IACvD,cAAc,EAAE,MAAM,CAAC;IACvB,2CAA2C;IAC3C,OAAO,EAAE,MAAM,CAAC;IAChB,0DAA0D;IAC1D,eAAe,EAAE,MAAM,CAAC;IACxB,oEAAoE;IACpE,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAwKD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,wBAAsB,qBAAqB,CACzC,MAAM,EAAE,cAAc,EACtB,MAAM,EAAE,wBAAwB,GAC/B,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAyB/B"}
1
+ {"version":3,"file":"userCurrentBalance.d.ts","sourceRoot":"","sources":["../../src/evm/userCurrentBalance.ts"],"names":[],"mappings":"AAAA,OAAO,EAAY,KAAK,OAAO,EAAE,MAAM,MAAM,CAAC;AAC9C,OAAO,KAAK,EAAE,cAAc,EAAE,qBAAkB;AAmEhD,MAAM,WAAW,wBAAwB;IACvC,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,gFAAgF;IAChF,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,kBAAkB;IACjC,+DAA+D;IAC/D,WAAW,EAAE,MAAM,CAAC;IACpB,qFAAqF;IACrF,SAAS,EAAE,MAAM,CAAC;IAClB,oCAAoC;IACpC,KAAK,EAAE,MAAM,CAAC;IACd,gDAAgD;IAChD,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,OAAO,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,uDAAuD;IACvD,cAAc,EAAE,MAAM,CAAC;IACvB,2CAA2C;IAC3C,OAAO,EAAE,MAAM,CAAC;IAChB,0DAA0D;IAC1D,eAAe,EAAE,MAAM,CAAC;IACxB,oEAAoE;IACpE,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AA2ND;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AACH,wBAAsB,qBAAqB,CACzC,MAAM,EAAE,cAAc,EACtB,MAAM,EAAE,wBAAwB,GAC/B,OAAO,CAAC,kBAAkB,EAAE,CAAC,CA6B/B"}
@@ -20,6 +20,8 @@ export type EvmWithdrawParams = {
20
20
  * Supplying bounds implies `depositMode: 'sync'`; explicit async requests are rejected.
21
21
  */
22
22
  syncWithdrawQuote?: SyncWithdrawQuoteBounds;
23
+ /** Limit a sync withdrawal to the shares reviewed before a rate change. */
24
+ maxShares?: bigint;
23
25
  } & ({
24
26
  shares: bigint;
25
27
  amount?: never;
@@ -1 +1 @@
1
- {"version":3,"file":"withdraw.d.ts","sourceRoot":"","sources":["../../src/evm/withdraw.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AACpC,OAAO,KAAK,EAAE,cAAc,EAAE,qBAAkB;AAEhD,OAAO,KAAK,EAAE,uBAAuB,EAAE,2BAAwB;AAE/D,OAAO,EAAoC,UAAU,EAAE,gCAAuB;AAyB9E,MAAM,MAAM,iBAAiB,GAAG;IAC9B,OAAO,EAAE,MAAM,CAAC;IAEhB,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,mGAAmG;IACnG,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,2EAA2E;IAC3E,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,2EAA2E;IAC3E,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,wFAAwF;IACxF,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;OAGG;IACH,iBAAiB,CAAC,EAAE,uBAAuB,CAAC;CAC7C,GAAG,CACA;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,KAAK,CAAC;IAAC,YAAY,CAAC,EAAE,KAAK,CAAA;CAAE,GACxD;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,KAAK,CAAC;IAAC,YAAY,CAAC,EAAE,KAAK,CAAA;CAAE,GACxD;IAAE,OAAO,CAAC,EAAE,OAAO,CAAC;IAAC,YAAY,EAAE,IAAI,CAAC;IAAC,MAAM,CAAC,EAAE,KAAK,CAAC;IAAC,MAAM,CAAC,EAAE,KAAK,CAAA;CAAE,CAC5E,CAAC;AA+EF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AACH,wBAAsB,aAAa,CACjC,MAAM,EAAE,cAAc,EACtB,MAAM,EAAE,iBAAiB,GACxB,OAAO,CAAC,UAAU,EAAE,CAAC,CAyGvB"}
1
+ {"version":3,"file":"withdraw.d.ts","sourceRoot":"","sources":["../../src/evm/withdraw.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AACpC,OAAO,KAAK,EAAE,cAAc,EAAE,qBAAkB;AAEhD,OAAO,KAAK,EAAE,uBAAuB,EAAE,2BAAwB;AAE/D,OAAO,EAAoC,UAAU,EAAE,gCAAuB;AA0B9E,MAAM,MAAM,iBAAiB,GAAG;IAC9B,OAAO,EAAE,MAAM,CAAC;IAEhB,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,mGAAmG;IACnG,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,2EAA2E;IAC3E,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,2EAA2E;IAC3E,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,wFAAwF;IACxF,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;OAGG;IACH,iBAAiB,CAAC,EAAE,uBAAuB,CAAC;IAC5C,2EAA2E;IAC3E,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,GAAG,CACA;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,KAAK,CAAC;IAAC,YAAY,CAAC,EAAE,KAAK,CAAA;CAAE,GACxD;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,KAAK,CAAC;IAAC,YAAY,CAAC,EAAE,KAAK,CAAA;CAAE,GACxD;IAAE,OAAO,CAAC,EAAE,OAAO,CAAC;IAAC,YAAY,EAAE,IAAI,CAAC;IAAC,MAAM,CAAC,EAAE,KAAK,CAAC;IAAC,MAAM,CAAC,EAAE,KAAK,CAAA;CAAE,CAC5E,CAAC;AAwFF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AACH,wBAAsB,aAAa,CACjC,MAAM,EAAE,cAAc,EACtB,MAAM,EAAE,iBAAiB,GACxB,OAAO,CAAC,UAAU,EAAE,CAAC,CAgHvB"}
@@ -1 +1 @@
1
- {"version":3,"file":"withdrawQuote.d.ts","sourceRoot":"","sources":["../../src/evm/withdrawQuote.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"withdrawQuote.d.ts","sourceRoot":"","sources":["../../src/evm/withdrawQuote.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -19,31 +19,23 @@ import {
19
19
  isVaultPaused,
20
20
  resolveAeraRuntimeContracts,
21
21
  resolveContractVersion
22
- } from "./chunk-7TA2OJUK.js";
22
+ } from "./chunk-YQXTLIJA.js";
23
23
  import {
24
24
  SHARE_DECIMALS,
25
- apiVaultIdFromVaultId,
26
25
  bigIntToDecimal,
27
26
  buildPositionHistory,
28
27
  decimalToBigInt,
29
- formatApiVaultId,
30
28
  getActivityFlows,
31
29
  getPositionHistory,
32
- parseApiVaultId,
33
30
  sharesToBigInt,
34
31
  stitchActivityFlows,
35
- vaultIdFromApiVaultId,
36
32
  waitForRequestSettlement
37
- } from "./chunk-SU6JAKIA.js";
38
- import {
39
- VaultId,
40
- getVaults
41
- } from "./chunk-STIV2CC4.js";
33
+ } from "./chunk-MEKISE2T.js";
42
34
  import {
43
35
  AttributionMode,
44
36
  GauntletClient,
45
37
  bundledVaultManifest
46
- } from "./chunk-S2TTA45N.js";
38
+ } from "./chunk-JRSNLXFY.js";
47
39
  import {
48
40
  AccountMismatchError,
49
41
  AccountRequiredError,
@@ -69,8 +61,14 @@ import {
69
61
  UnsupportedDepositModeError,
70
62
  UnsupportedFeatureError,
71
63
  UnsupportedProtocolError,
72
- VaultNotFoundError
73
- } from "./chunk-HC2BS7MK.js";
64
+ VaultId,
65
+ VaultNotFoundError,
66
+ apiVaultIdFromVaultId,
67
+ formatApiVaultId,
68
+ getVaults,
69
+ parseApiVaultId,
70
+ vaultIdFromApiVaultId
71
+ } from "./chunk-JJOLVL5V.js";
74
72
  export {
75
73
  AccountMismatchError,
76
74
  AccountRequiredError,
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  GauntletClient
3
- } from "../chunk-S2TTA45N.js";
4
- import "../chunk-HC2BS7MK.js";
3
+ } from "../chunk-JRSNLXFY.js";
4
+ import "../chunk-JJOLVL5V.js";
5
5
 
6
6
  // src/privy/index.ts
7
7
  import {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gauntlet-xyz/sdk",
3
- "version": "3.0.1",
3
+ "version": "3.1.1",
4
4
  "description": "Official Gauntlet SDK for vault deposits, withdrawals, and attribution",
5
5
  "license": "MIT",
6
6
  "keywords": [
@@ -1,3 +1,4 @@
1
+ import { activityLifecycles, orderActivityRows } from './activityRows';
1
2
  import { GauntletSDKError } from '../errors';
2
3
  import type { ActivityOptions, GauntletApi, TokenRef, UserActivity } from './client';
3
4
  import { decimalToBigInt, sharesToBigInt } from './decimal';
@@ -44,8 +45,8 @@ const PENDING_TYPES = new Set(['deposit_pending', 'withdraw_pending']);
44
45
  const REFUNDED_TYPES = new Set(['deposit_refunded', 'withdraw_refunded']);
45
46
 
46
47
  function flowKind(rowType: string): ActivityFlowKind {
47
- if (rowType.startsWith('deposit')) return 'deposit';
48
- if (rowType.startsWith('withdraw')) return 'withdraw';
48
+ if (['deposit', 'deposit_pending', 'deposit_refunded'].includes(rowType)) return 'deposit';
49
+ if (['withdraw', 'withdraw_pending', 'withdraw_refunded'].includes(rowType)) return 'withdraw';
49
50
  if (rowType === 'transfer_in' || rowType === 'transfer_out') return rowType;
50
51
  throw new GauntletSDKError(`Unknown activity row type "${rowType}"`);
51
52
  }
@@ -88,19 +89,10 @@ function toAssetAmount(rows: UserActivity[]): AssetAmount {
88
89
  * `request_hash`. Flows are returned newest-first (by the flow's latest row).
89
90
  */
90
91
  export function stitchActivityFlows(rows: UserActivity[]): ActivityFlow[] {
91
- const groups = new Map<string, UserActivity[]>();
92
- for (const [index, row] of rows.entries()) {
93
- // Rows without a request_hash are standalone sync flows: each one is its
94
- // own group, so two same-type events in one transaction (e.g. a multicall
95
- // doing two deposits) stay two flows.
96
- const key = row.request_hash ?? `row:${index}`;
97
- const group = groups.get(key);
98
- if (group) group.push(row);
99
- else groups.set(key, [row]);
100
- }
92
+ const groups = activityLifecycles(orderActivityRows(rows));
101
93
 
102
94
  const flows: ActivityFlow[] = [];
103
- for (const group of groups.values()) {
95
+ for (const group of groups) {
104
96
  group.sort((a, b) => a.block_timestamp - b.block_timestamp);
105
97
  const pendingRow = group.find((r) => PENDING_TYPES.has(r.type)) ?? null;
106
98
  const terminalRow = group.find((r) => !PENDING_TYPES.has(r.type)) ?? null;
@@ -183,6 +175,8 @@ export async function getActivityFlows(
183
175
  }
184
176
 
185
177
  export interface WaitForSettlementOptions {
178
+ /** Transaction hash of the submitted request. Prevents reuse of an earlier settlement. */
179
+ requestTxHash: string;
186
180
  /** CAIP-10 vault id — narrows polling to one vault's activity. */
187
181
  vaultId?: string;
188
182
  /** Polling interval. Defaults to 5s. */
@@ -200,15 +194,24 @@ export async function waitForRequestSettlement(
200
194
  api: GauntletApi,
201
195
  walletAddress: string,
202
196
  requestHash: string,
203
- options: WaitForSettlementOptions = {}
197
+ options: WaitForSettlementOptions
204
198
  ): Promise<ActivityFlow> {
199
+ if (typeof options?.requestTxHash !== 'string' || options.requestTxHash.length === 0) {
200
+ throw new GauntletSDKError(
201
+ 'Settlement polling requires the submitted request transaction hash'
202
+ );
203
+ }
205
204
  const pollIntervalMs = options.pollIntervalMs ?? 5_000;
206
205
  const timeoutMs = options.timeoutMs ?? 600_000;
207
206
  const deadline = Date.now() + timeoutMs;
208
207
 
209
208
  for (;;) {
210
209
  const flows = await getActivityFlows(api, walletAddress, { vaultId: options.vaultId });
211
- const flow = flows.find((f) => f.requestHash === requestHash);
210
+ const flow = flows.find(
211
+ (f) =>
212
+ f.requestHash === requestHash &&
213
+ f.txHashes.some((hash) => hash.toLowerCase() === options.requestTxHash.toLowerCase())
214
+ );
212
215
  if (flow && flow.status !== 'pending') return flow;
213
216
 
214
217
  if (Date.now() + pollIntervalMs > deadline) {