@spicenet-io/spiceflow-core 0.4.1 → 0.4.2

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 (59) hide show
  1. package/dist/abis/delegate.d.ts +419 -0
  2. package/dist/abis/delegate.d.ts.map +1 -0
  3. package/dist/abis/erc20.d.ts +130 -0
  4. package/dist/abis/erc20.d.ts.map +1 -0
  5. package/dist/abis/index.d.ts +8 -0
  6. package/dist/abis/index.d.ts.map +1 -0
  7. package/dist/abis/spicenet.d.ts +116 -0
  8. package/dist/abis/spicenet.d.ts.map +1 -0
  9. package/dist/abis/spicenetEscrow.d.ts +771 -0
  10. package/dist/abis/spicenetEscrow.d.ts.map +1 -0
  11. package/dist/abis/spicenetWalletManager.d.ts +2 -0
  12. package/dist/abis/spicenetWalletManager.d.ts.map +1 -0
  13. package/dist/abis/uniV3.d.ts +93 -0
  14. package/dist/abis/uniV3.d.ts.map +1 -0
  15. package/dist/abis/wcbtc.d.ts +58 -0
  16. package/dist/abis/wcbtc.d.ts.map +1 -0
  17. package/dist/api.d.ts +161 -0
  18. package/dist/api.d.ts.map +1 -0
  19. package/dist/authorization.d.ts +44 -0
  20. package/dist/authorization.d.ts.map +1 -0
  21. package/dist/chains/index.d.ts +26 -0
  22. package/dist/chains/index.d.ts.map +1 -0
  23. package/dist/chains/list.d.ts +3 -0
  24. package/dist/chains/list.d.ts.map +1 -0
  25. package/dist/chains/types.d.ts +31 -0
  26. package/dist/chains/types.d.ts.map +1 -0
  27. package/dist/config.d.ts +9 -0
  28. package/dist/config.d.ts.map +1 -0
  29. package/dist/constants.d.ts +7 -0
  30. package/dist/constants.d.ts.map +1 -0
  31. package/dist/core.d.ts +49 -0
  32. package/dist/core.d.ts.map +1 -0
  33. package/dist/http.d.ts +17 -0
  34. package/dist/http.d.ts.map +1 -0
  35. package/dist/index.cjs +2713 -0
  36. package/dist/index.d.ts +16 -0
  37. package/dist/index.d.ts.map +1 -0
  38. package/dist/index.js +2624 -0
  39. package/dist/logos.d.ts +14 -0
  40. package/dist/logos.d.ts.map +1 -0
  41. package/dist/relayer.d.ts +22 -0
  42. package/dist/relayer.d.ts.map +1 -0
  43. package/dist/rfqt.d.ts +17 -0
  44. package/dist/rfqt.d.ts.map +1 -0
  45. package/dist/status.d.ts +10 -0
  46. package/dist/status.d.ts.map +1 -0
  47. package/dist/swap.d.ts +31 -0
  48. package/dist/swap.d.ts.map +1 -0
  49. package/dist/tokens/index.d.ts +17 -0
  50. package/dist/tokens/index.d.ts.map +1 -0
  51. package/dist/tokens/list.d.ts +3 -0
  52. package/dist/tokens/list.d.ts.map +1 -0
  53. package/dist/tokens/types.d.ts +33 -0
  54. package/dist/tokens/types.d.ts.map +1 -0
  55. package/dist/types.d.ts +66 -0
  56. package/dist/types.d.ts.map +1 -0
  57. package/dist/utils.d.ts +11 -0
  58. package/dist/utils.d.ts.map +1 -0
  59. package/package.json +1 -1
