@gauntlet-xyz/sdk 2.0.0 → 2.5.0

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 (129) hide show
  1. package/README.md +134 -1
  2. package/dist/api/activity.d.ts +70 -0
  3. package/dist/api/activity.d.ts.map +1 -0
  4. package/dist/api/activity.js +154 -0
  5. package/dist/api/activity.js.map +1 -0
  6. package/dist/api/caip.d.ts +29 -0
  7. package/dist/api/caip.d.ts.map +1 -0
  8. package/dist/api/caip.js +38 -0
  9. package/dist/api/caip.js.map +1 -0
  10. package/dist/api/client.d.ts +135 -0
  11. package/dist/api/client.d.ts.map +1 -0
  12. package/dist/api/client.js +119 -0
  13. package/dist/api/client.js.map +1 -0
  14. package/dist/api/decimal.d.ts +21 -0
  15. package/dist/api/decimal.d.ts.map +1 -0
  16. package/dist/api/decimal.js +44 -0
  17. package/dist/api/decimal.js.map +1 -0
  18. package/dist/api/errors.d.ts +32 -0
  19. package/dist/api/errors.d.ts.map +1 -0
  20. package/dist/api/errors.js +41 -0
  21. package/dist/api/errors.js.map +1 -0
  22. package/dist/api/generated.d.ts +1505 -0
  23. package/dist/api/generated.d.ts.map +1 -0
  24. package/dist/api/generated.js +6 -0
  25. package/dist/api/generated.js.map +1 -0
  26. package/dist/api/http.d.ts +16 -0
  27. package/dist/api/http.d.ts.map +1 -0
  28. package/dist/api/http.js +39 -0
  29. package/dist/api/http.js.map +1 -0
  30. package/dist/api/index.d.ts +14 -0
  31. package/dist/api/index.d.ts.map +1 -0
  32. package/dist/api/index.js +8 -0
  33. package/dist/api/index.js.map +1 -0
  34. package/dist/api/positionHistory.d.ts +44 -0
  35. package/dist/api/positionHistory.d.ts.map +1 -0
  36. package/dist/api/positionHistory.js +126 -0
  37. package/dist/api/positionHistory.js.map +1 -0
  38. package/dist/client.d.ts +6 -0
  39. package/dist/client.d.ts.map +1 -1
  40. package/dist/client.js +2 -0
  41. package/dist/client.js.map +1 -1
  42. package/dist/errors.d.ts +11 -0
  43. package/dist/errors.d.ts.map +1 -1
  44. package/dist/errors.js +21 -2
  45. package/dist/errors.js.map +1 -1
  46. package/dist/evm/abis/priceAndFeeCalculatorV2.d.ts +44 -0
  47. package/dist/evm/abis/priceAndFeeCalculatorV2.d.ts.map +1 -1
  48. package/dist/evm/abis/priceAndFeeCalculatorV2.js +22 -0
  49. package/dist/evm/abis/priceAndFeeCalculatorV2.js.map +1 -1
  50. package/dist/evm/abis/provisionerV2.d.ts +280 -0
  51. package/dist/evm/abis/provisionerV2.d.ts.map +1 -1
  52. package/dist/evm/abis/provisionerV2.js +92 -0
  53. package/dist/evm/abis/provisionerV2.js.map +1 -1
  54. package/dist/evm/adapters/aera.d.ts.map +1 -1
  55. package/dist/evm/adapters/aera.js +41 -10
  56. package/dist/evm/adapters/aera.js.map +1 -1
  57. package/dist/evm/adapters/types.d.ts +2 -0
  58. package/dist/evm/adapters/types.d.ts.map +1 -1
  59. package/dist/evm/aeraContracts/priceAndFeeCalculator.d.ts +10 -5
  60. package/dist/evm/aeraContracts/priceAndFeeCalculator.d.ts.map +1 -1
  61. package/dist/evm/aeraContracts/priceAndFeeCalculator.js +39 -5
  62. package/dist/evm/aeraContracts/priceAndFeeCalculator.js.map +1 -1
  63. package/dist/evm/aeraContracts/readOptions.d.ts +8 -0
  64. package/dist/evm/aeraContracts/readOptions.d.ts.map +1 -0
  65. package/dist/evm/aeraContracts/readOptions.js +4 -0
  66. package/dist/evm/aeraContracts/readOptions.js.map +1 -0
  67. package/dist/evm/aeraContracts/v2.d.ts +1932 -217
  68. package/dist/evm/aeraContracts/v2.d.ts.map +1 -1
  69. package/dist/evm/aeraContracts/v2.js +84 -28
  70. package/dist/evm/aeraContracts/v2.js.map +1 -1
  71. package/dist/evm/aeraContracts.d.ts +9 -3
  72. package/dist/evm/aeraContracts.d.ts.map +1 -1
  73. package/dist/evm/aeraContracts.js +69 -8
  74. package/dist/evm/aeraContracts.js.map +1 -1
  75. package/dist/evm/deposit.d.ts.map +1 -1
  76. package/dist/evm/deposit.js +1 -1
  77. package/dist/evm/deposit.js.map +1 -1
  78. package/dist/evm/index.d.ts +8 -0
  79. package/dist/evm/index.d.ts.map +1 -1
  80. package/dist/evm/index.js +3 -0
  81. package/dist/evm/index.js.map +1 -1
  82. package/dist/evm/tokenModes.d.ts +22 -0
  83. package/dist/evm/tokenModes.d.ts.map +1 -0
  84. package/dist/evm/tokenModes.js +34 -0
  85. package/dist/evm/tokenModes.js.map +1 -0
  86. package/dist/evm/withdraw.d.ts +8 -0
  87. package/dist/evm/withdraw.d.ts.map +1 -1
  88. package/dist/evm/withdraw.js +85 -5
  89. package/dist/evm/withdraw.js.map +1 -1
  90. package/dist/evm/withdrawQuote.d.ts +127 -0
  91. package/dist/evm/withdrawQuote.d.ts.map +1 -0
  92. package/dist/evm/withdrawQuote.js +164 -0
  93. package/dist/evm/withdrawQuote.js.map +1 -0
  94. package/dist/index.d.ts +8 -1
  95. package/dist/index.d.ts.map +1 -1
  96. package/dist/index.js +4 -1
  97. package/dist/index.js.map +1 -1
  98. package/dist/privy/index.d.ts +52 -0
  99. package/dist/privy/index.d.ts.map +1 -0
  100. package/dist/privy/index.js +51 -0
  101. package/dist/privy/index.js.map +1 -0
  102. package/manifest/vaults.json +255 -3
  103. package/package.json +2 -2
  104. package/src/api/activity.ts +219 -0
  105. package/src/api/caip.ts +61 -0
  106. package/src/api/client.ts +234 -0
  107. package/src/api/decimal.ts +49 -0
  108. package/src/api/errors.ts +64 -0
  109. package/src/api/generated.ts +1505 -0
  110. package/src/api/http.ts +62 -0
  111. package/src/api/index.ts +70 -0
  112. package/src/api/positionHistory.ts +167 -0
  113. package/src/client.ts +7 -1
  114. package/src/errors.ts +32 -2
  115. package/src/evm/abis/priceAndFeeCalculatorV2.ts +22 -0
  116. package/src/evm/abis/provisionerV2.ts +92 -0
  117. package/src/evm/adapters/aera.ts +50 -23
  118. package/src/evm/adapters/types.ts +2 -0
  119. package/src/evm/aeraContracts/priceAndFeeCalculator.ts +72 -5
  120. package/src/evm/aeraContracts/readOptions.ts +3 -0
  121. package/src/evm/aeraContracts/v2.ts +158 -34
  122. package/src/evm/aeraContracts.ts +81 -8
  123. package/src/evm/deposit.ts +2 -1
  124. package/src/evm/index.ts +32 -0
  125. package/src/evm/tokenModes.ts +54 -0
  126. package/src/evm/withdraw.ts +131 -7
  127. package/src/evm/withdrawQuote.ts +360 -0
  128. package/src/index.ts +18 -0
  129. package/src/privy/index.ts +95 -0
