@storm-trade/wallet-core 1.0.14 → 1.0.16
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.d.ts +30 -1
- package/dist/wallet-core.js +109 -48
- package/dist/wallet-core.js.map +1 -1
- package/dist/wallet-core.umd.cjs +1 -1
- package/dist/wallet-core.umd.cjs.map +1 -1
- package/package.json +1 -1
package/dist/wallet-core.d.ts
CHANGED
|
@@ -12,6 +12,7 @@ export declare type ConnectResponse = {
|
|
|
12
12
|
export declare type CreateTransferRequest = {
|
|
13
13
|
validUntil: number;
|
|
14
14
|
queryId?: number;
|
|
15
|
+
referenceQueryId?: number;
|
|
15
16
|
payload: string;
|
|
16
17
|
};
|
|
17
18
|
|
|
@@ -21,6 +22,30 @@ export declare type CreateTransferResponse = {
|
|
|
21
22
|
signature: Uint8Array;
|
|
22
23
|
};
|
|
23
24
|
|
|
25
|
+
declare type EmptyResponse = {};
|
|
26
|
+
|
|
27
|
+
declare type GetPublicKeyResponse = {
|
|
28
|
+
publicKey: Uint8Array | null;
|
|
29
|
+
};
|
|
30
|
+
|
|
31
|
+
export declare class HighloadQueryId {
|
|
32
|
+
private shift;
|
|
33
|
+
private bitnumber;
|
|
34
|
+
constructor();
|
|
35
|
+
static fromShiftAndBitNumber(shift: bigint, bitnumber: bigint): HighloadQueryId;
|
|
36
|
+
getNext(): HighloadQueryId;
|
|
37
|
+
hasNext(): boolean;
|
|
38
|
+
getShift(): bigint;
|
|
39
|
+
getBitNumber(): bigint;
|
|
40
|
+
getQueryId(): bigint;
|
|
41
|
+
static fromQueryId(queryId: bigint): HighloadQueryId;
|
|
42
|
+
static fromSeqno(i: bigint): HighloadQueryId;
|
|
43
|
+
/**
|
|
44
|
+
* @return {bigint} [0 .. 8380415]
|
|
45
|
+
*/
|
|
46
|
+
toSeqno(): bigint;
|
|
47
|
+
}
|
|
48
|
+
|
|
24
49
|
export declare class IframeAdapter {
|
|
25
50
|
private readonly host;
|
|
26
51
|
private readonly timeouts;
|
|
@@ -36,6 +61,8 @@ export declare class IframeAdapter {
|
|
|
36
61
|
destroy(): void;
|
|
37
62
|
connect(masterAddress: string): Promise<ConnectResponse>;
|
|
38
63
|
senEnterPinStep(step: string): Promise<ConnectResponse>;
|
|
64
|
+
getPublicKey(address: string): Promise<GetPublicKeyResponse>;
|
|
65
|
+
resetDevice(address: string): Promise<EmptyResponse>;
|
|
39
66
|
signMessage(masterAddress: string, message: SignRequest): Promise<SignResponse>;
|
|
40
67
|
createTransfer(masterAddress: string, message: CreateTransferRequest): Promise<CreateTransferResponse>;
|
|
41
68
|
getActiveSessions(): Promise<ActiveSessionsResponse>;
|
|
@@ -47,7 +74,7 @@ export declare type IframeAdapterProps = {
|
|
|
47
74
|
timeouts?: Timeouts;
|
|
48
75
|
};
|
|
49
76
|
|
|
50
|
-
export declare type PingResponse =
|
|
77
|
+
export declare type PingResponse = EmptyResponse;
|
|
51
78
|
|
|
52
79
|
export declare type SignRequest = {
|
|
53
80
|
body: Uint8Array;
|
|
@@ -101,6 +128,8 @@ declare type Timeouts = {
|
|
|
101
128
|
createTransfer?: number;
|
|
102
129
|
disconnect?: number;
|
|
103
130
|
setEnterPinStep?: number;
|
|
131
|
+
getPublicKey?: number;
|
|
132
|
+
resetDevice?: number;
|
|
104
133
|
};
|
|
105
134
|
|
|
106
135
|
export { }
|
package/dist/wallet-core.js
CHANGED
|
@@ -1,15 +1,15 @@
|
|
|
1
|
-
var
|
|
2
|
-
var
|
|
3
|
-
var
|
|
4
|
-
import { beginCell as
|
|
5
|
-
class
|
|
1
|
+
var B = Object.defineProperty;
|
|
2
|
+
var S = (r, e, t) => e in r ? B(r, e, { enumerable: !0, configurable: !0, writable: !0, value: t }) : r[e] = t;
|
|
3
|
+
var i = (r, e, t) => S(r, typeof e != "symbol" ? e + "" : e, t);
|
|
4
|
+
import { beginCell as h, Address as f, Dictionary as a, toNano as b } from "@ton/ton";
|
|
5
|
+
class I {
|
|
6
6
|
constructor(e) {
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
7
|
+
i(this, "host");
|
|
8
|
+
i(this, "timeouts");
|
|
9
|
+
i(this, "waitingForResponse", /* @__PURE__ */ new Map());
|
|
10
|
+
i(this, "iframe");
|
|
11
|
+
i(this, "state", "not-ready");
|
|
12
|
+
i(this, "handleMessage", (e) => {
|
|
13
13
|
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")
|
|
14
14
|
return;
|
|
15
15
|
const t = this.waitingForResponse.get(e.data.id);
|
|
@@ -26,22 +26,24 @@ class E {
|
|
|
26
26
|
createTransfer: 1e3,
|
|
27
27
|
activeSessions: 1e3,
|
|
28
28
|
setEnterPinStep: 1e3,
|
|
29
|
+
getPublicKey: 1e3,
|
|
30
|
+
resetDevice: 1e3,
|
|
29
31
|
...e.timeouts
|
|
30
32
|
};
|
|
31
33
|
}
|
|
32
34
|
async sendMessage(e, t) {
|
|
33
|
-
var
|
|
35
|
+
var o, d;
|
|
34
36
|
const s = Math.random().toString(), n = Promise.race([
|
|
35
|
-
new Promise((c,
|
|
36
|
-
this.waitingForResponse.set(s, [c,
|
|
37
|
+
new Promise((c, u) => {
|
|
38
|
+
this.waitingForResponse.set(s, [c, u]);
|
|
37
39
|
}),
|
|
38
|
-
new Promise((c,
|
|
40
|
+
new Promise((c, u) => {
|
|
39
41
|
setTimeout(() => {
|
|
40
|
-
|
|
42
|
+
u(new Error("Response timeout"));
|
|
41
43
|
}, t);
|
|
42
44
|
})
|
|
43
45
|
]);
|
|
44
|
-
return (
|
|
46
|
+
return (d = (o = this.iframe) == null ? void 0 : o.contentWindow) == null || d.postMessage({ id: s, payload: e }, this.host), n;
|
|
45
47
|
}
|
|
46
48
|
setupMessageListener() {
|
|
47
49
|
window.addEventListener("message", this.handleMessage);
|
|
@@ -49,10 +51,10 @@ class E {
|
|
|
49
51
|
async attachIframe(e) {
|
|
50
52
|
this.iframe = document.createElement("iframe"), this.iframe.src = this.host, this.iframe.frameBorder = "0", this.iframe.width = "100%", this.iframe.height = "100%";
|
|
51
53
|
const t = new Promise((s, n) => {
|
|
52
|
-
var
|
|
53
|
-
(
|
|
54
|
+
var o, d;
|
|
55
|
+
(o = this.iframe) == null || o.addEventListener("load", async () => {
|
|
54
56
|
s();
|
|
55
|
-
}, { once: !0 }), (
|
|
57
|
+
}, { once: !0 }), (d = this.iframe) == null || d.addEventListener("error", (c) => {
|
|
56
58
|
n(c);
|
|
57
59
|
}, { once: !0 });
|
|
58
60
|
});
|
|
@@ -87,6 +89,12 @@ class E {
|
|
|
87
89
|
async senEnterPinStep(e) {
|
|
88
90
|
return this.sendMessage({ type: "set-create-pin-step", step: e }, this.timeouts.setEnterPinStep);
|
|
89
91
|
}
|
|
92
|
+
async getPublicKey(e) {
|
|
93
|
+
return this.sendMessage({ type: "get-public-key", address: e }, this.timeouts.getPublicKey);
|
|
94
|
+
}
|
|
95
|
+
async resetDevice(e) {
|
|
96
|
+
return this.sendMessage({ type: "reset-device", address: e }, this.timeouts.resetDevice);
|
|
97
|
+
}
|
|
90
98
|
async signMessage(e, t) {
|
|
91
99
|
return this.sendMessage({ type: "sign", address: e, message: t }, this.timeouts.sign);
|
|
92
100
|
}
|
|
@@ -104,43 +112,43 @@ class E {
|
|
|
104
112
|
return this.sendMessage({ type: "disconnect", address: e }, this.timeouts.disconnect);
|
|
105
113
|
}
|
|
106
114
|
}
|
|
107
|
-
const
|
|
115
|
+
const A = (r) => r.loadBuffer(32), E = (r) => h().storeBuffer(r, 32).endCell(), C = {
|
|
108
116
|
serialize: (r, e) => {
|
|
109
|
-
e.storeBuilder(
|
|
117
|
+
e.storeBuilder(E(r).asBuilder());
|
|
110
118
|
},
|
|
111
|
-
parse: (r) =>
|
|
119
|
+
parse: (r) => A(r)
|
|
112
120
|
};
|
|
113
|
-
class
|
|
121
|
+
class N {
|
|
114
122
|
constructor(e, t) {
|
|
115
123
|
this.tonClient = e, this.config = t;
|
|
116
124
|
}
|
|
117
125
|
async getSmartAccountAddress(e) {
|
|
118
|
-
return (await this.tonClient.runMethod(
|
|
126
|
+
return (await this.tonClient.runMethod(f.parse(this.config.smartAccountMasterAddress), "get_nft_address_by_index", [
|
|
119
127
|
{
|
|
120
128
|
type: "int",
|
|
121
|
-
value: BigInt(`0x${
|
|
129
|
+
value: BigInt(`0x${f.parse(e).hash.toString("hex")}`)
|
|
122
130
|
}
|
|
123
131
|
])).stack.readAddress();
|
|
124
132
|
}
|
|
125
133
|
async getSmartAccountData(e) {
|
|
126
|
-
const t =
|
|
134
|
+
const t = f.parse(e);
|
|
127
135
|
try {
|
|
128
|
-
const n = (await this.tonClient.runMethod(t, "get_storage_data")).stack,
|
|
129
|
-
let
|
|
130
|
-
|
|
131
|
-
const
|
|
136
|
+
const n = (await this.tonClient.runMethod(t, "get_storage_data")).stack, o = n.readBigNumber(), d = n.readAddress(), c = n.readAddress(), u = n.readCellOpt();
|
|
137
|
+
let y = [];
|
|
138
|
+
u && (y = a.loadDirect(a.Keys.BigUint(256), a.Values.Cell(), u).keys());
|
|
139
|
+
const w = n.readAddress(), v = a.loadDirect(
|
|
132
140
|
a.Keys.Uint(8),
|
|
133
|
-
|
|
141
|
+
C,
|
|
134
142
|
n.readCell()
|
|
135
|
-
).values(),
|
|
143
|
+
).values(), M = n.readNumber();
|
|
136
144
|
return {
|
|
137
|
-
index:
|
|
138
|
-
collectionAddress:
|
|
145
|
+
index: o,
|
|
146
|
+
collectionAddress: d,
|
|
139
147
|
masterWalletAddress: c,
|
|
140
|
-
publicKeys:
|
|
141
|
-
adminAddress:
|
|
142
|
-
backendPublicKeys:
|
|
143
|
-
seqno:
|
|
148
|
+
publicKeys: y,
|
|
149
|
+
adminAddress: w,
|
|
150
|
+
backendPublicKeys: v,
|
|
151
|
+
seqno: M
|
|
144
152
|
};
|
|
145
153
|
} catch (s) {
|
|
146
154
|
if (s.message.endsWith("-13"))
|
|
@@ -150,8 +158,8 @@ class P {
|
|
|
150
158
|
}
|
|
151
159
|
createDeploySmartAccountTx(e, t) {
|
|
152
160
|
const s = a.empty(a.Keys.BigUint(256), a.Values.Cell());
|
|
153
|
-
s.set(
|
|
154
|
-
const n =
|
|
161
|
+
s.set(P(e), h().endCell());
|
|
162
|
+
const n = h().storeUint(2343844519, 32).storeUint(0, 64).storeDict(s).endCell();
|
|
155
163
|
return {
|
|
156
164
|
address: this.config.smartAccountMasterAddress,
|
|
157
165
|
payload: n.toBoc().toString("base64"),
|
|
@@ -159,27 +167,80 @@ class P {
|
|
|
159
167
|
};
|
|
160
168
|
}
|
|
161
169
|
createAddPublicKeyTx(e, t) {
|
|
162
|
-
const s =
|
|
170
|
+
const s = h().storeUint(1154405564, 32).storeUint(0, 64).storeBuffer(t).endCell();
|
|
163
171
|
return {
|
|
164
172
|
address: e,
|
|
165
173
|
payload: s.toBoc().toString("base64"),
|
|
166
|
-
amount:
|
|
174
|
+
amount: b("0.05")
|
|
167
175
|
};
|
|
168
176
|
}
|
|
169
177
|
createRemovePublicKeyTx(e, t) {
|
|
170
|
-
const s =
|
|
178
|
+
const s = h().storeUint(3568675950, 32).storeUint(0, 64).storeBuffer(t).endCell();
|
|
171
179
|
return {
|
|
172
180
|
address: e,
|
|
173
181
|
payload: s.toBoc().toString("base64"),
|
|
174
|
-
amount:
|
|
182
|
+
amount: b("0.05")
|
|
175
183
|
};
|
|
176
184
|
}
|
|
177
185
|
}
|
|
178
|
-
function
|
|
186
|
+
function P(r) {
|
|
179
187
|
return BigInt("0x" + r.toString("hex"));
|
|
180
188
|
}
|
|
189
|
+
const p = 10n, l = 1022n, m = 8191n;
|
|
190
|
+
class g {
|
|
191
|
+
// [0 .. 1022]
|
|
192
|
+
constructor() {
|
|
193
|
+
i(this, "shift");
|
|
194
|
+
// [0 .. 8191]
|
|
195
|
+
i(this, "bitnumber");
|
|
196
|
+
this.shift = 0n, this.bitnumber = 0n;
|
|
197
|
+
}
|
|
198
|
+
static fromShiftAndBitNumber(e, t) {
|
|
199
|
+
const s = new g();
|
|
200
|
+
if (s.shift = e, s.shift < 0) throw new Error("invalid shift");
|
|
201
|
+
if (s.shift > m) throw new Error("invalid shift");
|
|
202
|
+
if (s.bitnumber = t, s.bitnumber < 0) throw new Error("invalid bitnumber");
|
|
203
|
+
if (s.bitnumber > l) throw new Error("invalid bitnumber");
|
|
204
|
+
return s;
|
|
205
|
+
}
|
|
206
|
+
getNext() {
|
|
207
|
+
let e = this.bitnumber + 1n, t = this.shift;
|
|
208
|
+
if (t === m && e > l - 1n)
|
|
209
|
+
throw new Error("Overload");
|
|
210
|
+
if (e > l && (e = 0n, t += 1n, t > m))
|
|
211
|
+
throw new Error("Overload");
|
|
212
|
+
return g.fromShiftAndBitNumber(t, e);
|
|
213
|
+
}
|
|
214
|
+
hasNext() {
|
|
215
|
+
return !(this.bitnumber >= l - 1n && this.shift === m);
|
|
216
|
+
}
|
|
217
|
+
getShift() {
|
|
218
|
+
return this.shift;
|
|
219
|
+
}
|
|
220
|
+
getBitNumber() {
|
|
221
|
+
return this.bitnumber;
|
|
222
|
+
}
|
|
223
|
+
getQueryId() {
|
|
224
|
+
return (this.shift << p) + this.bitnumber;
|
|
225
|
+
}
|
|
226
|
+
static fromQueryId(e) {
|
|
227
|
+
const t = e >> p, s = e & 1023n;
|
|
228
|
+
return this.fromShiftAndBitNumber(t, s);
|
|
229
|
+
}
|
|
230
|
+
static fromSeqno(e) {
|
|
231
|
+
const t = e / 1023n, s = e % 1023n;
|
|
232
|
+
return this.fromShiftAndBitNumber(t, s);
|
|
233
|
+
}
|
|
234
|
+
/**
|
|
235
|
+
* @return {bigint} [0 .. 8380415]
|
|
236
|
+
*/
|
|
237
|
+
toSeqno() {
|
|
238
|
+
return this.bitnumber + this.shift * 1023n;
|
|
239
|
+
}
|
|
240
|
+
}
|
|
181
241
|
export {
|
|
182
|
-
|
|
183
|
-
|
|
242
|
+
g as HighloadQueryId,
|
|
243
|
+
I as IframeAdapter,
|
|
244
|
+
N as StormWallet
|
|
184
245
|
};
|
|
185
246
|
//# 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"],"sourcesContent":["import {\n ActiveSessionsResponse,\n AdapterState,\n ConnectResponse,\n CreateTransferRequest,\n CreateTransferResponse,\n IframeAdapterProps,\n SignRequest,\n SignResponse,\n Timeouts,\n} from '../types';\n\ntype Waiter = [(value: any) => void, (e: Error) => void]\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\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 setEnterPinStep: 1000,\n ...props.timeouts,\n };\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 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 this.iframe = document.createElement('iframe');\n this.iframe.src = this.host;\n this.iframe.frameBorder = '0';\n this.iframe.width='100%'\n this.iframe.height='100%'\n const p = new Promise<void>((resolve, reject) => {\n this.iframe?.addEventListener('load', async () => {\n resolve();\n }, { once: true });\n this.iframe?.addEventListener('error', (e) => {\n reject(e);\n }, { once: true });\n });\n root.appendChild(this.iframe);\n return p;\n }\n\n async init(root: HTMLElement): Promise<void> {\n if (this.state === 'not-ready') {\n this.state = 'initializing';\n console.log('[embedded-wallet] attaching to root', root);\n await this.attachIframe(root);\n console.log('[embedded-wallet] iframe attached');\n this.setupMessageListener();\n console.log('[embedded-wallet] sending ping');\n let retryCount = 5;\n while (retryCount > 0) {\n try {\n await this.sendMessage({ type: 'ping' }, this.timeouts.init);\n break;\n } catch (e) {\n retryCount--;\n if (retryCount === 0) {\n this.destroy();\n throw new Error('[embedded-wallet] ping retries exceeded. Init failed');\n } else {\n console.warn('[embedded-wallet] failed to ping attached iframe retrying');\n }\n }\n }\n console.log('[embedded-wallet] pong received');\n this.state = 'ready';\n }\n }\n\n destroy(): void {\n this.state = 'not-ready';\n window.removeEventListener('message', this.handleMessage);\n for (const [_, reject] of this.waitingForResponse.values()) {\n reject(new Error('Iframe disconnected'));\n }\n this.waitingForResponse.clear();\n this.iframe?.remove();\n }\n\n async connect(masterAddress: string): Promise<ConnectResponse> {\n return this.sendMessage({ type: 'connect', address: masterAddress }, this.timeouts.connect);\n }\n\n async senEnterPinStep(step: string): Promise<ConnectResponse> {\n return this.sendMessage({ type: 'set-create-pin-step', step }, this.timeouts.setEnterPinStep);\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 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, Dictionary, toNano, TonClient } from \"@ton/ton\";\nimport { PublicKeysValue } from \"./utils/packers\";\n\ntype StormWalletConfig = {\n smartAccountMasterAddress: string;\n}\n\nexport enum SmartAccountInternalOp {\n add_new_user_public_key = 0x44ced4bc,\n remove_user_public_key = 0xd4b5ac6e,\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}\n\nexport class StormWallet {\n constructor(private readonly tonClient: TonClient, private readonly config: StormWalletConfig) {\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(0x8bb43aa7, 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\nexport function bufferToBigInt(buffer: Buffer): bigint {\n return BigInt('0x' + buffer.toString('hex'));\n}\n"],"names":["IframeAdapter","props","__publicField","waiter","resolve","reject","payload","timeout","messageId","response","_","_b","_a","root","p","e","retryCount","masterAddress","step","message","unpackPublicKeys","cs","packPublicKeys","publicKeys","beginCell","PublicKeysValue","src","builder","StormWallet","tonClient","config","walletAddress","Address","smartAccountAddress","address","stack","index","collectionAddress","masterWalletAddress","pksCell","Dictionary","adminAddress","backendPublicKeys","seqno","publicKey","transferAmount","bufferToBigInt","toNano","buffer"],"mappings":"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"}
|
|
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"],"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\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\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 setEnterPinStep: 1000,\n getPublicKey: 1000,\n resetDevice: 1000,\n ...props.timeouts,\n };\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 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 this.iframe = document.createElement('iframe');\n this.iframe.src = this.host;\n this.iframe.frameBorder = '0';\n this.iframe.width='100%'\n this.iframe.height='100%'\n const p = new Promise<void>((resolve, reject) => {\n this.iframe?.addEventListener('load', async () => {\n resolve();\n }, { once: true });\n this.iframe?.addEventListener('error', (e) => {\n reject(e);\n }, { once: true });\n });\n root.appendChild(this.iframe);\n return p;\n }\n\n async init(root: HTMLElement): Promise<void> {\n if (this.state === 'not-ready') {\n this.state = 'initializing';\n console.log('[embedded-wallet] attaching to root', root);\n await this.attachIframe(root);\n console.log('[embedded-wallet] iframe attached');\n this.setupMessageListener();\n console.log('[embedded-wallet] sending ping');\n let retryCount = 5;\n while (retryCount > 0) {\n try {\n await this.sendMessage({ type: 'ping' }, this.timeouts.init);\n break;\n } catch (e) {\n retryCount--;\n if (retryCount === 0) {\n this.destroy();\n throw new Error('[embedded-wallet] ping retries exceeded. Init failed');\n } else {\n console.warn('[embedded-wallet] failed to ping attached iframe retrying');\n }\n }\n }\n console.log('[embedded-wallet] pong received');\n this.state = 'ready';\n }\n }\n\n destroy(): void {\n this.state = 'not-ready';\n window.removeEventListener('message', this.handleMessage);\n for (const [_, reject] of this.waitingForResponse.values()) {\n reject(new Error('Iframe disconnected'));\n }\n this.waitingForResponse.clear();\n this.iframe?.remove();\n }\n\n async connect(masterAddress: string): Promise<ConnectResponse> {\n return this.sendMessage({ type: 'connect', address: masterAddress }, this.timeouts.connect);\n }\n\n async senEnterPinStep(step: string): Promise<ConnectResponse> {\n return this.sendMessage({ type: 'set-create-pin-step', step }, this.timeouts.setEnterPinStep);\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 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, Dictionary, toNano, TonClient } from \"@ton/ton\";\nimport { PublicKeysValue } from \"./utils/packers\";\n\ntype StormWalletConfig = {\n smartAccountMasterAddress: string;\n}\n\nexport enum SmartAccountInternalOp {\n add_new_user_public_key = 0x44ced4bc,\n remove_user_public_key = 0xd4b5ac6e,\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}\n\nexport class StormWallet {\n constructor(private readonly tonClient: TonClient, private readonly config: StormWalletConfig) {\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(0x8bb43aa7, 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\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}"],"names":["IframeAdapter","props","__publicField","waiter","resolve","reject","payload","timeout","messageId","response","_","_b","_a","root","p","e","retryCount","masterAddress","step","address","message","unpackPublicKeys","cs","packPublicKeys","publicKeys","beginCell","PublicKeysValue","src","builder","StormWallet","tonClient","config","walletAddress","Address","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"],"mappings":"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"}
|
package/dist/wallet-core.umd.cjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
(function(i
|
|
1
|
+
(function(n,i){typeof exports=="object"&&typeof module<"u"?i(exports,require("@ton/ton")):typeof define=="function"&&define.amd?define(["exports","@ton/ton"],i):(n=typeof globalThis<"u"?globalThis:n||self,i(n.WalletCore={},n.ton))})(this,function(n,i){"use strict";var C=Object.defineProperty;var P=(n,i,l)=>i in n?C(n,i,{enumerable:!0,configurable:!0,writable:!0,value:l}):n[i]=l;var o=(n,i,l)=>P(n,typeof i!="symbol"?i+"":i,l);class l{constructor(e){o(this,"host");o(this,"timeouts");o(this,"waitingForResponse",new Map);o(this,"iframe");o(this,"state","not-ready");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,r]=t;e.data.status==="success"?"payload"in e.data?s(e.data.payload):s(void 0):"error"in e.data?r(new Error(e.data.error)):r(new Error("Unknown error"))});this.host=e.host,this.timeouts={init:1e3,connect:6e4,disconnect:1e3,sign:1e3,createTransfer:1e3,activeSessions:1e3,setEnterPinStep:1e3,getPublicKey:1e3,resetDevice:1e3,...e.timeouts}}async sendMessage(e,t){var d,c;const s=Math.random().toString(),r=Promise.race([new Promise((u,h)=>{this.waitingForResponse.set(s,[u,h])}),new Promise((u,h)=>{setTimeout(()=>{h(new Error("Response timeout"))},t)})]);return(c=(d=this.iframe)==null?void 0:d.contentWindow)==null||c.postMessage({id:s,payload:e},this.host),r}setupMessageListener(){window.addEventListener("message",this.handleMessage)}async attachIframe(e){this.iframe=document.createElement("iframe"),this.iframe.src=this.host,this.iframe.frameBorder="0",this.iframe.width="100%",this.iframe.height="100%";const t=new Promise((s,r)=>{var d,c;(d=this.iframe)==null||d.addEventListener("load",async()=>{s()},{once:!0}),(c=this.iframe)==null||c.addEventListener("error",u=>{r(u)},{once:!0})});return e.appendChild(this.iframe),t}async init(e){if(this.state==="not-ready"){this.state="initializing",console.log("[embedded-wallet] attaching to root",e),await this.attachIframe(e),console.log("[embedded-wallet] iframe attached"),this.setupMessageListener(),console.log("[embedded-wallet] sending ping");let t=5;for(;t>0;)try{await this.sendMessage({type:"ping"},this.timeouts.init);break}catch{if(t--,t===0)throw this.destroy(),new Error("[embedded-wallet] ping retries exceeded. Init failed");console.warn("[embedded-wallet] failed to ping attached iframe retrying")}console.log("[embedded-wallet] pong received"),this.state="ready"}}destroy(){var e;this.state="not-ready",window.removeEventListener("message",this.handleMessage);for(const[t,s]of this.waitingForResponse.values())s(new Error("Iframe disconnected"));this.waitingForResponse.clear(),(e=this.iframe)==null||e.remove()}async connect(e){return this.sendMessage({type:"connect",address:e},this.timeouts.connect)}async senEnterPinStep(e){return this.sendMessage({type:"set-create-pin-step",step:e},this.timeouts.setEnterPinStep)}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 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 p=a=>a.loadBuffer(32),w=a=>i.beginCell().storeBuffer(a,32).endCell(),S={serialize:(a,e)=>{e.storeBuilder(w(a).asBuilder())},parse:a=>p(a)};class v{constructor(e,t){this.tonClient=e,this.config=t}async getSmartAccountAddress(e){return(await this.tonClient.runMethod(i.Address.parse(this.config.smartAccountMasterAddress),"get_nft_address_by_index",[{type:"int",value:BigInt(`0x${i.Address.parse(e).hash.toString("hex")}`)}])).stack.readAddress()}async getSmartAccountData(e){const t=i.Address.parse(e);try{const r=(await this.tonClient.runMethod(t,"get_storage_data")).stack,d=r.readBigNumber(),c=r.readAddress(),u=r.readAddress(),h=r.readCellOpt();let b=[];h&&(b=i.Dictionary.loadDirect(i.Dictionary.Keys.BigUint(256),i.Dictionary.Values.Cell(),h).keys());const M=r.readAddress(),B=i.Dictionary.loadDirect(i.Dictionary.Keys.Uint(8),S,r.readCell()).values(),E=r.readNumber();return{index:d,collectionAddress:c,masterWalletAddress:u,publicKeys:b,adminAddress:M,backendPublicKeys:B,seqno:E}}catch(s){if(s.message.endsWith("-13"))return null;throw s}}createDeploySmartAccountTx(e,t){const s=i.Dictionary.empty(i.Dictionary.Keys.BigUint(256),i.Dictionary.Values.Cell());s.set(A(e),i.beginCell().endCell());const r=i.beginCell().storeUint(2343844519,32).storeUint(0,64).storeDict(s).endCell();return{address:this.config.smartAccountMasterAddress,payload:r.toBoc().toString("base64"),amount:t}}createAddPublicKeyTx(e,t){const s=i.beginCell().storeUint(1154405564,32).storeUint(0,64).storeBuffer(t).endCell();return{address:e,payload:s.toBoc().toString("base64"),amount:i.toNano("0.05")}}createRemovePublicKeyTx(e,t){const s=i.beginCell().storeUint(3568675950,32).storeUint(0,64).storeBuffer(t).endCell();return{address:e,payload:s.toBoc().toString("base64"),amount:i.toNano("0.05")}}}function A(a){return BigInt("0x"+a.toString("hex"))}const y=10n,f=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>f)throw new Error("invalid bitnumber");return s}getNext(){let e=this.bitnumber+1n,t=this.shift;if(t===m&&e>f-1n)throw new Error("Overload");if(e>f&&(e=0n,t+=1n,t>m))throw new Error("Overload");return g.fromShiftAndBitNumber(t,e)}hasNext(){return!(this.bitnumber>=f-1n&&this.shift===m)}getShift(){return this.shift}getBitNumber(){return this.bitnumber}getQueryId(){return(this.shift<<y)+this.bitnumber}static fromQueryId(e){const t=e>>y,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}}n.HighloadQueryId=g,n.IframeAdapter=l,n.StormWallet=v,Object.defineProperty(n,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"],"sourcesContent":["import {\n ActiveSessionsResponse,\n AdapterState,\n ConnectResponse,\n CreateTransferRequest,\n CreateTransferResponse,\n IframeAdapterProps,\n SignRequest,\n SignResponse,\n Timeouts,\n} from '../types';\n\ntype Waiter = [(value: any) => void, (e: Error) => void]\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\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 setEnterPinStep: 1000,\n ...props.timeouts,\n };\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 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 this.iframe = document.createElement('iframe');\n this.iframe.src = this.host;\n this.iframe.frameBorder = '0';\n this.iframe.width='100%'\n this.iframe.height='100%'\n const p = new Promise<void>((resolve, reject) => {\n this.iframe?.addEventListener('load', async () => {\n resolve();\n }, { once: true });\n this.iframe?.addEventListener('error', (e) => {\n reject(e);\n }, { once: true });\n });\n root.appendChild(this.iframe);\n return p;\n }\n\n async init(root: HTMLElement): Promise<void> {\n if (this.state === 'not-ready') {\n this.state = 'initializing';\n console.log('[embedded-wallet] attaching to root', root);\n await this.attachIframe(root);\n console.log('[embedded-wallet] iframe attached');\n this.setupMessageListener();\n console.log('[embedded-wallet] sending ping');\n let retryCount = 5;\n while (retryCount > 0) {\n try {\n await this.sendMessage({ type: 'ping' }, this.timeouts.init);\n break;\n } catch (e) {\n retryCount--;\n if (retryCount === 0) {\n this.destroy();\n throw new Error('[embedded-wallet] ping retries exceeded. Init failed');\n } else {\n console.warn('[embedded-wallet] failed to ping attached iframe retrying');\n }\n }\n }\n console.log('[embedded-wallet] pong received');\n this.state = 'ready';\n }\n }\n\n destroy(): void {\n this.state = 'not-ready';\n window.removeEventListener('message', this.handleMessage);\n for (const [_, reject] of this.waitingForResponse.values()) {\n reject(new Error('Iframe disconnected'));\n }\n this.waitingForResponse.clear();\n this.iframe?.remove();\n }\n\n async connect(masterAddress: string): Promise<ConnectResponse> {\n return this.sendMessage({ type: 'connect', address: masterAddress }, this.timeouts.connect);\n }\n\n async senEnterPinStep(step: string): Promise<ConnectResponse> {\n return this.sendMessage({ type: 'set-create-pin-step', step }, this.timeouts.setEnterPinStep);\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 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, Dictionary, toNano, TonClient } from \"@ton/ton\";\nimport { PublicKeysValue } from \"./utils/packers\";\n\ntype StormWalletConfig = {\n smartAccountMasterAddress: string;\n}\n\nexport enum SmartAccountInternalOp {\n add_new_user_public_key = 0x44ced4bc,\n remove_user_public_key = 0xd4b5ac6e,\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}\n\nexport class StormWallet {\n constructor(private readonly tonClient: TonClient, private readonly config: StormWalletConfig) {\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(0x8bb43aa7, 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\nexport function bufferToBigInt(buffer: Buffer): bigint {\n return BigInt('0x' + buffer.toString('hex'));\n}\n"],"names":["IframeAdapter","props","__publicField","waiter","resolve","reject","payload","timeout","messageId","response","_","_b","_a","root","p","e","retryCount","masterAddress","step","message","unpackPublicKeys","cs","packPublicKeys","publicKeys","beginCell","PublicKeysValue","src","builder","StormWallet","tonClient","config","walletAddress","Address","smartAccountAddress","address","stack","index","collectionAddress","masterWalletAddress","pksCell","Dictionary","adminAddress","backendPublicKeys","seqno","publicKey","transferAmount","bufferToBigInt","toNano","buffer"],"mappings":"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"}
|
|
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"],"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\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\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 setEnterPinStep: 1000,\n getPublicKey: 1000,\n resetDevice: 1000,\n ...props.timeouts,\n };\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 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 this.iframe = document.createElement('iframe');\n this.iframe.src = this.host;\n this.iframe.frameBorder = '0';\n this.iframe.width='100%'\n this.iframe.height='100%'\n const p = new Promise<void>((resolve, reject) => {\n this.iframe?.addEventListener('load', async () => {\n resolve();\n }, { once: true });\n this.iframe?.addEventListener('error', (e) => {\n reject(e);\n }, { once: true });\n });\n root.appendChild(this.iframe);\n return p;\n }\n\n async init(root: HTMLElement): Promise<void> {\n if (this.state === 'not-ready') {\n this.state = 'initializing';\n console.log('[embedded-wallet] attaching to root', root);\n await this.attachIframe(root);\n console.log('[embedded-wallet] iframe attached');\n this.setupMessageListener();\n console.log('[embedded-wallet] sending ping');\n let retryCount = 5;\n while (retryCount > 0) {\n try {\n await this.sendMessage({ type: 'ping' }, this.timeouts.init);\n break;\n } catch (e) {\n retryCount--;\n if (retryCount === 0) {\n this.destroy();\n throw new Error('[embedded-wallet] ping retries exceeded. Init failed');\n } else {\n console.warn('[embedded-wallet] failed to ping attached iframe retrying');\n }\n }\n }\n console.log('[embedded-wallet] pong received');\n this.state = 'ready';\n }\n }\n\n destroy(): void {\n this.state = 'not-ready';\n window.removeEventListener('message', this.handleMessage);\n for (const [_, reject] of this.waitingForResponse.values()) {\n reject(new Error('Iframe disconnected'));\n }\n this.waitingForResponse.clear();\n this.iframe?.remove();\n }\n\n async connect(masterAddress: string): Promise<ConnectResponse> {\n return this.sendMessage({ type: 'connect', address: masterAddress }, this.timeouts.connect);\n }\n\n async senEnterPinStep(step: string): Promise<ConnectResponse> {\n return this.sendMessage({ type: 'set-create-pin-step', step }, this.timeouts.setEnterPinStep);\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 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, Dictionary, toNano, TonClient } from \"@ton/ton\";\nimport { PublicKeysValue } from \"./utils/packers\";\n\ntype StormWalletConfig = {\n smartAccountMasterAddress: string;\n}\n\nexport enum SmartAccountInternalOp {\n add_new_user_public_key = 0x44ced4bc,\n remove_user_public_key = 0xd4b5ac6e,\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}\n\nexport class StormWallet {\n constructor(private readonly tonClient: TonClient, private readonly config: StormWalletConfig) {\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(0x8bb43aa7, 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\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}"],"names":["IframeAdapter","props","__publicField","waiter","resolve","reject","payload","timeout","messageId","response","_","_b","_a","root","p","e","retryCount","masterAddress","step","address","message","unpackPublicKeys","cs","packPublicKeys","publicKeys","beginCell","PublicKeysValue","src","builder","StormWallet","tonClient","config","walletAddress","Address","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"],"mappings":"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"}
|