onesec-bridge
Version:
A library for interacting with the onesec.to bridge
1,610 lines • 351 kB
JavaScript
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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