@gauntlet-xyz/sdk 3.0.1 → 3.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (117) hide show
  1. package/README.md +34 -3
  2. package/dist/api/activity.d.ts +3 -1
  3. package/dist/api/activity.d.ts.map +1 -1
  4. package/dist/api/activityRows.d.ts +11 -0
  5. package/dist/api/activityRows.d.ts.map +1 -0
  6. package/dist/api/caip.d.ts.map +1 -1
  7. package/dist/api/client.d.ts.map +1 -1
  8. package/dist/api/decimal.d.ts.map +1 -1
  9. package/dist/api/http.d.ts.map +1 -1
  10. package/dist/api/index.js +7 -8
  11. package/dist/api/positionHistory.d.ts.map +1 -1
  12. package/dist/attribution/index.d.ts +5 -2
  13. package/dist/attribution/index.d.ts.map +1 -1
  14. package/dist/{chunk-HC2BS7MK.js → chunk-JJOLVL5V.js} +113 -6
  15. package/dist/chunk-JJOLVL5V.js.map +7 -0
  16. package/dist/{chunk-S2TTA45N.js → chunk-JRSNLXFY.js} +2 -2
  17. package/dist/{chunk-SU6JAKIA.js → chunk-MEKISE2T.js} +131 -47
  18. package/dist/chunk-MEKISE2T.js.map +7 -0
  19. package/dist/{chunk-7TA2OJUK.js → chunk-YQXTLIJA.js} +209 -96
  20. package/dist/chunk-YQXTLIJA.js.map +7 -0
  21. package/dist/cjs/api/activity.d.ts +3 -1
  22. package/dist/cjs/api/activity.d.ts.map +1 -1
  23. package/dist/cjs/api/activity.js +14 -12
  24. package/dist/cjs/api/activity.js.map +2 -2
  25. package/dist/cjs/api/activityRows.d.ts +11 -0
  26. package/dist/cjs/api/activityRows.d.ts.map +1 -0
  27. package/dist/cjs/api/activityRows.js +139 -0
  28. package/dist/cjs/api/activityRows.js.map +7 -0
  29. package/dist/cjs/api/caip.d.ts.map +1 -1
  30. package/dist/cjs/api/caip.js +3 -1
  31. package/dist/cjs/api/caip.js.map +2 -2
  32. package/dist/cjs/api/client.d.ts.map +1 -1
  33. package/dist/cjs/api/client.js +29 -1
  34. package/dist/cjs/api/client.js.map +2 -2
  35. package/dist/cjs/api/decimal.d.ts.map +1 -1
  36. package/dist/cjs/api/decimal.js +1 -0
  37. package/dist/cjs/api/decimal.js.map +2 -2
  38. package/dist/cjs/api/http.d.ts.map +1 -1
  39. package/dist/cjs/api/http.js +1 -0
  40. package/dist/cjs/api/http.js.map +2 -2
  41. package/dist/cjs/api/positionHistory.d.ts.map +1 -1
  42. package/dist/cjs/api/positionHistory.js +17 -4
  43. package/dist/cjs/api/positionHistory.js.map +2 -2
  44. package/dist/cjs/attribution/index.d.ts +5 -2
  45. package/dist/cjs/attribution/index.d.ts.map +1 -1
  46. package/dist/cjs/attribution/index.js +3 -1
  47. package/dist/cjs/attribution/index.js.map +2 -2
  48. package/dist/cjs/evm/adapters/aera.d.ts.map +1 -1
  49. package/dist/cjs/evm/adapters/aera.js +16 -7
  50. package/dist/cjs/evm/adapters/aera.js.map +2 -2
  51. package/dist/cjs/evm/adapters/types.d.ts +1 -0
  52. package/dist/cjs/evm/adapters/types.d.ts.map +1 -1
  53. package/dist/cjs/evm/adapters/types.js.map +1 -1
  54. package/dist/cjs/evm/aeraContracts.d.ts.map +1 -1
  55. package/dist/cjs/evm/aeraContracts.js +21 -11
  56. package/dist/cjs/evm/aeraContracts.js.map +2 -2
  57. package/dist/cjs/evm/deposit.d.ts +3 -2
  58. package/dist/cjs/evm/deposit.d.ts.map +1 -1
  59. package/dist/cjs/evm/deposit.js +40 -10
  60. package/dist/cjs/evm/deposit.js.map +2 -2
  61. package/dist/cjs/evm/depositQuote.d.ts.map +1 -1
  62. package/dist/cjs/evm/depositQuote.js +1 -0
  63. package/dist/cjs/evm/depositQuote.js.map +2 -2
  64. package/dist/cjs/evm/depositReceiverApproval.d.ts.map +1 -1
  65. package/dist/cjs/evm/depositReceiverApproval.js +14 -9
  66. package/dist/cjs/evm/depositReceiverApproval.js.map +2 -2
  67. package/dist/cjs/evm/userCurrentBalance.d.ts +15 -1
  68. package/dist/cjs/evm/userCurrentBalance.d.ts.map +1 -1
  69. package/dist/cjs/evm/userCurrentBalance.js +94 -51
  70. package/dist/cjs/evm/userCurrentBalance.js.map +2 -2
  71. package/dist/cjs/evm/withdraw.d.ts +2 -0
  72. package/dist/cjs/evm/withdraw.d.ts.map +1 -1
  73. package/dist/cjs/evm/withdraw.js +14 -1
  74. package/dist/cjs/evm/withdraw.js.map +2 -2
  75. package/dist/cjs/evm/withdrawQuote.d.ts.map +1 -1
  76. package/dist/cjs/evm/withdrawQuote.js +1 -0
  77. package/dist/cjs/evm/withdrawQuote.js.map +2 -2
  78. package/dist/evm/adapters/aera.d.ts.map +1 -1
  79. package/dist/evm/adapters/types.d.ts +1 -0
  80. package/dist/evm/adapters/types.d.ts.map +1 -1
  81. package/dist/evm/aeraContracts.d.ts.map +1 -1
  82. package/dist/evm/deposit.d.ts +3 -2
  83. package/dist/evm/deposit.d.ts.map +1 -1
  84. package/dist/evm/depositQuote.d.ts.map +1 -1
  85. package/dist/evm/depositReceiverApproval.d.ts.map +1 -1
  86. package/dist/evm/index.js +6 -8
  87. package/dist/evm/userCurrentBalance.d.ts +15 -1
  88. package/dist/evm/userCurrentBalance.d.ts.map +1 -1
  89. package/dist/evm/withdraw.d.ts +2 -0
  90. package/dist/evm/withdraw.d.ts.map +1 -1
  91. package/dist/evm/withdrawQuote.d.ts.map +1 -1
  92. package/dist/index.js +11 -13
  93. package/dist/privy/index.js +2 -2
  94. package/package.json +1 -1
  95. package/src/api/activity.ts +18 -15
  96. package/src/api/activityRows.ts +143 -0
  97. package/src/api/caip.ts +3 -1
  98. package/src/api/client.ts +36 -1
  99. package/src/api/decimal.ts +1 -0
  100. package/src/api/http.ts +1 -0
  101. package/src/api/positionHistory.ts +20 -5
  102. package/src/attribution/index.ts +6 -2
  103. package/src/evm/adapters/aera.ts +26 -8
  104. package/src/evm/adapters/types.ts +1 -0
  105. package/src/evm/aeraContracts.ts +29 -14
  106. package/src/evm/deposit.ts +43 -12
  107. package/src/evm/depositQuote.ts +1 -0
  108. package/src/evm/depositReceiverApproval.ts +14 -9
  109. package/src/evm/userCurrentBalance.ts +144 -60
  110. package/src/evm/withdraw.ts +20 -1
  111. package/src/evm/withdrawQuote.ts +1 -0
  112. package/dist/chunk-7TA2OJUK.js.map +0 -7
  113. package/dist/chunk-HC2BS7MK.js.map +0 -7
  114. package/dist/chunk-STIV2CC4.js +0 -57
  115. package/dist/chunk-STIV2CC4.js.map +0 -7
  116. package/dist/chunk-SU6JAKIA.js.map +0 -7
  117. /package/dist/{chunk-S2TTA45N.js.map → chunk-JRSNLXFY.js.map} +0 -0
