@storm-trade/wallet-core 1.0.16 → 1.0.18

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.
@@ -76,6 +76,10 @@ export declare type IframeAdapterProps = {
76
76
 
77
77
  export declare type PingResponse = EmptyResponse;
78
78
 
79
+ export declare function queryId(): bigint;
80
+
81
+ export declare const SessionExpiredOrNotProvided: Error;
82
+
79
83
  export declare type SignRequest = {
80
84
  body: Uint8Array;
81
85
  };
@@ -114,6 +118,11 @@ export declare class StormWallet {
114
118
  payload: string;
115
119
  amount: bigint;
116
120
  };
121
+ createRemoveAllKeysExceptCurrentTx(smartAccountAddress: string, publicKey: Buffer): {
122
+ address: string;
123
+ payload: string;
124
+ amount: bigint;
125
+ };
117
126
  }
118
127
 
119
128
  declare type StormWalletConfig = {
@@ -1,8 +1,8 @@
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 {
1
+ var S = Object.defineProperty;
2
+ var M = (r, e, t) => e in r ? S(r, e, { enumerable: !0, configurable: !0, writable: !0, value: t }) : r[e] = t;
3
+ var i = (r, e, t) => M(r, typeof e != "symbol" ? e + "" : e, t);
4
+ import { beginCell as l, Address as f, Dictionary as a, toNano as g } from "@ton/ton";
5
+ class K {
6
6
  constructor(e) {
7
7
  i(this, "host");
8
8
  i(this, "timeouts");
@@ -112,13 +112,13 @@ class I {
112
112
  return this.sendMessage({ type: "disconnect", address: e }, this.timeouts.disconnect);
113
113
  }
114
114
  }
115
- const A = (r) => r.loadBuffer(32), E = (r) => h().storeBuffer(r, 32).endCell(), C = {
115
+ const E = (r) => r.loadBuffer(32), A = (r) => l().storeBuffer(r, 32).endCell(), C = {
116
116
  serialize: (r, e) => {
117
- e.storeBuilder(E(r).asBuilder());
117
+ e.storeBuilder(A(r).asBuilder());
118
118
  },
119
- parse: (r) => A(r)
119
+ parse: (r) => E(r)
120
120
  };
121
- class N {
121
+ class U {
122
122
  constructor(e, t) {
123
123
  this.tonClient = e, this.config = t;
124
124
  }
@@ -134,21 +134,21 @@ class N {
134
134
  const t = f.parse(e);
135
135
  try {
136
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());
137
+ let p = [];
138
+ u && (p = a.loadDirect(a.Keys.BigUint(256), a.Values.Cell(), u).keys());
139
139
  const w = n.readAddress(), v = a.loadDirect(
140
140
  a.Keys.Uint(8),
141
141
  C,
142
142
  n.readCell()
143
- ).values(), M = n.readNumber();
143
+ ).values(), B = n.readNumber();
144
144
  return {
145
145
  index: o,
146
146
  collectionAddress: d,
147
147
  masterWalletAddress: c,
148
- publicKeys: y,
148
+ publicKeys: p,
149
149
  adminAddress: w,
150
150
  backendPublicKeys: v,
151
- seqno: M
151
+ seqno: B
152
152
  };
153
153
  } catch (s) {
154
154
  if (s.message.endsWith("-13"))
@@ -158,8 +158,8 @@ class N {
158
158
  }
159
159
  createDeploySmartAccountTx(e, t) {
160
160
  const s = a.empty(a.Keys.BigUint(256), a.Values.Cell());
161
- s.set(P(e), h().endCell());
162
- const n = h().storeUint(2343844519, 32).storeUint(0, 64).storeDict(s).endCell();
161
+ s.set(x(e), l().endCell());
162
+ const n = l().storeUint(1983912421, 32).storeUint(0, 64).storeDict(s).endCell();
163
163
  return {
164
164
  address: this.config.smartAccountMasterAddress,
165
165
  payload: n.toBoc().toString("base64"),
@@ -167,27 +167,36 @@ class N {
167
167
  };
168
168
  }
169
169
  createAddPublicKeyTx(e, t) {
170
- const s = h().storeUint(1154405564, 32).storeUint(0, 64).storeBuffer(t).endCell();
170
+ const s = l().storeUint(571231257, 32).storeUint(0, 64).storeBuffer(t).endCell();
171
171
  return {
172
172
  address: e,
173
173
  payload: s.toBoc().toString("base64"),
174
- amount: b("0.05")
174
+ amount: g("0.05")
175
175
  };
176
176
  }
177
177
  createRemovePublicKeyTx(e, t) {
178
- const s = h().storeUint(3568675950, 32).storeUint(0, 64).storeBuffer(t).endCell();
178
+ const s = l().storeUint(1948765727, 32).storeUint(0, 64).storeBuffer(t).endCell();
179
179
  return {
180
180
  address: e,
181
181
  payload: s.toBoc().toString("base64"),
182
- amount: b("0.05")
182
+ amount: g("0.05")
183
+ };
184
+ }
185
+ createRemoveAllKeysExceptCurrentTx(e, t) {
186
+ const s = l().storeUint(1604127040, 32).storeUint(0, 64).storeBuffer(t).endCell();
187
+ return {
188
+ address: e,
189
+ payload: s.toBoc().toString("base64"),
190
+ amount: g("0.05")
191
+ // при необходимости настрой сумму
183
192
  };
184
193
  }
185
194
  }
186
- function P(r) {
195
+ function x(r) {
187
196
  return BigInt("0x" + r.toString("hex"));
188
197
  }
189
- const p = 10n, l = 1022n, m = 8191n;
190
- class g {
198
+ const b = 10n, h = 1022n, m = 8191n;
199
+ class y {
191
200
  // [0 .. 1022]
192
201
  constructor() {
193
202
  i(this, "shift");
@@ -196,23 +205,23 @@ class g {
196
205
  this.shift = 0n, this.bitnumber = 0n;
197
206
  }
198
207
  static fromShiftAndBitNumber(e, t) {
199
- const s = new g();
208
+ const s = new y();
200
209
  if (s.shift = e, s.shift < 0) throw new Error("invalid shift");
201
210
  if (s.shift > m) throw new Error("invalid shift");
202
211
  if (s.bitnumber = t, s.bitnumber < 0) throw new Error("invalid bitnumber");
203
- if (s.bitnumber > l) throw new Error("invalid bitnumber");
212
+ if (s.bitnumber > h) throw new Error("invalid bitnumber");
204
213
  return s;
205
214
  }
206
215
  getNext() {
207
216
  let e = this.bitnumber + 1n, t = this.shift;
208
- if (t === m && e > l - 1n)
217
+ if (t === m && e > h - 1n)
209
218
  throw new Error("Overload");
210
- if (e > l && (e = 0n, t += 1n, t > m))
219
+ if (e > h && (e = 0n, t += 1n, t > m))
211
220
  throw new Error("Overload");
212
- return g.fromShiftAndBitNumber(t, e);
221
+ return y.fromShiftAndBitNumber(t, e);
213
222
  }
214
223
  hasNext() {
215
- return !(this.bitnumber >= l - 1n && this.shift === m);
224
+ return !(this.bitnumber >= h - 1n && this.shift === m);
216
225
  }
217
226
  getShift() {
218
227
  return this.shift;
@@ -221,10 +230,10 @@ class g {
221
230
  return this.bitnumber;
222
231
  }
223
232
  getQueryId() {
224
- return (this.shift << p) + this.bitnumber;
233
+ return (this.shift << b) + this.bitnumber;
225
234
  }
226
235
  static fromQueryId(e) {
227
- const t = e >> p, s = e & 1023n;
236
+ const t = e >> b, s = e & 1023n;
228
237
  return this.fromShiftAndBitNumber(t, s);
229
238
  }
230
239
  static fromSeqno(e) {
@@ -238,9 +247,16 @@ class g {
238
247
  return this.bitnumber + this.shift * 1023n;
239
248
  }
240
249
  }
250
+ function N() {
251
+ const r = Math.floor(Date.now() / 1e3) - 30;
252
+ return BigInt(r % (1 << 23));
253
+ }
254
+ const T = new Error("Session is expired or never provided");
241
255
  export {
242
- g as HighloadQueryId,
243
- I as IframeAdapter,
244
- N as StormWallet
256
+ y as HighloadQueryId,
257
+ K as IframeAdapter,
258
+ T as SessionExpiredOrNotProvided,
259
+ U as StormWallet,
260
+ N as queryId
245
261
  };
246
262
  //# sourceMappingURL=wallet-core.js.map
@@ -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"],"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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"}
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\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 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 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(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":["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","ts","SessionExpiredOrNotProvided"],"mappings":"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"}
@@ -1,2 +1,2 @@
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"})});
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 I=Object.defineProperty;var D=(i,r,l)=>r in i?I(i,r,{enumerable:!0,configurable:!0,writable:!0,value:l}):i[r]=l;var o=(i,r,l)=>D(i,typeof r!="symbol"?r+"":r,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,n]=t;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,setEnterPinStep:1e3,getPublicKey:1e3,resetDevice:1e3,...e.timeouts}}async sendMessage(e,t){var d,c;const s=Math.random().toString(),n=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),n}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,n)=>{var d,c;(d=this.iframe)==null||d.addEventListener("load",async()=>{s()},{once:!0}),(c=this.iframe)==null||c.addEventListener("error",u=>{n(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=>r.beginCell().storeBuffer(a,32).endCell(),v={serialize:(a,e)=>{e.storeBuilder(w(a).asBuilder())},parse:a=>p(a)};class S{constructor(e,t){this.tonClient=e,this.config=t}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,d=n.readBigNumber(),c=n.readAddress(),u=n.readAddress(),h=n.readCellOpt();let b=[];h&&(b=r.Dictionary.loadDirect(r.Dictionary.Keys.BigUint(256),r.Dictionary.Values.Cell(),h).keys());const E=n.readAddress(),C=r.Dictionary.loadDirect(r.Dictionary.Keys.Uint(8),v,n.readCell()).values(),P=n.readNumber();return{index:d,collectionAddress:c,masterWalletAddress:u,publicKeys:b,adminAddress:E,backendPublicKeys:C,seqno:P}}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(A(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 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}}function B(){const a=Math.floor(Date.now()/1e3)-30;return BigInt(a%(1<<23))}const M=new Error("Session is expired or never provided");i.HighloadQueryId=g,i.IframeAdapter=l,i.SessionExpiredOrNotProvided=M,i.StormWallet=S,i.queryId=B,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"],"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":"6aAgBO,MAAMA,CAAc,CAOzB,YAAYC,EAA2B,CANtBC,EAAA,aACAA,EAAA,iBACAA,EAAA,8BAAyB,KAClCA,EAAA,eACAA,EAAA,aAAsB,aAsCtBA,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,EACtB,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,GAhEE,KAAK,KAAOJ,EAAM,KAClB,KAAK,SAAW,CACd,KAAM,IACN,QAAS,IACT,WAAY,IACZ,KAAM,IACN,eAAgB,IAChB,eAAgB,IAChB,gBAAiB,IACjB,aAAc,IACd,YAAa,IACb,GAAGA,EAAM,QACX,CAAA,CAGF,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,CAkCvD,MAAc,aAAaI,EAAkC,CACtD,KAAA,OAAS,SAAS,cAAc,QAAQ,EACxC,KAAA,OAAO,IAAM,KAAK,KACvB,KAAK,OAAO,YAAc,IAC1B,KAAK,OAAO,MAAM,OAClB,KAAK,OAAO,OAAO,OACnB,MAAMC,EAAI,IAAI,QAAc,CAACV,EAASC,IAAW,UAC1CO,EAAA,KAAA,SAAA,MAAAA,EAAQ,iBAAiB,OAAQ,SAAY,CACxCR,EAAA,CAAA,EACP,CAAE,KAAM,MACXO,EAAA,KAAK,SAAL,MAAAA,EAAa,iBAAiB,QAAUI,GAAM,CAC5CV,EAAOU,CAAC,CAAA,EACP,CAAE,KAAM,IAAM,CAClB,EACI,OAAAF,EAAA,YAAY,KAAK,MAAM,EACrBC,CAAA,CAGT,MAAM,KAAKD,EAAkC,CACvC,GAAA,KAAK,QAAU,YAAa,CAC9B,KAAK,MAAQ,eACL,QAAA,IAAI,sCAAuCA,CAAI,EACjD,MAAA,KAAK,aAAaA,CAAI,EAC5B,QAAQ,IAAI,mCAAmC,EAC/C,KAAK,qBAAqB,EAC1B,QAAQ,IAAI,gCAAgC,EAC5C,IAAIG,EAAa,EACjB,KAAOA,EAAa,GACd,GAAA,CACI,MAAA,KAAK,YAAY,CAAE,KAAM,QAAU,KAAK,SAAS,IAAI,EAC3D,WACU,CAEV,GADAA,IACIA,IAAe,EACjB,WAAK,QAAQ,EACP,IAAI,MAAM,sDAAsD,EAEtE,QAAQ,KAAK,2DAA2D,CAC1E,CAGJ,QAAQ,IAAI,iCAAiC,EAC7C,KAAK,MAAQ,OAAA,CACf,CAGF,SAAgB,OACd,KAAK,MAAQ,YACN,OAAA,oBAAoB,UAAW,KAAK,aAAa,EACxD,SAAW,CAACN,EAAGL,CAAM,IAAK,KAAK,mBAAmB,SACzCA,EAAA,IAAI,MAAM,qBAAqB,CAAC,EAEzC,KAAK,mBAAmB,MAAM,GAC9BO,EAAA,KAAK,SAAL,MAAAA,EAAa,QAAO,CAGtB,MAAM,QAAQK,EAAiD,CACtD,OAAA,KAAK,YAAY,CAAE,KAAM,UAAW,QAASA,GAAiB,KAAK,SAAS,OAAO,CAAA,CAG5F,MAAM,gBAAgBC,EAAwC,CACrD,OAAA,KAAK,YAAY,CAAE,KAAM,sBAAuB,KAAAA,GAAQ,KAAK,SAAS,eAAe,CAAA,CAG9F,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,YAAYF,EAAuBG,EAA6C,CAC7E,OAAA,KAAK,YAAY,CAAE,KAAM,OAAQ,QAASH,EAAe,QAAAG,CAAQ,EAAG,KAAK,SAAS,IAAI,CAAA,CAG/F,MAAM,eAAeH,EAAuBG,EAAiE,CAC3G,OAAO,KAAK,YAAY,CACtB,KAAM,kBACN,QAASH,EACT,KAAMG,CAAA,EACL,KAAK,SAAS,cAAc,CAAA,CAGjC,MAAM,mBAAqD,CAClD,OAAA,KAAK,YAAY,CAAE,KAAM,mBAAqB,KAAK,SAAS,cAAc,CAAA,CAGnF,MAAM,WAAWH,EAAsC,CAC9C,OAAA,KAAK,YAAY,CAAE,KAAM,aAAc,QAASA,GAAiB,KAAK,SAAS,UAAU,CAAA,CAEpG,CCnLa,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,ECAO,MAAME,CAAY,CACvB,YAA6BC,EAAuCC,EAA2B,CAAlE,KAAA,UAAAD,EAAuC,KAAA,OAAAC,CAAA,CAGpE,MAAM,uBAAuBC,EAAyC,CAO7D,OANQ,MAAM,KAAK,UAAU,UAAUC,EAAAA,QAAQ,MAAM,KAAK,OAAO,yBAAyB,EAAG,2BAA4B,CAC9H,CACE,KAAM,MACN,MAAO,OAAO,KAAKA,UAAQ,MAAMD,CAAa,EAAE,KAAK,SAAS,KAAK,CAAC,EAAE,CAAA,CACxE,CACD,GACa,MAAM,YAAY,CAAA,CAGlC,MAAM,oBAAoBE,EAA6B,CAC/C,MAAAf,EAAUc,EAAAA,QAAQ,MAAMC,CAAmB,EAC7C,GAAA,CAEF,MAAMC,GADS,MAAM,KAAK,UAAU,UAAUhB,EAAS,kBAAkB,GACpD,MAEfiB,EAAQD,EAAM,cAAc,EAC5BE,EAAoBF,EAAM,YAAY,EACtCG,EAAsBH,EAAM,YAAY,EAGxCI,EAAWJ,EAAM,YAAY,EACnC,IAAIX,EAAuB,CAAC,EAExBe,IACFf,EAAagB,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,EACtBd,EACAS,EAAM,SAAS,GACf,OAAO,EAEHQ,EAAQR,EAAM,WAAW,EAExB,MAAA,CACL,MAAAC,EACA,kBAAAC,EACA,oBAAAC,EACA,WAAAd,EACA,aAAAiB,EACA,kBAAAC,EACA,MAAAC,CACF,QACO5B,EAAG,CACV,GAAKA,EAAY,QAAQ,SAAS,KAAK,EAC9B,OAAA,KAEH,MAAAA,CAAA,CACR,CAGF,2BAA2B6B,EAAmBC,EAAwB,CAC9D,MAAArB,EAAuCgB,EAAAA,WAAW,MAAMA,EAAW,WAAA,KAAK,QAAQ,GAAG,EAAGA,EAAAA,WAAW,OAAO,KAAA,CAAM,EACpHhB,EAAW,IAAIsB,EAAeF,CAAS,EAAGnB,EAAU,UAAA,EAAE,SAAS,EAE/D,MAAMnB,EAAUmB,EAAA,UAAA,EACb,UAAU,WAAY,EAAE,EACxB,UAAU,EAAG,EAAE,EACf,UAAUD,CAAU,EACpB,QAAQ,EAEJ,MAAA,CACL,QAAS,KAAK,OAAO,0BACrB,QAASlB,EAAQ,QAAQ,SAAS,QAAQ,EAC1C,OAAQuC,CACV,CAAA,CAGF,qBAAqBX,EAA6BU,EAAmB,CACnE,MAAMtC,EAAUmB,EAAA,UAAA,EACb,UAAU,WAAgD,EAAE,EAC5D,UAAU,EAAG,EAAE,EACf,YAAYmB,CAAS,EACrB,QAAQ,EAGJ,MAAA,CACL,QAASV,EACT,QAAS5B,EAAQ,QAAQ,SAAS,QAAQ,EAC1C,OAAQyC,SAAO,MAAM,CACvB,CAAA,CAGF,wBAAwBb,EAA6BU,EAAmB,CACtE,MAAMtC,EAAUmB,EAAA,UAAA,EACb,UAAU,WAA+C,EAAE,EAC3D,UAAU,EAAG,EAAE,EACf,YAAYmB,CAAS,EACrB,QAAQ,EAGJ,MAAA,CACL,QAASV,EACT,QAAS5B,EAAQ,QAAQ,SAAS,QAAQ,EAC1C,OAAQyC,SAAO,MAAM,CACvB,CAAA,CAEJ,CAEO,SAASD,EAAeE,EAAwB,CACrD,OAAO,OAAO,KAAOA,EAAO,SAAS,KAAK,CAAC,CAC7C,CC7HA,MAAMC,EAAkB,IAElBC,EAAiB,MACjBC,EAAY,MAEX,MAAMC,CAAgB,CAI3B,aAAc,CAHNlD,EAAA,cACAA,EAAA,kBAGN,KAAK,MAAQ,GACb,KAAK,UAAY,EAAA,CAGnB,OAAO,sBAAsBmD,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"}
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\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 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 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(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":["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","ts","SessionExpiredOrNotProvided"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@storm-trade/wallet-core",
3
- "version": "1.0.16",
3
+ "version": "1.0.18",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "files": [
@@ -10,12 +10,6 @@
10
10
  "module": "./dist/wallet-core",
11
11
  "types": "./dist/wallet-core",
12
12
  "description": "",
13
- "scripts": {
14
- "dev": "vite",
15
- "build": "tsc && vite build",
16
- "test": "vitest",
17
- "prepublishOnly": "npm run build"
18
- },
19
13
  "keywords": [],
20
14
  "author": "",
21
15
  "license": "ISC",
@@ -30,5 +24,10 @@
30
24
  "@ton/core": ">=0.60.0",
31
25
  "@ton/crypto": ">=3.3.0",
32
26
  "@ton/ton": ">=15.2.1"
27
+ },
28
+ "scripts": {
29
+ "dev": "vite",
30
+ "build": "tsc && vite build",
31
+ "test": "vitest"
33
32
  }
34
- }
33
+ }