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