@@ -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":"AACA,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,CAmG1E;AAED;;;;;GAKG;AACH,wBAAsB,kBAAkB,CACtC,GAAG,EAAE,WAAW,EAChB,aAAa,EAAE,MAAM,EACrB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,eAAe,CAAC,CAO1B"}
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 = [...rows].sort((a, b) => a.block_timestamp - b.block_timestamp);
39
- const token = ordered.find((r) => r.assets_delta.token)?.assets_delta.token ?? null;
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
- if (row.request_hash != null) pendingDepositByHash.delete(row.request_hash);
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
- if (row.request_hash != null) pendingRedeemByHash.delete(row.request_hash);
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 = [...rows].sort((a, b) => a.block_timestamp - b.block_timestamp);\n const token = ordered.find((r) => r.assets_delta.token)?.assets_delta.token ?? null;\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 // Row carries the unwound request as a negative delta.\n pendingDepositAssets += assetsDelta;\n if (row.request_hash != null) 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 pendingRedeemShares -= sharesDelta;\n if (row.request_hash != null) 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 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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",
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;CACZ,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,GAClB,OAAO,CAAC,UAAU,CAAC,CAoBrB"}
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;AAsBlC,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,aACqB;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,MAAM;AAAA,IACR;AAAA,IACA,IAAI;AAAA,MACF,GAAG;AAAA,MACH,aAAa;AAAA,IACf;AAAA,EACF;AACF;",
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,kBAgWzB,CAAC"}
1
+ {"version":3,"file":"aera.d.ts","sourceRoot":"","sources":["../../../../src/evm/adapters/aera.ts"],"names":[],"mappings":"AAmBA,OAAO,KAAK,EACV,kBAAkB,EAMnB,mBAAgB;AACjB,OAAO,KAAK,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,MAAM,CAAC;AAWlD,eAAO,MAAM,yBAAyB,iBACtB,YAAY,eACb,MAAM,gBACL,OAAO,gBACP,OAAO,gCAmBtB,CAAC;AAEF,eAAO,MAAM,yBAAyB,iBACtB,YAAY,eACb,MAAM,gBACL,OAAO,gBACP,OAAO,gCAiBtB,CAAC;AAiIF,eAAO,MAAM,WAAW,EAAE,kBAkXzB,CAAC"}
@@ -365,16 +365,25 @@ const aeraAdapter = {
365
365
  } else {
366
366
  throw new import_errors.InvalidWithdrawParamsError();
367
367
  }
