UNPKG

onesec-bridge

Version:
1,610 lines 351 kB
import { unzip as Ei } from "fflate"; import { HttpAgent as Ti, Actor as es } from "@dfinity/agent"; const Ze = "abcdefghijklmnopqrstuvwxyz234567", ce = /* @__PURE__ */ Object.create(null); for (let e = 0; e < Ze.length; e++) ce[Ze[e]] = e; ce[0] = ce.o; ce[1] = ce.i; function Ni(e) { let t = 0, n = 0, r = ""; function s(i) { return t < 0 ? n |= i >> -t : n = i << t & 248, t > 3 ? (t -= 8, 1) : (t < 4 && (r += Ze[n >> 3], t += 5), 0); } for (let i = 0; i < e.length; ) i += s(e[i]); return r + (t < 0 ? Ze[n >> 3] : ""); } function ki(e) { let t = 0, n = 0; const r = new Uint8Array(e.length * 4 / 3 | 0); let s = 0; function i(a) { let o = ce[a.toLowerCase()]; if (o === void 0) throw new Error(`Invalid character: ${JSON.stringify(a)}`); o <<= 3, n |= o >>> t, t += 5, t >= 8 && (r[s++] = n, t -= 8, t > 0 ? n = o << 5 - t & 255 : n = 0); } for (const a of e) i(a); return r.slice(0, s); } const Ci = new Uint32Array([ 0, 1996959894, 3993919788, 2567524794, 124634137, 1886057615, 3915621685, 2657392035, 249268274, 2044508324, 3772115230, 2547177864, 162941995, 2125561021, 3887607047, 2428444049, 498536548, 1789927666, 4089016648, 2227061214, 450548861, 1843258603, 4107580753, 2211677639, 325883990, 1684777152, 4251122042, 2321926636, 335633487, 1661365465, 4195302755, 2366115317, 997073096, 1281953886, 3579855332, 2724688242, 1006888145, 1258607687, 3524101629, 2768942443, 901097722, 1119000684, 3686517206, 2898065728, 853044451, 1172266101, 3705015759, 2882616665, 651767980, 1373503546, 3369554304, 3218104598, 565507253, 1454621731, 3485111705, 3099436303, 671266974, 1594198024, 3322730930, 2970347812, 795835527, 1483230225, 3244367275, 3060149565, 1994146192, 31158534, 2563907772, 4023717930, 1907459465, 112637215, 2680153253, 3904427059, 2013776290, 251722036, 2517215374, 3775830040, 2137656763, 141376813, 2439277719, 3865271297, 1802195444, 476864866, 2238001368, 4066508878, 1812370925, 453092731, 2181625025, 4111451223, 1706088902, 314042704, 2344532202, 4240017532, 1658658271, 366619977, 2362670323, 4224994405, 1303535960, 984961486, 2747007092, 3569037538, 1256170817, 1037604311, 2765210733, 3554079995, 1131014506, 879679996, 2909243462, 3663771856, 1141124467, 855842277, 2852801631, 3708648649, 1342533948, 654459306, 3188396048, 3373015174, 1466479909, 544179635, 3110523913, 3462522015, 1591671054, 702138776, 2966460450, 3352799412, 1504918807, 783551873, 3082640443, 3233442989, 3988292384, 2596254646, 62317068, 1957810842, 3939845945, 2647816111, 81470997, 1943803523, 3814918930, 2489596804, 225274430, 2053790376, 3826175755, 2466906013, 167816743, 2097651377, 4027552580, 2265490386, 503444072, 1762050814, 4150417245, 2154129355, 426522225, 1852507879, 4275313526, 2312317920, 282753626, 1742555852, 4189708143, 2394877945, 397917763, 1622183637, 3604390888, 2714866558, 953729732, 1340076626, 3518719985, 2797360999, 1068828381, 1219638859, 3624741850, 2936675148, 906185462, 1090812512, 3747672003, 2825379669, 829329135, 1181335161, 3412177804, 3160834842, 628085408, 1382605366, 3423369109, 3138078467, 570562233, 1426400815, 3317316542, 2998733608, 733239954, 1555261956, 3268935591, 3050360625, 752459403, 1541320221, 2607071920, 3965973030, 1969922972, 40735498, 2617837225, 3943577151, 1913087877, 83908371, 2512341634, 3803740692, 2075208622, 213261112, 2463272603, 3855990285, 2094854071, 198958881, 2262029012, 4057260610, 1759359992, 534414190, 2176718541, 4139329115, 1873836001, 414664567, 2282248934, 4279200368, 1711684554, 285281116, 2405801727, 4167216745, 1634467795, 376229701, 2685067896, 3608007406, 1308918612, 956543938, 2808555105, 3495958263, 1231636301, 1047427035, 2932959818, 3654703836, 1088359270, 936918e3, 2847714899, 3736837829, 1202900863, 817233897, 3183342108, 3401237130, 1404277552, 615818150, 3134207493, 3453421203, 1423857449, 601450431, 3009837614, 3294710456, 1567103746, 711928724, 3020668471, 3272380065, 1510334235, 755167117 ]); function Oi(e) { let t = -1; for (let n = 0; n < e.length; n++) { const s = (e[n] ^ t) & 255; t = Ci[s] ^ t >>> 8; } return (t ^ -1) >>> 0; } /*! noble-hashes - MIT License (c) 2022 Paul Miller (paulmillr.com) */ function Fi(e) { return e instanceof Uint8Array || ArrayBuffer.isView(e) && e.constructor.name === "Uint8Array"; } function nn(e, ...t) { if (!Fi(e)) throw new Error("Uint8Array expected"); if (t.length > 0 && !t.includes(e.length)) throw new Error("Uint8Array expected of length " + t + ", got length=" + e.length); } function mr(e, t = !0) { if (e.destroyed) throw new Error("Hash instance has been destroyed"); if (t && e.finished) throw new Error("Hash#digest() has already been called"); } function Si(e, t) { nn(e); const n = t.outputLen; if (e.length < n) throw new Error("digestInto() expects output buffer of length at least " + n); } function Gn(...e) { for (let t = 0; t < e.length; t++) e[t].fill(0); } function Un(e) { return new DataView(e.buffer, e.byteOffset, e.byteLength); } function ot(e, t) { return e << 32 - t | e >>> t; } const ns = /* @ts-ignore */ typeof Uint8Array.from([]).toHex == "function" && typeof Uint8Array.fromHex == "function", Ri = /* @__PURE__ */ Array.from({ length: 256 }, (e, t) => t.toString(16).padStart(2, "0")); function Ui(e) { if (nn(e), ns) return e.toHex(); let t = ""; for (let n = 0; n < e.length; n++) t += Ri[e[n]]; return t; } const ft = { _0: 48, _9: 57, A: 65, F: 70, a: 97, f: 102 }; function gr(e) { if (e >= ft._0 && e <= ft._9) return e - ft._0; if (e >= ft.A && e <= ft.F) return e - (ft.A - 10); if (e >= ft.a && e <= ft.f) return e - (ft.a - 10); } function Bi(e) { if (typeof e != "string") throw new Error("hex string expected, got " + typeof e); if (ns) return Uint8Array.fromHex(e); const t = e.length, n = t / 2; if (t % 2) throw new Error("hex string expected, got unpadded hex of length " + t); const r = new Uint8Array(n); for (let s = 0, i = 0; s < n; s++, i += 2) { const a = gr(e.charCodeAt(i)), o = gr(e.charCodeAt(i + 1)); if (a === void 0 || o === void 0) { const c = e[i] + e[i + 1]; throw new Error('hex string expected, got non-hex character "' + c + '" at index ' + i); } r[s] = a * 16 + o; } return r; } function Pi(e) { if (typeof e != "string") throw new Error("string expected"); return new Uint8Array(new TextEncoder().encode(e)); } function rs(e) { return typeof e == "string" && (e = Pi(e)), nn(e), e; } let Vi = class { }; function _i(e) { const t = (r) => e().update(rs(r)).digest(), n = e(); return t.outputLen = n.outputLen, t.blockLen = n.blockLen, t.create = () => e(), t; } function Mi(e, t, n, r) { if (typeof e.setBigUint64 == "function") return e.setBigUint64(t, n, r); const s = BigInt(32), i = BigInt(4294967295), a = Number(n >> s & i), o = Number(n & i), c = r ? 4 : 0, u = r ? 0 : 4; e.setUint32(t + c, a, r), e.setUint32(t + u, o, r); } function zi(e, t, n) { return e & t ^ ~e & n; } function Gi(e, t, n) { return e & t ^ e & n ^ t & n; } class Hi extends Vi { constructor(t, n, r, s) { super(), this.finished = !1, this.length = 0, this.pos = 0, this.destroyed = !1, this.blockLen = t, this.outputLen = n, this.padOffset = r, this.isLE = s, this.buffer = new Uint8Array(t), this.view = Un(this.buffer); } update(t) { mr(this), t = rs(t), nn(t); const { view: n, buffer: r, blockLen: s } = this, i = t.length; for (let a = 0; a < i; ) { const o = Math.min(s - this.pos, i - a); if (o === s) { const c = Un(t); for (; s <= i - a; a += s) this.process(c, a); continue; } r.set(t.subarray(a, a + o), this.pos), this.pos += o, a += o, this.pos === s && (this.process(n, 0), this.pos = 0); } return this.length += t.length, this.roundClean(), this; } digestInto(t) { mr(this), Si(t, this), this.finished = !0; const { buffer: n, view: r, blockLen: s, isLE: i } = this; let { pos: a } = this; n[a++] = 128, Gn(this.buffer.subarray(a)), this.padOffset > s - a && (this.process(r, 0), a = 0); for (let f = a; f < s; f++) n[f] = 0; Mi(r, s - 8, BigInt(this.length * 8), i), this.process(r, 0); const o = Un(t), c = this.outputLen; if (c % 4) throw new Error("_sha2: outputLen should be aligned to 32bit"); const u = c / 4, l = this.get(); if (u > l.length) throw new Error("_sha2: outputLen bigger than state"); for (let f = 0; f < u; f++) o.setUint32(4 * f, l[f], i); } digest() { const { buffer: t, outputLen: n } = this; this.digestInto(t); const r = t.slice(0, n); return this.destroy(), r; } _cloneInto(t) { t || (t = new this.constructor()), t.set(...this.get()); const { blockLen: n, buffer: r, length: s, finished: i, destroyed: a, pos: o } = this; return t.destroyed = a, t.finished = i, t.length = s, t.pos = o, s % n && t.buffer.set(r), t; } clone() { return this._cloneInto(); } } const kt = /* @__PURE__ */ Uint32Array.from([ 1779033703, 3144134277, 1013904242, 2773480762, 1359893119, 2600822924, 528734635, 1541459225 ]), Ct = /* @__PURE__ */ Uint32Array.from([ 3238371032, 914150663, 812702999, 4144912697, 4290775857, 1750603025, 1694076839, 3204075428 ]), Wi = /* @__PURE__ */ Uint32Array.from([ 1116352408, 1899447441, 3049323471, 3921009573, 961987163, 1508970993, 2453635748, 2870763221, 3624381080, 310598401, 607225278, 1426881987, 1925078388, 2162078206, 2614888103, 3248222580, 3835390401, 4022224774, 264347078, 604807628, 770255983, 1249150122, 1555081692, 1996064986, 2554220882, 2821834349, 2952996808, 3210313671, 3336571891, 3584528711, 113926993, 338241895, 666307205, 773529912, 1294757372, 1396182291, 1695183700, 1986661051, 2177026350, 2456956037, 2730485921, 2820302411, 3259730800, 3345764771, 3516065817, 3600352804, 4094571909, 275423344, 430227734, 506948616, 659060556, 883997877, 958139571, 1322822218, 1537002063, 1747873779, 1955562222, 2024104815, 2227730452, 2361852424, 2428436474, 2756734187, 3204031479, 3329325298 ]), Ot = /* @__PURE__ */ new Uint32Array(64); class Xi extends Hi { constructor(t = 32) { super(64, t, 8, !1), this.A = kt[0] | 0, this.B = kt[1] | 0, this.C = kt[2] | 0, this.D = kt[3] | 0, this.E = kt[4] | 0, this.F = kt[5] | 0, this.G = kt[6] | 0, this.H = kt[7] | 0; } get() { const { A: t, B: n, C: r, D: s, E: i, F: a, G: o, H: c } = this; return [t, n, r, s, i, a, o, c]; } // prettier-ignore set(t, n, r, s, i, a, o, c) { this.A = t | 0, this.B = n | 0, this.C = r | 0, this.D = s | 0, this.E = i | 0, this.F = a | 0, this.G = o | 0, this.H = c | 0; } process(t, n) { for (let f = 0; f < 16; f++, n += 4) Ot[f] = t.getUint32(n, !1); for (let f = 16; f < 64; f++) { const d = Ot[f - 15], p = Ot[f - 2], v = ot(d, 7) ^ ot(d, 18) ^ d >>> 3, A = ot(p, 17) ^ ot(p, 19) ^ p >>> 10; Ot[f] = A + Ot[f - 7] + v + Ot[f - 16] | 0; } let { A: r, B: s, C: i, D: a, E: o, F: c, G: u, H: l } = this; for (let f = 0; f < 64; f++) { const d = ot(o, 6) ^ ot(o, 11) ^ ot(o, 25), p = l + d + zi(o, c, u) + Wi[f] + Ot[f] | 0, A = (ot(r, 2) ^ ot(r, 13) ^ ot(r, 22)) + Gi(r, s, i) | 0; l = u, u = c, c = o, o = a + p | 0, a = i, i = s, s = r, r = p + A | 0; } r = r + this.A | 0, s = s + this.B | 0, i = i + this.C | 0, a = a + this.D | 0, o = o + this.E | 0, c = c + this.F | 0, u = u + this.G | 0, l = l + this.H | 0, this.set(r, s, i, a, o, c, u, l); } roundClean() { Gn(Ot); } destroy() { this.set(0, 0, 0, 0, 0, 0, 0, 0), Gn(this.buffer); } } class Ji extends Xi { constructor() { super(28), this.A = Ct[0] | 0, this.B = Ct[1] | 0, this.C = Ct[2] | 0, this.D = Ct[3] | 0, this.E = Ct[4] | 0, this.F = Ct[5] | 0, this.G = Ct[6] | 0, this.H = Ct[7] | 0; } } const qi = /* @__PURE__ */ _i(() => new Ji()), ze = "__principal__", Yi = 2, yr = 4, Ii = "aaaaa-aa"; let ue = class se { static anonymous() { return new this(new Uint8Array([yr])); } /** * Utility method, returning the principal representing the management canister, decoded from the hex string `'aaaaa-aa'` * @returns {Principal} principal of the management canister */ static managementCanister() { return this.fromText(Ii); } static selfAuthenticating(t) { const n = qi(t); return new this(new Uint8Array([...n, Yi])); } static from(t) { if (typeof t == "string") return se.fromText(t); if (Object.getPrototypeOf(t) === Uint8Array.prototype) return new se(t); if (se.isPrincipal(t)) return new se(t._arr); throw new Error(`Impossible to convert ${JSON.stringify(t)} to Principal.`); } static fromHex(t) { return new this(Bi(t)); } static fromText(t) { let n = t; if (t.includes(ze)) { const a = JSON.parse(t); ze in a && (n = a[ze]); } const r = n.toLowerCase().replace(/-/g, ""); let s = ki(r); s = s.slice(4, s.length); const i = new this(s); if (i.toText() !== n) throw new Error(`Principal "${i.toText()}" does not have a valid checksum (original value "${n}" may not be a valid Principal ID).`); return i; } static fromUint8Array(t) { return new this(t); } static isPrincipal(t) { return t instanceof se || typeof t == "object" && t !== null && "_isPrincipal" in t && t._isPrincipal === !0 && "_arr" in t && t._arr instanceof Uint8Array; } constructor(t) { this._arr = t, this._isPrincipal = !0; } isAnonymous() { return this._arr.byteLength === 1 && this._arr[0] === yr; } toUint8Array() { return this._arr; } toHex() { return Ui(this._arr).toUpperCase(); } toText() { const t = new ArrayBuffer(4); new DataView(t).setUint32(0, Oi(this._arr)); const r = new Uint8Array(t), s = new Uint8Array([...r, ...this._arr]), a = Ni(s).match(/.{1,5}/g); if (!a) throw new Error(); return a.join("-"); } toString() { return this.toText(); } /** * Serializes to JSON * @returns {JsonnablePrincipal} a JSON object with a single key, {@link JSON_KEY_PRINCIPAL}, whose value is the principal as a string */ toJSON() { return { [ze]: this.toText() }; } /** * Utility method taking a Principal to compare against. Used for determining canister ranges in certificate verification * @param {Principal} other - a {@link Principal} to compare * @returns {'lt' | 'eq' | 'gt'} `'lt' | 'eq' | 'gt'` a string, representing less than, equal to, or greater than */ compareTo(t) { for (let n = 0; n < Math.min(this._arr.length, t._arr.length); n++) { if (this._arr[n] < t._arr[n]) return "lt"; if (this._arr[n] > t._arr[n]) return "gt"; } return this._arr.length < t._arr.length ? "lt" : this._arr.length > t._arr.length ? "gt" : "eq"; } /** * Utility method checking whether a provided Principal is less than or equal to the current one using the {@link Principal.compareTo} method * @param other a {@link Principal} to compare * @returns {boolean} boolean */ ltEq(t) { const n = this.compareTo(t); return n == "lt" || n == "eq"; } /** * Utility method checking whether a provided Principal is greater than or equal to the current one using the {@link Principal.compareTo} method * @param other a {@link Principal} to compare * @returns {boolean} boolean */ gtEq(t) { const n = this.compareTo(t); return n == "gt" || n == "eq"; } }; const ji = /* @__PURE__ */ new Map([ [ "ICP", { evmMode: "minter", erc20Mainnet: "0x00f3C42833C3170159af4E92dbb451Fb3F708917", erc20Local: "0x00f3C42833C3170159af4E92dbb451Fb3F708917", erc20Testnet: "0xa96496d9Ef442a3CF8F3e24B614b87a70ddf74f3", ledger: "ryjl3-tyaaa-aaaaa-aaaba-cai", ledgerFee: 10000n, decimals: 8 } ], [ "USDC", { evmMode: "locker", erc20MainnetBase: "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913", erc20MainnetArbitrum: "0xaf88d065e77c8cC2239327C5EDb3A432268e5831", erc20MainnetEthereum: "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", lockerMainnet: "0xAe2351B15cFf68b5863c6690dCA58Dce383bf45A", lockerLocal: "0xAe2351B15cFf68b5863c6690dCA58Dce383bf45A", lockerTestnet: "0x38200DD4c3adbE86Be49717ccA8a3fD08466Cba6", ledgerMainnet: "53nhb-haaaa-aaaar-qbn5q-cai", ledgerLocal: "53nhb-haaaa-aaaar-qbn5q-cai", ledgerTestnet: "7csws-aiaaa-aaaar-qaqpa-cai", ledgerFee: 10000n, decimals: 6 } ], [ "USDT", { evmMode: "locker", erc20MainnetEthereum: "0xdAC17F958D2ee523a2206206994597C13D831ec7", lockerMainnetEthereum: "0xc5AC945a0af0768929301A27D6f2a7770995fAeb", erc20LocalEthereum: "0xdAC17F958D2ee523a2206206994597C13D831ec7", lockerLocalEthereum: "0xc5AC945a0af0768929301A27D6f2a7770995fAeb", erc20TestnetEthereum: "0xdAC17F958D2ee523a2206206994597C13D831ec7", lockerTestnetEthereum: "0x205E3f1001bbE91971D25349ac3aA949D9Be5079", ledgerMainnet: "ij33n-oiaaa-aaaar-qbooa-cai", ledgerLocal: "ij33n-oiaaa-aaaar-qbooa-cai", ledgerTestnet: "n4dku-tiaaa-aaaar-qboqa-cai", ledgerFee: 10000n, decimals: 6 } ], [ "cbBTC", { evmMode: "locker", erc20: "0xcbB7C0000aB88B473b1f5aFd9ef808440eed33Bf", lockerMainnet: "0x7744c6a83E4b43921f27d3c94a742bf9cd24c062", lockerLocal: "0x7744c6a83E4b43921f27d3c94a742bf9cd24c062", lockerTestnet: "0xd543007D8415169756e8a61b2cc079369d4aB6a8", ledgerMainnet: "io25z-dqaaa-aaaar-qbooq-cai", ledgerLocal: "io25z-dqaaa-aaaar-qbooq-cai", ledgerTestnet: "n3cma-6qaaa-aaaar-qboqq-cai", ledgerFee: 20n, decimals: 8 } ], [ "ckBTC", { evmMode: "minter", erc20Mainnet: "0x919A41Ea07c26f0001859Bc5dcb8754068718Fb7", erc20Local: "0x919A41Ea07c26f0001859Bc5dcb8754068718Fb7", erc20Testnet: "0x9D8dE8E7Cd748F760C81199AD3b902798DA7E7bC", ledger: "mxzaz-hqaaa-aaaar-qaada-cai", ledgerFee: 10n, decimals: 8 } ], [ "GLDT", { evmMode: "minter", erc20Mainnet: "0x86856814e74456893Cfc8946BedcBb472b5fA856", erc20Local: "0x86856814e74456893Cfc8946BedcBb472b5fA856", erc20Testnet: "0xB5A497b709703eC987B6879f064B02017998De1d", ledger: "6c7su-kiaaa-aaaar-qaira-cai", ledgerFee: 10000000n, decimals: 8 } ], [ "BOB", { evmMode: "minter", erc20Mainnet: "0xecc5f868AdD75F4ff9FD00bbBDE12C35BA2C9C89", erc20Local: "0xecc5f868AdD75F4ff9FD00bbBDE12C35BA2C9C89", erc20Testnet: "0xc6d02fa25bC437E38099476a6856225aE5ac2C75", ledger: "7pail-xaaaa-aaaas-aabmq-cai", ledgerFee: 1000000n, decimals: 8 } ] ]), xt = { tokens: ji, icp: { hosts: /* @__PURE__ */ new Map([ ["Mainnet", "https://ic0.app"], ["Testnet", "https://ic0.app"], ["Local", "http://127.0.1:8080"] ]), onesec: /* @__PURE__ */ new Map([ ["Mainnet", "5okwm-giaaa-aaaar-qbn6a-cai"], ["Testnet", "zvjow-lyaaa-aaaar-qap7q-cai"], ["Local", "5okwm-giaaa-aaaar-qbn6a-cai"] ]), pollDelayMs: /* @__PURE__ */ new Map([ ["Mainnet", 1e3], ["Testnet", 1e3], ["Local", 10] ]) }, evm: /* @__PURE__ */ new Map([ [ "Arbitrum", { confirmBlocks: 96, blockTimeMs: /* @__PURE__ */ new Map([ ["Mainnet", 240], ["Testnet", 240], ["Local", 10] ]) } ], [ "Base", { confirmBlocks: 12, blockTimeMs: /* @__PURE__ */ new Map([ ["Mainnet", 1900], ["Testnet", 1900], ["Local", 10] ]) } ], [ "Ethereum", { confirmBlocks: 4, blockTimeMs: /* @__PURE__ */ new Map([ ["Mainnet", 12e3], ["Testnet", 12e3], ["Local", 10] ]) } ] ]), abi: { erc20_and_minter: [ "function balanceOf(address account) view returns (uint256)", "function burn1(uint256 amount, bytes32 data1)", "function burn2(uint256 amount, bytes32 data1, bytes32 data2)", "function approve(address spender, uint256 amount) returns (bool)" ], erc20: [ "function balanceOf(address account) view returns (uint256)", "function approve(address spender, uint256 amount) returns (bool)" ], locker: [ "function lock1(uint256 amount, bytes32 data1)", "function lock2(uint256 amount, bytes32 data1, bytes32 data2)" ] } }; function Ki(e, t, n) { const r = []; return n !== void 0 && r.push(`${e}${t}${n}`), r.push(`${e}${t}`), r.push(e), r; } function er(e, t, n, r) { const s = Ki(t, n, r); for (const i of s) { const a = e[i]; if (a !== void 0) return a; } } function Zi(e, t, n, r) { const s = e.tokens.get(t); if (s) return er(s, "erc20", n, r); } function Qi(e, t, n, r) { const s = e.tokens.get(t); if (!(!s || s.evmMode !== "locker")) return er(s, "locker", n, r); } function ss(e, t, n) { const r = e.tokens.get(t); if (!r) throw new Error(`Token ${t} not found in config`); return er(r, "ledger", n); } function Hn(e, t) { const n = e.tokens.get(t); if (!n) throw new Error(`Token ${t} not found in config`); return n.decimals; } function Di(e, t) { const n = e.tokens.get(t); if (!n) throw new Error(`Token ${t} not found in config`); return n.evmMode; } function is(e, t) { return e.tokens.get(t); } function ht(e, t) { const n = e.icp.pollDelayMs.get(t); if (n === void 0) throw new Error(`Poll delay not found for deployment: ${t}`); return n; } const Li = ({ IDL: e }) => { const t = e.Variant({ Mainnet: e.Null, Local: e.Null, Test: e.Null, Testnet: e.Null }), n = e.Record({ deployment: t }), r = e.Variant({ Base: e.Null, Ethereum: e.Null, Arbitrum: e.Null }), s = e.Variant({ BOB: e.Null, ICP: e.Null, GLDT: e.Null, USDC: e.Null, USDT: e.Null, cbBTC: e.Null, ckBTC: e.Null }), i = e.Record({ token: s, initial_balance: e.Opt(e.Nat64), logger_address: e.Opt(e.Text), erc20_address: e.Opt(e.Text) }), a = e.Record({ initial_nonce: e.Opt(e.Nat64), chain: r, initial_block: e.Opt(e.Nat64), ledger: e.Vec(i) }), o = e.Record({ token: s, initial_balance: e.Opt(e.Nat64) }), c = e.Record({ ledger: e.Vec(o) }), u = e.Record({ evm: e.Vec(a), icp: e.Opt(c), deployment: t }); e.Variant({ Upgrade: n, Init: u }); const l = e.Variant({ ICRC: e.Record({ owner: e.Principal, subaccount: e.Opt(e.Vec(e.Nat8)) }), AccountId: e.Text }), f = e.Record({ token: s, chain: r, address: e.Text, receiver: l }), d = e.Record({ log_index: e.Opt(e.Nat64), hash: e.Text }), p = e.Variant({ LowBalance: e.Record({ balance: e.Nat, min_amount: e.Nat }), CheckingBalance: e.Null, Forwarding: e.Null, Forwarded: d }), v = e.Record({ id: e.Nat64 }), A = e.Record({ status: e.Opt(p), done: e.Opt(v) }), O = e.Record({ count: e.Nat64, label: e.Text }), T = e.Record({ method: e.Text, duration_in_ms: e.Vec(e.Nat64), results: e.Vec(O), response_in_bytes: e.Vec(e.Nat64), canister: e.Principal, cost_in_cycles: e.Vec(e.Nat64) }), B = e.Record({ fetch_time_safe_ms: e.Opt(e.Nat64), chain: e.Opt(r), fetch_time_latest_ms: e.Opt(e.Nat64), block_number_safe: e.Opt(e.Nat64), block_time_ms: e.Nat64, block_number_latest: e.Opt(e.Nat64) }), X = e.Record({ token: s, chain: r, address: e.Text, receiver: l }), $ = e.Record({ bytes: e.Vec(e.Nat8) }), Dt = e.Record({ total_tx_cost_in_wei: e.Nat64, token: s, approve_tx: e.Opt($), address: e.Text, nonce: e.Nat64, lock_or_burn_tx: $, receiver: l }), Lt = e.Record({ token: e.Opt(s), ledger: e.Principal, index: e.Opt(e.Principal) }), hn = e.Record({ chain_code_hex: e.Text, public_key_pem: e.Text }), tt = e.Variant({ ICP: e.Null, Base: e.Null, Ethereum: e.Null, Arbitrum: e.Null }), pn = e.Record({ wei_per_token: e.Float64, decimals: e.Nat8, token: e.Opt(s), balance: e.Nat, contract: e.Text, queue_size: e.Nat64, chain: e.Opt(tt), locker: e.Opt(e.Text), topics: e.Vec(e.Vec(e.Nat8)) }), Be = e.Record({ max_fee_per_gas_average: e.Nat64, max_priority_fee_per_gas: e.Nat64, fetch_time_safe_ms: e.Opt(e.Nat64), chain: e.Opt(r), fetch_time_latest_ms: e.Opt(e.Nat64), max_fee_per_gas: e.Nat64, chain_id: e.Nat64, block_number_safe: e.Opt(e.Nat64), nonce: e.Nat64, max_priority_fee_per_gas_average: e.Nat64, block_time_ms: e.Nat64, block_number_latest: e.Opt(e.Nat64) }), mn = e.Record({ stable_memory_bytes: e.Nat64, wasm_memory_bytes: e.Nat64, event_count: e.Nat64, ecdsa: e.Opt(hn), tokens: e.Vec(pn), cycle_balance: e.Nat, evm_chains: e.Vec(Be), last_upgrade_time: e.Nat64, event_bytes: e.Nat64 }), me = e.Variant({ HttpRequest: e.Null, GetTransfers: e.Null, ValidateForwardingAddress: e.Null, GetCanisterCalls: e.Null, GetForwardingTransactions: e.Null, SubmitForwardingUpdate: e.Null, GetMetadata: e.Null, GetRelayTasks: e.Null, UpdateEstimates: e.Null, ForwardEvmToIcp: e.Null, GetForwardingAccounts: e.Null, GetEvmAddress: e.Null, ScheduleAllTasks: e.Null, RunTask: e.Null, GetWeiPerIcpRate: e.Null, SubmitRelayProof: e.Null, Transfer: e.Null, GetEvents: e.Null, GetForwardingAddress: e.Null, GetTransfer: e.Null, TransferEvmToIcp: e.Null, TransferIcpToEvm: e.Null }), gn = e.Variant({ FetchTxLogs: e.Null }), Pe = e.Variant({ NewTx: e.Null, PollTx: e.Null, SendTx: e.Null, FetchFeeEstimate: e.Null }), yn = e.Variant({ SignTx: e.Null }), bn = e.Variant({ FetchLatestBlock: e.Null, FetchSafeBlock: e.Null }), wn = e.Variant({ Reader: gn, Writer: Pe, Forwarder: yn, Prover: bn }), xn = e.Variant({ TransferFee: e.Null, Transfer: e.Null }), vn = e.Variant({ InitializeEcdsaPublicKey: e.Null, RefreshExchangeRate: e.Null, Ledger: e.Record({ token: s, task: xn }) }), $t = e.Variant({ Evm: e.Record({ chain: r, task: wn }), Icp: vn }), ge = e.Variant({ SendEvmTransaction: e.Record({ id: e.Nat64, tx: $ }), FetchEvmBlock: e.Record({ block_number: e.Nat64 }) }), Ve = e.Record({ error: e.Text }), An = e.Record({ block_index: e.Nat64, ledger: e.Principal }), te = e.Variant({ Evm: d, Icp: An }), En = e.Variant({ Failed: Ve, Refunded: te, PendingRefundTx: e.Null, PendingDestinationTx: e.Null, Succeeded: e.Null, PendingSourceTx: e.Null }), ye = e.Record({ address: e.Text }), ee = e.Variant({ Evm: ye, Icp: l }), _e = e.Record({ tx: e.Opt(te), token: e.Opt(s), chain: e.Opt(tt), account: e.Opt(ee), amount: e.Nat }), ne = e.Variant({ Ok: e.Null, Err: e.Text }), Tn = e.Variant({ PendingConfirmTx: e.Null, ConfirmTx: e.Null, SendTx: e.Null, FetchTx: e.Null, SignTx: e.Null }), Nn = e.Record({ tx: e.Opt(te), end: e.Opt(e.Nat64), result: e.Opt(ne), chain: e.Opt(tt), block_number: e.Opt(e.Nat64), event: e.Opt(Tn), start: e.Nat64 }), kn = e.Record({ entries: e.Vec(Nn) }), Me = e.Record({ end: e.Opt(e.Nat64), status: e.Opt(En), destination: _e, trace: kn, source: _e, start: e.Opt(e.Nat64), queue_position: e.Opt(e.Nat64) }), Cn = e.Record({ source_chain: e.Opt(tt), destination_chain: e.Opt(tt), latest_transfer_fee_in_tokens: e.Nat, min_amount: e.Nat, average_transfer_fee_in_tokens: e.Nat, available: e.Opt(e.Nat), source_token: e.Opt(s), max_amount: e.Nat, protocol_fee_in_percent: e.Float64, destination_token: e.Opt(s) }), On = e.Record({ source_chain: e.Opt(tt), destination_chain: e.Opt(tt), count: e.Nat64, source_token: e.Opt(s), duration_ms_avg: e.Nat64, duration_ms_max: e.Nat64, destination_token: e.Opt(s) }), Fn = e.Record({ count: e.Nat64, skip: e.Nat64, accounts: e.Vec(ee) }), Sn = e.Record({ total_tx_cost_in_wei: e.Nat64, token: s, address: e.Text, nonce: e.Nat64, lock_or_burn_tx: d, receiver: l }), di = e.Variant({ Burn: e.Null, Lock: e.Null, ApproveAndLock: e.Null }), hi = e.Record({ token: s, max_priority_fee_per_gas: e.Nat64, max_fee_per_gas: e.Nat64, requested_tx: di, address: e.Text, nonce: e.Nat64, amount: e.Nat, receiver: l }), pi = e.Record({ token: s, balance: e.Nat, address: e.Text }), mi = e.Record({ forwarded: e.Vec(Sn), to_sign: e.Vec(hi), chain: r, balances: e.Vec(pi) }), pr = e.Record({ root_hash: e.Vec(e.Nat8), value: $, nodes: e.Vec($), index: e.Nat64 }), gi = e.Variant({ EvmBlockHeader: e.Record({ block_hash: e.Vec(e.Nat8), hint_priority_fee_per_gas: e.Opt(e.Nat64), hint_fee_per_gas: e.Opt(e.Nat64), block_header: e.Vec(e.Nat8) }), EvmTransactionReceipt: e.Record({ id: e.Nat64, tx: pr, receipt: pr, block_hash: e.Vec(e.Nat8) }), EvmBlockWithTxLogs: e.Record({ block_number: e.Nat64 }) }), yi = e.Record({ token: s, chain: tt, account: ee, amount: e.Opt(e.Nat) }), bi = e.Record({ tx: e.Opt(te), token: s, chain: tt, account: ee, amount: e.Nat }), wi = e.Record({ destination: yi, source: bi }), xi = e.Record({ block_height: e.Nat64 }), Rn = e.Variant({ Failed: Ve, Accepted: v, Fetching: xi }), vi = e.Record({ token: s, evm_account: ye, icp_account: l, evm_chain: r, evm_tx: d, evm_amount: e.Nat, icp_amount: e.Opt(e.Nat) }), Ai = e.Record({ token: s, evm_account: ye, icp_account: l, evm_chain: r, evm_amount: e.Opt(e.Nat), icp_amount: e.Nat }); return e.Service({ forward_evm_to_icp: e.Func( [f], [e.Variant({ Ok: A, Err: e.Text })], [] ), get_canister_calls: e.Func([], [e.Vec(T)], ["query"]), get_events: e.Func( [e.Nat64, e.Nat64], [e.Variant({ Ok: e.Vec(e.Text), Err: e.Text })], ["query"] ), get_events_bin: e.Func( [e.Nat64, e.Nat64], [e.Variant({ Ok: e.Vec(e.Vec(e.Nat8)), Err: e.Text })], ["query"] ), get_evm_address: e.Func([], [e.Opt(e.Text)], ["query"]), get_evm_block_stats: e.Func([r], [B], ["query"]), get_evm_encoding: e.Func([e.Opt(l)], [e.Text], ["query"]), get_forwarding_accounts: e.Func( [r, e.Nat64, e.Nat64], [e.Vec(X)], ["query"] ), get_forwarding_address: e.Func( [l], [e.Variant({ Ok: e.Text, Err: e.Text })], ["query"] ), get_forwarding_status: e.Func( [f], [e.Variant({ Ok: A, Err: e.Text })], ["query"] ), get_forwarding_transactions: e.Func( [r], [e.Vec(Dt)], ["query"] ), get_icp_token_metadata: e.Func( [], [e.Vec(Lt)], ["query"] ), get_metadata: e.Func( [], [e.Variant({ Ok: mn, Err: e.Text })], ["query"] ), get_paused_endpoints: e.Func([], [e.Vec(me)], ["query"]), get_paused_tasks: e.Func([], [e.Vec($t)], ["query"]), get_relay_tasks: e.Func([r], [e.Vec(ge)], ["query"]), get_transfer: e.Func( [v], [e.Variant({ Ok: Me, Err: e.Text })], ["query"] ), get_transfer_fees: e.Func([], [e.Vec(Cn)], ["query"]), get_transfer_stats: e.Func( [e.Nat64], [e.Vec(On)], ["query"] ), get_transfers: e.Func( [Fn], [e.Variant({ Ok: e.Vec(Me), Err: e.Text })], ["query"] ), get_wei_per_icp_rate: e.Func([], [e.Float64], ["query"]), pause_all_tasks: e.Func([], [e.Text], []), pause_endpoint: e.Func([me], [e.Text], []), pause_task: e.Func([$t], [e.Text], []), resume_all_paused_endpoints: e.Func([], [e.Text], []), resume_all_paused_tasks: e.Func([], [e.Text], []), resume_endpoint: e.Func([me], [e.Text], []), resume_task: e.Func([$t], [e.Text], []), run_task: e.Func([$t], [e.Text], []), schedule_all_tasks: e.Func([], [e.Text], []), submit_forwarding_update: e.Func([mi], [ne], []), submit_relay_proof: e.Func([r, e.Vec(gi)], [ne], []), transfer: e.Func([wi], [Rn], []), transfer_evm_to_icp: e.Func( [vi], [Rn], [] ), transfer_icp_to_evm: e.Func( [Ai], [Rn], [] ), validate_forwarding_address: e.Func( [l, e.Text], [ne], ["query"] ) }); }, nr = 5e3, st = 5e3, br = /* @__PURE__ */ new Map(); async function Wn(e, t = xt) { let n = br.get(e); return n === void 0 && (console.log(wr(e, t)), n = await Ti.create({ host: wr(e, t) }), e === "Local" && await n.fetchRootKey(), br.set(e, n)), n; } function wr(e, t = xt) { const n = t.icp.hosts.get(e); if (!n) throw new Error(`No host configured for deployment: ${e}`); return n; } async function Qe(e, t) { return await es.createActor(Li, { agent: t, canisterId: e.toText() }); } async function Ge(e, t) { const n = await Wn(e, t), r = ue.fromText( $i(e, t) ); return await Qe(r, n); } function $i(e, t = xt) { const n = t.icp.onesec.get(e); if (!n) throw new Error( `No OneSec canister configured for deployment: ${e}` ); return n; } function ta(e) { if (e !== void 0) switch (!0) { case "CheckingBalance" in e: case "Forwarding" in e: return e; case "LowBalance" in e: return { LowBalance: { balance: e.LowBalance.balance, minAmount: e.LowBalance.min_amount } }; case "Forwarded" in e: return { Forwarded: { hash: e.Forwarded.hash, logIndex: e.Forwarded.log_index[0] } }; default: throw Error("unexpected candid forward status"); } } function xr(e) { return { done: e.done[0], status: ta(e.status[0]) }; } function Xn(e) { if (e !== void 0) switch (!0) { case "ICP" in e: return "ICP"; case "Base" in e: return "Base"; case "Arbitrum" in e: return "Arbitrum"; case "Ethereum" in e: return "Ethereum"; default: throw Error("unexpected candid chain"); } } function as(e) { if (e !== void 0) switch (!0) { case "ICP" in e: return "ICP"; case "USDC" in e: return "USDC"; case "USDT" in e: return "USDT"; case "ckBTC" in e: return "ckBTC"; case "cbBTC" in e: return "cbBTC"; case "BOB" in e: return "BOB"; case "GLDT" in e: return "GLDT"; default: throw Error("unexpected candid token"); } } function ea(e) { switch (!0) { case "ICRC" in e: return { ICRC: { owner: e.ICRC.owner, subaccount: e.ICRC.subaccount[0] !== void 0 ? Uint8Array.from(e.ICRC.subaccount[0]) : void 0 } }; case "AccountId" in e: return { AccountId: { accountId: e.AccountId } }; default: throw Error("unexpected candid account"); } } function os(e) { if (e !== void 0) switch (!0) { case "Icp" in e: return { Icp: { blockIndex: e.Icp.block_index, ledger: e.Icp.ledger } }; case "Evm" in e: return { Evm: { hash: e.Evm.hash, logIndex: e.Evm.log_index[0] } }; default: throw Error("unexpected candid tx"); } } function na(e) { if (e !== void 0) switch (!0) { case "Icp" in e: return { Icp: ea(e.Icp) }; case "Evm" in e: return { Evm: e.Evm }; default: throw Error("unexpected candid account"); } } function ra(e) { if (e !== void 0) switch (!0) { case "PendingSourceTx" in e: case "PendingDestinationTx" in e: case "PendingRefundTx" in e: case "Succeeded" in e: return e; case "Refunded" in e: return { Refunded: { tx: os(e.Refunded) } }; case "Failed" in e: return { Failed: e.Failed }; default: throw Error("unexpected candid status"); } } function vr(e) { return { chain: Xn(e.chain[0]), token: as(e.token[0]), account: na(e.account[0]), tx: os(e.tx[0]), amount: e.amount }; } function rn(e) { return { source: vr(e.source), destination: vr(e.destination), status: ra(e.status[0]) }; } function cs(e) { switch (!0) { case "Failed" in e: return { Failed: e.Failed }; case "Accepted" in e: return { Accepted: e.Accepted }; case "Fetching" in e: return { Fetching: { blockHeight: e.Fetching.block_height } }; default: throw Error("unexpected candid transfer response"); } } function sa(e) { const t = as(e.source_token[0]), n = Xn(e.source_chain[0]), r = Xn(e.destination_chain[0]); if (!(!t || !n || !r)) return { token: t, sourceChain: n, destinationChain: r, minAmount: e.min_amount, maxAmount: e.max_amount, available: e.available[0], latestTransferFee: e.latest_transfer_fee_in_tokens, averageTransferFee: e.average_transfer_fee_in_tokens, protocolFeeInPercent: e.protocol_fee_in_percent }; } function ia(e) { return e.map(sa).filter((t) => t !== void 0); } let nt, xe = null; function us() { return (xe === null || xe.byteLength === 0) && (xe = new Uint8Array(nt.memory.buffer)), xe; } let Jn = 0; function Ar(e, t) { const n = t(e.length * 1, 1) >>> 0; return us().set(e, n / 1), Jn = e.length, n; } const ls = typeof TextDecoder < "u" ? new TextDecoder("utf-8", { ignoreBOM: !0, fatal: !0 }) : { decode: () => { throw Error("TextDecoder not available"); } }; typeof TextDecoder < "u" && ls.decode(); function aa(e, t) { return e = e >>> 0, ls.decode( us().subarray(e, e + t) ); } function oa(e, t, n) { let r, s; try { const i = Ar(t, nt.__wbindgen_malloc), a = Jn, o = Ar(n, nt.__wbindgen_malloc), c = Jn, u = nt.forwarding_address_from_icrc(e, i, a, o, c); return r = u[0], s = u[1], aa(u[0], u[1]); } finally { nt.__wbindgen_free(r, s, 1); } } async function ca(e, t) { if (typeof Response == "function" && e instanceof Response) { if (typeof WebAssembly.instantiateStreaming == "function") try { return await WebAssembly.instantiateStreaming(e, t); } catch (r) { if (e.headers.get("Content-Type") != "application/wasm") console.warn( "`WebAssembly.instantiateStreaming` failed because your server does not serve Wasm with `application/wasm` MIME type. Falling back to `WebAssembly.instantiate` which is slower. Original error:\n", r ); else throw r; } const n = await e.arrayBuffer(); return await WebAssembly.instantiate(n, t); } else { const n = await WebAssembly.instantiate(e, t); return n instanceof WebAssembly.Instance ? { instance: n, module: e } : n; } } function ua() { const e = {}; return e.wbg = {}, e.wbg.__wbindgen_init_externref_table = function() { const t = nt.__wbindgen_export_0, n = t.grow(4); t.set(0, void 0), t.set(n + 0, void 0), t.set(n + 1, null), t.set(n + 2, !0), t.set(n + 3, !1); }, e; } function la(e, t) { return nt = e.exports, fs.__wbindgen_wasm_module = t, xe = null, nt.__wbindgen_start(), nt; } async function fs(e) { if (nt !== void 0) return nt; typeof e < "u" && (Object.getPrototypeOf(e) === Object.prototype ? { module_or_path: e } = e : console.warn( "using deprecated parameters for the initialization function; pass a single object instead" )), typeof e > "u" && (e = new URL( /* @vite-ignore */ "forwarding_address_bg.wasm", import.meta.url )); const t = ua(); (typeof e == "string" || typeof Request == "function" && e instanceof Request || typeof URL == "function" && e instanceof URL) && (e = fetch(e)); const { instance: n, module: r } = await ca(await e, t); return la(n, r); } const fa = "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