package/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # @gauntlet-xyz/sdk
2
2
 
3
- Official Gauntlet SDK for interacting with Gauntlet-managed vaults — deposits, withdrawals, and on-chain attribution.
3
+ Official Gauntlet SDK for interacting with Gauntlet-managed vaults — deposits, withdrawals, on-chain attribution, and the Gauntlet REST API (vaults, positions, PnL, activity).
4
4
 
5
5
  ## Documentation
6
6
 
@@ -15,3 +15,136 @@ yarn add @gauntlet-xyz/sdk viem
15
15
  ```
16
16
 
17
17
  > `viem` is a required peer dependency.
18
+
19
+ ## Quick start
20
+
21
+ ```ts
22
+ import { createPublicClient, createWalletClient, custom, http } from 'viem';
23
+ import { base } from 'viem/chains';
24
+ import { GauntletClient, getVaults, getDepositTx } from '@gauntlet-xyz/sdk';
25
+
26
+ const client = new GauntletClient({
27
+ evmClients: { [base.id]: createPublicClient({ chain: base, transport: http() }) },
28
+ wallet: createWalletClient({ chain: base, transport: custom(window.ethereum) }),
29
+ builderCode: 'my-app', // ERC-8021 attribution
30
+ });
31
+
32
+ const vaults = await getVaults(client, { chainId: base.id });
33
+ const steps = await getDepositTx(client, { vaultId: vaults[0].vaultId, amount: 100_000_000n });
34
+ for (const step of steps) {
35
+ await client.wallet!.sendTransaction({
36
+ to: step.payload.to,
37
+ data: step.payload.data, // attribution suffix already applied
38
+ account: step.payload.account!,
39
+ chain: base,
40
+ });
41
+ }
42
+ ```
43
+
44
+ Using [Privy](https://privy.io)? `@gauntlet-xyz/sdk/privy` builds the client in one call:
45
+
46
+ ```ts
47
+ import { createGauntletClientFromPrivy } from '@gauntlet-xyz/sdk/privy';
48
+ import { base } from 'viem/chains';
49
+
50
+ const client = await createGauntletClientFromPrivy({
51
+ wallet: wallets[0], // from useWallets()
52
+ chains: [base],
53
+ builderCode: 'my-app',
54
+ });
55
+ ```
56
+
57
+ ## Aera instant withdrawals
58
+
59
+ Use the live capability result to decide whether to offer an instant withdrawal, then pass the
60
+ quote back to `getWithdrawTx` so the submitted transaction uses the quoted bounds.
61
+
62
+ ```ts
63
+ import {
64
+ getAeraTokenModeSupport,
65
+ getSyncWithdrawQuote,
66
+ getWithdrawTx,
67
+ VaultId,
68
+ } from '@gauntlet-xyz/sdk'
69
+
70
+ const vaultId = VaultId.AeraUsdAlpha
71
+ const support = await getAeraTokenModeSupport(client, { vaultId })
72
+
73
+ if (support.syncRedeem) {
74
+ const quote = await getSyncWithdrawQuote(client, {
75
+ vaultId,
76
+ amount: 1_000_000n,
77
+ slippageBps: 100,
78
+ })
79
+ const steps = await getWithdrawTx(client, {
80
+ vaultId,
81
+ amount: 1_000_000n,
82
+ syncWithdrawQuote: quote,
83
+ })
84
+ }
85
+ ```
86
+
87
+ An `amount` quote uses exact token output and returns a `maxUnitsIn` bound. A `shares` quote uses
88
+ exact shares and returns a `minTokensOut` bound. Full-position quotes require
89
+ `{ entireAmount: true, account }`; the matching transaction uses the configured wallet account,
90
+ and an optional `account` must match that wallet. The returned `SyncWithdrawQuote` is directly
91
+ assignable to the exported `SyncWithdrawQuoteBounds` accepted by `getWithdrawTx`.
92
+
93
+ Supplying `syncWithdrawQuote` implies sync mode and validates its vault, chain, token, account,
94
+ slippage, and sizing request. When transaction slippage is omitted, the builder uses the quote's
95
+ slippage; an explicitly supplied value must match. A `shares` or `entireAmount` quote with
96
+ `slippageBps: 10000` is rejected because it would produce `minTokensOut: 0`.
97
+
98
+ Live capability checks also apply the V2 solving gate. While the gate pauses the provisioner/token
99
+ pair, both sync flags are false and sync quote or transaction requests are rejected.
100
+
101
+ Common failures are `UnsupportedDepositModeError`,
102
+ `UnsupportedFeatureError`, `StalePriceError`, `InvalidSyncWithdrawBoundError`,
103
+ `InvalidWithdrawParamsError`, `AccountRequiredError`, and `AccountMismatchError`.
104
+
105
+ ## REST API (`client.api`)
106
+
107
+ `client.api` is a typed client for the Gauntlet API at `api.gauntlet.xyz` — indexed vault metrics, user positions with PnL, the wallet activity log, TVL, and token prices. Response types are generated from the service's OpenAPI spec and verified in CI, so they cannot drift.
108
+
109
+ ```ts
110
+ const client = new GauntletClient({ apiKey: process.env.GAUNTLET_API_KEY });
111
+
112
+ const { data: vaults } = await client.api.vaults(); // live TVL / APY / unit price
113
+ const { data: positions } = await client.api.positions(wallet); // value, cost basis, PnL, ROI
114
+ const { data: history } = await client.api.positionTimeseries(wallet, vaultId);
115
+ ```
116
+
117
+ Vault ids on the API are CAIP-10 (`"{chainId}:{address}"`); convert to and from manifest vault ids with `apiVaultIdFromVaultId` / `vaultIdFromApiVaultId`. Monetary values are human-unit decimal strings; convert exactly with `decimalToBigInt` / `sharesToBigInt` (throws instead of rounding).
118
+
119
+ ### Activity flows
120
+
121
+ `getActivityFlows` stitches the raw activity log into lifecycle-aware flows — Aera async requests are paired with their settlement or refund via `request_hash`, replacing client-side event-log scanning:
122
+
123
+ ```ts
124
+ import { getActivityFlows, waitForRequestSettlement } from '@gauntlet-xyz/sdk';
125
+
126
+ const flows = await getActivityFlows(client.api, wallet);
127
+ // [{ kind: 'deposit', status: 'pending', requestedAt, settledAt, assets, shares, txHashes, ... }]
128
+
129
+ // After submitting a requestDeposit / requestRedeem transaction:
130
+ const settled = await waitForRequestSettlement(client.api, wallet, requestHash);
131
+ ```
132
+
133
+ ### Position history
134
+
135
+ `getPositionHistory` replays a wallet's indexed events into a chronological position timeline — running share balance, escrowed pending amounts, and net asset flows:
136
+
137
+ ```ts
138
+ import { getPositionHistory, apiVaultIdFromVaultId } from '@gauntlet-xyz/sdk';
139
+
140
+ const vaultId = await apiVaultIdFromVaultId(client, 'gtusda');
141
+ const { points } = await getPositionHistory(client.api, wallet, vaultId);
142
+ ```
143
+
144
+ ## Fee wrapper vaults (partners)
145
+
146
+ Partner fee wrapper vaults are Aera vaults deployed exclusively for one partner, so they are not in the bundled manifest. Register yours with `client.setManifest`: extend `await client.manifest` with your vault entry (deployment values provided by Gauntlet) and every SDK function then accepts its `vaultId`. See the [fee wrapper guide](https://docs.gauntlet.xyz/sdk/reference#fee-wrapper-vaults-partners) for the full example.
147
+
148
+ ## Development
149
+
150
+ `src/api/generated.ts` is generated from `services/gaia/api/openapi.json` — regenerate with `yarn generate:api-types` after API changes; CI fails if it drifts.
@@ -0,0 +1,70 @@
1
+ import type { ActivityOptions, GauntletApi, TokenRef, UserActivity } from './client';
2
+ export type ActivityFlowKind = 'deposit' | 'withdraw' | 'transfer_in' | 'transfer_out';
3
+ export type ActivityFlowStatus = 'settled' | 'pending' | 'refunded';
4
+ /** A signed token amount as reported by the API, with base-unit conversion when possible. */
5
+ export interface AssetAmount {
6
+ /** Human-unit decimal string exactly as the API emits it, e.g. `"1250.5"`. */
7
+ decimal: string;
8
+ /** Base-unit integer (`decimal × 10^token.decimals`); null when the token's decimals are unknown. */
9
+ raw: bigint | null;
10
+ token: TokenRef | null;
11
+ }
12
+ /**
13
+ * One user action against a vault, stitched from the activity log's immutable
14
+ * rows. Sync flows (Morpho, secondary-market transfers) come from a single
15
+ * row; Aera async flows pair a `*_pending` request row with its terminal
16
+ * settle/refund row via `request_hash`.
17
+ */
18
+ export interface ActivityFlow {
19
+ kind: ActivityFlowKind;
20
+ status: ActivityFlowStatus;
21
+ /** CAIP-10 vault id (`"{chainId}:{address}"`). */
22
+ vaultId: string;
23
+ /** Aera async correlation hash; null for sync flows and transfers. */
24
+ requestHash: string | null;
25
+ /** When the request row landed. Null when the flow's pending row is outside the fetched window. */
26
+ requestedAt: Date | null;
27
+ /** When the terminal (settle/refund) row landed. Null while pending. */
28
+ settledAt: Date | null;
29
+ /** Magnitude of the flow's asset movement (requested amount for refunded flows). */
30
+ assets: AssetAmount;
31
+ /** Magnitude of the flow's share movement in 18-decimal base units. */
32
+ shares: bigint;
33
+ /** Transaction hashes in row order (request first, then settlement, when both are known). */
34
+ txHashes: string[];
35
+ }
36
+ /**
37
+ * Pure stitcher: folds raw activity rows into `ActivityFlow`s. Rows may be in
38
+ * any order and may span multiple vaults; async lifecycles are paired by
39
+ * `request_hash`. Flows are returned newest-first (by the flow's latest row).
40
+ */
41
+ export declare function stitchActivityFlows(rows: UserActivity[]): ActivityFlow[];
42
+ export interface ActivityFlowsOptions extends Pick<ActivityOptions, 'vaultId' | 'limit'> {
43
+ /** Stop paginating once this many rows have been fetched. Defaults to 1000. */
44
+ maxRows?: number;
45
+ }
46
+ /**
47
+ * Fetches the wallet's activity log and stitches it into lifecycle-aware
48
+ * flows — the replacement for scanning vault event logs over RPC.
49
+ *
50
+ * ```ts
51
+ * const flows = await getActivityFlows(client.api, wallet);
52
+ * const open = flows.filter((f) => f.status === 'pending');
53
+ * ```
54
+ */
55
+ export declare function getActivityFlows(api: GauntletApi, walletAddress: string, options?: ActivityFlowsOptions): Promise<ActivityFlow[]>;
56
+ export interface WaitForSettlementOptions {
57
+ /** CAIP-10 vault id — narrows polling to one vault's activity. */
58
+ vaultId?: string;
59
+ /** Polling interval. Defaults to 5s. */
60
+ pollIntervalMs?: number;
61
+ /** Overall deadline. Defaults to 10 minutes. Throws `SettlementTimeoutError` on expiry. */
62
+ timeoutMs?: number;
63
+ }
64
+ /**
65
+ * Polls the activity log until the Aera async request identified by
66
+ * `requestHash` reaches a terminal state, and returns the settled or refunded
67
+ * flow. Use after submitting a `requestDeposit` / `requestRedeem` transaction.
68
+ */
69
+ export declare function waitForRequestSettlement(api: GauntletApi, walletAddress: string, requestHash: string, options?: WaitForSettlementOptions): Promise<ActivityFlow>;
70
+ //# sourceMappingURL=activity.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"activity.d.ts","sourceRoot":"","sources":["../../src/api/activity.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,WAAW,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAIrF,MAAM,MAAM,gBAAgB,GAAG,SAAS,GAAG,UAAU,GAAG,aAAa,GAAG,cAAc,CAAC;AACvF,MAAM,MAAM,kBAAkB,GAAG,SAAS,GAAG,SAAS,GAAG,UAAU,CAAC;AAEpE,6FAA6F;AAC7F,MAAM,WAAW,WAAW;IAC1B,8EAA8E;IAC9E,OAAO,EAAE,MAAM,CAAC;IAChB,qGAAqG;IACrG,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,KAAK,EAAE,QAAQ,GAAG,IAAI,CAAC;CACxB;AAED;;;;;GAKG;AACH,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,gBAAgB,CAAC;IACvB,MAAM,EAAE,kBAAkB,CAAC;IAC3B,kDAAkD;IAClD,OAAO,EAAE,MAAM,CAAC;IAChB,sEAAsE;IACtE,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,mGAAmG;IACnG,WAAW,EAAE,IAAI,GAAG,IAAI,CAAC;IACzB,wEAAwE;IACxE,SAAS,EAAE,IAAI,GAAG,IAAI,CAAC;IACvB,oFAAoF;IACpF,MAAM,EAAE,WAAW,CAAC;IACpB,uEAAuE;IACvE,MAAM,EAAE,MAAM,CAAC;IACf,6FAA6F;IAC7F,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AA4CD;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,YAAY,EAAE,GAAG,YAAY,EAAE,CAoDxE;AAED,MAAM,WAAW,oBAAqB,SAAQ,IAAI,CAAC,eAAe,EAAE,SAAS,GAAG,OAAO,CAAC;IACtF,+EAA+E;IAC/E,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;;;;;;;GAQG;AACH,wBAAsB,gBAAgB,CACpC,GAAG,EAAE,WAAW,EAChB,aAAa,EAAE,MAAM,EACrB,OAAO,GAAE,oBAAyB,GACjC,OAAO,CAAC,YAAY,EAAE,CAAC,CAqBzB;AAED,MAAM,WAAW,wBAAwB;IACvC,kEAAkE;IAClE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,wCAAwC;IACxC,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,2FAA2F;IAC3F,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;GAIG;AACH,wBAAsB,wBAAwB,CAC5C,GAAG,EAAE,WAAW,EAChB,aAAa,EAAE,MAAM,EACrB,WAAW,EAAE,MAAM,EACnB,OAAO,GAAE,wBAA6B,GACrC,OAAO,CAAC,YAAY,CAAC,CAevB"}
@@ -0,0 +1,154 @@
1
+ import { GauntletSDKError } from '../errors';
2
+ import { decimalToBigInt, sharesToBigInt } from './decimal';
3
+ import { SettlementTimeoutError } from './errors';
4
+ const PENDING_TYPES = new Set(['deposit_pending', 'withdraw_pending']);
5
+ const REFUNDED_TYPES = new Set(['deposit_refunded', 'withdraw_refunded']);
6
+ function flowKind(rowType) {
7
+ if (rowType.startsWith('deposit'))
8
+ return 'deposit';
9
+ if (rowType.startsWith('withdraw'))
10
+ return 'withdraw';
11
+ if (rowType === 'transfer_in' || rowType === 'transfer_out')
12
+ return rowType;
13
+ throw new GauntletSDKError(`Unknown activity row type "${rowType}"`);
14
+ }
15
+ function abs(value) {
16
+ return value < 0n ? -value : value;
17
+ }
18
+ /**
19
+ * Comparison scale for asset amounts. The API emits human-unit decimal strings
20
+ * with at most `token.decimals` fractional digits, so 18 digits is exact for
21
+ * every supported asset.
22
+ */
23
+ const ASSET_SCALE = 18;
24
+ function toAssetAmount(rows) {
25
+ // Per the API contract, at most one row of an async lifecycle carries the
26
+ // asset movement (the other legs are "0"), so the max magnitude is the
27
+ // flow's amount. For refunded flows this surfaces the requested amount
28
+ // instead of the useless net of zero.
29
+ let best = rows[0];
30
+ let bestMagnitude = abs(decimalToBigInt(best.assets_delta.native, ASSET_SCALE));
31
+ for (const row of rows.slice(1)) {
32
+ const magnitude = abs(decimalToBigInt(row.assets_delta.native, ASSET_SCALE));
33
+ if (magnitude > bestMagnitude) {
34
+ best = row;
35
+ bestMagnitude = magnitude;
36
+ }
37
+ }
38
+ const token = best.assets_delta.token ?? rows.find((r) => r.assets_delta.token)?.assets_delta.token ?? null;
39
+ const decimal = best.assets_delta.native.replace(/^-/, '');
40
+ const raw = token?.decimals != null ? decimalToBigInt(decimal, token.decimals) : null;
41
+ return { decimal, raw, token };
42
+ }
43
+ /**
44
+ * Pure stitcher: folds raw activity rows into `ActivityFlow`s. Rows may be in
45
+ * any order and may span multiple vaults; async lifecycles are paired by
46
+ * `request_hash`. Flows are returned newest-first (by the flow's latest row).
47
+ */
48
+ export function stitchActivityFlows(rows) {
49
+ const groups = new Map();
50
+ for (const [index, row] of rows.entries()) {
51
+ // Rows without a request_hash are standalone sync flows: each one is its
52
+ // own group, so two same-type events in one transaction (e.g. a multicall
53
+ // doing two deposits) stay two flows.
54
+ const key = row.request_hash ?? `row:${index}`;
55
+ const group = groups.get(key);
56
+ if (group)
57
+ group.push(row);
58
+ else
59
+ groups.set(key, [row]);
60
+ }
61
+ const flows = [];
62
+ for (const group of groups.values()) {
63
+ group.sort((a, b) => a.block_timestamp - b.block_timestamp);
64
+ const pendingRow = group.find((r) => PENDING_TYPES.has(r.type)) ?? null;
65
+ const terminalRow = group.find((r) => !PENDING_TYPES.has(r.type)) ?? null;
66
+ const isAsync = group.some((r) => r.request_hash != null);
67
+ let status;
68
+ if (!terminalRow)
69
+ status = 'pending';
70
+ else if (REFUNDED_TYPES.has(terminalRow.type))
71
+ status = 'refunded';
72
+ else
73
+ status = 'settled';
74
+ let sharesMagnitude = 0n;
75
+ for (const row of group) {
76
+ const shares = abs(sharesToBigInt(row.shares_delta));
77
+ if (shares > sharesMagnitude)
78
+ sharesMagnitude = shares;
79
+ }
80
+ flows.push({
81
+ kind: flowKind((terminalRow ?? pendingRow ?? group[0]).type),
82
+ status,
83
+ vaultId: group[0].vault_id,
84
+ requestHash: group[0].request_hash ?? null,
85
+ requestedAt: pendingRow
86
+ ? new Date(pendingRow.block_timestamp * 1000)
87
+ : isAsync
88
+ ? null
89
+ : new Date(group[0].block_timestamp * 1000),
90
+ settledAt: terminalRow ? new Date(terminalRow.block_timestamp * 1000) : null,
91
+ assets: toAssetAmount(group),
92
+ shares: sharesMagnitude,
93
+ txHashes: [...new Set(group.map((r) => r.tx_hash))],
94
+ });
95
+ }
96
+ return flows.sort((a, b) => {
97
+ const aAt = (a.settledAt ?? a.requestedAt)?.getTime() ?? 0;
98
+ const bAt = (b.settledAt ?? b.requestedAt)?.getTime() ?? 0;
99
+ return bAt - aAt;
100
+ });
101
+ }
102
+ /**
103
+ * Fetches the wallet's activity log and stitches it into lifecycle-aware
104
+ * flows — the replacement for scanning vault event logs over RPC.
105
+ *
106
+ * ```ts
107
+ * const flows = await getActivityFlows(client.api, wallet);
108
+ * const open = flows.filter((f) => f.status === 'pending');
109
+ * ```
110
+ */
111
+ export async function getActivityFlows(api, walletAddress, options = {}) {
112
+ const maxRows = options.maxRows ?? 1000;
113
+ const rows = [];
114
+ for await (const row of api.activityRows(walletAddress, {
115
+ vaultId: options.vaultId,
116
+ // The API caps page size at 1000; request maxRows per page so the common
117
+ // case is a single round trip instead of ten default-100 pages.
118
+ limit: options.limit ?? Math.min(maxRows, 1000),
119
+ order: 'desc',
120
+ })) {
121
+ rows.push(row);
122
+ if (rows.length >= maxRows)
123
+ break;
124
+ }
125
+ const flows = stitchActivityFlows(rows);
126
+ if (rows.length >= maxRows) {
127
+ // The window cut may have split an async lifecycle, keeping a terminal
128
+ // row whose request leg (the one carrying the amount) fell outside the
129
+ // window. Drop those flows rather than reporting zeroed amounts.
130
+ return flows.filter((f) => f.requestHash === null || f.requestedAt !== null);
131
+ }
132
+ return flows;
133
+ }
134
+ /**
135
+ * Polls the activity log until the Aera async request identified by
136
+ * `requestHash` reaches a terminal state, and returns the settled or refunded
137
+ * flow. Use after submitting a `requestDeposit` / `requestRedeem` transaction.
138
+ */
139
+ export async function waitForRequestSettlement(api, walletAddress, requestHash, options = {}) {
140
+ const pollIntervalMs = options.pollIntervalMs ?? 5000;
141
+ const timeoutMs = options.timeoutMs ?? 600000;
142
+ const deadline = Date.now() + timeoutMs;
143
+ for (;;) {
144
+ const flows = await getActivityFlows(api, walletAddress, { vaultId: options.vaultId });
145
+ const flow = flows.find((f) => f.requestHash === requestHash);
146
+ if (flow && flow.status !== 'pending')
147
+ return flow;
148
+ if (Date.now() + pollIntervalMs > deadline) {
149
+ throw new SettlementTimeoutError(requestHash, timeoutMs);
150
+ }
151
+ await new Promise((resolve) => setTimeout(resolve, pollIntervalMs));
152
+ }
153
+ }
154
+ //# sourceMappingURL=activity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"activity.js","sourceRoot":"","sources":["../../src/api/activity.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAE7C,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAC5D,OAAO,EAAE,sBAAsB,EAAE,MAAM,UAAU,CAAC;AAuClD,MAAM,aAAa,GAAG,IAAI,GAAG,CAAC,CAAC,iBAAiB,EAAE,kBAAkB,CAAC,CAAC,CAAC;AACvE,MAAM,cAAc,GAAG,IAAI,GAAG,CAAC,CAAC,kBAAkB,EAAE,mBAAmB,CAAC,CAAC,CAAC;AAE1E,SAAS,QAAQ,CAAC,OAAe;IAC/B,IAAI,OAAO,CAAC,UAAU,CAAC,SAAS,CAAC;QAAE,OAAO,SAAS,CAAC;IACpD,IAAI,OAAO,CAAC,UAAU,CAAC,UAAU,CAAC;QAAE,OAAO,UAAU,CAAC;IACtD,IAAI,OAAO,KAAK,aAAa,IAAI,OAAO,KAAK,cAAc;QAAE,OAAO,OAAO,CAAC;IAC5E,MAAM,IAAI,gBAAgB,CAAC,8BAA8B,OAAO,GAAG,CAAC,CAAC;AACvE,CAAC;AAED,SAAS,GAAG,CAAC,KAAa;IACxB,OAAO,KAAK,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC;AACrC,CAAC;AAED;;;;GAIG;AACH,MAAM,WAAW,GAAG,EAAE,CAAC;AAEvB,SAAS,aAAa,CAAC,IAAoB;IACzC,0EAA0E;IAC1E,uEAAuE;IACvE,uEAAuE;IACvE,sCAAsC;IACtC,IAAI,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IACnB,IAAI,aAAa,GAAG,GAAG,CAAC,eAAe,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC;IAChF,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;QAChC,MAAM,SAAS,GAAG,GAAG,CAAC,eAAe,CAAC,GAAG,CAAC,YAAY,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC;QAC7E,IAAI,SAAS,GAAG,aAAa,EAAE,CAAC;YAC9B,IAAI,GAAG,GAAG,CAAC;YACX,aAAa,GAAG,SAAS,CAAC;QAC5B,CAAC;IACH,CAAC;IACD,MAAM,KAAK,GACT,IAAI,CAAC,YAAY,CAAC,KAAK,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC,KAAK,CAAC,EAAE,YAAY,CAAC,KAAK,IAAI,IAAI,CAAC;IAChG,MAAM,OAAO,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IAC3D,MAAM,GAAG,GAAG,KAAK,EAAE,QAAQ,IAAI,IAAI,CAAC,CAAC,CAAC,eAAe,CAAC,OAAO,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACtF,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC;AACjC,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,mBAAmB,CAAC,IAAoB;IACtD,MAAM,MAAM,GAAG,IAAI,GAAG,EAA0B,CAAC;IACjD,KAAK,MAAM,CAAC,KAAK,EAAE,GAAG,CAAC,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE,CAAC;QAC1C,yEAAyE;QACzE,0EAA0E;QAC1E,sCAAsC;QACtC,MAAM,GAAG,GAAG,GAAG,CAAC,YAAY,IAAI,OAAO,KAAK,EAAE,CAAC;QAC/C,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAC9B,IAAI,KAAK;YAAE,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;;YACtB,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC9B,CAAC;IAED,MAAM,KAAK,GAAmB,EAAE,CAAC;IACjC,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC;QACpC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,eAAe,GAAG,CAAC,CAAC,eAAe,CAAC,CAAC;QAC5D,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC;QACxE,MAAM,WAAW,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC;QAC1E,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,YAAY,IAAI,IAAI,CAAC,CAAC;QAE1D,IAAI,MAA0B,CAAC;QAC/B,IAAI,CAAC,WAAW;YAAE,MAAM,GAAG,SAAS,CAAC;aAChC,IAAI,cAAc,CAAC,GAAG,CAAC,WAAW,CAAC,IAAI,CAAC;YAAE,MAAM,GAAG,UAAU,CAAC;;YAC9D,MAAM,GAAG,SAAS,CAAC;QAExB,IAAI,eAAe,GAAG,EAAE,CAAC;QACzB,KAAK,MAAM,GAAG,IAAI,KAAK,EAAE,CAAC;YACxB,MAAM,MAAM,GAAG,GAAG,CAAC,cAAc,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC;YACrD,IAAI,MAAM,GAAG,eAAe;gBAAE,eAAe,GAAG,MAAM,CAAC;QACzD,CAAC;QAED,KAAK,CAAC,IAAI,CAAC;YACT,IAAI,EAAE,QAAQ,CAAC,CAAC,WAAW,IAAI,UAAU,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;YAC5D,MAAM;YACN,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ;YAC1B,WAAW,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,YAAY,IAAI,IAAI;YAC1C,WAAW,EAAE,UAAU;gBACrB,CAAC,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,eAAe,GAAG,IAAI,CAAC;gBAC7C,CAAC,CAAC,OAAO;oBACP,CAAC,CAAC,IAAI;oBACN,CAAC,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,eAAe,GAAG,IAAI,CAAC;YAC/C,SAAS,EAAE,WAAW,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,WAAW,CAAC,eAAe,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI;YAC5E,MAAM,EAAE,aAAa,CAAC,KAAK,CAAC;YAC5B,MAAM,EAAE,eAAe;YACvB,QAAQ,EAAE,CAAC,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;SACpD,CAAC,CAAC;IACL,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QACzB,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC,WAAW,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;QAC3D,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC,WAAW,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;QAC3D,OAAO,GAAG,GAAG,GAAG,CAAC;IACnB,CAAC,CAAC,CAAC;AACL,CAAC;AAOD;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,GAAgB,EAChB,aAAqB,EACrB,UAAgC,EAAE;IAElC,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,IAAI,CAAC;IACxC,MAAM,IAAI,GAAmB,EAAE,CAAC;IAChC,IAAI,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,CAAC,YAAY,CAAC,aAAa,EAAE;QACtD,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,yEAAyE;QACzE,gEAAgE;QAChE,KAAK,EAAE,OAAO,CAAC,KAAK,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,CAAC;QAC/C,KAAK,EAAE,MAAM;KACd,CAAC,EAAE,CAAC;QACH,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACf,IAAI,IAAI,CAAC,MAAM,IAAI,OAAO;YAAE,MAAM;IACpC,CAAC;IACD,MAAM,KAAK,GAAG,mBAAmB,CAAC,IAAI,CAAC,CAAC;IACxC,IAAI,IAAI,CAAC,MAAM,IAAI,OAAO,EAAE,CAAC;QAC3B,uEAAuE;QACvE,uEAAuE;QACvE,iEAAiE;QACjE,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,KAAK,IAAI,IAAI,CAAC,CAAC,WAAW,KAAK,IAAI,CAAC,CAAC;IAC/E,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAWD;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAC5C,GAAgB,EAChB,aAAqB,EACrB,WAAmB,EACnB,UAAoC,EAAE;IAEtC,MAAM,cAAc,GAAG,OAAO,CAAC,cAAc,IAAI,IAAK,CAAC;IACvD,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,MAAO,CAAC;IAC/C,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;IAExC,SAAS,CAAC;QACR,MAAM,KAAK,GAAG,MAAM,gBAAgB,CAAC,GAAG,EAAE,aAAa,EAAE,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;QACvF,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,KAAK,WAAW,CAAC,CAAC;QAC9D,IAAI,IAAI,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS;YAAE,OAAO,IAAI,CAAC;QAEnD,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,cAAc,GAAG,QAAQ,EAAE,CAAC;YAC3C,MAAM,IAAI,sBAAsB,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;QAC3D,CAAC;QACD,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC,CAAC;IACtE,CAAC;AACH,CAAC"}
@@ -0,0 +1,29 @@
1
+ import type { GauntletClient } from '../client';
2
+ /**
3
+ * The Gaia API identifies vaults as `"{chainId}:{address}"` with a lowercase
4
+ * address (a CAIP-10-style account id without the `eip155` namespace prefix).
5
+ */
6
+ export interface ApiVaultId {
7
+ chainId: number;
8
+ /** Lowercase EVM address. */
9
+ address: string;
10
+ }
11
+ export declare function parseApiVaultId(id: string): ApiVaultId;
12
+ export declare function formatApiVaultId(chainId: number, address: string): string;
13
+ /**
14
+ * Resolves a manifest vault id (e.g. `VaultId.AeraUsdAlpha` / `'gtusda'`) to
15
+ * the Gaia API's CAIP-10 id for the vault's deployment on `chainId`.
16
+ *
17
+ * Deployment resolution is `resolveVault` — the same rules tx-building uses:
18
+ * single-deployment vaults resolve directly (a mismatched explicit `chainId`
19
+ * throws `ChainMismatchError`), multi-chain vaults default to Base when
20
+ * `chainId` is omitted.
21
+ */
22
+ export declare function apiVaultIdFromVaultId(client: GauntletClient, vaultId: string, chainId?: number): Promise<string>;
23
+ /**
24
+ * Resolves a Gaia API CAIP-10 vault id back to the manifest vault id, or
25
+ * `undefined` when the vault is not in the bundled manifest (the API indexes
26
+ * more vaults than the manifest lists).
27
+ */
28
+ export declare function vaultIdFromApiVaultId(client: GauntletClient, apiVaultId: string): Promise<string | undefined>;
29
+ //# sourceMappingURL=caip.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"caip.d.ts","sourceRoot":"","sources":["../../src/api/caip.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAKhD;;;GAGG;AACH,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,6BAA6B;IAC7B,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,wBAAgB,eAAe,CAAC,EAAE,EAAE,MAAM,GAAG,UAAU,CAItD;AAED,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAEzE;AAED;;;;;;;;GAQG;AACH,wBAAsB,qBAAqB,CACzC,MAAM,EAAE,cAAc,EACtB,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE,MAAM,GACf,OAAO,CAAC,MAAM,CAAC,CAIjB;AAED;;;;GAIG;AACH,wBAAsB,qBAAqB,CACzC,MAAM,EAAE,cAAc,EACtB,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAQ7B"}
@@ -0,0 +1,38 @@
1
+ import { VaultNotFoundError } from '../errors';
2
+ import { resolveVault } from '../evm/vaults';
3
+ import { InvalidCaipIdError } from './errors';
4
+ export function parseApiVaultId(id) {
5
+ const match = /^(?:eip155:)?(\d+):(0x[0-9a-fA-F]{40})$/.exec(id);
6
+ if (!match)
7
+ throw new InvalidCaipIdError(id);
8
+ return { chainId: Number(match[1]), address: match[2].toLowerCase() };
9
+ }
10
+ export function formatApiVaultId(chainId, address) {
11
+ return `${chainId}:${address.toLowerCase()}`;
12
+ }
13
+ /**
14
+ * Resolves a manifest vault id (e.g. `VaultId.AeraUsdAlpha` / `'gtusda'`) to
15
+ * the Gaia API's CAIP-10 id for the vault's deployment on `chainId`.
16
+ *
17
+ * Deployment resolution is `resolveVault` — the same rules tx-building uses:
18
+ * single-deployment vaults resolve directly (a mismatched explicit `chainId`
19
+ * throws `ChainMismatchError`), multi-chain vaults default to Base when
20
+ * `chainId` is omitted.
21
+ */
22
+ export async function apiVaultIdFromVaultId(client, vaultId, chainId) {
23
+ const resolved = await resolveVault(client, vaultId, chainId);
24
+ if (!resolved)
25
+ throw new VaultNotFoundError(vaultId, chainId);
26
+ return formatApiVaultId(resolved.vault.chainId, resolved.vault.vaultAddress);
27
+ }
28
+ /**
29
+ * Resolves a Gaia API CAIP-10 vault id back to the manifest vault id, or
30
+ * `undefined` when the vault is not in the bundled manifest (the API indexes
31
+ * more vaults than the manifest lists).
32
+ */
33
+ export async function vaultIdFromApiVaultId(client, apiVaultId) {
34
+ const { chainId, address } = parseApiVaultId(apiVaultId);
35
+ const manifest = await client.manifest;
36
+ return manifest.vaults.find((v) => v.deployments.some((d) => d.chain === 'evm' && d.chainId === chainId && d.vaultAddress.toLowerCase() === address))?.vaultId;
37
+ }
38
+ //# sourceMappingURL=caip.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"caip.js","sourceRoot":"","sources":["../../src/api/caip.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AAY9C,MAAM,UAAU,eAAe,CAAC,EAAU;IACxC,MAAM,KAAK,GAAG,yCAAyC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjE,IAAI,CAAC,KAAK;QAAE,MAAM,IAAI,kBAAkB,CAAC,EAAE,CAAC,CAAC;IAC7C,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC;AACxE,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,OAAe,EAAE,OAAe;IAC/D,OAAO,GAAG,OAAO,IAAI,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC;AAC/C,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,MAAsB,EACtB,OAAe,EACf,OAAgB;IAEhB,MAAM,QAAQ,GAAG,MAAM,YAAY,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;IAC9D,IAAI,CAAC,QAAQ;QAAE,MAAM,IAAI,kBAAkB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAC9D,OAAO,gBAAgB,CAAC,QAAQ,CAAC,KAAK,CAAC,OAAO,EAAE,QAAQ,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;AAC/E,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,MAAsB,EACtB,UAAkB;IAElB,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,eAAe,CAAC,UAAU,CAAC,CAAC;IACzD,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC;IACvC,OAAO,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAChC,CAAC,CAAC,WAAW,CAAC,IAAI,CAChB,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,KAAK,IAAI,CAAC,CAAC,OAAO,KAAK,OAAO,IAAI,CAAC,CAAC,YAAY,CAAC,WAAW,EAAE,KAAK,OAAO,CAC9F,CACF,EAAE,OAAO,CAAC;AACb,CAAC"}
@@ -0,0 +1,135 @@
1
+ import type { components } from './generated';
2
+ import { type GauntletApiConfig } from './http';
3
+ type Schemas = components['schemas'];
4
+ export type UserActivity = Schemas['UserActivity'];
5
+ export type UserActivityResponse = Schemas['UserActivityResponse'];
6
+ export type UserPosition = Schemas['UserPosition'];
7
+ export type UserAllPositionsResponse = Schemas['UserAllPositionsResponse'];
8
+ export type UserPositionLatestResponse = Schemas['UserPositionLatestResponse'];
9
+ export type UserPositionsTimeseriesResponse = Schemas['UserPositionsTimeseriesResponse'];
10
+ export type PositionTimeseriesPoint = Schemas['PositionTimeseriesPoint'];
11
+ export type VaultDetail = Schemas['VaultDetail'];
12
+ export type VaultDetailResponse = Schemas['VaultDetailResponse'];
13
+ export type VaultTimeseriesResponse = Schemas['VaultTimeseriesResponse'];
14
+ export type VaultTimeseriesPoint = Schemas['VaultTimeseriesPoint'];
15
+ export type VaultMetrics = Schemas['VaultMetrics'];
16
+ export type FeaturedVault = Schemas['FeaturedVault'];
17
+ export type FeaturedVaultsResponse = Schemas['FeaturedVaultsResponse'];
18
+ export type StrategyCard = Schemas['StrategyCard'];
19
+ export type StrategyListResponse = Schemas['StrategyListResponse'];
20
+ export type TvlResponse = Schemas['TvlResponse'];
21
+ export type LatestPriceResponse = Schemas['LatestPriceResponse'];
22
+ export type PriceTimeseriesResponse = Schemas['TimeseriesResponse'];
23
+ export type TokenRef = Schemas['TokenRef'];
24
+ export type PartialResponseError = Schemas['PartialResponseError'];
25
+ export type AmountPair = Schemas['AmountPair'];
26
+ export type TimeseriesMeta = Schemas['TimeseriesMeta'];
27
+ export type HealthResponse = Schemas['HealthResponse'];
28
+ export type ChainSyncStatus = Schemas['ChainSyncStatus'];
29
+ export interface PageOptions {
30
+ /** Opaque cursor from a previous response's `meta.next_cursor`. */
31
+ next?: string;
32
+ limit?: number;
33
+ order?: 'asc' | 'desc';
34
+ }
35
+ export interface TimeWindowOptions extends PageOptions {
36
+ /** ISO 8601 date (`2026-01-01`) or RFC 3339 timestamp. */
37
+ start?: string;
38
+ end?: string;
39
+ granularity?: 'hour' | 'day' | 'week' | 'month';
40
+ }
41
+ export interface ActivityOptions extends PageOptions {
42
+ /** CAIP-10 vault id (`"{chainId}:{address}"`). Omit for wallet-wide activity. */
43
+ vaultId?: string;
44
+ /**
45
+ * Wallet-wide feeds only: include activity in hidden (enabled but unlisted)
46
+ * vaults alongside visible ones. Activity in disabled vaults is never
47
+ * returned. Ignored when `vaultId` is set.
48
+ */
49
+ includeHidden?: boolean;
50
+ }
51
+ export interface PositionsOptions extends PageOptions {
52
+ /**
53
+ * Include positions in hidden (enabled but unlisted) vaults alongside
54
+ * visible ones. Positions in disabled vaults are never returned.
55
+ */
56
+ includeHidden?: boolean;
57
+ }
58
+ export interface LatestPriceOptions {
59
+ address: string;
60
+ chainId: number;
61
+ /** Optional ISO 8601 timestamp for a point-in-time price. */
62
+ at?: string;
63
+ }
64
+ export interface PriceTimeseriesOptions {
65
+ address: string;
66
+ chainId: number;
67
+ start: string;
68
+ end: string;
69
+ granularity?: 'raw' | 'hour' | 'day' | 'week' | 'month';
70
+ limit?: number;
71
+ }
72
+ /**
73
+ * Typed client for the Gaia REST API (api.gauntlet.xyz).
74
+ *
75
+ * All response types are generated from the service's OpenAPI spec
76
+ * (`src/api/generated.ts`, regenerated via `yarn generate:api-types`) so they
77
+ * cannot drift from the server models. Values are returned exactly as the API
78
+ * emits them — human-unit decimal strings and CAIP-10 vault ids; use
79
+ * `decimalToBigInt` / `sharesToBigInt` and `apiVaultIdFromVaultId` /
80
+ * `vaultIdFromApiVaultId` to convert, or the higher-level `activityFlows` /
81
+ * `positionHistory` helpers for pre-normalized values.
82
+ *
83
+ * Available on a configured client as `client.api`, or standalone:
84
+ * ```ts
85
+ * const api = new GauntletApi({ apiKey: process.env.GAUNTLET_API_KEY });
86
+ * const { data } = await api.vaults();
87
+ * ```
88
+ */
89
+ export declare class GauntletApi {
90
+ private readonly config;
91
+ constructor(config?: GauntletApiConfig);
92
+ private get;
93
+ /** GET /health — service liveness (version + uptime). */
94
+ health(): Promise<HealthResponse>;
95
+ /** GET /health/chains — per-chain indexer sync freshness. */
96
+ chainSyncStatus(): Promise<ChainSyncStatus[]>;
97
+ /** GET /v1/vaults — all indexed vaults with live metrics (TVL, APY, unit price). */
98
+ vaults(options?: PageOptions): Promise<{
99
+ data: VaultDetail[];
100
+ meta: TimeseriesMeta;
101
+ }>;
102
+ /** GET /v1/vaults/featured — admin-curated featured vault cards. */
103
+ featuredVaults(): Promise<FeaturedVaultsResponse>;
104
+ /** GET /v1/strategies — admin-curated strategy cards. */
105
+ strategies(): Promise<StrategyListResponse>;
106
+ /** GET /v1/vaults/{vault_id} — one vault with live metrics. `vaultId` is CAIP-10. */
107
+ vault(vaultId: string): Promise<VaultDetailResponse>;
108
+ /** GET /v1/vaults/{vault_id}/definition — raw indexed vault definition. */
109
+ vaultDefinition(vaultId: string): Promise<unknown>;
110
+ /** GET /v1/vaults/{vault_id}/timeseries — TVL / unit-price / APY history. */
111
+ vaultTimeseries(vaultId: string, options?: TimeWindowOptions): Promise<VaultTimeseriesResponse>;
112
+ /** GET /v1/users/{wallet}/positions — all of a wallet's indexed positions with PnL. */
113
+ positions(walletAddress: string, options?: PositionsOptions): Promise<UserAllPositionsResponse>;
114
+ /** GET /v1/users/{wallet}/positions/{vault_id} — one position with PnL breakdown. */
115
+ position(walletAddress: string, vaultId: string): Promise<UserPositionLatestResponse>;
116
+ /** GET /v1/users/{wallet}/positions/{vault_id}/timeseries — value / cost-basis / PnL / ROI history. */
117
+ positionTimeseries(walletAddress: string, vaultId: string, options?: TimeWindowOptions): Promise<UserPositionsTimeseriesResponse>;
118
+ /** GET /v1/users/{wallet}/activity — one page of the wallet's immutable event log. */
119
+ activity(walletAddress: string, options?: ActivityOptions): Promise<UserActivityResponse>;
120
+ /**
121
+ * Iterates the wallet's full activity log, following `meta.next_cursor`
122
+ * across pages so callers never handle cursors.
123
+ */
124
+ activityRows(walletAddress: string, options?: Omit<ActivityOptions, 'next'>): AsyncGenerator<UserActivity>;
125
+ /** GET /v1/tvl — aggregate Gauntlet TVL, optionally with per-source breakdown. */
126
+ tvl(options?: {
127
+ includeBreakdown?: boolean;
128
+ }): Promise<TvlResponse>;
129
+ /** GET /v1/prices — latest USD price for a token. */
130
+ latestPrice(options: LatestPriceOptions): Promise<LatestPriceResponse>;
131
+ /** GET /v1/prices/timeseries — USD price history for a token. */
132
+ priceTimeseries(options: PriceTimeseriesOptions): Promise<PriceTimeseriesResponse>;
133
+ }
134
+ export {};
135
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/api/client.ts"],"names":[],"mappings":"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"}