@storm-trade/wallet-core 1.0.7 → 1.0.8

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.
@@ -1,7 +1,7 @@
1
- var f = Object.defineProperty;
2
- var p = (r, e, t) => e in r ? f(r, e, { enumerable: !0, configurable: !0, writable: !0, value: t }) : r[e] = t;
3
- var d = (r, e, t) => p(r, typeof e != "symbol" ? e + "" : e, t);
4
- import { beginCell as l, Address as h, Dictionary as a, toNano as w } from "@ton/ton";
1
+ var y = Object.defineProperty;
2
+ var p = (n, e, t) => e in n ? y(n, e, { enumerable: !0, configurable: !0, writable: !0, value: t }) : n[e] = t;
3
+ var d = (n, e, t) => p(n, typeof e != "symbol" ? e + "" : e, t);
4
+ import { beginCell as u, Address as h, Dictionary as a, toNano as w } from "@ton/ton";
5
5
  class S {
6
6
  constructor(e) {
7
7
  d(this, "host");
@@ -15,8 +15,8 @@ class S {
15
15
  const t = this.waitingForResponse.get(e.data.id);
16
16
  if (!t)
17
17
  return;
18
- const [s, n] = t;
19
- 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"));
18
+ const [s, r] = t;
19
+ 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"));
20
20
  });
21
21
  this.host = e.host, this.timeouts = {
22
22
  init: 5e3,
@@ -30,35 +30,35 @@ class S {
30
30
  }
31
31
  async sendMessage(e, t) {
32
32
  var i, o;
33
- const s = Math.random().toString(), n = Promise.race([
34
- new Promise((c, u) => {
35
- this.waitingForResponse.set(s, [c, u]);
33
+ const s = Math.random().toString(), r = Promise.race([
34
+ new Promise((c, l) => {
35
+ this.waitingForResponse.set(s, [c, l]);
36
36
  }),
37
- new Promise((c, u) => {
37
+ new Promise((c, l) => {
38
38
  setTimeout(() => {
39
- u(new Error("Response timeout"));
39
+ l(new Error("Response timeout"));
40
40
  }, t);
41
41
  })
42
42
  ]);
43
- return (o = (i = this.iframe) == null ? void 0 : i.contentWindow) == null || o.postMessage({ id: s, payload: e }, this.host), n;
43
+ return (o = (i = this.iframe) == null ? void 0 : i.contentWindow) == null || o.postMessage({ id: s, payload: e }, this.host), r;
44
44
  }
45
45
  setupMessageListener() {
46
46
  window.addEventListener("message", this.handleMessage);
47
47
  }
48
48
  async attachIframe(e) {
49
49
  this.iframe = document.createElement("iframe"), this.iframe.src = this.host, this.iframe.frameBorder = "0";
50
- const t = new Promise((s, n) => {
50
+ const t = new Promise((s, r) => {
51
51
  var i, o;
52
52
  (i = this.iframe) == null || i.addEventListener("load", async () => {
53
53
  s();
54
54
  }, { once: !0 }), (o = this.iframe) == null || o.addEventListener("error", (c) => {
55
- n(c);
55
+ r(c);
56
56
  }, { once: !0 });
57
57
  });
58
58
  return e.appendChild(this.iframe), t;
59
59
  }
60
60
  async init(e) {
61
- this.state === "not-ready" && (this.state = "initializing", await this.attachIframe(e), this.setupMessageListener(), await this.sendMessage({ type: "ping" }, this.timeouts.init), this.state = "ready");
61
+ 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"), await this.sendMessage({ type: "ping" }, this.timeouts.init), console.log("[embedded-wallet] pong received"), this.state = "ready");
62
62
  }
63
63
  destroy() {
64
64
  var e;
@@ -87,11 +87,11 @@ class S {
87
87
  return this.sendMessage({ type: "disconnect", address: e }, this.timeouts.disconnect);
88
88
  }
89
89
  }
90
- const M = (r) => r.loadBuffer(32), A = (r) => l().storeBuffer(r, 32).endCell(), b = {
91
- serialize: (r, e) => {
92
- e.storeBuilder(A(r).asBuilder());
90
+ const b = (n) => n.loadBuffer(32), M = (n) => u().storeBuffer(n, 32).endCell(), A = {
91
+ serialize: (n, e) => {
92
+ e.storeBuilder(M(n).asBuilder());
93
93
  },
94
- parse: (r) => M(r)
94
+ parse: (n) => b(n)
95
95
  };
96
96
  class K {
97
97
  constructor(e, t) {
@@ -108,19 +108,19 @@ class K {
108
108
  async getSmartAccountData(e) {
109
109
  const t = h.parse(e);
110
110
  try {
111
- const n = (await this.tonClient.runMethod(t, "get_storage_data")).stack, i = n.readBigNumber(), o = n.readAddress(), c = n.readAddress(), u = a.loadDirect(a.Keys.BigUint(256), a.Values.Cell(), n.readCell()).keys(), m = n.readAddress(), g = a.loadDirect(
111
+ const r = (await this.tonClient.runMethod(t, "get_storage_data")).stack, i = r.readBigNumber(), o = r.readAddress(), c = r.readAddress(), l = a.loadDirect(a.Keys.BigUint(256), a.Values.Cell(), r.readCell()).keys(), g = r.readAddress(), m = a.loadDirect(
112
112
  a.Keys.Uint(8),
113
- b,
114
- n.readCell()
115
- ).values(), y = n.readNumber();
113
+ A,
114
+ r.readCell()
115
+ ).values(), f = r.readNumber();
116
116
  return {
117
117
  index: i,
118
118
  collectionAddress: o,
119
119
  masterWalletAddress: c,
120
- publicKeys: u,
121
- adminAddress: m,
122
- backendPublicKeys: g,
123
- seqno: y
120
+ publicKeys: l,
121
+ adminAddress: g,
122
+ backendPublicKeys: m,
123
+ seqno: f
124
124
  };
125
125
  } catch (s) {
126
126
  if (s.message.endsWith("-13"))
@@ -130,16 +130,16 @@ class K {
130
130
  }
131
131
  createDeploySmartAccountTx(e, t) {
132
132
  const s = a.empty(a.Keys.BigUint(256), a.Values.Cell());
133
- s.set(v(e), l().endCell());
134
- const n = l().storeUint(2343844519, 32).storeUint(0, 64).storeDict(s).endCell();
133
+ s.set(v(e), u().endCell());
134
+ const r = u().storeUint(2343844519, 32).storeUint(0, 64).storeDict(s).endCell();
135
135
  return {
136
136
  address: this.config.smartAccountMasterAddress,
137
- payload: n.toBoc().toString("base64"),
137
+ payload: r.toBoc().toString("base64"),
138
138
  amount: t
139
139
  };
140
140
  }
141
141
  createAddPublicKeyTx(e, t) {
142
- const s = l().storeUint(2577464751, 32).storeUint(0, 64).storeBuffer(t).endCell();
142
+ const s = u().storeUint(2577464751, 32).storeUint(0, 64).storeBuffer(t).endCell();
143
143
  return {
144
144
  address: e,
145
145
  payload: s.toBoc().toString("base64"),
@@ -147,8 +147,8 @@ class K {
147
147
  };
148
148
  }
149
149
  }
150
- function v(r) {
151
- return BigInt("0x" + r.toString("hex"));
150
+ function v(n) {
151
+ return BigInt("0x" + n.toString("hex"));
152
152
  }
153
153
  export {
154
154
  S as IframeAdapter,
@@ -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: 5000,\n connect: 60000,\n disconnect: 1000,\n sign: 1000,\n createTransfer: 1000,\n activeSessions: 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 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 await this.attachIframe(root)\n this.setupMessageListener()\n await this.sendMessage({ type: 'ping' }, this.timeouts.init)\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 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 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 const publicKeys = Dictionary.loadDirect(Dictionary.Keys.BigUint(256), Dictionary.Values.Cell(), stack.readCell()).keys();\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(0x99a0fdaf, 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}\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","masterAddress","message","unpackPublicKeys","cs","packPublicKeys","publicKeys","beginCell","PublicKeysValue","src","builder","StormWallet","tonClient","config","walletAddress","Address","smartAccountAddress","address","stack","index","collectionAddress","masterWalletAddress","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"],"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: 5000,\n connect: 60000,\n disconnect: 1000,\n sign: 1000,\n createTransfer: 1000,\n activeSessions: 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 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 await this.sendMessage({ type: 'ping' }, this.timeouts.init)\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 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 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 const publicKeys = Dictionary.loadDirect(Dictionary.Keys.BigUint(256), Dictionary.Values.Cell(), stack.readCell()).keys();\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(0x99a0fdaf, 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}\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","masterAddress","message","unpackPublicKeys","cs","packPublicKeys","publicKeys","beginCell","PublicKeysValue","src","builder","StormWallet","tonClient","config","walletAddress","Address","smartAccountAddress","address","stack","index","collectionAddress","masterWalletAddress","Dictionary","adminAddress","backendPublicKeys","seqno","publicKey","transferAmount","bufferToBigInt","toNano","buffer"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- (function(i,t){typeof exports=="object"&&typeof module<"u"?t(exports,require("@ton/ton")):typeof define=="function"&&define.amd?define(["exports","@ton/ton"],t):(i=typeof globalThis<"u"?globalThis:i||self,t(i.WalletCore={},i.ton))})(this,function(i,t){"use strict";var M=Object.defineProperty;var C=(i,t,u)=>t in i?M(i,t,{enumerable:!0,configurable:!0,writable:!0,value:u}):i[t]=u;var c=(i,t,u)=>C(i,typeof t!="symbol"?t+"":t,u);class u{constructor(e){c(this,"host");c(this,"timeouts");c(this,"waitingForResponse",new Map);c(this,"iframe");c(this,"state","not-ready");c(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 s=this.waitingForResponse.get(e.data.id);if(!s)return;const[r,n]=s;e.data.status==="success"?"payload"in e.data?r(e.data.payload):r(void 0):"error"in e.data?n(new Error(e.data.error)):n(new Error("Unknown error"))});this.host=e.host,this.timeouts={init:5e3,connect:6e4,disconnect:1e3,sign:1e3,createTransfer:1e3,activeSessions:1e3,...e.timeouts}}async sendMessage(e,s){var o,d;const r=Math.random().toString(),n=Promise.race([new Promise((l,h)=>{this.waitingForResponse.set(r,[l,h])}),new Promise((l,h)=>{setTimeout(()=>{h(new Error("Response timeout"))},s)})]);return(d=(o=this.iframe)==null?void 0:o.contentWindow)==null||d.postMessage({id:r,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";const s=new Promise((r,n)=>{var o,d;(o=this.iframe)==null||o.addEventListener("load",async()=>{r()},{once:!0}),(d=this.iframe)==null||d.addEventListener("error",l=>{n(l)},{once:!0})});return e.appendChild(this.iframe),s}async init(e){this.state==="not-ready"&&(this.state="initializing",await this.attachIframe(e),this.setupMessageListener(),await this.sendMessage({type:"ping"},this.timeouts.init),this.state="ready")}destroy(){var e;this.state="not-ready",window.removeEventListener("message",this.handleMessage);for(const[s,r]of this.waitingForResponse.values())r(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 signMessage(e,s){return this.sendMessage({type:"sign",address:e,message:s},this.timeouts.sign)}async createTransfer(e,s){return this.sendMessage({type:"create-transfer",address:e,data:s},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 f=a=>a.loadBuffer(32),y=a=>t.beginCell().storeBuffer(a,32).endCell(),g={serialize:(a,e)=>{e.storeBuilder(y(a).asBuilder())},parse:a=>f(a)};class m{constructor(e,s){this.tonClient=e,this.config=s}async getSmartAccountAddress(e){return(await this.tonClient.runMethod(t.Address.parse(this.config.smartAccountMasterAddress),"get_nft_address_by_index",[{type:"int",value:BigInt(`0x${t.Address.parse(e).hash.toString("hex")}`)}])).stack.readAddress()}async getSmartAccountData(e){const s=t.Address.parse(e);try{const n=(await this.tonClient.runMethod(s,"get_storage_data")).stack,o=n.readBigNumber(),d=n.readAddress(),l=n.readAddress(),h=t.Dictionary.loadDirect(t.Dictionary.Keys.BigUint(256),t.Dictionary.Values.Cell(),n.readCell()).keys(),w=n.readAddress(),A=t.Dictionary.loadDirect(t.Dictionary.Keys.Uint(8),g,n.readCell()).values(),b=n.readNumber();return{index:o,collectionAddress:d,masterWalletAddress:l,publicKeys:h,adminAddress:w,backendPublicKeys:A,seqno:b}}catch(r){if(r.message.endsWith("-13"))return null;throw r}}createDeploySmartAccountTx(e,s){const r=t.Dictionary.empty(t.Dictionary.Keys.BigUint(256),t.Dictionary.Values.Cell());r.set(p(e),t.beginCell().endCell());const n=t.beginCell().storeUint(2343844519,32).storeUint(0,64).storeDict(r).endCell();return{address:this.config.smartAccountMasterAddress,payload:n.toBoc().toString("base64"),amount:s}}createAddPublicKeyTx(e,s){const r=t.beginCell().storeUint(2577464751,32).storeUint(0,64).storeBuffer(s).endCell();return{address:e,payload:r.toBoc().toString("base64"),amount:t.toNano("0.05")}}}function p(a){return BigInt("0x"+a.toString("hex"))}i.IframeAdapter=u,i.StormWallet=m,Object.defineProperty(i,Symbol.toStringTag,{value:"Module"})});
1
+ (function(i,t){typeof exports=="object"&&typeof module<"u"?t(exports,require("@ton/ton")):typeof define=="function"&&define.amd?define(["exports","@ton/ton"],t):(i=typeof globalThis<"u"?globalThis:i||self,t(i.WalletCore={},i.ton))})(this,function(i,t){"use strict";var M=Object.defineProperty;var v=(i,t,l)=>t in i?M(i,t,{enumerable:!0,configurable:!0,writable:!0,value:l}):i[t]=l;var c=(i,t,l)=>v(i,typeof t!="symbol"?t+"":t,l);class l{constructor(e){c(this,"host");c(this,"timeouts");c(this,"waitingForResponse",new Map);c(this,"iframe");c(this,"state","not-ready");c(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 s=this.waitingForResponse.get(e.data.id);if(!s)return;const[n,r]=s;e.data.status==="success"?"payload"in e.data?n(e.data.payload):n(void 0):"error"in e.data?r(new Error(e.data.error)):r(new Error("Unknown error"))});this.host=e.host,this.timeouts={init:5e3,connect:6e4,disconnect:1e3,sign:1e3,createTransfer:1e3,activeSessions:1e3,...e.timeouts}}async sendMessage(e,s){var o,d;const n=Math.random().toString(),r=Promise.race([new Promise((u,h)=>{this.waitingForResponse.set(n,[u,h])}),new Promise((u,h)=>{setTimeout(()=>{h(new Error("Response timeout"))},s)})]);return(d=(o=this.iframe)==null?void 0:o.contentWindow)==null||d.postMessage({id:n,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";const s=new Promise((n,r)=>{var o,d;(o=this.iframe)==null||o.addEventListener("load",async()=>{n()},{once:!0}),(d=this.iframe)==null||d.addEventListener("error",u=>{r(u)},{once:!0})});return e.appendChild(this.iframe),s}async init(e){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"),await this.sendMessage({type:"ping"},this.timeouts.init),console.log("[embedded-wallet] pong received"),this.state="ready")}destroy(){var e;this.state="not-ready",window.removeEventListener("message",this.handleMessage);for(const[s,n]of this.waitingForResponse.values())n(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 signMessage(e,s){return this.sendMessage({type:"sign",address:e,message:s},this.timeouts.sign)}async createTransfer(e,s){return this.sendMessage({type:"create-transfer",address:e,data:s},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 g=a=>a.loadBuffer(32),m=a=>t.beginCell().storeBuffer(a,32).endCell(),f={serialize:(a,e)=>{e.storeBuilder(m(a).asBuilder())},parse:a=>g(a)};class y{constructor(e,s){this.tonClient=e,this.config=s}async getSmartAccountAddress(e){return(await this.tonClient.runMethod(t.Address.parse(this.config.smartAccountMasterAddress),"get_nft_address_by_index",[{type:"int",value:BigInt(`0x${t.Address.parse(e).hash.toString("hex")}`)}])).stack.readAddress()}async getSmartAccountData(e){const s=t.Address.parse(e);try{const r=(await this.tonClient.runMethod(s,"get_storage_data")).stack,o=r.readBigNumber(),d=r.readAddress(),u=r.readAddress(),h=t.Dictionary.loadDirect(t.Dictionary.Keys.BigUint(256),t.Dictionary.Values.Cell(),r.readCell()).keys(),w=r.readAddress(),b=t.Dictionary.loadDirect(t.Dictionary.Keys.Uint(8),f,r.readCell()).values(),A=r.readNumber();return{index:o,collectionAddress:d,masterWalletAddress:u,publicKeys:h,adminAddress:w,backendPublicKeys:b,seqno:A}}catch(n){if(n.message.endsWith("-13"))return null;throw n}}createDeploySmartAccountTx(e,s){const n=t.Dictionary.empty(t.Dictionary.Keys.BigUint(256),t.Dictionary.Values.Cell());n.set(p(e),t.beginCell().endCell());const r=t.beginCell().storeUint(2343844519,32).storeUint(0,64).storeDict(n).endCell();return{address:this.config.smartAccountMasterAddress,payload:r.toBoc().toString("base64"),amount:s}}createAddPublicKeyTx(e,s){const n=t.beginCell().storeUint(2577464751,32).storeUint(0,64).storeBuffer(s).endCell();return{address:e,payload:n.toBoc().toString("base64"),amount:t.toNano("0.05")}}}function p(a){return BigInt("0x"+a.toString("hex"))}i.IframeAdapter=l,i.StormWallet=y,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"],"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: 5000,\n connect: 60000,\n disconnect: 1000,\n sign: 1000,\n createTransfer: 1000,\n activeSessions: 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 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 await this.attachIframe(root)\n this.setupMessageListener()\n await this.sendMessage({ type: 'ping' }, this.timeouts.init)\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 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 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 const publicKeys = Dictionary.loadDirect(Dictionary.Keys.BigUint(256), Dictionary.Values.Cell(), stack.readCell()).keys();\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(0x99a0fdaf, 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}\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","masterAddress","message","unpackPublicKeys","cs","packPublicKeys","publicKeys","beginCell","PublicKeysValue","src","builder","StormWallet","tonClient","config","walletAddress","Address","smartAccountAddress","address","stack","index","collectionAddress","masterWalletAddress","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"],"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: 5000,\n connect: 60000,\n disconnect: 1000,\n sign: 1000,\n createTransfer: 1000,\n activeSessions: 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 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 await this.sendMessage({ type: 'ping' }, this.timeouts.init)\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 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 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 const publicKeys = Dictionary.loadDirect(Dictionary.Keys.BigUint(256), Dictionary.Values.Cell(), stack.readCell()).keys();\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(0x99a0fdaf, 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}\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","masterAddress","message","unpackPublicKeys","cs","packPublicKeys","publicKeys","beginCell","PublicKeysValue","src","builder","StormWallet","tonClient","config","walletAddress","Address","smartAccountAddress","address","stack","index","collectionAddress","masterWalletAddress","Dictionary","adminAddress","backendPublicKeys","seqno","publicKey","transferAmount","bufferToBigInt","toNano","buffer"],"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.7",
3
+ "version": "1.0.8",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "files": [