@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.
- package/README.md +34 -3
- package/dist/api/activity.d.ts +3 -1
- package/dist/api/activity.d.ts.map +1 -1
- package/dist/api/activityRows.d.ts +11 -0
- package/dist/api/activityRows.d.ts.map +1 -0
- package/dist/api/caip.d.ts.map +1 -1
- package/dist/api/client.d.ts.map +1 -1
- package/dist/api/decimal.d.ts.map +1 -1
- package/dist/api/http.d.ts.map +1 -1
- package/dist/api/index.js +7 -8
- package/dist/api/positionHistory.d.ts.map +1 -1
- package/dist/attribution/index.d.ts +5 -2
- package/dist/attribution/index.d.ts.map +1 -1
- package/dist/{chunk-HC2BS7MK.js → chunk-JJOLVL5V.js} +113 -6
- package/dist/chunk-JJOLVL5V.js.map +7 -0
- package/dist/{chunk-S2TTA45N.js → chunk-JRSNLXFY.js} +2 -2
- package/dist/{chunk-SU6JAKIA.js → chunk-MEKISE2T.js} +131 -47
- package/dist/chunk-MEKISE2T.js.map +7 -0
- package/dist/{chunk-7TA2OJUK.js → chunk-YQXTLIJA.js} +209 -96
- package/dist/chunk-YQXTLIJA.js.map +7 -0
- package/dist/cjs/api/activity.d.ts +3 -1
- package/dist/cjs/api/activity.d.ts.map +1 -1
- package/dist/cjs/api/activity.js +14 -12
- package/dist/cjs/api/activity.js.map +2 -2
- package/dist/cjs/api/activityRows.d.ts +11 -0
- package/dist/cjs/api/activityRows.d.ts.map +1 -0
- package/dist/cjs/api/activityRows.js +139 -0
- package/dist/cjs/api/activityRows.js.map +7 -0
- package/dist/cjs/api/caip.d.ts.map +1 -1
- package/dist/cjs/api/caip.js +3 -1
- package/dist/cjs/api/caip.js.map +2 -2
- package/dist/cjs/api/client.d.ts.map +1 -1
- package/dist/cjs/api/client.js +29 -1
- package/dist/cjs/api/client.js.map +2 -2
- package/dist/cjs/api/decimal.d.ts.map +1 -1
- package/dist/cjs/api/decimal.js +1 -0
- package/dist/cjs/api/decimal.js.map +2 -2
- package/dist/cjs/api/http.d.ts.map +1 -1
- package/dist/cjs/api/http.js +1 -0
- package/dist/cjs/api/http.js.map +2 -2
- package/dist/cjs/api/positionHistory.d.ts.map +1 -1
- package/dist/cjs/api/positionHistory.js +17 -4
- package/dist/cjs/api/positionHistory.js.map +2 -2
- package/dist/cjs/attribution/index.d.ts +5 -2
- package/dist/cjs/attribution/index.d.ts.map +1 -1
- package/dist/cjs/attribution/index.js +3 -1
- package/dist/cjs/attribution/index.js.map +2 -2
- package/dist/cjs/evm/adapters/aera.d.ts.map +1 -1
- package/dist/cjs/evm/adapters/aera.js +16 -7
- package/dist/cjs/evm/adapters/aera.js.map +2 -2
- package/dist/cjs/evm/adapters/types.d.ts +1 -0
- package/dist/cjs/evm/adapters/types.d.ts.map +1 -1
- package/dist/cjs/evm/adapters/types.js.map +1 -1
- package/dist/cjs/evm/aeraContracts.d.ts.map +1 -1
- package/dist/cjs/evm/aeraContracts.js +21 -11
- package/dist/cjs/evm/aeraContracts.js.map +2 -2
- package/dist/cjs/evm/deposit.d.ts +3 -2
- package/dist/cjs/evm/deposit.d.ts.map +1 -1
- package/dist/cjs/evm/deposit.js +40 -10
- package/dist/cjs/evm/deposit.js.map +2 -2
- package/dist/cjs/evm/depositQuote.d.ts.map +1 -1
- package/dist/cjs/evm/depositQuote.js +1 -0
- package/dist/cjs/evm/depositQuote.js.map +2 -2
- package/dist/cjs/evm/depositReceiverApproval.d.ts.map +1 -1
- package/dist/cjs/evm/depositReceiverApproval.js +14 -9
- package/dist/cjs/evm/depositReceiverApproval.js.map +2 -2
- package/dist/cjs/evm/userCurrentBalance.d.ts +15 -1
- package/dist/cjs/evm/userCurrentBalance.d.ts.map +1 -1
- package/dist/cjs/evm/userCurrentBalance.js +94 -51
- package/dist/cjs/evm/userCurrentBalance.js.map +2 -2
- package/dist/cjs/evm/withdraw.d.ts +2 -0
- package/dist/cjs/evm/withdraw.d.ts.map +1 -1
- package/dist/cjs/evm/withdraw.js +14 -1
- package/dist/cjs/evm/withdraw.js.map +2 -2
- package/dist/cjs/evm/withdrawQuote.d.ts.map +1 -1
- package/dist/cjs/evm/withdrawQuote.js +1 -0
- package/dist/cjs/evm/withdrawQuote.js.map +2 -2
- package/dist/evm/adapters/aera.d.ts.map +1 -1
- package/dist/evm/adapters/types.d.ts +1 -0
- package/dist/evm/adapters/types.d.ts.map +1 -1
- package/dist/evm/aeraContracts.d.ts.map +1 -1
- package/dist/evm/deposit.d.ts +3 -2
- package/dist/evm/deposit.d.ts.map +1 -1
- package/dist/evm/depositQuote.d.ts.map +1 -1
- package/dist/evm/depositReceiverApproval.d.ts.map +1 -1
- package/dist/evm/index.js +6 -8
- package/dist/evm/userCurrentBalance.d.ts +15 -1
- package/dist/evm/userCurrentBalance.d.ts.map +1 -1
- package/dist/evm/withdraw.d.ts +2 -0
- package/dist/evm/withdraw.d.ts.map +1 -1
- package/dist/evm/withdrawQuote.d.ts.map +1 -1
- package/dist/index.js +11 -13
- package/dist/privy/index.js +2 -2
- package/package.json +1 -1
- package/src/api/activity.ts +18 -15
- package/src/api/activityRows.ts +143 -0
- package/src/api/caip.ts +3 -1
- package/src/api/client.ts +36 -1
- package/src/api/decimal.ts +1 -0
- package/src/api/http.ts +1 -0
- package/src/api/positionHistory.ts +20 -5
- package/src/attribution/index.ts +6 -2
- package/src/evm/adapters/aera.ts +26 -8
- package/src/evm/adapters/types.ts +1 -0
- package/src/evm/aeraContracts.ts +29 -14
- package/src/evm/deposit.ts +43 -12
- package/src/evm/depositQuote.ts +1 -0
- package/src/evm/depositReceiverApproval.ts +14 -9
- package/src/evm/userCurrentBalance.ts +144 -60
- package/src/evm/withdraw.ts +20 -1
- package/src/evm/withdrawQuote.ts +1 -0
- package/dist/chunk-7TA2OJUK.js.map +0 -7
- package/dist/chunk-HC2BS7MK.js.map +0 -7
- package/dist/chunk-STIV2CC4.js +0 -57
- package/dist/chunk-STIV2CC4.js.map +0 -7
- package/dist/chunk-SU6JAKIA.js.map +0 -7
- /package/dist/{chunk-S2TTA45N.js.map → chunk-JRSNLXFY.js.map} +0 -0
|
@@ -54,6 +54,8 @@ export interface ActivityFlowsOptions extends Pick<ActivityOptions, 'vaultId' |
|
|
|
54
54
|
*/
|
|
55
55
|
export declare function getActivityFlows(api: GauntletApi, walletAddress: string, options?: ActivityFlowsOptions): Promise<ActivityFlow[]>;
|
|
56
56
|
export interface WaitForSettlementOptions {
|
|
57
|
+
/** Transaction hash of the submitted request. Prevents reuse of an earlier settlement. */
|
|
58
|
+
requestTxHash: string;
|
|
57
59
|
/** CAIP-10 vault id — narrows polling to one vault's activity. */
|
|
58
60
|
vaultId?: string;
|
|
59
61
|
/** Polling interval. Defaults to 5s. */
|
|
@@ -66,5 +68,5 @@ export interface WaitForSettlementOptions {
|
|
|
66
68
|
* `requestHash` reaches a terminal state, and returns the settled or refunded
|
|
67
69
|
* flow. Use after submitting a `requestDeposit` / `requestRedeem` transaction.
|
|
68
70
|
*/
|
|
69
|
-
export declare function waitForRequestSettlement(api: GauntletApi, walletAddress: string, requestHash: string, options
|
|
71
|
+
export declare function waitForRequestSettlement(api: GauntletApi, walletAddress: string, requestHash: string, options: WaitForSettlementOptions): Promise<ActivityFlow>;
|
|
70
72
|
//# sourceMappingURL=activity.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"activity.d.ts","sourceRoot":"","sources":["../../../src/api/activity.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"activity.d.ts","sourceRoot":"","sources":["../../../src/api/activity.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,WAAW,EAAE,QAAQ,EAAE,YAAY,EAAE,oBAAiB;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,CA2CxE;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,0FAA0F;IAC1F,aAAa,EAAE,MAAM,CAAC;IACtB,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,EAAE,wBAAwB,GAChC,OAAO,CAAC,YAAY,CAAC,CAwBvB"}
|
package/dist/cjs/api/activity.js
CHANGED
|
@@ -23,14 +23,15 @@ __export(activity_exports, {
|
|
|
23
23
|
waitForRequestSettlement: () => waitForRequestSettlement
|
|
24
24
|
});
|
|
25
25
|
module.exports = __toCommonJS(activity_exports);
|
|
26
|
+
var import_activityRows = require("./activityRows");
|
|
26
27
|
var import_errors = require("../errors");
|
|
27
28
|
var import_decimal = require("./decimal");
|
|
28
29
|
var import_errors2 = require("./errors");
|
|
29
30
|
const PENDING_TYPES = /* @__PURE__ */ new Set(["deposit_pending", "withdraw_pending"]);
|
|
30
31
|
const REFUNDED_TYPES = /* @__PURE__ */ new Set(["deposit_refunded", "withdraw_refunded"]);
|
|
31
32
|
function flowKind(rowType) {
|
|
32
|
-
if (
|
|
33
|
-
if (
|
|
33
|
+
if (["deposit", "deposit_pending", "deposit_refunded"].includes(rowType)) return "deposit";
|
|
34
|
+
if (["withdraw", "withdraw_pending", "withdraw_refunded"].includes(rowType)) return "withdraw";
|
|
34
35
|
if (rowType === "transfer_in" || rowType === "transfer_out") return rowType;
|
|
35
36
|
throw new import_errors.GauntletSDKError(`Unknown activity row type "${rowType}"`);
|
|
36
37
|
}
|
|
@@ -54,15 +55,9 @@ function toAssetAmount(rows) {
|
|
|
54
55
|
return { decimal, raw, token };
|
|
55
56
|
}
|
|
56
57
|
function stitchActivityFlows(rows) {
|
|
57
|
-
const groups =
|
|
58
|
-
for (const [index, row] of rows.entries()) {
|
|
59
|
-
const key = row.request_hash ?? `row:${index}`;
|
|
60
|
-
const group = groups.get(key);
|
|
61
|
-
if (group) group.push(row);
|
|
62
|
-
else groups.set(key, [row]);
|
|
63
|
-
}
|
|
58
|
+
const groups = (0, import_activityRows.activityLifecycles)((0, import_activityRows.orderActivityRows)(rows));
|
|
64
59
|
const flows = [];
|
|
65
|
-
for (const group of groups
|
|
60
|
+
for (const group of groups) {
|
|
66
61
|
group.sort((a, b) => a.block_timestamp - b.block_timestamp);
|
|
67
62
|
const pendingRow = group.find((r) => PENDING_TYPES.has(r.type)) ?? null;
|
|
68
63
|
const terminalRow = group.find((r) => !PENDING_TYPES.has(r.type)) ?? null;
|
|
@@ -113,13 +108,20 @@ async function getActivityFlows(api, walletAddress, options = {}) {
|
|
|
113
108
|
}
|
|
114
109
|
return flows;
|
|
115
110
|
}
|
|
116
|
-
async function waitForRequestSettlement(api, walletAddress, requestHash, options
|
|
111
|
+
async function waitForRequestSettlement(api, walletAddress, requestHash, options) {
|
|
112
|
+
if (typeof options?.requestTxHash !== "string" || options.requestTxHash.length === 0) {
|
|
113
|
+
throw new import_errors.GauntletSDKError(
|
|
114
|
+
"Settlement polling requires the submitted request transaction hash"
|
|
115
|
+
);
|
|
116
|
+
}
|
|
117
117
|
const pollIntervalMs = options.pollIntervalMs ?? 5e3;
|
|
118
118
|
const timeoutMs = options.timeoutMs ?? 6e5;
|
|
119
119
|
const deadline = Date.now() + timeoutMs;
|
|
120
120
|
for (; ; ) {
|
|
121
121
|
const flows = await getActivityFlows(api, walletAddress, { vaultId: options.vaultId });
|
|
122
|
-
const flow = flows.find(
|
|
122
|
+
const flow = flows.find(
|
|
123
|
+
(f) => f.requestHash === requestHash && f.txHashes.some((hash) => hash.toLowerCase() === options.requestTxHash.toLowerCase())
|
|
124
|
+
);
|
|
123
125
|
if (flow && flow.status !== "pending") return flow;
|
|
124
126
|
if (Date.now() + pollIntervalMs > deadline) {
|
|
125
127
|
throw new import_errors2.SettlementTimeoutError(requestHash, timeoutMs);
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/api/activity.ts"],
|
|
4
|
-
"sourcesContent": ["import { GauntletSDKError } from '../errors';\nimport type { ActivityOptions, GauntletApi, TokenRef, UserActivity } from './client';\nimport { decimalToBigInt, sharesToBigInt } from './decimal';\nimport { SettlementTimeoutError } from './errors';\n\nexport type ActivityFlowKind = 'deposit' | 'withdraw' | 'transfer_in' | 'transfer_out';\nexport type ActivityFlowStatus = 'settled' | 'pending' | 'refunded';\n\n/** A signed token amount as reported by the API, with base-unit conversion when possible. */\nexport interface AssetAmount {\n /** Human-unit decimal string exactly as the API emits it, e.g. `\"1250.5\"`. */\n decimal: string;\n /** Base-unit integer (`decimal \u00D7 10^token.decimals`); null when the token's decimals are unknown. */\n raw: bigint | null;\n token: TokenRef | null;\n}\n\n/**\n * One user action against a vault, stitched from the activity log's immutable\n * rows. Sync flows (Morpho, secondary-market transfers) come from a single\n * row; Aera async flows pair a `*_pending` request row with its terminal\n * settle/refund row via `request_hash`.\n */\nexport interface ActivityFlow {\n kind: ActivityFlowKind;\n status: ActivityFlowStatus;\n /** CAIP-10 vault id (`\"{chainId}:{address}\"`). */\n vaultId: string;\n /** Aera async correlation hash; null for sync flows and transfers. */\n requestHash: string | null;\n /** When the request row landed. Null when the flow's pending row is outside the fetched window. */\n requestedAt: Date | null;\n /** When the terminal (settle/refund) row landed. Null while pending. */\n settledAt: Date | null;\n /** Magnitude of the flow's asset movement (requested amount for refunded flows). */\n assets: AssetAmount;\n /** Magnitude of the flow's share movement in 18-decimal base units. */\n shares: bigint;\n /** Transaction hashes in row order (request first, then settlement, when both are known). */\n txHashes: string[];\n}\n\nconst PENDING_TYPES = new Set(['deposit_pending', 'withdraw_pending']);\nconst REFUNDED_TYPES = new Set(['deposit_refunded', 'withdraw_refunded']);\n\nfunction flowKind(rowType: string): ActivityFlowKind {\n if (
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,oBAAiC;AAEjC,qBAAgD;AAChD,IAAAA,iBAAuC;AAuCvC,MAAM,gBAAgB,oBAAI,IAAI,CAAC,mBAAmB,kBAAkB,CAAC;AACrE,MAAM,iBAAiB,oBAAI,IAAI,CAAC,oBAAoB,mBAAmB,CAAC;AAExE,SAAS,SAAS,SAAmC;AACnD,MAAI,
|
|
4
|
+
"sourcesContent": ["import { activityLifecycles, orderActivityRows } from './activityRows';\nimport { GauntletSDKError } from '../errors';\nimport type { ActivityOptions, GauntletApi, TokenRef, UserActivity } from './client';\nimport { decimalToBigInt, sharesToBigInt } from './decimal';\nimport { SettlementTimeoutError } from './errors';\n\nexport type ActivityFlowKind = 'deposit' | 'withdraw' | 'transfer_in' | 'transfer_out';\nexport type ActivityFlowStatus = 'settled' | 'pending' | 'refunded';\n\n/** A signed token amount as reported by the API, with base-unit conversion when possible. */\nexport interface AssetAmount {\n /** Human-unit decimal string exactly as the API emits it, e.g. `\"1250.5\"`. */\n decimal: string;\n /** Base-unit integer (`decimal \u00D7 10^token.decimals`); null when the token's decimals are unknown. */\n raw: bigint | null;\n token: TokenRef | null;\n}\n\n/**\n * One user action against a vault, stitched from the activity log's immutable\n * rows. Sync flows (Morpho, secondary-market transfers) come from a single\n * row; Aera async flows pair a `*_pending` request row with its terminal\n * settle/refund row via `request_hash`.\n */\nexport interface ActivityFlow {\n kind: ActivityFlowKind;\n status: ActivityFlowStatus;\n /** CAIP-10 vault id (`\"{chainId}:{address}\"`). */\n vaultId: string;\n /** Aera async correlation hash; null for sync flows and transfers. */\n requestHash: string | null;\n /** When the request row landed. Null when the flow's pending row is outside the fetched window. */\n requestedAt: Date | null;\n /** When the terminal (settle/refund) row landed. Null while pending. */\n settledAt: Date | null;\n /** Magnitude of the flow's asset movement (requested amount for refunded flows). */\n assets: AssetAmount;\n /** Magnitude of the flow's share movement in 18-decimal base units. */\n shares: bigint;\n /** Transaction hashes in row order (request first, then settlement, when both are known). */\n txHashes: string[];\n}\n\nconst PENDING_TYPES = new Set(['deposit_pending', 'withdraw_pending']);\nconst REFUNDED_TYPES = new Set(['deposit_refunded', 'withdraw_refunded']);\n\nfunction flowKind(rowType: string): ActivityFlowKind {\n if (['deposit', 'deposit_pending', 'deposit_refunded'].includes(rowType)) return 'deposit';\n if (['withdraw', 'withdraw_pending', 'withdraw_refunded'].includes(rowType)) return 'withdraw';\n if (rowType === 'transfer_in' || rowType === 'transfer_out') return rowType;\n throw new GauntletSDKError(`Unknown activity row type \"${rowType}\"`);\n}\n\nfunction abs(value: bigint): bigint {\n return value < 0n ? -value : value;\n}\n\n/**\n * Comparison scale for asset amounts. The API emits human-unit decimal strings\n * with at most `token.decimals` fractional digits, so 18 digits is exact for\n * every supported asset.\n */\nconst ASSET_SCALE = 18;\n\nfunction toAssetAmount(rows: UserActivity[]): AssetAmount {\n // Per the API contract, at most one row of an async lifecycle carries the\n // asset movement (the other legs are \"0\"), so the max magnitude is the\n // flow's amount. For refunded flows this surfaces the requested amount\n // instead of the useless net of zero.\n let best = rows[0];\n let bestMagnitude = abs(decimalToBigInt(best.assets_delta.native, ASSET_SCALE));\n for (const row of rows.slice(1)) {\n const magnitude = abs(decimalToBigInt(row.assets_delta.native, ASSET_SCALE));\n if (magnitude > bestMagnitude) {\n best = row;\n bestMagnitude = magnitude;\n }\n }\n const token =\n best.assets_delta.token ?? rows.find((r) => r.assets_delta.token)?.assets_delta.token ?? null;\n const decimal = best.assets_delta.native.replace(/^-/, '');\n const raw = token?.decimals != null ? decimalToBigInt(decimal, token.decimals) : null;\n return { decimal, raw, token };\n}\n\n/**\n * Pure stitcher: folds raw activity rows into `ActivityFlow`s. Rows may be in\n * any order and may span multiple vaults; async lifecycles are paired by\n * `request_hash`. Flows are returned newest-first (by the flow's latest row).\n */\nexport function stitchActivityFlows(rows: UserActivity[]): ActivityFlow[] {\n const groups = activityLifecycles(orderActivityRows(rows));\n\n const flows: ActivityFlow[] = [];\n for (const group of groups) {\n group.sort((a, b) => a.block_timestamp - b.block_timestamp);\n const pendingRow = group.find((r) => PENDING_TYPES.has(r.type)) ?? null;\n const terminalRow = group.find((r) => !PENDING_TYPES.has(r.type)) ?? null;\n const isAsync = group.some((r) => r.request_hash != null);\n\n let status: ActivityFlowStatus;\n if (!terminalRow) status = 'pending';\n else if (REFUNDED_TYPES.has(terminalRow.type)) status = 'refunded';\n else status = 'settled';\n\n let sharesMagnitude = 0n;\n for (const row of group) {\n const shares = abs(sharesToBigInt(row.shares_delta));\n if (shares > sharesMagnitude) sharesMagnitude = shares;\n }\n\n flows.push({\n kind: flowKind((terminalRow ?? pendingRow ?? group[0]).type),\n status,\n vaultId: group[0].vault_id,\n requestHash: group[0].request_hash ?? null,\n requestedAt: pendingRow\n ? new Date(pendingRow.block_timestamp * 1000)\n : isAsync\n ? null\n : new Date(group[0].block_timestamp * 1000),\n settledAt: terminalRow ? new Date(terminalRow.block_timestamp * 1000) : null,\n assets: toAssetAmount(group),\n shares: sharesMagnitude,\n txHashes: [...new Set(group.map((r) => r.tx_hash))],\n });\n }\n\n return flows.sort((a, b) => {\n const aAt = (a.settledAt ?? a.requestedAt)?.getTime() ?? 0;\n const bAt = (b.settledAt ?? b.requestedAt)?.getTime() ?? 0;\n return bAt - aAt;\n });\n}\n\nexport interface ActivityFlowsOptions extends Pick<ActivityOptions, 'vaultId' | 'limit'> {\n /** Stop paginating once this many rows have been fetched. Defaults to 1000. */\n maxRows?: number;\n}\n\n/**\n * Fetches the wallet's activity log and stitches it into lifecycle-aware\n * flows \u2014 the replacement for scanning vault event logs over RPC.\n *\n * ```ts\n * const flows = await getActivityFlows(client.api, wallet);\n * const open = flows.filter((f) => f.status === 'pending');\n * ```\n */\nexport async function getActivityFlows(\n api: GauntletApi,\n walletAddress: string,\n options: ActivityFlowsOptions = {}\n): Promise<ActivityFlow[]> {\n const maxRows = options.maxRows ?? 1000;\n const rows: UserActivity[] = [];\n for await (const row of api.activityRows(walletAddress, {\n vaultId: options.vaultId,\n // The API caps page size at 1000; request maxRows per page so the common\n // case is a single round trip instead of ten default-100 pages.\n limit: options.limit ?? Math.min(maxRows, 1000),\n order: 'desc',\n })) {\n rows.push(row);\n if (rows.length >= maxRows) break;\n }\n const flows = stitchActivityFlows(rows);\n if (rows.length >= maxRows) {\n // The window cut may have split an async lifecycle, keeping a terminal\n // row whose request leg (the one carrying the amount) fell outside the\n // window. Drop those flows rather than reporting zeroed amounts.\n return flows.filter((f) => f.requestHash === null || f.requestedAt !== null);\n }\n return flows;\n}\n\nexport interface WaitForSettlementOptions {\n /** Transaction hash of the submitted request. Prevents reuse of an earlier settlement. */\n requestTxHash: string;\n /** CAIP-10 vault id \u2014 narrows polling to one vault's activity. */\n vaultId?: string;\n /** Polling interval. Defaults to 5s. */\n pollIntervalMs?: number;\n /** Overall deadline. Defaults to 10 minutes. Throws `SettlementTimeoutError` on expiry. */\n timeoutMs?: number;\n}\n\n/**\n * Polls the activity log until the Aera async request identified by\n * `requestHash` reaches a terminal state, and returns the settled or refunded\n * flow. Use after submitting a `requestDeposit` / `requestRedeem` transaction.\n */\nexport async function waitForRequestSettlement(\n api: GauntletApi,\n walletAddress: string,\n requestHash: string,\n options: WaitForSettlementOptions\n): Promise<ActivityFlow> {\n if (typeof options?.requestTxHash !== 'string' || options.requestTxHash.length === 0) {\n throw new GauntletSDKError(\n 'Settlement polling requires the submitted request transaction hash'\n );\n }\n const pollIntervalMs = options.pollIntervalMs ?? 5_000;\n const timeoutMs = options.timeoutMs ?? 600_000;\n const deadline = Date.now() + timeoutMs;\n\n for (;;) {\n const flows = await getActivityFlows(api, walletAddress, { vaultId: options.vaultId });\n const flow = flows.find(\n (f) =>\n f.requestHash === requestHash &&\n f.txHashes.some((hash) => hash.toLowerCase() === options.requestTxHash.toLowerCase())\n );\n if (flow && flow.status !== 'pending') return flow;\n\n if (Date.now() + pollIntervalMs > deadline) {\n throw new SettlementTimeoutError(requestHash, timeoutMs);\n }\n await new Promise((resolve) => setTimeout(resolve, pollIntervalMs));\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["import_errors"]
|
|
7
7
|
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { UserActivity } from "./client.js";
|
|
2
|
+
export declare function isPending(row: UserActivity): boolean;
|
|
3
|
+
export declare function requireSameToken(leftRow: UserActivity, rightRow: UserActivity): void;
|
|
4
|
+
export declare function validateActivityRow(row: UserActivity): void;
|
|
5
|
+
export declare function orderActivityRows(rows: UserActivity[]): UserActivity[];
|
|
6
|
+
/**
|
|
7
|
+
* Split request hashes by vault and by each request occurrence.
|
|
8
|
+
* Takes the output of `orderActivityRows`.
|
|
9
|
+
*/
|
|
10
|
+
export declare function activityLifecycles(ordered: UserActivity[]): UserActivity[][];
|
|
11
|
+
//# sourceMappingURL=activityRows.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"activityRows.d.ts","sourceRoot":"","sources":["../../../src/api/activityRows.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,oBAAiB;AAG7C,wBAAgB,SAAS,CAAC,GAAG,EAAE,YAAY,GAAG,OAAO,CAEpD;AAED,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,YAAY,GAAG,IAAI,CAepF;AAED,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,YAAY,GAAG,IAAI,CAsD3D;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,YAAY,EAAE,GAAG,YAAY,EAAE,CAQtE;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,YAAY,EAAE,GAAG,YAAY,EAAE,EAAE,CA+C5E"}
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
var activityRows_exports = {};
|
|
20
|
+
__export(activityRows_exports, {
|
|
21
|
+
activityLifecycles: () => activityLifecycles,
|
|
22
|
+
isPending: () => isPending,
|
|
23
|
+
orderActivityRows: () => orderActivityRows,
|
|
24
|
+
requireSameToken: () => requireSameToken,
|
|
25
|
+
validateActivityRow: () => validateActivityRow
|
|
26
|
+
});
|
|
27
|
+
module.exports = __toCommonJS(activityRows_exports);
|
|
28
|
+
var import_errors = require("../errors");
|
|
29
|
+
var import_decimal = require("./decimal");
|
|
30
|
+
function isPending(row) {
|
|
31
|
+
return row.type === "deposit_pending" || row.type === "withdraw_pending";
|
|
32
|
+
}
|
|
33
|
+
function requireSameToken(leftRow, rightRow) {
|
|
34
|
+
if (leftRow.vault_id.split(":")[0] !== rightRow.vault_id.split(":")[0]) {
|
|
35
|
+
throw new import_errors.GauntletSDKError("Activity rows contain assets on different chains");
|
|
36
|
+
}
|
|
37
|
+
const left = leftRow.assets_delta.token;
|
|
38
|
+
const right = rightRow.assets_delta.token;
|
|
39
|
+
if (left != null && right != null && (left.address.toLowerCase() !== right.address.toLowerCase() || (left.decimals ?? null) !== (right.decimals ?? null))) {
|
|
40
|
+
throw new import_errors.GauntletSDKError("Activity rows contain different asset denominations");
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
function validateActivityRow(row) {
|
|
44
|
+
const shares = (0, import_decimal.sharesToBigInt)(row.shares_delta);
|
|
45
|
+
const assets = (0, import_decimal.decimalToBigInt)(row.assets_delta.native, 18);
|
|
46
|
+
if (!Number.isSafeInteger(row.block_number) || row.block_number < 0 || !Number.isSafeInteger(row.block_timestamp) || row.block_timestamp < 0 || typeof row.vault_id !== "string" || row.vault_id.length === 0 || typeof row.tx_hash !== "string" || row.tx_hash.length === 0 || row.request_hash != null && (typeof row.request_hash !== "string" || row.request_hash.length === 0)) {
|
|
47
|
+
throw new import_errors.GauntletSDKError("The activity row has invalid event identifiers");
|
|
48
|
+
}
|
|
49
|
+
const token = row.assets_delta.token;
|
|
50
|
+
if (token != null && token.decimals != null) {
|
|
51
|
+
if (!Number.isInteger(token.decimals) || token.decimals < 0 || token.decimals > 255) {
|
|
52
|
+
throw new import_errors.GauntletSDKError("The activity token has invalid decimals");
|
|
53
|
+
}
|
|
54
|
+
(0, import_decimal.decimalToBigInt)(row.assets_delta.native, token.decimals);
|
|
55
|
+
}
|
|
56
|
+
let valid;
|
|
57
|
+
switch (row.type) {
|
|
58
|
+
case "deposit":
|
|
59
|
+
valid = shares >= 0n && assets >= 0n && (row.request_hash == null || assets === 0n);
|
|
60
|
+
break;
|
|
61
|
+
case "deposit_pending":
|
|
62
|
+
valid = shares === 0n && assets > 0n && row.request_hash != null;
|
|
63
|
+
break;
|
|
64
|
+
case "deposit_refunded":
|
|
65
|
+
valid = shares === 0n && assets < 0n && row.request_hash != null;
|
|
66
|
+
break;
|
|
67
|
+
case "withdraw":
|
|
68
|
+
valid = shares <= 0n && assets <= 0n && (row.request_hash == null || shares === 0n);
|
|
69
|
+
break;
|
|
70
|
+
case "withdraw_pending":
|
|
71
|
+
valid = shares < 0n && assets === 0n && row.request_hash != null;
|
|
72
|
+
break;
|
|
73
|
+
case "withdraw_refunded":
|
|
74
|
+
valid = shares > 0n && assets === 0n && row.request_hash != null;
|
|
75
|
+
break;
|
|
76
|
+
case "transfer_in":
|
|
77
|
+
valid = shares >= 0n && assets >= 0n && row.request_hash == null;
|
|
78
|
+
break;
|
|
79
|
+
case "transfer_out":
|
|
80
|
+
valid = shares <= 0n && assets <= 0n && row.request_hash == null;
|
|
81
|
+
break;
|
|
82
|
+
default:
|
|
83
|
+
valid = false;
|
|
84
|
+
}
|
|
85
|
+
if (!valid) throw new import_errors.GauntletSDKError(`Invalid activity deltas for ${row.type}`);
|
|
86
|
+
}
|
|
87
|
+
function orderActivityRows(rows) {
|
|
88
|
+
rows.forEach(validateActivityRow);
|
|
89
|
+
return [...rows].sort(
|
|
90
|
+
(a, b) => a.block_number - b.block_number || a.block_timestamp - b.block_timestamp || Number(isPending(b)) - Number(isPending(a))
|
|
91
|
+
);
|
|
92
|
+
}
|
|
93
|
+
function activityLifecycles(ordered) {
|
|
94
|
+
const groups = [];
|
|
95
|
+
const latest = /* @__PURE__ */ new Map();
|
|
96
|
+
for (const row of ordered) {
|
|
97
|
+
if (row.request_hash == null) {
|
|
98
|
+
groups.push([row]);
|
|
99
|
+
continue;
|
|
100
|
+
}
|
|
101
|
+
const key = `${row.vault_id}:${row.request_hash}`;
|
|
102
|
+
const previous = latest.get(key);
|
|
103
|
+
if (previous === void 0 || isPending(row)) {
|
|
104
|
+
if (previous !== void 0 && previous.every(isPending)) {
|
|
105
|
+
throw new import_errors.GauntletSDKError("An activity request has duplicate pending rows");
|
|
106
|
+
}
|
|
107
|
+
const group = [row];
|
|
108
|
+
latest.set(key, group);
|
|
109
|
+
groups.push(group);
|
|
110
|
+
continue;
|
|
111
|
+
}
|
|
112
|
+
if (previous.some((entry) => !isPending(entry))) {
|
|
113
|
+
throw new import_errors.GauntletSDKError("An activity request has conflicting terminal rows");
|
|
114
|
+
}
|
|
115
|
+
const pending = previous[0];
|
|
116
|
+
requireSameToken(pending, row);
|
|
117
|
+
const expected = pending.type === "deposit_pending" ? ["deposit", "deposit_refunded"] : ["withdraw", "withdraw_refunded"];
|
|
118
|
+
if (!expected.includes(row.type)) {
|
|
119
|
+
throw new import_errors.GauntletSDKError("The activity terminal does not match its request");
|
|
120
|
+
}
|
|
121
|
+
if (row.type === "deposit_refunded" && (0, import_decimal.decimalToBigInt)(pending.assets_delta.native, 18) !== -(0, import_decimal.decimalToBigInt)(row.assets_delta.native, 18)) {
|
|
122
|
+
throw new import_errors.GauntletSDKError("The deposit refund does not match its request");
|
|
123
|
+
}
|
|
124
|
+
if (row.type === "withdraw_refunded" && (0, import_decimal.sharesToBigInt)(pending.shares_delta) !== -(0, import_decimal.sharesToBigInt)(row.shares_delta)) {
|
|
125
|
+
throw new import_errors.GauntletSDKError("The withdrawal refund does not match its request");
|
|
126
|
+
}
|
|
127
|
+
previous.push(row);
|
|
128
|
+
}
|
|
129
|
+
return groups;
|
|
130
|
+
}
|
|
131
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
132
|
+
0 && (module.exports = {
|
|
133
|
+
activityLifecycles,
|
|
134
|
+
isPending,
|
|
135
|
+
orderActivityRows,
|
|
136
|
+
requireSameToken,
|
|
137
|
+
validateActivityRow
|
|
138
|
+
});
|
|
139
|
+
//# sourceMappingURL=activityRows.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/api/activityRows.ts"],
|
|
4
|
+
"sourcesContent": ["import { GauntletSDKError } from '../errors';\nimport type { UserActivity } from './client';\nimport { decimalToBigInt, sharesToBigInt } from './decimal';\n\nexport function isPending(row: UserActivity): boolean {\n return row.type === 'deposit_pending' || row.type === 'withdraw_pending';\n}\n\nexport function requireSameToken(leftRow: UserActivity, rightRow: UserActivity): void {\n // The vault ID includes the chain ID; TokenRef has no chain field.\n if (leftRow.vault_id.split(':')[0] !== rightRow.vault_id.split(':')[0]) {\n throw new GauntletSDKError('Activity rows contain assets on different chains');\n }\n const left = leftRow.assets_delta.token;\n const right = rightRow.assets_delta.token;\n if (\n left != null &&\n right != null &&\n (left.address.toLowerCase() !== right.address.toLowerCase() ||\n (left.decimals ?? null) !== (right.decimals ?? null))\n ) {\n throw new GauntletSDKError('Activity rows contain different asset denominations');\n }\n}\n\nexport function validateActivityRow(row: UserActivity): void {\n const shares = sharesToBigInt(row.shares_delta);\n const assets = decimalToBigInt(row.assets_delta.native, 18);\n if (\n !Number.isSafeInteger(row.block_number) ||\n row.block_number < 0 ||\n !Number.isSafeInteger(row.block_timestamp) ||\n row.block_timestamp < 0 ||\n typeof row.vault_id !== 'string' ||\n row.vault_id.length === 0 ||\n typeof row.tx_hash !== 'string' ||\n row.tx_hash.length === 0 ||\n (row.request_hash != null &&\n (typeof row.request_hash !== 'string' || row.request_hash.length === 0))\n ) {\n throw new GauntletSDKError('The activity row has invalid event identifiers');\n }\n const token = row.assets_delta.token;\n if (token != null && token.decimals != null) {\n if (!Number.isInteger(token.decimals) || token.decimals < 0 || token.decimals > 255) {\n throw new GauntletSDKError('The activity token has invalid decimals');\n }\n decimalToBigInt(row.assets_delta.native, token.decimals);\n }\n let valid: boolean;\n switch (row.type) {\n case 'deposit':\n valid = shares >= 0n && assets >= 0n && (row.request_hash == null || assets === 0n);\n break;\n case 'deposit_pending':\n valid = shares === 0n && assets > 0n && row.request_hash != null;\n break;\n case 'deposit_refunded':\n valid = shares === 0n && assets < 0n && row.request_hash != null;\n break;\n case 'withdraw':\n valid = shares <= 0n && assets <= 0n && (row.request_hash == null || shares === 0n);\n break;\n case 'withdraw_pending':\n valid = shares < 0n && assets === 0n && row.request_hash != null;\n break;\n case 'withdraw_refunded':\n valid = shares > 0n && assets === 0n && row.request_hash != null;\n break;\n case 'transfer_in':\n valid = shares >= 0n && assets >= 0n && row.request_hash == null;\n break;\n case 'transfer_out':\n valid = shares <= 0n && assets <= 0n && row.request_hash == null;\n break;\n default:\n valid = false;\n }\n if (!valid) throw new GauntletSDKError(`Invalid activity deltas for ${row.type}`);\n}\n\nexport function orderActivityRows(rows: UserActivity[]): UserActivity[] {\n rows.forEach(validateActivityRow);\n return [...rows].sort(\n (a, b) =>\n a.block_number - b.block_number ||\n a.block_timestamp - b.block_timestamp ||\n Number(isPending(b)) - Number(isPending(a))\n );\n}\n\n/**\n * Split request hashes by vault and by each request occurrence.\n * Takes the output of `orderActivityRows`.\n */\nexport function activityLifecycles(ordered: UserActivity[]): UserActivity[][] {\n const groups: UserActivity[][] = [];\n const latest = new Map<string, UserActivity[]>();\n for (const row of ordered) {\n if (row.request_hash == null) {\n groups.push([row]);\n continue;\n }\n const key = `${row.vault_id}:${row.request_hash}`;\n const previous = latest.get(key);\n if (previous === undefined || isPending(row)) {\n if (previous !== undefined && previous.every(isPending)) {\n throw new GauntletSDKError('An activity request has duplicate pending rows');\n }\n const group = [row];\n latest.set(key, group);\n groups.push(group);\n continue;\n }\n if (previous.some((entry) => !isPending(entry))) {\n throw new GauntletSDKError('An activity request has conflicting terminal rows');\n }\n const pending = previous[0];\n requireSameToken(pending, row);\n const expected =\n pending.type === 'deposit_pending'\n ? ['deposit', 'deposit_refunded']\n : ['withdraw', 'withdraw_refunded'];\n if (!expected.includes(row.type)) {\n throw new GauntletSDKError('The activity terminal does not match its request');\n }\n if (\n row.type === 'deposit_refunded' &&\n decimalToBigInt(pending.assets_delta.native, 18) !==\n -decimalToBigInt(row.assets_delta.native, 18)\n ) {\n throw new GauntletSDKError('The deposit refund does not match its request');\n }\n if (\n row.type === 'withdraw_refunded' &&\n sharesToBigInt(pending.shares_delta) !== -sharesToBigInt(row.shares_delta)\n ) {\n throw new GauntletSDKError('The withdrawal refund does not match its request');\n }\n previous.push(row);\n }\n return groups;\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"caip.d.ts","sourceRoot":"","sources":["../../../src/api/caip.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,qBAAkB;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,
|
|
1
|
+
{"version":3,"file":"caip.d.ts","sourceRoot":"","sources":["../../../src/api/caip.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,qBAAkB;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,CAMtD;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"}
|
package/dist/cjs/api/caip.js
CHANGED
|
@@ -30,7 +30,9 @@ var import_errors2 = require("./errors");
|
|
|
30
30
|
function parseApiVaultId(id) {
|
|
31
31
|
const match = /^(?:eip155:)?(\d+):(0x[0-9a-fA-F]{40})$/.exec(id);
|
|
32
32
|
if (!match) throw new import_errors2.InvalidCaipIdError(id);
|
|
33
|
-
|
|
33
|
+
const chainId = Number(match[1]);
|
|
34
|
+
if (!Number.isSafeInteger(chainId) || chainId <= 0) throw new import_errors2.InvalidCaipIdError(id);
|
|
35
|
+
return { chainId, address: match[2].toLowerCase() };
|
|
34
36
|
}
|
|
35
37
|
function formatApiVaultId(chainId, address) {
|
|
36
38
|
return `${chainId}:${address.toLowerCase()}`;
|
package/dist/cjs/api/caip.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/api/caip.ts"],
|
|
4
|
-
"sourcesContent": ["import type { GauntletClient } from '../client';\nimport { VaultNotFoundError } from '../errors';\nimport { resolveVault } from '../evm/vaults';\nimport { InvalidCaipIdError } from './errors';\n\n/**\n * The Gaia API identifies vaults as `\"{chainId}:{address}\"` with a lowercase\n * address (a CAIP-10-style account id without the `eip155` namespace prefix).\n */\nexport interface ApiVaultId {\n chainId: number;\n /** Lowercase EVM address. */\n address: string;\n}\n\nexport function parseApiVaultId(id: string): ApiVaultId {\n const match = /^(?:eip155:)?(\\d+):(0x[0-9a-fA-F]{40})$/.exec(id);\n if (!match) throw new InvalidCaipIdError(id);\n
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,oBAAmC;AACnC,oBAA6B;AAC7B,IAAAA,iBAAmC;AAY5B,SAAS,gBAAgB,IAAwB;AACtD,QAAM,QAAQ,0CAA0C,KAAK,EAAE;AAC/D,MAAI,CAAC,MAAO,OAAM,IAAI,kCAAmB,EAAE;AAC3C,
|
|
4
|
+
"sourcesContent": ["import type { GauntletClient } from '../client';\nimport { VaultNotFoundError } from '../errors';\nimport { resolveVault } from '../evm/vaults';\nimport { InvalidCaipIdError } from './errors';\n\n/**\n * The Gaia API identifies vaults as `\"{chainId}:{address}\"` with a lowercase\n * address (a CAIP-10-style account id without the `eip155` namespace prefix).\n */\nexport interface ApiVaultId {\n chainId: number;\n /** Lowercase EVM address. */\n address: string;\n}\n\nexport function parseApiVaultId(id: string): ApiVaultId {\n const match = /^(?:eip155:)?(\\d+):(0x[0-9a-fA-F]{40})$/.exec(id);\n if (!match) throw new InvalidCaipIdError(id);\n const chainId = Number(match[1]);\n if (!Number.isSafeInteger(chainId) || chainId <= 0) throw new InvalidCaipIdError(id);\n return { chainId, address: match[2].toLowerCase() };\n}\n\nexport function formatApiVaultId(chainId: number, address: string): string {\n return `${chainId}:${address.toLowerCase()}`;\n}\n\n/**\n * Resolves a manifest vault id (e.g. `VaultId.AeraUsdAlpha` / `'gtusda'`) to\n * the Gaia API's CAIP-10 id for the vault's deployment on `chainId`.\n *\n * Deployment resolution is `resolveVault` \u2014 the same rules tx-building uses:\n * single-deployment vaults resolve directly (a mismatched explicit `chainId`\n * throws `ChainMismatchError`), multi-chain vaults default to Base when\n * `chainId` is omitted.\n */\nexport async function apiVaultIdFromVaultId(\n client: GauntletClient,\n vaultId: string,\n chainId?: number\n): Promise<string> {\n const resolved = await resolveVault(client, vaultId, chainId);\n if (!resolved) throw new VaultNotFoundError(vaultId, chainId);\n return formatApiVaultId(resolved.vault.chainId, resolved.vault.vaultAddress);\n}\n\n/**\n * Resolves a Gaia API CAIP-10 vault id back to the manifest vault id, or\n * `undefined` when the vault is not in the bundled manifest (the API indexes\n * more vaults than the manifest lists).\n */\nexport async function vaultIdFromApiVaultId(\n client: GauntletClient,\n apiVaultId: string\n): Promise<string | undefined> {\n const { chainId, address } = parseApiVaultId(apiVaultId);\n const manifest = await client.manifest;\n return manifest.vaults.find((v) =>\n v.deployments.some(\n (d) => d.chain === 'evm' && d.chainId === chainId && d.vaultAddress.toLowerCase() === address\n )\n )?.vaultId;\n}\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,oBAAmC;AACnC,oBAA6B;AAC7B,IAAAA,iBAAmC;AAY5B,SAAS,gBAAgB,IAAwB;AACtD,QAAM,QAAQ,0CAA0C,KAAK,EAAE;AAC/D,MAAI,CAAC,MAAO,OAAM,IAAI,kCAAmB,EAAE;AAC3C,QAAM,UAAU,OAAO,MAAM,CAAC,CAAC;AAC/B,MAAI,CAAC,OAAO,cAAc,OAAO,KAAK,WAAW,EAAG,OAAM,IAAI,kCAAmB,EAAE;AACnF,SAAO,EAAE,SAAS,SAAS,MAAM,CAAC,EAAE,YAAY,EAAE;AACpD;AAEO,SAAS,iBAAiB,SAAiB,SAAyB;AACzE,SAAO,GAAG,OAAO,IAAI,QAAQ,YAAY,CAAC;AAC5C;AAWA,eAAsB,sBACpB,QACA,SACA,SACiB;AACjB,QAAM,WAAW,UAAM,4BAAa,QAAQ,SAAS,OAAO;AAC5D,MAAI,CAAC,SAAU,OAAM,IAAI,iCAAmB,SAAS,OAAO;AAC5D,SAAO,iBAAiB,SAAS,MAAM,SAAS,SAAS,MAAM,YAAY;AAC7E;AAOA,eAAsB,sBACpB,QACA,YAC6B;AAC7B,QAAM,EAAE,SAAS,QAAQ,IAAI,gBAAgB,UAAU;AACvD,QAAM,WAAW,MAAM,OAAO;AAC9B,SAAO,SAAS,OAAO;AAAA,IAAK,CAAC,MAC3B,EAAE,YAAY;AAAA,MACZ,CAAC,MAAM,EAAE,UAAU,SAAS,EAAE,YAAY,WAAW,EAAE,aAAa,YAAY,MAAM;AAAA,IACxF;AAAA,EACF,GAAG;AACL;",
|
|
6
6
|
"names": ["import_errors"]
|
|
7
7
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../../src/api/client.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../../src/api/client.ts"],"names":[],"mappings":"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"}
|
package/dist/cjs/api/client.js
CHANGED
|
@@ -21,7 +21,12 @@ __export(client_exports, {
|
|
|
21
21
|
GauntletApi: () => GauntletApi
|
|
22
22
|
});
|
|
23
23
|
module.exports = __toCommonJS(client_exports);
|
|
24
|
+
var import_caip = require("./caip");
|
|
25
|
+
var import_errors = require("./errors");
|
|
24
26
|
var import_http = require("./http");
|
|
27
|
+
function activityError(message, code) {
|
|
28
|
+
return new import_errors.GauntletApiError({ status: 200, path: "/v1/users/activity", message, code });
|
|
29
|
+
}
|
|
25
30
|
class GauntletApi {
|
|
26
31
|
constructor(config = {}) {
|
|
27
32
|
this.config = config;
|
|
@@ -120,11 +125,34 @@ class GauntletApi {
|
|
|
120
125
|
* across pages so callers never handle cursors.
|
|
121
126
|
*/
|
|
122
127
|
async *activityRows(walletAddress, options = {}) {
|
|
128
|
+
const vault = options.vaultId === void 0 ? void 0 : (0, import_caip.parseApiVaultId)(options.vaultId);
|
|
129
|
+
const descending = (options.order ?? "desc") === "desc";
|
|
130
|
+
let lastTimestamp;
|
|
123
131
|
let next;
|
|
132
|
+
const cursors = /* @__PURE__ */ new Set();
|
|
124
133
|
do {
|
|
125
134
|
const page = await this.activity(walletAddress, { ...options, next });
|
|
126
|
-
|
|
135
|
+
if (page.meta.partial_errors?.length) {
|
|
136
|
+
throw activityError("The activity response is incomplete", "INCOMPLETE_ACTIVITY");
|
|
137
|
+
}
|
|
138
|
+
for (const row of page.data) {
|
|
139
|
+
if (vault !== void 0) {
|
|
140
|
+
const rowVault = (0, import_caip.parseApiVaultId)(row.vault_id);
|
|
141
|
+
if (rowVault.chainId !== vault.chainId || rowVault.address !== vault.address) {
|
|
142
|
+
throw activityError("The activity vault does not match the request");
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
if (lastTimestamp !== void 0 && (descending ? row.block_timestamp > lastTimestamp : row.block_timestamp < lastTimestamp)) {
|
|
146
|
+
throw activityError("The activity rows are out of order");
|
|
147
|
+
}
|
|
148
|
+
lastTimestamp = row.block_timestamp;
|
|
149
|
+
yield row;
|
|
150
|
+
}
|
|
127
151
|
next = page.meta.next_cursor ?? void 0;
|
|
152
|
+
if (next !== void 0) {
|
|
153
|
+
if (cursors.has(next)) throw activityError("The activity cursor repeats");
|
|
154
|
+
cursors.add(next);
|
|
155
|
+
}
|
|
128
156
|
} while (next);
|
|
129
157
|
}
|
|
130
158
|
/**
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/api/client.ts"],
|
|
4
|
-
"sourcesContent": ["import type { components } from './generated';\nimport { apiGet, type GauntletApiConfig, type QueryParams } from './http';\n\ntype Schemas = components['schemas'];\n\nexport type UserActivity = Schemas['UserActivity'];\nexport type UserActivityResponse = Schemas['UserActivityResponse'];\nexport type UserPosition = Schemas['UserPosition'];\nexport type UserAllPositionsResponse = Schemas['UserAllPositionsResponse'];\nexport type UserPositionLatestResponse = Schemas['UserPositionLatestResponse'];\nexport type UserPositionsTimeseriesResponse = Schemas['UserPositionsTimeseriesResponse'];\nexport type PositionTimeseriesPoint = Schemas['PositionTimeseriesPoint'];\nexport type VaultDetail = Schemas['VaultDetail'];\nexport type VaultDetailResponse = Schemas['VaultDetailResponse'];\nexport type VaultListResponse = Schemas['VaultListResponse'];\nexport type VaultAllocations = Schemas['VaultAllocations'];\nexport type VaultAllocationsResponse = Schemas['VaultAllocationsResponse'];\nexport type VaultTimeseriesResponse = Schemas['VaultTimeseriesResponse'];\nexport type VaultGroupTimeseriesResponse = Schemas['VaultGroupTimeseriesResponse'];\nexport type VaultGroupTimeseriesPoint = Schemas['VaultGroupTimeseriesPoint'];\nexport type VaultTimeseriesPoint = Schemas['VaultTimeseriesPoint'];\nexport type VaultMetrics = Schemas['VaultMetrics'];\nexport type FeaturedVault = Schemas['FeaturedVault'];\nexport type FeaturedVaultsResponse = Schemas['FeaturedVaultsResponse'];\nexport type StrategyCard = Schemas['StrategyCard'];\nexport type StrategyListResponse = Schemas['StrategyListResponse'];\nexport type TvlResponse = Schemas['TvlResponse'];\nexport type TvlBreakdownMode = Schemas['TvlBreakdownMode'];\nexport type TvlTimeseriesResponse = Schemas['TvlTimeseriesResponse'];\nexport type TvlTimeseriesPoint = Schemas['TvlTimeseriesPoint'];\nexport type LatestPriceResponse = Schemas['LatestPriceResponse'];\nexport type PriceTimeseriesResponse = Schemas['TimeseriesResponse'];\nexport type TokenRef = Schemas['TokenRef'];\nexport type PartialResponseError = Schemas['PartialResponseError'];\nexport type AmountPair = Schemas['AmountPair'];\nexport type TimeseriesMeta = Schemas['TimeseriesMeta'];\nexport type HealthResponse = Schemas['HealthResponse'];\nexport type ChainSyncStatus = Schemas['ChainSyncStatus'];\n\nexport interface PageOptions {\n /** Opaque cursor from a previous response's `meta.next_cursor`. */\n next?: string;\n limit?: number;\n order?: 'asc' | 'desc';\n}\n\nexport interface TimeWindowOptions extends PageOptions {\n /** ISO 8601 date (`2026-01-01`) or RFC 3339 timestamp. */\n start?: string;\n end?: string;\n granularity?: 'hour' | 'day' | 'week' | 'month';\n}\n\nexport interface ActivityOptions extends PageOptions {\n /** CAIP-10 vault id (`\"{chainId}:{address}\"`). Omit for wallet-wide activity. */\n vaultId?: string;\n /**\n * Wallet-wide feeds only: include activity in hidden (enabled but unlisted)\n * vaults alongside visible ones. Activity in disabled vaults is never\n * returned. Ignored when `vaultId` is set.\n */\n includeHidden?: boolean;\n}\n\nexport interface PositionsOptions extends PageOptions {\n /**\n * Include positions in hidden (enabled but unlisted) vaults alongside\n * visible ones. Positions in disabled vaults are never returned.\n */\n includeHidden?: boolean;\n}\n\nexport interface VaultsOptions extends PageOptions {\n /**\n * Include hidden (enabled but unlisted) vaults alongside visible ones.\n * Disabled vaults are never listed.\n */\n includeHidden?: boolean;\n}\n\nexport interface LatestPriceOptions {\n address: string;\n chainId: number;\n /** Optional ISO 8601 timestamp for a point-in-time price. */\n at?: string;\n}\n\nexport interface PriceTimeseriesOptions {\n address: string;\n chainId: number;\n start: string;\n end: string;\n granularity?: 'raw' | 'hour' | 'day' | 'week' | 'month';\n limit?: number;\n}\n\n/**\n * Typed client for the Gaia REST API (api.gauntlet.xyz).\n *\n * All response types are generated from the service's OpenAPI spec\n * (`src/api/generated.ts`, regenerated via `yarn generate:api-types`) so they\n * cannot drift from the server models. Values are returned exactly as the API\n * emits them \u2014 human-unit decimal strings and CAIP-10 vault ids; use\n * `decimalToBigInt` / `sharesToBigInt` and `apiVaultIdFromVaultId` /\n * `vaultIdFromApiVaultId` to convert, or the higher-level `activityFlows` /\n * `positionHistory` helpers for pre-normalized values.\n *\n * Available on a configured client as `client.api`, or standalone:\n * ```ts\n * const api = new GauntletApi({ apiKey: process.env.GAUNTLET_API_KEY });\n * const { data } = await api.vaults();\n * ```\n */\nexport class GauntletApi {\n private readonly config: GauntletApiConfig;\n\n constructor(config: GauntletApiConfig = {}) {\n this.config = config;\n }\n\n private get<T>(path: string, query?: QueryParams): Promise<T> {\n return apiGet<T>(this.config, path, query);\n }\n\n /** GET /health \u2014 service liveness (version + uptime). */\n health(): Promise<HealthResponse> {\n return this.get('/health');\n }\n\n /** GET /health/chains \u2014 per-chain indexer sync freshness. */\n chainSyncStatus(): Promise<ChainSyncStatus[]> {\n return this.get('/health/chains');\n }\n\n /** GET /v1/vaults \u2014 all indexed vaults with live metrics (TVL, APY, unit price). */\n vaults(options: VaultsOptions = {}): Promise<{ data: VaultDetail[]; meta: TimeseriesMeta }> {\n return this.get('/v1/vaults', {\n next: options.next,\n limit: options.limit,\n include_hidden: options.includeHidden,\n });\n }\n\n /** GET /v1/vaults/slug/{slug} \u2014 all enabled deployments for one exact vault slug. */\n vaultsBySlug(slug: string): Promise<VaultListResponse> {\n return this.get(`/v1/vaults/slug/${encodeURIComponent(slug)}`);\n }\n\n /** GET /v1/vaults/slug/{slug}/timeseries \u2014 aggregate USD TVL and supply, plus primary-deployment metrics.\n * APY and unit price come from meta.resolved_vault_id; null marks missing data.\n */\n vaultTimeseriesBySlug(\n slug: string,\n options: TimeWindowOptions = {}\n ): Promise<VaultGroupTimeseriesResponse> {\n return this.get(`/v1/vaults/slug/${encodeURIComponent(slug)}/timeseries`, { ...options });\n }\n\n /** GET /v1/vaults/slug/{slug}/primary/timeseries \u2014 primary deployment history. */\n primaryVaultTimeseriesBySlug(\n slug: string,\n options: TimeWindowOptions = {}\n ): Promise<VaultTimeseriesResponse> {\n return this.get(`/v1/vaults/slug/${encodeURIComponent(slug)}/primary/timeseries`, {\n ...options,\n });\n }\n\n /** GET /v1/vaults/featured \u2014 admin-curated featured vault cards. */\n featuredVaults(): Promise<FeaturedVaultsResponse> {\n return this.get('/v1/vaults/featured');\n }\n\n /** GET /v1/strategies \u2014 admin-curated strategy cards. */\n strategies(): Promise<StrategyListResponse> {\n return this.get('/v1/strategies');\n }\n\n /** GET /v1/vaults/{vault_id} \u2014 one vault with live metrics. `vaultId` is CAIP-10. */\n vault(vaultId: string): Promise<VaultDetailResponse> {\n return this.get(`/v1/vaults/${encodeURIComponent(vaultId)}`);\n }\n\n /** GET /v1/vaults/{vault_id}/definition \u2014 raw indexed vault definition. */\n vaultDefinition(vaultId: string): Promise<unknown> {\n return this.get(`/v1/vaults/${encodeURIComponent(vaultId)}/definition`);\n }\n\n /** GET /v1/vaults/{vault_id}/allocations \u2014 current Aera allocations with source lineage. */\n vaultAllocations(vaultId: string): Promise<VaultAllocationsResponse> {\n return this.get(`/v1/vaults/${encodeURIComponent(vaultId)}/allocations`);\n }\n\n /** GET /v1/vaults/{vault_id}/timeseries \u2014 TVL / unit-price / APY history. */\n vaultTimeseries(\n vaultId: string,\n options: TimeWindowOptions = {}\n ): Promise<VaultTimeseriesResponse> {\n return this.get(`/v1/vaults/${encodeURIComponent(vaultId)}/timeseries`, { ...options });\n }\n\n /** GET /v1/users/{wallet}/positions \u2014 all of a wallet's indexed positions with PnL. */\n positions(\n walletAddress: string,\n options: PositionsOptions = {}\n ): Promise<UserAllPositionsResponse> {\n return this.get(`/v1/users/${encodeURIComponent(walletAddress)}/positions`, {\n next: options.next,\n limit: options.limit,\n include_hidden: options.includeHidden,\n });\n }\n\n /** GET /v1/users/{wallet}/positions/{vault_id} \u2014 one position with PnL breakdown. */\n position(walletAddress: string, vaultId: string): Promise<UserPositionLatestResponse> {\n return this.get(\n `/v1/users/${encodeURIComponent(walletAddress)}/positions/${encodeURIComponent(vaultId)}`\n );\n }\n\n /** GET /v1/users/{wallet}/positions/{vault_id}/timeseries \u2014 value / cost-basis / PnL / ROI history. */\n positionTimeseries(\n walletAddress: string,\n vaultId: string,\n options: TimeWindowOptions = {}\n ): Promise<UserPositionsTimeseriesResponse> {\n return this.get(\n `/v1/users/${encodeURIComponent(walletAddress)}/positions/${encodeURIComponent(vaultId)}/timeseries`,\n { ...options }\n );\n }\n\n /** GET /v1/users/{wallet}/activity \u2014 one page of the wallet's immutable event log. */\n activity(walletAddress: string, options: ActivityOptions = {}): Promise<UserActivityResponse> {\n const { vaultId, includeHidden, ...page } = options;\n return this.get(`/v1/users/${encodeURIComponent(walletAddress)}/activity`, {\n vault_id: vaultId,\n include_hidden: includeHidden,\n ...page,\n });\n }\n\n /**\n * Iterates the wallet's full activity log, following `meta.next_cursor`\n * across pages so callers never handle cursors.\n */\n async *activityRows(\n walletAddress: string,\n options: Omit<ActivityOptions, 'next'> = {}\n ): AsyncGenerator<UserActivity> {\n let next: string | undefined;\n do {\n const page = await this.activity(walletAddress, { ...options, next });\n yield* page.data;\n next = page.meta.next_cursor ?? undefined;\n } while (next);\n }\n\n /**\n * GET /v1/tvl \u2014 aggregate Gauntlet TVL. Pass `mode` for a `breakdown`:\n * `chain` for one row per chain, `strategy` for one row per curated\n * strategy. Omit it for the headline totals only.\n */\n tvl(options: { mode?: TvlBreakdownMode } = {}): Promise<TvlResponse> {\n return this.get('/v1/tvl', { mode: options.mode });\n }\n\n /**\n * GET /v1/tvl/timeseries \u2014 daily aggregate Gauntlet TVL over a fixed\n * 3-month trailing window. `mode` partitions each point's `sources` the\n * same way `tvl()` partitions its `breakdown`; a point's total never\n * depends on it.\n */\n tvlTimeseries(options: { mode?: TvlBreakdownMode } = {}): Promise<TvlTimeseriesResponse> {\n return this.get('/v1/tvl/timeseries', { mode: options.mode });\n }\n\n /** GET /v1/prices \u2014 latest USD price for a token. */\n latestPrice(options: LatestPriceOptions): Promise<LatestPriceResponse> {\n return this.get('/v1/prices', {\n address: options.address,\n chain_id: options.chainId,\n at: options.at,\n });\n }\n\n /** GET /v1/prices/timeseries \u2014 USD price history for a token. */\n priceTimeseries(options: PriceTimeseriesOptions): Promise<PriceTimeseriesResponse> {\n return this.get('/v1/prices/timeseries', {\n address: options.address,\n chain_id: options.chainId,\n start: options.start,\n end: options.end,\n granularity: options.granularity,\n limit: options.limit,\n });\n }\n}\n"],
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;
|
|
4
|
+
"sourcesContent": ["import { parseApiVaultId } from './caip';\nimport { GauntletApiError } from './errors';\nimport type { components } from './generated';\nimport { apiGet, type GauntletApiConfig, type QueryParams } from './http';\n\ntype Schemas = components['schemas'];\n\nfunction activityError(message: string, code?: string): GauntletApiError {\n return new GauntletApiError({ status: 200, path: '/v1/users/activity', message, code });\n}\n\nexport type UserActivity = Schemas['UserActivity'];\nexport type UserActivityResponse = Schemas['UserActivityResponse'];\nexport type UserPosition = Schemas['UserPosition'];\nexport type UserAllPositionsResponse = Schemas['UserAllPositionsResponse'];\nexport type UserPositionLatestResponse = Schemas['UserPositionLatestResponse'];\nexport type UserPositionsTimeseriesResponse = Schemas['UserPositionsTimeseriesResponse'];\nexport type PositionTimeseriesPoint = Schemas['PositionTimeseriesPoint'];\nexport type VaultDetail = Schemas['VaultDetail'];\nexport type VaultDetailResponse = Schemas['VaultDetailResponse'];\nexport type VaultListResponse = Schemas['VaultListResponse'];\nexport type VaultAllocations = Schemas['VaultAllocations'];\nexport type VaultAllocationsResponse = Schemas['VaultAllocationsResponse'];\nexport type VaultTimeseriesResponse = Schemas['VaultTimeseriesResponse'];\nexport type VaultGroupTimeseriesResponse = Schemas['VaultGroupTimeseriesResponse'];\nexport type VaultGroupTimeseriesPoint = Schemas['VaultGroupTimeseriesPoint'];\nexport type VaultTimeseriesPoint = Schemas['VaultTimeseriesPoint'];\nexport type VaultMetrics = Schemas['VaultMetrics'];\nexport type FeaturedVault = Schemas['FeaturedVault'];\nexport type FeaturedVaultsResponse = Schemas['FeaturedVaultsResponse'];\nexport type StrategyCard = Schemas['StrategyCard'];\nexport type StrategyListResponse = Schemas['StrategyListResponse'];\nexport type TvlResponse = Schemas['TvlResponse'];\nexport type TvlBreakdownMode = Schemas['TvlBreakdownMode'];\nexport type TvlTimeseriesResponse = Schemas['TvlTimeseriesResponse'];\nexport type TvlTimeseriesPoint = Schemas['TvlTimeseriesPoint'];\nexport type LatestPriceResponse = Schemas['LatestPriceResponse'];\nexport type PriceTimeseriesResponse = Schemas['TimeseriesResponse'];\nexport type TokenRef = Schemas['TokenRef'];\nexport type PartialResponseError = Schemas['PartialResponseError'];\nexport type AmountPair = Schemas['AmountPair'];\nexport type TimeseriesMeta = Schemas['TimeseriesMeta'];\nexport type HealthResponse = Schemas['HealthResponse'];\nexport type ChainSyncStatus = Schemas['ChainSyncStatus'];\n\nexport interface PageOptions {\n /** Opaque cursor from a previous response's `meta.next_cursor`. */\n next?: string;\n limit?: number;\n order?: 'asc' | 'desc';\n}\n\nexport interface TimeWindowOptions extends PageOptions {\n /** ISO 8601 date (`2026-01-01`) or RFC 3339 timestamp. */\n start?: string;\n end?: string;\n granularity?: 'hour' | 'day' | 'week' | 'month';\n}\n\nexport interface ActivityOptions extends PageOptions {\n /** CAIP-10 vault id (`\"{chainId}:{address}\"`). Omit for wallet-wide activity. */\n vaultId?: string;\n /**\n * Wallet-wide feeds only: include activity in hidden (enabled but unlisted)\n * vaults alongside visible ones. Activity in disabled vaults is never\n * returned. Ignored when `vaultId` is set.\n */\n includeHidden?: boolean;\n}\n\nexport interface PositionsOptions extends PageOptions {\n /**\n * Include positions in hidden (enabled but unlisted) vaults alongside\n * visible ones. Positions in disabled vaults are never returned.\n */\n includeHidden?: boolean;\n}\n\nexport interface VaultsOptions extends PageOptions {\n /**\n * Include hidden (enabled but unlisted) vaults alongside visible ones.\n * Disabled vaults are never listed.\n */\n includeHidden?: boolean;\n}\n\nexport interface LatestPriceOptions {\n address: string;\n chainId: number;\n /** Optional ISO 8601 timestamp for a point-in-time price. */\n at?: string;\n}\n\nexport interface PriceTimeseriesOptions {\n address: string;\n chainId: number;\n start: string;\n end: string;\n granularity?: 'raw' | 'hour' | 'day' | 'week' | 'month';\n limit?: number;\n}\n\n/**\n * Typed client for the Gaia REST API (api.gauntlet.xyz).\n *\n * All response types are generated from the service's OpenAPI spec\n * (`src/api/generated.ts`, regenerated via `yarn generate:api-types`) so they\n * cannot drift from the server models. Values are returned exactly as the API\n * emits them \u2014 human-unit decimal strings and CAIP-10 vault ids; use\n * `decimalToBigInt` / `sharesToBigInt` and `apiVaultIdFromVaultId` /\n * `vaultIdFromApiVaultId` to convert, or the higher-level `activityFlows` /\n * `positionHistory` helpers for pre-normalized values.\n *\n * Available on a configured client as `client.api`, or standalone:\n * ```ts\n * const api = new GauntletApi({ apiKey: process.env.GAUNTLET_API_KEY });\n * const { data } = await api.vaults();\n * ```\n */\nexport class GauntletApi {\n private readonly config: GauntletApiConfig;\n\n constructor(config: GauntletApiConfig = {}) {\n this.config = config;\n }\n\n private get<T>(path: string, query?: QueryParams): Promise<T> {\n return apiGet<T>(this.config, path, query);\n }\n\n /** GET /health \u2014 service liveness (version + uptime). */\n health(): Promise<HealthResponse> {\n return this.get('/health');\n }\n\n /** GET /health/chains \u2014 per-chain indexer sync freshness. */\n chainSyncStatus(): Promise<ChainSyncStatus[]> {\n return this.get('/health/chains');\n }\n\n /** GET /v1/vaults \u2014 all indexed vaults with live metrics (TVL, APY, unit price). */\n vaults(options: VaultsOptions = {}): Promise<{ data: VaultDetail[]; meta: TimeseriesMeta }> {\n return this.get('/v1/vaults', {\n next: options.next,\n limit: options.limit,\n include_hidden: options.includeHidden,\n });\n }\n\n /** GET /v1/vaults/slug/{slug} \u2014 all enabled deployments for one exact vault slug. */\n vaultsBySlug(slug: string): Promise<VaultListResponse> {\n return this.get(`/v1/vaults/slug/${encodeURIComponent(slug)}`);\n }\n\n /** GET /v1/vaults/slug/{slug}/timeseries \u2014 aggregate USD TVL and supply, plus primary-deployment metrics.\n * APY and unit price come from meta.resolved_vault_id; null marks missing data.\n */\n vaultTimeseriesBySlug(\n slug: string,\n options: TimeWindowOptions = {}\n ): Promise<VaultGroupTimeseriesResponse> {\n return this.get(`/v1/vaults/slug/${encodeURIComponent(slug)}/timeseries`, { ...options });\n }\n\n /** GET /v1/vaults/slug/{slug}/primary/timeseries \u2014 primary deployment history. */\n primaryVaultTimeseriesBySlug(\n slug: string,\n options: TimeWindowOptions = {}\n ): Promise<VaultTimeseriesResponse> {\n return this.get(`/v1/vaults/slug/${encodeURIComponent(slug)}/primary/timeseries`, {\n ...options,\n });\n }\n\n /** GET /v1/vaults/featured \u2014 admin-curated featured vault cards. */\n featuredVaults(): Promise<FeaturedVaultsResponse> {\n return this.get('/v1/vaults/featured');\n }\n\n /** GET /v1/strategies \u2014 admin-curated strategy cards. */\n strategies(): Promise<StrategyListResponse> {\n return this.get('/v1/strategies');\n }\n\n /** GET /v1/vaults/{vault_id} \u2014 one vault with live metrics. `vaultId` is CAIP-10. */\n vault(vaultId: string): Promise<VaultDetailResponse> {\n return this.get(`/v1/vaults/${encodeURIComponent(vaultId)}`);\n }\n\n /** GET /v1/vaults/{vault_id}/definition \u2014 raw indexed vault definition. */\n vaultDefinition(vaultId: string): Promise<unknown> {\n return this.get(`/v1/vaults/${encodeURIComponent(vaultId)}/definition`);\n }\n\n /** GET /v1/vaults/{vault_id}/allocations \u2014 current Aera allocations with source lineage. */\n vaultAllocations(vaultId: string): Promise<VaultAllocationsResponse> {\n return this.get(`/v1/vaults/${encodeURIComponent(vaultId)}/allocations`);\n }\n\n /** GET /v1/vaults/{vault_id}/timeseries \u2014 TVL / unit-price / APY history. */\n vaultTimeseries(\n vaultId: string,\n options: TimeWindowOptions = {}\n ): Promise<VaultTimeseriesResponse> {\n return this.get(`/v1/vaults/${encodeURIComponent(vaultId)}/timeseries`, { ...options });\n }\n\n /** GET /v1/users/{wallet}/positions \u2014 all of a wallet's indexed positions with PnL. */\n positions(\n walletAddress: string,\n options: PositionsOptions = {}\n ): Promise<UserAllPositionsResponse> {\n return this.get(`/v1/users/${encodeURIComponent(walletAddress)}/positions`, {\n next: options.next,\n limit: options.limit,\n include_hidden: options.includeHidden,\n });\n }\n\n /** GET /v1/users/{wallet}/positions/{vault_id} \u2014 one position with PnL breakdown. */\n position(walletAddress: string, vaultId: string): Promise<UserPositionLatestResponse> {\n return this.get(\n `/v1/users/${encodeURIComponent(walletAddress)}/positions/${encodeURIComponent(vaultId)}`\n );\n }\n\n /** GET /v1/users/{wallet}/positions/{vault_id}/timeseries \u2014 value / cost-basis / PnL / ROI history. */\n positionTimeseries(\n walletAddress: string,\n vaultId: string,\n options: TimeWindowOptions = {}\n ): Promise<UserPositionsTimeseriesResponse> {\n return this.get(\n `/v1/users/${encodeURIComponent(walletAddress)}/positions/${encodeURIComponent(vaultId)}/timeseries`,\n { ...options }\n );\n }\n\n /** GET /v1/users/{wallet}/activity \u2014 one page of the wallet's immutable event log. */\n activity(walletAddress: string, options: ActivityOptions = {}): Promise<UserActivityResponse> {\n const { vaultId, includeHidden, ...page } = options;\n return this.get(`/v1/users/${encodeURIComponent(walletAddress)}/activity`, {\n vault_id: vaultId,\n include_hidden: includeHidden,\n ...page,\n });\n }\n\n /**\n * Iterates the wallet's full activity log, following `meta.next_cursor`\n * across pages so callers never handle cursors.\n */\n async *activityRows(\n walletAddress: string,\n options: Omit<ActivityOptions, 'next'> = {}\n ): AsyncGenerator<UserActivity> {\n const vault = options.vaultId === undefined ? undefined : parseApiVaultId(options.vaultId);\n // Gaia pages on (timestamp, logIndex), which rows do not expose. Rows\n // can repeat legitimately inside one transaction, so the boundary check\n // is the timestamp order.\n const descending = (options.order ?? 'desc') === 'desc';\n let lastTimestamp: number | undefined;\n let next: string | undefined;\n const cursors = new Set<string>();\n do {\n const page = await this.activity(walletAddress, { ...options, next });\n if (page.meta.partial_errors?.length) {\n throw activityError('The activity response is incomplete', 'INCOMPLETE_ACTIVITY');\n }\n for (const row of page.data) {\n if (vault !== undefined) {\n const rowVault = parseApiVaultId(row.vault_id);\n if (rowVault.chainId !== vault.chainId || rowVault.address !== vault.address) {\n throw activityError('The activity vault does not match the request');\n }\n }\n if (\n lastTimestamp !== undefined &&\n (descending ? row.block_timestamp > lastTimestamp : row.block_timestamp < lastTimestamp)\n ) {\n throw activityError('The activity rows are out of order');\n }\n lastTimestamp = row.block_timestamp;\n yield row;\n }\n next = page.meta.next_cursor ?? undefined;\n if (next !== undefined) {\n if (cursors.has(next)) throw activityError('The activity cursor repeats');\n cursors.add(next);\n }\n } while (next);\n }\n\n /**\n * GET /v1/tvl \u2014 aggregate Gauntlet TVL. Pass `mode` for a `breakdown`:\n * `chain` for one row per chain, `strategy` for one row per curated\n * strategy. Omit it for the headline totals only.\n */\n tvl(options: { mode?: TvlBreakdownMode } = {}): Promise<TvlResponse> {\n return this.get('/v1/tvl', { mode: options.mode });\n }\n\n /**\n * GET /v1/tvl/timeseries \u2014 daily aggregate Gauntlet TVL over a fixed\n * 3-month trailing window. `mode` partitions each point's `sources` the\n * same way `tvl()` partitions its `breakdown`; a point's total never\n * depends on it.\n */\n tvlTimeseries(options: { mode?: TvlBreakdownMode } = {}): Promise<TvlTimeseriesResponse> {\n return this.get('/v1/tvl/timeseries', { mode: options.mode });\n }\n\n /** GET /v1/prices \u2014 latest USD price for a token. */\n latestPrice(options: LatestPriceOptions): Promise<LatestPriceResponse> {\n return this.get('/v1/prices', {\n address: options.address,\n chain_id: options.chainId,\n at: options.at,\n });\n }\n\n /** GET /v1/prices/timeseries \u2014 USD price history for a token. */\n priceTimeseries(options: PriceTimeseriesOptions): Promise<PriceTimeseriesResponse> {\n return this.get('/v1/prices/timeseries', {\n address: options.address,\n chain_id: options.chainId,\n start: options.start,\n end: options.end,\n granularity: options.granularity,\n limit: options.limit,\n });\n }\n}\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kBAAgC;AAChC,oBAAiC;AAEjC,kBAAiE;AAIjE,SAAS,cAAc,SAAiB,MAAiC;AACvE,SAAO,IAAI,+BAAiB,EAAE,QAAQ,KAAK,MAAM,sBAAsB,SAAS,KAAK,CAAC;AACxF;AA8GO,MAAM,YAAY;AAAA,EAGvB,YAAY,SAA4B,CAAC,GAAG;AAC1C,SAAK,SAAS;AAAA,EAChB;AAAA,EAEQ,IAAO,MAAc,OAAiC;AAC5D,eAAO,oBAAU,KAAK,QAAQ,MAAM,KAAK;AAAA,EAC3C;AAAA;AAAA,EAGA,SAAkC;AAChC,WAAO,KAAK,IAAI,SAAS;AAAA,EAC3B;AAAA;AAAA,EAGA,kBAA8C;AAC5C,WAAO,KAAK,IAAI,gBAAgB;AAAA,EAClC;AAAA;AAAA,EAGA,OAAO,UAAyB,CAAC,GAA2D;AAC1F,WAAO,KAAK,IAAI,cAAc;AAAA,MAC5B,MAAM,QAAQ;AAAA,MACd,OAAO,QAAQ;AAAA,MACf,gBAAgB,QAAQ;AAAA,IAC1B,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,aAAa,MAA0C;AACrD,WAAO,KAAK,IAAI,mBAAmB,mBAAmB,IAAI,CAAC,EAAE;AAAA,EAC/D;AAAA;AAAA;AAAA;AAAA,EAKA,sBACE,MACA,UAA6B,CAAC,GACS;AACvC,WAAO,KAAK,IAAI,mBAAmB,mBAAmB,IAAI,CAAC,eAAe,EAAE,GAAG,QAAQ,CAAC;AAAA,EAC1F;AAAA;AAAA,EAGA,6BACE,MACA,UAA6B,CAAC,GACI;AAClC,WAAO,KAAK,IAAI,mBAAmB,mBAAmB,IAAI,CAAC,uBAAuB;AAAA,MAChF,GAAG;AAAA,IACL,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,iBAAkD;AAChD,WAAO,KAAK,IAAI,qBAAqB;AAAA,EACvC;AAAA;AAAA,EAGA,aAA4C;AAC1C,WAAO,KAAK,IAAI,gBAAgB;AAAA,EAClC;AAAA;AAAA,EAGA,MAAM,SAA+C;AACnD,WAAO,KAAK,IAAI,cAAc,mBAAmB,OAAO,CAAC,EAAE;AAAA,EAC7D;AAAA;AAAA,EAGA,gBAAgB,SAAmC;AACjD,WAAO,KAAK,IAAI,cAAc,mBAAmB,OAAO,CAAC,aAAa;AAAA,EACxE;AAAA;AAAA,EAGA,iBAAiB,SAAoD;AACnE,WAAO,KAAK,IAAI,cAAc,mBAAmB,OAAO,CAAC,cAAc;AAAA,EACzE;AAAA;AAAA,EAGA,gBACE,SACA,UAA6B,CAAC,GACI;AAClC,WAAO,KAAK,IAAI,cAAc,mBAAmB,OAAO,CAAC,eAAe,EAAE,GAAG,QAAQ,CAAC;AAAA,EACxF;AAAA;AAAA,EAGA,UACE,eACA,UAA4B,CAAC,GACM;AACnC,WAAO,KAAK,IAAI,aAAa,mBAAmB,aAAa,CAAC,cAAc;AAAA,MAC1E,MAAM,QAAQ;AAAA,MACd,OAAO,QAAQ;AAAA,MACf,gBAAgB,QAAQ;AAAA,IAC1B,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,SAAS,eAAuB,SAAsD;AACpF,WAAO,KAAK;AAAA,MACV,aAAa,mBAAmB,aAAa,CAAC,cAAc,mBAAmB,OAAO,CAAC;AAAA,IACzF;AAAA,EACF;AAAA;AAAA,EAGA,mBACE,eACA,SACA,UAA6B,CAAC,GACY;AAC1C,WAAO,KAAK;AAAA,MACV,aAAa,mBAAmB,aAAa,CAAC,cAAc,mBAAmB,OAAO,CAAC;AAAA,MACvF,EAAE,GAAG,QAAQ;AAAA,IACf;AAAA,EACF;AAAA;AAAA,EAGA,SAAS,eAAuB,UAA2B,CAAC,GAAkC;AAC5F,UAAM,EAAE,SAAS,eAAe,GAAG,KAAK,IAAI;AAC5C,WAAO,KAAK,IAAI,aAAa,mBAAmB,aAAa,CAAC,aAAa;AAAA,MACzE,UAAU;AAAA,MACV,gBAAgB;AAAA,MAChB,GAAG;AAAA,IACL,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,OAAO,aACL,eACA,UAAyC,CAAC,GACZ;AAC9B,UAAM,QAAQ,QAAQ,YAAY,SAAY,aAAY,6BAAgB,QAAQ,OAAO;AAIzF,UAAM,cAAc,QAAQ,SAAS,YAAY;AACjD,QAAI;AACJ,QAAI;AACJ,UAAM,UAAU,oBAAI,IAAY;AAChC,OAAG;AACD,YAAM,OAAO,MAAM,KAAK,SAAS,eAAe,EAAE,GAAG,SAAS,KAAK,CAAC;AACpE,UAAI,KAAK,KAAK,gBAAgB,QAAQ;AACpC,cAAM,cAAc,uCAAuC,qBAAqB;AAAA,MAClF;AACA,iBAAW,OAAO,KAAK,MAAM;AAC3B,YAAI,UAAU,QAAW;AACvB,gBAAM,eAAW,6BAAgB,IAAI,QAAQ;AAC7C,cAAI,SAAS,YAAY,MAAM,WAAW,SAAS,YAAY,MAAM,SAAS;AAC5E,kBAAM,cAAc,+CAA+C;AAAA,UACrE;AAAA,QACF;AACA,YACE,kBAAkB,WACjB,aAAa,IAAI,kBAAkB,gBAAgB,IAAI,kBAAkB,gBAC1E;AACA,gBAAM,cAAc,oCAAoC;AAAA,QAC1D;AACA,wBAAgB,IAAI;AACpB,cAAM;AAAA,MACR;AACA,aAAO,KAAK,KAAK,eAAe;AAChC,UAAI,SAAS,QAAW;AACtB,YAAI,QAAQ,IAAI,IAAI,EAAG,OAAM,cAAc,6BAA6B;AACxE,gBAAQ,IAAI,IAAI;AAAA,MAClB;AAAA,IACF,SAAS;AAAA,EACX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,IAAI,UAAuC,CAAC,GAAyB;AACnE,WAAO,KAAK,IAAI,WAAW,EAAE,MAAM,QAAQ,KAAK,CAAC;AAAA,EACnD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,cAAc,UAAuC,CAAC,GAAmC;AACvF,WAAO,KAAK,IAAI,sBAAsB,EAAE,MAAM,QAAQ,KAAK,CAAC;AAAA,EAC9D;AAAA;AAAA,EAGA,YAAY,SAA2D;AACrE,WAAO,KAAK,IAAI,cAAc;AAAA,MAC5B,SAAS,QAAQ;AAAA,MACjB,UAAU,QAAQ;AAAA,MAClB,IAAI,QAAQ;AAAA,IACd,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,gBAAgB,SAAmE;AACjF,WAAO,KAAK,IAAI,yBAAyB;AAAA,MACvC,SAAS,QAAQ;AAAA,MACjB,UAAU,QAAQ;AAAA,MAClB,OAAO,QAAQ;AAAA,MACf,KAAK,QAAQ;AAAA,MACb,aAAa,QAAQ;AAAA,MACrB,OAAO,QAAQ;AAAA,IACjB,CAAC;AAAA,EACH;AACF;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"decimal.d.ts","sourceRoot":"","sources":["../../../src/api/decimal.ts"],"names":[],"mappings":"AAKA;;;;;;;;;GASG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,
|
|
1
|
+
{"version":3,"file":"decimal.d.ts","sourceRoot":"","sources":["../../../src/api/decimal.ts"],"names":[],"mappings":"AAKA;;;;;;;;;GASG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAevE;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAKvE;AAED,4EAA4E;AAC5E,eAAO,MAAM,cAAc,KAAK,CAAC;AAEjC,gFAAgF;AAChF,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAEpD"}
|
package/dist/cjs/api/decimal.js
CHANGED
|
@@ -31,6 +31,7 @@ function decimalToBigInt(value, decimals) {
|
|
|
31
31
|
if (!Number.isInteger(decimals) || decimals < 0) {
|
|
32
32
|
throw new import_errors.InvalidDecimalError(`decimals=${decimals}`);
|
|
33
33
|
}
|
|
34
|
+
if (typeof value !== "string") throw new import_errors.InvalidDecimalError(String(value));
|
|
34
35
|
const match = DECIMAL_RE.exec(value);
|
|
35
36
|
if (!match) throw new import_errors.InvalidDecimalError(value);
|
|
36
37
|
const [, sign, whole, frac = ""] = match;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/api/decimal.ts"],
|
|
4
|
-
"sourcesContent": ["import { formatUnits } from 'viem';\nimport { DecimalPrecisionError, InvalidDecimalError } from './errors';\n\nconst DECIMAL_RE = /^(-?)(\\d+)(?:\\.(\\d+))?$/;\n\n/**\n * Converts an API decimal string (human units, e.g. `\"1250.5\"`) into base-unit\n * bigint at the given token decimals (e.g. `1250500000n` for 6 decimals).\n *\n * The conversion is exact: a value with more significant fractional digits\n * than `decimals` throws `DecimalPrecisionError` rather than rounding.\n * Hand-rolled instead of viem's `parseUnits`, which silently rounds excess\n * precision (`parseUnits('1.0000005', 6)` \u2192 `1000001n`) \u2014 unacceptable for\n * financial amounts.\n */\nexport function decimalToBigInt(value: string, decimals: number): bigint {\n if (!Number.isInteger(decimals) || decimals < 0) {\n throw new InvalidDecimalError(`decimals=${decimals}`);\n }\n const match = DECIMAL_RE.exec(value);\n if (!match) throw new InvalidDecimalError(value);\n\n const [, sign, whole, frac = ''] = match;\n if (frac.length > decimals && !/^0*$/.test(frac.slice(decimals))) {\n throw new DecimalPrecisionError(value, decimals);\n }\n\n const scaled = BigInt(whole + frac.slice(0, decimals).padEnd(decimals, '0'));\n return sign === '-' ? -scaled : scaled;\n}\n\n/**\n * Formats a base-unit bigint back into the API's human decimal-string\n * representation (no trailing fractional zeros, no exponent notation).\n */\nexport function bigIntToDecimal(value: bigint, decimals: number): string {\n if (!Number.isInteger(decimals) || decimals < 0) {\n throw new InvalidDecimalError(`decimals=${decimals}`);\n }\n return formatUnits(value, decimals);\n}\n\n/** Vault shares are always reported in 18-decimal units by the Gaia API. */\nexport const SHARE_DECIMALS = 18;\n\n/** Parses an API share amount (decimal string) into base-unit bigint (1e18). */\nexport function sharesToBigInt(value: string): bigint {\n return decimalToBigInt(value, SHARE_DECIMALS);\n}\n"],
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kBAA4B;AAC5B,oBAA2D;AAE3D,MAAM,aAAa;AAYZ,SAAS,gBAAgB,OAAe,UAA0B;AACvE,MAAI,CAAC,OAAO,UAAU,QAAQ,KAAK,WAAW,GAAG;AAC/C,UAAM,IAAI,kCAAoB,YAAY,QAAQ,EAAE;AAAA,EACtD;AACA,QAAM,QAAQ,WAAW,KAAK,KAAK;AACnC,MAAI,CAAC,MAAO,OAAM,IAAI,kCAAoB,KAAK;AAE/C,QAAM,CAAC,EAAE,MAAM,OAAO,OAAO,EAAE,IAAI;AACnC,MAAI,KAAK,SAAS,YAAY,CAAC,OAAO,KAAK,KAAK,MAAM,QAAQ,CAAC,GAAG;AAChE,UAAM,IAAI,oCAAsB,OAAO,QAAQ;AAAA,EACjD;AAEA,QAAM,SAAS,OAAO,QAAQ,KAAK,MAAM,GAAG,QAAQ,EAAE,OAAO,UAAU,GAAG,CAAC;AAC3E,SAAO,SAAS,MAAM,CAAC,SAAS;AAClC;AAMO,SAAS,gBAAgB,OAAe,UAA0B;AACvE,MAAI,CAAC,OAAO,UAAU,QAAQ,KAAK,WAAW,GAAG;AAC/C,UAAM,IAAI,kCAAoB,YAAY,QAAQ,EAAE;AAAA,EACtD;AACA,aAAO,yBAAY,OAAO,QAAQ;AACpC;AAGO,MAAM,iBAAiB;AAGvB,SAAS,eAAe,OAAuB;AACpD,SAAO,gBAAgB,OAAO,cAAc;AAC9C;",
|
|
4
|
+
"sourcesContent": ["import { formatUnits } from 'viem';\nimport { DecimalPrecisionError, InvalidDecimalError } from './errors';\n\nconst DECIMAL_RE = /^(-?)(\\d+)(?:\\.(\\d+))?$/;\n\n/**\n * Converts an API decimal string (human units, e.g. `\"1250.5\"`) into base-unit\n * bigint at the given token decimals (e.g. `1250500000n` for 6 decimals).\n *\n * The conversion is exact: a value with more significant fractional digits\n * than `decimals` throws `DecimalPrecisionError` rather than rounding.\n * Hand-rolled instead of viem's `parseUnits`, which silently rounds excess\n * precision (`parseUnits('1.0000005', 6)` \u2192 `1000001n`) \u2014 unacceptable for\n * financial amounts.\n */\nexport function decimalToBigInt(value: string, decimals: number): bigint {\n if (!Number.isInteger(decimals) || decimals < 0) {\n throw new InvalidDecimalError(`decimals=${decimals}`);\n }\n if (typeof value !== 'string') throw new InvalidDecimalError(String(value));\n const match = DECIMAL_RE.exec(value);\n if (!match) throw new InvalidDecimalError(value);\n\n const [, sign, whole, frac = ''] = match;\n if (frac.length > decimals && !/^0*$/.test(frac.slice(decimals))) {\n throw new DecimalPrecisionError(value, decimals);\n }\n\n const scaled = BigInt(whole + frac.slice(0, decimals).padEnd(decimals, '0'));\n return sign === '-' ? -scaled : scaled;\n}\n\n/**\n * Formats a base-unit bigint back into the API's human decimal-string\n * representation (no trailing fractional zeros, no exponent notation).\n */\nexport function bigIntToDecimal(value: bigint, decimals: number): string {\n if (!Number.isInteger(decimals) || decimals < 0) {\n throw new InvalidDecimalError(`decimals=${decimals}`);\n }\n return formatUnits(value, decimals);\n}\n\n/** Vault shares are always reported in 18-decimal units by the Gaia API. */\nexport const SHARE_DECIMALS = 18;\n\n/** Parses an API share amount (decimal string) into base-unit bigint (1e18). */\nexport function sharesToBigInt(value: string): bigint {\n return decimalToBigInt(value, SHARE_DECIMALS);\n}\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kBAA4B;AAC5B,oBAA2D;AAE3D,MAAM,aAAa;AAYZ,SAAS,gBAAgB,OAAe,UAA0B;AACvE,MAAI,CAAC,OAAO,UAAU,QAAQ,KAAK,WAAW,GAAG;AAC/C,UAAM,IAAI,kCAAoB,YAAY,QAAQ,EAAE;AAAA,EACtD;AACA,MAAI,OAAO,UAAU,SAAU,OAAM,IAAI,kCAAoB,OAAO,KAAK,CAAC;AAC1E,QAAM,QAAQ,WAAW,KAAK,KAAK;AACnC,MAAI,CAAC,MAAO,OAAM,IAAI,kCAAoB,KAAK;AAE/C,QAAM,CAAC,EAAE,MAAM,OAAO,OAAO,EAAE,IAAI;AACnC,MAAI,KAAK,SAAS,YAAY,CAAC,OAAO,KAAK,KAAK,MAAM,QAAQ,CAAC,GAAG;AAChE,UAAM,IAAI,oCAAsB,OAAO,QAAQ;AAAA,EACjD;AAEA,QAAM,SAAS,OAAO,QAAQ,KAAK,MAAM,GAAG,QAAQ,EAAE,OAAO,UAAU,GAAG,CAAC;AAC3E,SAAO,SAAS,MAAM,CAAC,SAAS;AAClC;AAMO,SAAS,gBAAgB,OAAe,UAA0B;AACvE,MAAI,CAAC,OAAO,UAAU,QAAQ,KAAK,WAAW,GAAG;AAC/C,UAAM,IAAI,kCAAoB,YAAY,QAAQ,EAAE;AAAA,EACtD;AACA,aAAO,yBAAY,OAAO,QAAQ;AACpC;AAGO,MAAM,iBAAiB;AAGvB,SAAS,eAAe,OAAuB;AACpD,SAAO,gBAAgB,OAAO,cAAc;AAC9C;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../../../src/api/http.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,eAAe,6BAA6B,CAAC;AAE1D,MAAM,WAAW,iBAAiB;IAChC,+EAA+E;IAC/E,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;;OAIG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,wFAAwF;IACxF,KAAK,CAAC,EAAE,OAAO,KAAK,CAAC;CACtB;AAED,MAAM,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,SAAS,CAAC,CAAC;AAEhF,wBAAsB,MAAM,CAAC,CAAC,EAC5B,MAAM,EAAE,iBAAiB,EACzB,IAAI,EAAE,MAAM,EACZ,KAAK,CAAC,EAAE,WAAW,GAClB,OAAO,CAAC,CAAC,CAAC,
|
|
1
|
+
{"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../../../src/api/http.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,eAAe,6BAA6B,CAAC;AAE1D,MAAM,WAAW,iBAAiB;IAChC,+EAA+E;IAC/E,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;;OAIG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,wFAAwF;IACxF,KAAK,CAAC,EAAE,OAAO,KAAK,CAAC;CACtB;AAED,MAAM,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,SAAS,CAAC,CAAC;AAEhF,wBAAsB,MAAM,CAAC,CAAC,EAC5B,MAAM,EAAE,iBAAiB,EACzB,IAAI,EAAE,MAAM,EACZ,KAAK,CAAC,EAAE,WAAW,GAClB,OAAO,CAAC,CAAC,CAAC,CAuCZ"}
|
package/dist/cjs/api/http.js
CHANGED