368
- const tokenOutBeforeTip = await getAsyncRedeemTokenOut(
369
- publicClient,
370
- runtime,
371
- vault.vaultAddress,
372
- asset.address,
373
- shares
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)(subtractSolverTip(tokenOutBeforeTip, solverTip), slippageBps);
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
  }
@@ -46,6 +46,7 @@ export type AdapterWithdrawParams = {
46
46
  maxPriceAge?: bigint;
47
47
  aeraRuntime?: AeraRuntimeContracts;
48
48
  syncWithdrawQuote?: SyncWithdrawQuoteBounds;
49
+ maxShares?: bigint;
49
50
  } & ({
50
51
  shares: bigint;
51
52
  amount?: never;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/evm/adapters/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/evm/adapters/types.ts"],"names":[],"mappings":"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"}
@@ -1,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;AA4BnE,MAAM,WAAW,oBAAoB;IACnC,WAAW,EAAE;QACX,OAAO,EAAE,OAAO,CAAC;QACjB,OAAO,EAAE,eAAe,CAAC;KAC1B,CAAC;IACF,aAAa,EAAE;QACb,OAAO,EAAE,OAAO,CAAC;QACjB,OAAO,EAAE,eAAe,CAAC;KAC1B,CAAC;CACH;AAED,MAAM,WAAW,oBAAoB;IACnC,YAAY,EAAE,OAAO,CAAC;IACtB,WAAW,EAAE,OAAO,CAAC;IACrB,WAAW,EAAE,OAAO,CAAC;IACrB,UAAU,EAAE,OAAO,CAAC;CACrB;AAED,wBAAgB,4BAA4B,CAAC,OAAO,EAAE,oBAAoB,GAAG,IAAI,CAOhF;AAED,MAAM,MAAM,eAAe,GAAG;IAC5B,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,CAAC;AAEF,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,CAE7E;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,CAE3E;AA0BD,MAAM,MAAM,2BAA2B,CAAC,CAAC,SAAS,MAAM,IAAI,qBAAqB,CAC/E,OAAO,sBAAsB,EAC7B,CAAC,EACD,OAAO,CACR,CAAC;AAEF,wBAAgB,sBAAsB,CAAC,CAAC,SAAS,MAAM,EACrD,MAAM,EAAE,CAAC,EACT,YAAY,EAAE,OAAO,GACpB,2BAA2B,CAAC,CAAC,CAAC,CAMhC;AAED,wBAAsB,sBAAsB,CAC1C,MAAM,EAAE,YAAY,EACpB,OAAO,EAAE,OAAO,EAChB,OAAO,GAAE,eAAoB,GAC5B,OAAO,CAAC,eAAe,CAAC,CAsB1B;AAED,wBAAsB,2BAA2B,CAC/C,MAAM,EAAE,YAAY,EACpB,KAAK,EAAE,kBAAkB,EACzB,OAAO,GAAE,eAAoB,GAC5B,OAAO,CAAC,oBAAoB,CAAC,CA0C/B;AAED,wBAAsB,2BAA2B,CAC/C,MAAM,EAAE,YAAY,EACpB,OAAO,EAAE,oBAAoB,EAC7B,KAAK,EAAE,OAAO,EACd,OAAO,GAAE,eAAe,GAAG;IAAE,gBAAgB,CAAC,EAAE,OAAO,CAAA;CAAO,GAC7D,OAAO,CAAC,oBAAoB,CAAC,CAsE/B"}
1
+ {"version":3,"file":"aeraContracts.d.ts","sourceRoot":"","sources":["../../../src/evm/aeraContracts.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,KAAK,OAAO,EACZ,KAAK,MAAM,EACX,KAAK,qBAAqB,EAC1B,KAAK,YAAY,EAGlB,MAAM,MAAM,CAAC;AAEd,OAAO,EAAE,sBAAsB,EAAE,sCAAmC;AAIpE,OAAO,EAAE,eAAe,EAAE,KAAK,kBAAkB,EAAE,mBAAgB;AA0BnE,MAAM,WAAW,oBAAoB;IACnC,WAAW,EAAE;QACX,OAAO,EAAE,OAAO,CAAC;QACjB,OAAO,EAAE,eAAe,CAAC;KAC1B,CAAC;IACF,aAAa,EAAE;QACb,OAAO,EAAE,OAAO,CAAC;QACjB,OAAO,EAAE,eAAe,CAAC;KAC1B,CAAC;CACH;AAED,MAAM,WAAW,oBAAoB;IACnC,YAAY,EAAE,OAAO,CAAC;IACtB,WAAW,EAAE,OAAO,CAAC;IACrB,WAAW,EAAE,OAAO,CAAC;IACrB,UAAU,EAAE,OAAO,CAAC;CACrB;AAED,wBAAgB,4BAA4B,CAAC,OAAO,EAAE,oBAAoB,GAAG,IAAI,CAOhF;AAED,MAAM,MAAM,eAAe,GAAG;IAC5B,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,CAAC;AAEF,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,CAE7E;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,CAE3E;AAsBD,MAAM,MAAM,2BAA2B,CAAC,CAAC,SAAS,MAAM,IAAI,qBAAqB,CAC/E,OAAO,sBAAsB,EAC7B,CAAC,EACD,OAAO,CACR,CAAC;AAEF,wBAAgB,sBAAsB,CAAC,CAAC,SAAS,MAAM,EACrD,MAAM,EAAE,CAAC,EACT,YAAY,EAAE,OAAO,GACpB,2BAA2B,CAAC,CAAC,CAAC,CAMhC;AAKD,wBAAsB,sBAAsB,CAC1C,MAAM,EAAE,YAAY,EACpB,OAAO,EAAE,OAAO,EAChB,OAAO,GAAE,eAAoB,GAC5B,OAAO,CAAC,eAAe,CAAC,CAe1B;AA2BD,wBAAsB,2BAA2B,CAC/C,MAAM,EAAE,YAAY,EACpB,KAAK,EAAE,kBAAkB,EACzB,OAAO,GAAE,eAAoB,GAC5B,OAAO,CAAC,oBAAoB,CAAC,CA0C/B;AAED,wBAAsB,2BAA2B,CAC/C,MAAM,EAAE,YAAY,EACpB,OAAO,EAAE,oBAAoB,EAC7B,KAAK,EAAE,OAAO,EACd,OAAO,GAAE,eAAe,GAAG;IAAE,gBAAgB,CAAC,EAAE,OAAO,CAAA;CAAO,GAC7D,OAAO,CAAC,oBAAoB,CAAC,CAsE/B"}
@@ -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
- const cacheKey = contractVersionCacheKey(client, address);
96
- const cached = contractVersionCache.get(cacheKey);
97
- if (cached) return cached;
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
- const version = versionString.startsWith("2.") ? import_types.ContractVersion.V2 : import_types.ContractVersion.V1;
106
- contractVersionCache.set(cacheKey, version);
107
- return version;
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
- contractVersionCache.set(cacheKey, import_types.ContractVersion.V1);
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 contractVersionCache = new Map<string, ContractVersion>();\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 contractVersionCacheKey(client: PublicClient, address: Address): string {\n return `${client.chain?.id ?? 'unknown'}:${address.toLowerCase()}`;\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\nexport async function resolveContractVersion(\n client: PublicClient,\n address: Address,\n options: AeraReadOptions = {}\n): Promise<ContractVersion> {\n const cacheKey = contractVersionCacheKey(client, address);\n const cached = contractVersionCache.get(cacheKey);\n if (cached) return cached;\n\n try {\n const versionString = await client.readContract({\n address,\n abi: contractVersionAbi,\n functionName: 'version',\n ...readAtBlock(options),\n });\n const version = versionString.startsWith('2.') ? ContractVersion.V2 : ContractVersion.V1;\n contractVersionCache.set(cacheKey, version);\n\n return version;\n } catch (error) {\n if (!isVersionUnavailableError(error)) throw error;\n\n contractVersionCache.set(cacheKey, ContractVersion.V1);\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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",
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 one or two transactions: an ERC-20 approval (only if the current allowance is
25
- * insufficient) followed by the deposit or async deposit request. Each transaction is
24
+ * Returns ordered transactions: ERC-20 approvals (if the allowance is insufficient),
25
+ * followed by the deposit or async deposit request. Some tokens require an approval
26
+ * of zero before a new nonzero approval. Each transaction is
26
27
  * returned as a `PreparedTx` object ready to be signed and sent.
27
28
  *
28
29
  * @param client - A configured `GauntletClient` instance with an EVM public client and wallet.