@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
|
@@ -1,14 +1,9 @@
|
|
|
1
|
-
import {
|
|
2
|
-
resolveVault
|
|
3
|
-
} from "./chunk-STIV2CC4.js";
|
|
4
1
|
import {
|
|
5
2
|
DecimalPrecisionError,
|
|
6
3
|
GauntletSDKError,
|
|
7
|
-
InvalidCaipIdError,
|
|
8
4
|
InvalidDecimalError,
|
|
9
|
-
SettlementTimeoutError
|
|
10
|
-
|
|
11
|
-
} from "./chunk-HC2BS7MK.js";
|
|
5
|
+
SettlementTimeoutError
|
|
6
|
+
} from "./chunk-JJOLVL5V.js";
|
|
12
7
|
|
|
13
8
|
// src/api/decimal.ts
|
|
14
9
|
import { formatUnits } from "viem";
|
|
@@ -17,6 +12,7 @@ function decimalToBigInt(value, decimals) {
|
|
|
17
12
|
if (!Number.isInteger(decimals) || decimals < 0) {
|
|
18
13
|
throw new InvalidDecimalError(`decimals=${decimals}`);
|
|
19
14
|
}
|
|
15
|
+
if (typeof value !== "string") throw new InvalidDecimalError(String(value));
|
|
20
16
|
const match = DECIMAL_RE.exec(value);
|
|
21
17
|
if (!match) throw new InvalidDecimalError(value);
|
|
22
18
|
const [, sign, whole, frac = ""] = match;
|
|
@@ -37,36 +33,115 @@ function sharesToBigInt(value) {
|
|
|
37
33
|
return decimalToBigInt(value, SHARE_DECIMALS);
|
|
38
34
|
}
|
|
39
35
|
|
|
40
|
-
// src/api/
|
|
41
|
-
function
|
|
42
|
-
|
|
43
|
-
if (!match) throw new InvalidCaipIdError(id);
|
|
44
|
-
return { chainId: Number(match[1]), address: match[2].toLowerCase() };
|
|
36
|
+
// src/api/activityRows.ts
|
|
37
|
+
function isPending(row) {
|
|
38
|
+
return row.type === "deposit_pending" || row.type === "withdraw_pending";
|
|
45
39
|
}
|
|
46
|
-
function
|
|
47
|
-
|
|
40
|
+
function requireSameToken(leftRow, rightRow) {
|
|
41
|
+
if (leftRow.vault_id.split(":")[0] !== rightRow.vault_id.split(":")[0]) {
|
|
42
|
+
throw new GauntletSDKError("Activity rows contain assets on different chains");
|
|
43
|
+
}
|
|
44
|
+
const left = leftRow.assets_delta.token;
|
|
45
|
+
const right = rightRow.assets_delta.token;
|
|
46
|
+
if (left != null && right != null && (left.address.toLowerCase() !== right.address.toLowerCase() || (left.decimals ?? null) !== (right.decimals ?? null))) {
|
|
47
|
+
throw new GauntletSDKError("Activity rows contain different asset denominations");
|
|
48
|
+
}
|
|
48
49
|
}
|
|
49
|
-
|
|
50
|
-
const
|
|
51
|
-
|
|
52
|
-
|
|
50
|
+
function validateActivityRow(row) {
|
|
51
|
+
const shares = sharesToBigInt(row.shares_delta);
|
|
52
|
+
const assets = decimalToBigInt(row.assets_delta.native, 18);
|
|
53
|
+
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)) {
|
|
54
|
+
throw new GauntletSDKError("The activity row has invalid event identifiers");
|
|
55
|
+
}
|
|
56
|
+
const token = row.assets_delta.token;
|
|
57
|
+
if (token != null && token.decimals != null) {
|
|
58
|
+
if (!Number.isInteger(token.decimals) || token.decimals < 0 || token.decimals > 255) {
|
|
59
|
+
throw new GauntletSDKError("The activity token has invalid decimals");
|
|
60
|
+
}
|
|
61
|
+
decimalToBigInt(row.assets_delta.native, token.decimals);
|
|
62
|
+
}
|
|
63
|
+
let valid;
|
|
64
|
+
switch (row.type) {
|
|
65
|
+
case "deposit":
|
|
66
|
+
valid = shares >= 0n && assets >= 0n && (row.request_hash == null || assets === 0n);
|
|
67
|
+
break;
|
|
68
|
+
case "deposit_pending":
|
|
69
|
+
valid = shares === 0n && assets > 0n && row.request_hash != null;
|
|
70
|
+
break;
|
|
71
|
+
case "deposit_refunded":
|
|
72
|
+
valid = shares === 0n && assets < 0n && row.request_hash != null;
|
|
73
|
+
break;
|
|
74
|
+
case "withdraw":
|
|
75
|
+
valid = shares <= 0n && assets <= 0n && (row.request_hash == null || shares === 0n);
|
|
76
|
+
break;
|
|
77
|
+
case "withdraw_pending":
|
|
78
|
+
valid = shares < 0n && assets === 0n && row.request_hash != null;
|
|
79
|
+
break;
|
|
80
|
+
case "withdraw_refunded":
|
|
81
|
+
valid = shares > 0n && assets === 0n && row.request_hash != null;
|
|
82
|
+
break;
|
|
83
|
+
case "transfer_in":
|
|
84
|
+
valid = shares >= 0n && assets >= 0n && row.request_hash == null;
|
|
85
|
+
break;
|
|
86
|
+
case "transfer_out":
|
|
87
|
+
valid = shares <= 0n && assets <= 0n && row.request_hash == null;
|
|
88
|
+
break;
|
|
89
|
+
default:
|
|
90
|
+
valid = false;
|
|
91
|
+
}
|
|
92
|
+
if (!valid) throw new GauntletSDKError(`Invalid activity deltas for ${row.type}`);
|
|
53
93
|
}
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
94
|
+
function orderActivityRows(rows) {
|
|
95
|
+
rows.forEach(validateActivityRow);
|
|
96
|
+
return [...rows].sort(
|
|
97
|
+
(a, b) => a.block_number - b.block_number || a.block_timestamp - b.block_timestamp || Number(isPending(b)) - Number(isPending(a))
|
|
98
|
+
);
|
|
99
|
+
}
|
|
100
|
+
function activityLifecycles(ordered) {
|
|
101
|
+
const groups = [];
|
|
102
|
+
const latest = /* @__PURE__ */ new Map();
|
|
103
|
+
for (const row of ordered) {
|
|
104
|
+
if (row.request_hash == null) {
|
|
105
|
+
groups.push([row]);
|
|
106
|
+
continue;
|
|
107
|
+
}
|
|
108
|
+
const key = `${row.vault_id}:${row.request_hash}`;
|
|
109
|
+
const previous = latest.get(key);
|
|
110
|
+
if (previous === void 0 || isPending(row)) {
|
|
111
|
+
if (previous !== void 0 && previous.every(isPending)) {
|
|
112
|
+
throw new GauntletSDKError("An activity request has duplicate pending rows");
|
|
113
|
+
}
|
|
114
|
+
const group = [row];
|
|
115
|
+
latest.set(key, group);
|
|
116
|
+
groups.push(group);
|
|
117
|
+
continue;
|
|
118
|
+
}
|
|
119
|
+
if (previous.some((entry) => !isPending(entry))) {
|
|
120
|
+
throw new GauntletSDKError("An activity request has conflicting terminal rows");
|
|
121
|
+
}
|
|
122
|
+
const pending = previous[0];
|
|
123
|
+
requireSameToken(pending, row);
|
|
124
|
+
const expected = pending.type === "deposit_pending" ? ["deposit", "deposit_refunded"] : ["withdraw", "withdraw_refunded"];
|
|
125
|
+
if (!expected.includes(row.type)) {
|
|
126
|
+
throw new GauntletSDKError("The activity terminal does not match its request");
|
|
127
|
+
}
|
|
128
|
+
if (row.type === "deposit_refunded" && decimalToBigInt(pending.assets_delta.native, 18) !== -decimalToBigInt(row.assets_delta.native, 18)) {
|
|
129
|
+
throw new GauntletSDKError("The deposit refund does not match its request");
|
|
130
|
+
}
|
|
131
|
+
if (row.type === "withdraw_refunded" && sharesToBigInt(pending.shares_delta) !== -sharesToBigInt(row.shares_delta)) {
|
|
132
|
+
throw new GauntletSDKError("The withdrawal refund does not match its request");
|
|
133
|
+
}
|
|
134
|
+
previous.push(row);
|
|
135
|
+
}
|
|
136
|
+
return groups;
|
|
62
137
|
}
|
|
63
138
|
|
|
64
139
|
// src/api/activity.ts
|
|
65
140
|
var PENDING_TYPES = /* @__PURE__ */ new Set(["deposit_pending", "withdraw_pending"]);
|
|
66
141
|
var REFUNDED_TYPES = /* @__PURE__ */ new Set(["deposit_refunded", "withdraw_refunded"]);
|
|
67
142
|
function flowKind(rowType) {
|
|
68
|
-
if (
|
|
69
|
-
if (
|
|
143
|
+
if (["deposit", "deposit_pending", "deposit_refunded"].includes(rowType)) return "deposit";
|
|
144
|
+
if (["withdraw", "withdraw_pending", "withdraw_refunded"].includes(rowType)) return "withdraw";
|
|
70
145
|
if (rowType === "transfer_in" || rowType === "transfer_out") return rowType;
|
|
71
146
|
throw new GauntletSDKError(`Unknown activity row type "${rowType}"`);
|
|
72
147
|
}
|
|
@@ -90,15 +165,9 @@ function toAssetAmount(rows) {
|
|
|
90
165
|
return { decimal, raw, token };
|
|
91
166
|
}
|
|
92
167
|
function stitchActivityFlows(rows) {
|
|
93
|
-
const groups =
|
|
94
|
-
for (const [index, row] of rows.entries()) {
|
|
95
|
-
const key = row.request_hash ?? `row:${index}`;
|
|
96
|
-
const group = groups.get(key);
|
|
97
|
-
if (group) group.push(row);
|
|
98
|
-
else groups.set(key, [row]);
|
|
99
|
-
}
|
|
168
|
+
const groups = activityLifecycles(orderActivityRows(rows));
|
|
100
169
|
const flows = [];
|
|
101
|
-
for (const group of groups
|
|
170
|
+
for (const group of groups) {
|
|
102
171
|
group.sort((a, b) => a.block_timestamp - b.block_timestamp);
|
|
103
172
|
const pendingRow = group.find((r) => PENDING_TYPES.has(r.type)) ?? null;
|
|
104
173
|
const terminalRow = group.find((r) => !PENDING_TYPES.has(r.type)) ?? null;
|
|
@@ -149,13 +218,20 @@ async function getActivityFlows(api, walletAddress, options = {}) {
|
|
|
149
218
|
}
|
|
150
219
|
return flows;
|
|
151
220
|
}
|
|
152
|
-
async function waitForRequestSettlement(api, walletAddress, requestHash, options
|
|
221
|
+
async function waitForRequestSettlement(api, walletAddress, requestHash, options) {
|
|
222
|
+
if (typeof options?.requestTxHash !== "string" || options.requestTxHash.length === 0) {
|
|
223
|
+
throw new GauntletSDKError(
|
|
224
|
+
"Settlement polling requires the submitted request transaction hash"
|
|
225
|
+
);
|
|
226
|
+
}
|
|
153
227
|
const pollIntervalMs = options.pollIntervalMs ?? 5e3;
|
|
154
228
|
const timeoutMs = options.timeoutMs ?? 6e5;
|
|
155
229
|
const deadline = Date.now() + timeoutMs;
|
|
156
230
|
for (; ; ) {
|
|
157
231
|
const flows = await getActivityFlows(api, walletAddress, { vaultId: options.vaultId });
|
|
158
|
-
const flow = flows.find(
|
|
232
|
+
const flow = flows.find(
|
|
233
|
+
(f) => f.requestHash === requestHash && f.txHashes.some((hash) => hash.toLowerCase() === options.requestTxHash.toLowerCase())
|
|
234
|
+
);
|
|
159
235
|
if (flow && flow.status !== "pending") return flow;
|
|
160
236
|
if (Date.now() + pollIntervalMs > deadline) {
|
|
161
237
|
throw new SettlementTimeoutError(requestHash, timeoutMs);
|
|
@@ -176,8 +252,11 @@ function buildPositionHistory(rows) {
|
|
|
176
252
|
`Position history requires rows from a single vault; got ${[...vaultIds].join(", ")}`
|
|
177
253
|
);
|
|
178
254
|
}
|
|
179
|
-
const ordered =
|
|
180
|
-
|
|
255
|
+
const ordered = orderActivityRows(rows);
|
|
256
|
+
activityLifecycles(ordered);
|
|
257
|
+
const tokenRow = ordered.find((r) => r.assets_delta.token) ?? ordered[0];
|
|
258
|
+
const token = tokenRow.assets_delta.token ?? null;
|
|
259
|
+
for (const row of ordered) requireSameToken(tokenRow, row);
|
|
181
260
|
let sharesBalance = 0n;
|
|
182
261
|
let pendingDepositAssets = 0n;
|
|
183
262
|
let pendingRedeemShares = 0n;
|
|
@@ -210,8 +289,11 @@ function buildPositionHistory(rows) {
|
|
|
210
289
|
if (row.request_hash != null) pendingDepositByHash.set(row.request_hash, assetsDelta);
|
|
211
290
|
break;
|
|
212
291
|
case "deposit_refunded":
|
|
292
|
+
if (row.request_hash == null || pendingDepositByHash.get(row.request_hash) !== -assetsDelta) {
|
|
293
|
+
throw new GauntletSDKError("The deposit refund does not match its escrow");
|
|
294
|
+
}
|
|
213
295
|
pendingDepositAssets += assetsDelta;
|
|
214
|
-
|
|
296
|
+
pendingDepositByHash.delete(row.request_hash);
|
|
215
297
|
break;
|
|
216
298
|
case "withdraw":
|
|
217
299
|
netAssetsIn += assetsDelta;
|
|
@@ -233,8 +315,11 @@ function buildPositionHistory(rows) {
|
|
|
233
315
|
break;
|
|
234
316
|
}
|
|
235
317
|
case "withdraw_refunded":
|
|
318
|
+
if (row.request_hash == null || pendingRedeemByHash.get(row.request_hash) !== sharesDelta) {
|
|
319
|
+
throw new GauntletSDKError("The withdrawal refund does not match its escrow");
|
|
320
|
+
}
|
|
236
321
|
pendingRedeemShares -= sharesDelta;
|
|
237
|
-
|
|
322
|
+
pendingRedeemByHash.delete(row.request_hash);
|
|
238
323
|
break;
|
|
239
324
|
case "transfer_in":
|
|
240
325
|
case "transfer_out":
|
|
@@ -242,6 +327,9 @@ function buildPositionHistory(rows) {
|
|
|
242
327
|
default:
|
|
243
328
|
throw new GauntletSDKError(`Unknown activity row type "${row.type}"`);
|
|
244
329
|
}
|
|
330
|
+
if (sharesBalance < 0n || pendingDepositAssets < 0n || pendingRedeemShares < 0n) {
|
|
331
|
+
throw new GauntletSDKError("The activity history produces a negative position balance");
|
|
332
|
+
}
|
|
245
333
|
points.push({
|
|
246
334
|
timestamp: new Date(row.block_timestamp * 1e3),
|
|
247
335
|
txHash: row.tx_hash,
|
|
@@ -270,14 +358,10 @@ export {
|
|
|
270
358
|
bigIntToDecimal,
|
|
271
359
|
SHARE_DECIMALS,
|
|
272
360
|
sharesToBigInt,
|
|
273
|
-
parseApiVaultId,
|
|
274
|
-
formatApiVaultId,
|
|
275
|
-
apiVaultIdFromVaultId,
|
|
276
|
-
vaultIdFromApiVaultId,
|
|
277
361
|
stitchActivityFlows,
|
|
278
362
|
getActivityFlows,
|
|
279
363
|
waitForRequestSettlement,
|
|
280
364
|
buildPositionHistory,
|
|
281
365
|
getPositionHistory
|
|
282
366
|
};
|
|
283
|
-
//# sourceMappingURL=chunk-
|
|
367
|
+
//# sourceMappingURL=chunk-MEKISE2T.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/api/decimal.ts", "../src/api/activityRows.ts", "../src/api/activity.ts", "../src/api/positionHistory.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 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", "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", "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", "import { activityLifecycles, orderActivityRows, requireSameToken } from './activityRows';\nimport { GauntletSDKError } from '../errors';\nimport type { GauntletApi, TokenRef, UserActivity } from './client';\nimport { bigIntToDecimal, decimalToBigInt, sharesToBigInt } from './decimal';\n\n/**\n * Internal accounting scale for asset amounts. The API emits human-unit\n * decimal strings with at most `token.decimals` fractional digits, so 18\n * digits is exact for every supported asset; a token with more than 18\n * decimals would throw `DecimalPrecisionError` rather than lose precision.\n */\nconst ASSET_SCALE = 18;\n\n/** The wallet's reconstructed position state immediately after one activity row. */\nexport interface PositionHistoryPoint {\n timestamp: Date;\n txHash: string;\n type: UserActivity['type'];\n /** Signed share movement of this row, 18-decimal base units. */\n sharesDelta: bigint;\n /** Signed asset movement of this row (deposit-ledger convention), human decimal string. */\n assetsDelta: string;\n /** Shares held by the wallet after this row (escrowed redeem shares excluded). */\n sharesBalance: bigint;\n /** Assets escrowed at the Provisioner awaiting share mint, human decimal string. */\n pendingDepositAssets: string;\n /** Shares escrowed at the Provisioner awaiting asset return, 18-decimal base units. */\n pendingRedeemShares: bigint;\n /** Cumulative settled deposits minus settled withdrawals, human decimal string. */\n netAssetsIn: string;\n}\n\nexport interface PositionHistory {\n /** CAIP-10 vault id the history belongs to. */\n vaultId: string;\n /** The vault's asset token, when the indexer reports it on any row. */\n token: TokenRef | null;\n /** Chronological (oldest-first) position states, one per activity row. */\n points: PositionHistoryPoint[];\n}\n\n/**\n * Pure builder: replays a single vault's activity rows (any order) into a\n * chronological position timeline \u2014 running share balance, escrowed pending\n * amounts, and cumulative net asset flows.\n *\n * Async lifecycles are paired via `request_hash` so settled deposits count\n * the requested asset amount and terminal rows release the matching escrow.\n */\nexport function buildPositionHistory(rows: UserActivity[]): PositionHistory {\n if (rows.length === 0) {\n throw new GauntletSDKError('Cannot build position history from zero activity rows');\n }\n const vaultIds = new Set(rows.map((r) => r.vault_id));\n if (vaultIds.size > 1) {\n throw new GauntletSDKError(\n `Position history requires rows from a single vault; got ${[...vaultIds].join(', ')}`\n );\n }\n\n const ordered = orderActivityRows(rows);\n activityLifecycles(ordered);\n const tokenRow = ordered.find((r) => r.assets_delta.token) ?? ordered[0];\n const token = tokenRow.assets_delta.token ?? null;\n for (const row of ordered) requireSameToken(tokenRow, row);\n\n let sharesBalance = 0n;\n let pendingDepositAssets = 0n;\n let pendingRedeemShares = 0n;\n let netAssetsIn = 0n;\n const pendingDepositByHash = new Map<string, bigint>();\n const pendingRedeemByHash = new Map<string, bigint>();\n\n const points: PositionHistoryPoint[] = [];\n for (const row of ordered) {\n const sharesDelta = sharesToBigInt(row.shares_delta);\n const assetsDelta = decimalToBigInt(row.assets_delta.native, ASSET_SCALE);\n sharesBalance += sharesDelta;\n\n switch (row.type) {\n case 'deposit':\n if (row.request_hash != null) {\n // Async terminal solve: assets moved at request time; release escrow.\n const requested = pendingDepositByHash.get(row.request_hash);\n if (requested === undefined) {\n throw new GauntletSDKError(\n `Deposit settlement ${row.tx_hash} references request_hash \"${row.request_hash}\" with no matching deposit_pending row`\n );\n }\n pendingDepositByHash.delete(row.request_hash);\n pendingDepositAssets -= requested;\n netAssetsIn += requested;\n } else {\n netAssetsIn += assetsDelta;\n }\n break;\n case 'deposit_pending':\n pendingDepositAssets += assetsDelta;\n if (row.request_hash != null) pendingDepositByHash.set(row.request_hash, assetsDelta);\n break;\n case 'deposit_refunded':\n if (\n row.request_hash == null ||\n pendingDepositByHash.get(row.request_hash) !== -assetsDelta\n ) {\n throw new GauntletSDKError('The deposit refund does not match its escrow');\n }\n pendingDepositAssets += assetsDelta;\n pendingDepositByHash.delete(row.request_hash);\n break;\n case 'withdraw':\n // Sync withdraws and async terminal solves both carry the asset\n // payout as a negative delta on this row.\n netAssetsIn += assetsDelta;\n if (row.request_hash != null) {\n const escrowed = pendingRedeemByHash.get(row.request_hash);\n if (escrowed === undefined) {\n throw new GauntletSDKError(\n `Withdraw settlement ${row.tx_hash} references request_hash \"${row.request_hash}\" with no matching withdraw_pending row`\n );\n }\n pendingRedeemByHash.delete(row.request_hash);\n pendingRedeemShares -= escrowed;\n }\n break;\n case 'withdraw_pending': {\n const escrowed = -sharesDelta;\n pendingRedeemShares += escrowed;\n if (row.request_hash != null) pendingRedeemByHash.set(row.request_hash, escrowed);\n break;\n }\n case 'withdraw_refunded':\n if (row.request_hash == null || pendingRedeemByHash.get(row.request_hash) !== sharesDelta) {\n throw new GauntletSDKError('The withdrawal refund does not match its escrow');\n }\n pendingRedeemShares -= sharesDelta;\n pendingRedeemByHash.delete(row.request_hash);\n break;\n case 'transfer_in':\n case 'transfer_out':\n break;\n default:\n throw new GauntletSDKError(`Unknown activity row type \"${row.type}\"`);\n }\n\n if (sharesBalance < 0n || pendingDepositAssets < 0n || pendingRedeemShares < 0n) {\n throw new GauntletSDKError('The activity history produces a negative position balance');\n }\n points.push({\n timestamp: new Date(row.block_timestamp * 1000),\n txHash: row.tx_hash,\n type: row.type,\n sharesDelta,\n assetsDelta: row.assets_delta.native,\n sharesBalance,\n pendingDepositAssets: bigIntToDecimal(pendingDepositAssets, ASSET_SCALE),\n pendingRedeemShares,\n netAssetsIn: bigIntToDecimal(netAssetsIn, ASSET_SCALE),\n });\n }\n\n return { vaultId: ordered[0].vault_id, token, points };\n}\n\n/**\n * Fetches a wallet's complete activity for one vault and replays it into a\n * position timeline. `vaultId` is the CAIP-10 id; use `apiVaultIdFromVaultId`\n * to convert a manifest vault id. A wallet that has never touched the vault\n * gets an empty timeline, not an error.\n */\nexport async function getPositionHistory(\n api: GauntletApi,\n walletAddress: string,\n vaultId: string\n): Promise<PositionHistory> {\n const rows: UserActivity[] = [];\n for await (const row of api.activityRows(walletAddress, { vaultId, order: 'asc', limit: 1000 })) {\n rows.push(row);\n }\n if (rows.length === 0) return { vaultId, token: null, points: [] };\n return buildPositionHistory(rows);\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["ASSET_SCALE"]
|
|
7
|
+
}
|