@storm-trade/wallet-core 1.0.27 → 1.0.28
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.
package/dist/wallet-core.js
CHANGED
|
@@ -1,17 +1,17 @@
|
|
|
1
1
|
var M = Object.defineProperty;
|
|
2
2
|
var E = (n, e, t) => e in n ? M(n, e, { enumerable: !0, configurable: !0, writable: !0, value: t }) : n[e] = t;
|
|
3
|
-
var
|
|
3
|
+
var i = (n, e, t) => E(n, typeof e != "symbol" ? e + "" : e, t);
|
|
4
4
|
import { beginCell as d, Address as l, Dictionary as o, toNano as g, Cell as B, contractAddress as C } from "@ton/ton";
|
|
5
|
-
const u =
|
|
6
|
-
class
|
|
5
|
+
const I = "1.0.28", u = `[embedded-wallet v${I}]`;
|
|
6
|
+
class F {
|
|
7
7
|
constructor(e) {
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
8
|
+
i(this, "host");
|
|
9
|
+
i(this, "timeouts");
|
|
10
|
+
i(this, "waitingForResponse", /* @__PURE__ */ new Map());
|
|
11
|
+
i(this, "iframe");
|
|
12
|
+
i(this, "state", "not-ready");
|
|
13
|
+
i(this, "i18nInit");
|
|
14
|
+
i(this, "handleMessage", (e) => {
|
|
15
15
|
if (typeof e.data != "object" || e.data === null || !("id" in e.data) || !("status" in e.data) || typeof e.data.id != "string" || typeof e.data.status != "string")
|
|
16
16
|
return;
|
|
17
17
|
const t = this.waitingForResponse.get(e.data.id);
|
|
@@ -33,7 +33,7 @@ class K {
|
|
|
33
33
|
}, this.i18nInit = e.i18n;
|
|
34
34
|
}
|
|
35
35
|
async sendMessage(e, t) {
|
|
36
|
-
var
|
|
36
|
+
var c, a;
|
|
37
37
|
const s = Math.random().toString(), r = Promise.race([
|
|
38
38
|
new Promise((f, b) => {
|
|
39
39
|
this.waitingForResponse.set(s, [f, b]);
|
|
@@ -44,7 +44,7 @@ class K {
|
|
|
44
44
|
}, t);
|
|
45
45
|
})
|
|
46
46
|
]);
|
|
47
|
-
return (
|
|
47
|
+
return (a = (c = this.iframe) == null ? void 0 : c.contentWindow) == null || a.postMessage({ id: s, payload: e }, this.host), r;
|
|
48
48
|
}
|
|
49
49
|
setupMessageListener() {
|
|
50
50
|
window.addEventListener("message", this.handleMessage);
|
|
@@ -52,10 +52,10 @@ class K {
|
|
|
52
52
|
async attachIframe(e) {
|
|
53
53
|
const t = document.createElement("iframe");
|
|
54
54
|
t.src = this.host, t.frameBorder = "0", t.width = "100%", t.height = "100%";
|
|
55
|
-
const s = new Promise((
|
|
56
|
-
t.addEventListener("load", () =>
|
|
57
|
-
}), r = new Promise((
|
|
58
|
-
setTimeout(() =>
|
|
55
|
+
const s = new Promise((c, a) => {
|
|
56
|
+
t.addEventListener("load", () => c(), { once: !0 }), t.addEventListener("error", (f) => a(f), { once: !0 });
|
|
57
|
+
}), r = new Promise((c, a) => {
|
|
58
|
+
setTimeout(() => a(new Error("Iframe load timeout")), this.timeouts.init);
|
|
59
59
|
});
|
|
60
60
|
return e.appendChild(t), this.iframe = t, Promise.race([s, r]);
|
|
61
61
|
}
|
|
@@ -63,16 +63,18 @@ class K {
|
|
|
63
63
|
if (this.state === "not-ready") {
|
|
64
64
|
this.state = "initializing";
|
|
65
65
|
try {
|
|
66
|
-
console.log(u, "attaching to root", e)
|
|
67
|
-
|
|
68
|
-
|
|
66
|
+
console.log(u, "attaching to root", e);
|
|
67
|
+
const t = performance.now();
|
|
68
|
+
await this.attachIframe(e), console.log(u, `iframe attached in ${Math.round(performance.now() - t)}ms`), this.setupMessageListener(), console.log(u, "sending ping");
|
|
69
|
+
let s;
|
|
70
|
+
for (let r = 1; r <= 5; r++)
|
|
69
71
|
try {
|
|
70
72
|
await this.sendMessage({ type: "ping", i18n: this.i18nInit }, this.timeouts.init), console.log(u, "pong received"), this.state = "ready";
|
|
71
73
|
return;
|
|
72
|
-
} catch (
|
|
73
|
-
|
|
74
|
+
} catch (c) {
|
|
75
|
+
s = c instanceof Error ? c : new Error(String(c)), console.warn(u, `ping attempt ${r}/5 failed:`, s.message), r < 5 && await new Promise((a) => setTimeout(a, 200));
|
|
74
76
|
}
|
|
75
|
-
throw new Error(`${u} ping retries exceeded: ${
|
|
77
|
+
throw new Error(`${u} ping retries exceeded: ${s == null ? void 0 : s.message}`);
|
|
76
78
|
} catch (t) {
|
|
77
79
|
throw this.destroy(), t;
|
|
78
80
|
}
|
|
@@ -116,22 +118,22 @@ class K {
|
|
|
116
118
|
return this.sendMessage({ type: "disconnect", address: e }, this.timeouts.disconnect);
|
|
117
119
|
}
|
|
118
120
|
}
|
|
119
|
-
const
|
|
121
|
+
const P = (n) => n.loadBuffer(32), R = (n) => d().storeBuffer(n, 32).endCell(), T = {
|
|
120
122
|
serialize: (n, e) => {
|
|
121
|
-
e.storeBuilder(
|
|
123
|
+
e.storeBuilder(R(n).asBuilder());
|
|
122
124
|
},
|
|
123
|
-
parse: (n) =>
|
|
124
|
-
},
|
|
125
|
-
function
|
|
126
|
-
const s = B.fromHex(t), r = d().storeUint(
|
|
125
|
+
parse: (n) => P(n)
|
|
126
|
+
}, _ = "b5ee9c7241021401000460000114ff00f4a413f4bcf2c80b01020162021004bcd020c700915be001d0d3030171b0915be0fa4030ed44d0d30701f861fa4001f862fa4001f863f40430f86401d31f218210186b2edfba8e843101db3ce02182104fedc82bba8e843101db3ce02182105b0dd9f4bae30201821018a092f7ba03060b0c02f401d33ffa00fa40fa40d152408d086000d3cb310c6345907411bee7fd03c8688ae26a620314eb93f4bba111e4cb869b4cc801cf1601cf16c9880120f90022f90002d76503d76582020134c8cb17cb0f13cb0fcbffcbff71f90400c88b1801cf16cbffc9d001c705f2e19182105b27f9c5c8cb1f13cb3f01fa02010704011acf16f843cf16c970598040db3c05002c718010c8cb055004cf165004fa0212cb6accc901fb0002da01d33ffa40fa00fa40d430d052528d086000d3cb310c6345907411bee7fd03c8688ae26a620314eb93f4bba111e4cb869b4cc801cf1601cf16c9880120f90022f90002d76503d76582020134c8cb17cb0f13cb0fcbffcbff71f90400c88b1801cf16cbffc9d001c705f2e19104070a0114ff00f4a413f4bcf2c80b080196d36c2220c700f24001d0d3030171b0f240fa403001d31f01821029c102d1ba8ea4ed44d0fa403012c705f2e29afa40d4d43001fb04ed54820898968070fb0270018306db3ce05b840ff2f0090028708010c8cb055003cf165003fa02cb6ac901fb0002b0f844521081010bf40a6fa1c8019a01fa00305003a012fa02943158fa02e2f8441281010bf441f86422d70b01c0008e85328042db3c8e8c300181010bd719018042db3ce2f844f841c8cb07f842cf16f843cf16f400c9ed540f0f01d2310101d33ff8425230c705f2e1915801d317d4d307d4d1fb046d6d58f823500503c8f40012f400cb3fcb17c970f843f844102655226d0107c8cb075006cf165004cf1612f400cb07ccf400ccc9ed548102e58203dbea8209e1338070f83774fb02f84301810082db3c0f01168e8301db3ce05b840ff2f00d017af8425210c705f2e19101d33ffa40fa00fa405023f844521081010bf40a6fa1c8019a01fa00305003a012fa02943158fa02e2f8441281010bf441f864030e01ae01d317d4d307d4d1fb046d6d58f823500503c8f40012f400cb3fcb17c970f843f844102655226d0107c8cb075006cf165004cf1612f400cb07ccf400ccc9ed548102e58203dbea8209e1338070f83774fb02810082db3c0f003e8210d53276db708010c8cb055005cf1624fa0214cb6a13cb1fcb3fc901fb0002012011120043bc82ff6a268698380fc30fd2000fc317d2000fc31fa02187c327c20fc217c21fc224014fbc7e7f6a268698380fc30fd2000fc317d2000fc31fa02187c327c147d2218e445997981d4678b10c1300f620c0008e1830c8709320c14097803058cb0701a4e801c9d001aa02d7198e4770800fc89322c1408e1a5331b020c20995a63701cb0795a63001cb07e203ab0302a44013e86c21c832c9d080409320c2009da520aa02522078d72413cf1602e85bc9d08308d719e2cf168b52e6a736f6e8cf16c970f842f843410403d563745f", x = 0;
|
|
127
|
+
function N(n, e, t) {
|
|
128
|
+
const s = B.fromHex(t), r = d().storeUint(x, 8).storeAddress(e).storeAddress(n).storeDict(null).endCell();
|
|
127
129
|
return C(0, { code: s, data: r });
|
|
128
130
|
}
|
|
129
|
-
class
|
|
130
|
-
constructor(e, t, s =
|
|
131
|
+
class O {
|
|
132
|
+
constructor(e, t, s = _) {
|
|
131
133
|
this.tonClient = e, this.config = t, this.ordinarySmartAccountCode = s;
|
|
132
134
|
}
|
|
133
135
|
calculateSmartAccountAddressFromStateInit(e) {
|
|
134
|
-
return
|
|
136
|
+
return N(e, l.parse(this.config.smartAccountMasterAddress), this.ordinarySmartAccountCode);
|
|
135
137
|
}
|
|
136
138
|
async getSmartAccountAddress(e) {
|
|
137
139
|
return (await this.tonClient.runMethod(l.parse(this.config.smartAccountMasterAddress), "get_nft_address_by_index", [
|
|
@@ -144,17 +146,17 @@ class F {
|
|
|
144
146
|
async getSmartAccountData(e) {
|
|
145
147
|
const t = l.parse(e);
|
|
146
148
|
try {
|
|
147
|
-
const r = (await this.tonClient.runMethod(t, "get_storage_data")).stack,
|
|
149
|
+
const r = (await this.tonClient.runMethod(t, "get_storage_data")).stack, c = r.readBigNumber(), a = r.readAddress(), f = r.readAddress(), b = r.readCellOpt();
|
|
148
150
|
let p = [];
|
|
149
151
|
b && (p = o.loadDirect(o.Keys.BigUint(256), o.Values.Cell(), b).keys());
|
|
150
152
|
const A = r.readAddress(), S = o.loadDirect(
|
|
151
153
|
o.Keys.Uint(8),
|
|
152
|
-
|
|
154
|
+
T,
|
|
153
155
|
r.readCell()
|
|
154
156
|
).values(), v = r.readNumber();
|
|
155
157
|
return {
|
|
156
|
-
index:
|
|
157
|
-
collectionAddress:
|
|
158
|
+
index: c,
|
|
159
|
+
collectionAddress: a,
|
|
158
160
|
masterWalletAddress: f,
|
|
159
161
|
publicKeys: p,
|
|
160
162
|
adminAddress: A,
|
|
@@ -210,9 +212,9 @@ const w = 10n, h = 1022n, m = 8191n;
|
|
|
210
212
|
class y {
|
|
211
213
|
// [0 .. 1022]
|
|
212
214
|
constructor() {
|
|
213
|
-
|
|
215
|
+
i(this, "shift");
|
|
214
216
|
// [0 .. 8191]
|
|
215
|
-
|
|
217
|
+
i(this, "bitnumber");
|
|
216
218
|
this.shift = 0n, this.bitnumber = 0n;
|
|
217
219
|
}
|
|
218
220
|
static fromShiftAndBitNumber(e, t) {
|
|
@@ -262,13 +264,13 @@ function k() {
|
|
|
262
264
|
const n = Math.floor(Date.now() / 1e3) - 30;
|
|
263
265
|
return BigInt(n % (1 << 23));
|
|
264
266
|
}
|
|
265
|
-
const
|
|
267
|
+
const L = new Error("Session is expired or never provided");
|
|
266
268
|
export {
|
|
267
269
|
y as HighloadQueryId,
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
270
|
+
F as IframeAdapter,
|
|
271
|
+
L as SessionExpiredOrNotProvided,
|
|
272
|
+
O as StormWallet,
|
|
273
|
+
N as calculateSmartAccountAddressFromStateInit,
|
|
272
274
|
k as queryId
|
|
273
275
|
};
|
|
274
276
|
//# sourceMappingURL=wallet-core.js.map
|
package/dist/wallet-core.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wallet-core.js","sources":["../src/adapters/iframe-adapter.ts","../src/utils/packers.ts","../src/wallet.ts","../src/utils/query-id.ts","../src/error.ts"],"sourcesContent":["import {\n ActiveSessionsResponse,\n AdapterState,\n ConnectResponse,\n CreateTransferRequest,\n CreateTransferResponse,\n EmptyResponse,\n GetPublicKeyResponse,\n IframeAdapterProps,\n SignRequest,\n SignResponse,\n Timeouts,\n} from '../types';\n\ntype Waiter = [(value: any) => void, (e: Error) => void]\n\nconst LOG_PREFIX = `[embedded-wallet v${__VERSION__}]`;\n\nexport class IframeAdapter {\n private readonly host: string;\n private readonly timeouts: Required<Timeouts>;\n private readonly waitingForResponse = new Map<string, Waiter>();\n private iframe?: HTMLIFrameElement;\n private state: AdapterState = 'not-ready';\n private readonly i18nInit?: IframeAdapterProps['i18n'];\n\n constructor(props: IframeAdapterProps) {\n this.host = props.host;\n this.timeouts = {\n init: 1000,\n connect: 60000,\n disconnect: 1000,\n sign: 1000,\n createTransfer: 1000,\n activeSessions: 1000,\n getPublicKey: 1000,\n resetDevice: 1000,\n ...props.timeouts,\n };\n this.i18nInit = props.i18n;\n }\n\n private async sendMessage<R>(payload: unknown, timeout: number): Promise<R> {\n const messageId = Math.random().toString();\n const response = Promise.race([\n new Promise<R>((resolve, reject) => {\n this.waitingForResponse.set(messageId, [resolve, reject]);\n }),\n new Promise<R>((_, reject) => {\n setTimeout(() => {\n reject(new Error('Response timeout'));\n }, timeout);\n }),\n ]);\n this.iframe?.contentWindow?.postMessage({ id: messageId, payload }, this.host);\n return response;\n }\n\n private setupMessageListener() {\n window.addEventListener('message', this.handleMessage);\n }\n\n private handleMessage = (e: MessageEvent<unknown>) => {\n if (typeof e.data !== 'object' || e.data === null) {\n return;\n }\n if (!('id' in e.data) || !('status' in e.data)) {\n return;\n }\n if (typeof e.data.id !== 'string' || typeof e.data.status !== 'string') {\n return;\n }\n const waiter = this.waitingForResponse.get(e.data.id);\n if (!waiter) {\n return;\n }\n const [resolve, reject] = waiter;\n this.waitingForResponse.delete(e.data.id);\n if (e.data.status === 'success') {\n if ('payload' in e.data) {\n resolve(e.data.payload);\n } else {\n resolve(undefined);\n }\n } else {\n if ('error' in e.data) {\n reject(new Error(e.data.error as string));\n } else {\n reject(new Error('Unknown error'));\n }\n }\n\n };\n\n private async attachIframe(root: HTMLElement): Promise<void> {\n const iframe = document.createElement('iframe');\n iframe.src = this.host;\n iframe.frameBorder = '0';\n iframe.width = '100%';\n iframe.height = '100%';\n\n const loadPromise = new Promise<void>((resolve, reject) => {\n iframe.addEventListener('load', () => resolve(), { once: true });\n iframe.addEventListener('error', (e) => reject(e), { once: true });\n });\n\n const timeoutPromise = new Promise<never>((_, reject) => {\n setTimeout(() => reject(new Error('Iframe load timeout')), this.timeouts.init);\n });\n\n root.appendChild(iframe);\n this.iframe = iframe;\n return Promise.race([loadPromise, timeoutPromise]);\n }\n\n async init(root: HTMLElement): Promise<void> {\n if (this.state !== 'not-ready') {\n return;\n }\n\n this.state = 'initializing';\n\n try {\n console.log(LOG_PREFIX, 'attaching to root', root);\n await this.attachIframe(root);\n console.log(LOG_PREFIX, 'iframe attached');\n this.setupMessageListener();\n console.log(LOG_PREFIX, 'sending ping');\n\n let lastError: Error | undefined;\n for (let attempt = 1; attempt <= 5; attempt++) {\n try {\n await this.sendMessage({ type: 'ping', i18n: this.i18nInit }, this.timeouts.init);\n console.log(LOG_PREFIX, 'pong received');\n this.state = 'ready';\n return;\n } catch (e) {\n lastError = e instanceof Error ? e : new Error(String(e));\n console.warn(LOG_PREFIX, `ping attempt ${attempt}/5 failed:`, lastError.message);\n if (attempt < 5) {\n await new Promise(resolve => setTimeout(resolve, 200));\n }\n }\n }\n\n throw new Error(`${LOG_PREFIX} ping retries exceeded: ${lastError?.message}`);\n } catch (e) {\n this.destroy();\n throw e;\n }\n }\n\n destroy(): void {\n if (this.state === 'not-ready') {\n return;\n }\n\n this.state = 'not-ready';\n window.removeEventListener('message', this.handleMessage);\n\n for (const [, reject] of this.waitingForResponse.values()) {\n reject(new Error('Iframe disconnected'));\n }\n this.waitingForResponse.clear();\n\n this.iframe?.remove();\n this.iframe = undefined;\n }\n\n async connect(masterAddress: string): Promise<ConnectResponse> {\n return this.sendMessage({ type: 'connect', address: masterAddress }, this.timeouts.connect);\n }\n\n\n\n async getPublicKey(address: string): Promise<GetPublicKeyResponse> {\n return this.sendMessage({ type: \"get-public-key\", address }, this.timeouts.getPublicKey);\n }\n\n async resetDevice(address: string): Promise<EmptyResponse> {\n return this.sendMessage({ type: \"reset-device\", address }, this.timeouts.resetDevice);\n }\n\n async signMessage(masterAddress: string, message: SignRequest): Promise<SignResponse> {\n return this.sendMessage({ type: 'sign', address: masterAddress, message }, this.timeouts.sign);\n }\n\n async signMessages(masterAddress: string, messages: SignRequest[]): Promise<{ hashes: Uint8Array[]; signatures: Uint8Array[]; }> {\n return this.sendMessage({ type: 'sign-many', address: masterAddress, messages }, this.timeouts.sign);\n }\n\n async createTransfer(masterAddress: string, message: CreateTransferRequest): Promise<CreateTransferResponse> {\n return this.sendMessage({\n type: 'create-transfer',\n address: masterAddress,\n data: message,\n }, this.timeouts.createTransfer);\n }\n\n async getActiveSessions(): Promise<ActiveSessionsResponse> {\n return this.sendMessage({ type: 'active-sessions' }, this.timeouts.activeSessions);\n }\n\n async disconnect(masterAddress: string): Promise<void> {\n return this.sendMessage({ type: 'disconnect', address: masterAddress }, this.timeouts.disconnect);\n }\n}\n","import { beginCell, Cell, DictionaryValue, Slice } from \"@ton/ton\";\n\nexport const unpackPublicKeys = (cs: Slice): Buffer => {\n return cs.loadBuffer(32);\n}\n\nexport const packPublicKeys = (publicKeys: Buffer): Cell => {\n return beginCell().storeBuffer(publicKeys, 32).endCell();\n}\n\nexport const PublicKeysValue: DictionaryValue<Buffer> = {\n serialize: (src: Buffer, builder) => {\n builder.storeBuilder(packPublicKeys(src).asBuilder());\n },\n parse: (src) => {\n return unpackPublicKeys(src);\n },\n};\n","import { Address, beginCell, Cell, contractAddress, Dictionary, toNano, TonClient } from \"@ton/ton\";\nimport { PublicKeysValue } from \"./utils/packers\";\n\ntype StormWalletConfig = {\n smartAccountMasterAddress: string;\n}\n\nexport enum SmartAccountInternalOp {\n deploy_account = 0x764019e5,\n add_new_user_public_key = 0x220c4c19,\n remove_user_public_key = 0x7427ce1f,\n execute_limit_order = 0x1c0af2cb,\n execute_orders_bundle = 0xf38e7e65,\n set_code = 0x9c0f3220,\n add_request_to_add_new_user_public_key = 0x03cc29e8,\n add_request_to_remove_user_public_key = 0x07d25def,\n remove_all_keys_except_current = 0x5f9d0940\n}\n\nexport const DEFAULT_ORDINARY_SMART_ACCOUNT_CODE = \"b5ee9c7241021401000460000114ff00f4a413f4bcf2c80b01020162021004bcd020c700915be001d0d3030171b0915be0fa4030ed44d0d30701f861fa4001f862fa4001f863f40430f86401d31f218210186b2edfba8e843101db3ce02182104fedc82bba8e843101db3ce02182105b0dd9f4bae30201821018a092f7ba03060b0c02f401d33ffa00fa40fa40d152408d086000d3cb310c6345907411bee7fd03c8688ae26a620314eb93f4bba111e4cb869b4cc801cf1601cf16c9880120f90022f90002d76503d76582020134c8cb17cb0f13cb0fcbffcbff71f90400c88b1801cf16cbffc9d001c705f2e19182105b27f9c5c8cb1f13cb3f01fa02010704011acf16f843cf16c970598040db3c05002c718010c8cb055004cf165004fa0212cb6accc901fb0002da01d33ffa40fa00fa40d430d052528d086000d3cb310c6345907411bee7fd03c8688ae26a620314eb93f4bba111e4cb869b4cc801cf1601cf16c9880120f90022f90002d76503d76582020134c8cb17cb0f13cb0fcbffcbff71f90400c88b1801cf16cbffc9d001c705f2e19104070a0114ff00f4a413f4bcf2c80b080196d36c2220c700f24001d0d3030171b0f240fa403001d31f01821029c102d1ba8ea4ed44d0fa403012c705f2e29afa40d4d43001fb04ed54820898968070fb0270018306db3ce05b840ff2f0090028708010c8cb055003cf165003fa02cb6ac901fb0002b0f844521081010bf40a6fa1c8019a01fa00305003a012fa02943158fa02e2f8441281010bf441f86422d70b01c0008e85328042db3c8e8c300181010bd719018042db3ce2f844f841c8cb07f842cf16f843cf16f400c9ed540f0f01d2310101d33ff8425230c705f2e1915801d317d4d307d4d1fb046d6d58f823500503c8f40012f400cb3fcb17c970f843f844102655226d0107c8cb075006cf165004cf1612f400cb07ccf400ccc9ed548102e58203dbea8209e1338070f83774fb02f84301810082db3c0f01168e8301db3ce05b840ff2f00d017af8425210c705f2e19101d33ffa40fa00fa405023f844521081010bf40a6fa1c8019a01fa00305003a012fa02943158fa02e2f8441281010bf441f864030e01ae01d317d4d307d4d1fb046d6d58f823500503c8f40012f400cb3fcb17c970f843f844102655226d0107c8cb075006cf165004cf1612f400cb07ccf400ccc9ed548102e58203dbea8209e1338070f83774fb02810082db3c0f003e8210d53276db708010c8cb055005cf1624fa0214cb6a13cb1fcb3fc901fb0002012011120043bc82ff6a268698380fc30fd2000fc317d2000fc31fa02187c327c20fc217c21fc224014fbc7e7f6a268698380fc30fd2000fc317d2000fc31fa02187c327c147d2218e445997981d4678b10c1300f620c0008e1830c8709320c14097803058cb0701a4e801c9d001aa02d7198e4770800fc89322c1408e1a5331b020c20995a63701cb0795a63001cb07e203ab0302a44013e86c21c832c9d080409320c2009da520aa02522078d72413cf1602e85bc9d08308d719e2cf168b52e6a736f6e8cf16c970f842f843410403d563745f\"\nconst ORDINARY_SMART_ACCOUNT_HEADER = 0;\n\nexport function calculateSmartAccountAddressFromStateInit(owner: Address, factory: Address, ordinarySmartAccountCode: string): Address {\n const code = Cell.fromHex(ordinarySmartAccountCode);\n\n const data = beginCell()\n .storeUint(ORDINARY_SMART_ACCOUNT_HEADER, 8)\n .storeAddress(factory)\n .storeAddress(owner)\n .storeDict(null)\n .endCell()\n\n return contractAddress(0, {code, data});\n}\n\nexport class StormWallet {\n constructor(private readonly tonClient: TonClient, private readonly config: StormWalletConfig, private readonly ordinarySmartAccountCode = DEFAULT_ORDINARY_SMART_ACCOUNT_CODE) {\n }\n\n calculateSmartAccountAddressFromStateInit(owner: Address): Address {\n return calculateSmartAccountAddressFromStateInit(owner, Address.parse(this.config.smartAccountMasterAddress), this.ordinarySmartAccountCode);\n }\n\n async getSmartAccountAddress(walletAddress: string): Promise<Address> {\n const result = await this.tonClient.runMethod(Address.parse(this.config.smartAccountMasterAddress), 'get_nft_address_by_index', [\n {\n type: 'int',\n value: BigInt(`0x${Address.parse(walletAddress).hash.toString('hex')}`)\n }\n ])\n return result.stack.readAddress()\n }\n\n async getSmartAccountData(smartAccountAddress: string) {\n const address = Address.parse(smartAccountAddress)\n try {\n const result = await this.tonClient.runMethod(address, 'get_storage_data')\n const stack = result.stack\n\n const index = stack.readBigNumber();\n const collectionAddress = stack.readAddress();\n const masterWalletAddress = stack.readAddress();\n\n\n const pksCell = stack.readCellOpt()\n let publicKeys: bigint[] = []\n\n if (pksCell) {\n publicKeys = Dictionary.loadDirect(Dictionary.Keys.BigUint(256), Dictionary.Values.Cell(), pksCell).keys();\n }\n\n const adminAddress = stack.readAddress();\n const backendPublicKeys = Dictionary.loadDirect(\n Dictionary.Keys.Uint(8),\n PublicKeysValue,\n stack.readCell()\n ).values();\n\n const seqno = stack.readNumber();\n\n return {\n index,\n collectionAddress,\n masterWalletAddress,\n publicKeys,\n adminAddress,\n backendPublicKeys,\n seqno,\n }\n } catch (e) {\n if ((e as Error).message.endsWith('-13')) {\n return null\n }\n throw e\n }\n }\n\n createDeploySmartAccountTx(publicKey: Buffer, transferAmount: bigint) {\n const publicKeys: Dictionary<bigint, Cell> = Dictionary.empty(Dictionary.Keys.BigUint(256), Dictionary.Values.Cell());\n publicKeys.set(bufferToBigInt(publicKey), beginCell().endCell());\n\n const payload = beginCell()\n .storeUint(SmartAccountInternalOp.deploy_account, 32)\n .storeUint(0, 64)\n .storeDict(publicKeys)\n .endCell();\n\n return {\n address: this.config.smartAccountMasterAddress,\n payload: payload.toBoc().toString('base64'),\n amount: transferAmount,\n }\n }\n\n createAddPublicKeyTx(smartAccountAddress: string, publicKey: Buffer) {\n const payload = beginCell()\n .storeUint(SmartAccountInternalOp.add_new_user_public_key, 32)\n .storeUint(0, 64)\n .storeBuffer(publicKey)\n .endCell();\n\n\n return {\n address: smartAccountAddress,\n payload: payload.toBoc().toString('base64'),\n amount: toNano('0.05')\n }\n }\n\n createRemovePublicKeyTx(smartAccountAddress: string, publicKey: Buffer) {\n const payload = beginCell()\n .storeUint(SmartAccountInternalOp.remove_user_public_key, 32)\n .storeUint(0, 64)\n .storeBuffer(publicKey)\n .endCell();\n\n\n return {\n address: smartAccountAddress,\n payload: payload.toBoc().toString('base64'),\n amount: toNano('0.05')\n }\n }\n\n createRemoveAllKeysExceptCurrentTx(smartAccountAddress: string, publicKey: Buffer) {\n const payload = beginCell()\n .storeUint(SmartAccountInternalOp.remove_all_keys_except_current, 32)\n .storeUint(0, 64)\n .storeBuffer(publicKey)\n .endCell();\n\n return {\n address: smartAccountAddress,\n payload: payload.toBoc().toString('base64'),\n amount: toNano('0.05'), // при необходимости настрой сумму\n }\n }\n}\n\nexport function bufferToBigInt(buffer: Buffer): bigint {\n return BigInt('0x' + buffer.toString('hex'));\n}\n","const BIT_NUMBER_SIZE = 10n; // 10 bit\n// const SHIFT_SIZE = 13n; // 13 bit\nconst MAX_BIT_NUMBER = 1022n;\nconst MAX_SHIFT = 8191n; // 2^13 = 8192\n\nexport class HighloadQueryId {\n private shift: bigint; // [0 .. 8191]\n private bitnumber: bigint; // [0 .. 1022]\n\n constructor() {\n this.shift = 0n;\n this.bitnumber = 0n;\n }\n\n static fromShiftAndBitNumber(shift: bigint, bitnumber: bigint): HighloadQueryId {\n const q = new HighloadQueryId();\n q.shift = shift;\n if (q.shift < 0) throw new Error('invalid shift');\n if (q.shift > MAX_SHIFT) throw new Error('invalid shift');\n q.bitnumber = bitnumber;\n if (q.bitnumber < 0) throw new Error('invalid bitnumber');\n if (q.bitnumber > MAX_BIT_NUMBER) throw new Error('invalid bitnumber');\n return q;\n }\n\n\n getNext() {\n let newBitnumber = this.bitnumber + 1n;\n let newShift = this.shift;\n\n if (newShift === MAX_SHIFT && newBitnumber > (MAX_BIT_NUMBER - 1n)) {\n throw new Error('Overload'); // NOTE: we left one queryId for emergency withdraw\n }\n\n if (newBitnumber > MAX_BIT_NUMBER) {\n newBitnumber = 0n;\n newShift += 1n;\n if (newShift > MAX_SHIFT) {\n throw new Error('Overload')\n }\n }\n\n return HighloadQueryId.fromShiftAndBitNumber(newShift, newBitnumber);\n }\n\n hasNext() {\n const isEnd = this.bitnumber >= (MAX_BIT_NUMBER - 1n) && this.shift === MAX_SHIFT; // NOTE: we left one queryId for emergency withdraw;\n return !isEnd;\n }\n\n getShift(): bigint {\n return this.shift;\n }\n\n getBitNumber(): bigint {\n return this.bitnumber;\n }\n\n getQueryId(): bigint {\n return (this.shift << BIT_NUMBER_SIZE) + this.bitnumber;\n }\n\n static fromQueryId(queryId: bigint): HighloadQueryId {\n const shift = queryId >> BIT_NUMBER_SIZE;\n const bitnumber = queryId & 1023n;\n return this.fromShiftAndBitNumber(shift, bitnumber);\n }\n\n static fromSeqno(i: bigint): HighloadQueryId {\n const shift = i / 1023n;\n const bitnumber = i % 1023n;\n return this.fromShiftAndBitNumber(shift, bitnumber);\n }\n\n /**\n * @return {bigint} [0 .. 8380415]\n */\n toSeqno(): bigint {\n return this.bitnumber + this.shift * 1023n;\n }\n}\n\nexport function queryId(): bigint {\n const ts = Math.floor(Date.now() / 1000) - 30;\n\n return BigInt(ts % (1 << 23))\n}","export class NoActiveSessionError extends Error {\n public readonly address: string;\n\n constructor(address: string) {\n super(`No active session found for ${address}`);\n this.name = 'NoActiveSessionError';\n this.address = address;\n }\n}\n\n\nexport const SessionExpiredOrNotProvided = new Error('Session is expired or never provided')"],"names":["LOG_PREFIX","IframeAdapter","props","__publicField","waiter","resolve","reject","payload","timeout","messageId","response","_","_b","_a","root","iframe","loadPromise","e","timeoutPromise","lastError","attempt","masterAddress","address","message","messages","unpackPublicKeys","cs","packPublicKeys","publicKeys","beginCell","PublicKeysValue","src","builder","DEFAULT_ORDINARY_SMART_ACCOUNT_CODE","ORDINARY_SMART_ACCOUNT_HEADER","calculateSmartAccountAddressFromStateInit","owner","factory","ordinarySmartAccountCode","code","Cell","data","contractAddress","StormWallet","tonClient","config","Address","walletAddress","smartAccountAddress","stack","index","collectionAddress","masterWalletAddress","pksCell","Dictionary","adminAddress","backendPublicKeys","seqno","publicKey","transferAmount","bufferToBigInt","toNano","buffer","BIT_NUMBER_SIZE","MAX_BIT_NUMBER","MAX_SHIFT","HighloadQueryId","shift","bitnumber","q","newBitnumber","newShift","queryId","i","ts","SessionExpiredOrNotProvided"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"wallet-core.js","sources":["../src/version.ts","../src/adapters/iframe-adapter.ts","../src/utils/packers.ts","../src/wallet.ts","../src/utils/query-id.ts","../src/error.ts"],"sourcesContent":["declare const __VERSION__: string;\n\nexport const VERSION = typeof __VERSION__ !== 'undefined' ? __VERSION__ : 'dev';\n","import {\n ActiveSessionsResponse,\n AdapterState,\n ConnectResponse,\n CreateTransferRequest,\n CreateTransferResponse,\n EmptyResponse,\n GetPublicKeyResponse,\n IframeAdapterProps,\n SignRequest,\n SignResponse,\n Timeouts,\n} from '../types';\nimport { VERSION } from '../version';\n\ntype Waiter = [(value: any) => void, (e: Error) => void]\n\nconst LOG_PREFIX = `[embedded-wallet v${VERSION}]`;\n\nexport class IframeAdapter {\n private readonly host: string;\n private readonly timeouts: Required<Timeouts>;\n private readonly waitingForResponse = new Map<string, Waiter>();\n private iframe?: HTMLIFrameElement;\n private state: AdapterState = 'not-ready';\n private readonly i18nInit?: IframeAdapterProps['i18n'];\n\n constructor(props: IframeAdapterProps) {\n this.host = props.host;\n this.timeouts = {\n init: 1000,\n connect: 60000,\n disconnect: 1000,\n sign: 1000,\n createTransfer: 1000,\n activeSessions: 1000,\n getPublicKey: 1000,\n resetDevice: 1000,\n ...props.timeouts,\n };\n this.i18nInit = props.i18n;\n }\n\n private async sendMessage<R>(payload: unknown, timeout: number): Promise<R> {\n const messageId = Math.random().toString();\n const response = Promise.race([\n new Promise<R>((resolve, reject) => {\n this.waitingForResponse.set(messageId, [resolve, reject]);\n }),\n new Promise<R>((_, reject) => {\n setTimeout(() => {\n reject(new Error('Response timeout'));\n }, timeout);\n }),\n ]);\n this.iframe?.contentWindow?.postMessage({ id: messageId, payload }, this.host);\n return response;\n }\n\n private setupMessageListener() {\n window.addEventListener('message', this.handleMessage);\n }\n\n private handleMessage = (e: MessageEvent<unknown>) => {\n if (typeof e.data !== 'object' || e.data === null) {\n return;\n }\n if (!('id' in e.data) || !('status' in e.data)) {\n return;\n }\n if (typeof e.data.id !== 'string' || typeof e.data.status !== 'string') {\n return;\n }\n const waiter = this.waitingForResponse.get(e.data.id);\n if (!waiter) {\n return;\n }\n const [resolve, reject] = waiter;\n this.waitingForResponse.delete(e.data.id);\n if (e.data.status === 'success') {\n if ('payload' in e.data) {\n resolve(e.data.payload);\n } else {\n resolve(undefined);\n }\n } else {\n if ('error' in e.data) {\n reject(new Error(e.data.error as string));\n } else {\n reject(new Error('Unknown error'));\n }\n }\n\n };\n\n private async attachIframe(root: HTMLElement): Promise<void> {\n const iframe = document.createElement('iframe');\n iframe.src = this.host;\n iframe.frameBorder = '0';\n iframe.width = '100%';\n iframe.height = '100%';\n\n const loadPromise = new Promise<void>((resolve, reject) => {\n iframe.addEventListener('load', () => resolve(), { once: true });\n iframe.addEventListener('error', (e) => reject(e), { once: true });\n });\n\n const timeoutPromise = new Promise<never>((_, reject) => {\n setTimeout(() => reject(new Error('Iframe load timeout')), this.timeouts.init);\n });\n\n root.appendChild(iframe);\n this.iframe = iframe;\n return Promise.race([loadPromise, timeoutPromise]);\n }\n\n async init(root: HTMLElement): Promise<void> {\n if (this.state !== 'not-ready') {\n return;\n }\n\n this.state = 'initializing';\n\n try {\n console.log(LOG_PREFIX, 'attaching to root', root);\n const attachStart = performance.now();\n await this.attachIframe(root);\n console.log(LOG_PREFIX, `iframe attached in ${Math.round(performance.now() - attachStart)}ms`);\n this.setupMessageListener();\n console.log(LOG_PREFIX, 'sending ping');\n\n let lastError: Error | undefined;\n for (let attempt = 1; attempt <= 5; attempt++) {\n try {\n await this.sendMessage({ type: 'ping', i18n: this.i18nInit }, this.timeouts.init);\n console.log(LOG_PREFIX, 'pong received');\n this.state = 'ready';\n return;\n } catch (e) {\n lastError = e instanceof Error ? e : new Error(String(e));\n console.warn(LOG_PREFIX, `ping attempt ${attempt}/5 failed:`, lastError.message);\n if (attempt < 5) {\n await new Promise(resolve => setTimeout(resolve, 200));\n }\n }\n }\n\n throw new Error(`${LOG_PREFIX} ping retries exceeded: ${lastError?.message}`);\n } catch (e) {\n this.destroy();\n throw e;\n }\n }\n\n destroy(): void {\n if (this.state === 'not-ready') {\n return;\n }\n\n this.state = 'not-ready';\n window.removeEventListener('message', this.handleMessage);\n\n for (const [, reject] of this.waitingForResponse.values()) {\n reject(new Error('Iframe disconnected'));\n }\n this.waitingForResponse.clear();\n\n this.iframe?.remove();\n this.iframe = undefined;\n }\n\n async connect(masterAddress: string): Promise<ConnectResponse> {\n return this.sendMessage({ type: 'connect', address: masterAddress }, this.timeouts.connect);\n }\n\n\n\n async getPublicKey(address: string): Promise<GetPublicKeyResponse> {\n return this.sendMessage({ type: \"get-public-key\", address }, this.timeouts.getPublicKey);\n }\n\n async resetDevice(address: string): Promise<EmptyResponse> {\n return this.sendMessage({ type: \"reset-device\", address }, this.timeouts.resetDevice);\n }\n\n async signMessage(masterAddress: string, message: SignRequest): Promise<SignResponse> {\n return this.sendMessage({ type: 'sign', address: masterAddress, message }, this.timeouts.sign);\n }\n\n async signMessages(masterAddress: string, messages: SignRequest[]): Promise<{ hashes: Uint8Array[]; signatures: Uint8Array[]; }> {\n return this.sendMessage({ type: 'sign-many', address: masterAddress, messages }, this.timeouts.sign);\n }\n\n async createTransfer(masterAddress: string, message: CreateTransferRequest): Promise<CreateTransferResponse> {\n return this.sendMessage({\n type: 'create-transfer',\n address: masterAddress,\n data: message,\n }, this.timeouts.createTransfer);\n }\n\n async getActiveSessions(): Promise<ActiveSessionsResponse> {\n return this.sendMessage({ type: 'active-sessions' }, this.timeouts.activeSessions);\n }\n\n async disconnect(masterAddress: string): Promise<void> {\n return this.sendMessage({ type: 'disconnect', address: masterAddress }, this.timeouts.disconnect);\n }\n}\n","import { beginCell, Cell, DictionaryValue, Slice } from \"@ton/ton\";\n\nexport const unpackPublicKeys = (cs: Slice): Buffer => {\n return cs.loadBuffer(32);\n}\n\nexport const packPublicKeys = (publicKeys: Buffer): Cell => {\n return beginCell().storeBuffer(publicKeys, 32).endCell();\n}\n\nexport const PublicKeysValue: DictionaryValue<Buffer> = {\n serialize: (src: Buffer, builder) => {\n builder.storeBuilder(packPublicKeys(src).asBuilder());\n },\n parse: (src) => {\n return unpackPublicKeys(src);\n },\n};\n","import { Address, beginCell, Cell, contractAddress, Dictionary, toNano, TonClient } from \"@ton/ton\";\nimport { PublicKeysValue } from \"./utils/packers\";\n\ntype StormWalletConfig = {\n smartAccountMasterAddress: string;\n}\n\nexport enum SmartAccountInternalOp {\n deploy_account = 0x764019e5,\n add_new_user_public_key = 0x220c4c19,\n remove_user_public_key = 0x7427ce1f,\n execute_limit_order = 0x1c0af2cb,\n execute_orders_bundle = 0xf38e7e65,\n set_code = 0x9c0f3220,\n add_request_to_add_new_user_public_key = 0x03cc29e8,\n add_request_to_remove_user_public_key = 0x07d25def,\n remove_all_keys_except_current = 0x5f9d0940\n}\n\nexport const DEFAULT_ORDINARY_SMART_ACCOUNT_CODE = \"b5ee9c7241021401000460000114ff00f4a413f4bcf2c80b01020162021004bcd020c700915be001d0d3030171b0915be0fa4030ed44d0d30701f861fa4001f862fa4001f863f40430f86401d31f218210186b2edfba8e843101db3ce02182104fedc82bba8e843101db3ce02182105b0dd9f4bae30201821018a092f7ba03060b0c02f401d33ffa00fa40fa40d152408d086000d3cb310c6345907411bee7fd03c8688ae26a620314eb93f4bba111e4cb869b4cc801cf1601cf16c9880120f90022f90002d76503d76582020134c8cb17cb0f13cb0fcbffcbff71f90400c88b1801cf16cbffc9d001c705f2e19182105b27f9c5c8cb1f13cb3f01fa02010704011acf16f843cf16c970598040db3c05002c718010c8cb055004cf165004fa0212cb6accc901fb0002da01d33ffa40fa00fa40d430d052528d086000d3cb310c6345907411bee7fd03c8688ae26a620314eb93f4bba111e4cb869b4cc801cf1601cf16c9880120f90022f90002d76503d76582020134c8cb17cb0f13cb0fcbffcbff71f90400c88b1801cf16cbffc9d001c705f2e19104070a0114ff00f4a413f4bcf2c80b080196d36c2220c700f24001d0d3030171b0f240fa403001d31f01821029c102d1ba8ea4ed44d0fa403012c705f2e29afa40d4d43001fb04ed54820898968070fb0270018306db3ce05b840ff2f0090028708010c8cb055003cf165003fa02cb6ac901fb0002b0f844521081010bf40a6fa1c8019a01fa00305003a012fa02943158fa02e2f8441281010bf441f86422d70b01c0008e85328042db3c8e8c300181010bd719018042db3ce2f844f841c8cb07f842cf16f843cf16f400c9ed540f0f01d2310101d33ff8425230c705f2e1915801d317d4d307d4d1fb046d6d58f823500503c8f40012f400cb3fcb17c970f843f844102655226d0107c8cb075006cf165004cf1612f400cb07ccf400ccc9ed548102e58203dbea8209e1338070f83774fb02f84301810082db3c0f01168e8301db3ce05b840ff2f00d017af8425210c705f2e19101d33ffa40fa00fa405023f844521081010bf40a6fa1c8019a01fa00305003a012fa02943158fa02e2f8441281010bf441f864030e01ae01d317d4d307d4d1fb046d6d58f823500503c8f40012f400cb3fcb17c970f843f844102655226d0107c8cb075006cf165004cf1612f400cb07ccf400ccc9ed548102e58203dbea8209e1338070f83774fb02810082db3c0f003e8210d53276db708010c8cb055005cf1624fa0214cb6a13cb1fcb3fc901fb0002012011120043bc82ff6a268698380fc30fd2000fc317d2000fc31fa02187c327c20fc217c21fc224014fbc7e7f6a268698380fc30fd2000fc317d2000fc31fa02187c327c147d2218e445997981d4678b10c1300f620c0008e1830c8709320c14097803058cb0701a4e801c9d001aa02d7198e4770800fc89322c1408e1a5331b020c20995a63701cb0795a63001cb07e203ab0302a44013e86c21c832c9d080409320c2009da520aa02522078d72413cf1602e85bc9d08308d719e2cf168b52e6a736f6e8cf16c970f842f843410403d563745f\"\nconst ORDINARY_SMART_ACCOUNT_HEADER = 0;\n\nexport function calculateSmartAccountAddressFromStateInit(owner: Address, factory: Address, ordinarySmartAccountCode: string): Address {\n const code = Cell.fromHex(ordinarySmartAccountCode);\n\n const data = beginCell()\n .storeUint(ORDINARY_SMART_ACCOUNT_HEADER, 8)\n .storeAddress(factory)\n .storeAddress(owner)\n .storeDict(null)\n .endCell()\n\n return contractAddress(0, {code, data});\n}\n\nexport class StormWallet {\n constructor(private readonly tonClient: TonClient, private readonly config: StormWalletConfig, private readonly ordinarySmartAccountCode = DEFAULT_ORDINARY_SMART_ACCOUNT_CODE) {\n }\n\n calculateSmartAccountAddressFromStateInit(owner: Address): Address {\n return calculateSmartAccountAddressFromStateInit(owner, Address.parse(this.config.smartAccountMasterAddress), this.ordinarySmartAccountCode);\n }\n\n async getSmartAccountAddress(walletAddress: string): Promise<Address> {\n const result = await this.tonClient.runMethod(Address.parse(this.config.smartAccountMasterAddress), 'get_nft_address_by_index', [\n {\n type: 'int',\n value: BigInt(`0x${Address.parse(walletAddress).hash.toString('hex')}`)\n }\n ])\n return result.stack.readAddress()\n }\n\n async getSmartAccountData(smartAccountAddress: string) {\n const address = Address.parse(smartAccountAddress)\n try {\n const result = await this.tonClient.runMethod(address, 'get_storage_data')\n const stack = result.stack\n\n const index = stack.readBigNumber();\n const collectionAddress = stack.readAddress();\n const masterWalletAddress = stack.readAddress();\n\n\n const pksCell = stack.readCellOpt()\n let publicKeys: bigint[] = []\n\n if (pksCell) {\n publicKeys = Dictionary.loadDirect(Dictionary.Keys.BigUint(256), Dictionary.Values.Cell(), pksCell).keys();\n }\n\n const adminAddress = stack.readAddress();\n const backendPublicKeys = Dictionary.loadDirect(\n Dictionary.Keys.Uint(8),\n PublicKeysValue,\n stack.readCell()\n ).values();\n\n const seqno = stack.readNumber();\n\n return {\n index,\n collectionAddress,\n masterWalletAddress,\n publicKeys,\n adminAddress,\n backendPublicKeys,\n seqno,\n }\n } catch (e) {\n if ((e as Error).message.endsWith('-13')) {\n return null\n }\n throw e\n }\n }\n\n createDeploySmartAccountTx(publicKey: Buffer, transferAmount: bigint) {\n const publicKeys: Dictionary<bigint, Cell> = Dictionary.empty(Dictionary.Keys.BigUint(256), Dictionary.Values.Cell());\n publicKeys.set(bufferToBigInt(publicKey), beginCell().endCell());\n\n const payload = beginCell()\n .storeUint(SmartAccountInternalOp.deploy_account, 32)\n .storeUint(0, 64)\n .storeDict(publicKeys)\n .endCell();\n\n return {\n address: this.config.smartAccountMasterAddress,\n payload: payload.toBoc().toString('base64'),\n amount: transferAmount,\n }\n }\n\n createAddPublicKeyTx(smartAccountAddress: string, publicKey: Buffer) {\n const payload = beginCell()\n .storeUint(SmartAccountInternalOp.add_new_user_public_key, 32)\n .storeUint(0, 64)\n .storeBuffer(publicKey)\n .endCell();\n\n\n return {\n address: smartAccountAddress,\n payload: payload.toBoc().toString('base64'),\n amount: toNano('0.05')\n }\n }\n\n createRemovePublicKeyTx(smartAccountAddress: string, publicKey: Buffer) {\n const payload = beginCell()\n .storeUint(SmartAccountInternalOp.remove_user_public_key, 32)\n .storeUint(0, 64)\n .storeBuffer(publicKey)\n .endCell();\n\n\n return {\n address: smartAccountAddress,\n payload: payload.toBoc().toString('base64'),\n amount: toNano('0.05')\n }\n }\n\n createRemoveAllKeysExceptCurrentTx(smartAccountAddress: string, publicKey: Buffer) {\n const payload = beginCell()\n .storeUint(SmartAccountInternalOp.remove_all_keys_except_current, 32)\n .storeUint(0, 64)\n .storeBuffer(publicKey)\n .endCell();\n\n return {\n address: smartAccountAddress,\n payload: payload.toBoc().toString('base64'),\n amount: toNano('0.05'), // при необходимости настрой сумму\n }\n }\n}\n\nexport function bufferToBigInt(buffer: Buffer): bigint {\n return BigInt('0x' + buffer.toString('hex'));\n}\n","const BIT_NUMBER_SIZE = 10n; // 10 bit\n// const SHIFT_SIZE = 13n; // 13 bit\nconst MAX_BIT_NUMBER = 1022n;\nconst MAX_SHIFT = 8191n; // 2^13 = 8192\n\nexport class HighloadQueryId {\n private shift: bigint; // [0 .. 8191]\n private bitnumber: bigint; // [0 .. 1022]\n\n constructor() {\n this.shift = 0n;\n this.bitnumber = 0n;\n }\n\n static fromShiftAndBitNumber(shift: bigint, bitnumber: bigint): HighloadQueryId {\n const q = new HighloadQueryId();\n q.shift = shift;\n if (q.shift < 0) throw new Error('invalid shift');\n if (q.shift > MAX_SHIFT) throw new Error('invalid shift');\n q.bitnumber = bitnumber;\n if (q.bitnumber < 0) throw new Error('invalid bitnumber');\n if (q.bitnumber > MAX_BIT_NUMBER) throw new Error('invalid bitnumber');\n return q;\n }\n\n\n getNext() {\n let newBitnumber = this.bitnumber + 1n;\n let newShift = this.shift;\n\n if (newShift === MAX_SHIFT && newBitnumber > (MAX_BIT_NUMBER - 1n)) {\n throw new Error('Overload'); // NOTE: we left one queryId for emergency withdraw\n }\n\n if (newBitnumber > MAX_BIT_NUMBER) {\n newBitnumber = 0n;\n newShift += 1n;\n if (newShift > MAX_SHIFT) {\n throw new Error('Overload')\n }\n }\n\n return HighloadQueryId.fromShiftAndBitNumber(newShift, newBitnumber);\n }\n\n hasNext() {\n const isEnd = this.bitnumber >= (MAX_BIT_NUMBER - 1n) && this.shift === MAX_SHIFT; // NOTE: we left one queryId for emergency withdraw;\n return !isEnd;\n }\n\n getShift(): bigint {\n return this.shift;\n }\n\n getBitNumber(): bigint {\n return this.bitnumber;\n }\n\n getQueryId(): bigint {\n return (this.shift << BIT_NUMBER_SIZE) + this.bitnumber;\n }\n\n static fromQueryId(queryId: bigint): HighloadQueryId {\n const shift = queryId >> BIT_NUMBER_SIZE;\n const bitnumber = queryId & 1023n;\n return this.fromShiftAndBitNumber(shift, bitnumber);\n }\n\n static fromSeqno(i: bigint): HighloadQueryId {\n const shift = i / 1023n;\n const bitnumber = i % 1023n;\n return this.fromShiftAndBitNumber(shift, bitnumber);\n }\n\n /**\n * @return {bigint} [0 .. 8380415]\n */\n toSeqno(): bigint {\n return this.bitnumber + this.shift * 1023n;\n }\n}\n\nexport function queryId(): bigint {\n const ts = Math.floor(Date.now() / 1000) - 30;\n\n return BigInt(ts % (1 << 23))\n}","export class NoActiveSessionError extends Error {\n public readonly address: string;\n\n constructor(address: string) {\n super(`No active session found for ${address}`);\n this.name = 'NoActiveSessionError';\n this.address = address;\n }\n}\n\n\nexport const SessionExpiredOrNotProvided = new Error('Session is expired or never provided')"],"names":["VERSION","LOG_PREFIX","IframeAdapter","props","__publicField","waiter","resolve","reject","payload","timeout","messageId","response","_","_b","_a","root","iframe","loadPromise","e","timeoutPromise","attachStart","lastError","attempt","masterAddress","address","message","messages","unpackPublicKeys","cs","packPublicKeys","publicKeys","beginCell","PublicKeysValue","src","builder","DEFAULT_ORDINARY_SMART_ACCOUNT_CODE","ORDINARY_SMART_ACCOUNT_HEADER","calculateSmartAccountAddressFromStateInit","owner","factory","ordinarySmartAccountCode","code","Cell","data","contractAddress","StormWallet","tonClient","config","Address","walletAddress","smartAccountAddress","stack","index","collectionAddress","masterWalletAddress","pksCell","Dictionary","adminAddress","backendPublicKeys","seqno","publicKey","transferAmount","bufferToBigInt","toNano","buffer","BIT_NUMBER_SIZE","MAX_BIT_NUMBER","MAX_SHIFT","HighloadQueryId","shift","bitnumber","q","newBitnumber","newShift","queryId","i","ts","SessionExpiredOrNotProvided"],"mappings":"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"}
|
package/dist/wallet-core.umd.cjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
(function(i,r){typeof exports=="object"&&typeof module<"u"?r(exports,require("@ton/ton")):typeof define=="function"&&define.amd?define(["exports","@ton/ton"],r):(i=typeof globalThis<"u"?globalThis:i||self,r(i.WalletCore={},i.ton))})(this,function(i,r){"use strict";var
|
|
1
|
+
(function(i,r){typeof exports=="object"&&typeof module<"u"?r(exports,require("@ton/ton")):typeof define=="function"&&define.amd?define(["exports","@ton/ton"],r):(i=typeof globalThis<"u"?globalThis:i||self,r(i.WalletCore={},i.ton))})(this,function(i,r){"use strict";var _=Object.defineProperty;var U=(i,r,l)=>r in i?_(i,r,{enumerable:!0,configurable:!0,writable:!0,value:l}):i[r]=l;var o=(i,r,l)=>U(i,typeof r!="symbol"?r+"":r,l);const f="[embedded-wallet v1.0.28]";class A{constructor(e){o(this,"host");o(this,"timeouts");o(this,"waitingForResponse",new Map);o(this,"iframe");o(this,"state","not-ready");o(this,"i18nInit");o(this,"handleMessage",e=>{if(typeof e.data!="object"||e.data===null||!("id"in e.data)||!("status"in e.data)||typeof e.data.id!="string"||typeof e.data.status!="string")return;const t=this.waitingForResponse.get(e.data.id);if(!t)return;const[s,n]=t;this.waitingForResponse.delete(e.data.id),e.data.status==="success"?"payload"in e.data?s(e.data.payload):s(void 0):"error"in e.data?n(new Error(e.data.error)):n(new Error("Unknown error"))});this.host=e.host,this.timeouts={init:1e3,connect:6e4,disconnect:1e3,sign:1e3,createTransfer:1e3,activeSessions:1e3,getPublicKey:1e3,resetDevice:1e3,...e.timeouts},this.i18nInit=e.i18n}async sendMessage(e,t){var a,d;const s=Math.random().toString(),n=Promise.race([new Promise((b,u)=>{this.waitingForResponse.set(s,[b,u])}),new Promise((b,u)=>{setTimeout(()=>{u(new Error("Response timeout"))},t)})]);return(d=(a=this.iframe)==null?void 0:a.contentWindow)==null||d.postMessage({id:s,payload:e},this.host),n}setupMessageListener(){window.addEventListener("message",this.handleMessage)}async attachIframe(e){const t=document.createElement("iframe");t.src=this.host,t.frameBorder="0",t.width="100%",t.height="100%";const s=new Promise((a,d)=>{t.addEventListener("load",()=>a(),{once:!0}),t.addEventListener("error",b=>d(b),{once:!0})}),n=new Promise((a,d)=>{setTimeout(()=>d(new Error("Iframe load timeout")),this.timeouts.init)});return e.appendChild(t),this.iframe=t,Promise.race([s,n])}async init(e){if(this.state==="not-ready"){this.state="initializing";try{console.log(f,"attaching to root",e);const t=performance.now();await this.attachIframe(e),console.log(f,`iframe attached in ${Math.round(performance.now()-t)}ms`),this.setupMessageListener(),console.log(f,"sending ping");let s;for(let n=1;n<=5;n++)try{await this.sendMessage({type:"ping",i18n:this.i18nInit},this.timeouts.init),console.log(f,"pong received"),this.state="ready";return}catch(a){s=a instanceof Error?a:new Error(String(a)),console.warn(f,`ping attempt ${n}/5 failed:`,s.message),n<5&&await new Promise(d=>setTimeout(d,200))}throw new Error(`${f} ping retries exceeded: ${s==null?void 0:s.message}`)}catch(t){throw this.destroy(),t}}}destroy(){var e;if(this.state!=="not-ready"){this.state="not-ready",window.removeEventListener("message",this.handleMessage);for(const[,t]of this.waitingForResponse.values())t(new Error("Iframe disconnected"));this.waitingForResponse.clear(),(e=this.iframe)==null||e.remove(),this.iframe=void 0}}async connect(e){return this.sendMessage({type:"connect",address:e},this.timeouts.connect)}async getPublicKey(e){return this.sendMessage({type:"get-public-key",address:e},this.timeouts.getPublicKey)}async resetDevice(e){return this.sendMessage({type:"reset-device",address:e},this.timeouts.resetDevice)}async signMessage(e,t){return this.sendMessage({type:"sign",address:e,message:t},this.timeouts.sign)}async signMessages(e,t){return this.sendMessage({type:"sign-many",address:e,messages:t},this.timeouts.sign)}async createTransfer(e,t){return this.sendMessage({type:"create-transfer",address:e,data:t},this.timeouts.createTransfer)}async getActiveSessions(){return this.sendMessage({type:"active-sessions"},this.timeouts.activeSessions)}async disconnect(e){return this.sendMessage({type:"disconnect",address:e},this.timeouts.disconnect)}}const S=c=>c.loadBuffer(32),v=c=>r.beginCell().storeBuffer(c,32).endCell(),E={serialize:(c,e)=>{e.storeBuilder(v(c).asBuilder())},parse:c=>S(c)},M="b5ee9c7241021401000460000114ff00f4a413f4bcf2c80b01020162021004bcd020c700915be001d0d3030171b0915be0fa4030ed44d0d30701f861fa4001f862fa4001f863f40430f86401d31f218210186b2edfba8e843101db3ce02182104fedc82bba8e843101db3ce02182105b0dd9f4bae30201821018a092f7ba03060b0c02f401d33ffa00fa40fa40d152408d086000d3cb310c6345907411bee7fd03c8688ae26a620314eb93f4bba111e4cb869b4cc801cf1601cf16c9880120f90022f90002d76503d76582020134c8cb17cb0f13cb0fcbffcbff71f90400c88b1801cf16cbffc9d001c705f2e19182105b27f9c5c8cb1f13cb3f01fa02010704011acf16f843cf16c970598040db3c05002c718010c8cb055004cf165004fa0212cb6accc901fb0002da01d33ffa40fa00fa40d430d052528d086000d3cb310c6345907411bee7fd03c8688ae26a620314eb93f4bba111e4cb869b4cc801cf1601cf16c9880120f90022f90002d76503d76582020134c8cb17cb0f13cb0fcbffcbff71f90400c88b1801cf16cbffc9d001c705f2e19104070a0114ff00f4a413f4bcf2c80b080196d36c2220c700f24001d0d3030171b0f240fa403001d31f01821029c102d1ba8ea4ed44d0fa403012c705f2e29afa40d4d43001fb04ed54820898968070fb0270018306db3ce05b840ff2f0090028708010c8cb055003cf165003fa02cb6ac901fb0002b0f844521081010bf40a6fa1c8019a01fa00305003a012fa02943158fa02e2f8441281010bf441f86422d70b01c0008e85328042db3c8e8c300181010bd719018042db3ce2f844f841c8cb07f842cf16f843cf16f400c9ed540f0f01d2310101d33ff8425230c705f2e1915801d317d4d307d4d1fb046d6d58f823500503c8f40012f400cb3fcb17c970f843f844102655226d0107c8cb075006cf165004cf1612f400cb07ccf400ccc9ed548102e58203dbea8209e1338070f83774fb02f84301810082db3c0f01168e8301db3ce05b840ff2f00d017af8425210c705f2e19101d33ffa40fa00fa405023f844521081010bf40a6fa1c8019a01fa00305003a012fa02943158fa02e2f8441281010bf441f864030e01ae01d317d4d307d4d1fb046d6d58f823500503c8f40012f400cb3fcb17c970f843f844102655226d0107c8cb075006cf165004cf1612f400cb07ccf400ccc9ed548102e58203dbea8209e1338070f83774fb02810082db3c0f003e8210d53276db708010c8cb055005cf1624fa0214cb6a13cb1fcb3fc901fb0002012011120043bc82ff6a268698380fc30fd2000fc317d2000fc31fa02187c327c20fc217c21fc224014fbc7e7f6a268698380fc30fd2000fc317d2000fc31fa02187c327c147d2218e445997981d4678b10c1300f620c0008e1830c8709320c14097803058cb0701a4e801c9d001aa02d7198e4770800fc89322c1408e1a5331b020c20995a63701cb0795a63001cb07e203ab0302a44013e86c21c832c9d080409320c2009da520aa02522078d72413cf1602e85bc9d08308d719e2cf168b52e6a736f6e8cf16c970f842f843410403d563745f",C=0;function y(c,e,t){const s=r.Cell.fromHex(t),n=r.beginCell().storeUint(C,8).storeAddress(e).storeAddress(c).storeDict(null).endCell();return r.contractAddress(0,{code:s,data:n})}class B{constructor(e,t,s=M){this.tonClient=e,this.config=t,this.ordinarySmartAccountCode=s}calculateSmartAccountAddressFromStateInit(e){return y(e,r.Address.parse(this.config.smartAccountMasterAddress),this.ordinarySmartAccountCode)}async getSmartAccountAddress(e){return(await this.tonClient.runMethod(r.Address.parse(this.config.smartAccountMasterAddress),"get_nft_address_by_index",[{type:"int",value:BigInt(`0x${r.Address.parse(e).hash.toString("hex")}`)}])).stack.readAddress()}async getSmartAccountData(e){const t=r.Address.parse(e);try{const n=(await this.tonClient.runMethod(t,"get_storage_data")).stack,a=n.readBigNumber(),d=n.readAddress(),b=n.readAddress(),u=n.readCellOpt();let w=[];u&&(w=r.Dictionary.loadDirect(r.Dictionary.Keys.BigUint(256),r.Dictionary.Values.Cell(),u).keys());const P=n.readAddress(),T=r.Dictionary.loadDirect(r.Dictionary.Keys.Uint(8),E,n.readCell()).values(),R=n.readNumber();return{index:a,collectionAddress:d,masterWalletAddress:b,publicKeys:w,adminAddress:P,backendPublicKeys:T,seqno:R}}catch(s){if(s.message.endsWith("-13"))return null;throw s}}createDeploySmartAccountTx(e,t){const s=r.Dictionary.empty(r.Dictionary.Keys.BigUint(256),r.Dictionary.Values.Cell());s.set(I(e),r.beginCell().endCell());const n=r.beginCell().storeUint(1983912421,32).storeUint(0,64).storeDict(s).endCell();return{address:this.config.smartAccountMasterAddress,payload:n.toBoc().toString("base64"),amount:t}}createAddPublicKeyTx(e,t){const s=r.beginCell().storeUint(571231257,32).storeUint(0,64).storeBuffer(t).endCell();return{address:e,payload:s.toBoc().toString("base64"),amount:r.toNano("0.05")}}createRemovePublicKeyTx(e,t){const s=r.beginCell().storeUint(1948765727,32).storeUint(0,64).storeBuffer(t).endCell();return{address:e,payload:s.toBoc().toString("base64"),amount:r.toNano("0.05")}}createRemoveAllKeysExceptCurrentTx(e,t){const s=r.beginCell().storeUint(1604127040,32).storeUint(0,64).storeBuffer(t).endCell();return{address:e,payload:s.toBoc().toString("base64"),amount:r.toNano("0.05")}}}function I(c){return BigInt("0x"+c.toString("hex"))}const p=10n,h=1022n,m=8191n;class g{constructor(){o(this,"shift");o(this,"bitnumber");this.shift=0n,this.bitnumber=0n}static fromShiftAndBitNumber(e,t){const s=new g;if(s.shift=e,s.shift<0)throw new Error("invalid shift");if(s.shift>m)throw new Error("invalid shift");if(s.bitnumber=t,s.bitnumber<0)throw new Error("invalid bitnumber");if(s.bitnumber>h)throw new Error("invalid bitnumber");return s}getNext(){let e=this.bitnumber+1n,t=this.shift;if(t===m&&e>h-1n)throw new Error("Overload");if(e>h&&(e=0n,t+=1n,t>m))throw new Error("Overload");return g.fromShiftAndBitNumber(t,e)}hasNext(){return!(this.bitnumber>=h-1n&&this.shift===m)}getShift(){return this.shift}getBitNumber(){return this.bitnumber}getQueryId(){return(this.shift<<p)+this.bitnumber}static fromQueryId(e){const t=e>>p,s=e&1023n;return this.fromShiftAndBitNumber(t,s)}static fromSeqno(e){const t=e/1023n,s=e%1023n;return this.fromShiftAndBitNumber(t,s)}toSeqno(){return this.bitnumber+this.shift*1023n}}function D(){const c=Math.floor(Date.now()/1e3)-30;return BigInt(c%(1<<23))}const N=new Error("Session is expired or never provided");i.HighloadQueryId=g,i.IframeAdapter=A,i.SessionExpiredOrNotProvided=N,i.StormWallet=B,i.calculateSmartAccountAddressFromStateInit=y,i.queryId=D,Object.defineProperty(i,Symbol.toStringTag,{value:"Module"})});
|
|
2
2
|
//# sourceMappingURL=wallet-core.umd.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wallet-core.umd.cjs","sources":["../src/adapters/iframe-adapter.ts","../src/utils/packers.ts","../src/wallet.ts","../src/utils/query-id.ts","../src/error.ts"],"sourcesContent":["import {\n ActiveSessionsResponse,\n AdapterState,\n ConnectResponse,\n CreateTransferRequest,\n CreateTransferResponse,\n EmptyResponse,\n GetPublicKeyResponse,\n IframeAdapterProps,\n SignRequest,\n SignResponse,\n Timeouts,\n} from '../types';\n\ntype Waiter = [(value: any) => void, (e: Error) => void]\n\nconst LOG_PREFIX = `[embedded-wallet v${__VERSION__}]`;\n\nexport class IframeAdapter {\n private readonly host: string;\n private readonly timeouts: Required<Timeouts>;\n private readonly waitingForResponse = new Map<string, Waiter>();\n private iframe?: HTMLIFrameElement;\n private state: AdapterState = 'not-ready';\n private readonly i18nInit?: IframeAdapterProps['i18n'];\n\n constructor(props: IframeAdapterProps) {\n this.host = props.host;\n this.timeouts = {\n init: 1000,\n connect: 60000,\n disconnect: 1000,\n sign: 1000,\n createTransfer: 1000,\n activeSessions: 1000,\n getPublicKey: 1000,\n resetDevice: 1000,\n ...props.timeouts,\n };\n this.i18nInit = props.i18n;\n }\n\n private async sendMessage<R>(payload: unknown, timeout: number): Promise<R> {\n const messageId = Math.random().toString();\n const response = Promise.race([\n new Promise<R>((resolve, reject) => {\n this.waitingForResponse.set(messageId, [resolve, reject]);\n }),\n new Promise<R>((_, reject) => {\n setTimeout(() => {\n reject(new Error('Response timeout'));\n }, timeout);\n }),\n ]);\n this.iframe?.contentWindow?.postMessage({ id: messageId, payload }, this.host);\n return response;\n }\n\n private setupMessageListener() {\n window.addEventListener('message', this.handleMessage);\n }\n\n private handleMessage = (e: MessageEvent<unknown>) => {\n if (typeof e.data !== 'object' || e.data === null) {\n return;\n }\n if (!('id' in e.data) || !('status' in e.data)) {\n return;\n }\n if (typeof e.data.id !== 'string' || typeof e.data.status !== 'string') {\n return;\n }\n const waiter = this.waitingForResponse.get(e.data.id);\n if (!waiter) {\n return;\n }\n const [resolve, reject] = waiter;\n this.waitingForResponse.delete(e.data.id);\n if (e.data.status === 'success') {\n if ('payload' in e.data) {\n resolve(e.data.payload);\n } else {\n resolve(undefined);\n }\n } else {\n if ('error' in e.data) {\n reject(new Error(e.data.error as string));\n } else {\n reject(new Error('Unknown error'));\n }\n }\n\n };\n\n private async attachIframe(root: HTMLElement): Promise<void> {\n const iframe = document.createElement('iframe');\n iframe.src = this.host;\n iframe.frameBorder = '0';\n iframe.width = '100%';\n iframe.height = '100%';\n\n const loadPromise = new Promise<void>((resolve, reject) => {\n iframe.addEventListener('load', () => resolve(), { once: true });\n iframe.addEventListener('error', (e) => reject(e), { once: true });\n });\n\n const timeoutPromise = new Promise<never>((_, reject) => {\n setTimeout(() => reject(new Error('Iframe load timeout')), this.timeouts.init);\n });\n\n root.appendChild(iframe);\n this.iframe = iframe;\n return Promise.race([loadPromise, timeoutPromise]);\n }\n\n async init(root: HTMLElement): Promise<void> {\n if (this.state !== 'not-ready') {\n return;\n }\n\n this.state = 'initializing';\n\n try {\n console.log(LOG_PREFIX, 'attaching to root', root);\n await this.attachIframe(root);\n console.log(LOG_PREFIX, 'iframe attached');\n this.setupMessageListener();\n console.log(LOG_PREFIX, 'sending ping');\n\n let lastError: Error | undefined;\n for (let attempt = 1; attempt <= 5; attempt++) {\n try {\n await this.sendMessage({ type: 'ping', i18n: this.i18nInit }, this.timeouts.init);\n console.log(LOG_PREFIX, 'pong received');\n this.state = 'ready';\n return;\n } catch (e) {\n lastError = e instanceof Error ? e : new Error(String(e));\n console.warn(LOG_PREFIX, `ping attempt ${attempt}/5 failed:`, lastError.message);\n if (attempt < 5) {\n await new Promise(resolve => setTimeout(resolve, 200));\n }\n }\n }\n\n throw new Error(`${LOG_PREFIX} ping retries exceeded: ${lastError?.message}`);\n } catch (e) {\n this.destroy();\n throw e;\n }\n }\n\n destroy(): void {\n if (this.state === 'not-ready') {\n return;\n }\n\n this.state = 'not-ready';\n window.removeEventListener('message', this.handleMessage);\n\n for (const [, reject] of this.waitingForResponse.values()) {\n reject(new Error('Iframe disconnected'));\n }\n this.waitingForResponse.clear();\n\n this.iframe?.remove();\n this.iframe = undefined;\n }\n\n async connect(masterAddress: string): Promise<ConnectResponse> {\n return this.sendMessage({ type: 'connect', address: masterAddress }, this.timeouts.connect);\n }\n\n\n\n async getPublicKey(address: string): Promise<GetPublicKeyResponse> {\n return this.sendMessage({ type: \"get-public-key\", address }, this.timeouts.getPublicKey);\n }\n\n async resetDevice(address: string): Promise<EmptyResponse> {\n return this.sendMessage({ type: \"reset-device\", address }, this.timeouts.resetDevice);\n }\n\n async signMessage(masterAddress: string, message: SignRequest): Promise<SignResponse> {\n return this.sendMessage({ type: 'sign', address: masterAddress, message }, this.timeouts.sign);\n }\n\n async signMessages(masterAddress: string, messages: SignRequest[]): Promise<{ hashes: Uint8Array[]; signatures: Uint8Array[]; }> {\n return this.sendMessage({ type: 'sign-many', address: masterAddress, messages }, this.timeouts.sign);\n }\n\n async createTransfer(masterAddress: string, message: CreateTransferRequest): Promise<CreateTransferResponse> {\n return this.sendMessage({\n type: 'create-transfer',\n address: masterAddress,\n data: message,\n }, this.timeouts.createTransfer);\n }\n\n async getActiveSessions(): Promise<ActiveSessionsResponse> {\n return this.sendMessage({ type: 'active-sessions' }, this.timeouts.activeSessions);\n }\n\n async disconnect(masterAddress: string): Promise<void> {\n return this.sendMessage({ type: 'disconnect', address: masterAddress }, this.timeouts.disconnect);\n }\n}\n","import { beginCell, Cell, DictionaryValue, Slice } from \"@ton/ton\";\n\nexport const unpackPublicKeys = (cs: Slice): Buffer => {\n return cs.loadBuffer(32);\n}\n\nexport const packPublicKeys = (publicKeys: Buffer): Cell => {\n return beginCell().storeBuffer(publicKeys, 32).endCell();\n}\n\nexport const PublicKeysValue: DictionaryValue<Buffer> = {\n serialize: (src: Buffer, builder) => {\n builder.storeBuilder(packPublicKeys(src).asBuilder());\n },\n parse: (src) => {\n return unpackPublicKeys(src);\n },\n};\n","import { Address, beginCell, Cell, contractAddress, Dictionary, toNano, TonClient } from \"@ton/ton\";\nimport { PublicKeysValue } from \"./utils/packers\";\n\ntype StormWalletConfig = {\n smartAccountMasterAddress: string;\n}\n\nexport enum SmartAccountInternalOp {\n deploy_account = 0x764019e5,\n add_new_user_public_key = 0x220c4c19,\n remove_user_public_key = 0x7427ce1f,\n execute_limit_order = 0x1c0af2cb,\n execute_orders_bundle = 0xf38e7e65,\n set_code = 0x9c0f3220,\n add_request_to_add_new_user_public_key = 0x03cc29e8,\n add_request_to_remove_user_public_key = 0x07d25def,\n remove_all_keys_except_current = 0x5f9d0940\n}\n\nexport const DEFAULT_ORDINARY_SMART_ACCOUNT_CODE = \"b5ee9c7241021401000460000114ff00f4a413f4bcf2c80b01020162021004bcd020c700915be001d0d3030171b0915be0fa4030ed44d0d30701f861fa4001f862fa4001f863f40430f86401d31f218210186b2edfba8e843101db3ce02182104fedc82bba8e843101db3ce02182105b0dd9f4bae30201821018a092f7ba03060b0c02f401d33ffa00fa40fa40d152408d086000d3cb310c6345907411bee7fd03c8688ae26a620314eb93f4bba111e4cb869b4cc801cf1601cf16c9880120f90022f90002d76503d76582020134c8cb17cb0f13cb0fcbffcbff71f90400c88b1801cf16cbffc9d001c705f2e19182105b27f9c5c8cb1f13cb3f01fa02010704011acf16f843cf16c970598040db3c05002c718010c8cb055004cf165004fa0212cb6accc901fb0002da01d33ffa40fa00fa40d430d052528d086000d3cb310c6345907411bee7fd03c8688ae26a620314eb93f4bba111e4cb869b4cc801cf1601cf16c9880120f90022f90002d76503d76582020134c8cb17cb0f13cb0fcbffcbff71f90400c88b1801cf16cbffc9d001c705f2e19104070a0114ff00f4a413f4bcf2c80b080196d36c2220c700f24001d0d3030171b0f240fa403001d31f01821029c102d1ba8ea4ed44d0fa403012c705f2e29afa40d4d43001fb04ed54820898968070fb0270018306db3ce05b840ff2f0090028708010c8cb055003cf165003fa02cb6ac901fb0002b0f844521081010bf40a6fa1c8019a01fa00305003a012fa02943158fa02e2f8441281010bf441f86422d70b01c0008e85328042db3c8e8c300181010bd719018042db3ce2f844f841c8cb07f842cf16f843cf16f400c9ed540f0f01d2310101d33ff8425230c705f2e1915801d317d4d307d4d1fb046d6d58f823500503c8f40012f400cb3fcb17c970f843f844102655226d0107c8cb075006cf165004cf1612f400cb07ccf400ccc9ed548102e58203dbea8209e1338070f83774fb02f84301810082db3c0f01168e8301db3ce05b840ff2f00d017af8425210c705f2e19101d33ffa40fa00fa405023f844521081010bf40a6fa1c8019a01fa00305003a012fa02943158fa02e2f8441281010bf441f864030e01ae01d317d4d307d4d1fb046d6d58f823500503c8f40012f400cb3fcb17c970f843f844102655226d0107c8cb075006cf165004cf1612f400cb07ccf400ccc9ed548102e58203dbea8209e1338070f83774fb02810082db3c0f003e8210d53276db708010c8cb055005cf1624fa0214cb6a13cb1fcb3fc901fb0002012011120043bc82ff6a268698380fc30fd2000fc317d2000fc31fa02187c327c20fc217c21fc224014fbc7e7f6a268698380fc30fd2000fc317d2000fc31fa02187c327c147d2218e445997981d4678b10c1300f620c0008e1830c8709320c14097803058cb0701a4e801c9d001aa02d7198e4770800fc89322c1408e1a5331b020c20995a63701cb0795a63001cb07e203ab0302a44013e86c21c832c9d080409320c2009da520aa02522078d72413cf1602e85bc9d08308d719e2cf168b52e6a736f6e8cf16c970f842f843410403d563745f\"\nconst ORDINARY_SMART_ACCOUNT_HEADER = 0;\n\nexport function calculateSmartAccountAddressFromStateInit(owner: Address, factory: Address, ordinarySmartAccountCode: string): Address {\n const code = Cell.fromHex(ordinarySmartAccountCode);\n\n const data = beginCell()\n .storeUint(ORDINARY_SMART_ACCOUNT_HEADER, 8)\n .storeAddress(factory)\n .storeAddress(owner)\n .storeDict(null)\n .endCell()\n\n return contractAddress(0, {code, data});\n}\n\nexport class StormWallet {\n constructor(private readonly tonClient: TonClient, private readonly config: StormWalletConfig, private readonly ordinarySmartAccountCode = DEFAULT_ORDINARY_SMART_ACCOUNT_CODE) {\n }\n\n calculateSmartAccountAddressFromStateInit(owner: Address): Address {\n return calculateSmartAccountAddressFromStateInit(owner, Address.parse(this.config.smartAccountMasterAddress), this.ordinarySmartAccountCode);\n }\n\n async getSmartAccountAddress(walletAddress: string): Promise<Address> {\n const result = await this.tonClient.runMethod(Address.parse(this.config.smartAccountMasterAddress), 'get_nft_address_by_index', [\n {\n type: 'int',\n value: BigInt(`0x${Address.parse(walletAddress).hash.toString('hex')}`)\n }\n ])\n return result.stack.readAddress()\n }\n\n async getSmartAccountData(smartAccountAddress: string) {\n const address = Address.parse(smartAccountAddress)\n try {\n const result = await this.tonClient.runMethod(address, 'get_storage_data')\n const stack = result.stack\n\n const index = stack.readBigNumber();\n const collectionAddress = stack.readAddress();\n const masterWalletAddress = stack.readAddress();\n\n\n const pksCell = stack.readCellOpt()\n let publicKeys: bigint[] = []\n\n if (pksCell) {\n publicKeys = Dictionary.loadDirect(Dictionary.Keys.BigUint(256), Dictionary.Values.Cell(), pksCell).keys();\n }\n\n const adminAddress = stack.readAddress();\n const backendPublicKeys = Dictionary.loadDirect(\n Dictionary.Keys.Uint(8),\n PublicKeysValue,\n stack.readCell()\n ).values();\n\n const seqno = stack.readNumber();\n\n return {\n index,\n collectionAddress,\n masterWalletAddress,\n publicKeys,\n adminAddress,\n backendPublicKeys,\n seqno,\n }\n } catch (e) {\n if ((e as Error).message.endsWith('-13')) {\n return null\n }\n throw e\n }\n }\n\n createDeploySmartAccountTx(publicKey: Buffer, transferAmount: bigint) {\n const publicKeys: Dictionary<bigint, Cell> = Dictionary.empty(Dictionary.Keys.BigUint(256), Dictionary.Values.Cell());\n publicKeys.set(bufferToBigInt(publicKey), beginCell().endCell());\n\n const payload = beginCell()\n .storeUint(SmartAccountInternalOp.deploy_account, 32)\n .storeUint(0, 64)\n .storeDict(publicKeys)\n .endCell();\n\n return {\n address: this.config.smartAccountMasterAddress,\n payload: payload.toBoc().toString('base64'),\n amount: transferAmount,\n }\n }\n\n createAddPublicKeyTx(smartAccountAddress: string, publicKey: Buffer) {\n const payload = beginCell()\n .storeUint(SmartAccountInternalOp.add_new_user_public_key, 32)\n .storeUint(0, 64)\n .storeBuffer(publicKey)\n .endCell();\n\n\n return {\n address: smartAccountAddress,\n payload: payload.toBoc().toString('base64'),\n amount: toNano('0.05')\n }\n }\n\n createRemovePublicKeyTx(smartAccountAddress: string, publicKey: Buffer) {\n const payload = beginCell()\n .storeUint(SmartAccountInternalOp.remove_user_public_key, 32)\n .storeUint(0, 64)\n .storeBuffer(publicKey)\n .endCell();\n\n\n return {\n address: smartAccountAddress,\n payload: payload.toBoc().toString('base64'),\n amount: toNano('0.05')\n }\n }\n\n createRemoveAllKeysExceptCurrentTx(smartAccountAddress: string, publicKey: Buffer) {\n const payload = beginCell()\n .storeUint(SmartAccountInternalOp.remove_all_keys_except_current, 32)\n .storeUint(0, 64)\n .storeBuffer(publicKey)\n .endCell();\n\n return {\n address: smartAccountAddress,\n payload: payload.toBoc().toString('base64'),\n amount: toNano('0.05'), // при необходимости настрой сумму\n }\n }\n}\n\nexport function bufferToBigInt(buffer: Buffer): bigint {\n return BigInt('0x' + buffer.toString('hex'));\n}\n","const BIT_NUMBER_SIZE = 10n; // 10 bit\n// const SHIFT_SIZE = 13n; // 13 bit\nconst MAX_BIT_NUMBER = 1022n;\nconst MAX_SHIFT = 8191n; // 2^13 = 8192\n\nexport class HighloadQueryId {\n private shift: bigint; // [0 .. 8191]\n private bitnumber: bigint; // [0 .. 1022]\n\n constructor() {\n this.shift = 0n;\n this.bitnumber = 0n;\n }\n\n static fromShiftAndBitNumber(shift: bigint, bitnumber: bigint): HighloadQueryId {\n const q = new HighloadQueryId();\n q.shift = shift;\n if (q.shift < 0) throw new Error('invalid shift');\n if (q.shift > MAX_SHIFT) throw new Error('invalid shift');\n q.bitnumber = bitnumber;\n if (q.bitnumber < 0) throw new Error('invalid bitnumber');\n if (q.bitnumber > MAX_BIT_NUMBER) throw new Error('invalid bitnumber');\n return q;\n }\n\n\n getNext() {\n let newBitnumber = this.bitnumber + 1n;\n let newShift = this.shift;\n\n if (newShift === MAX_SHIFT && newBitnumber > (MAX_BIT_NUMBER - 1n)) {\n throw new Error('Overload'); // NOTE: we left one queryId for emergency withdraw\n }\n\n if (newBitnumber > MAX_BIT_NUMBER) {\n newBitnumber = 0n;\n newShift += 1n;\n if (newShift > MAX_SHIFT) {\n throw new Error('Overload')\n }\n }\n\n return HighloadQueryId.fromShiftAndBitNumber(newShift, newBitnumber);\n }\n\n hasNext() {\n const isEnd = this.bitnumber >= (MAX_BIT_NUMBER - 1n) && this.shift === MAX_SHIFT; // NOTE: we left one queryId for emergency withdraw;\n return !isEnd;\n }\n\n getShift(): bigint {\n return this.shift;\n }\n\n getBitNumber(): bigint {\n return this.bitnumber;\n }\n\n getQueryId(): bigint {\n return (this.shift << BIT_NUMBER_SIZE) + this.bitnumber;\n }\n\n static fromQueryId(queryId: bigint): HighloadQueryId {\n const shift = queryId >> BIT_NUMBER_SIZE;\n const bitnumber = queryId & 1023n;\n return this.fromShiftAndBitNumber(shift, bitnumber);\n }\n\n static fromSeqno(i: bigint): HighloadQueryId {\n const shift = i / 1023n;\n const bitnumber = i % 1023n;\n return this.fromShiftAndBitNumber(shift, bitnumber);\n }\n\n /**\n * @return {bigint} [0 .. 8380415]\n */\n toSeqno(): bigint {\n return this.bitnumber + this.shift * 1023n;\n }\n}\n\nexport function queryId(): bigint {\n const ts = Math.floor(Date.now() / 1000) - 30;\n\n return BigInt(ts % (1 << 23))\n}","export class NoActiveSessionError extends Error {\n public readonly address: string;\n\n constructor(address: string) {\n super(`No active session found for ${address}`);\n this.name = 'NoActiveSessionError';\n this.address = address;\n }\n}\n\n\nexport const SessionExpiredOrNotProvided = new Error('Session is expired or never provided')"],"names":["LOG_PREFIX","IframeAdapter","props","__publicField","waiter","resolve","reject","payload","timeout","messageId","response","_","_b","_a","root","iframe","loadPromise","e","timeoutPromise","lastError","attempt","masterAddress","address","message","messages","unpackPublicKeys","cs","packPublicKeys","publicKeys","beginCell","PublicKeysValue","src","builder","DEFAULT_ORDINARY_SMART_ACCOUNT_CODE","ORDINARY_SMART_ACCOUNT_HEADER","calculateSmartAccountAddressFromStateInit","owner","factory","ordinarySmartAccountCode","code","Cell","data","contractAddress","StormWallet","tonClient","config","Address","walletAddress","smartAccountAddress","stack","index","collectionAddress","masterWalletAddress","pksCell","Dictionary","adminAddress","backendPublicKeys","seqno","publicKey","transferAmount","bufferToBigInt","toNano","buffer","BIT_NUMBER_SIZE","MAX_BIT_NUMBER","MAX_SHIFT","HighloadQueryId","shift","bitnumber","q","newBitnumber","newShift","queryId","i","ts","SessionExpiredOrNotProvided"],"mappings":"6aAgBA,MAAMA,EAAa,4BAEZ,MAAMC,CAAc,CAQzB,YAAYC,EAA2B,CAPtBC,EAAA,aACAA,EAAA,iBACAA,EAAA,8BAAyB,KAClCA,EAAA,eACAA,EAAA,aAAsB,aACbA,EAAA,iBAsCTA,EAAA,qBAAiB,GAA6B,CAOhD,GANA,OAAO,EAAE,MAAS,UAAY,EAAE,OAAS,MAGzC,EAAE,OAAQ,EAAE,OAAS,EAAE,WAAY,EAAE,OAGrC,OAAO,EAAE,KAAK,IAAO,UAAY,OAAO,EAAE,KAAK,QAAW,SAC5D,OAEF,MAAMC,EAAS,KAAK,mBAAmB,IAAI,EAAE,KAAK,EAAE,EACpD,GAAI,CAACA,EACH,OAEI,KAAA,CAACC,EAASC,CAAM,EAAIF,EAC1B,KAAK,mBAAmB,OAAO,EAAE,KAAK,EAAE,EACpC,EAAE,KAAK,SAAW,UAChB,YAAa,EAAE,KACTC,EAAA,EAAE,KAAK,OAAO,EAEtBA,EAAQ,MAAS,EAGf,UAAW,EAAE,KACfC,EAAO,IAAI,MAAM,EAAE,KAAK,KAAe,CAAC,EAEjCA,EAAA,IAAI,MAAM,eAAe,CAAC,CAIvC,GAjEE,KAAK,KAAOJ,EAAM,KAClB,KAAK,SAAW,CACd,KAAM,IACN,QAAS,IACT,WAAY,IACZ,KAAM,IACN,eAAgB,IAChB,eAAgB,IAChB,aAAc,IACd,YAAa,IACb,GAAGA,EAAM,QACX,EACA,KAAK,SAAWA,EAAM,IAAA,CAGxB,MAAc,YAAeK,EAAkBC,EAA6B,SAC1E,MAAMC,EAAY,KAAK,OAAO,EAAE,SAAS,EACnCC,EAAW,QAAQ,KAAK,CAC5B,IAAI,QAAW,CAACL,EAASC,IAAW,CAClC,KAAK,mBAAmB,IAAIG,EAAW,CAACJ,EAASC,CAAM,CAAC,CAAA,CACzD,EACD,IAAI,QAAW,CAACK,EAAGL,IAAW,CAC5B,WAAW,IAAM,CACRA,EAAA,IAAI,MAAM,kBAAkB,CAAC,GACnCE,CAAO,CACX,CAAA,CAAA,CACF,EACI,OAAAI,GAAAC,EAAA,KAAA,SAAA,YAAAA,EAAQ,gBAAR,MAAAD,EAAuB,YAAY,CAAE,GAAIH,EAAW,QAAAF,CAAA,EAAW,KAAK,MAClEG,CAAA,CAGD,sBAAuB,CACtB,OAAA,iBAAiB,UAAW,KAAK,aAAa,CAAA,CAmCvD,MAAc,aAAaI,EAAkC,CACrD,MAAAC,EAAS,SAAS,cAAc,QAAQ,EAC9CA,EAAO,IAAM,KAAK,KAClBA,EAAO,YAAc,IACrBA,EAAO,MAAQ,OACfA,EAAO,OAAS,OAEhB,MAAMC,EAAc,IAAI,QAAc,CAACX,EAASC,IAAW,CAClDS,EAAA,iBAAiB,OAAQ,IAAMV,EAAA,EAAW,CAAE,KAAM,GAAM,EACxDU,EAAA,iBAAiB,QAAUE,GAAMX,EAAOW,CAAC,EAAG,CAAE,KAAM,GAAM,CAAA,CAClE,EAEKC,EAAiB,IAAI,QAAe,CAACP,EAAGL,IAAW,CAC5C,WAAA,IAAMA,EAAO,IAAI,MAAM,qBAAqB,CAAC,EAAG,KAAK,SAAS,IAAI,CAAA,CAC9E,EAED,OAAAQ,EAAK,YAAYC,CAAM,EACvB,KAAK,OAASA,EACP,QAAQ,KAAK,CAACC,EAAaE,CAAc,CAAC,CAAA,CAGnD,MAAM,KAAKJ,EAAkC,CACvC,GAAA,KAAK,QAAU,YAInB,MAAK,MAAQ,eAET,GAAA,CACM,QAAA,IAAId,EAAY,oBAAqBc,CAAI,EAC3C,MAAA,KAAK,aAAaA,CAAI,EACpB,QAAA,IAAId,EAAY,iBAAiB,EACzC,KAAK,qBAAqB,EAClB,QAAA,IAAIA,EAAY,cAAc,EAElC,IAAAmB,EACJ,QAASC,EAAU,EAAGA,GAAW,EAAGA,IAC9B,GAAA,CACI,MAAA,KAAK,YAAY,CAAE,KAAM,OAAQ,KAAM,KAAK,QAAS,EAAG,KAAK,SAAS,IAAI,EACxE,QAAA,IAAIpB,EAAY,eAAe,EACvC,KAAK,MAAQ,QACb,aACOiB,EAAG,CACVE,EAAYF,aAAa,MAAQA,EAAI,IAAI,MAAM,OAAOA,CAAC,CAAC,EACxD,QAAQ,KAAKjB,EAAY,gBAAgBoB,CAAO,aAAcD,EAAU,OAAO,EAC3EC,EAAU,GACZ,MAAM,IAAI,QAAQf,GAAW,WAAWA,EAAS,GAAG,CAAC,CACvD,CAIJ,MAAM,IAAI,MAAM,GAAGL,CAAU,2BAA2BmB,GAAA,YAAAA,EAAW,OAAO,EAAE,QACrEF,EAAG,CACV,WAAK,QAAQ,EACPA,CAAA,EACR,CAGF,SAAgB,OACV,GAAA,KAAK,QAAU,YAInB,MAAK,MAAQ,YACN,OAAA,oBAAoB,UAAW,KAAK,aAAa,EAExD,SAAW,CAAG,CAAAX,CAAM,IAAK,KAAK,mBAAmB,SACxCA,EAAA,IAAI,MAAM,qBAAqB,CAAC,EAEzC,KAAK,mBAAmB,MAAM,GAE9BO,EAAA,KAAK,SAAL,MAAAA,EAAa,SACb,KAAK,OAAS,OAAA,CAGhB,MAAM,QAAQQ,EAAiD,CACtD,OAAA,KAAK,YAAY,CAAE,KAAM,UAAW,QAASA,GAAiB,KAAK,SAAS,OAAO,CAAA,CAK5F,MAAM,aAAaC,EAAgD,CAC1D,OAAA,KAAK,YAAY,CAAE,KAAM,iBAAkB,QAAAA,GAAW,KAAK,SAAS,YAAY,CAAA,CAGzF,MAAM,YAAYA,EAAyC,CAClD,OAAA,KAAK,YAAY,CAAE,KAAM,eAAgB,QAAAA,GAAW,KAAK,SAAS,WAAW,CAAA,CAGtF,MAAM,YAAYD,EAAuBE,EAA6C,CAC7E,OAAA,KAAK,YAAY,CAAE,KAAM,OAAQ,QAASF,EAAe,QAAAE,CAAQ,EAAG,KAAK,SAAS,IAAI,CAAA,CAG/F,MAAM,aAAaF,EAAuBG,EAAuF,CACxH,OAAA,KAAK,YAAY,CAAE,KAAM,YAAa,QAASH,EAAe,SAAAG,CAAS,EAAG,KAAK,SAAS,IAAI,CAAA,CAGrG,MAAM,eAAeH,EAAuBE,EAAiE,CAC3G,OAAO,KAAK,YAAY,CACtB,KAAM,kBACN,QAASF,EACT,KAAME,CAAA,EACL,KAAK,SAAS,cAAc,CAAA,CAGjC,MAAM,mBAAqD,CAClD,OAAA,KAAK,YAAY,CAAE,KAAM,mBAAqB,KAAK,SAAS,cAAc,CAAA,CAGnF,MAAM,WAAWF,EAAsC,CAC9C,OAAA,KAAK,YAAY,CAAE,KAAM,aAAc,QAASA,GAAiB,KAAK,SAAS,UAAU,CAAA,CAEpG,CC5Ma,MAAAI,EAAoBC,GACxBA,EAAG,WAAW,EAAE,EAGZC,EAAkBC,GACtBC,EAAAA,UAAY,EAAA,YAAYD,EAAY,EAAE,EAAE,QAAQ,EAG5CE,EAA2C,CACtD,UAAW,CAACC,EAAaC,IAAY,CACnCA,EAAQ,aAAaL,EAAeI,CAAG,EAAE,WAAW,CACtD,EACA,MAAQA,GACCN,EAAiBM,CAAG,CAE/B,ECEaE,EAAsC,muEAC7CC,EAAgC,EAEtB,SAAAC,EAA0CC,EAAgBC,EAAkBC,EAA2C,CAC/H,MAAAC,EAAOC,EAAAA,KAAK,QAAQF,CAAwB,EAE5CG,EAAOZ,EAAAA,UAAU,EACpB,UAAUK,EAA+B,CAAC,EAC1C,aAAaG,CAAO,EACpB,aAAaD,CAAK,EAClB,UAAU,IAAI,EACd,QAAQ,EAEX,OAAOM,EAAgB,gBAAA,EAAG,CAAC,KAAAH,EAAM,KAAAE,EAAK,CACxC,CAEO,MAAME,CAAY,CACvB,YAA6BC,EAAuCC,EAA4CP,EAA2BL,EAAqC,CAAnJ,KAAA,UAAAW,EAAuC,KAAA,OAAAC,EAA4C,KAAA,yBAAAP,CAAA,CAGhH,0CAA0CF,EAAyB,CAC1D,OAAAD,EAA0CC,EAAOU,EAAAA,QAAQ,MAAM,KAAK,OAAO,yBAAyB,EAAG,KAAK,wBAAwB,CAAA,CAG7I,MAAM,uBAAuBC,EAAyC,CAO7D,OANQ,MAAM,KAAK,UAAU,UAAUD,EAAAA,QAAQ,MAAM,KAAK,OAAO,yBAAyB,EAAG,2BAA4B,CAC9H,CACE,KAAM,MACN,MAAO,OAAO,KAAKA,UAAQ,MAAMC,CAAa,EAAE,KAAK,SAAS,KAAK,CAAC,EAAE,CAAA,CACxE,CACD,GACa,MAAM,YAAY,CAAA,CAGlC,MAAM,oBAAoBC,EAA6B,CAC/C,MAAA1B,EAAUwB,EAAAA,QAAQ,MAAME,CAAmB,EAC7C,GAAA,CAEF,MAAMC,GADS,MAAM,KAAK,UAAU,UAAU3B,EAAS,kBAAkB,GACpD,MAEf4B,EAAQD,EAAM,cAAc,EAC5BE,EAAoBF,EAAM,YAAY,EACtCG,EAAsBH,EAAM,YAAY,EAGxCI,EAAUJ,EAAM,YAAY,EAClC,IAAIrB,EAAuB,CAAC,EAExByB,IACFzB,EAAa0B,EAAAA,WAAW,WAAWA,EAAAA,WAAW,KAAK,QAAQ,GAAG,EAAGA,EAAAA,WAAW,OAAO,KAAQ,EAAAD,CAAO,EAAE,KAAK,GAGrG,MAAAE,EAAeN,EAAM,YAAY,EACjCO,EAAoBF,EAAAA,WAAW,WACnCA,aAAW,KAAK,KAAK,CAAC,EACtBxB,EACAmB,EAAM,SAAS,GACf,OAAO,EAEHQ,EAAQR,EAAM,WAAW,EAExB,MAAA,CACL,MAAAC,EACA,kBAAAC,EACA,oBAAAC,EACA,WAAAxB,EACA,aAAA2B,EACA,kBAAAC,EACA,MAAAC,CACF,QACOxC,EAAG,CACV,GAAKA,EAAY,QAAQ,SAAS,KAAK,EAC9B,OAAA,KAEH,MAAAA,CAAA,CACR,CAGF,2BAA2ByC,EAAmBC,EAAwB,CAC9D,MAAA/B,EAAuC0B,EAAAA,WAAW,MAAMA,EAAW,WAAA,KAAK,QAAQ,GAAG,EAAGA,EAAAA,WAAW,OAAO,KAAA,CAAM,EACpH1B,EAAW,IAAIgC,EAAeF,CAAS,EAAG7B,EAAU,UAAA,EAAE,SAAS,EAE/D,MAAMtB,EAAUsB,EAAA,UAAA,EACb,UAAU,WAAuC,EAAE,EACnD,UAAU,EAAG,EAAE,EACf,UAAUD,CAAU,EACpB,QAAQ,EAEJ,MAAA,CACL,QAAS,KAAK,OAAO,0BACrB,QAASrB,EAAQ,QAAQ,SAAS,QAAQ,EAC1C,OAAQoD,CACV,CAAA,CAGF,qBAAqBX,EAA6BU,EAAmB,CACnE,MAAMnD,EAAUsB,EAAA,UAAA,EACb,UAAU,UAAgD,EAAE,EAC5D,UAAU,EAAG,EAAE,EACf,YAAY6B,CAAS,EACrB,QAAQ,EAGJ,MAAA,CACL,QAASV,EACT,QAASzC,EAAQ,QAAQ,SAAS,QAAQ,EAC1C,OAAQsD,SAAO,MAAM,CACvB,CAAA,CAGF,wBAAwBb,EAA6BU,EAAmB,CACtE,MAAMnD,EAAUsB,EAAA,UAAA,EACb,UAAU,WAA+C,EAAE,EAC3D,UAAU,EAAG,EAAE,EACf,YAAY6B,CAAS,EACrB,QAAQ,EAGJ,MAAA,CACL,QAASV,EACT,QAASzC,EAAQ,QAAQ,SAAS,QAAQ,EAC1C,OAAQsD,SAAO,MAAM,CACvB,CAAA,CAGF,mCAAmCb,EAA6BU,EAAmB,CACjF,MAAMnD,EAAUsB,EAAA,UAAA,EACb,UAAU,WAAuD,EAAE,EACnE,UAAU,EAAG,EAAE,EACf,YAAY6B,CAAS,EACrB,QAAQ,EAEJ,MAAA,CACL,QAASV,EACT,QAASzC,EAAQ,QAAQ,SAAS,QAAQ,EAC1C,OAAQsD,SAAO,MAAM,CACvB,CAAA,CAEJ,CAEO,SAASD,EAAeE,EAAwB,CACrD,OAAO,OAAO,KAAOA,EAAO,SAAS,KAAK,CAAC,CAC7C,CCjKA,MAAMC,EAAkB,IAElBC,EAAiB,MACjBC,EAAY,MAEX,MAAMC,CAAgB,CAI3B,aAAc,CAHN/D,EAAA,cACAA,EAAA,kBAGN,KAAK,MAAQ,GACb,KAAK,UAAY,EAAA,CAGnB,OAAO,sBAAsBgE,EAAeC,EAAoC,CACxE,MAAAC,EAAI,IAAIH,EAEd,GADAG,EAAE,MAAQF,EACNE,EAAE,MAAQ,EAAS,MAAA,IAAI,MAAM,eAAe,EAChD,GAAIA,EAAE,MAAQJ,EAAiB,MAAA,IAAI,MAAM,eAAe,EAExD,GADAI,EAAE,UAAYD,EACVC,EAAE,UAAY,EAAS,MAAA,IAAI,MAAM,mBAAmB,EACxD,GAAIA,EAAE,UAAYL,EAAsB,MAAA,IAAI,MAAM,mBAAmB,EAC9D,OAAAK,CAAA,CAIT,SAAU,CACJ,IAAAC,EAAe,KAAK,UAAY,GAChCC,EAAW,KAAK,MAEpB,GAAIA,IAAaN,GAAaK,EAAgBN,EAAiB,GACvD,MAAA,IAAI,MAAM,UAAU,EAG5B,GAAIM,EAAeN,IACFM,EAAA,GACHC,GAAA,GACRA,EAAWN,GACP,MAAA,IAAI,MAAM,UAAU,EAIvB,OAAAC,EAAgB,sBAAsBK,EAAUD,CAAY,CAAA,CAGrE,SAAU,CAER,MAAO,EADO,KAAK,WAAcN,EAAiB,IAAO,KAAK,QAAUC,EAChE,CAGV,UAAmB,CACjB,OAAO,KAAK,KAAA,CAGd,cAAuB,CACrB,OAAO,KAAK,SAAA,CAGd,YAAqB,CACX,OAAA,KAAK,OAASF,GAAmB,KAAK,SAAA,CAGhD,OAAO,YAAYS,EAAkC,CACnD,MAAML,EAAQK,GAAWT,EACnBK,EAAYI,EAAU,MACrB,OAAA,KAAK,sBAAsBL,EAAOC,CAAS,CAAA,CAGpD,OAAO,UAAUK,EAA4B,CAC3C,MAAMN,EAAQM,EAAI,MACZL,EAAYK,EAAI,MACf,OAAA,KAAK,sBAAsBN,EAAOC,CAAS,CAAA,CAMpD,SAAkB,CACT,OAAA,KAAK,UAAY,KAAK,MAAQ,KAAA,CAEzC,CAEO,SAASI,GAAkB,CAChC,MAAME,EAAK,KAAK,MAAM,KAAK,IAAI,EAAI,GAAI,EAAI,GAEpC,OAAA,OAAOA,GAAM,GAAK,GAAG,CAC9B,CC3Ea,MAAAC,EAA8B,IAAI,MAAM,sCAAsC"}
|
|
1
|
+
{"version":3,"file":"wallet-core.umd.cjs","sources":["../src/adapters/iframe-adapter.ts","../src/utils/packers.ts","../src/wallet.ts","../src/utils/query-id.ts","../src/error.ts"],"sourcesContent":["import {\n ActiveSessionsResponse,\n AdapterState,\n ConnectResponse,\n CreateTransferRequest,\n CreateTransferResponse,\n EmptyResponse,\n GetPublicKeyResponse,\n IframeAdapterProps,\n SignRequest,\n SignResponse,\n Timeouts,\n} from '../types';\nimport { VERSION } from '../version';\n\ntype Waiter = [(value: any) => void, (e: Error) => void]\n\nconst LOG_PREFIX = `[embedded-wallet v${VERSION}]`;\n\nexport class IframeAdapter {\n private readonly host: string;\n private readonly timeouts: Required<Timeouts>;\n private readonly waitingForResponse = new Map<string, Waiter>();\n private iframe?: HTMLIFrameElement;\n private state: AdapterState = 'not-ready';\n private readonly i18nInit?: IframeAdapterProps['i18n'];\n\n constructor(props: IframeAdapterProps) {\n this.host = props.host;\n this.timeouts = {\n init: 1000,\n connect: 60000,\n disconnect: 1000,\n sign: 1000,\n createTransfer: 1000,\n activeSessions: 1000,\n getPublicKey: 1000,\n resetDevice: 1000,\n ...props.timeouts,\n };\n this.i18nInit = props.i18n;\n }\n\n private async sendMessage<R>(payload: unknown, timeout: number): Promise<R> {\n const messageId = Math.random().toString();\n const response = Promise.race([\n new Promise<R>((resolve, reject) => {\n this.waitingForResponse.set(messageId, [resolve, reject]);\n }),\n new Promise<R>((_, reject) => {\n setTimeout(() => {\n reject(new Error('Response timeout'));\n }, timeout);\n }),\n ]);\n this.iframe?.contentWindow?.postMessage({ id: messageId, payload }, this.host);\n return response;\n }\n\n private setupMessageListener() {\n window.addEventListener('message', this.handleMessage);\n }\n\n private handleMessage = (e: MessageEvent<unknown>) => {\n if (typeof e.data !== 'object' || e.data === null) {\n return;\n }\n if (!('id' in e.data) || !('status' in e.data)) {\n return;\n }\n if (typeof e.data.id !== 'string' || typeof e.data.status !== 'string') {\n return;\n }\n const waiter = this.waitingForResponse.get(e.data.id);\n if (!waiter) {\n return;\n }\n const [resolve, reject] = waiter;\n this.waitingForResponse.delete(e.data.id);\n if (e.data.status === 'success') {\n if ('payload' in e.data) {\n resolve(e.data.payload);\n } else {\n resolve(undefined);\n }\n } else {\n if ('error' in e.data) {\n reject(new Error(e.data.error as string));\n } else {\n reject(new Error('Unknown error'));\n }\n }\n\n };\n\n private async attachIframe(root: HTMLElement): Promise<void> {\n const iframe = document.createElement('iframe');\n iframe.src = this.host;\n iframe.frameBorder = '0';\n iframe.width = '100%';\n iframe.height = '100%';\n\n const loadPromise = new Promise<void>((resolve, reject) => {\n iframe.addEventListener('load', () => resolve(), { once: true });\n iframe.addEventListener('error', (e) => reject(e), { once: true });\n });\n\n const timeoutPromise = new Promise<never>((_, reject) => {\n setTimeout(() => reject(new Error('Iframe load timeout')), this.timeouts.init);\n });\n\n root.appendChild(iframe);\n this.iframe = iframe;\n return Promise.race([loadPromise, timeoutPromise]);\n }\n\n async init(root: HTMLElement): Promise<void> {\n if (this.state !== 'not-ready') {\n return;\n }\n\n this.state = 'initializing';\n\n try {\n console.log(LOG_PREFIX, 'attaching to root', root);\n const attachStart = performance.now();\n await this.attachIframe(root);\n console.log(LOG_PREFIX, `iframe attached in ${Math.round(performance.now() - attachStart)}ms`);\n this.setupMessageListener();\n console.log(LOG_PREFIX, 'sending ping');\n\n let lastError: Error | undefined;\n for (let attempt = 1; attempt <= 5; attempt++) {\n try {\n await this.sendMessage({ type: 'ping', i18n: this.i18nInit }, this.timeouts.init);\n console.log(LOG_PREFIX, 'pong received');\n this.state = 'ready';\n return;\n } catch (e) {\n lastError = e instanceof Error ? e : new Error(String(e));\n console.warn(LOG_PREFIX, `ping attempt ${attempt}/5 failed:`, lastError.message);\n if (attempt < 5) {\n await new Promise(resolve => setTimeout(resolve, 200));\n }\n }\n }\n\n throw new Error(`${LOG_PREFIX} ping retries exceeded: ${lastError?.message}`);\n } catch (e) {\n this.destroy();\n throw e;\n }\n }\n\n destroy(): void {\n if (this.state === 'not-ready') {\n return;\n }\n\n this.state = 'not-ready';\n window.removeEventListener('message', this.handleMessage);\n\n for (const [, reject] of this.waitingForResponse.values()) {\n reject(new Error('Iframe disconnected'));\n }\n this.waitingForResponse.clear();\n\n this.iframe?.remove();\n this.iframe = undefined;\n }\n\n async connect(masterAddress: string): Promise<ConnectResponse> {\n return this.sendMessage({ type: 'connect', address: masterAddress }, this.timeouts.connect);\n }\n\n\n\n async getPublicKey(address: string): Promise<GetPublicKeyResponse> {\n return this.sendMessage({ type: \"get-public-key\", address }, this.timeouts.getPublicKey);\n }\n\n async resetDevice(address: string): Promise<EmptyResponse> {\n return this.sendMessage({ type: \"reset-device\", address }, this.timeouts.resetDevice);\n }\n\n async signMessage(masterAddress: string, message: SignRequest): Promise<SignResponse> {\n return this.sendMessage({ type: 'sign', address: masterAddress, message }, this.timeouts.sign);\n }\n\n async signMessages(masterAddress: string, messages: SignRequest[]): Promise<{ hashes: Uint8Array[]; signatures: Uint8Array[]; }> {\n return this.sendMessage({ type: 'sign-many', address: masterAddress, messages }, this.timeouts.sign);\n }\n\n async createTransfer(masterAddress: string, message: CreateTransferRequest): Promise<CreateTransferResponse> {\n return this.sendMessage({\n type: 'create-transfer',\n address: masterAddress,\n data: message,\n }, this.timeouts.createTransfer);\n }\n\n async getActiveSessions(): Promise<ActiveSessionsResponse> {\n return this.sendMessage({ type: 'active-sessions' }, this.timeouts.activeSessions);\n }\n\n async disconnect(masterAddress: string): Promise<void> {\n return this.sendMessage({ type: 'disconnect', address: masterAddress }, this.timeouts.disconnect);\n }\n}\n","import { beginCell, Cell, DictionaryValue, Slice } from \"@ton/ton\";\n\nexport const unpackPublicKeys = (cs: Slice): Buffer => {\n return cs.loadBuffer(32);\n}\n\nexport const packPublicKeys = (publicKeys: Buffer): Cell => {\n return beginCell().storeBuffer(publicKeys, 32).endCell();\n}\n\nexport const PublicKeysValue: DictionaryValue<Buffer> = {\n serialize: (src: Buffer, builder) => {\n builder.storeBuilder(packPublicKeys(src).asBuilder());\n },\n parse: (src) => {\n return unpackPublicKeys(src);\n },\n};\n","import { Address, beginCell, Cell, contractAddress, Dictionary, toNano, TonClient } from \"@ton/ton\";\nimport { PublicKeysValue } from \"./utils/packers\";\n\ntype StormWalletConfig = {\n smartAccountMasterAddress: string;\n}\n\nexport enum SmartAccountInternalOp {\n deploy_account = 0x764019e5,\n add_new_user_public_key = 0x220c4c19,\n remove_user_public_key = 0x7427ce1f,\n execute_limit_order = 0x1c0af2cb,\n execute_orders_bundle = 0xf38e7e65,\n set_code = 0x9c0f3220,\n add_request_to_add_new_user_public_key = 0x03cc29e8,\n add_request_to_remove_user_public_key = 0x07d25def,\n remove_all_keys_except_current = 0x5f9d0940\n}\n\nexport const DEFAULT_ORDINARY_SMART_ACCOUNT_CODE = \"b5ee9c7241021401000460000114ff00f4a413f4bcf2c80b01020162021004bcd020c700915be001d0d3030171b0915be0fa4030ed44d0d30701f861fa4001f862fa4001f863f40430f86401d31f218210186b2edfba8e843101db3ce02182104fedc82bba8e843101db3ce02182105b0dd9f4bae30201821018a092f7ba03060b0c02f401d33ffa00fa40fa40d152408d086000d3cb310c6345907411bee7fd03c8688ae26a620314eb93f4bba111e4cb869b4cc801cf1601cf16c9880120f90022f90002d76503d76582020134c8cb17cb0f13cb0fcbffcbff71f90400c88b1801cf16cbffc9d001c705f2e19182105b27f9c5c8cb1f13cb3f01fa02010704011acf16f843cf16c970598040db3c05002c718010c8cb055004cf165004fa0212cb6accc901fb0002da01d33ffa40fa00fa40d430d052528d086000d3cb310c6345907411bee7fd03c8688ae26a620314eb93f4bba111e4cb869b4cc801cf1601cf16c9880120f90022f90002d76503d76582020134c8cb17cb0f13cb0fcbffcbff71f90400c88b1801cf16cbffc9d001c705f2e19104070a0114ff00f4a413f4bcf2c80b080196d36c2220c700f24001d0d3030171b0f240fa403001d31f01821029c102d1ba8ea4ed44d0fa403012c705f2e29afa40d4d43001fb04ed54820898968070fb0270018306db3ce05b840ff2f0090028708010c8cb055003cf165003fa02cb6ac901fb0002b0f844521081010bf40a6fa1c8019a01fa00305003a012fa02943158fa02e2f8441281010bf441f86422d70b01c0008e85328042db3c8e8c300181010bd719018042db3ce2f844f841c8cb07f842cf16f843cf16f400c9ed540f0f01d2310101d33ff8425230c705f2e1915801d317d4d307d4d1fb046d6d58f823500503c8f40012f400cb3fcb17c970f843f844102655226d0107c8cb075006cf165004cf1612f400cb07ccf400ccc9ed548102e58203dbea8209e1338070f83774fb02f84301810082db3c0f01168e8301db3ce05b840ff2f00d017af8425210c705f2e19101d33ffa40fa00fa405023f844521081010bf40a6fa1c8019a01fa00305003a012fa02943158fa02e2f8441281010bf441f864030e01ae01d317d4d307d4d1fb046d6d58f823500503c8f40012f400cb3fcb17c970f843f844102655226d0107c8cb075006cf165004cf1612f400cb07ccf400ccc9ed548102e58203dbea8209e1338070f83774fb02810082db3c0f003e8210d53276db708010c8cb055005cf1624fa0214cb6a13cb1fcb3fc901fb0002012011120043bc82ff6a268698380fc30fd2000fc317d2000fc31fa02187c327c20fc217c21fc224014fbc7e7f6a268698380fc30fd2000fc317d2000fc31fa02187c327c147d2218e445997981d4678b10c1300f620c0008e1830c8709320c14097803058cb0701a4e801c9d001aa02d7198e4770800fc89322c1408e1a5331b020c20995a63701cb0795a63001cb07e203ab0302a44013e86c21c832c9d080409320c2009da520aa02522078d72413cf1602e85bc9d08308d719e2cf168b52e6a736f6e8cf16c970f842f843410403d563745f\"\nconst ORDINARY_SMART_ACCOUNT_HEADER = 0;\n\nexport function calculateSmartAccountAddressFromStateInit(owner: Address, factory: Address, ordinarySmartAccountCode: string): Address {\n const code = Cell.fromHex(ordinarySmartAccountCode);\n\n const data = beginCell()\n .storeUint(ORDINARY_SMART_ACCOUNT_HEADER, 8)\n .storeAddress(factory)\n .storeAddress(owner)\n .storeDict(null)\n .endCell()\n\n return contractAddress(0, {code, data});\n}\n\nexport class StormWallet {\n constructor(private readonly tonClient: TonClient, private readonly config: StormWalletConfig, private readonly ordinarySmartAccountCode = DEFAULT_ORDINARY_SMART_ACCOUNT_CODE) {\n }\n\n calculateSmartAccountAddressFromStateInit(owner: Address): Address {\n return calculateSmartAccountAddressFromStateInit(owner, Address.parse(this.config.smartAccountMasterAddress), this.ordinarySmartAccountCode);\n }\n\n async getSmartAccountAddress(walletAddress: string): Promise<Address> {\n const result = await this.tonClient.runMethod(Address.parse(this.config.smartAccountMasterAddress), 'get_nft_address_by_index', [\n {\n type: 'int',\n value: BigInt(`0x${Address.parse(walletAddress).hash.toString('hex')}`)\n }\n ])\n return result.stack.readAddress()\n }\n\n async getSmartAccountData(smartAccountAddress: string) {\n const address = Address.parse(smartAccountAddress)\n try {\n const result = await this.tonClient.runMethod(address, 'get_storage_data')\n const stack = result.stack\n\n const index = stack.readBigNumber();\n const collectionAddress = stack.readAddress();\n const masterWalletAddress = stack.readAddress();\n\n\n const pksCell = stack.readCellOpt()\n let publicKeys: bigint[] = []\n\n if (pksCell) {\n publicKeys = Dictionary.loadDirect(Dictionary.Keys.BigUint(256), Dictionary.Values.Cell(), pksCell).keys();\n }\n\n const adminAddress = stack.readAddress();\n const backendPublicKeys = Dictionary.loadDirect(\n Dictionary.Keys.Uint(8),\n PublicKeysValue,\n stack.readCell()\n ).values();\n\n const seqno = stack.readNumber();\n\n return {\n index,\n collectionAddress,\n masterWalletAddress,\n publicKeys,\n adminAddress,\n backendPublicKeys,\n seqno,\n }\n } catch (e) {\n if ((e as Error).message.endsWith('-13')) {\n return null\n }\n throw e\n }\n }\n\n createDeploySmartAccountTx(publicKey: Buffer, transferAmount: bigint) {\n const publicKeys: Dictionary<bigint, Cell> = Dictionary.empty(Dictionary.Keys.BigUint(256), Dictionary.Values.Cell());\n publicKeys.set(bufferToBigInt(publicKey), beginCell().endCell());\n\n const payload = beginCell()\n .storeUint(SmartAccountInternalOp.deploy_account, 32)\n .storeUint(0, 64)\n .storeDict(publicKeys)\n .endCell();\n\n return {\n address: this.config.smartAccountMasterAddress,\n payload: payload.toBoc().toString('base64'),\n amount: transferAmount,\n }\n }\n\n createAddPublicKeyTx(smartAccountAddress: string, publicKey: Buffer) {\n const payload = beginCell()\n .storeUint(SmartAccountInternalOp.add_new_user_public_key, 32)\n .storeUint(0, 64)\n .storeBuffer(publicKey)\n .endCell();\n\n\n return {\n address: smartAccountAddress,\n payload: payload.toBoc().toString('base64'),\n amount: toNano('0.05')\n }\n }\n\n createRemovePublicKeyTx(smartAccountAddress: string, publicKey: Buffer) {\n const payload = beginCell()\n .storeUint(SmartAccountInternalOp.remove_user_public_key, 32)\n .storeUint(0, 64)\n .storeBuffer(publicKey)\n .endCell();\n\n\n return {\n address: smartAccountAddress,\n payload: payload.toBoc().toString('base64'),\n amount: toNano('0.05')\n }\n }\n\n createRemoveAllKeysExceptCurrentTx(smartAccountAddress: string, publicKey: Buffer) {\n const payload = beginCell()\n .storeUint(SmartAccountInternalOp.remove_all_keys_except_current, 32)\n .storeUint(0, 64)\n .storeBuffer(publicKey)\n .endCell();\n\n return {\n address: smartAccountAddress,\n payload: payload.toBoc().toString('base64'),\n amount: toNano('0.05'), // при необходимости настрой сумму\n }\n }\n}\n\nexport function bufferToBigInt(buffer: Buffer): bigint {\n return BigInt('0x' + buffer.toString('hex'));\n}\n","const BIT_NUMBER_SIZE = 10n; // 10 bit\n// const SHIFT_SIZE = 13n; // 13 bit\nconst MAX_BIT_NUMBER = 1022n;\nconst MAX_SHIFT = 8191n; // 2^13 = 8192\n\nexport class HighloadQueryId {\n private shift: bigint; // [0 .. 8191]\n private bitnumber: bigint; // [0 .. 1022]\n\n constructor() {\n this.shift = 0n;\n this.bitnumber = 0n;\n }\n\n static fromShiftAndBitNumber(shift: bigint, bitnumber: bigint): HighloadQueryId {\n const q = new HighloadQueryId();\n q.shift = shift;\n if (q.shift < 0) throw new Error('invalid shift');\n if (q.shift > MAX_SHIFT) throw new Error('invalid shift');\n q.bitnumber = bitnumber;\n if (q.bitnumber < 0) throw new Error('invalid bitnumber');\n if (q.bitnumber > MAX_BIT_NUMBER) throw new Error('invalid bitnumber');\n return q;\n }\n\n\n getNext() {\n let newBitnumber = this.bitnumber + 1n;\n let newShift = this.shift;\n\n if (newShift === MAX_SHIFT && newBitnumber > (MAX_BIT_NUMBER - 1n)) {\n throw new Error('Overload'); // NOTE: we left one queryId for emergency withdraw\n }\n\n if (newBitnumber > MAX_BIT_NUMBER) {\n newBitnumber = 0n;\n newShift += 1n;\n if (newShift > MAX_SHIFT) {\n throw new Error('Overload')\n }\n }\n\n return HighloadQueryId.fromShiftAndBitNumber(newShift, newBitnumber);\n }\n\n hasNext() {\n const isEnd = this.bitnumber >= (MAX_BIT_NUMBER - 1n) && this.shift === MAX_SHIFT; // NOTE: we left one queryId for emergency withdraw;\n return !isEnd;\n }\n\n getShift(): bigint {\n return this.shift;\n }\n\n getBitNumber(): bigint {\n return this.bitnumber;\n }\n\n getQueryId(): bigint {\n return (this.shift << BIT_NUMBER_SIZE) + this.bitnumber;\n }\n\n static fromQueryId(queryId: bigint): HighloadQueryId {\n const shift = queryId >> BIT_NUMBER_SIZE;\n const bitnumber = queryId & 1023n;\n return this.fromShiftAndBitNumber(shift, bitnumber);\n }\n\n static fromSeqno(i: bigint): HighloadQueryId {\n const shift = i / 1023n;\n const bitnumber = i % 1023n;\n return this.fromShiftAndBitNumber(shift, bitnumber);\n }\n\n /**\n * @return {bigint} [0 .. 8380415]\n */\n toSeqno(): bigint {\n return this.bitnumber + this.shift * 1023n;\n }\n}\n\nexport function queryId(): bigint {\n const ts = Math.floor(Date.now() / 1000) - 30;\n\n return BigInt(ts % (1 << 23))\n}","export class NoActiveSessionError extends Error {\n public readonly address: string;\n\n constructor(address: string) {\n super(`No active session found for ${address}`);\n this.name = 'NoActiveSessionError';\n this.address = address;\n }\n}\n\n\nexport const SessionExpiredOrNotProvided = new Error('Session is expired or never provided')"],"names":["LOG_PREFIX","IframeAdapter","props","__publicField","waiter","resolve","reject","payload","timeout","messageId","response","_","_b","_a","root","iframe","loadPromise","e","timeoutPromise","attachStart","lastError","attempt","masterAddress","address","message","messages","unpackPublicKeys","cs","packPublicKeys","publicKeys","beginCell","PublicKeysValue","src","builder","DEFAULT_ORDINARY_SMART_ACCOUNT_CODE","ORDINARY_SMART_ACCOUNT_HEADER","calculateSmartAccountAddressFromStateInit","owner","factory","ordinarySmartAccountCode","code","Cell","data","contractAddress","StormWallet","tonClient","config","Address","walletAddress","smartAccountAddress","stack","index","collectionAddress","masterWalletAddress","pksCell","Dictionary","adminAddress","backendPublicKeys","seqno","publicKey","transferAmount","bufferToBigInt","toNano","buffer","BIT_NUMBER_SIZE","MAX_BIT_NUMBER","MAX_SHIFT","HighloadQueryId","shift","bitnumber","q","newBitnumber","newShift","queryId","i","ts","SessionExpiredOrNotProvided"],"mappings":"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"}
|