@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
package/dist/cjs/api/http.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/api/http.ts"],
|
|
4
|
-
"sourcesContent": ["import { GauntletApiError } from './errors';\n\nexport const DEFAULT_API_URL = 'https://api.gauntlet.xyz';\n\nexport interface GauntletApiConfig {\n /** Kong consumer key sent as `x-api-key`. Anonymous access is rate-limited. */\n apiKey?: string;\n /**\n * Override the API origin. Defaults to `https://api.gauntlet.xyz`. In a\n * browser this may be a relative path (e.g. a Next.js rewrite like\n * `/gauntlet-api`), which resolves against the page origin.\n */\n apiUrl?: string;\n /** Custom fetch implementation (testing, instrumentation). Defaults to global fetch. */\n fetch?: typeof fetch;\n}\n\nexport type QueryParams = Record<string, string | number | boolean | undefined>;\n\nexport async function apiGet<T>(\n config: GauntletApiConfig,\n path: string,\n query?: QueryParams\n): Promise<T> {\n // Concatenate instead of `new URL(path, base)`: the paths are absolute, so\n // URL resolution would silently drop any path prefix on a proxy apiUrl.\n const base = (config.apiUrl ?? DEFAULT_API_URL).replace(/\\/+$/, '');\n // Relative bases resolve against the browser origin.\n const origin = (globalThis as { location?: { origin: string } }).location?.origin;\n if (origin === undefined && !/^[a-z][a-z0-9+.-]*:\\/\\//i.test(base)) {\n throw new Error(\n `relative apiUrl \"${base}\" requires a browser origin; pass an absolute apiUrl outside the browser`\n );\n }\n const url = new URL(base + path, origin);\n for (const [key, value] of Object.entries(query ?? {})) {\n if (value !== undefined) url.searchParams.set(key, String(value));\n }\n\n const fetchImpl = config.fetch ?? fetch;\n const response = await fetchImpl(url, {\n headers: {\n accept: 'application/json',\n ...(config.apiKey ? { 'x-api-key': config.apiKey } : {}),\n },\n });\n\n if (!response.ok) {\n let message = response.statusText || 'request failed';\n let code: string | undefined;\n try {\n const body = (await response.json()) as { error?: { code?: string; message?: string } };\n message = body.error?.message ?? message;\n code = body.error?.code;\n } catch {\n // non-JSON error body \u2014 keep the status text\n }\n throw new GauntletApiError({ status: response.status, path, message, code });\n }\n\n return (await response.json()) as T;\n}\n"],
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,oBAAiC;AAE1B,MAAM,kBAAkB;AAiB/B,eAAsB,OACpB,QACA,MACA,OACY;AAGZ,QAAM,QAAQ,OAAO,UAAU,iBAAiB,QAAQ,QAAQ,EAAE;AAElE,QAAM,SAAU,WAAiD,UAAU;AAC3E,MAAI,WAAW,UAAa,CAAC,2BAA2B,KAAK,IAAI,GAAG;AAClE,UAAM,IAAI;AAAA,MACR,oBAAoB,IAAI;AAAA,IAC1B;AAAA,EACF;AACA,QAAM,MAAM,IAAI,IAAI,OAAO,MAAM,MAAM;AACvC,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,SAAS,CAAC,CAAC,GAAG;AACtD,QAAI,UAAU,OAAW,KAAI,aAAa,IAAI,KAAK,OAAO,KAAK,CAAC;AAAA,EAClE;AAEA,QAAM,YAAY,OAAO,SAAS;AAClC,QAAM,WAAW,MAAM,UAAU,KAAK;AAAA,IACpC,SAAS;AAAA,MACP,QAAQ;AAAA,MACR,GAAI,OAAO,SAAS,EAAE,aAAa,OAAO,OAAO,IAAI,CAAC;AAAA,IACxD;AAAA,EACF,CAAC;AAED,MAAI,CAAC,SAAS,IAAI;AAChB,QAAI,UAAU,SAAS,cAAc;AACrC,QAAI;AACJ,QAAI;AACF,YAAM,OAAQ,MAAM,SAAS,KAAK;AAClC,gBAAU,KAAK,OAAO,WAAW;AACjC,aAAO,KAAK,OAAO;AAAA,IACrB,QAAQ;AAAA,IAER;AACA,UAAM,IAAI,+BAAiB,EAAE,QAAQ,SAAS,QAAQ,MAAM,SAAS,KAAK,CAAC;AAAA,EAC7E;AAEA,SAAQ,MAAM,SAAS,KAAK;AAC9B;",
|
|
4
|
+
"sourcesContent": ["import { GauntletApiError } from './errors';\n\nexport const DEFAULT_API_URL = 'https://api.gauntlet.xyz';\n\nexport interface GauntletApiConfig {\n /** Kong consumer key sent as `x-api-key`. Anonymous access is rate-limited. */\n apiKey?: string;\n /**\n * Override the API origin. Defaults to `https://api.gauntlet.xyz`. In a\n * browser this may be a relative path (e.g. a Next.js rewrite like\n * `/gauntlet-api`), which resolves against the page origin.\n */\n apiUrl?: string;\n /** Custom fetch implementation (testing, instrumentation). Defaults to global fetch. */\n fetch?: typeof fetch;\n}\n\nexport type QueryParams = Record<string, string | number | boolean | undefined>;\n\nexport async function apiGet<T>(\n config: GauntletApiConfig,\n path: string,\n query?: QueryParams\n): Promise<T> {\n // Concatenate instead of `new URL(path, base)`: the paths are absolute, so\n // URL resolution would silently drop any path prefix on a proxy apiUrl.\n const base = (config.apiUrl ?? DEFAULT_API_URL).replace(/\\/+$/, '');\n // Relative bases resolve against the browser origin.\n const origin = (globalThis as { location?: { origin: string } }).location?.origin;\n if (origin === undefined && !/^[a-z][a-z0-9+.-]*:\\/\\//i.test(base)) {\n throw new Error(\n `relative apiUrl \"${base}\" requires a browser origin; pass an absolute apiUrl outside the browser`\n );\n }\n const url = new URL(base + path, origin);\n for (const [key, value] of Object.entries(query ?? {})) {\n if (value !== undefined) url.searchParams.set(key, String(value));\n }\n\n const fetchImpl = config.fetch ?? fetch;\n const response = await fetchImpl(url, {\n redirect: 'error',\n headers: {\n accept: 'application/json',\n ...(config.apiKey ? { 'x-api-key': config.apiKey } : {}),\n },\n });\n\n if (!response.ok) {\n let message = response.statusText || 'request failed';\n let code: string | undefined;\n try {\n const body = (await response.json()) as { error?: { code?: string; message?: string } };\n message = body.error?.message ?? message;\n code = body.error?.code;\n } catch {\n // non-JSON error body \u2014 keep the status text\n }\n throw new GauntletApiError({ status: response.status, path, message, code });\n }\n\n return (await response.json()) as T;\n}\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,oBAAiC;AAE1B,MAAM,kBAAkB;AAiB/B,eAAsB,OACpB,QACA,MACA,OACY;AAGZ,QAAM,QAAQ,OAAO,UAAU,iBAAiB,QAAQ,QAAQ,EAAE;AAElE,QAAM,SAAU,WAAiD,UAAU;AAC3E,MAAI,WAAW,UAAa,CAAC,2BAA2B,KAAK,IAAI,GAAG;AAClE,UAAM,IAAI;AAAA,MACR,oBAAoB,IAAI;AAAA,IAC1B;AAAA,EACF;AACA,QAAM,MAAM,IAAI,IAAI,OAAO,MAAM,MAAM;AACvC,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,SAAS,CAAC,CAAC,GAAG;AACtD,QAAI,UAAU,OAAW,KAAI,aAAa,IAAI,KAAK,OAAO,KAAK,CAAC;AAAA,EAClE;AAEA,QAAM,YAAY,OAAO,SAAS;AAClC,QAAM,WAAW,MAAM,UAAU,KAAK;AAAA,IACpC,UAAU;AAAA,IACV,SAAS;AAAA,MACP,QAAQ;AAAA,MACR,GAAI,OAAO,SAAS,EAAE,aAAa,OAAO,OAAO,IAAI,CAAC;AAAA,IACxD;AAAA,EACF,CAAC;AAED,MAAI,CAAC,SAAS,IAAI;AAChB,QAAI,UAAU,SAAS,cAAc;AACrC,QAAI;AACJ,QAAI;AACF,YAAM,OAAQ,MAAM,SAAS,KAAK;AAClC,gBAAU,KAAK,OAAO,WAAW;AACjC,aAAO,KAAK,OAAO;AAAA,IACrB,QAAQ;AAAA,IAER;AACA,UAAM,IAAI,+BAAiB,EAAE,QAAQ,SAAS,QAAQ,MAAM,SAAS,KAAK,CAAC;AAAA,EAC7E;AAEA,SAAQ,MAAM,SAAS,KAAK;AAC9B;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"positionHistory.d.ts","sourceRoot":"","sources":["../../../src/api/positionHistory.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"positionHistory.d.ts","sourceRoot":"","sources":["../../../src/api/positionHistory.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,YAAY,EAAE,oBAAiB;AAWpE,oFAAoF;AACpF,MAAM,WAAW,oBAAoB;IACnC,SAAS,EAAE,IAAI,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,YAAY,CAAC,MAAM,CAAC,CAAC;IAC3B,gEAAgE;IAChE,WAAW,EAAE,MAAM,CAAC;IACpB,2FAA2F;IAC3F,WAAW,EAAE,MAAM,CAAC;IACpB,kFAAkF;IAClF,aAAa,EAAE,MAAM,CAAC;IACtB,oFAAoF;IACpF,oBAAoB,EAAE,MAAM,CAAC;IAC7B,uFAAuF;IACvF,mBAAmB,EAAE,MAAM,CAAC;IAC5B,mFAAmF;IACnF,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,eAAe;IAC9B,+CAA+C;IAC/C,OAAO,EAAE,MAAM,CAAC;IAChB,uEAAuE;IACvE,KAAK,EAAE,QAAQ,GAAG,IAAI,CAAC;IACvB,0EAA0E;IAC1E,MAAM,EAAE,oBAAoB,EAAE,CAAC;CAChC;AAED;;;;;;;GAOG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,YAAY,EAAE,GAAG,eAAe,CAiH1E;AAED;;;;;GAKG;AACH,wBAAsB,kBAAkB,CACtC,GAAG,EAAE,WAAW,EAChB,aAAa,EAAE,MAAM,EACrB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,eAAe,CAAC,CAO1B"}
|
|
@@ -22,6 +22,7 @@ __export(positionHistory_exports, {
|
|
|
22
22
|
getPositionHistory: () => getPositionHistory
|
|
23
23
|
});
|
|
24
24
|
module.exports = __toCommonJS(positionHistory_exports);
|
|
25
|
+
var import_activityRows = require("./activityRows");
|
|
25
26
|
var import_errors = require("../errors");
|
|
26
27
|
var import_decimal = require("./decimal");
|
|
27
28
|
const ASSET_SCALE = 18;
|
|
@@ -35,8 +36,11 @@ function buildPositionHistory(rows) {
|
|
|
35
36
|
`Position history requires rows from a single vault; got ${[...vaultIds].join(", ")}`
|
|
36
37
|
);
|
|
37
38
|
}
|
|
38
|
-
const ordered =
|
|
39
|
-
|
|
39
|
+
const ordered = (0, import_activityRows.orderActivityRows)(rows);
|
|
40
|
+
(0, import_activityRows.activityLifecycles)(ordered);
|
|
41
|
+
const tokenRow = ordered.find((r) => r.assets_delta.token) ?? ordered[0];
|
|
42
|
+
const token = tokenRow.assets_delta.token ?? null;
|
|
43
|
+
for (const row of ordered) (0, import_activityRows.requireSameToken)(tokenRow, row);
|
|
40
44
|
let sharesBalance = 0n;
|
|
41
45
|
let pendingDepositAssets = 0n;
|
|
42
46
|
let pendingRedeemShares = 0n;
|
|
@@ -69,8 +73,11 @@ function buildPositionHistory(rows) {
|
|
|
69
73
|
if (row.request_hash != null) pendingDepositByHash.set(row.request_hash, assetsDelta);
|
|
70
74
|
break;
|
|
71
75
|
case "deposit_refunded":
|
|
76
|
+
if (row.request_hash == null || pendingDepositByHash.get(row.request_hash) !== -assetsDelta) {
|
|
77
|
+
throw new import_errors.GauntletSDKError("The deposit refund does not match its escrow");
|
|
78
|
+
}
|
|
72
79
|
pendingDepositAssets += assetsDelta;
|
|
73
|
-
|
|
80
|
+
pendingDepositByHash.delete(row.request_hash);
|
|
74
81
|
break;
|
|
75
82
|
case "withdraw":
|
|
76
83
|
netAssetsIn += assetsDelta;
|
|
@@ -92,8 +99,11 @@ function buildPositionHistory(rows) {
|
|
|
92
99
|
break;
|
|
93
100
|
}
|
|
94
101
|
case "withdraw_refunded":
|
|
102
|
+
if (row.request_hash == null || pendingRedeemByHash.get(row.request_hash) !== sharesDelta) {
|
|
103
|
+
throw new import_errors.GauntletSDKError("The withdrawal refund does not match its escrow");
|
|
104
|
+
}
|
|
95
105
|
pendingRedeemShares -= sharesDelta;
|
|
96
|
-
|
|
106
|
+
pendingRedeemByHash.delete(row.request_hash);
|
|
97
107
|
break;
|
|
98
108
|
case "transfer_in":
|
|
99
109
|
case "transfer_out":
|
|
@@ -101,6 +111,9 @@ function buildPositionHistory(rows) {
|
|
|
101
111
|
default:
|
|
102
112
|
throw new import_errors.GauntletSDKError(`Unknown activity row type "${row.type}"`);
|
|
103
113
|
}
|
|
114
|
+
if (sharesBalance < 0n || pendingDepositAssets < 0n || pendingRedeemShares < 0n) {
|
|
115
|
+
throw new import_errors.GauntletSDKError("The activity history produces a negative position balance");
|
|
116
|
+
}
|
|
104
117
|
points.push({
|
|
105
118
|
timestamp: new Date(row.block_timestamp * 1e3),
|
|
106
119
|
txHash: row.tx_hash,
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/api/positionHistory.ts"],
|
|
4
|
-
"sourcesContent": ["import { 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 =
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,oBAAiC;AAEjC,qBAAiE;AAQjE,MAAM,cAAc;AAsCb,SAAS,qBAAqB,MAAuC;AAC1E,MAAI,KAAK,WAAW,GAAG;AACrB,UAAM,IAAI,+BAAiB,uDAAuD;AAAA,EACpF;AACA,QAAM,WAAW,IAAI,IAAI,KAAK,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC;AACpD,MAAI,SAAS,OAAO,GAAG;AACrB,UAAM,IAAI;AAAA,MACR,2DAA2D,CAAC,GAAG,QAAQ,EAAE,KAAK,IAAI,CAAC;AAAA,IACrF;AAAA,EACF;AAEA,QAAM,
|
|
4
|
+
"sourcesContent": ["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
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -5,12 +5,15 @@ export { encodeBuilderCode } from "./erc8021.js";
|
|
|
5
5
|
export type PreparedPayloadWithAttribution = {
|
|
6
6
|
type: string;
|
|
7
7
|
to: Address;
|
|
8
|
+
chainId: number;
|
|
8
9
|
data: Hex;
|
|
9
10
|
account?: Address;
|
|
10
11
|
};
|
|
11
12
|
export type PreparedTx = {
|
|
12
13
|
payload: PreparedPayloadWithAttribution;
|
|
13
|
-
tx: TxStep
|
|
14
|
+
tx: TxStep & {
|
|
15
|
+
chainId: number;
|
|
16
|
+
};
|
|
14
17
|
};
|
|
15
18
|
/**
|
|
16
19
|
* Build the full attribution suffix to append to transaction calldata.
|
|
@@ -21,5 +24,5 @@ export type PreparedTx = {
|
|
|
21
24
|
*
|
|
22
25
|
*/
|
|
23
26
|
export declare function buildAttribution(client: GauntletClient): Promise<Hex>;
|
|
24
|
-
export declare function encodeTransactionWithAttribution(client: GauntletClient, transaction: TxStep): Promise<PreparedTx>;
|
|
27
|
+
export declare function encodeTransactionWithAttribution(client: GauntletClient, transaction: TxStep, chainId: number): Promise<PreparedTx>;
|
|
25
28
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/attribution/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAsB,KAAK,GAAG,EAAE,MAAM,MAAM,CAAC;AAE7D,OAAO,EAAmB,cAAc,EAAE,qBAAkB;AAE5D,OAAO,EAAE,MAAM,EAAE,iCAA8B;AAC/C,OAAO,EAAE,iBAAiB,EAAE,qBAAkB;AAE9C,MAAM,MAAM,8BAA8B,GAAG;IAC3C,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,OAAO,CAAC;IACZ,IAAI,EAAE,GAAG,CAAC;IACV,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG;IACvB,OAAO,EAAE,8BAA8B,CAAC;IACxC,EAAE,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/attribution/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAsB,KAAK,GAAG,EAAE,MAAM,MAAM,CAAC;AAE7D,OAAO,EAAmB,cAAc,EAAE,qBAAkB;AAE5D,OAAO,EAAE,MAAM,EAAE,iCAA8B;AAC/C,OAAO,EAAE,iBAAiB,EAAE,qBAAkB;AAE9C,MAAM,MAAM,8BAA8B,GAAG;IAC3C,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,OAAO,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,GAAG,CAAC;IACV,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG;IACvB,OAAO,EAAE,8BAA8B,CAAC;IACxC,EAAE,EAAE,MAAM,GAAG;QAAE,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;CAClC,CAAC;AAEF;;;;;;;GAOG;AACH,wBAAsB,gBAAgB,CAAC,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,GAAG,CAAC,CAS3E;AAED,wBAAsB,gCAAgC,CACpD,MAAM,EAAE,cAAc,EACtB,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,UAAU,CAAC,CAsBrB"}
|
|
@@ -38,7 +38,7 @@ async function buildAttribution(client) {
|
|
|
38
38
|
throw new import_errors.UnimplementedFeatureError("AttributionMode.PRIVATE");
|
|
39
39
|
}
|
|
40
40
|
}
|
|
41
|
-
async function encodeTransactionWithAttribution(client, transaction) {
|
|
41
|
+
async function encodeTransactionWithAttribution(client, transaction, chainId) {
|
|
42
42
|
const customAttribution = await buildAttribution(client);
|
|
43
43
|
const encodedTx = (0, import_viem.encodeFunctionData)({
|
|
44
44
|
abi: transaction.abi,
|
|
@@ -51,10 +51,12 @@ async function encodeTransactionWithAttribution(client, transaction) {
|
|
|
51
51
|
type: transaction.type,
|
|
52
52
|
account: transaction.account,
|
|
53
53
|
to: transaction.address,
|
|
54
|
+
chainId,
|
|
54
55
|
data: encodedTxWithAttribution
|
|
55
56
|
},
|
|
56
57
|
tx: {
|
|
57
58
|
...transaction,
|
|
59
|
+
chainId,
|
|
58
60
|
attribution: customAttribution
|
|
59
61
|
}
|
|
60
62
|
};
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/attribution/index.ts"],
|
|
4
|
-
"sourcesContent": ["import { Address, encodeFunctionData, type Hex } from 'viem';\nimport { encodeBuilderCode } from './erc8021';\nimport { AttributionMode, GauntletClient } from '../client';\nimport { UnimplementedFeatureError } from '../errors';\nimport { TxStep } from '../evm/adapters/types';\nexport { encodeBuilderCode } from './erc8021';\n\nexport type PreparedPayloadWithAttribution = {\n type: string;\n to: Address;\n data: Hex;\n account?: Address;\n};\n\nexport type PreparedTx = {\n payload: PreparedPayloadWithAttribution;\n tx: TxStep;\n};\n\n/**\n * Build the full attribution suffix to append to transaction calldata.\n *\n * PUBLIC: ERC-8021 builder code only \u2014 `0x{codesLength}{builderCode utf8}{schemaId=0x00}{ercMarker}`, or `0x` if no builderCode.\n * ENCODED: Requests a sourceId from the Gauntlet API with builder code as an arg and encodes that.\n * PRIVATE: Generates a random salt and posts it to the Gauntlet API.\n *\n */\nexport async function buildAttribution(client: GauntletClient): Promise<Hex> {\n switch (client.attributionMode) {\n case AttributionMode.PUBLIC:\n return client.builderCode ? encodeBuilderCode(client.builderCode) : '0x';\n case AttributionMode.ENCODED:\n throw new UnimplementedFeatureError('AttributionMode.ENCODED');\n case AttributionMode.PRIVATE:\n throw new UnimplementedFeatureError('AttributionMode.PRIVATE');\n }\n}\n\nexport async function encodeTransactionWithAttribution(\n client: GauntletClient,\n transaction: TxStep\n): Promise<PreparedTx> {\n const customAttribution = await buildAttribution(client);\n const encodedTx = encodeFunctionData({\n abi: transaction.abi,\n functionName: transaction.functionName,\n args: transaction.args,\n });\n const encodedTxWithAttribution = `${encodedTx}${customAttribution.replace('0x', '')}` as Hex;\n return {\n payload: {\n type: transaction.type,\n account: transaction.account,\n to: transaction.address,\n data: encodedTxWithAttribution,\n },\n tx: {\n ...transaction,\n attribution: customAttribution,\n },\n };\n}\n"],
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kBAAsD;AACtD,qBAAkC;AAClC,oBAAgD;AAChD,oBAA0C;AAE1C,IAAAA,kBAAkC;
|
|
4
|
+
"sourcesContent": ["import { Address, encodeFunctionData, type Hex } from 'viem';\nimport { encodeBuilderCode } from './erc8021';\nimport { AttributionMode, GauntletClient } from '../client';\nimport { UnimplementedFeatureError } from '../errors';\nimport { TxStep } from '../evm/adapters/types';\nexport { encodeBuilderCode } from './erc8021';\n\nexport type PreparedPayloadWithAttribution = {\n type: string;\n to: Address;\n chainId: number;\n data: Hex;\n account?: Address;\n};\n\nexport type PreparedTx = {\n payload: PreparedPayloadWithAttribution;\n tx: TxStep & { chainId: number };\n};\n\n/**\n * Build the full attribution suffix to append to transaction calldata.\n *\n * PUBLIC: ERC-8021 builder code only \u2014 `0x{codesLength}{builderCode utf8}{schemaId=0x00}{ercMarker}`, or `0x` if no builderCode.\n * ENCODED: Requests a sourceId from the Gauntlet API with builder code as an arg and encodes that.\n * PRIVATE: Generates a random salt and posts it to the Gauntlet API.\n *\n */\nexport async function buildAttribution(client: GauntletClient): Promise<Hex> {\n switch (client.attributionMode) {\n case AttributionMode.PUBLIC:\n return client.builderCode ? encodeBuilderCode(client.builderCode) : '0x';\n case AttributionMode.ENCODED:\n throw new UnimplementedFeatureError('AttributionMode.ENCODED');\n case AttributionMode.PRIVATE:\n throw new UnimplementedFeatureError('AttributionMode.PRIVATE');\n }\n}\n\nexport async function encodeTransactionWithAttribution(\n client: GauntletClient,\n transaction: TxStep,\n chainId: number\n): Promise<PreparedTx> {\n const customAttribution = await buildAttribution(client);\n const encodedTx = encodeFunctionData({\n abi: transaction.abi,\n functionName: transaction.functionName,\n args: transaction.args,\n });\n const encodedTxWithAttribution = `${encodedTx}${customAttribution.replace('0x', '')}` as Hex;\n return {\n payload: {\n type: transaction.type,\n account: transaction.account,\n to: transaction.address,\n chainId,\n data: encodedTxWithAttribution,\n },\n tx: {\n ...transaction,\n chainId,\n attribution: customAttribution,\n },\n };\n}\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kBAAsD;AACtD,qBAAkC;AAClC,oBAAgD;AAChD,oBAA0C;AAE1C,IAAAA,kBAAkC;AAuBlC,eAAsB,iBAAiB,QAAsC;AAC3E,UAAQ,OAAO,iBAAiB;AAAA,IAC9B,KAAK,8BAAgB;AACnB,aAAO,OAAO,kBAAc,kCAAkB,OAAO,WAAW,IAAI;AAAA,IACtE,KAAK,8BAAgB;AACnB,YAAM,IAAI,wCAA0B,yBAAyB;AAAA,IAC/D,KAAK,8BAAgB;AACnB,YAAM,IAAI,wCAA0B,yBAAyB;AAAA,EACjE;AACF;AAEA,eAAsB,iCACpB,QACA,aACA,SACqB;AACrB,QAAM,oBAAoB,MAAM,iBAAiB,MAAM;AACvD,QAAM,gBAAY,gCAAmB;AAAA,IACnC,KAAK,YAAY;AAAA,IACjB,cAAc,YAAY;AAAA,IAC1B,MAAM,YAAY;AAAA,EACpB,CAAC;AACD,QAAM,2BAA2B,GAAG,SAAS,GAAG,kBAAkB,QAAQ,MAAM,EAAE,CAAC;AACnF,SAAO;AAAA,IACL,SAAS;AAAA,MACP,MAAM,YAAY;AAAA,MAClB,SAAS,YAAY;AAAA,MACrB,IAAI,YAAY;AAAA,MAChB;AAAA,MACA,MAAM;AAAA,IACR;AAAA,IACA,IAAI;AAAA,MACF,GAAG;AAAA,MACH;AAAA,MACA,aAAa;AAAA,IACf;AAAA,EACF;AACF;",
|
|
6
6
|
"names": ["import_erc8021"]
|
|
7
7
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"aera.d.ts","sourceRoot":"","sources":["../../../../src/evm/adapters/aera.ts"],"names":[],"mappings":"AAmBA,OAAO,KAAK,EACV,kBAAkB,EAMnB,mBAAgB;AACjB,OAAO,KAAK,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,MAAM,CAAC;AAWlD,eAAO,MAAM,yBAAyB,iBACtB,YAAY,eACb,MAAM,gBACL,OAAO,gBACP,OAAO,gCAmBtB,CAAC;AAEF,eAAO,MAAM,yBAAyB,iBACtB,YAAY,eACb,MAAM,gBACL,OAAO,gBACP,OAAO,gCAiBtB,CAAC;AAiIF,eAAO,MAAM,WAAW,EAAE,
|
|
1
|
+
{"version":3,"file":"aera.d.ts","sourceRoot":"","sources":["../../../../src/evm/adapters/aera.ts"],"names":[],"mappings":"AAmBA,OAAO,KAAK,EACV,kBAAkB,EAMnB,mBAAgB;AACjB,OAAO,KAAK,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,MAAM,CAAC;AAWlD,eAAO,MAAM,yBAAyB,iBACtB,YAAY,eACb,MAAM,gBACL,OAAO,gBACP,OAAO,gCAmBtB,CAAC;AAEF,eAAO,MAAM,yBAAyB,iBACtB,YAAY,eACb,MAAM,gBACL,OAAO,gBACP,OAAO,gCAiBtB,CAAC;AAiIF,eAAO,MAAM,WAAW,EAAE,kBAkXzB,CAAC"}
|
|
@@ -365,16 +365,25 @@ const aeraAdapter = {
|
|
|
365
365
|
} else {
|
|
366
366
|
throw new import_errors.InvalidWithdrawParamsError();
|
|
367
367
|
}
|
|
368
|
-
const
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
368
|
+
const tokensOut = "amount" in params && params.amount != null ? params.amount : subtractSolverTip(
|
|
369
|
+
await getAsyncRedeemTokenOut(
|
|
370
|
+
publicClient,
|
|
371
|
+
runtime,
|
|
372
|
+
vault.vaultAddress,
|
|
373
|
+
asset.address,
|
|
374
|
+
shares
|
|
375
|
+
),
|
|
376
|
+
solverTip
|
|
374
377
|
);
|
|
375
|
-
minTokenOut = (0, import_aeraContracts.applySlippageDown)(
|
|
378
|
+
minTokenOut = (0, import_aeraContracts.applySlippageDown)(tokensOut, slippageBps);
|
|
376
379
|
maxUnitsIn = shares;
|
|
377
380
|
}
|
|
381
|
+
if (params.maxShares !== void 0) {
|
|
382
|
+
if (isAsync || typeof params.maxShares !== "bigint" || params.maxShares <= 0n || !isV2ExactTokenWithdraw && shares !== void 0 && shares > params.maxShares) {
|
|
383
|
+
throw new import_errors.InvalidWithdrawParamsError();
|
|
384
|
+
}
|
|
385
|
+
if (maxUnitsIn > params.maxShares) maxUnitsIn = params.maxShares;
|
|
386
|
+
}
|
|
378
387
|
const steps = [];
|
|
379
388
|
if (isAsync) {
|
|
380
389
|
if (shares === void 0) {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/evm/adapters/aera.ts"],
|
|
4
|
-
"sourcesContent": ["import { erc20Abi } from '../abis/erc20';\nimport {\n getMultiDepositorVault,\n applySlippageDown,\n applySlippageUp,\n requireAeraSyncRedeemRuntime,\n resolveContractVersion,\n type AeraRuntimeContracts,\n} from '../aeraContracts';\nimport { convertTokenToUnits, convertUnitsToToken } from '../aeraContracts/priceAndFeeCalculator';\nimport * as provisionerV1 from '../aeraContracts/v1';\nimport * as provisionerV2 from '../aeraContracts/v2';\nimport {\n InvalidWithdrawParamsError,\n InvalidSolverTipError,\n requireNonZeroSyncWithdrawBound,\n UnimplementedFeatureError,\n UnsupportedFeatureError,\n} from '../../errors';\nimport type {\n EvmProtocolAdapter,\n EvmTxStep,\n AdapterDepositParams,\n AdapterWithdrawParams,\n AllowanceParams,\n ApprovalParams,\n} from './types';\nimport type { Address, PublicClient } from 'viem';\nimport { multiDepositorVaultAbi } from '../abis/multiDepositorVault';\nimport {\n DEFAULT_BPS,\n DAY,\n DEFAULT_MAX_PRICE_AGE,\n DEFAULT_REQUEST_DEADLINE_BUFFER,\n DEFAULT_SOLVER_TIP,\n} from '../../constants';\nimport { ContractVersion } from '../types';\n\nexport const convertTokenAmountToUnits = async (\n publicClient: PublicClient,\n tokenAmount: bigint,\n vaultAddress: Address,\n tokenAddress: Address\n) => {\n const vaultContract = getMultiDepositorVault(publicClient, vaultAddress);\n if (vaultContract === undefined) return;\n\n const calculatorAddress = await vaultContract.read.feeCalculator();\n if (!calculatorAddress) return;\n const calculatorVersion = await resolveContractVersion(publicClient, calculatorAddress);\n\n const unitsAmount = await convertTokenToUnits(\n publicClient,\n calculatorAddress,\n calculatorVersion,\n vaultAddress,\n tokenAddress,\n tokenAmount\n );\n\n return unitsAmount;\n};\n\nexport const convertUnitsToTokenAmount = async (\n publicClient: PublicClient,\n unitsAmount: bigint,\n vaultAddress: Address,\n tokenAddress: Address\n) => {\n const vaultContract = getMultiDepositorVault(publicClient, vaultAddress);\n if (vaultContract === undefined) return;\n\n const calculatorAddress = await vaultContract.read.feeCalculator();\n if (!calculatorAddress) return;\n const calculatorVersion = await resolveContractVersion(publicClient, calculatorAddress);\n\n return convertUnitsToToken(\n publicClient,\n calculatorAddress,\n calculatorVersion,\n vaultAddress,\n tokenAddress,\n unitsAmount\n );\n};\n\nfunction subtractSolverTip(tokenAmount: bigint, solverTip: bigint): bigint {\n if (solverTip === 0n) return tokenAmount;\n if (solverTip >= tokenAmount) {\n throw new InvalidSolverTipError(solverTip, tokenAmount);\n }\n\n return tokenAmount - solverTip;\n}\n\nfunction getRequestDeadline(expirationDays?: number): bigint {\n const deadlineBuffer =\n expirationDays === undefined ? DEFAULT_REQUEST_DEADLINE_BUFFER : DAY * expirationDays;\n return BigInt(Math.ceil(new Date().getTime() / 1000) + deadlineBuffer);\n}\n\nasync function getDepositUnitsOut({\n publicClient,\n runtime,\n vault,\n token,\n tokensIn,\n isAsync,\n}: {\n publicClient: PublicClient;\n runtime: AeraRuntimeContracts;\n vault: Address;\n token: Address;\n tokensIn: bigint;\n isAsync: boolean;\n}): Promise<bigint> {\n if (runtime.provisioner.version === ContractVersion.V2) {\n return isAsync\n ? provisionerV2.getAsyncDepositUnitsOut(\n publicClient,\n runtime.provisioner.address,\n runtime.feeCalculator.address,\n runtime.feeCalculator.version,\n vault,\n token,\n tokensIn\n )\n : provisionerV2.getSyncDepositUnitsOut(\n publicClient,\n runtime.provisioner.address,\n runtime.feeCalculator.address,\n runtime.feeCalculator.version,\n vault,\n token,\n tokensIn\n );\n }\n\n return provisionerV1.getAsyncDepositUnitsOut(\n publicClient,\n runtime.provisioner.address,\n runtime.feeCalculator.address,\n runtime.feeCalculator.version,\n vault,\n token,\n tokensIn\n );\n}\n\nfunction getAsyncRedeemTokenOut(\n publicClient: PublicClient,\n runtime: AeraRuntimeContracts,\n vault: Address,\n token: Address,\n unitsIn: bigint\n): Promise<bigint> {\n return runtime.provisioner.version === ContractVersion.V2\n ? provisionerV2.getAsyncRedeemTokenOut(\n publicClient,\n runtime.provisioner.address,\n runtime.feeCalculator.address,\n runtime.feeCalculator.version,\n vault,\n token,\n unitsIn\n )\n : provisionerV1.getAsyncRedeemTokenOut(\n publicClient,\n runtime.provisioner.address,\n runtime.feeCalculator.address,\n runtime.feeCalculator.version,\n vault,\n token,\n unitsIn\n );\n}\n\nfunction getAsyncWithdrawUnitsIn(\n publicClient: PublicClient,\n runtime: AeraRuntimeContracts,\n vault: Address,\n token: Address,\n tokensOut: bigint\n): Promise<bigint> {\n return runtime.provisioner.version === ContractVersion.V2\n ? provisionerV2.getAsyncWithdrawUnitsIn(\n publicClient,\n runtime.provisioner.address,\n runtime.feeCalculator.address,\n runtime.feeCalculator.version,\n vault,\n token,\n tokensOut\n )\n : provisionerV1.getAsyncWithdrawUnitsIn(\n publicClient,\n runtime.provisioner.address,\n runtime.feeCalculator.address,\n runtime.feeCalculator.version,\n vault,\n token,\n tokensOut\n );\n}\n\nfunction requireAeraRuntime(runtime: AeraRuntimeContracts | undefined): AeraRuntimeContracts {\n if (!runtime) {\n throw new UnsupportedFeatureError('Aera: runtime contracts were not resolved');\n }\n\n return runtime;\n}\n\nexport const aeraAdapter: EvmProtocolAdapter = {\n async buildDeposit(params: AdapterDepositParams): Promise<EvmTxStep[]> {\n const {\n vault,\n receiver,\n amount,\n account,\n publicClient,\n asset,\n async: isAsync,\n slippageBps = DEFAULT_BPS,\n solverTip = DEFAULT_SOLVER_TIP,\n maxPriceAge = DEFAULT_MAX_PRICE_AGE,\n aeraRuntime,\n minUnitsOut: requestedMinUnitsOut,\n } = params;\n\n const runtime = requireAeraRuntime(aeraRuntime);\n const provisionerAddress = runtime.provisioner.address;\n const isContractV2 = runtime.provisioner.version === ContractVersion.V2;\n if (receiver !== account && !isContractV2) {\n throw new UnsupportedFeatureError('Aera: separate receiver address on V1');\n }\n\n if (!isAsync && !isContractV2) {\n throw new UnsupportedFeatureError('Aera: sync operations on V1');\n }\n\n const minUnitsOut =\n requestedMinUnitsOut ??\n applySlippageDown(\n await getDepositUnitsOut({\n publicClient,\n runtime,\n vault: vault.vaultAddress,\n token: asset.address,\n tokensIn: isAsync ? subtractSolverTip(amount, solverTip) : amount,\n isAsync,\n }),\n slippageBps\n );\n\n if (isAsync) {\n const deadline = getRequestDeadline(vault.expirationDays);\n return [\n {\n type: 'requestDeposit',\n ...(isContractV2\n ? provisionerV2.requestDepositTxRequest(\n provisionerAddress,\n asset.address,\n amount,\n minUnitsOut,\n solverTip,\n deadline,\n maxPriceAge,\n false,\n receiver,\n account\n )\n : provisionerV1.requestDepositTxRequest(\n provisionerAddress,\n asset.address,\n amount,\n minUnitsOut,\n solverTip,\n deadline,\n maxPriceAge,\n false,\n account\n )),\n },\n ];\n }\n\n if (isContractV2) {\n return [\n {\n type: 'deposit',\n ...provisionerV2.depositTxRequest(\n provisionerAddress,\n asset.address,\n amount,\n minUnitsOut,\n receiver,\n account\n ),\n },\n ];\n }\n\n throw new UnimplementedFeatureError('Aera Sync Operations');\n },\n\n async buildWithdraw(params: AdapterWithdrawParams): Promise<EvmTxStep[]> {\n const {\n vault,\n receiver,\n account,\n asset,\n publicClient,\n async: isAsync,\n slippageBps = DEFAULT_BPS,\n solverTip = DEFAULT_SOLVER_TIP,\n maxPriceAge = DEFAULT_MAX_PRICE_AGE,\n aeraRuntime,\n } = params;\n\n const runtime = requireAeraRuntime(aeraRuntime);\n const provisionerAddress = runtime.provisioner.address;\n const isContractV2 = runtime.provisioner.version === ContractVersion.V2;\n if (receiver !== account && !isContractV2) {\n throw new UnsupportedFeatureError('Aera: separate receiver address on V1');\n }\n\n if (!isAsync) requireAeraSyncRedeemRuntime(runtime);\n\n const isV2ExactTokenWithdraw =\n isContractV2 && !isAsync && 'amount' in params && params.amount != null;\n let minTokenOut: bigint;\n let maxUnitsIn: bigint;\n let shares: bigint | undefined;\n\n if (isContractV2 && !isAsync) {\n const quote = params.syncWithdrawQuote;\n if ('entireAmount' in params && params.entireAmount) {\n const balance = await publicClient.readContract({\n address: vault.vaultAddress,\n abi: multiDepositorVaultAbi,\n functionName: 'balanceOf',\n args: [account],\n });\n if (quote !== undefined) {\n if (quote.kind !== 'redeem' || quote.shares !== balance) {\n throw new InvalidWithdrawParamsError();\n }\n }\n shares = balance;\n } else if ('shares' in params && params.shares != null) {\n if (quote !== undefined && (quote.kind !== 'redeem' || quote.shares !== params.shares)) {\n throw new InvalidWithdrawParamsError();\n }\n shares = params.shares;\n } else if (!('amount' in params && params.amount != null)) {\n throw new InvalidWithdrawParamsError();\n }\n\n if (isV2ExactTokenWithdraw) {\n requireNonZeroSyncWithdrawBound(params.amount, 'tokensOut');\n if (quote !== undefined) {\n if (quote.kind !== 'withdraw' || quote.tokensOut !== params.amount) {\n throw new InvalidWithdrawParamsError();\n }\n minTokenOut = quote.tokensOut;\n maxUnitsIn = quote.maxUnitsIn;\n } else {\n minTokenOut = params.amount;\n maxUnitsIn = applySlippageUp(\n await provisionerV2.getSyncWithdrawUnitsIn(\n publicClient,\n provisionerAddress,\n runtime.feeCalculator.address,\n runtime.feeCalculator.version,\n vault.vaultAddress,\n asset.address,\n params.amount\n ),\n slippageBps\n );\n }\n requireNonZeroSyncWithdrawBound(maxUnitsIn, 'maxUnitsIn');\n } else {\n if (shares === undefined) {\n throw new InvalidWithdrawParamsError();\n }\n\n requireNonZeroSyncWithdrawBound(shares, 'unitsIn');\n if (quote !== undefined) {\n if (quote.kind !== 'redeem' || quote.shares !== shares) {\n throw new InvalidWithdrawParamsError();\n }\n minTokenOut = quote.minTokensOut;\n } else {\n const tokensOut = await provisionerV2.getSyncRedeemTokenOut(\n publicClient,\n provisionerAddress,\n runtime.feeCalculator.address,\n runtime.feeCalculator.version,\n vault.vaultAddress,\n asset.address,\n shares\n );\n minTokenOut = applySlippageDown(tokensOut, slippageBps);\n }\n requireNonZeroSyncWithdrawBound(minTokenOut, 'minTokensOut');\n maxUnitsIn = shares;\n }\n } else {\n if ('entireAmount' in params && params.entireAmount) {\n shares = await publicClient.readContract({\n address: vault.vaultAddress,\n abi: multiDepositorVaultAbi,\n functionName: 'balanceOf',\n args: [account],\n });\n } else if ('amount' in params && params.amount != null) {\n shares = await getAsyncWithdrawUnitsIn(\n publicClient,\n runtime,\n vault.vaultAddress,\n asset.address,\n params.amount + solverTip\n );\n } else if ('shares' in params && params.shares != null) {\n shares = params.shares;\n } else {\n throw new InvalidWithdrawParamsError();\n }\n\n const tokenOutBeforeTip = await getAsyncRedeemTokenOut(\n publicClient,\n runtime,\n vault.vaultAddress,\n asset.address,\n shares\n );\n minTokenOut = applySlippageDown(subtractSolverTip(tokenOutBeforeTip, solverTip), slippageBps);\n maxUnitsIn = shares;\n }\n\n const steps: EvmTxStep[] = [];\n\n if (isAsync) {\n if (shares === undefined) {\n throw new InvalidWithdrawParamsError();\n }\n\n // Only async requestRedeem needs a vault unit allowance: the provisioner\n // pulls units from the user. V2 sync redeem/withdraw exits through the\n // vault and burns the caller's units directly, so no approval is needed.\n const { sufficient } = await this.checkAllowance({\n publicClient,\n token: vault.vaultAddress,\n owner: account,\n spender: provisionerAddress,\n amount: shares,\n });\n\n if (!sufficient) {\n steps.push(\n this.buildApproval({\n token: vault.vaultAddress,\n spender: provisionerAddress,\n amount: shares,\n account,\n })\n );\n }\n\n const deadline = getRequestDeadline(vault.expirationDays);\n\n return [\n ...steps,\n {\n type: 'requestRedeem',\n ...(isContractV2\n ? provisionerV2.requestRedeemTxRequest(\n provisionerAddress,\n asset.address,\n shares,\n minTokenOut,\n solverTip,\n deadline,\n maxPriceAge,\n false,\n receiver,\n account\n )\n : provisionerV1.requestRedeemTxRequest(\n provisionerAddress,\n asset.address,\n shares,\n minTokenOut,\n solverTip,\n deadline,\n maxPriceAge,\n false,\n account\n )),\n },\n ];\n }\n\n if ('amount' in params && params.amount != null) {\n return [\n ...steps,\n {\n type: 'withdraw',\n ...provisionerV2.withdrawTxRequest(\n provisionerAddress,\n asset.address,\n params.amount,\n maxUnitsIn,\n receiver,\n account\n ),\n },\n ];\n }\n\n if (shares === undefined) {\n throw new InvalidWithdrawParamsError();\n }\n\n return [\n ...steps,\n {\n type: 'redeem',\n ...provisionerV2.redeemTxRequest(\n provisionerAddress,\n asset.address,\n shares,\n minTokenOut,\n receiver,\n account\n ),\n },\n ];\n },\n\n async checkAllowance(params: AllowanceParams) {\n const { publicClient, token, owner, spender, amount } = params;\n const current = await publicClient.readContract({\n address: token,\n abi: erc20Abi,\n functionName: 'allowance',\n args: [owner, spender],\n });\n\n return { sufficient: current >= amount, current };\n },\n\n buildApproval(params: ApprovalParams): EvmTxStep {\n return {\n type: 'approve',\n address: params.token,\n abi: erc20Abi,\n functionName: 'approve',\n args: [params.spender, params.amount],\n account: params.account,\n };\n },\n};\n"],
|
|
5
|
-
"mappings": "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
|
|
4
|
+
"sourcesContent": ["import { erc20Abi } from '../abis/erc20';\nimport {\n getMultiDepositorVault,\n applySlippageDown,\n applySlippageUp,\n requireAeraSyncRedeemRuntime,\n resolveContractVersion,\n type AeraRuntimeContracts,\n} from '../aeraContracts';\nimport { convertTokenToUnits, convertUnitsToToken } from '../aeraContracts/priceAndFeeCalculator';\nimport * as provisionerV1 from '../aeraContracts/v1';\nimport * as provisionerV2 from '../aeraContracts/v2';\nimport {\n InvalidWithdrawParamsError,\n InvalidSolverTipError,\n requireNonZeroSyncWithdrawBound,\n UnimplementedFeatureError,\n UnsupportedFeatureError,\n} from '../../errors';\nimport type {\n EvmProtocolAdapter,\n EvmTxStep,\n AdapterDepositParams,\n AdapterWithdrawParams,\n AllowanceParams,\n ApprovalParams,\n} from './types';\nimport type { Address, PublicClient } from 'viem';\nimport { multiDepositorVaultAbi } from '../abis/multiDepositorVault';\nimport {\n DEFAULT_BPS,\n DAY,\n DEFAULT_MAX_PRICE_AGE,\n DEFAULT_REQUEST_DEADLINE_BUFFER,\n DEFAULT_SOLVER_TIP,\n} from '../../constants';\nimport { ContractVersion } from '../types';\n\nexport const convertTokenAmountToUnits = async (\n publicClient: PublicClient,\n tokenAmount: bigint,\n vaultAddress: Address,\n tokenAddress: Address\n) => {\n const vaultContract = getMultiDepositorVault(publicClient, vaultAddress);\n if (vaultContract === undefined) return;\n\n const calculatorAddress = await vaultContract.read.feeCalculator();\n if (!calculatorAddress) return;\n const calculatorVersion = await resolveContractVersion(publicClient, calculatorAddress);\n\n const unitsAmount = await convertTokenToUnits(\n publicClient,\n calculatorAddress,\n calculatorVersion,\n vaultAddress,\n tokenAddress,\n tokenAmount\n );\n\n return unitsAmount;\n};\n\nexport const convertUnitsToTokenAmount = async (\n publicClient: PublicClient,\n unitsAmount: bigint,\n vaultAddress: Address,\n tokenAddress: Address\n) => {\n const vaultContract = getMultiDepositorVault(publicClient, vaultAddress);\n if (vaultContract === undefined) return;\n\n const calculatorAddress = await vaultContract.read.feeCalculator();\n if (!calculatorAddress) return;\n const calculatorVersion = await resolveContractVersion(publicClient, calculatorAddress);\n\n return convertUnitsToToken(\n publicClient,\n calculatorAddress,\n calculatorVersion,\n vaultAddress,\n tokenAddress,\n unitsAmount\n );\n};\n\nfunction subtractSolverTip(tokenAmount: bigint, solverTip: bigint): bigint {\n if (solverTip === 0n) return tokenAmount;\n if (solverTip >= tokenAmount) {\n throw new InvalidSolverTipError(solverTip, tokenAmount);\n }\n\n return tokenAmount - solverTip;\n}\n\nfunction getRequestDeadline(expirationDays?: number): bigint {\n const deadlineBuffer =\n expirationDays === undefined ? DEFAULT_REQUEST_DEADLINE_BUFFER : DAY * expirationDays;\n return BigInt(Math.ceil(new Date().getTime() / 1000) + deadlineBuffer);\n}\n\nasync function getDepositUnitsOut({\n publicClient,\n runtime,\n vault,\n token,\n tokensIn,\n isAsync,\n}: {\n publicClient: PublicClient;\n runtime: AeraRuntimeContracts;\n vault: Address;\n token: Address;\n tokensIn: bigint;\n isAsync: boolean;\n}): Promise<bigint> {\n if (runtime.provisioner.version === ContractVersion.V2) {\n return isAsync\n ? provisionerV2.getAsyncDepositUnitsOut(\n publicClient,\n runtime.provisioner.address,\n runtime.feeCalculator.address,\n runtime.feeCalculator.version,\n vault,\n token,\n tokensIn\n )\n : provisionerV2.getSyncDepositUnitsOut(\n publicClient,\n runtime.provisioner.address,\n runtime.feeCalculator.address,\n runtime.feeCalculator.version,\n vault,\n token,\n tokensIn\n );\n }\n\n return provisionerV1.getAsyncDepositUnitsOut(\n publicClient,\n runtime.provisioner.address,\n runtime.feeCalculator.address,\n runtime.feeCalculator.version,\n vault,\n token,\n tokensIn\n );\n}\n\nfunction getAsyncRedeemTokenOut(\n publicClient: PublicClient,\n runtime: AeraRuntimeContracts,\n vault: Address,\n token: Address,\n unitsIn: bigint\n): Promise<bigint> {\n return runtime.provisioner.version === ContractVersion.V2\n ? provisionerV2.getAsyncRedeemTokenOut(\n publicClient,\n runtime.provisioner.address,\n runtime.feeCalculator.address,\n runtime.feeCalculator.version,\n vault,\n token,\n unitsIn\n )\n : provisionerV1.getAsyncRedeemTokenOut(\n publicClient,\n runtime.provisioner.address,\n runtime.feeCalculator.address,\n runtime.feeCalculator.version,\n vault,\n token,\n unitsIn\n );\n}\n\nfunction getAsyncWithdrawUnitsIn(\n publicClient: PublicClient,\n runtime: AeraRuntimeContracts,\n vault: Address,\n token: Address,\n tokensOut: bigint\n): Promise<bigint> {\n return runtime.provisioner.version === ContractVersion.V2\n ? provisionerV2.getAsyncWithdrawUnitsIn(\n publicClient,\n runtime.provisioner.address,\n runtime.feeCalculator.address,\n runtime.feeCalculator.version,\n vault,\n token,\n tokensOut\n )\n : provisionerV1.getAsyncWithdrawUnitsIn(\n publicClient,\n runtime.provisioner.address,\n runtime.feeCalculator.address,\n runtime.feeCalculator.version,\n vault,\n token,\n tokensOut\n );\n}\n\nfunction requireAeraRuntime(runtime: AeraRuntimeContracts | undefined): AeraRuntimeContracts {\n if (!runtime) {\n throw new UnsupportedFeatureError('Aera: runtime contracts were not resolved');\n }\n\n return runtime;\n}\n\nexport const aeraAdapter: EvmProtocolAdapter = {\n async buildDeposit(params: AdapterDepositParams): Promise<EvmTxStep[]> {\n const {\n vault,\n receiver,\n amount,\n account,\n publicClient,\n asset,\n async: isAsync,\n slippageBps = DEFAULT_BPS,\n solverTip = DEFAULT_SOLVER_TIP,\n maxPriceAge = DEFAULT_MAX_PRICE_AGE,\n aeraRuntime,\n minUnitsOut: requestedMinUnitsOut,\n } = params;\n\n const runtime = requireAeraRuntime(aeraRuntime);\n const provisionerAddress = runtime.provisioner.address;\n const isContractV2 = runtime.provisioner.version === ContractVersion.V2;\n if (receiver !== account && !isContractV2) {\n throw new UnsupportedFeatureError('Aera: separate receiver address on V1');\n }\n\n if (!isAsync && !isContractV2) {\n throw new UnsupportedFeatureError('Aera: sync operations on V1');\n }\n\n const minUnitsOut =\n requestedMinUnitsOut ??\n applySlippageDown(\n await getDepositUnitsOut({\n publicClient,\n runtime,\n vault: vault.vaultAddress,\n token: asset.address,\n tokensIn: isAsync ? subtractSolverTip(amount, solverTip) : amount,\n isAsync,\n }),\n slippageBps\n );\n\n if (isAsync) {\n const deadline = getRequestDeadline(vault.expirationDays);\n return [\n {\n type: 'requestDeposit',\n ...(isContractV2\n ? provisionerV2.requestDepositTxRequest(\n provisionerAddress,\n asset.address,\n amount,\n minUnitsOut,\n solverTip,\n deadline,\n maxPriceAge,\n false,\n receiver,\n account\n )\n : provisionerV1.requestDepositTxRequest(\n provisionerAddress,\n asset.address,\n amount,\n minUnitsOut,\n solverTip,\n deadline,\n maxPriceAge,\n false,\n account\n )),\n },\n ];\n }\n\n if (isContractV2) {\n return [\n {\n type: 'deposit',\n ...provisionerV2.depositTxRequest(\n provisionerAddress,\n asset.address,\n amount,\n minUnitsOut,\n receiver,\n account\n ),\n },\n ];\n }\n\n throw new UnimplementedFeatureError('Aera Sync Operations');\n },\n\n async buildWithdraw(params: AdapterWithdrawParams): Promise<EvmTxStep[]> {\n const {\n vault,\n receiver,\n account,\n asset,\n publicClient,\n async: isAsync,\n slippageBps = DEFAULT_BPS,\n solverTip = DEFAULT_SOLVER_TIP,\n maxPriceAge = DEFAULT_MAX_PRICE_AGE,\n aeraRuntime,\n } = params;\n\n const runtime = requireAeraRuntime(aeraRuntime);\n const provisionerAddress = runtime.provisioner.address;\n const isContractV2 = runtime.provisioner.version === ContractVersion.V2;\n if (receiver !== account && !isContractV2) {\n throw new UnsupportedFeatureError('Aera: separate receiver address on V1');\n }\n\n if (!isAsync) requireAeraSyncRedeemRuntime(runtime);\n\n const isV2ExactTokenWithdraw =\n isContractV2 && !isAsync && 'amount' in params && params.amount != null;\n let minTokenOut: bigint;\n let maxUnitsIn: bigint;\n let shares: bigint | undefined;\n\n if (isContractV2 && !isAsync) {\n const quote = params.syncWithdrawQuote;\n if ('entireAmount' in params && params.entireAmount) {\n const balance = await publicClient.readContract({\n address: vault.vaultAddress,\n abi: multiDepositorVaultAbi,\n functionName: 'balanceOf',\n args: [account],\n });\n if (quote !== undefined) {\n if (quote.kind !== 'redeem' || quote.shares !== balance) {\n throw new InvalidWithdrawParamsError();\n }\n }\n shares = balance;\n } else if ('shares' in params && params.shares != null) {\n if (quote !== undefined && (quote.kind !== 'redeem' || quote.shares !== params.shares)) {\n throw new InvalidWithdrawParamsError();\n }\n shares = params.shares;\n } else if (!('amount' in params && params.amount != null)) {\n throw new InvalidWithdrawParamsError();\n }\n\n if (isV2ExactTokenWithdraw) {\n requireNonZeroSyncWithdrawBound(params.amount, 'tokensOut');\n if (quote !== undefined) {\n if (quote.kind !== 'withdraw' || quote.tokensOut !== params.amount) {\n throw new InvalidWithdrawParamsError();\n }\n minTokenOut = quote.tokensOut;\n maxUnitsIn = quote.maxUnitsIn;\n } else {\n minTokenOut = params.amount;\n maxUnitsIn = applySlippageUp(\n await provisionerV2.getSyncWithdrawUnitsIn(\n publicClient,\n provisionerAddress,\n runtime.feeCalculator.address,\n runtime.feeCalculator.version,\n vault.vaultAddress,\n asset.address,\n params.amount\n ),\n slippageBps\n );\n }\n requireNonZeroSyncWithdrawBound(maxUnitsIn, 'maxUnitsIn');\n } else {\n if (shares === undefined) {\n throw new InvalidWithdrawParamsError();\n }\n\n requireNonZeroSyncWithdrawBound(shares, 'unitsIn');\n if (quote !== undefined) {\n if (quote.kind !== 'redeem' || quote.shares !== shares) {\n throw new InvalidWithdrawParamsError();\n }\n minTokenOut = quote.minTokensOut;\n } else {\n const tokensOut = await provisionerV2.getSyncRedeemTokenOut(\n publicClient,\n provisionerAddress,\n runtime.feeCalculator.address,\n runtime.feeCalculator.version,\n vault.vaultAddress,\n asset.address,\n shares\n );\n minTokenOut = applySlippageDown(tokensOut, slippageBps);\n }\n requireNonZeroSyncWithdrawBound(minTokenOut, 'minTokensOut');\n maxUnitsIn = shares;\n }\n } else {\n if ('entireAmount' in params && params.entireAmount) {\n shares = await publicClient.readContract({\n address: vault.vaultAddress,\n abi: multiDepositorVaultAbi,\n functionName: 'balanceOf',\n args: [account],\n });\n } else if ('amount' in params && params.amount != null) {\n shares = await getAsyncWithdrawUnitsIn(\n publicClient,\n runtime,\n vault.vaultAddress,\n asset.address,\n params.amount + solverTip\n );\n } else if ('shares' in params && params.shares != null) {\n shares = params.shares;\n } else {\n throw new InvalidWithdrawParamsError();\n }\n\n const tokensOut =\n 'amount' in params && params.amount != null\n ? params.amount\n : subtractSolverTip(\n await getAsyncRedeemTokenOut(\n publicClient,\n runtime,\n vault.vaultAddress,\n asset.address,\n shares\n ),\n solverTip\n );\n minTokenOut = applySlippageDown(tokensOut, slippageBps);\n maxUnitsIn = shares;\n }\n\n if (params.maxShares !== undefined) {\n if (\n isAsync ||\n typeof params.maxShares !== 'bigint' ||\n params.maxShares <= 0n ||\n (!isV2ExactTokenWithdraw && shares !== undefined && shares > params.maxShares)\n ) {\n throw new InvalidWithdrawParamsError();\n }\n if (maxUnitsIn > params.maxShares) maxUnitsIn = params.maxShares;\n }\n\n const steps: EvmTxStep[] = [];\n\n if (isAsync) {\n if (shares === undefined) {\n throw new InvalidWithdrawParamsError();\n }\n\n // Only async requestRedeem needs a vault unit allowance: the provisioner\n // pulls units from the user. V2 sync redeem/withdraw exits through the\n // vault and burns the caller's units directly, so no approval is needed.\n const { sufficient } = await this.checkAllowance({\n publicClient,\n token: vault.vaultAddress,\n owner: account,\n spender: provisionerAddress,\n amount: shares,\n });\n\n if (!sufficient) {\n steps.push(\n this.buildApproval({\n token: vault.vaultAddress,\n spender: provisionerAddress,\n amount: shares,\n account,\n })\n );\n }\n\n const deadline = getRequestDeadline(vault.expirationDays);\n\n return [\n ...steps,\n {\n type: 'requestRedeem',\n ...(isContractV2\n ? provisionerV2.requestRedeemTxRequest(\n provisionerAddress,\n asset.address,\n shares,\n minTokenOut,\n solverTip,\n deadline,\n maxPriceAge,\n false,\n receiver,\n account\n )\n : provisionerV1.requestRedeemTxRequest(\n provisionerAddress,\n asset.address,\n shares,\n minTokenOut,\n solverTip,\n deadline,\n maxPriceAge,\n false,\n account\n )),\n },\n ];\n }\n\n if ('amount' in params && params.amount != null) {\n return [\n ...steps,\n {\n type: 'withdraw',\n ...provisionerV2.withdrawTxRequest(\n provisionerAddress,\n asset.address,\n params.amount,\n maxUnitsIn,\n receiver,\n account\n ),\n },\n ];\n }\n\n if (shares === undefined) {\n throw new InvalidWithdrawParamsError();\n }\n\n return [\n ...steps,\n {\n type: 'redeem',\n ...provisionerV2.redeemTxRequest(\n provisionerAddress,\n asset.address,\n shares,\n minTokenOut,\n receiver,\n account\n ),\n },\n ];\n },\n\n async checkAllowance(params: AllowanceParams) {\n const { publicClient, token, owner, spender, amount } = params;\n const current = await publicClient.readContract({\n address: token,\n abi: erc20Abi,\n functionName: 'allowance',\n args: [owner, spender],\n });\n\n return { sufficient: current >= amount, current };\n },\n\n buildApproval(params: ApprovalParams): EvmTxStep {\n return {\n type: 'approve',\n address: params.token,\n abi: erc20Abi,\n functionName: 'approve',\n args: [params.spender, params.amount],\n account: params.account,\n };\n },\n};\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/evm/adapters/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,YAAY,EAAE,MAAM,MAAM,CAAC;AAC5D,OAAO,KAAK,EAAE,oBAAoB,EAAE,4BAAyB;AAC7D,OAAO,KAAK,EAAE,uBAAuB,EAAE,4BAAyB;AAChE,OAAO,KAAK,EAAE,SAAS,EAAE,eAAe,EAAE,oBAAiB;AAE3D,MAAM,WAAW,SAAS,CAAC,IAAI,SAAS,GAAG,GAAG,GAAG,EAAE,aAAa,SAAS,MAAM,GAAG,MAAM;IACtF,IAAI,EACA,SAAS,GACT,SAAS,GACT,gBAAgB,GAChB,QAAQ,GACR,eAAe,GACf,4BAA4B,GAC5B,UAAU,CAAC;IACf,OAAO,EAAE,OAAO,CAAC;IACjB,GAAG,EAAE,IAAI,CAAC;IACV,YAAY,EAAE,aAAa,CAAC;IAC5B,IAAI,EAAE,SAAS,OAAO,EAAE,CAAC;IACzB,OAAO,EAAE,OAAO,CAAC;IACjB,WAAW,CAAC,EAAE,GAAG,CAAC;CACnB;AAED,MAAM,MAAM,MAAM,GAAG,SAAS,CAAC;AAE/B,MAAM,WAAW,oBAAoB;IACnC,KAAK,EAAE,eAAe,CAAC;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,OAAO,CAAC;IAClB,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,OAAO,CAAC;IACf,qGAAqG;IACrG,KAAK,EAAE,SAAS,CAAC;IACjB,YAAY,EAAE,YAAY,CAAC;IAC3B,2EAA2E;IAC3E,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,2EAA2E;IAC3E,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,wFAAwF;IACxF,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,oBAAoB,CAAC;IACnC,0EAA0E;IAC1E,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,MAAM,qBAAqB,GAAG;IAClC,KAAK,EAAE,eAAe,CAAC;IACvB,QAAQ,EAAE,OAAO,CAAC;IAClB,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,OAAO,GAAG,SAAS,CAAC;IAC3B,KAAK,EAAE,SAAS,CAAC;IACjB,YAAY,EAAE,YAAY,CAAC;IAC3B,2EAA2E;IAC3E,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,2EAA2E;IAC3E,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,wFAAwF;IACxF,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,oBAAoB,CAAC;IACnC,iBAAiB,CAAC,EAAE,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/evm/adapters/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/evm/adapters/types.ts"],
|
|
4
|
-
"sourcesContent": ["import type { Abi, Address, Hex, PublicClient } from 'viem';\nimport type { AeraRuntimeContracts } from '../aeraContracts';\nimport type { SyncWithdrawQuoteBounds } from '../withdrawQuote';\nimport type { TokenInfo, VaultDeployment } from '../types';\n\nexport interface EvmTxStep<TAbi extends Abi = Abi, TFunctionName extends string = string> {\n type:\n | 'approve'\n | 'deposit'\n | 'requestDeposit'\n | 'redeem'\n | 'requestRedeem'\n | 'setDepositReceiverApproval'\n | 'withdraw';\n address: Address;\n abi: TAbi;\n functionName: TFunctionName;\n args: readonly unknown[];\n account: Address;\n attribution?: Hex;\n}\n\nexport type TxStep = EvmTxStep; // | SolanaTxStep\n\nexport interface AdapterDepositParams {\n vault: VaultDeployment;\n amount: bigint;\n receiver: Address;\n account: Address;\n async: boolean;\n /** Attribution bytes (GTLT + optional ERC-8021). Passed to adapter for future calldata embedding. */\n asset: TokenInfo;\n publicClient: PublicClient;\n /** Slippage tolerance in basis points (e.g. 100 = 1%). Defaults to 100. */\n slippageBps?: number;\n /** Solver tip passed to async Aera provisioner requests. Defaults to 0. */\n solverTip?: bigint;\n /** Maximum price age passed to async Aera provisioner requests. Defaults to 10 days. */\n maxPriceAge?: bigint;\n aeraRuntime?: AeraRuntimeContracts;\n /** Caller-reviewed minimum output for an explicit synchronous deposit. */\n minUnitsOut?: bigint;\n}\n\nexport type AdapterWithdrawParams = {\n vault: VaultDeployment;\n receiver: Address;\n account: Address;\n async: boolean | undefined;\n asset: TokenInfo;\n publicClient: PublicClient;\n /** Slippage tolerance in basis points (e.g. 100 = 1%). Defaults to 100. */\n slippageBps?: number;\n /** Solver tip passed to async Aera provisioner requests. Defaults to 0. */\n solverTip?: bigint;\n /** Maximum price age passed to async Aera provisioner requests. Defaults to 10 days. */\n maxPriceAge?: bigint;\n aeraRuntime?: AeraRuntimeContracts;\n syncWithdrawQuote?: SyncWithdrawQuoteBounds;\n} & (\n | { shares: bigint; amount?: never; entireAmount?: never }\n | { amount: bigint; shares?: never; entireAmount?: never }\n | { entireAmount: true; shares?: never; amount?: never }\n);\n\nexport interface AllowanceParams {\n publicClient: PublicClient;\n token: Address;\n owner: Address;\n spender: Address;\n amount: bigint;\n}\n\nexport interface ApprovalParams {\n token: Address;\n spender: Address;\n amount: bigint;\n account: Address;\n}\n\nexport interface EvmProtocolAdapter {\n buildDeposit(params: AdapterDepositParams): Promise<EvmTxStep[]>;\n buildWithdraw(params: AdapterWithdrawParams): Promise<EvmTxStep[]>;\n checkAllowance(params: AllowanceParams): Promise<{ sufficient: boolean; current: bigint }>;\n buildApproval(params: ApprovalParams): EvmTxStep;\n}\n"],
|
|
4
|
+
"sourcesContent": ["import type { Abi, Address, Hex, PublicClient } from 'viem';\nimport type { AeraRuntimeContracts } from '../aeraContracts';\nimport type { SyncWithdrawQuoteBounds } from '../withdrawQuote';\nimport type { TokenInfo, VaultDeployment } from '../types';\n\nexport interface EvmTxStep<TAbi extends Abi = Abi, TFunctionName extends string = string> {\n type:\n | 'approve'\n | 'deposit'\n | 'requestDeposit'\n | 'redeem'\n | 'requestRedeem'\n | 'setDepositReceiverApproval'\n | 'withdraw';\n address: Address;\n abi: TAbi;\n functionName: TFunctionName;\n args: readonly unknown[];\n account: Address;\n attribution?: Hex;\n}\n\nexport type TxStep = EvmTxStep; // | SolanaTxStep\n\nexport interface AdapterDepositParams {\n vault: VaultDeployment;\n amount: bigint;\n receiver: Address;\n account: Address;\n async: boolean;\n /** Attribution bytes (GTLT + optional ERC-8021). Passed to adapter for future calldata embedding. */\n asset: TokenInfo;\n publicClient: PublicClient;\n /** Slippage tolerance in basis points (e.g. 100 = 1%). Defaults to 100. */\n slippageBps?: number;\n /** Solver tip passed to async Aera provisioner requests. Defaults to 0. */\n solverTip?: bigint;\n /** Maximum price age passed to async Aera provisioner requests. Defaults to 10 days. */\n maxPriceAge?: bigint;\n aeraRuntime?: AeraRuntimeContracts;\n /** Caller-reviewed minimum output for an explicit synchronous deposit. */\n minUnitsOut?: bigint;\n}\n\nexport type AdapterWithdrawParams = {\n vault: VaultDeployment;\n receiver: Address;\n account: Address;\n async: boolean | undefined;\n asset: TokenInfo;\n publicClient: PublicClient;\n /** Slippage tolerance in basis points (e.g. 100 = 1%). Defaults to 100. */\n slippageBps?: number;\n /** Solver tip passed to async Aera provisioner requests. Defaults to 0. */\n solverTip?: bigint;\n /** Maximum price age passed to async Aera provisioner requests. Defaults to 10 days. */\n maxPriceAge?: bigint;\n aeraRuntime?: AeraRuntimeContracts;\n syncWithdrawQuote?: SyncWithdrawQuoteBounds;\n maxShares?: bigint;\n} & (\n | { shares: bigint; amount?: never; entireAmount?: never }\n | { amount: bigint; shares?: never; entireAmount?: never }\n | { entireAmount: true; shares?: never; amount?: never }\n);\n\nexport interface AllowanceParams {\n publicClient: PublicClient;\n token: Address;\n owner: Address;\n spender: Address;\n amount: bigint;\n}\n\nexport interface ApprovalParams {\n token: Address;\n spender: Address;\n amount: bigint;\n account: Address;\n}\n\nexport interface EvmProtocolAdapter {\n buildDeposit(params: AdapterDepositParams): Promise<EvmTxStep[]>;\n buildWithdraw(params: AdapterWithdrawParams): Promise<EvmTxStep[]>;\n checkAllowance(params: AllowanceParams): Promise<{ sufficient: boolean; current: bigint }>;\n buildApproval(params: ApprovalParams): EvmTxStep;\n}\n"],
|
|
5
5
|
"mappings": ";;;;;;;;;;;;;;AAAA;AAAA;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"aeraContracts.d.ts","sourceRoot":"","sources":["../../../src/evm/aeraContracts.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,KAAK,OAAO,EACZ,KAAK,MAAM,EACX,KAAK,qBAAqB,EAC1B,KAAK,YAAY,EAGlB,MAAM,MAAM,CAAC;AAEd,OAAO,EAAE,sBAAsB,EAAE,sCAAmC;AAIpE,OAAO,EAAE,eAAe,EAAE,KAAK,kBAAkB,EAAE,mBAAgB;
|
|
1
|
+
{"version":3,"file":"aeraContracts.d.ts","sourceRoot":"","sources":["../../../src/evm/aeraContracts.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,KAAK,OAAO,EACZ,KAAK,MAAM,EACX,KAAK,qBAAqB,EAC1B,KAAK,YAAY,EAGlB,MAAM,MAAM,CAAC;AAEd,OAAO,EAAE,sBAAsB,EAAE,sCAAmC;AAIpE,OAAO,EAAE,eAAe,EAAE,KAAK,kBAAkB,EAAE,mBAAgB;AA0BnE,MAAM,WAAW,oBAAoB;IACnC,WAAW,EAAE;QACX,OAAO,EAAE,OAAO,CAAC;QACjB,OAAO,EAAE,eAAe,CAAC;KAC1B,CAAC;IACF,aAAa,EAAE;QACb,OAAO,EAAE,OAAO,CAAC;QACjB,OAAO,EAAE,eAAe,CAAC;KAC1B,CAAC;CACH;AAED,MAAM,WAAW,oBAAoB;IACnC,YAAY,EAAE,OAAO,CAAC;IACtB,WAAW,EAAE,OAAO,CAAC;IACrB,WAAW,EAAE,OAAO,CAAC;IACrB,UAAU,EAAE,OAAO,CAAC;CACrB;AAED,wBAAgB,4BAA4B,CAAC,OAAO,EAAE,oBAAoB,GAAG,IAAI,CAOhF;AAED,MAAM,MAAM,eAAe,GAAG;IAC5B,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,CAAC;AAEF,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,CAE7E;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,CAE3E;AAsBD,MAAM,MAAM,2BAA2B,CAAC,CAAC,SAAS,MAAM,IAAI,qBAAqB,CAC/E,OAAO,sBAAsB,EAC7B,CAAC,EACD,OAAO,CACR,CAAC;AAEF,wBAAgB,sBAAsB,CAAC,CAAC,SAAS,MAAM,EACrD,MAAM,EAAE,CAAC,EACT,YAAY,EAAE,OAAO,GACpB,2BAA2B,CAAC,CAAC,CAAC,CAMhC;AAKD,wBAAsB,sBAAsB,CAC1C,MAAM,EAAE,YAAY,EACpB,OAAO,EAAE,OAAO,EAChB,OAAO,GAAE,eAAoB,GAC5B,OAAO,CAAC,eAAe,CAAC,CAe1B;AA2BD,wBAAsB,2BAA2B,CAC/C,MAAM,EAAE,YAAY,EACpB,KAAK,EAAE,kBAAkB,EACzB,OAAO,GAAE,eAAoB,GAC5B,OAAO,CAAC,oBAAoB,CAAC,CA0C/B;AAED,wBAAsB,2BAA2B,CAC/C,MAAM,EAAE,YAAY,EACpB,OAAO,EAAE,oBAAoB,EAC7B,KAAK,EAAE,OAAO,EACd,OAAO,GAAE,eAAe,GAAG;IAAE,gBAAgB,CAAC,EAAE,OAAO,CAAA;CAAO,GAC7D,OAAO,CAAC,oBAAoB,CAAC,CAsE/B"}
|
|
@@ -35,7 +35,6 @@ var import_provisionerV2 = require("./abis/provisionerV2");
|
|
|
35
35
|
var import_constants = require("../constants");
|
|
36
36
|
var import_types = require("./types");
|
|
37
37
|
var import_readOptions = require("./aeraContracts/readOptions");
|
|
38
|
-
const contractVersionCache = /* @__PURE__ */ new Map();
|
|
39
38
|
const contractVersionAbi = [
|
|
40
39
|
{
|
|
41
40
|
type: "function",
|
|
@@ -71,9 +70,6 @@ function applySlippageDown(amount, slippageBps) {
|
|
|
71
70
|
function applySlippageUp(amount, slippageBps) {
|
|
72
71
|
return (amount * (import_constants.MAX_BPS + BigInt(slippageBps)) + import_constants.MAX_BPS - 1n) / import_constants.MAX_BPS;
|
|
73
72
|
}
|
|
74
|
-
function contractVersionCacheKey(client, address) {
|
|
75
|
-
return `${client.chain?.id ?? "unknown"}:${address.toLowerCase()}`;
|
|
76
|
-
}
|
|
77
73
|
function isVersionUnavailableError(error) {
|
|
78
74
|
if (!(error instanceof import_viem.ContractFunctionExecutionError) || error.functionName !== "version") {
|
|
79
75
|
return false;
|
|
@@ -91,10 +87,22 @@ function getMultiDepositorVault(client, vaultAddress) {
|
|
|
91
87
|
client
|
|
92
88
|
});
|
|
93
89
|
}
|
|
90
|
+
const latestContractVersions = /* @__PURE__ */ new WeakMap();
|
|
94
91
|
async function resolveContractVersion(client, address, options = {}) {
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
if (
|
|
92
|
+
if (options.blockNumber !== void 0) return readContractVersion(client, address, options);
|
|
93
|
+
let versions = latestContractVersions.get(client);
|
|
94
|
+
if (versions === void 0) {
|
|
95
|
+
versions = /* @__PURE__ */ new Map();
|
|
96
|
+
latestContractVersions.set(client, versions);
|
|
97
|
+
}
|
|
98
|
+
const key = address.toLowerCase();
|
|
99
|
+
const cached = versions.get(key);
|
|
100
|
+
if (cached !== void 0) return cached;
|
|
101
|
+
const version = await readContractVersion(client, address, options);
|
|
102
|
+
versions.set(key, version);
|
|
103
|
+
return version;
|
|
104
|
+
}
|
|
105
|
+
async function readContractVersion(client, address, options) {
|
|
98
106
|
try {
|
|
99
107
|
const versionString = await client.readContract({
|
|
100
108
|
address,
|
|
@@ -102,12 +110,14 @@ async function resolveContractVersion(client, address, options = {}) {
|
|
|
102
110
|
functionName: "version",
|
|
103
111
|
...(0, import_readOptions.readAtBlock)(options)
|
|
104
112
|
});
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
113
|
+
if (!/^[12]\./.test(versionString)) {
|
|
114
|
+
throw new import_errors.UnsupportedFeatureError(`Aera: unsupported contract version ${versionString}`);
|
|
115
|
+
}
|
|
116
|
+
return versionString.startsWith("2.") ? import_types.ContractVersion.V2 : import_types.ContractVersion.V1;
|
|
108
117
|
} catch (error) {
|
|
109
118
|
if (!isVersionUnavailableError(error)) throw error;
|
|
110
|
-
|
|
119
|
+
const code = await client.getCode({ address, ...(0, import_readOptions.readAtBlock)(options) });
|
|
120
|
+
if (code === void 0 || code === "0x") throw error;
|
|
111
121
|
return import_types.ContractVersion.V1;
|
|
112
122
|
}
|
|
113
123
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/evm/aeraContracts.ts"],
|
|
4
|
-
"sourcesContent": ["import {\n ContractFunctionExecutionError,\n ContractFunctionRevertedError,\n ContractFunctionZeroDataError,\n type Address,\n type Client,\n type GetContractReturnType,\n type PublicClient,\n getContract,\n zeroAddress,\n} from 'viem';\nimport { UnimplementedFeatureError, UnsupportedFeatureError } from '../errors';\nimport { multiDepositorVaultAbi } from './abis/multiDepositorVault';\nimport { provisionerAbi } from './abis/provisioner';\nimport { provisionerV2Abi } from './abis/provisionerV2';\nimport { MAX_BPS } from '../constants';\nimport { ContractVersion, type EvmVaultDeployment } from './types';\nimport { readAtBlock } from './aeraContracts/readOptions';\n\nconst
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kBAUO;AACP,oBAAmE;AACnE,iCAAuC;AACvC,yBAA+B;AAC/B,2BAAiC;AACjC,uBAAwB;AACxB,mBAAyD;AACzD,yBAA4B;AAE5B,MAAM,
|
|
4
|
+
"sourcesContent": ["import {\n ContractFunctionExecutionError,\n ContractFunctionRevertedError,\n ContractFunctionZeroDataError,\n type Address,\n type Client,\n type GetContractReturnType,\n type PublicClient,\n getContract,\n zeroAddress,\n} from 'viem';\nimport { UnimplementedFeatureError, UnsupportedFeatureError } from '../errors';\nimport { multiDepositorVaultAbi } from './abis/multiDepositorVault';\nimport { provisionerAbi } from './abis/provisioner';\nimport { provisionerV2Abi } from './abis/provisionerV2';\nimport { MAX_BPS } from '../constants';\nimport { ContractVersion, type EvmVaultDeployment } from './types';\nimport { readAtBlock } from './aeraContracts/readOptions';\n\nconst contractVersionAbi = [\n {\n type: 'function',\n inputs: [],\n name: 'version',\n outputs: [{ name: '', internalType: 'string', type: 'string' }],\n stateMutability: 'view',\n },\n] as const;\n\nconst solvingGateAbi = [\n {\n type: 'function',\n inputs: [\n { name: 'provisioner', internalType: 'address', type: 'address' },\n { name: 'token', internalType: 'address', type: 'address' },\n ],\n name: 'paused',\n outputs: [{ name: '', internalType: 'bool', type: 'bool' }],\n stateMutability: 'view',\n },\n] as const;\n\nexport interface AeraRuntimeContracts {\n provisioner: {\n address: Address;\n version: ContractVersion;\n };\n feeCalculator: {\n address: Address;\n version: ContractVersion;\n };\n}\n\nexport interface AeraTokenModeSupport {\n asyncDeposit: boolean;\n asyncRedeem: boolean;\n syncDeposit: boolean;\n syncRedeem: boolean;\n}\n\nexport function requireAeraSyncRedeemRuntime(runtime: AeraRuntimeContracts): void {\n if (runtime.provisioner.version !== ContractVersion.V2) {\n throw new UnsupportedFeatureError('Aera: sync redeem requires a V2 provisioner');\n }\n if (runtime.feeCalculator.version !== ContractVersion.V2) {\n throw new UnsupportedFeatureError('Aera: sync redeem requires a V2 price and fee calculator');\n }\n}\n\nexport type AeraReadOptions = {\n blockNumber?: bigint;\n};\n\nexport function applySlippageDown(amount: bigint, slippageBps: number): bigint {\n return (amount * (MAX_BPS - BigInt(slippageBps))) / MAX_BPS;\n}\n\nexport function applySlippageUp(amount: bigint, slippageBps: number): bigint {\n return (amount * (MAX_BPS + BigInt(slippageBps)) + MAX_BPS - 1n) / MAX_BPS;\n}\n\nfunction isVersionUnavailableError(error: unknown): boolean {\n if (!(error instanceof ContractFunctionExecutionError) || error.functionName !== 'version') {\n return false;\n }\n\n if (error.cause instanceof ContractFunctionRevertedError) {\n const hasDecodedError =\n error.cause.signature !== undefined ||\n error.cause.data !== undefined ||\n (error.cause.raw !== undefined && error.cause.raw !== '0x');\n\n return (\n !hasDecodedError &&\n (error.cause.reason === undefined || error.cause.reason === 'execution reverted')\n );\n }\n\n return error.cause instanceof ContractFunctionZeroDataError;\n}\n\nexport type MultiDepositorVaultContract<T extends Client> = GetContractReturnType<\n typeof multiDepositorVaultAbi,\n T,\n Address\n>;\n\nexport function getMultiDepositorVault<T extends Client>(\n client: T,\n vaultAddress: Address\n): MultiDepositorVaultContract<T> {\n return getContract({\n address: vaultAddress,\n abi: multiDepositorVaultAbi,\n client,\n });\n}\n\n// Latest-block versions per client. Historical reads and failed reads are not cached.\nconst latestContractVersions = new WeakMap<PublicClient, Map<string, ContractVersion>>();\n\nexport async function resolveContractVersion(\n client: PublicClient,\n address: Address,\n options: AeraReadOptions = {}\n): Promise<ContractVersion> {\n if (options.blockNumber !== undefined) return readContractVersion(client, address, options);\n\n let versions = latestContractVersions.get(client);\n if (versions === undefined) {\n versions = new Map();\n latestContractVersions.set(client, versions);\n }\n const key = address.toLowerCase();\n const cached = versions.get(key);\n if (cached !== undefined) return cached;\n\n const version = await readContractVersion(client, address, options);\n versions.set(key, version);\n return version;\n}\n\nasync function readContractVersion(\n client: PublicClient,\n address: Address,\n options: AeraReadOptions\n): Promise<ContractVersion> {\n try {\n const versionString = await client.readContract({\n address,\n abi: contractVersionAbi,\n functionName: 'version',\n ...readAtBlock(options),\n });\n if (!/^[12]\\./.test(versionString)) {\n throw new UnsupportedFeatureError(`Aera: unsupported contract version ${versionString}`);\n }\n return versionString.startsWith('2.') ? ContractVersion.V2 : ContractVersion.V1;\n } catch (error) {\n if (!isVersionUnavailableError(error)) throw error;\n\n const code = await client.getCode({ address, ...readAtBlock(options) });\n if (code === undefined || code === '0x') throw error;\n return ContractVersion.V1;\n }\n}\n\nexport async function resolveAeraRuntimeContracts(\n client: PublicClient,\n vault: EvmVaultDeployment,\n options: AeraReadOptions = {}\n): Promise<AeraRuntimeContracts> {\n if (vault.vaultType !== 'multi-depositor') {\n throw new UnimplementedFeatureError('Aera: single depositor vaults');\n }\n\n const [provisionerAddress, feeCalculatorAddress] = await Promise.all([\n client.readContract({\n address: vault.vaultAddress,\n abi: multiDepositorVaultAbi,\n functionName: 'provisioner',\n ...readAtBlock(options),\n }),\n client.readContract({\n address: vault.vaultAddress,\n abi: multiDepositorVaultAbi,\n functionName: 'feeCalculator',\n ...readAtBlock(options),\n }),\n ]);\n\n if (provisionerAddress === zeroAddress) {\n throw new UnsupportedFeatureError('Aera: vault without provisioner');\n }\n if (feeCalculatorAddress === zeroAddress) {\n throw new UnsupportedFeatureError('Aera: vault without price and fee calculator');\n }\n\n const [provisionerVersion, feeCalculatorVersion] = await Promise.all([\n resolveContractVersion(client, provisionerAddress, options),\n resolveContractVersion(client, feeCalculatorAddress, options),\n ]);\n\n return {\n provisioner: {\n address: provisionerAddress,\n version: provisionerVersion,\n },\n feeCalculator: {\n address: feeCalculatorAddress,\n version: feeCalculatorVersion,\n },\n };\n}\n\nexport async function resolveAeraTokenModeSupport(\n client: PublicClient,\n runtime: AeraRuntimeContracts,\n token: Address,\n options: AeraReadOptions & { includeSyncModes?: boolean } = {}\n): Promise<AeraTokenModeSupport> {\n if (runtime.provisioner.version === ContractVersion.V2) {\n const tokenDetailsPromise = client.readContract({\n address: runtime.provisioner.address,\n abi: provisionerV2Abi,\n functionName: 'tokensDetails',\n args: [token],\n ...readAtBlock(options),\n });\n if (options.includeSyncModes === false) {\n const tokenDetails = await tokenDetailsPromise;\n return {\n asyncDeposit: Boolean(tokenDetails[0]),\n asyncRedeem: Boolean(tokenDetails[1]),\n syncDeposit: false,\n syncRedeem: false,\n };\n }\n\n const [tokenDetails, solvingGateEnabled, solvingGate] = await Promise.all([\n tokenDetailsPromise,\n client.readContract({\n address: runtime.provisioner.address,\n abi: provisionerV2Abi,\n functionName: 'SOLVING_GATE_ENABLED',\n ...readAtBlock(options),\n }),\n client.readContract({\n address: runtime.provisioner.address,\n abi: provisionerV2Abi,\n functionName: 'solvingGate',\n ...readAtBlock(options),\n }),\n ]);\n const solvingPaused =\n solvingGateEnabled && solvingGate !== zeroAddress\n ? await client.readContract({\n address: solvingGate,\n abi: solvingGateAbi,\n functionName: 'paused',\n args: [runtime.provisioner.address, token],\n ...readAtBlock(options),\n })\n : false;\n\n return {\n asyncDeposit: Boolean(tokenDetails[0]),\n asyncRedeem: Boolean(tokenDetails[1]),\n syncDeposit: Boolean(tokenDetails[2]) && !solvingPaused,\n syncRedeem:\n Boolean(tokenDetails[3]) &&\n !solvingPaused &&\n runtime.feeCalculator.version === ContractVersion.V2,\n };\n }\n\n const tokenDetails = await client.readContract({\n address: runtime.provisioner.address,\n abi: provisionerAbi,\n functionName: 'tokensDetails',\n args: [token],\n ...readAtBlock(options),\n });\n\n return {\n asyncDeposit: Boolean(tokenDetails[0]),\n asyncRedeem: Boolean(tokenDetails[1]),\n syncDeposit: false,\n syncRedeem: false,\n };\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["tokenDetails"]
|
|
7
7
|
}
|
|
@@ -21,8 +21,9 @@ export interface EvmDepositParams {
|
|
|
21
21
|
/**
|
|
22
22
|
* Builds the ordered list of EVM transactions required to deposit into a Gauntlet vault.
|
|
23
23
|
*
|
|
24
|
-
* Returns
|
|
25
|
-
*
|
|
24
|
+
* Returns ordered transactions: ERC-20 approvals (if the allowance is insufficient),
|
|
25
|
+
* followed by the deposit or async deposit request. Some tokens require an approval
|
|
26
|
+
* of zero before a new nonzero approval. Each transaction is
|
|
26
27
|
* returned as a `PreparedTx` object ready to be signed and sent.
|
|
27
28
|
*
|
|
28
29
|
* @param client - A configured `GauntletClient` instance with an EVM public client and wallet.
|