package/dist/index.cjs ADDED
@@ -0,0 +1,2713 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
3
+ var __getOwnPropNames = Object.getOwnPropertyNames;
4
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
5
+ var __export = (target, all) => {
6
+ for (var name in all)
7
+ __defProp(target, name, { get: all[name], enumerable: true });
8
+ };
9
+ var __copyProps = (to, from, except, desc) => {
10
+ if (from && typeof from === "object" || typeof from === "function") {
11
+ for (let key of __getOwnPropNames(from))
12
+ if (!__hasOwnProp.call(to, key) && key !== except)
13
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
14
+ }
15
+ return to;
16
+ };
17
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
18
+
19
+ // src/index.ts
20
+ var index_exports = {};
21
+ __export(index_exports, {
22
+ CHAINS: () => CHAINS,
23
+ ChainBatchHashAbi: () => ChainBatchHashAbi,
24
+ DELEGATE_ABI: () => DELEGATE_ABI,
25
+ ERC20_ABI: () => ERC20_ABI,
26
+ HttpError: () => HttpError,
27
+ IntentHashAbi: () => IntentHashAbi,
28
+ NATIVE_TOKEN_ADDRESS: () => NATIVE_TOKEN_ADDRESS,
29
+ SPICENET_NATIVE_CHAIN_ID: () => SPICENET_NATIVE_CHAIN_ID,
30
+ SPICE_COMBINED_FEE_RECIPIENT: () => SPICE_COMBINED_FEE_RECIPIENT,
31
+ SPICE_GAS_FEE_RECIPIENT: () => SPICE_GAS_FEE_RECIPIENT,
32
+ SPICE_PLATFORM_FEE_RECIPIENT: () => SPICE_PLATFORM_FEE_RECIPIENT,
33
+ SPICE_SOLVER_ADDRESS: () => SPICE_SOLVER_ADDRESS,
34
+ STARKNET_MAINNET_CHAIN_ID: () => STARKNET_MAINNET_CHAIN_ID,
35
+ SpiceFlowCore: () => SpiceFlowCore,
36
+ TOKENS: () => TOKENS,
37
+ VIEM_CHAINS: () => VIEM_CHAINS,
38
+ WCBTC_ABI: () => WCBTC_ABI,
39
+ ZERO_ADDRESS: () => ZERO_ADDRESS,
40
+ applySlippage: () => applySlippage,
41
+ areEquivalent: () => areEquivalent,
42
+ buildUniV3SwapCalls: () => buildUniV3SwapCalls,
43
+ convertAmountBetweenDecimals: () => convertAmountBetweenDecimals,
44
+ fetchWithRetry: () => fetchWithRetry,
45
+ formatTokenAmount: () => formatTokenAmount,
46
+ getAccountNonce: () => getAccountNonce,
47
+ getAllChainsByNetwork: () => getAllChainsByNetwork,
48
+ getChainIdsByNetwork: () => getChainIdsByNetwork,
49
+ getChainMeta: () => getChainMeta,
50
+ getChainsByNetwork: () => getChainsByNetwork,
51
+ getDelegateContract: () => getDelegateContract,
52
+ getDeployment: () => getDeployment,
53
+ getEquivalenceGroup: () => getEquivalenceGroup,
54
+ getEquivalentAddresses: () => getEquivalentAddresses,
55
+ getEscrowContract: () => getEscrowContract,
56
+ getEscrowContractAddress: () => getEscrowContractAddress,
57
+ getIntentHash: () => getIntentHash,
58
+ getIntentStepStatus: () => getIntentStepStatus,
59
+ getMainnetChains: () => getMainnetChains,
60
+ getRecentBlock: () => getRecentBlock,
61
+ getTestnetChains: () => getTestnetChains,
62
+ getTokenByAddress: () => getTokenByAddress,
63
+ getTokenBySymbol: () => getTokenBySymbol,
64
+ getTokenDefinition: () => getTokenDefinition,
65
+ getTokensForChain: () => getTokensForChain,
66
+ getViemChain: () => getViemChain,
67
+ hashChainBatches: () => hashChainBatches,
68
+ isBtcDenominated: () => isBtcDenominated,
69
+ isNativeToken: () => isNativeToken,
70
+ isSpicenetChainId: () => isSpicenetChainId,
71
+ isStarknetChain: () => isStarknetChain,
72
+ isUsdDenominated: () => isUsdDenominated,
73
+ normalizeNativeTokenAddress: () => normalizeNativeTokenAddress,
74
+ prepareRFQT: () => prepareRFQT,
75
+ requireTokenBySymbol: () => requireTokenBySymbol,
76
+ requireViemChain: () => requireViemChain,
77
+ resolveTokenRef: () => resolveTokenRef,
78
+ spicenetAbi: () => spicenetAbi,
79
+ spicenetEscrowAbi: () => spicenetEscrowAbi,
80
+ spicenetWalletManagerAbi: () => spicenetEscrowAbi,
81
+ submitTransaction: () => submitTransaction,
82
+ truncateAddress: () => truncateAddress,
83
+ uniV3QuoterV2Abi: () => uniV3QuoterV2Abi,
84
+ uniV3SwapRouterAbi: () => uniV3SwapRouterAbi,
85
+ withRetry: () => withRetry
86
+ });
87
+ module.exports = __toCommonJS(index_exports);
88
+
89
+ // src/config.ts
90
+ var SPICENET_NATIVE_CHAIN_ID = 4321;
91
+ function isSpicenetChainId(chainId) {
92
+ return BigInt(chainId) === BigInt(SPICENET_NATIVE_CHAIN_ID);
93
+ }
94
+
95
+ // src/authorization.ts
96
+ var import_viem = require("viem");
97
+ var CallComponents = [
98
+ { name: "to", type: "address" },
99
+ { name: "value", type: "uint256" },
100
+ { name: "data", type: "bytes" }
101
+ ];
102
+ var ChainBatchHashAbi = [
103
+ { name: "chainId", type: "uint256" },
104
+ { name: "calls", type: "tuple[]", components: CallComponents }
105
+ ];
106
+ var IntentHashAbi = [
107
+ { type: "string" },
108
+ { type: "uint256" },
109
+ { type: "uint256" },
110
+ { type: "bytes32[]" }
111
+ ];
112
+ function hashChainBatches(chainCalls) {
113
+ return chainCalls.map(({ chainId, calls }) => {
114
+ const cid = BigInt(chainId);
115
+ const hash = (0, import_viem.keccak256)(
116
+ (0, import_viem.encodeAbiParameters)(ChainBatchHashAbi, [cid, calls])
117
+ );
118
+ return { hash, chainId: cid, calls };
119
+ });
120
+ }
121
+ function getIntentHash(signatureType, nbf, exp, chainBatches) {
122
+ const hashes = chainBatches.map(({ hash }) => hash);
123
+ return (0, import_viem.keccak256)(
124
+ (0, import_viem.encodeAbiParameters)(IntentHashAbi, [signatureType, nbf, exp, hashes])
125
+ );
126
+ }
127
+ async function getAccountNonce(address, publicClient) {
128
+ return await publicClient.getTransactionCount({ address, blockTag: "pending" });
129
+ }
130
+ async function getRecentBlock(publicClient) {
131
+ return await publicClient.getBlockNumber();
132
+ }
133
+
134
+ // src/http.ts
135
+ var HttpError = class extends Error {
136
+ constructor(message, status, code, body) {
137
+ super(message);
138
+ this.status = status;
139
+ this.code = code;
140
+ this.body = body;
141
+ }
142
+ };
143
+ function sleep(ms) {
144
+ return new Promise((r) => setTimeout(r, ms));
145
+ }
146
+ async function fetchWithRetry(url, init = {}, opts = {}) {
147
+ const {
148
+ retries = 3,
149
+ backoffMs = 300,
150
+ maxBackoffMs = 5e3,
151
+ jitter = true,
152
+ idempotencyKey,
153
+ retryOn = (e) => e instanceof Error || e instanceof Response && (e.status >= 500 || e.status === 429),
154
+ signal
155
+ } = opts;
156
+ const headers = new Headers(init.headers || {});
157
+ if (idempotencyKey) headers.set("Idempotency-Key", idempotencyKey);
158
+ const reqInit = { ...init, headers, signal };
159
+ let attempt = 0;
160
+ let lastErr;
161
+ while (attempt <= retries) {
162
+ try {
163
+ const res = await fetch(url, reqInit);
164
+ if (!res.ok && retryOn(res) && attempt < retries) {
165
+ attempt++;
166
+ const base = Math.min(maxBackoffMs, backoffMs * 2 ** (attempt - 1));
167
+ const delay = jitter ? Math.floor(base * (0.7 + Math.random() * 0.6)) : base;
168
+ await sleep(delay);
169
+ continue;
170
+ }
171
+ if (!res.ok) {
172
+ let body;
173
+ try {
174
+ body = await res.json();
175
+ } catch {
176
+ body = await res.text();
177
+ }
178
+ throw new HttpError(`HTTP ${res.status}`, res.status, body && body.code || void 0, body);
179
+ }
180
+ return res;
181
+ } catch (e) {
182
+ if (attempt >= retries || !retryOn(e)) throw e;
183
+ attempt++;
184
+ const base = Math.min(maxBackoffMs, backoffMs * 2 ** (attempt - 1));
185
+ const delay = jitter ? Math.floor(base * (0.7 + Math.random() * 0.6)) : base;
186
+ await sleep(delay);
187
+ lastErr = e;
188
+ }
189
+ }
190
+ throw lastErr;
191
+ }
192
+
193
+ // src/relayer.ts
194
+ async function submitTransaction(baseUrl, request, retry) {
195
+ const res = await fetchWithRetry(`${baseUrl}/transaction/submit`, {
196
+ method: "POST",
197
+ headers: { "Content-Type": "application/json" },
198
+ body: JSON.stringify(request, (k, v) => typeof v === "bigint" ? v.toString() : v)
199
+ }, retry);
200
+ const result = await res.json();
201
+ return { hash: result.hash, intentId: result.intentId || request.intentAuthorization.signature };
202
+ }
203
+
204
+ // src/core.ts
205
+ var SpiceFlowCore = class {
206
+ constructor(cfg, signers) {
207
+ this.cfg = cfg;
208
+ this.signers = signers;
209
+ }
210
+ getConfig() {
211
+ return this.cfg;
212
+ }
213
+ getClient(chainId) {
214
+ return this.cfg.publicClientForChain(chainId);
215
+ }
216
+ async signDelegations(params) {
217
+ const out = [];
218
+ for (const d of params.delegations) {
219
+ const client = this.getClient(d.chainId);
220
+ const nonce = typeof d.nonce === "number" ? d.nonce : await getAccountNonce(params.user, client);
221
+ const auth = await this.signers.authorizationSigner({ contractAddress: d.contractAddress, chainId: d.chainId, nonce, address: params.user });
222
+ delete auth.v;
223
+ out.push(auth);
224
+ }
225
+ return out;
226
+ }
227
+ async buildChainBatches(nbf, exp, callsByChain, signatureType = "ecdsa") {
228
+ const chainBatches = hashChainBatches(
229
+ callsByChain.map((c) => ({ chainId: c.chainId, calls: c.calls }))
230
+ );
231
+ const digest = getIntentHash(signatureType, nbf, exp, chainBatches);
232
+ return { chainBatches, digest };
233
+ }
234
+ async signIntent(digest) {
235
+ return this.signers.messageSigner(digest);
236
+ }
237
+ async submitIntent(req) {
238
+ const signatureType = req.signatureType ?? "ecdsa";
239
+ const signature = req.signature ?? await this.signIntent(getIntentHash(signatureType, req.nbf, req.exp, req.chainBatches));
240
+ const resp = await submitTransaction(this.cfg.txApiUrl, {
241
+ tokenAddress: req.tokenAddress,
242
+ tokenAmount: req.tokenAmount,
243
+ address: req.user,
244
+ authorization: req.authorization,
245
+ intentAuthorization: { signature, chainBatches: req.chainBatches }
246
+ });
247
+ return resp;
248
+ }
249
+ };
250
+
251
+ // src/status.ts
252
+ async function getIntentStepStatus(txApiUrl, intentId, stepId, retry) {
253
+ const res = await fetchWithRetry(`${txApiUrl}/intent/${intentId}/step/${stepId}/status`, {}, retry);
254
+ return res.json();
255
+ }
256
+
257
+ // src/rfqt.ts
258
+ async function prepareRFQT(txApiUrl, request, retry) {
259
+ const res = await fetchWithRetry(`${txApiUrl}/rfqt`, {
260
+ method: "POST",
261
+ headers: { "Content-Type": "application/json" },
262
+ body: JSON.stringify(request)
263
+ }, retry);
264
+ return res.json();
265
+ }
266
+
267
+ // src/logos.ts
268
+ var logo_arb = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAMAAACdt4HsAAAAjVBMVEVMaXEgMkwgMk0fMUogMkwgMkwgMkwgMUsNOE0gMUwhMk0fMk0fMUsgM00gMkz///8hM04iNVESqf78/P0RIz8hKkEYKkURsv8Rrv8yQ1vq7O7W2d4fQGBXZHhrdohFVGoVjtMbWIOeprETm+XEyM8YdK0SpfQaZZYdS3AWgb+mrbh5hJSKlKG0usOUnakhSCyqAAAADnRSTlMAj2cY0Oqw/QP6KkyHd87n3EEAAAAJcEhZcwAACxMAAAsTAQCanBgAAAPZSURBVHjarZfbeqowEIVBQUBsmEBArHiuVu3h/R9vz4QQIMHD/mwuWmrJuNbkz2TiONYIQ/oxjWcTz48Yi3xvMounYfOfR4NeCmPXizjnAAwHAD5GnhuHz4TAF8ZvHk6BIIoCJkcQRAF94r2N5Qv3v37s+gBBoOa2Az8B8GfjuyJCJxz5+N3W7CYGcH8U3hYROlMPp7M7A0N40xsRUNoo4sHd+aSCR6NBG2EYujx6MF2JcEM7Ajqb8Ig9NSI+GUjE8/NVBFOAOZ/owbXvPPQj9CWEjmvOLwSNApoHU4PbjYD554Exf33d7/fXdVGs5MOXmUo+aiPg+vv95Ydi8Z4kSZb8Cr7EX1lyLcBYC7/DAyawL4CLrySjsREr+ZCsjAAoQSeSDBgLAMWH/N6PorjKhyUwsJZCmxgbBnD+JpMOvoS2EuSmBPDHSsDMFMDFd0IR3hdiLR+SjTjvzAgRn9USUIBJCtSZ+ykaKyy/HCzMawmh8wZWBlaJFL4W2go/lGfbxBtJCD1zB4OoM4cOGiv5riyPdgCPLMSmAWAqc3uhreSXsjxwa1NAjAFcbglQmVsJbaU6pWlppTFAoIccFD/12nPx2zj4nKfp/DLoYWpuYo3xd4PxXgTbEhWcKpumqRObDiTGFGFTOyAr5AAlfNoeYpuiIYwZKUjL7RBLE/4IY7Qic5CmpyqwC4uZQwvjbIMb8YYHzKJjcWxhXDAO+WUuPdg0O09gXG2rfCc92DhHDnsCY5SOe4E8WDgzZwDjrI9xcJlvmfJg42xYuIXxGXeT9GDiHBlJ1BiD2HcwRunKg4EzJrG3jIhxptZeWyGMUXp+lB76ONMy9kDqYKytnJV0+dtAgUDqodzBuLFSfzNKH8KZUO5upiGMlfRDpXBOq04E2kzd7dwWAG2laKTv8upU2h6m/YICzTmmrWDDtVXpt3Gui2Jb0jTGq041Br0TGxRanGVJ6xRVaApAuyNJgd6JNs6yqHY8kINMnmMNxtRg5FslXS3Itu8AD5Z2HRb7TDrQGMsA9U5EnM9lOj8duXGwdI427EY2P8kykBjTjiTqqJo00g/zS5UbR1vvcAVeiPVatAeL/FDvxPxzl+cA5uHaO96xJyoIY8qhaipApR9RCNrp7fFuNhj4yuLaVGMFGKZ/nh4rBjDYYOBC9EozpeIjoWqs/sb0l9tz3jtWsMVxbjZZmIpivdw0bRHk5wOZv9Nk2W0eiK5cYDnA7TZvqNFk3CyW9xrNoVb3UbNsddsvNtt/0e5THuDJC8eNK8trV57XL11/cO2rL56zFy6eKsQLV98/uHz/9/X/H1O71f+Xu2swAAAAAElFTkSuQmCC";
269
+ var logo_base = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAMAAACdt4HsAAAATlBMVEVMaXEAUPQAT+wAT+0AT+8AUPUASdgAUf4ASN8AUPcAUPUASf8AUv////8BVf8ASv/9/v8sbf/0+P9fkf9Efv/U4f+80f8aYf92of+Xt//AWxqQAAAADHRSTlMAklRFcb8d/ATgpvy0jdC4AAAACXBIWXMAAAsTAAALEwEAmpwYAAACQElEQVR42q1X27KDIAy0CgKOKN7b///REzwKQVHppPvQaa275AYkWXaGtB9lwV6cKwDnL1aU7o9H2LdKxlUTQHFWJknAGzLnAigigH3Ac/koITPJYO1aiPoAeAJ2MHmrAP/lyq5dR2HtUHkm5TW/rK7pu0RVXhkhs0Ld0jcJVcQVZMZg+eDtPQWhRCNYXOEVLA+01qHGImDE64KP6MCul3GwGLvF/sISZwUZ8IFej5+p1xv6+d0FElZBHv1H67fNMK1Ms2L9Ng/wGCkEcYD4e37TtkA3emPuOlpPIzJCNEEuSuUEmnaZtUFsp6H1p3FGQDZL5EKF+GOvj+xdQ08dUqi8AzniD2C8voDR/YgU8t0J6RwA/sXyZwVwQh4zAPbfrL8pdF5hy4Q3oF36e75VmFAc5SEC9fzEtw5+vAn/UeCbwBoA/Qij9zCIhq814EtoShOYW1dOthaYM+Cdwg9NYMiDRAOwCasPexVDCm9L4JBKX8+F8+CTZoBVeDsfClRFU7qA94G5g6Tt+m37XwL5sPiDhaMQ6FQLjAsC9wKD7h9wTqQVcBth6e6x+I1m9LALKC+ATvEYIEg0gfZR4MmFbogLoCCaxDSGQSSnMSikVAFcSORSJm8m8nYmHyj0I418qFKP9S8vFh25WIhX2w8uV+r1/oMGg9rixJss/U2TBW2euGnzTKTNq0URNorRRtOkNpr0Vvey2X4DhjHWbMvztHPd7tdJ7T7EQdAGDurIQx+66GMfffD8wehLH76/Hv//AJLWpkq0aQz+AAAAAElFTkSuQmCC";
270
+ var logo_cbtc = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAMAAACdt4HsAAAATlBMVEX////jcS/eXCrpkDfhaC3kezLnhTTfYSvwqj7upD3tnjvxsT/dVynbVCjsmDj9/PfytUHxrj7tt4rwxZ7lkGDtr2Dz1brpo2v58OT35NHn8bXSAAAACXBIWXMAAAsTAAALEwEAmpwYAAAC2UlEQVR42rWWi5ajIAyGQxFs7VQ6oALv/6LLRS4Bes7sOvuDlEvyGSE6A++Lgufz+X5ivZup99vXMocW4XlR1wHfFwX3i3KA70v1FyJ43P+xxh94/Fj34SyUpftns/vn4V9E8PgUweLK2S6x7zu9kkuyjz3wK3E9XKfrPlAGVcxlgeG9dgWiEah9GNcIsEqzG2jkptQ6BKxV8XVZHwakBFG7Cz9jHsGiNL7C6gaZ4Ou6KuewWxyA9TGpsF5drsLaaKG7v/exY4DbFY9dO3WAlR4h+v2o/Y9AhYMOABSVle4p5moTRMJJ2thToK7xNV1renipCkClPbXJL1cog/gj87lpU3fPeBQNKk5AsRbT3VbUwZilcWgAXJXzF9rGgdVlDg4+BsRpruv0ObQHCND1gYgdE4DTUihHpqBD6ErjlAq3ywUBuMbpe3BlreIHTmvpDIP1CfC9cLm2zV/uo+IWAwytfNwjZFGG3yAfQdDRTCtWnHgF4Jto3uDtnG/ebbGNAUwrJElzbBKv6A8RaImkf7LCgfFcdPMIloaHZe3eCu3mk1cNIKreLRF2y5uqdhMJZ9kJXD+LGpwHNk53x+jdk8A3CUhkk0hMHockbSKR6HNGwJAsTuUAlBoBLPbAAKJRAC4x3E6IDX3dNOkAJFXXVOF6R5FAhRr9sw+ULvGlysbyFmpVZaG3rHyAIPmjzImcN8Ru5ZM2MewBwatqmCl/inI0Mh2PYSQbR/MmAkImXe4KXTR6au07ACFxz7f66whqi9TeugdMYR/DERYAhKMU2zQATE0hk4L27CMQDr/aFJhOkVCDuPHZ18hlpeHINJpnQKVZGmZbgGVGzp0pGQPYJvt/ceTGBrZDgNM20NjyA2C+zb3GgHkoz+jLSB8AP9d/BNyqdrglJ+B2u82pRs31z9xNzdXlBLeLug74uqjfALxeofcK18vXVxm90tJXGMS12IT5F7wu6jLgDxzHd9wqQIUtAAAAAElFTkSuQmCC";
271
+ var logo_citrea = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAMAAACdt4HsAAAATlBMVEX////jcS/eXCrpkDfhaC3kezLnhTTfYSvwqj7upD3tnjvxsT/dVynbVCjsmDj9/PfytUHxrj7tt4rwxZ7lkGDtr2Dz1brpo2v58OT35NHn8bXSAAAACXBIWXMAAAsTAAALEwEAmpwYAAAC2UlEQVR42rWWi5ajIAyGQxFs7VQ6oALv/6LLRS4Bes7sOvuDlEvyGSE6A++Lgufz+X5ivZup99vXMocW4XlR1wHfFwX3i3KA70v1FyJ43P+xxh94/Fj34SyUpftns/vn4V9E8PgUweLK2S6x7zu9kkuyjz3wK3E9XKfrPlAGVcxlgeG9dgWiEah9GNcIsEqzG2jkptQ6BKxV8XVZHwakBFG7Cz9jHsGiNL7C6gaZ4Ou6KuewWxyA9TGpsF5drsLaaKG7v/exY4DbFY9dO3WAlR4h+v2o/Y9AhYMOABSVle4p5moTRMJJ2thToK7xNV1renipCkClPbXJL1cog/gj87lpU3fPeBQNKk5AsRbT3VbUwZilcWgAXJXzF9rGgdVlDg4+BsRpruv0ObQHCND1gYgdE4DTUihHpqBD6ErjlAq3ywUBuMbpe3BlreIHTmvpDIP1CfC9cLm2zV/uo+IWAwytfNwjZFGG3yAfQdDRTCtWnHgF4Jto3uDtnG/ebbGNAUwrJElzbBKv6A8RaImkf7LCgfFcdPMIloaHZe3eCu3mk1cNIKreLRF2y5uqdhMJZ9kJXD+LGpwHNk53x+jdk8A3CUhkk0hMHockbSKR6HNGwJAsTuUAlBoBLPbAAKJRAC4x3E6IDX3dNOkAJFXXVOF6R5FAhRr9sw+ULvGlysbyFmpVZaG3rHyAIPmjzImcN8Ru5ZM2MewBwatqmCl/inI0Mh2PYSQbR/MmAkImXe4KXTR6au07ACFxz7f66whqi9TeugdMYR/DERYAhKMU2zQATE0hk4L27CMQDr/aFJhOkVCDuPHZ18hlpeHINJpnQKVZGmZbgGVGzp0pGQPYJvt/ceTGBrZDgNM20NjyA2C+zb3GgHkoz+jLSB8AP9d/BNyqdrglJ+B2u82pRs31z9xNzdXlBLeLug74uqjfALxeofcK18vXVxm90tJXGMS12IT5F7wu6jLgDxzHd9wqQIUtAAAAAElFTkSuQmCC";
272
+ var logo_eth = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAMAAACdt4HsAAAATlBMVEVMaXFIo/VMrO1MqvNKpvNJpfNIpPRGoPRRoe5Io/RHoPT////8/v+k0fpLqv9KovVKpfw8m/R4uvdirva02fvq9P6Oxfna7P32+v/F4fwkLp0eAAAACnRSTlMA6BMrVn2o/APPAqKYHQAAAAlwSFlzAAALEwAACxMBAJqcGAAAAuJJREFUeNqtl+vWqiAQhj3kAVAhwMz7v9E9QIbJi/attj+slc3rwzDMoSiSq+/dvb41LWNl15WMtc2tjk+uLvpTXzesm6ZJKcm5VIq+dqype//wyrwvqoapScnOX5yHT0k/saa6gvDm5aSC6f5yv6ipvJCgR7dykkfjKCKn8nayjr6oW/d2nr0cRVvnFHr3+jPzIOEgemzfkOeOBlImElI1SKEvWvB6qbUEEG2qAO3l/TGOj7v8QoH4J7D6+zLa5Y4YDqvw9in/XYtxFPpagfyvOAJYncCaCtCf1cdeVKVK7R2AExgMUlBl9elADgRWLwAR+M6RtABsr8XgCSACKbwX0TOVAQgCwkIBxfpzADNsAoTATxByAJbgwxJOEc4ANgLxPEHIboEVcQkZhLARdcdRDJiniASEgAh453Jtkwd4C9BnbicLvALuASJBBoHWkIviYPcWwAg+nmuJjmEA2BGIWSEnyBpu4gawE8ggkBOgD9UsjgRihl5skA/fAHuBQTxAYiEvMrSEF8AHAULoJlakB4FS6Wa0F0AIdByAQAQ4CKQIUGAH8LkEgIAJ5IIFhFggwcGJe4CDQIrgnJhu4+JSCFrCkCC4bUwCSepV4F0Q67FQukBKQ1lrvYhAEQ8T3RZ6AEK5lsd8YubVeIl9PiBzs84GHKb0OFM2HKx5zCImVTE/tE3rQyhPiRfdPojBapJ4EXhzAcLAJRRwHEM+e1o9zk5gHp05SqwhpaGkGmKJJOw40u3pvLBInFRRWg8ZyUsYY19fDQBofV24oYzgwzE6MZMNQm1DpS1J66CybNU1U9tcRMfKtJwV1wxCcEMgmE0eIIfg+4vNBxoWhdhgwOoUUqsnwBl93yvC8uTc8OqR+HmTlWnzJB0rH4mKy6s279dGM9fqUjSMdvzGPtesw279L+16buZo8cCABg5gnxk4fh95nEL1zdBVnY1tv419cfDkaPDk14Pn76Pvfxi+/zz+/wNRN43Lkt3u4wAAAABJRU5ErkJggg==";
273
+ var logo_pharos = "data:image/jpeg;base64,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";
274
+ var logo_robinhood = "data:image/png;base64,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";
275
+ var logo_usdc = "data:image/png;base64,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";
276
+ var logo_usdg = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAAAXNSR0IArs4c6QAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAARGVYSWZNTQAqAAAACAABh2kABAAAAAEAAAAaAAAAAAADoAEAAwAAAAEAAQAAoAIABAAAAAEAAABAoAMABAAAAAEAAABAAAAAAEZRQrAAABE/SURBVHgBxVtpbF3FFT73eX22492x4zjGie04KCFx4myEtjhpWfqnLGopAdKKpdCK0v6i/QEItRKqWlVVBKIVUgmiLAGlJUAFKU0oJjSJstpJnD2OncX78uzY8W6/ft/cN/a77937NrvtSebduXNnzpxz5pwzM2fGhvyXoKo6xzUp3iygX4xUibQcqQJpPlKOVyTNEEkS8eKfMYJ8P8q7kVqQziPVIp1g3iWG52hN9yTysw7od/ZgRXWx4ZKBbGBcg/QtpNuQSpEoiHgwDTB/DbF2TTEQzFL1O45XD1ID0n6k3fh6ZFISuo/XtJmVUThTsFIRI7ZV1bkur0yWofn9SPcicbTd00zF1k1A+0HgPIX0AdJOEdfF2pquCeRnBLFR5uuyqjrfmJSxcrw+gvQQ0iKMsMHhCRxhFM0I/IRB9JeRdiC9DgbOH6vpiVkjYhbAyupsqvoWpKeRMPpe4IoZHVBEDhSGT8AX0OpVpLdqa3p6IscwXTNqilfBuYGA9UDxItJGMJ7wv2J8mmxLjr5iD9KvQcfB2iidZZwFVZiXldU5bjD8GKq9grQSCe2jk6HXG1pbDSM6fKDBBZqggcZdyA8WlKTUtzUNUSgRQcQCgMrTk3PUX0CHOZEyTobJ8+QkfpAhg/HxcZKUFC9JyQmSmBgv8XGY6FDOOqyv6vrIj0wgFJo3Hdi/iVz6vBL3YQhh2Ici5CMicVdW5xQa4v0dMD2IjsKOuh5lMhIf75LMrBTJL0yXwqIMyZ+Xrt7dKQmSkGDKf2xsQoaHxqTXMySd7f3ScrVXWpv71Du/uagV/B9WO6hdBmeG7RDGL+tqurmmCAlhBUDmwTRV/v5wlRXjHGhUTs9IlvIlc2VZ5XxZVJ4rWdkpkohRd7mmsVAzFJA5X5Y4RkcmxOMZlMuXuqW+tlnOn+kQTw9nQQohvCB8aDFdGs+EE4Lu19e99eFT+5eB8JGQFdGMhJOhjCy3rFpbLOtuWyhFN2UqFdffrNhDv2lGqQGt1/rk8IEmObz/svR034hYCKD5HfTyDGYILqhswdEHwOElo8WvkJ4AIjgaZ6Cq06ar1hfLA4+slg23l0p2bqoabdOew4nPHjfbulwuCDVFKpbmy5KlBco/dLRel7Exc2XsZBa+HpcCcyIc414nx2grgDursw0o3BNo/BzGFut1ewb0yObNTZN7H6yUu+9ZKrn5c1RtfiNxTgTas2wt1W01Lgri5lsKZG7BHGlrvi7910dUA13P2ppvXkzZRiWob19UknbsapNpRv71bAWQXuLegEovA4Gjt9fM084fenytrFhVJHHw5l6M2kwZ9yeQec0g+2QfRcWZUlaRJ92dA9LZMaCq6zrWtmq5hHWKrBgX70FowVXrdzWPW4t8K7ytKK0KNfJstaKqSDY/tha2nqXsX4+UFWP0b+HxGJKRSbMokF44xxb4CIK9ENSnDPwWYXr8FEIYUiW+nyANQKWnMPI/Bjpbu9cjv3zVfHkIzOfmpSq7nOmoa6aV84PdT05MqqmR0+PE+KTEYTrl6BNMGrzCqbS0Ym6kQiiBj26HAA76eFcPi3Fj9Jeg9CN0gT285dNUGzomqt8Pn7pV2SLfQ0h+qp1TZopxTI9joxOw7T65cLZDGhu6oOI3ZGRkXJIS47COyMDsskBuXjZPCYPtCJxWuX74y2sH5NSJVtBirwmYo8CRwTjDdzArnFON8TOlAauqCyHe8WdZIRTzORjxhzHyC0qyp0ZeI4vmqRknA5zqzp5qk092npRdH9XLsUNX5Nplj3gw5V3vG1bPK009Ul/XIhOTk7KwLFdpAwVPPO6URJlfnCUXsF6gY7QbEN/mCT5NPNCCLzStUwIoKEmoQOFLkFSWr7Kuo57sKAEjcc8DK6Ry9QIoib2kLY0cXjTzVDIy+vGO47ILzDc2dMvoMJbxKOf0Z0A4yrTwVIKChly+1CN5mAXoCAma2YzMZEmbkySnT7bK+PjEVLmVBGqNQV/wGYTA6JNlfmcgY6ET89S4W7CqW7thIdspyatMlD9knsxQtffuOS+vbd0rB/Y2yBBsnTaumbZDy3bDw2Oyr+aiDN4YnapC2phWrC6SqnXFKs9+ggGSNSNU9+lvyqvA9nNRgEK7RmbVOelJsunuCkmG45kaQY0lgqemh0zQtt9/84jseOsY1v4D5ijTeCMAtudeoQvTn27CJ2lKSIiXjXdVCM1U9xeMUvF4L3imOUxpwGrkl9FNBAIREfktK4uU7el5PrBeqHfiIJFMV5s88iYc1v4vG5SqkiGtxqFw+H8bgZnQ8fm3Y550FsEXrNlQojjhezAoHpejnHHLKQHcgXxKMPus4pXUtGTZ8I1FEo/dmz1S1rMHf+a5qXnjT/vl3Ol2n0Dse7THNF3KmYcmFAikjYKoWneT2pMEfvd7R1xDBW3F5VN/rPzspGXu47mbK16YPbXK80MUNqtHnky/8/pBab7imRHz7JBakwiHHAhaCwrnZ8jim/MtcYXAuni/jbzTB5QjldqxT4nSMS1dUSjJbq4oowM9IpcudMm72w5JW0ufuOjoKJUZAGej9Ay3rZ2zT35fVlmo4g18d4BSlJdTALQH26mPDTm1lEIDnPGwVjCwY44Umd7x9lGTeUxtMwXSQeYzse2201qtBSWlOcoMnOn2ZmHKryRFK5Hi7Qijw8vFTi8nLy0q21cjD+YH+kdk53u1Qg2Y6ahr+oi7cEGmzElPdhwUMp2JAEwBVo/OGmDEw/0upwCw7LUHKs882BPX3JECOyezXL/v/uSMnDjWPGOb132TGZokd6DxNj5A1+OTsUaG4EIbm7eCAigko4GgGaEGcFXmLElrS+306o5clS+x0GG72Rt9c2SXIDgSmjGs8eMMFX/kwsqOdpNno5Cqn4MqeASiNG2YsTyTqcDvVsb5xo5o9x1Y3Pzjo1MyNDim3oNrRl9iMuGVRdgHpGDtzz1CKNAzBXeR1MZgUDznUgBzgpk3q1OKKamJwW0dSpTqYxv75e5zcs033TlUjamY+LlT3PqbzyNqz7UC1wx2wCU/vqRBAM4hL6qP3oPbIfEvM0ffpRzewX83qk+zpfpEpnFd7xuSvl5LTMOfjKB8KO2FTiOSGaT6fjjshedXYTpLAkdHx+Wrzy9gSzo8RfB0Decchec0Us6twn8h8yH5gw7QBBhZROAzGEgUt5bhQI0+vHMTghinjjMoEfn6nm1T08y1BhdJswVknn6i8WKXY9wC7nmEAkBU0d4MKIAbA9PbTifiyDAdzaF9TZj7MfownUiBa4187O+3PHmruLHaZORmNoAzF2eiba/uA7pgnL4IUT8F0IXPmAkCwTyr44kMR4lJ22FQTTTmkdYZBCNQybFeYDv/dx6hcQk7W6bAWaAfGjABp2wHPn67ETeXFnrEQKAKkenOtn4gcWae7SiYhnOd6viK7aIBaks7+mAojCtGxgVJvCaJNMQCFGRby3VH9SdO8o7loDBAuNGuEzJDJIy+cE/gBONQ//Nn2+EvEL2N0o4pvBsDI/LZ30+rGEEZorwr1yyQcuzmuN530jonWnT5CCJHPGB1BjXsuIBl3sQK3lzjAzvv7OiXDoxQKLsmAy1X+1DfubtQX9gP23LvwIAoAya7PjyptCFUO6dvxNXddcO3AXMiykueaymAOiQcHtqrGkf/IhYfDp8V4YzE9vUOKoE5ERWuXI80iZ9XlClf31SuTpPDtQv8ToshrkaYE6djZzB4YHqCAuA9mwa7ikREL33qRAvMwDyHC6qHOtQAHmnPBLSjnb8gSzY/ukYFYGLBRwFyBXiyrlmZpBasDS7yfMGFQ4IuZDBX2KsKVf9yY49cwnxK5xTolNiKjmsyRmdFwjTzC8vyZMuP1kvZ4jyU8Ut0QDyk9wropVNWztQZxX7yTg0g7EGyXV9SgsODo3Lwq0aM8niQmpPOpGTrxQcijBS0QBly/8GT683AK5DGIgDSOo5DFi7F++FPQgCPiXfzuxbAYeRPsMAOKNX64y1mMDNQC0ApL0WkYTUXDdFknFMVb41svGuJWghx/64FQlWOBvToN+FwhQsgtg+h/vXAfYT4lQCgCjwl+ZAFdkBEg7DzPZ+ekQHfOl8TSqZ5B2iRUtvwest29CtsR4Y3P7pW7t9cidPe5JgXQYp50DgETf181xksganM9hIkhUg7faY/fTY4ryS5E9++jYa8ABkMwMfrKbzZxcNRCoVMEB1XcdSA0zicpLmw70DpK8Z99RnT+9qmMvnuw1W49ZEPWzUDLoFtgomwL9Ht9n3RIDX/DB2EAdWNIO+FtqZh+r5pAaCgG2dmOCEybrfrRjGMkeNZvHnbi0fu04xm5aRIeqYbYe9euYGpk+ptMm0+eTWONzvW4u7QPQ9Uyq04Z9BxPQpSM2HXd7gymigPRv/67lG1d3F2fmoE/gwhvN/aNKxeuBfwh3fw8n18WWynQOyIO6yd79VBZd1SvChHneMTARlQF6NwMnP86DUcevbgHG9cxeYYVmOUdiGSeXfIHHEKie3wPyaggMksL1F9sP2Y9HQNhvT86O08NHZbbU3v1AYhqOvK6uyfo/D3oChQOIpIrco0A05ZBQiamjZtZYbLYnWxAUtjhqX0FMrRJo6ZjLiWFnF0YBPGA5ez9W1KkCHwcuX3LGx/q27PZ9DxCsyAC6NVSGWsEAi6A0qbR9tFWLgwBE0gY9AFlSfDmnHzmypWPxrHdEnkOS084mht7pXtbxyOhHl4Ku9n6OVFmLplug8SAO/QwCFeAit3QjlNQw+gTzPQg/V2w/lOyc5JVfZNE9EEBjSZlVd/3Dxq2/7GIbXgoQlpmuw6Ai/XUP6zuhoPTMAKQQLg55ySlGvQfywWjE14tT0UYIdM9Aln61uV0+MZQhKP0GZRzUmPZpw7TTpY3iv4G2y+vQWbtPDMc9HzPLzDh91NlsEn6mATYGEnKuJyIf86Ix1pHfrQCyZ+tgCFwFsdjNY24fZGKqLInBF4MKEsArX5JKGxAhkfxXL73Ok22bm9Vr76Fy9ImCH3MCPPDQr/nuAPp2p67He8oYiCQ8zC91eg2A9r23aqz1FicrsTZcmyAnVbtBSLo9S0RKUp9PgEPZp2ePy/0ZyoSVzcMK53YO8lxBtboAHmHaBQjJu4QY8YbyMP1Xe+Kht2XCqrswqBBELg3wOFra4Y5KxAU1iA+4M8WeZRFm+J84yBiyYn4ikARp+4BWcMgttw3vm53NgtQyijUJzaWgVK5tXfFuGytCfkjfHwHAGzKQTjt8huRgNbv2ElwBxpCoIEu8F4Du4O88p8Hq7SZsNEKAx9XZ5TJpn2dA+q2GIb7gLzFijLFI6IGVdKQ7V/D7lfhGOeNEckAFb0mcPzaPATvPJsOiLgqBL40CpOf8BpkolA8zBXjtY6/BbZiLMm2po72j8i+1IotVeVfT8RjSbrYnocLihx74U/aEdHuIBs0EGGBTKgk8mwyTQF4s84EbEe6+j6fEYKQMep7jmkrWC+P9J2EQuACCGE8fwS9zGQdQCv8/EsAdmOMwTbBAJ58mfQmg+sHf4djNO7M57xU+jRx8drPGPhW03XADmxAfxCNhpvgZU/jWd5bFhibwXG8V8uInGaewuj3hMLtpgFwM6WV+dg+Cd5weJxpO9hbG8CwhnhJN5QYDLuvYQ67yK9jQG4cPz/8YeT/kRCG2hKZeD9PnCP6VL4lxrmBsG/4szyQ2D+BFAgcOP9APmLUPepXV2sqGd1tPAHVjBxL/8ynBcv70DagFSKMiyoDKyuTVBLlABFCS7zjmN0GbpuAJH78NwDvAjdxfXU1XQiOzswqwLwJ6myOhPO0cWVJGIL3uV4rgRDNBf8CZ768/k5KMdxE34RyUbZAJ4IzXmbUYbTKi9G2+CZBTYwk546vz08ymYN/gPyWkktCPE3egAAAABJRU5ErkJggg==";
277
+ var logo_usdt = "data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTExIiBoZWlnaHQ9IjkwIiB2aWV3Qm94PSIwIDAgMTExIDkwIiBmaWxsPSJub25lIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgo8cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZD0iTTI0LjQ4MjUgMC44NjIzMDVIODguMDQ5NkM4OS41NjYzIDAuODYyMzA1IDkwLjk2NzUgMS42NDgyNyA5MS43MjM5IDIuOTIzMzhMMTEwLjI0NCAzNC4xNDE5QzExMS4yMDQgMzUuNzYwOSAxMTAuOTE5IDM3LjgwNDMgMTA5LjU0OSAzOS4xMTcxTDU4LjU3MjkgODcuOTcwM0M1Ni45MjE2IDg5LjU1MjggNTQuMjY1MiA4OS41NTI4IDUyLjYxMzkgODcuOTcwM0wxLjcwNjk5IDM5LjE4MzFDMC4zMDUyNjIgMzcuODM5OCAwLjA0Mjc4MTIgMzUuNzM2NyAxLjA3MzU0IDM0LjEwNzdMMjAuODY5NiAyLjgyMzIyQzIxLjY0MDYgMS42MDQ4MyAyMy4wMDg3IDAuODYyMzA1IDI0LjQ4MjUgMC44NjIzMDVaTTc5Ljg0MTkgMTQuODAwM1YyMy41NTk3SDYxLjczNDNWMjkuNjMyOUM3NC40NTE4IDMwLjI4MTkgODMuOTkzNCAzMi45NDc1IDg0LjA2NDIgMzYuMTQyNUw4NC4wNjM4IDQyLjgwM0M4My45OTMgNDUuOTk4IDc0LjQ1MTggNDguNjYzNSA2MS43MzQzIDQ5LjMxMjVWNjQuMjE2OEg0OS43MTA1VjQ5LjMxMjVDMzYuOTkyOSA0OC42NjM1IDI3LjQ1MTMgNDUuOTk4IDI3LjM4MDUgNDIuODAzTDI3LjM4MSAzNi4xNDI1QzI3LjQ1MTcgMzIuOTQ3NSAzNi45OTI5IDMwLjI4MTkgNDkuNzEwNSAyOS42MzI5VjIzLjU1OTdIMzEuNjAyOFYxNC44MDAzSDc5Ljg0MTlaTTU1LjcyMjQgNDQuNzM2N0M2OS4yOTQzIDQ0LjczNjcgODAuNjM4MiA0Mi40ODI3IDgzLjQxNDMgMzkuNDcyN0M4MS4wNjAxIDM2LjkyMDIgNzIuNTQ0OCAzNC45MTE0IDYxLjczNDMgMzQuMzU5N1Y0MC43MTgzQzU5Ljc5NjYgNDAuODE3MiA1Ny43ODUyIDQwLjg2OTMgNTUuNzIyNCA0MC44NjkzQzUzLjY1OTUgNDAuODY5MyA1MS42NDgxIDQwLjgxNzIgNDkuNzEwNSA0MC43MTgzVjM0LjM1OTdDMzguODk5OSAzNC45MTE0IDMwLjM4NDYgMzYuOTIwMiAyOC4wMzA0IDM5LjQ3MjdDMzAuODA2NiA0Mi40ODI3IDQyLjE1MDQgNDQuNzM2NyA1NS43MjI0IDQ0LjczNjdaIiBmaWxsPSIjMDA5MzkzIi8+Cjwvc3ZnPgo=";
278
+ var logo_wbtc = "data:image/png;base64,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";
279
+
280
+ // src/tokens/list.ts
281
+ var TOKENS = [
282
+ {
283
+ symbol: "USDC",
284
+ name: "USD Coin",
285
+ equivalenceGroup: "USDC",
286
+ logo: logo_usdc,
287
+ deployments: [
288
+ {
289
+ chainId: 1,
290
+ address: "0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48",
291
+ decimals: 6,
292
+ network: "mainnet",
293
+ swapContracts: []
294
+ },
295
+ {
296
+ chainId: 8453,
297
+ address: "0x833589fcd6edb6e08f4c7c32d4f71b54bda02913",
298
+ decimals: 6,
299
+ network: "mainnet",
300
+ swapContracts: []
301
+ },
302
+ {
303
+ chainId: 42161,
304
+ address: "0xaf88d065e77c8cc2239327c5edb3a432268e5831",
305
+ decimals: 6,
306
+ network: "mainnet",
307
+ swapContracts: []
308
+ },
309
+ {
310
+ chainId: 4114,
311
+ address: "0xe045e6c36cf77faa2cfb54466d71a3aef7bbe839",
312
+ decimals: 6,
313
+ network: "mainnet",
314
+ swapContracts: []
315
+ },
316
+ {
317
+ chainId: 11155111,
318
+ address: "0x1c7d4b196cb0c7b01d743fbc6116a902379c7238",
319
+ decimals: 6,
320
+ network: "testnet",
321
+ swapContracts: []
322
+ },
323
+ {
324
+ chainId: 421614,
325
+ address: "0xbeb51deb2018b67b35d5695fd15bb30d452c7868",
326
+ decimals: 18,
327
+ network: "testnet",
328
+ swapContracts: []
329
+ },
330
+ {
331
+ chainId: 84532,
332
+ address: "0xf370dc3765f81ac9dd2febd59fb4e710330b0bc8",
333
+ decimals: 18,
334
+ network: "testnet",
335
+ swapContracts: []
336
+ }
337
+ ]
338
+ },
339
+ {
340
+ symbol: "ctUSD",
341
+ name: "Citrea USD",
342
+ equivalenceGroup: "USDC",
343
+ logo: logo_usdc,
344
+ deployments: [
345
+ {
346
+ chainId: 4114,
347
+ address: "0x8d82c4e3c936c7b5724a382a9c5a4e6eb7ab6d5d",
348
+ decimals: 6,
349
+ network: "mainnet",
350
+ swapContracts: []
351
+ }
352
+ ]
353
+ },
354
+ {
355
+ symbol: "USDG",
356
+ name: "Global USD",
357
+ equivalenceGroup: "USDC",
358
+ logo: logo_usdg,
359
+ deployments: [
360
+ {
361
+ chainId: 4663,
362
+ address: "0x5fc5360D0400a0Fd4f2af552ADD042D716F1d168",
363
+ decimals: 6,
364
+ network: "mainnet",
365
+ swapContracts: []
366
+ }
367
+ ]
368
+ },
369
+ {
370
+ symbol: "sUSD",
371
+ name: "Spice USD",
372
+ equivalenceGroup: "SUSD",
373
+ logo: logo_usdc,
374
+ deployments: [
375
+ {
376
+ chainId: 11155111,
377
+ address: "0x9bf2d44887be65c4f6337b20814ec79197a092aa",
378
+ decimals: 18,
379
+ network: "testnet",
380
+ swapContracts: []
381
+ },
382
+ {
383
+ chainId: 421614,
384
+ address: "0xf370dc3765f81ac9dd2febd59fb4e710330b0bc8",
385
+ decimals: 18,
386
+ network: "testnet",
387
+ swapContracts: []
388
+ },
389
+ {
390
+ chainId: 84532,
391
+ address: "0xbeb51deb2018b67b35d5695fd15bb30d452c7868",
392
+ decimals: 18,
393
+ network: "testnet",
394
+ swapContracts: []
395
+ }
396
+ ]
397
+ },
398
+ {
399
+ symbol: "USDT",
400
+ name: "Tether USD",
401
+ equivalenceGroup: "USDC",
402
+ logo: logo_usdt,
403
+ deployments: [
404
+ {
405
+ chainId: 1,
406
+ address: "0xdAC17F958D2ee523a2206206994597C13D831ec7",
407
+ decimals: 6,
408
+ network: "mainnet",
409
+ swapContracts: []
410
+ },
411
+ {
412
+ chainId: 8453,
413
+ address: "0xfde4C96c8593536E31F229EA8f37b2ADa2699bb2",
414
+ decimals: 6,
415
+ network: "mainnet",
416
+ swapContracts: []
417
+ },
418
+ {
419
+ chainId: 42161,
420
+ address: "0xfd086bc7cd5c481dcc9c85ebe478a1c0b69fcbb9",
421
+ decimals: 6,
422
+ network: "mainnet",
423
+ swapContracts: []
424
+ }
425
+ ]
426
+ },
427
+ {
428
+ symbol: "USD",
429
+ name: "USD Stable Coin",
430
+ equivalenceGroup: "SUSD",
431
+ logo: logo_usdc,
432
+ deployments: [
433
+ {
434
+ chainId: 5115,
435
+ address: "0xf19308f923582a6f7c465e5ce7a9dc1bec6665b1",
436
+ decimals: 18,
437
+ network: "testnet",
438
+ swapContracts: []
439
+ },
440
+ {
441
+ chainId: 688689,
442
+ address: "0x16b90aeb3de140dde993da1d5734bca28574702b",
443
+ decimals: 6,
444
+ network: "testnet",
445
+ swapContracts: []
446
+ }
447
+ ]
448
+ },
449
+ {
450
+ symbol: "WBTC",
451
+ name: "Wrapped Bitcoin",
452
+ equivalenceGroup: "WBTC",
453
+ logo: logo_wbtc,
454
+ deployments: [
455
+ {
456
+ chainId: 1,
457
+ address: "0x2260fac5e5542a773aa44fbcfedf7c193bc2c599",
458
+ decimals: 8,
459
+ network: "mainnet",
460
+ swapContracts: []
461
+ },
462
+ {
463
+ chainId: 42161,
464
+ address: "0x2f2a2543b76a4166549f7aab2e75bef0aefc5b0f",
465
+ decimals: 8,
466
+ network: "mainnet",
467
+ swapContracts: []
468
+ },
469
+ {
470
+ chainId: 11155111,
471
+ address: "0x4fc381b6cc6df8cf1c1bd46d184475be5b7a3c62",
472
+ decimals: 8,
473
+ network: "testnet",
474
+ swapContracts: []
475
+ },
476
+ {
477
+ chainId: 421614,
478
+ address: "0xba4c54d4cf10c766c22a08f783998cfab237f7c9",
479
+ decimals: 8,
480
+ network: "testnet",
481
+ swapContracts: []
482
+ },
483
+ {
484
+ chainId: 84532,
485
+ address: "0x16dd3a855433059be478facb416d9afed6ca96ec",
486
+ decimals: 8,
487
+ network: "testnet",
488
+ swapContracts: []
489
+ }
490
+ ]
491
+ },
492
+ {
493
+ symbol: "ETH",
494
+ name: "Ether",
495
+ equivalenceGroup: "ETH",
496
+ logo: logo_eth,
497
+ deployments: [
498
+ {
499
+ chainId: 1,
500
+ address: "0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee",
501
+ decimals: 18,
502
+ network: "mainnet",
503
+ swapContracts: []
504
+ },
505
+ {
506
+ chainId: 8453,
507
+ address: "0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee",
508
+ decimals: 18,
509
+ network: "mainnet",
510
+ swapContracts: []
511
+ },
512
+ {
513
+ chainId: 42161,
514
+ address: "0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee",
515
+ decimals: 18,
516
+ network: "mainnet",
517
+ swapContracts: []
518
+ },
519
+ {
520
+ chainId: 11155111,
521
+ address: "0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee",
522
+ decimals: 18,
523
+ network: "testnet",
524
+ swapContracts: []
525
+ },
526
+ {
527
+ chainId: 421614,
528
+ address: "0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee",
529
+ decimals: 18,
530
+ network: "testnet",
531
+ swapContracts: []
532
+ },
533
+ {
534
+ chainId: 84532,
535
+ address: "0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee",
536
+ decimals: 18,
537
+ network: "testnet",
538
+ swapContracts: []
539
+ },
540
+ {
541
+ chainId: 4663,
542
+ address: "0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee",
543
+ decimals: 18,
544
+ network: "testnet",
545
+ swapContracts: []
546
+ }
547
+ ]
548
+ },
549
+ {
550
+ symbol: "cbETH",
551
+ name: "Coinbase Wrapped Staked ETH",
552
+ equivalenceGroup: "ETH",
553
+ logo: logo_eth,
554
+ deployments: [
555
+ {
556
+ chainId: 8453,
557
+ address: "0x2ae3f1ec7f1f5012cfeab0185bfc7aa3cf0dec22",
558
+ decimals: 18,
559
+ network: "mainnet",
560
+ swapContracts: []
561
+ }
562
+ ]
563
+ },
564
+ {
565
+ symbol: "cBTC",
566
+ name: "Citrea Bitcoin",
567
+ equivalenceGroup: "CBTC",
568
+ logo: logo_cbtc,
569
+ deployments: [
570
+ {
571
+ chainId: 4114,
572
+ address: "0x3100000000000000000000000000000000000002",
573
+ decimals: 18,
574
+ network: "mainnet",
575
+ swapContracts: []
576
+ }
577
+ ]
578
+ },
579
+ {
580
+ symbol: "WCBTC",
581
+ name: "Wrapped Citrea BTC",
582
+ equivalenceGroup: "CBTC",
583
+ logo: logo_cbtc,
584
+ deployments: [
585
+ {
586
+ chainId: 4114,
587
+ address: "0x3100000000000000000000000000000000000006",
588
+ decimals: 18,
589
+ network: "mainnet",
590
+ swapContracts: []
591
+ },
592
+ {
593
+ chainId: 5115,
594
+ address: "0x8d0c9d1c17ae5e40fff9be350f57840e9e66cd93",
595
+ decimals: 18,
596
+ network: "testnet",
597
+ swapContracts: []
598
+ }
599
+ ]
600
+ },
601
+ {
602
+ symbol: "eCBTC",
603
+ name: "CBTC Vault",
604
+ equivalenceGroup: "CBTC",
605
+ logo: logo_cbtc,
606
+ deployments: [
607
+ {
608
+ chainId: 5115,
609
+ address: "0x2876a1fb400c238b0a9e4edd2e7e03d3cf9b53c2",
610
+ decimals: 18,
611
+ network: "testnet",
612
+ swapContracts: []
613
+ }
614
+ ]
615
+ },
616
+ {
617
+ symbol: "ARB",
618
+ name: "Arbitrum",
619
+ equivalenceGroup: "ARB",
620
+ logo: logo_arb,
621
+ deployments: [
622
+ {
623
+ chainId: 42161,
624
+ address: "0x912ce59144191c1204e64559fe8253a0e49e6548",
625
+ decimals: 18,
626
+ network: "mainnet",
627
+ swapContracts: []
628
+ }
629
+ ]
630
+ }
631
+ ];
632
+
633
+ // src/tokens/index.ts
634
+ var _addressIndex = /* @__PURE__ */ new Map();
635
+ var _deploymentIndex = /* @__PURE__ */ new Map();
636
+ var _chainIndex = /* @__PURE__ */ new Map();
637
+ var _equivalenceIndex = /* @__PURE__ */ new Map();
638
+ var NATIVE_SENTINEL = "0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee";
639
+ var NATIVE_ALIASES = [
640
+ "0x0000000000000000000000000000000000000000",
641
+ "0x0"
642
+ ];
643
+ function _buildIndexes() {
644
+ for (const token of TOKENS) {
645
+ const groupAddrs = _equivalenceIndex.get(token.equivalenceGroup) ?? [];
646
+ for (const d of token.deployments) {
647
+ const addr = d.address.toLowerCase();
648
+ const key = `${d.chainId}:${addr}`;
649
+ _addressIndex.set(addr, token);
650
+ _deploymentIndex.set(key, { token, deployment: d });
651
+ const chainEntries = _chainIndex.get(d.chainId) ?? [];
652
+ chainEntries.push({ token, deployment: d });
653
+ _chainIndex.set(d.chainId, chainEntries);
654
+ if (!groupAddrs.includes(addr)) {
655
+ groupAddrs.push(addr);
656
+ }
657
+ if (addr === NATIVE_SENTINEL) {
658
+ for (const alias of NATIVE_ALIASES) {
659
+ _addressIndex.set(alias, token);
660
+ _deploymentIndex.set(`${d.chainId}:${alias}`, { token, deployment: d });
661
+ if (!groupAddrs.includes(alias)) {
662
+ groupAddrs.push(alias);
663
+ }
664
+ }
665
+ }
666
+ }
667
+ _equivalenceIndex.set(token.equivalenceGroup, groupAddrs);
668
+ }
669
+ }
670
+ _buildIndexes();
671
+ function _resolve(token, deployment) {
672
+ return {
673
+ symbol: token.symbol,
674
+ name: token.name,
675
+ equivalenceGroup: token.equivalenceGroup,
676
+ logo: token.logo,
677
+ address: deployment.address,
678
+ chainId: deployment.chainId,
679
+ decimals: deployment.decimals,
680
+ network: deployment.network,
681
+ swapContracts: deployment.swapContracts
682
+ };
683
+ }
684
+ function getTokensForChain(chainId) {
685
+ const entries = _chainIndex.get(chainId);
686
+ if (!entries) return [];
687
+ return entries.map(({ token, deployment }) => _resolve(token, deployment));
688
+ }
689
+ function getTokenByAddress(address, chainId) {
690
+ const entry = _deploymentIndex.get(`${chainId}:${address.toLowerCase()}`);
691
+ if (!entry) return void 0;
692
+ return _resolve(entry.token, entry.deployment);
693
+ }
694
+ function getTokenBySymbol(symbol, chainId) {
695
+ return getTokensForChain(chainId).find(
696
+ (token) => token.symbol.toUpperCase() === symbol.toUpperCase()
697
+ );
698
+ }
699
+ function requireTokenBySymbol(symbol, chainId) {
700
+ const token = getTokenBySymbol(symbol, chainId);
701
+ if (token) return token;
702
+ throw new Error(
703
+ `Token "${symbol}" not found on chain ${chainId} in the token registry.`
704
+ );
705
+ }
706
+ function getTokenDefinition(address) {
707
+ return _addressIndex.get(address.toLowerCase());
708
+ }
709
+ function getDeployment(address, chainId) {
710
+ return _deploymentIndex.get(`${chainId}:${address.toLowerCase()}`)?.deployment;
711
+ }
712
+ function getEquivalentAddresses(tokenAddress) {
713
+ const token = _addressIndex.get(tokenAddress.toLowerCase());
714
+ if (!token) return [tokenAddress.toLowerCase()];
715
+ return _equivalenceIndex.get(token.equivalenceGroup) ?? [tokenAddress.toLowerCase()];
716
+ }
717
+ function getEquivalenceGroup(tokenAddress) {
718
+ return _addressIndex.get(tokenAddress.toLowerCase())?.equivalenceGroup;
719
+ }
720
+ function areEquivalent(a, b) {
721
+ const tokenA = _addressIndex.get(a.toLowerCase());
722
+ const tokenB = _addressIndex.get(b.toLowerCase());
723
+ if (!tokenA || !tokenB) return false;
724
+ return tokenA.equivalenceGroup === tokenB.equivalenceGroup;
725
+ }
726
+ var USD_GROUPS = /* @__PURE__ */ new Set(["USDC", "SUSD"]);
727
+ var BTC_GROUPS = /* @__PURE__ */ new Set(["WBTC", "CBTC"]);
728
+ function isUsdDenominated(address) {
729
+ const group = getEquivalenceGroup(address);
730
+ return group !== void 0 && USD_GROUPS.has(group);
731
+ }
732
+ function isBtcDenominated(address) {
733
+ const group = getEquivalenceGroup(address);
734
+ return group !== void 0 && BTC_GROUPS.has(group);
735
+ }
736
+ function resolveTokenRef(ref) {
737
+ const [symbol, chainId] = ref;
738
+ const match = getTokenBySymbol(symbol, chainId);
739
+ if (!match) {
740
+ throw new Error(
741
+ `Token "${symbol}" not found on chain ${chainId} in the token registry.`
742
+ );
743
+ }
744
+ return {
745
+ address: match.address,
746
+ symbol: match.symbol,
747
+ decimals: match.decimals,
748
+ chainId
749
+ };
750
+ }
751
+
752
+ // src/chains/list.ts
753
+ var CHAINS = {
754
+ 1: {
755
+ id: 1,
756
+ name: "Ethereum",
757
+ displayName: "Ethereum",
758
+ network: "mainnet",
759
+ nativeCurrency: { name: "Ether", symbol: "ETH", decimals: 18 },
760
+ delegateContract: "0x5884Bff4876C979271E65D2feA8D0CF3bF6E6CcC",
761
+ blockExplorer: "https://etherscan.io",
762
+ rpcUrl: "https://eth-mainnet.g.alchemy.com/v2/alch_4ehgbBF6bx-U6loLSFRIy",
763
+ logo: logo_eth
764
+ },
765
+ 8453: {
766
+ id: 8453,
767
+ name: "Base Mainnet",
768
+ displayName: "Base",
769
+ network: "mainnet",
770
+ nativeCurrency: { name: "Ether", symbol: "ETH", decimals: 18 },
771
+ delegateContract: "0x5884Bff4876C979271E65D2feA8D0CF3bF6E6CcC",
772
+ escrowContract: "0xd3F8f177BB3d7dfD883d7c232f3093EdD61C3De9",
773
+ blockExplorer: "https://basescan.org",
774
+ rpcUrl: "https://base-mainnet.g.alchemy.com/v2/alch_4ehgbBF6bx-U6loLSFRIy",
775
+ logo: logo_base
776
+ },
777
+ 42161: {
778
+ id: 42161,
779
+ name: "Arbitrum One",
780
+ displayName: "Arbitrum",
781
+ network: "mainnet",
782
+ nativeCurrency: { name: "Ether", symbol: "ETH", decimals: 18 },
783
+ delegateContract: "0x262E1A689555dA5209113A056d0d164EF8355395",
784
+ escrowContract: "0x47d6DB10d99b1E0A074B1467407C7A53B68e1147",
785
+ blockExplorer: "https://arbiscan.io",
786
+ rpcUrl: "https://arb-mainnet.g.alchemy.com/v2/alch_4ehgbBF6bx-U6loLSFRIy",
787
+ logo: logo_arb
788
+ },
789
+ 4114: {
790
+ id: 4114,
791
+ name: "Citrea Mainnet",
792
+ displayName: "Citrea",
793
+ network: "mainnet",
794
+ nativeCurrency: { name: "Citrea Bitcoin", symbol: "cBTC", decimals: 18 },
795
+ delegateContract: "0x5884Bff4876C979271E65D2feA8D0CF3bF6E6CcC",
796
+ escrowContract: "0x3677113f10d82acFEeDd22dF5c7cFD58736111ee",
797
+ blockExplorer: "https://explorer.mainnet.citrea.xyz",
798
+ rpcUrl: "https://citrea-mainnet.g.alchemy.com/v2/alch_4ehgbBF6bx-U6loLSFRIy",
799
+ logo: logo_citrea,
800
+ wrappedNativeTokenAddress: "0x3100000000000000000000000000000000000006"
801
+ },
802
+ 4663: {
803
+ id: 4663,
804
+ name: "Robinhood Chain",
805
+ displayName: "Robinhood",
806
+ network: "mainnet",
807
+ nativeCurrency: { name: "Ether", symbol: "ETH", decimals: 18 },
808
+ delegateContract: "0x5884Bff4876C979271E65D2feA8D0CF3bF6E6CcC",
809
+ escrowContract: "0x93ee466f920e1b4961f85749001f03aAd868eF0E",
810
+ blockExplorer: "https://robinhoodchain.blockscout.com",
811
+ rpcUrl: "https://rpc.mainnet.chain.robinhood.com",
812
+ logo: logo_robinhood,
813
+ wrappedNativeTokenAddress: "0x0bd7d308f8e1639fab988df18a8011f41eacad73"
814
+ },
815
+ 11155111: {
816
+ id: 11155111,
817
+ name: "Ethereum Sepolia",
818
+ displayName: "Sepolia",
819
+ network: "testnet",
820
+ nativeCurrency: { name: "Sepolia Ether", symbol: "ETH", decimals: 18 },
821
+ delegateContract: "0xDF7d39BB544778F467D10b08B1F5C170fd7fB480",
822
+ blockExplorer: "https://sepolia.etherscan.io",
823
+ rpcUrl: "https://rpc.sepolia.org",
824
+ logo: logo_eth,
825
+ moralisId: "sepolia"
826
+ },
827
+ 421614: {
828
+ id: 421614,
829
+ name: "Arbitrum Sepolia",
830
+ displayName: "Arbitrum Sepolia",
831
+ network: "testnet",
832
+ nativeCurrency: { name: "Sepolia Ether", symbol: "ETH", decimals: 18 },
833
+ delegateContract: "0x151755d1bdFeB6082D141EF86e4291b2e902b43F",
834
+ blockExplorer: "https://sepolia.arbiscan.io",
835
+ rpcUrl: "https://sepolia-rollup.arbitrum.io/rpc",
836
+ logo: logo_arb
837
+ },
838
+ 84532: {
839
+ id: 84532,
840
+ name: "Base Sepolia",
841
+ displayName: "Base Sepolia",
842
+ network: "testnet",
843
+ nativeCurrency: { name: "Sepolia Ether", symbol: "ETH", decimals: 18 },
844
+ delegateContract: "0xD4C4A222cdd42f5c3219249a083a5aBf1420E9D8",
845
+ blockExplorer: "https://sepolia.basescan.org",
846
+ rpcUrl: "https://sepolia.base.org",
847
+ logo: logo_base,
848
+ moralisId: "0x14a34"
849
+ },
850
+ 5115: {
851
+ id: 5115,
852
+ name: "Citrea Testnet",
853
+ displayName: "Citrea Testnet",
854
+ network: "testnet",
855
+ nativeCurrency: { name: "cBTC", symbol: "cBTC", decimals: 18 },
856
+ delegateContract: "0x347056dd1CB95ae850192e3fC6FA995537A3A091",
857
+ escrowContract: "0xDf5616Fe65f103972c25EF596C6386904E5CbC8f",
858
+ blockExplorer: "https://explorer.testnet.citrea.xyz",
859
+ rpcUrl: "https://rpc.testnet.citrea.xyz",
860
+ logo: logo_citrea,
861
+ wrappedNativeTokenAddress: "0x8d0c9d1c17ae5e40fff9be350f57840e9e66cd93"
862
+ },
863
+ 123420001114: {
864
+ id: 123420001114,
865
+ name: "Base Camp Testnet",
866
+ displayName: "Base Camp",
867
+ network: "testnet",
868
+ nativeCurrency: { name: "Ethereum", symbol: "ETH", decimals: 18 },
869
+ delegateContract: "0xA15BFeD4eC0BEdd36b00b9856aFa1C6BCFE61574",
870
+ blockExplorer: "https://basecamp.gelato.network",
871
+ rpcUrl: "https://rpc-campnetwork.xyz",
872
+ logo: logo_base
873
+ },
874
+ 688688: {
875
+ id: 688688,
876
+ name: "Pharos Testnet",
877
+ displayName: "Pharos",
878
+ network: "testnet",
879
+ nativeCurrency: { name: "PHRS", symbol: "PHRS", decimals: 18 },
880
+ delegateContract: "0xAd45b774C4c632540d36f2105889C0E6aC28b504",
881
+ blockExplorer: "https://testnet.pharosscan.xyz",
882
+ rpcUrl: "https://testnet.dplabs-internal.com",
883
+ logo: logo_pharos
884
+ },
885
+ 688689: {
886
+ id: 688689,
887
+ name: "Pharos Atlantic",
888
+ displayName: "Pharos Atlantic",
889
+ network: "testnet",
890
+ nativeCurrency: { name: "PHRS", symbol: "PHRS", decimals: 18 },
891
+ delegateContract: "0xAd45b774C4c632540d36f2105889C0E6aC28b504",
892
+ blockExplorer: "https://atlantic.pharosscan.xyz",
893
+ rpcUrl: "https://atlantic.dplabs-internal.com",
894
+ logo: logo_pharos
895
+ },
896
+ 10143: {
897
+ id: 10143,
898
+ name: "Monad Testnet",
899
+ displayName: "Monad",
900
+ network: "testnet",
901
+ nativeCurrency: { name: "MON", symbol: "MON", decimals: 18 },
902
+ delegateContract: "0xEc4087643A1c5f532Fde98bCa029cebA4E47b053",
903
+ blockExplorer: "https://testnet.monadexplorer.com",
904
+ rpcUrl: "https://testnet-rpc.monad.xyz",
905
+ logo: logo_eth
906
+ },
907
+ 97: {
908
+ id: 97,
909
+ name: "BSC Testnet",
910
+ displayName: "BSC Testnet",
911
+ network: "testnet",
912
+ nativeCurrency: { name: "tBNB", symbol: "tBNB", decimals: 18 },
913
+ delegateContract: "0xD4C4A222cdd42f5c3219249a083a5aBf1420E9D8",
914
+ blockExplorer: "https://testnet.bscscan.com",
915
+ rpcUrl: "https://bsc-testnet.public.blastapi.io",
916
+ logo: logo_eth
917
+ },
918
+ 43113: {
919
+ id: 43113,
920
+ name: "Avalanche Fuji",
921
+ displayName: "Avalanche Fuji",
922
+ network: "testnet",
923
+ nativeCurrency: { name: "AVAX", symbol: "AVAX", decimals: 18 },
924
+ delegateContract: "0xD4C4A222cdd42f5c3219249a083a5aBf1420E9D8",
925
+ blockExplorer: "https://testnet.snowtrace.io",
926
+ rpcUrl: "https://avalanche-fuji.drpc.org",
927
+ logo: logo_eth
928
+ },
929
+ 80002: {
930
+ id: 80002,
931
+ name: "Polygon Amoy",
932
+ displayName: "Polygon Amoy",
933
+ network: "testnet",
934
+ nativeCurrency: { name: "POL", symbol: "POL", decimals: 18 },
935
+ delegateContract: "0xD4C4A222cdd42f5c3219249a083a5aBf1420E9D8",
936
+ blockExplorer: "https://amoy.polygonscan.com",
937
+ rpcUrl: "https://polygon-amoy-public.nodies.app",
938
+ logo: logo_eth
939
+ },
940
+ 11155420: {
941
+ id: 11155420,
942
+ name: "Optimism Sepolia",
943
+ displayName: "Optimism Sepolia",
944
+ network: "testnet",
945
+ nativeCurrency: { name: "Ether", symbol: "ETH", decimals: 18 },
946
+ delegateContract: "0xD4C4A222cdd42f5c3219249a083a5aBf1420E9D8",
947
+ blockExplorer: "https://sepolia-optimism.etherscan.io",
948
+ rpcUrl: "https://sepolia.optimism.io",
949
+ logo: logo_eth
950
+ }
951
+ };
952
+
953
+ // src/chains/index.ts
954
+ var import_viem2 = require("viem");
955
+ function getChainMeta(chainId) {
956
+ return CHAINS[chainId];
957
+ }
958
+ function getChainsByNetwork(network) {
959
+ return Object.values(CHAINS).filter(
960
+ (c) => c.network === network && c.chainType !== "starknet"
961
+ );
962
+ }
963
+ function getChainIdsByNetwork(network) {
964
+ return getChainsByNetwork(network).map((c) => c.id);
965
+ }
966
+ function getMainnetChains() {
967
+ return getChainsByNetwork("mainnet");
968
+ }
969
+ function getTestnetChains() {
970
+ return getChainsByNetwork("testnet");
971
+ }
972
+ function getAllChainsByNetwork(network) {
973
+ return Object.values(CHAINS).filter((c) => c.network === network);
974
+ }
975
+ function getDelegateContract(chainId) {
976
+ return CHAINS[chainId]?.delegateContract;
977
+ }
978
+ function getEscrowContract(chainId) {
979
+ return CHAINS[chainId]?.escrowContract;
980
+ }
981
+ function toViemChain(meta) {
982
+ if (meta.chainType === "starknet") return void 0;
983
+ return (0, import_viem2.defineChain)({
984
+ id: meta.id,
985
+ name: meta.name,
986
+ nativeCurrency: meta.nativeCurrency,
987
+ rpcUrls: {
988
+ default: {
989
+ http: [meta.rpcUrl]
990
+ },
991
+ public: {
992
+ http: [meta.rpcUrl]
993
+ }
994
+ },
995
+ ...meta.blockExplorer ? {
996
+ blockExplorers: {
997
+ default: {
998
+ name: meta.displayName || meta.name,
999
+ url: meta.blockExplorer
1000
+ }
1001
+ }
1002
+ } : {}
1003
+ });
1004
+ }
1005
+ var VIEM_CHAINS = Object.fromEntries(
1006
+ Object.values(CHAINS).map((meta) => [meta.id, toViemChain(meta)]).filter((entry) => entry[1] !== void 0)
1007
+ );
1008
+ function getViemChain(chainId) {
1009
+ return VIEM_CHAINS[chainId];
1010
+ }
1011
+ function requireViemChain(chainId) {
1012
+ const chain = getViemChain(chainId);
1013
+ if (chain) return chain;
1014
+ throw new Error(`Viem chain not found for chain ${chainId}.`);
1015
+ }
1016
+ function isStarknetChain(chainId) {
1017
+ return getChainMeta(chainId)?.chainType === "starknet";
1018
+ }
1019
+ var STARKNET_MAINNET_CHAIN_ID = 23448594291968336;
1020
+
1021
+ // src/utils.ts
1022
+ var NATIVE_TOKEN_ADDRESS = "0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE";
1023
+ var ZERO_ADDRESS = "0x0000000000000000000000000000000000000000";
1024
+ function getEscrowContractAddress(chainId) {
1025
+ const escrow = getEscrowContract(chainId);
1026
+ if (!escrow) {
1027
+ throw new Error(`Escrow contract not configured for chain ${chainId}`);
1028
+ }
1029
+ return escrow;
1030
+ }
1031
+ function isNativeToken(address) {
1032
+ const lower = address.toLowerCase();
1033
+ return lower === "0x0" || lower === "0x0000000000000000000000000000000000000000" || lower === "0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee";
1034
+ }
1035
+ function normalizeNativeTokenAddress(address) {
1036
+ if (isNativeToken(address)) {
1037
+ return ZERO_ADDRESS;
1038
+ }
1039
+ return address;
1040
+ }
1041
+ function convertAmountBetweenDecimals(amount, fromDecimals, toDecimals) {
1042
+ if (fromDecimals === toDecimals) return amount;
1043
+ if (fromDecimals < toDecimals) {
1044
+ return amount * BigInt(10) ** BigInt(toDecimals - fromDecimals);
1045
+ }
1046
+ return amount / BigInt(10) ** BigInt(fromDecimals - toDecimals);
1047
+ }
1048
+ function formatTokenAmount(amount, decimals, maxFractional = 6) {
1049
+ const divisor = BigInt(10) ** BigInt(decimals);
1050
+ const whole = amount / divisor;
1051
+ const remainder = amount % divisor;
1052
+ if (remainder === 0n) return whole.toString();
1053
+ const fracStr = remainder.toString().padStart(decimals, "0").slice(0, maxFractional).replace(/0+$/, "");
1054
+ if (!fracStr) return whole.toString();
1055
+ return `${whole}.${fracStr}`;
1056
+ }
1057
+ function truncateAddress(address, startChars = 6, endChars = 4) {
1058
+ if (address.length <= startChars + endChars) return address;
1059
+ return `${address.slice(0, startChars)}...${address.slice(-endChars)}`;
1060
+ }
1061
+ async function withRetry(fn, maxRetries = 3, delayMs = 300) {
1062
+ let lastErr;
1063
+ for (let attempt = 0; attempt <= maxRetries; attempt++) {
1064
+ try {
1065
+ return await fn();
1066
+ } catch (err) {
1067
+ lastErr = err;
1068
+ if (attempt < maxRetries) {
1069
+ await new Promise((r) => setTimeout(r, delayMs * 2 ** attempt));
1070
+ }
1071
+ }
1072
+ }
1073
+ throw lastErr;
1074
+ }
1075
+
1076
+ // src/abis/delegate.ts
1077
+ var DELEGATE_ABI = [
1078
+ {
1079
+ type: "fallback",
1080
+ stateMutability: "payable"
1081
+ },
1082
+ {
1083
+ type: "receive",
1084
+ stateMutability: "payable"
1085
+ },
1086
+ {
1087
+ type: "function",
1088
+ name: "execute",
1089
+ inputs: [
1090
+ {
1091
+ name: "intent",
1092
+ type: "tuple",
1093
+ internalType: "struct Delegate.Intent",
1094
+ components: [
1095
+ { name: "signatureType", type: "string", internalType: "string" },
1096
+ { name: "signature", type: "bytes", internalType: "bytes" },
1097
+ { name: "nbf", type: "uint256", internalType: "uint256" },
1098
+ { name: "exp", type: "uint256", internalType: "uint256" },
1099
+ {
1100
+ name: "chainBatches",
1101
+ type: "tuple[]",
1102
+ internalType: "struct Delegate.ChainBatch[]",
1103
+ components: [
1104
+ { name: "hash", type: "bytes32", internalType: "bytes32" },
1105
+ { name: "chainId", type: "uint256", internalType: "uint256" },
1106
+ {
1107
+ name: "calls",
1108
+ type: "tuple[]",
1109
+ internalType: "struct Delegate.Call[]",
1110
+ components: [
1111
+ { name: "to", type: "address", internalType: "address" },
1112
+ { name: "value", type: "uint256", internalType: "uint256" },
1113
+ { name: "data", type: "bytes", internalType: "bytes" }
1114
+ ]
1115
+ }
1116
+ ]
1117
+ }
1118
+ ]
1119
+ }
1120
+ ],
1121
+ outputs: [],
1122
+ stateMutability: "payable"
1123
+ },
1124
+ {
1125
+ type: "function",
1126
+ name: "selfExecute",
1127
+ inputs: [
1128
+ {
1129
+ name: "calls",
1130
+ type: "tuple[]",
1131
+ internalType: "struct Delegate.Call[]",
1132
+ components: [
1133
+ { name: "to", type: "address", internalType: "address" },
1134
+ { name: "value", type: "uint256", internalType: "uint256" },
1135
+ { name: "data", type: "bytes", internalType: "bytes" }
1136
+ ]
1137
+ }
1138
+ ],
1139
+ outputs: [],
1140
+ stateMutability: "payable"
1141
+ },
1142
+ {
1143
+ type: "function",
1144
+ name: "isChainBatchProcessed",
1145
+ inputs: [
1146
+ { name: "chainBatchHash", type: "bytes32", internalType: "bytes32" }
1147
+ ],
1148
+ outputs: [{ name: "", type: "bool", internalType: "bool" }],
1149
+ stateMutability: "view"
1150
+ },
1151
+ {
1152
+ type: "function",
1153
+ name: "normalizeIntentAndComputeHash",
1154
+ inputs: [
1155
+ {
1156
+ name: "userIntent",
1157
+ type: "tuple",
1158
+ internalType: "struct Delegate.Intent",
1159
+ components: [
1160
+ { name: "signatureType", type: "string", internalType: "string" },
1161
+ { name: "signature", type: "bytes", internalType: "bytes" },
1162
+ { name: "nbf", type: "uint256", internalType: "uint256" },
1163
+ { name: "exp", type: "uint256", internalType: "uint256" },
1164
+ {
1165
+ name: "chainBatches",
1166
+ type: "tuple[]",
1167
+ internalType: "struct Delegate.ChainBatch[]",
1168
+ components: [
1169
+ { name: "hash", type: "bytes32", internalType: "bytes32" },
1170
+ { name: "chainId", type: "uint256", internalType: "uint256" },
1171
+ {
1172
+ name: "calls",
1173
+ type: "tuple[]",
1174
+ internalType: "struct Delegate.Call[]",
1175
+ components: [
1176
+ { name: "to", type: "address", internalType: "address" },
1177
+ { name: "value", type: "uint256", internalType: "uint256" },
1178
+ { name: "data", type: "bytes", internalType: "bytes" }
1179
+ ]
1180
+ }
1181
+ ]
1182
+ }
1183
+ ]
1184
+ }
1185
+ ],
1186
+ outputs: [
1187
+ {
1188
+ name: "intent",
1189
+ type: "tuple",
1190
+ internalType: "struct Delegate.Intent",
1191
+ components: [
1192
+ { name: "signatureType", type: "string", internalType: "string" },
1193
+ { name: "signature", type: "bytes", internalType: "bytes" },
1194
+ { name: "nbf", type: "uint256", internalType: "uint256" },
1195
+ { name: "exp", type: "uint256", internalType: "uint256" },
1196
+ {
1197
+ name: "chainBatches",
1198
+ type: "tuple[]",
1199
+ internalType: "struct Delegate.ChainBatch[]",
1200
+ components: [
1201
+ { name: "hash", type: "bytes32", internalType: "bytes32" },
1202
+ { name: "chainId", type: "uint256", internalType: "uint256" },
1203
+ {
1204
+ name: "calls",
1205
+ type: "tuple[]",
1206
+ internalType: "struct Delegate.Call[]",
1207
+ components: [
1208
+ { name: "to", type: "address", internalType: "address" },
1209
+ { name: "value", type: "uint256", internalType: "uint256" },
1210
+ { name: "data", type: "bytes", internalType: "bytes" }
1211
+ ]
1212
+ }
1213
+ ]
1214
+ }
1215
+ ]
1216
+ },
1217
+ { name: "hash", type: "bytes32", internalType: "bytes32" }
1218
+ ],
1219
+ stateMutability: "pure"
1220
+ },
1221
+ {
1222
+ type: "event",
1223
+ name: "BatchExecuted",
1224
+ inputs: [
1225
+ { name: "block", type: "uint256", indexed: true, internalType: "uint256" },
1226
+ {
1227
+ name: "calls",
1228
+ type: "tuple[]",
1229
+ indexed: false,
1230
+ internalType: "struct Delegate.Call[]",
1231
+ components: [
1232
+ { name: "to", type: "address", internalType: "address" },
1233
+ { name: "value", type: "uint256", internalType: "uint256" },
1234
+ { name: "data", type: "bytes", internalType: "bytes" }
1235
+ ]
1236
+ }
1237
+ ],
1238
+ anonymous: false
1239
+ },
1240
+ {
1241
+ type: "event",
1242
+ name: "CallExecuted",
1243
+ inputs: [
1244
+ { name: "executor", type: "address", indexed: true, internalType: "address" },
1245
+ { name: "sender", type: "address", indexed: true, internalType: "address" },
1246
+ { name: "to", type: "address", indexed: true, internalType: "address" },
1247
+ { name: "value", type: "uint256", indexed: false, internalType: "uint256" },
1248
+ { name: "data", type: "bytes", indexed: false, internalType: "bytes" },
1249
+ { name: "returnData", type: "bytes", indexed: false, internalType: "bytes" }
1250
+ ],
1251
+ anonymous: false
1252
+ },
1253
+ {
1254
+ type: "event",
1255
+ name: "IntentSubmitted",
1256
+ inputs: [
1257
+ { name: "signature", type: "bytes", indexed: true, internalType: "bytes" }
1258
+ ],
1259
+ anonymous: false
1260
+ },
1261
+ {
1262
+ type: "error",
1263
+ name: "CallReverted",
1264
+ inputs: [
1265
+ { name: "account", type: "address", internalType: "address" },
1266
+ { name: "to", type: "address", internalType: "address" },
1267
+ { name: "value", type: "uint256", internalType: "uint256" },
1268
+ { name: "data", type: "bytes", internalType: "bytes" },
1269
+ { name: "errorMessage", type: "bytes", internalType: "bytes" }
1270
+ ]
1271
+ },
1272
+ {
1273
+ type: "error",
1274
+ name: "DuplicateChainBatch",
1275
+ inputs: [
1276
+ { name: "intentSignature", type: "bytes", internalType: "bytes" },
1277
+ { name: "chainBatchHash", type: "bytes32", internalType: "bytes32" },
1278
+ { name: "chainBatchId", type: "bytes32", internalType: "bytes32" }
1279
+ ]
1280
+ },
1281
+ { type: "error", name: "ECDSAInvalidSignature", inputs: [] },
1282
+ {
1283
+ type: "error",
1284
+ name: "ECDSAInvalidSignatureLength",
1285
+ inputs: [{ name: "length", type: "uint256", internalType: "uint256" }]
1286
+ },
1287
+ {
1288
+ type: "error",
1289
+ name: "ECDSAInvalidSignatureS",
1290
+ inputs: [{ name: "s", type: "bytes32", internalType: "bytes32" }]
1291
+ },
1292
+ {
1293
+ type: "error",
1294
+ name: "IntentExpired",
1295
+ inputs: [
1296
+ { name: "currentTime", type: "uint256", internalType: "uint256" },
1297
+ { name: "exp", type: "uint256", internalType: "uint256" }
1298
+ ]
1299
+ },
1300
+ {
1301
+ type: "error",
1302
+ name: "IntentTooEarly",
1303
+ inputs: [
1304
+ { name: "currentTime", type: "uint256", internalType: "uint256" },
1305
+ { name: "nbf", type: "uint256", internalType: "uint256" }
1306
+ ]
1307
+ },
1308
+ {
1309
+ type: "error",
1310
+ name: "InvalidAuthority",
1311
+ inputs: [
1312
+ { name: "actual", type: "address", internalType: "address" },
1313
+ { name: "expected", type: "address", internalType: "address" }
1314
+ ]
1315
+ },
1316
+ {
1317
+ type: "error",
1318
+ name: "InvalidChainId",
1319
+ inputs: [
1320
+ { name: "actual", type: "uint256", internalType: "uint256" },
1321
+ { name: "expected", type: "uint256", internalType: "uint256" }
1322
+ ]
1323
+ },
1324
+ {
1325
+ type: "error",
1326
+ name: "InvalidSignature",
1327
+ inputs: [
1328
+ { name: "signatureType", type: "string", internalType: "string" },
1329
+ { name: "recovered", type: "address", internalType: "address" },
1330
+ { name: "expected", type: "address", internalType: "address" }
1331
+ ]
1332
+ },
1333
+ {
1334
+ type: "error",
1335
+ name: "InvalidSignatureType",
1336
+ inputs: [{ name: "signatureType", type: "string", internalType: "string" }]
1337
+ }
1338
+ ];
1339
+
1340
+ // src/abis/erc20.ts
1341
+ var ERC20_ABI = [
1342
+ { inputs: [], name: "name", outputs: [{ type: "string" }], stateMutability: "view", type: "function" },
1343
+ { inputs: [], name: "symbol", outputs: [{ type: "string" }], stateMutability: "view", type: "function" },
1344
+ { inputs: [], name: "decimals", outputs: [{ type: "uint8" }], stateMutability: "view", type: "function" },
1345
+ { inputs: [{ name: "account", type: "address" }], name: "balanceOf", outputs: [{ type: "uint256" }], stateMutability: "view", type: "function" },
1346
+ { inputs: [{ name: "to", type: "address" }, { name: "amount", type: "uint256" }], name: "transfer", outputs: [{ type: "bool" }], stateMutability: "nonpayable", type: "function" },
1347
+ { inputs: [{ name: "from", type: "address" }, { name: "to", type: "address" }, { name: "amount", type: "uint256" }], name: "transferFrom", outputs: [{ type: "bool" }], stateMutability: "nonpayable", type: "function" },
1348
+ { inputs: [{ name: "spender", type: "address" }, { name: "amount", type: "uint256" }], name: "approve", outputs: [{ type: "bool" }], stateMutability: "nonpayable", type: "function" },
1349
+ { inputs: [{ name: "owner", type: "address" }, { name: "spender", type: "address" }], name: "allowance", outputs: [{ type: "uint256" }], stateMutability: "view", type: "function" },
1350
+ { anonymous: false, inputs: [{ indexed: true, name: "from", type: "address" }, { indexed: true, name: "to", type: "address" }, { indexed: false, name: "value", type: "uint256" }], name: "Transfer", type: "event" },
1351
+ { anonymous: false, inputs: [{ indexed: true, name: "owner", type: "address" }, { indexed: true, name: "spender", type: "address" }, { indexed: false, name: "value", type: "uint256" }], name: "Approval", type: "event" }
1352
+ ];
1353
+
1354
+ // src/abis/wcbtc.ts
1355
+ var WCBTC_ABI = [
1356
+ { inputs: [], name: "name", outputs: [{ type: "string" }], stateMutability: "view", type: "function" },
1357
+ { inputs: [], name: "symbol", outputs: [{ type: "string" }], stateMutability: "view", type: "function" },
1358
+ { inputs: [], name: "decimals", outputs: [{ type: "uint8" }], stateMutability: "view", type: "function" },
1359
+ { inputs: [{ name: "account", type: "address" }], name: "balanceOf", outputs: [{ type: "uint256" }], stateMutability: "view", type: "function" },
1360
+ { inputs: [], name: "deposit", outputs: [], stateMutability: "payable", type: "function" },
1361
+ { inputs: [{ name: "amount", type: "uint256" }], name: "withdraw", outputs: [], stateMutability: "nonpayable", type: "function" },
1362
+ { stateMutability: "payable", type: "receive" },
1363
+ { stateMutability: "payable", type: "fallback" }
1364
+ ];
1365
+
1366
+ // src/abis/uniV3.ts
1367
+ var uniV3QuoterV2Abi = [
1368
+ {
1369
+ inputs: [
1370
+ {
1371
+ components: [
1372
+ { internalType: "address", name: "tokenIn", type: "address" },
1373
+ { internalType: "address", name: "tokenOut", type: "address" },
1374
+ { internalType: "uint256", name: "amountIn", type: "uint256" },
1375
+ { internalType: "uint24", name: "fee", type: "uint24" },
1376
+ {
1377
+ internalType: "uint160",
1378
+ name: "sqrtPriceLimitX96",
1379
+ type: "uint160"
1380
+ }
1381
+ ],
1382
+ internalType: "struct IQuoterV2.QuoteExactInputSingleParams",
1383
+ name: "params",
1384
+ type: "tuple"
1385
+ }
1386
+ ],
1387
+ name: "quoteExactInputSingle",
1388
+ outputs: [
1389
+ { internalType: "uint256", name: "amountOut", type: "uint256" },
1390
+ {
1391
+ internalType: "uint160",
1392
+ name: "sqrtPriceX96After",
1393
+ type: "uint160"
1394
+ },
1395
+ {
1396
+ internalType: "uint32",
1397
+ name: "initializedTicksCrossed",
1398
+ type: "uint32"
1399
+ },
1400
+ { internalType: "uint256", name: "gasEstimate", type: "uint256" }
1401
+ ],
1402
+ stateMutability: "nonpayable",
1403
+ type: "function"
1404
+ }
1405
+ ];
1406
+ var uniV3SwapRouterAbi = [
1407
+ {
1408
+ inputs: [
1409
+ {
1410
+ components: [
1411
+ { internalType: "address", name: "tokenIn", type: "address" },
1412
+ { internalType: "address", name: "tokenOut", type: "address" },
1413
+ { internalType: "uint24", name: "fee", type: "uint24" },
1414
+ { internalType: "address", name: "recipient", type: "address" },
1415
+ { internalType: "uint256", name: "amountIn", type: "uint256" },
1416
+ {
1417
+ internalType: "uint256",
1418
+ name: "amountOutMinimum",
1419
+ type: "uint256"
1420
+ },
1421
+ {
1422
+ internalType: "uint160",
1423
+ name: "sqrtPriceLimitX96",
1424
+ type: "uint160"
1425
+ }
1426
+ ],
1427
+ internalType: "struct IV3SwapRouter.ExactInputSingleParams",
1428
+ name: "params",
1429
+ type: "tuple"
1430
+ }
1431
+ ],
1432
+ name: "exactInputSingle",
1433
+ outputs: [
1434
+ { internalType: "uint256", name: "amountOut", type: "uint256" }
1435
+ ],
1436
+ stateMutability: "payable",
1437
+ type: "function"
1438
+ }
1439
+ ];
1440
+
1441
+ // src/abis/spicenet.ts
1442
+ var spicenetAbi = [
1443
+ {
1444
+ type: "function",
1445
+ name: "closeRebalancingRequest",
1446
+ inputs: [
1447
+ {
1448
+ name: "args",
1449
+ type: "tuple",
1450
+ internalType: "struct Spicenet.CloseRebalancingRequestArgs",
1451
+ components: [
1452
+ {
1453
+ name: "idempotenceKey",
1454
+ type: "bytes32",
1455
+ internalType: "bytes32"
1456
+ },
1457
+ {
1458
+ name: "repaymentChainTokenAmount",
1459
+ type: "uint256",
1460
+ internalType: "uint256"
1461
+ }
1462
+ ]
1463
+ }
1464
+ ],
1465
+ outputs: [],
1466
+ stateMutability: "nonpayable"
1467
+ },
1468
+ {
1469
+ type: "function",
1470
+ name: "createWithdrawalRequest",
1471
+ inputs: [
1472
+ {
1473
+ name: "request",
1474
+ type: "tuple",
1475
+ internalType: "struct Spicenet.CreateWithdrawalRequestArgs",
1476
+ components: [
1477
+ {
1478
+ name: "chainId",
1479
+ type: "string",
1480
+ internalType: "string"
1481
+ },
1482
+ {
1483
+ name: "idempotenceKey",
1484
+ type: "bytes32",
1485
+ internalType: "bytes32"
1486
+ },
1487
+ {
1488
+ name: "nbf",
1489
+ type: "uint256",
1490
+ internalType: "uint256"
1491
+ },
1492
+ {
1493
+ name: "exp",
1494
+ type: "uint256",
1495
+ internalType: "uint256"
1496
+ },
1497
+ {
1498
+ name: "metadata",
1499
+ type: "string",
1500
+ internalType: "string"
1501
+ },
1502
+ {
1503
+ name: "transfers",
1504
+ type: "tuple[]",
1505
+ internalType: "struct Spicenet.CreateTokenTransfer[]",
1506
+ components: [
1507
+ {
1508
+ name: "token",
1509
+ type: "string",
1510
+ internalType: "string"
1511
+ },
1512
+ {
1513
+ name: "to",
1514
+ type: "string",
1515
+ internalType: "string"
1516
+ },
1517
+ {
1518
+ name: "amount",
1519
+ type: "uint256",
1520
+ internalType: "uint256"
1521
+ }
1522
+ ]
1523
+ }
1524
+ ]
1525
+ }
1526
+ ],
1527
+ outputs: [],
1528
+ stateMutability: "nonpayable"
1529
+ },
1530
+ {
1531
+ type: "function",
1532
+ name: "createRebalancingRequest",
1533
+ inputs: [
1534
+ {
1535
+ name: "request",
1536
+ type: "tuple",
1537
+ internalType: "struct Spicenet.CreateRebalancingRequestArgs",
1538
+ components: [
1539
+ {
1540
+ name: "idempotenceKey",
1541
+ type: "bytes32",
1542
+ internalType: "bytes32"
1543
+ },
1544
+ {
1545
+ name: "nbf",
1546
+ type: "uint256",
1547
+ internalType: "uint256"
1548
+ },
1549
+ {
1550
+ name: "exp",
1551
+ type: "uint256",
1552
+ internalType: "uint256"
1553
+ },
1554
+ {
1555
+ name: "metadata",
1556
+ type: "string",
1557
+ internalType: "string"
1558
+ },
1559
+ {
1560
+ name: "recipient",
1561
+ type: "string",
1562
+ internalType: "string"
1563
+ },
1564
+ {
1565
+ name: "fromChainToken",
1566
+ type: "string",
1567
+ internalType: "string"
1568
+ },
1569
+ {
1570
+ name: "fromChainTokenAmount",
1571
+ type: "uint256",
1572
+ internalType: "uint256"
1573
+ },
1574
+ {
1575
+ name: "toChainToken",
1576
+ type: "string",
1577
+ internalType: "string"
1578
+ },
1579
+ {
1580
+ name: "toChainTokenAmountMin",
1581
+ type: "uint256",
1582
+ internalType: "uint256"
1583
+ }
1584
+ ]
1585
+ }
1586
+ ],
1587
+ outputs: [],
1588
+ stateMutability: "nonpayable"
1589
+ }
1590
+ ];
1591
+
1592
+ // src/abis/spicenetEscrow.ts
1593
+ var spicenetEscrowAbi = [
1594
+ {
1595
+ type: "constructor",
1596
+ inputs: [],
1597
+ stateMutability: "nonpayable"
1598
+ },
1599
+ {
1600
+ type: "receive",
1601
+ stateMutability: "payable"
1602
+ },
1603
+ {
1604
+ type: "function",
1605
+ name: "DEFAULT_ADMIN_ROLE",
1606
+ inputs: [],
1607
+ outputs: [
1608
+ {
1609
+ name: "",
1610
+ type: "bytes32",
1611
+ internalType: "bytes32"
1612
+ }
1613
+ ],
1614
+ stateMutability: "view"
1615
+ },
1616
+ {
1617
+ type: "function",
1618
+ name: "PAUSER_ROLE",
1619
+ inputs: [],
1620
+ outputs: [
1621
+ {
1622
+ name: "",
1623
+ type: "bytes32",
1624
+ internalType: "bytes32"
1625
+ }
1626
+ ],
1627
+ stateMutability: "view"
1628
+ },
1629
+ {
1630
+ type: "function",
1631
+ name: "RELAYER_ROLE",
1632
+ inputs: [],
1633
+ outputs: [
1634
+ {
1635
+ name: "",
1636
+ type: "bytes32",
1637
+ internalType: "bytes32"
1638
+ }
1639
+ ],
1640
+ stateMutability: "view"
1641
+ },
1642
+ {
1643
+ type: "function",
1644
+ name: "UNPAUSER_ROLE",
1645
+ inputs: [],
1646
+ outputs: [
1647
+ {
1648
+ name: "",
1649
+ type: "bytes32",
1650
+ internalType: "bytes32"
1651
+ }
1652
+ ],
1653
+ stateMutability: "view"
1654
+ },
1655
+ {
1656
+ type: "function",
1657
+ name: "UPGRADER_ROLE",
1658
+ inputs: [],
1659
+ outputs: [
1660
+ {
1661
+ name: "",
1662
+ type: "bytes32",
1663
+ internalType: "bytes32"
1664
+ }
1665
+ ],
1666
+ stateMutability: "view"
1667
+ },
1668
+ {
1669
+ type: "function",
1670
+ name: "UPGRADE_INTERFACE_VERSION",
1671
+ inputs: [],
1672
+ outputs: [
1673
+ {
1674
+ name: "",
1675
+ type: "string",
1676
+ internalType: "string"
1677
+ }
1678
+ ],
1679
+ stateMutability: "view"
1680
+ },
1681
+ {
1682
+ type: "function",
1683
+ name: "adminProcessWithdrawalRequestEvents",
1684
+ inputs: [
1685
+ {
1686
+ name: "requests",
1687
+ type: "tuple[]",
1688
+ internalType: "struct ISpicenetEscrow.WithdrawalRequest[]",
1689
+ components: [
1690
+ {
1691
+ name: "idempotenceKey",
1692
+ type: "bytes32",
1693
+ internalType: "bytes32"
1694
+ },
1695
+ {
1696
+ name: "forUser",
1697
+ type: "string",
1698
+ internalType: "string"
1699
+ },
1700
+ {
1701
+ name: "nbf",
1702
+ type: "uint256",
1703
+ internalType: "uint256"
1704
+ },
1705
+ {
1706
+ name: "exp",
1707
+ type: "uint256",
1708
+ internalType: "uint256"
1709
+ },
1710
+ {
1711
+ name: "metadata",
1712
+ type: "string",
1713
+ internalType: "string"
1714
+ },
1715
+ {
1716
+ name: "transfers",
1717
+ type: "tuple[]",
1718
+ internalType: "struct ISpicenetEscrow.TokenTransfer[]",
1719
+ components: [
1720
+ {
1721
+ name: "token",
1722
+ type: "address",
1723
+ internalType: "address"
1724
+ },
1725
+ {
1726
+ name: "to",
1727
+ type: "address",
1728
+ internalType: "address"
1729
+ },
1730
+ {
1731
+ name: "amount",
1732
+ type: "uint256",
1733
+ internalType: "uint256"
1734
+ }
1735
+ ]
1736
+ }
1737
+ ]
1738
+ }
1739
+ ],
1740
+ outputs: [],
1741
+ stateMutability: "nonpayable"
1742
+ },
1743
+ {
1744
+ type: "function",
1745
+ name: "adminSetWithdrawalInfos",
1746
+ inputs: [
1747
+ {
1748
+ name: "idempotenceKeys",
1749
+ type: "bytes32[]",
1750
+ internalType: "bytes32[]"
1751
+ },
1752
+ {
1753
+ name: "withdrawalInfos",
1754
+ type: "tuple[]",
1755
+ internalType: "struct ISpicenetEscrow.WithdrawalInfo[]",
1756
+ components: [
1757
+ {
1758
+ name: "forUser",
1759
+ type: "string",
1760
+ internalType: "string"
1761
+ },
1762
+ {
1763
+ name: "blockNumber",
1764
+ type: "uint256",
1765
+ internalType: "uint256"
1766
+ },
1767
+ {
1768
+ name: "nbf",
1769
+ type: "uint256",
1770
+ internalType: "uint256"
1771
+ },
1772
+ {
1773
+ name: "exp",
1774
+ type: "uint256",
1775
+ internalType: "uint256"
1776
+ },
1777
+ {
1778
+ name: "metadata",
1779
+ type: "string",
1780
+ internalType: "string"
1781
+ }
1782
+ ]
1783
+ }
1784
+ ],
1785
+ outputs: [],
1786
+ stateMutability: "nonpayable"
1787
+ },
1788
+ {
1789
+ type: "function",
1790
+ name: "adminWithdraw",
1791
+ inputs: [
1792
+ {
1793
+ name: "transfers",
1794
+ type: "tuple[]",
1795
+ internalType: "struct ISpicenetEscrow.TokenTransfer[]",
1796
+ components: [
1797
+ {
1798
+ name: "token",
1799
+ type: "address",
1800
+ internalType: "address"
1801
+ },
1802
+ {
1803
+ name: "to",
1804
+ type: "address",
1805
+ internalType: "address"
1806
+ },
1807
+ {
1808
+ name: "amount",
1809
+ type: "uint256",
1810
+ internalType: "uint256"
1811
+ }
1812
+ ]
1813
+ }
1814
+ ],
1815
+ outputs: [],
1816
+ stateMutability: "nonpayable"
1817
+ },
1818
+ {
1819
+ type: "function",
1820
+ name: "getRoleAdmin",
1821
+ inputs: [
1822
+ {
1823
+ name: "role",
1824
+ type: "bytes32",
1825
+ internalType: "bytes32"
1826
+ }
1827
+ ],
1828
+ outputs: [
1829
+ {
1830
+ name: "",
1831
+ type: "bytes32",
1832
+ internalType: "bytes32"
1833
+ }
1834
+ ],
1835
+ stateMutability: "view"
1836
+ },
1837
+ {
1838
+ type: "function",
1839
+ name: "getRoleMember",
1840
+ inputs: [
1841
+ {
1842
+ name: "role",
1843
+ type: "bytes32",
1844
+ internalType: "bytes32"
1845
+ },
1846
+ {
1847
+ name: "index",
1848
+ type: "uint256",
1849
+ internalType: "uint256"
1850
+ }
1851
+ ],
1852
+ outputs: [
1853
+ {
1854
+ name: "",
1855
+ type: "address",
1856
+ internalType: "address"
1857
+ }
1858
+ ],
1859
+ stateMutability: "view"
1860
+ },
1861
+ {
1862
+ type: "function",
1863
+ name: "getRoleMemberCount",
1864
+ inputs: [
1865
+ {
1866
+ name: "role",
1867
+ type: "bytes32",
1868
+ internalType: "bytes32"
1869
+ }
1870
+ ],
1871
+ outputs: [
1872
+ {
1873
+ name: "",
1874
+ type: "uint256",
1875
+ internalType: "uint256"
1876
+ }
1877
+ ],
1878
+ stateMutability: "view"
1879
+ },
1880
+ {
1881
+ type: "function",
1882
+ name: "getRoleMembers",
1883
+ inputs: [
1884
+ {
1885
+ name: "role",
1886
+ type: "bytes32",
1887
+ internalType: "bytes32"
1888
+ }
1889
+ ],
1890
+ outputs: [
1891
+ {
1892
+ name: "",
1893
+ type: "address[]",
1894
+ internalType: "address[]"
1895
+ }
1896
+ ],
1897
+ stateMutability: "view"
1898
+ },
1899
+ {
1900
+ type: "function",
1901
+ name: "getWithdrawalInfo",
1902
+ inputs: [
1903
+ {
1904
+ name: "idempotenceKey",
1905
+ type: "bytes32",
1906
+ internalType: "bytes32"
1907
+ }
1908
+ ],
1909
+ outputs: [
1910
+ {
1911
+ name: "",
1912
+ type: "tuple",
1913
+ internalType: "struct ISpicenetEscrow.WithdrawalInfo",
1914
+ components: [
1915
+ {
1916
+ name: "forUser",
1917
+ type: "string",
1918
+ internalType: "string"
1919
+ },
1920
+ {
1921
+ name: "blockNumber",
1922
+ type: "uint256",
1923
+ internalType: "uint256"
1924
+ },
1925
+ {
1926
+ name: "nbf",
1927
+ type: "uint256",
1928
+ internalType: "uint256"
1929
+ },
1930
+ {
1931
+ name: "exp",
1932
+ type: "uint256",
1933
+ internalType: "uint256"
1934
+ },
1935
+ {
1936
+ name: "metadata",
1937
+ type: "string",
1938
+ internalType: "string"
1939
+ }
1940
+ ]
1941
+ }
1942
+ ],
1943
+ stateMutability: "view"
1944
+ },
1945
+ {
1946
+ type: "function",
1947
+ name: "grantRole",
1948
+ inputs: [
1949
+ {
1950
+ name: "role",
1951
+ type: "bytes32",
1952
+ internalType: "bytes32"
1953
+ },
1954
+ {
1955
+ name: "account",
1956
+ type: "address",
1957
+ internalType: "address"
1958
+ }
1959
+ ],
1960
+ outputs: [],
1961
+ stateMutability: "nonpayable"
1962
+ },
1963
+ {
1964
+ type: "function",
1965
+ name: "hasRole",
1966
+ inputs: [
1967
+ {
1968
+ name: "role",
1969
+ type: "bytes32",
1970
+ internalType: "bytes32"
1971
+ },
1972
+ {
1973
+ name: "account",
1974
+ type: "address",
1975
+ internalType: "address"
1976
+ }
1977
+ ],
1978
+ outputs: [
1979
+ {
1980
+ name: "",
1981
+ type: "bool",
1982
+ internalType: "bool"
1983
+ }
1984
+ ],
1985
+ stateMutability: "view"
1986
+ },
1987
+ {
1988
+ type: "function",
1989
+ name: "initialize",
1990
+ inputs: [
1991
+ {
1992
+ name: "defaultAdmin",
1993
+ type: "address",
1994
+ internalType: "address"
1995
+ }
1996
+ ],
1997
+ outputs: [],
1998
+ stateMutability: "nonpayable"
1999
+ },
2000
+ {
2001
+ type: "function",
2002
+ name: "pause",
2003
+ inputs: [],
2004
+ outputs: [],
2005
+ stateMutability: "nonpayable"
2006
+ },
2007
+ {
2008
+ type: "function",
2009
+ name: "paused",
2010
+ inputs: [],
2011
+ outputs: [
2012
+ {
2013
+ name: "",
2014
+ type: "bool",
2015
+ internalType: "bool"
2016
+ }
2017
+ ],
2018
+ stateMutability: "view"
2019
+ },
2020
+ {
2021
+ type: "function",
2022
+ name: "processWithdrawal",
2023
+ inputs: [
2024
+ {
2025
+ name: "request",
2026
+ type: "tuple",
2027
+ internalType: "struct ISpicenetEscrow.WithdrawalRequest",
2028
+ components: [
2029
+ {
2030
+ name: "idempotenceKey",
2031
+ type: "bytes32",
2032
+ internalType: "bytes32"
2033
+ },
2034
+ {
2035
+ name: "forUser",
2036
+ type: "string",
2037
+ internalType: "string"
2038
+ },
2039
+ {
2040
+ name: "nbf",
2041
+ type: "uint256",
2042
+ internalType: "uint256"
2043
+ },
2044
+ {
2045
+ name: "exp",
2046
+ type: "uint256",
2047
+ internalType: "uint256"
2048
+ },
2049
+ {
2050
+ name: "metadata",
2051
+ type: "string",
2052
+ internalType: "string"
2053
+ },
2054
+ {
2055
+ name: "transfers",
2056
+ type: "tuple[]",
2057
+ internalType: "struct ISpicenetEscrow.TokenTransfer[]",
2058
+ components: [
2059
+ {
2060
+ name: "token",
2061
+ type: "address",
2062
+ internalType: "address"
2063
+ },
2064
+ {
2065
+ name: "to",
2066
+ type: "address",
2067
+ internalType: "address"
2068
+ },
2069
+ {
2070
+ name: "amount",
2071
+ type: "uint256",
2072
+ internalType: "uint256"
2073
+ }
2074
+ ]
2075
+ }
2076
+ ]
2077
+ }
2078
+ ],
2079
+ outputs: [],
2080
+ stateMutability: "nonpayable"
2081
+ },
2082
+ {
2083
+ type: "function",
2084
+ name: "proxiableUUID",
2085
+ inputs: [],
2086
+ outputs: [
2087
+ {
2088
+ name: "",
2089
+ type: "bytes32",
2090
+ internalType: "bytes32"
2091
+ }
2092
+ ],
2093
+ stateMutability: "view"
2094
+ },
2095
+ {
2096
+ type: "function",
2097
+ name: "renounceRole",
2098
+ inputs: [
2099
+ {
2100
+ name: "role",
2101
+ type: "bytes32",
2102
+ internalType: "bytes32"
2103
+ },
2104
+ {
2105
+ name: "callerConfirmation",
2106
+ type: "address",
2107
+ internalType: "address"
2108
+ }
2109
+ ],
2110
+ outputs: [],
2111
+ stateMutability: "nonpayable"
2112
+ },
2113
+ {
2114
+ type: "function",
2115
+ name: "revokeRole",
2116
+ inputs: [
2117
+ {
2118
+ name: "role",
2119
+ type: "bytes32",
2120
+ internalType: "bytes32"
2121
+ },
2122
+ {
2123
+ name: "account",
2124
+ type: "address",
2125
+ internalType: "address"
2126
+ }
2127
+ ],
2128
+ outputs: [],
2129
+ stateMutability: "nonpayable"
2130
+ },
2131
+ {
2132
+ type: "function",
2133
+ name: "supportsInterface",
2134
+ inputs: [
2135
+ {
2136
+ name: "interfaceId",
2137
+ type: "bytes4",
2138
+ internalType: "bytes4"
2139
+ }
2140
+ ],
2141
+ outputs: [
2142
+ {
2143
+ name: "",
2144
+ type: "bool",
2145
+ internalType: "bool"
2146
+ }
2147
+ ],
2148
+ stateMutability: "view"
2149
+ },
2150
+ {
2151
+ type: "function",
2152
+ name: "unpause",
2153
+ inputs: [],
2154
+ outputs: [],
2155
+ stateMutability: "nonpayable"
2156
+ },
2157
+ {
2158
+ type: "function",
2159
+ name: "upgradeToAndCall",
2160
+ inputs: [
2161
+ {
2162
+ name: "newImplementation",
2163
+ type: "address",
2164
+ internalType: "address"
2165
+ },
2166
+ {
2167
+ name: "data",
2168
+ type: "bytes",
2169
+ internalType: "bytes"
2170
+ }
2171
+ ],
2172
+ outputs: [],
2173
+ stateMutability: "payable"
2174
+ },
2175
+ {
2176
+ type: "event",
2177
+ name: "Initialized",
2178
+ inputs: [
2179
+ {
2180
+ name: "version",
2181
+ type: "uint64",
2182
+ indexed: false,
2183
+ internalType: "uint64"
2184
+ }
2185
+ ],
2186
+ anonymous: false
2187
+ },
2188
+ {
2189
+ type: "event",
2190
+ name: "NativeTransfer",
2191
+ inputs: [
2192
+ {
2193
+ name: "from",
2194
+ type: "address",
2195
+ indexed: true,
2196
+ internalType: "address"
2197
+ },
2198
+ {
2199
+ name: "to",
2200
+ type: "address",
2201
+ indexed: true,
2202
+ internalType: "address"
2203
+ },
2204
+ {
2205
+ name: "value",
2206
+ type: "uint256",
2207
+ indexed: false,
2208
+ internalType: "uint256"
2209
+ }
2210
+ ],
2211
+ anonymous: false
2212
+ },
2213
+ {
2214
+ type: "event",
2215
+ name: "Paused",
2216
+ inputs: [
2217
+ {
2218
+ name: "account",
2219
+ type: "address",
2220
+ indexed: false,
2221
+ internalType: "address"
2222
+ }
2223
+ ],
2224
+ anonymous: false
2225
+ },
2226
+ {
2227
+ type: "event",
2228
+ name: "RoleAdminChanged",
2229
+ inputs: [
2230
+ {
2231
+ name: "role",
2232
+ type: "bytes32",
2233
+ indexed: true,
2234
+ internalType: "bytes32"
2235
+ },
2236
+ {
2237
+ name: "previousAdminRole",
2238
+ type: "bytes32",
2239
+ indexed: true,
2240
+ internalType: "bytes32"
2241
+ },
2242
+ {
2243
+ name: "newAdminRole",
2244
+ type: "bytes32",
2245
+ indexed: true,
2246
+ internalType: "bytes32"
2247
+ }
2248
+ ],
2249
+ anonymous: false
2250
+ },
2251
+ {
2252
+ type: "event",
2253
+ name: "RoleGranted",
2254
+ inputs: [
2255
+ {
2256
+ name: "role",
2257
+ type: "bytes32",
2258
+ indexed: true,
2259
+ internalType: "bytes32"
2260
+ },
2261
+ {
2262
+ name: "account",
2263
+ type: "address",
2264
+ indexed: true,
2265
+ internalType: "address"
2266
+ },
2267
+ {
2268
+ name: "sender",
2269
+ type: "address",
2270
+ indexed: true,
2271
+ internalType: "address"
2272
+ }
2273
+ ],
2274
+ anonymous: false
2275
+ },
2276
+ {
2277
+ type: "event",
2278
+ name: "RoleRevoked",
2279
+ inputs: [
2280
+ {
2281
+ name: "role",
2282
+ type: "bytes32",
2283
+ indexed: true,
2284
+ internalType: "bytes32"
2285
+ },
2286
+ {
2287
+ name: "account",
2288
+ type: "address",
2289
+ indexed: true,
2290
+ internalType: "address"
2291
+ },
2292
+ {
2293
+ name: "sender",
2294
+ type: "address",
2295
+ indexed: true,
2296
+ internalType: "address"
2297
+ }
2298
+ ],
2299
+ anonymous: false
2300
+ },
2301
+ {
2302
+ type: "event",
2303
+ name: "Unpaused",
2304
+ inputs: [
2305
+ {
2306
+ name: "account",
2307
+ type: "address",
2308
+ indexed: false,
2309
+ internalType: "address"
2310
+ }
2311
+ ],
2312
+ anonymous: false
2313
+ },
2314
+ {
2315
+ type: "event",
2316
+ name: "Upgraded",
2317
+ inputs: [
2318
+ {
2319
+ name: "implementation",
2320
+ type: "address",
2321
+ indexed: true,
2322
+ internalType: "address"
2323
+ }
2324
+ ],
2325
+ anonymous: false
2326
+ },
2327
+ {
2328
+ type: "event",
2329
+ name: "WithdrawalProcessed",
2330
+ inputs: [
2331
+ {
2332
+ name: "idempotenceKey",
2333
+ type: "bytes32",
2334
+ indexed: true,
2335
+ internalType: "bytes32"
2336
+ },
2337
+ {
2338
+ name: "forUser",
2339
+ type: "string",
2340
+ indexed: true,
2341
+ internalType: "string"
2342
+ },
2343
+ {
2344
+ name: "request",
2345
+ type: "tuple",
2346
+ indexed: false,
2347
+ internalType: "struct ISpicenetEscrow.WithdrawalRequest",
2348
+ components: [
2349
+ {
2350
+ name: "idempotenceKey",
2351
+ type: "bytes32",
2352
+ internalType: "bytes32"
2353
+ },
2354
+ {
2355
+ name: "forUser",
2356
+ type: "string",
2357
+ internalType: "string"
2358
+ },
2359
+ {
2360
+ name: "nbf",
2361
+ type: "uint256",
2362
+ internalType: "uint256"
2363
+ },
2364
+ {
2365
+ name: "exp",
2366
+ type: "uint256",
2367
+ internalType: "uint256"
2368
+ },
2369
+ {
2370
+ name: "metadata",
2371
+ type: "string",
2372
+ internalType: "string"
2373
+ },
2374
+ {
2375
+ name: "transfers",
2376
+ type: "tuple[]",
2377
+ internalType: "struct ISpicenetEscrow.TokenTransfer[]",
2378
+ components: [
2379
+ {
2380
+ name: "token",
2381
+ type: "address",
2382
+ internalType: "address"
2383
+ },
2384
+ {
2385
+ name: "to",
2386
+ type: "address",
2387
+ internalType: "address"
2388
+ },
2389
+ {
2390
+ name: "amount",
2391
+ type: "uint256",
2392
+ internalType: "uint256"
2393
+ }
2394
+ ]
2395
+ }
2396
+ ]
2397
+ }
2398
+ ],
2399
+ anonymous: false
2400
+ },
2401
+ {
2402
+ type: "error",
2403
+ name: "AccessControlBadConfirmation",
2404
+ inputs: []
2405
+ },
2406
+ {
2407
+ type: "error",
2408
+ name: "AccessControlUnauthorizedAccount",
2409
+ inputs: [
2410
+ {
2411
+ name: "account",
2412
+ type: "address",
2413
+ internalType: "address"
2414
+ },
2415
+ {
2416
+ name: "neededRole",
2417
+ type: "bytes32",
2418
+ internalType: "bytes32"
2419
+ }
2420
+ ]
2421
+ },
2422
+ {
2423
+ type: "error",
2424
+ name: "AddressEmptyCode",
2425
+ inputs: [
2426
+ {
2427
+ name: "target",
2428
+ type: "address",
2429
+ internalType: "address"
2430
+ }
2431
+ ]
2432
+ },
2433
+ {
2434
+ type: "error",
2435
+ name: "ERC1967InvalidImplementation",
2436
+ inputs: [
2437
+ {
2438
+ name: "implementation",
2439
+ type: "address",
2440
+ internalType: "address"
2441
+ }
2442
+ ]
2443
+ },
2444
+ {
2445
+ type: "error",
2446
+ name: "ERC1967NonPayable",
2447
+ inputs: []
2448
+ },
2449
+ {
2450
+ type: "error",
2451
+ name: "EnforcedPause",
2452
+ inputs: []
2453
+ },
2454
+ {
2455
+ type: "error",
2456
+ name: "ExpectedPause",
2457
+ inputs: []
2458
+ },
2459
+ {
2460
+ type: "error",
2461
+ name: "FailedCall",
2462
+ inputs: []
2463
+ },
2464
+ {
2465
+ type: "error",
2466
+ name: "InsufficientBalance",
2467
+ inputs: [
2468
+ {
2469
+ name: "balance",
2470
+ type: "uint256",
2471
+ internalType: "uint256"
2472
+ },
2473
+ {
2474
+ name: "needed",
2475
+ type: "uint256",
2476
+ internalType: "uint256"
2477
+ }
2478
+ ]
2479
+ },
2480
+ {
2481
+ type: "error",
2482
+ name: "InvalidInitialization",
2483
+ inputs: []
2484
+ },
2485
+ {
2486
+ type: "error",
2487
+ name: "NotInitializing",
2488
+ inputs: []
2489
+ },
2490
+ {
2491
+ type: "error",
2492
+ name: "SafeERC20FailedOperation",
2493
+ inputs: [
2494
+ {
2495
+ name: "token",
2496
+ type: "address",
2497
+ internalType: "address"
2498
+ }
2499
+ ]
2500
+ },
2501
+ {
2502
+ type: "error",
2503
+ name: "UUPSUnauthorizedCallContext",
2504
+ inputs: []
2505
+ },
2506
+ {
2507
+ type: "error",
2508
+ name: "UUPSUnsupportedProxiableUUID",
2509
+ inputs: [
2510
+ {
2511
+ name: "slot",
2512
+ type: "bytes32",
2513
+ internalType: "bytes32"
2514
+ }
2515
+ ]
2516
+ },
2517
+ {
2518
+ type: "error",
2519
+ name: "WithdrawalAlreadyProcessed",
2520
+ inputs: [
2521
+ {
2522
+ name: "idempotenceKey",
2523
+ type: "bytes32",
2524
+ internalType: "bytes32"
2525
+ },
2526
+ {
2527
+ name: "withdrawalInfo",
2528
+ type: "tuple",
2529
+ internalType: "struct ISpicenetEscrow.WithdrawalInfo",
2530
+ components: [
2531
+ {
2532
+ name: "forUser",
2533
+ type: "string",
2534
+ internalType: "string"
2535
+ },
2536
+ {
2537
+ name: "blockNumber",
2538
+ type: "uint256",
2539
+ internalType: "uint256"
2540
+ },
2541
+ {
2542
+ name: "nbf",
2543
+ type: "uint256",
2544
+ internalType: "uint256"
2545
+ },
2546
+ {
2547
+ name: "exp",
2548
+ type: "uint256",
2549
+ internalType: "uint256"
2550
+ },
2551
+ {
2552
+ name: "metadata",
2553
+ type: "string",
2554
+ internalType: "string"
2555
+ }
2556
+ ]
2557
+ }
2558
+ ]
2559
+ },
2560
+ {
2561
+ type: "error",
2562
+ name: "WithdrawalRequestExpired",
2563
+ inputs: [
2564
+ {
2565
+ name: "currentTime",
2566
+ type: "uint256",
2567
+ internalType: "uint256"
2568
+ },
2569
+ {
2570
+ name: "exp",
2571
+ type: "uint256",
2572
+ internalType: "uint256"
2573
+ }
2574
+ ]
2575
+ },
2576
+ {
2577
+ type: "error",
2578
+ name: "WithdrawalRequestTooEarly",
2579
+ inputs: [
2580
+ {
2581
+ name: "currentTime",
2582
+ type: "uint256",
2583
+ internalType: "uint256"
2584
+ },
2585
+ {
2586
+ name: "nbf",
2587
+ type: "uint256",
2588
+ internalType: "uint256"
2589
+ }
2590
+ ]
2591
+ }
2592
+ ];
2593
+
2594
+ // src/swap.ts
2595
+ var import_viem3 = require("viem");
2596
+ function applySlippage(amount, slippage = 0.03) {
2597
+ const slippageBps = BigInt(Math.floor((1 - slippage) * 1e4));
2598
+ return amount * slippageBps / 10000n;
2599
+ }
2600
+ function buildUniV3SwapCalls(params) {
2601
+ const {
2602
+ tokenIn,
2603
+ tokenOut,
2604
+ amountIn,
2605
+ amountOutMinimum,
2606
+ fee,
2607
+ recipient,
2608
+ config
2609
+ } = params;
2610
+ return [
2611
+ {
2612
+ to: tokenIn,
2613
+ value: 0n,
2614
+ data: (0, import_viem3.encodeFunctionData)({
2615
+ abi: import_viem3.erc20Abi,
2616
+ functionName: "approve",
2617
+ args: [config.swapRouter, amountIn]
2618
+ })
2619
+ },
2620
+ {
2621
+ to: config.swapRouter,
2622
+ value: 0n,
2623
+ data: (0, import_viem3.encodeFunctionData)({
2624
+ abi: uniV3SwapRouterAbi,
2625
+ functionName: "exactInputSingle",
2626
+ args: [
2627
+ {
2628
+ tokenIn,
2629
+ tokenOut,
2630
+ fee,
2631
+ recipient,
2632
+ amountIn,
2633
+ amountOutMinimum,
2634
+ sqrtPriceLimitX96: 0n
2635
+ }
2636
+ ]
2637
+ })
2638
+ }
2639
+ ];
2640
+ }
2641
+
2642
+ // src/constants.ts
2643
+ var SPICE_SOLVER_ADDRESS = "0x111115763723B53395308eC4c9AB9d5FB0844cae";
2644
+ var SPICE_GAS_FEE_RECIPIENT = "0x737680c45F88A8b1b389e354dde11419f89BAdd6";
2645
+ var SPICE_PLATFORM_FEE_RECIPIENT = "0xa4bB4c1D188B94c0cF691Dad213dE24169fA0A50";
2646
+ var SPICE_COMBINED_FEE_RECIPIENT = SPICE_GAS_FEE_RECIPIENT;
2647
+ // Annotate the CommonJS export names for ESM import in node:
2648
+ 0 && (module.exports = {
2649
+ CHAINS,
2650
+ ChainBatchHashAbi,
2651
+ DELEGATE_ABI,
2652
+ ERC20_ABI,
2653
+ HttpError,
2654
+ IntentHashAbi,
2655
+ NATIVE_TOKEN_ADDRESS,
2656
+ SPICENET_NATIVE_CHAIN_ID,
2657
+ SPICE_COMBINED_FEE_RECIPIENT,
2658
+ SPICE_GAS_FEE_RECIPIENT,
2659
+ SPICE_PLATFORM_FEE_RECIPIENT,
2660
+ SPICE_SOLVER_ADDRESS,
2661
+ STARKNET_MAINNET_CHAIN_ID,
2662
+ SpiceFlowCore,
2663
+ TOKENS,
2664
+ VIEM_CHAINS,
2665
+ WCBTC_ABI,
2666
+ ZERO_ADDRESS,
2667
+ applySlippage,
2668
+ areEquivalent,
2669
+ buildUniV3SwapCalls,
2670
+ convertAmountBetweenDecimals,
2671
+ fetchWithRetry,
2672
+ formatTokenAmount,
2673
+ getAccountNonce,
2674
+ getAllChainsByNetwork,
2675
+ getChainIdsByNetwork,
2676
+ getChainMeta,
2677
+ getChainsByNetwork,
2678
+ getDelegateContract,
2679
+ getDeployment,
2680
+ getEquivalenceGroup,
2681
+ getEquivalentAddresses,
2682
+ getEscrowContract,
2683
+ getEscrowContractAddress,
2684
+ getIntentHash,
2685
+ getIntentStepStatus,
2686
+ getMainnetChains,
2687
+ getRecentBlock,
2688
+ getTestnetChains,
2689
+ getTokenByAddress,
2690
+ getTokenBySymbol,
2691
+ getTokenDefinition,
2692
+ getTokensForChain,
2693
+ getViemChain,
2694
+ hashChainBatches,
2695
+ isBtcDenominated,
2696
+ isNativeToken,
2697
+ isSpicenetChainId,
2698
+ isStarknetChain,
2699
+ isUsdDenominated,
2700
+ normalizeNativeTokenAddress,
2701
+ prepareRFQT,
2702
+ requireTokenBySymbol,
2703
+ requireViemChain,
2704
+ resolveTokenRef,
2705
+ spicenetAbi,
2706
+ spicenetEscrowAbi,
2707
+ spicenetWalletManagerAbi,
2708
+ submitTransaction,
2709
+ truncateAddress,
2710
+ uniV3QuoterV2Abi,
2711
+ uniV3SwapRouterAbi,
2712
+ withRetry
2713
+ });