@spicenet-io/spiceflow-core 0.4.0 → 0.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (59) hide show
  1. package/package.json +1 -1
  2. package/dist/abis/delegate.d.ts +0 -419
  3. package/dist/abis/delegate.d.ts.map +0 -1
  4. package/dist/abis/erc20.d.ts +0 -130
  5. package/dist/abis/erc20.d.ts.map +0 -1
  6. package/dist/abis/index.d.ts +0 -8
  7. package/dist/abis/index.d.ts.map +0 -1
  8. package/dist/abis/spicenet.d.ts +0 -116
  9. package/dist/abis/spicenet.d.ts.map +0 -1
  10. package/dist/abis/spicenetEscrow.d.ts +0 -771
  11. package/dist/abis/spicenetEscrow.d.ts.map +0 -1
  12. package/dist/abis/spicenetWalletManager.d.ts +0 -2
  13. package/dist/abis/spicenetWalletManager.d.ts.map +0 -1
  14. package/dist/abis/uniV3.d.ts +0 -93
  15. package/dist/abis/uniV3.d.ts.map +0 -1
  16. package/dist/abis/wcbtc.d.ts +0 -58
  17. package/dist/abis/wcbtc.d.ts.map +0 -1
  18. package/dist/api.d.ts +0 -161
  19. package/dist/api.d.ts.map +0 -1
  20. package/dist/authorization.d.ts +0 -44
  21. package/dist/authorization.d.ts.map +0 -1
  22. package/dist/chains/index.d.ts +0 -26
  23. package/dist/chains/index.d.ts.map +0 -1
  24. package/dist/chains/list.d.ts +0 -3
  25. package/dist/chains/list.d.ts.map +0 -1
  26. package/dist/chains/types.d.ts +0 -31
  27. package/dist/chains/types.d.ts.map +0 -1
  28. package/dist/config.d.ts +0 -9
  29. package/dist/config.d.ts.map +0 -1
  30. package/dist/constants.d.ts +0 -7
  31. package/dist/constants.d.ts.map +0 -1
  32. package/dist/core.d.ts +0 -49
  33. package/dist/core.d.ts.map +0 -1
  34. package/dist/http.d.ts +0 -17
  35. package/dist/http.d.ts.map +0 -1
  36. package/dist/index.cjs +0 -2713
  37. package/dist/index.d.ts +0 -16
  38. package/dist/index.d.ts.map +0 -1
  39. package/dist/index.js +0 -2624
  40. package/dist/logos.d.ts +0 -14
  41. package/dist/logos.d.ts.map +0 -1
  42. package/dist/relayer.d.ts +0 -22
  43. package/dist/relayer.d.ts.map +0 -1
  44. package/dist/rfqt.d.ts +0 -17
  45. package/dist/rfqt.d.ts.map +0 -1
  46. package/dist/status.d.ts +0 -10
  47. package/dist/status.d.ts.map +0 -1
  48. package/dist/swap.d.ts +0 -31
  49. package/dist/swap.d.ts.map +0 -1
  50. package/dist/tokens/index.d.ts +0 -17
  51. package/dist/tokens/index.d.ts.map +0 -1
  52. package/dist/tokens/list.d.ts +0 -3
  53. package/dist/tokens/list.d.ts.map +0 -1
  54. package/dist/tokens/types.d.ts +0 -33
  55. package/dist/tokens/types.d.ts.map +0 -1
  56. package/dist/types.d.ts +0 -66
  57. package/dist/types.d.ts.map +0 -1
  58. package/dist/utils.d.ts +0 -11
  59. package/dist/utils.d.ts.map +0 -1
package/dist/index.js DELETED
@@ -1,2624 +0,0 @@
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/7SgOekVydB9TOyNk3NKj8",
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/7SgOekVydB9TOyNk3NKj8",
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/7SgOekVydB9TOyNk3NKj8",
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/7SgOekVydB9TOyNk3NKj8",
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
- };