@hot-labs/kit 1.1.3 → 1.2.0-alpha.2

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.
Files changed (203) hide show
  1. package/README.md +9 -2
  2. package/build/HotConnector.d.ts +7 -8
  3. package/build/HotConnector.js +24 -21
  4. package/build/HotConnector.js.map +1 -1
  5. package/build/OmniConnector.d.ts +0 -5
  6. package/build/OmniConnector.js +5 -5
  7. package/build/OmniConnector.js.map +1 -1
  8. package/build/OmniWallet.d.ts +17 -10
  9. package/build/OmniWallet.js +19 -14
  10. package/build/OmniWallet.js.map +1 -1
  11. package/build/core/Intents.d.ts +43 -53
  12. package/build/core/Intents.js +133 -209
  13. package/build/core/Intents.js.map +1 -1
  14. package/build/core/api.d.ts +0 -22
  15. package/build/core/api.js +4 -28
  16. package/build/core/api.js.map +1 -1
  17. package/build/core/bridge.js +1 -1
  18. package/build/core/bridge.js.map +1 -1
  19. package/build/core/index.d.ts +1 -1
  20. package/build/core/index.js +1 -1
  21. package/build/core/index.js.map +1 -1
  22. package/build/{near/rpc.d.ts → core/nearRpc.d.ts} +1 -0
  23. package/build/{near/rpc.js → core/nearRpc.js} +12 -7
  24. package/build/core/nearRpc.js.map +1 -0
  25. package/build/core/types.d.ts +0 -17
  26. package/build/core/utils.d.ts +0 -1
  27. package/build/core/utils.js +1 -21
  28. package/build/core/utils.js.map +1 -1
  29. package/build/cosmos/connector.d.ts +2 -2
  30. package/build/cosmos/connector.js +21 -17
  31. package/build/cosmos/connector.js.map +1 -1
  32. package/build/cosmos/wallet.d.ts +4 -2
  33. package/build/cosmos/wallet.js +8 -3
  34. package/build/cosmos/wallet.js.map +1 -1
  35. package/build/evm/connector.d.ts +0 -1
  36. package/build/evm/connector.js +0 -4
  37. package/build/evm/connector.js.map +1 -1
  38. package/build/evm/wallet.d.ts +1 -2
  39. package/build/evm/wallet.js +5 -7
  40. package/build/evm/wallet.js.map +1 -1
  41. package/build/exchange.d.ts +1 -4
  42. package/build/exchange.js +30 -24
  43. package/build/exchange.js.map +1 -1
  44. package/build/hot-wallet/google.js +5 -10
  45. package/build/hot-wallet/google.js.map +1 -1
  46. package/build/hot-wallet/proxy.js +2 -2
  47. package/build/hot-wallet/proxy.js.map +1 -1
  48. package/build/index.d.ts +0 -1
  49. package/build/index.js +0 -1
  50. package/build/index.js.map +1 -1
  51. package/build/near/connector.js +2 -2
  52. package/build/near/connector.js.map +1 -1
  53. package/build/near/wallet.d.ts +4 -2
  54. package/build/near/wallet.js +9 -4
  55. package/build/near/wallet.js.map +1 -1
  56. package/build/solana/connector.d.ts +1 -1
  57. package/build/solana/connector.js +8 -9
  58. package/build/solana/connector.js.map +1 -1
  59. package/build/solana/injected/solana-wallet.js.map +1 -1
  60. package/build/solana/{WalletStandard.d.ts → protocol.d.ts} +1 -1
  61. package/build/solana/{WalletStandard.js → protocol.js} +1 -1
  62. package/build/solana/protocol.js.map +1 -0
  63. package/build/solana/wallet.d.ts +7 -5
  64. package/build/solana/wallet.js +17 -8
  65. package/build/solana/wallet.js.map +1 -1
  66. package/build/solana/{walletStandartList.js → wallets.js} +1 -1
  67. package/build/solana/wallets.js.map +1 -0
  68. package/build/stellar/connector.d.ts +2 -0
  69. package/build/stellar/connector.js +4 -1
  70. package/build/stellar/connector.js.map +1 -1
  71. package/build/stellar/wallet.d.ts +8 -10
  72. package/build/stellar/wallet.js +16 -12
  73. package/build/stellar/wallet.js.map +1 -1
  74. package/build/ton/connector.d.ts +1 -0
  75. package/build/ton/connector.js +4 -1
  76. package/build/ton/connector.js.map +1 -1
  77. package/build/ton/wallet.d.ts +3 -2
  78. package/build/ton/wallet.js +4 -3
  79. package/build/ton/wallet.js.map +1 -1
  80. package/build/ui/Popup.d.ts +2 -2
  81. package/build/ui/Popup.js +1 -5
  82. package/build/ui/Popup.js.map +1 -1
  83. package/build/ui/connect/AuthPopup.js +1 -1
  84. package/build/ui/connect/AuthPopup.js.map +1 -1
  85. package/build/ui/connect/ConnectWallet.d.ts +2 -7
  86. package/build/ui/connect/ConnectWallet.js +5 -5
  87. package/build/ui/connect/ConnectWallet.js.map +1 -1
  88. package/build/ui/icons/arrow-right.js +1 -1
  89. package/build/ui/icons/arrow-right.js.map +1 -1
  90. package/build/ui/icons/close.js +1 -1
  91. package/build/ui/icons/close.js.map +1 -1
  92. package/build/ui/icons/exchange.js +1 -1
  93. package/build/ui/icons/exchange.js.map +1 -1
  94. package/build/ui/icons/logout.js +1 -1
  95. package/build/ui/icons/logout.js.map +1 -1
  96. package/build/ui/icons/pending.js +1 -1
  97. package/build/ui/icons/pending.js.map +1 -1
  98. package/build/ui/icons/qr.js +1 -1
  99. package/build/ui/icons/qr.js.map +1 -1
  100. package/build/ui/icons/search.js +1 -1
  101. package/build/ui/icons/search.js.map +1 -1
  102. package/build/ui/icons/switch.js +1 -1
  103. package/build/ui/icons/switch.js.map +1 -1
  104. package/build/ui/icons/wallet.js +1 -1
  105. package/build/ui/icons/wallet.js.map +1 -1
  106. package/build/ui/payment/Bridge.js +6 -21
  107. package/build/ui/payment/Bridge.js.map +1 -1
  108. package/build/ui/payment/Payment.d.ts +9 -16
  109. package/build/ui/payment/Payment.js +39 -128
  110. package/build/ui/payment/Payment.js.map +1 -1
  111. package/build/ui/payment/Profile.js +1 -1
  112. package/build/ui/payment/Profile.js.map +1 -1
  113. package/build/ui/payment/SelectToken.js +1 -1
  114. package/build/ui/payment/SelectToken.js.map +1 -1
  115. package/build/ui/payment/TokenCard.d.ts +2 -4
  116. package/build/ui/payment/TokenCard.js +5 -5
  117. package/build/ui/payment/TokenCard.js.map +1 -1
  118. package/build/ui/router.d.ts +4 -18
  119. package/build/ui/router.js +8 -20
  120. package/build/ui/router.js.map +1 -1
  121. package/build/ui/styles.js +0 -2
  122. package/build/ui/styles.js.map +1 -1
  123. package/package.json +4 -8
  124. package/src/HotConnector.ts +31 -24
  125. package/src/OmniConnector.ts +9 -10
  126. package/src/OmniWallet.ts +25 -24
  127. package/src/core/Intents.ts +151 -224
  128. package/src/core/api.ts +4 -44
  129. package/src/core/bridge.ts +2 -3
  130. package/src/core/index.ts +1 -1
  131. package/src/{near/rpc.ts → core/nearRpc.ts} +12 -7
  132. package/src/core/types.ts +0 -21
  133. package/src/core/utils.ts +1 -17
  134. package/src/cosmos/connector.ts +26 -22
  135. package/src/cosmos/wallet.ts +8 -3
  136. package/src/evm/connector.ts +0 -5
  137. package/src/evm/wallet.ts +6 -9
  138. package/src/exchange.ts +30 -24
  139. package/src/hot-wallet/google.ts +5 -12
  140. package/src/hot-wallet/proxy.ts +2 -2
  141. package/src/index.ts +0 -2
  142. package/src/near/connector.ts +2 -2
  143. package/src/near/wallet.ts +9 -4
  144. package/src/solana/connector.ts +8 -9
  145. package/src/solana/injected/solana-wallet.ts +6 -6
  146. package/src/solana/{WalletStandard.ts → protocol.ts} +4 -2
  147. package/src/solana/wallet.ts +20 -11
  148. package/src/stellar/connector.ts +6 -1
  149. package/src/stellar/wallet.ts +17 -17
  150. package/src/ton/connector.ts +5 -1
  151. package/src/ton/wallet.ts +3 -3
  152. package/src/ui/Popup.tsx +4 -12
  153. package/src/ui/connect/AuthPopup.tsx +1 -2
  154. package/src/ui/connect/ConnectWallet.tsx +6 -12
  155. package/src/ui/icons/arrow-right.tsx +2 -2
  156. package/src/ui/icons/close.tsx +1 -1
  157. package/src/ui/icons/exchange.tsx +4 -4
  158. package/src/ui/icons/logout.tsx +6 -6
  159. package/src/ui/icons/pending.tsx +4 -2
  160. package/src/ui/icons/qr.tsx +2 -1
  161. package/src/ui/icons/search.tsx +4 -4
  162. package/src/ui/icons/switch.tsx +4 -4
  163. package/src/ui/icons/wallet.tsx +4 -2
  164. package/src/ui/payment/Bridge.tsx +6 -25
  165. package/src/ui/payment/Payment.tsx +46 -244
  166. package/src/ui/payment/Profile.tsx +8 -10
  167. package/src/ui/payment/SelectToken.tsx +1 -1
  168. package/src/ui/payment/TokenCard.tsx +18 -22
  169. package/src/ui/router.tsx +16 -56
  170. package/src/ui/styles.ts +0 -2
  171. package/build/core/telemetry.d.ts +0 -13
  172. package/build/core/telemetry.js +0 -27
  173. package/build/core/telemetry.js.map +0 -1
  174. package/build/near/rpc.js.map +0 -1
  175. package/build/solana/WalletStandard.js.map +0 -1
  176. package/build/solana/walletStandartList.js.map +0 -1
  177. package/build/tron/connector.d.ts +0 -51
  178. package/build/tron/connector.js +0 -65
  179. package/build/tron/connector.js.map +0 -1
  180. package/build/tron/index.d.ts +0 -6
  181. package/build/tron/index.js +0 -5
  182. package/build/tron/index.js.map +0 -1
  183. package/build/tron/wallet.d.ts +0 -52
  184. package/build/tron/wallet.js +0 -122
  185. package/build/tron/wallet.js.map +0 -1
  186. package/build/ui/Toast.d.ts +0 -4
  187. package/build/ui/Toast.js +0 -33
  188. package/build/ui/Toast.js.map +0 -1
  189. package/build/ui/connect/PrimaryWallet.d.ts +0 -6
  190. package/build/ui/connect/PrimaryWallet.js +0 -18
  191. package/build/ui/connect/PrimaryWallet.js.map +0 -1
  192. package/build/ui/payment/Stepper.d.ts +0 -13
  193. package/build/ui/payment/Stepper.js +0 -22
  194. package/build/ui/payment/Stepper.js.map +0 -1
  195. package/src/core/telemetry.ts +0 -28
  196. package/src/tron/connector.ts +0 -89
  197. package/src/tron/index.ts +0 -7
  198. package/src/tron/wallet.ts +0 -146
  199. package/src/ui/Toast.tsx +0 -45
  200. package/src/ui/connect/PrimaryWallet.tsx +0 -65
  201. package/src/ui/payment/Stepper.tsx +0 -50
  202. /package/build/solana/{walletStandartList.d.ts → wallets.d.ts} +0 -0
  203. /package/src/solana/{walletStandartList.ts → wallets.ts} +0 -0
@@ -8,12 +8,10 @@ import { OmniToken } from "./core/chains";
8
8
  import { formatter } from "./core/utils";
9
9
  import { Intents } from "./core/Intents";
10
10
  import { tokens } from "./core/tokens";
11
- import { Telemetry } from "./core/telemetry";
11
+ import { rpc } from "./core/nearRpc";
12
12
  import { Token } from "./core/token";
13
13
  import { api } from "./core/api";
14
- import { rpc } from "./near/rpc";
15
14
 
16
- import { defaultConnectors } from "./defaults";
17
15
  import type CosmosWallet from "./cosmos/wallet";
18
16
  import type NearWallet from "./near/wallet";
19
17
  import type EvmWallet from "./evm/wallet";
@@ -21,7 +19,7 @@ import type SolanaWallet from "./solana/wallet";
21
19
  import type StellarWallet from "./stellar/wallet";
22
20
  import type TonWallet from "./ton/wallet";
23
21
 
24
- import { openBridge, openConnector, openProfile, openWalletPicker } from "./ui/router";
22
+ import { openBridge, openConnector, openPayment, openProfile, openWalletPicker } from "./ui/router";
25
23
  import { ConnectorType, OmniConnector } from "./OmniConnector";
26
24
  import { OmniWallet } from "./OmniWallet";
27
25
  import { Exchange } from "./exchange";
@@ -45,15 +43,16 @@ interface HotConnectorOptions {
45
43
  export class HotConnector {
46
44
  public connectors: OmniConnector[] = [];
47
45
  public balances: Record<string, Record<string, bigint>> = {};
48
- public telemetry: Telemetry;
49
46
 
50
47
  public activity: Activity;
51
48
  public hotBridge: HotBridge;
52
49
  public exchange: Exchange;
53
50
 
51
+ readonly version = "1.0.58";
52
+
54
53
  private events = new EventEmitter<{
55
- connect: { wallet: OmniWallet; connector: OmniConnector };
56
- disconnect: { wallet: OmniWallet; connector: OmniConnector };
54
+ connect: { wallet: OmniWallet };
55
+ disconnect: { wallet: OmniWallet };
57
56
  tokensUpdate: { tokens: Token[] };
58
57
  }>();
59
58
 
@@ -85,14 +84,12 @@ export class HotConnector {
85
84
  this.settings.metadata = options?.walletConnect?.metadata ?? undefined;
86
85
  Object.values(options?.chains ?? {}).forEach((chain) => chains.register(chain));
87
86
 
88
- this.telemetry = new Telemetry(this);
89
87
  this.hotBridge = createHotBridge();
90
88
  this.exchange = new Exchange(this);
91
89
  this.activity = new Activity(this);
92
90
 
93
91
  const connectors: OmniConnector[] = [];
94
- const configConnectors = options?.connectors || defaultConnectors;
95
- const tasks = configConnectors.map(async (initConnector, index) => {
92
+ const tasks = options?.connectors?.map(async (initConnector, index) => {
96
93
  const connector = await initConnector(this);
97
94
  connector.onConnect((payload) => this.events.emit("connect", payload));
98
95
  connector.onDisconnect((payload) => this.events.emit("disconnect", payload));
@@ -299,16 +296,36 @@ export class HotConnector {
299
296
  });
300
297
  }
301
298
 
302
- intentsBuilder(wallet?: OmniWallet) {
303
- return new Intents(this).attachWallet(wallet);
299
+ async requestToken(token: OmniToken, amount: bigint | number): Promise<{ wallet: OmniWallet; token: Token; amount: bigint }> {
300
+ if (!token) throw new Error("Token not found");
301
+
302
+ const tokensList = await tokens.getTokens();
303
+ const ftToken = tokensList.find((t) => t.address === token)!;
304
+ const amountInt = typeof amount === "number" ? ftToken.int(amount) : amount;
305
+ const [existed] = this.walletsTokens.filter((t) => t.token.id === ftToken.id);
306
+
307
+ if (existed?.balance >= amountInt) return { token: ftToken, wallet: existed.wallet, amount: amountInt };
308
+
309
+ const needed = amountInt - (existed?.balance ?? 0n);
310
+ const result = await openPayment(this, ftToken, needed, Recipient.fromWallet(existed?.wallet));
311
+
312
+ const recipientWallet = this.wallets.find((w) => w.address === result.recipient.address);
313
+ if (!recipientWallet) throw new Error("Recipient not found");
314
+ const exist = await this.fetchToken(ftToken, recipientWallet);
315
+
316
+ return {
317
+ token: result.to,
318
+ wallet: recipientWallet,
319
+ amount: formatter.bigIntMin(exist, amountInt),
320
+ };
304
321
  }
305
322
 
306
- onConnect(handler: (payload: { wallet: OmniWallet; connector: OmniConnector }) => void) {
323
+ onConnect(handler: (payload: { wallet: OmniWallet }) => void) {
307
324
  this.events.on("connect", handler);
308
325
  return () => this.events.off("connect", handler);
309
326
  }
310
327
 
311
- onDisconnect(handler: (payload: { wallet: OmniWallet; connector: OmniConnector }) => void) {
328
+ onDisconnect(handler: (payload: { wallet: OmniWallet }) => void) {
312
329
  this.events.on("disconnect", handler);
313
330
  return () => this.events.off("disconnect", handler);
314
331
  }
@@ -369,14 +386,4 @@ export class HotConnector {
369
386
  if (!connector) throw new Error("Connector not found");
370
387
  return openWalletPicker(connector);
371
388
  }
372
-
373
- async disconnect(wallet: WalletType | OmniWallet) {
374
- const connector = this.connectors.find((t) => {
375
- if (wallet instanceof OmniWallet) return t.wallets.includes(wallet);
376
- return t.walletTypes.includes(wallet);
377
- });
378
-
379
- if (!connector) throw new Error("Connector not found");
380
- await connector.disconnect();
381
- }
382
389
  }
@@ -19,7 +19,6 @@ export interface OmniConnectorOption {
19
19
  icon: string;
20
20
  id: string;
21
21
  download?: string;
22
- deeplink?: string;
23
22
  type: "extension" | "external";
24
23
  }
25
24
 
@@ -31,8 +30,8 @@ export abstract class OmniConnector<T extends OmniWallet = OmniWallet, O = {}> {
31
30
 
32
31
  private storage = new LocalStorage();
33
32
  protected events = new EventEmitter<{
34
- connect: { wallet: T; connector: OmniConnector<T, O> };
35
- disconnect: { wallet: T; connector: OmniConnector<T, O> };
33
+ connect: { wallet: T };
34
+ disconnect: { wallet: T };
36
35
  }>();
37
36
 
38
37
  protected wc: Promise<UniversalProvider> | null = null;
@@ -102,14 +101,14 @@ export abstract class OmniConnector<T extends OmniWallet = OmniWallet, O = {}> {
102
101
 
103
102
  protected setWallet(wallet: T) {
104
103
  runInAction(() => this.wallets.push(wallet));
105
- this.events.emit("connect", { wallet, connector: this });
104
+ this.events.emit("connect", { wallet });
106
105
  return wallet;
107
106
  }
108
107
 
109
108
  protected removeWallet() {
110
109
  runInAction(() => {
111
110
  const wallet = this.wallets.pop();
112
- if (wallet) this.events.emit("disconnect", { wallet, connector: this });
111
+ if (wallet) this.events.emit("disconnect", { wallet });
113
112
  });
114
113
  }
115
114
 
@@ -117,7 +116,7 @@ export abstract class OmniConnector<T extends OmniWallet = OmniWallet, O = {}> {
117
116
  runInAction(() => {
118
117
  const wallets = this.wallets;
119
118
  this.wallets = [];
120
- wallets.forEach((wallet) => this.events.emit("disconnect", { wallet, connector: this }));
119
+ wallets.forEach((wallet) => this.events.emit("disconnect", { wallet }));
121
120
  });
122
121
  }
123
122
 
@@ -131,7 +130,7 @@ export abstract class OmniConnector<T extends OmniWallet = OmniWallet, O = {}> {
131
130
 
132
131
  async getStorage(): Promise<{ type?: string; id?: string; address?: string; publicKey?: string }> {
133
132
  const data = await this.storage.get(`wibe3:${this.id}`);
134
- if (!data) return {};
133
+ if (!data) throw new Error("No storage found");
135
134
  return JSON.parse(data);
136
135
  }
137
136
 
@@ -139,19 +138,19 @@ export abstract class OmniConnector<T extends OmniWallet = OmniWallet, O = {}> {
139
138
  this.events.removeAllListeners();
140
139
  }
141
140
 
142
- onConnect(handler: (payload: { wallet: T; connector: OmniConnector<T, O> }) => void) {
141
+ onConnect(handler: (payload: { wallet: T }) => void) {
143
142
  this.events.on("connect", handler);
144
143
  return () => this.events.off("connect", handler);
145
144
  }
146
145
 
147
- onDisconnect(handler: (payload: { wallet: T; connector: OmniConnector<T, O> }) => void) {
146
+ onDisconnect(handler: (payload: { wallet: T }) => void) {
148
147
  this.events.on("disconnect", handler);
149
148
  return () => this.events.off("disconnect", handler);
150
149
  }
151
150
 
152
151
  async disconnect() {
153
152
  this.disconnectWalletConnect();
154
- this.removeAllWallets();
155
153
  this.removeStorage();
154
+ this.removeWallet();
156
155
  }
157
156
  }
package/src/OmniWallet.ts CHANGED
@@ -1,7 +1,9 @@
1
+ import { sha256 } from "@noble/hashes/sha2.js";
1
2
  import { hex } from "@scure/base";
2
3
 
3
4
  import { openAuthPopup } from "./ui/connect/AuthPopup";
4
- import { WalletType } from "./core/chains";
5
+ import { OmniToken, WalletType } from "./core/chains";
6
+ import { OmniConnector } from "./OmniConnector";
5
7
  import { Intents } from "./core/Intents";
6
8
  import { ReviewFee } from "./core/bridge";
7
9
  import { Token } from "./core/token";
@@ -9,44 +11,38 @@ import { Commitment } from "./core";
9
11
  import { api } from "./core/api";
10
12
 
11
13
  export abstract class OmniWallet {
14
+ constructor(readonly connector: OmniConnector) {}
15
+
12
16
  abstract address: string;
13
17
  abstract publicKey?: string;
14
18
  abstract omniAddress: string;
15
19
  abstract type: WalletType;
16
- abstract icon: string;
17
20
 
18
- async depositNfts(nftIds: string[], receiver: string) {
19
- // TODO
21
+ async disconnect() {
22
+ if (!this.connector) throw new Error("Connector not implemented");
23
+ await this.connector.disconnect();
20
24
  }
21
25
 
22
- async withdrawNfts(nftIds: string[], receiver: string) {
23
- // TODO
24
- }
26
+ abstract transferFee(token: Token, receiver: string, amount: bigint): Promise<ReviewFee>;
27
+ abstract transfer(args: { token: Token; receiver: string; amount: bigint; comment?: string; gasFee?: ReviewFee }): Promise<string>;
28
+ abstract signIntents(intents: Record<string, any>[], options?: { nonce?: Uint8Array; deadline?: number }): Promise<Commitment>;
25
29
 
26
- async getDepositNftsFee(nfts: string[]) {
27
- return new ReviewFee({ chain: -4 });
28
- }
30
+ abstract fetchBalance(chain: number, address: string): Promise<bigint>;
31
+ abstract fetchBalances(chain?: number, whitelist?: string[]): Promise<Record<string, bigint>>;
29
32
 
30
- async transferNft(nftId: string, receiver: string) {
31
- // TODO
33
+ async executeIntents(intents: Record<string, any>[], hashes: string[] = []) {
34
+ const signed = await this.signIntents(intents);
35
+ return await Intents.publishSignedIntents([signed], hashes);
32
36
  }
33
37
 
34
- async getTranferNftFee(nftId: string, receiver: string) {
35
- return new ReviewFee({ chain: -4 });
38
+ get icon() {
39
+ return this.connector?.icon;
36
40
  }
37
41
 
38
- async getNfts(onLoad: (nfts: string[]) => void) {
39
- // TODO
42
+ get intents() {
43
+ return new Intents(this.connector.wibe3).attachWallet(this);
40
44
  }
41
45
 
42
- abstract transferFee(token: Token, receiver: string, amount: bigint): Promise<ReviewFee>;
43
- abstract transfer(args: { token: Token; receiver: string; amount: bigint; comment?: string; gasFee?: ReviewFee }): Promise<string>;
44
-
45
- abstract fetchBalance(chain: number, address: string): Promise<bigint>;
46
- abstract fetchBalances(chain?: number, whitelist?: string[]): Promise<Record<string, bigint>>;
47
-
48
- abstract signIntents(intents: Record<string, any>[], options?: { nonce?: Uint8Array; deadline?: number }): Promise<Commitment>;
49
-
50
46
  async auth(intents?: Record<string, any>[]): Promise<string> {
51
47
  return openAuthPopup(this, async () => {
52
48
  const seed = hex.encode(new Uint8Array(window.crypto.getRandomValues(new Uint8Array(32))));
@@ -57,6 +53,11 @@ export abstract class OmniWallet {
57
53
  });
58
54
  }
59
55
 
56
+ async pay({ token, amount, recipient, paymentId }: { token: OmniToken; amount: number; recipient: string; paymentId: string }) {
57
+ const nonce = new Uint8Array(sha256(new TextEncoder().encode(paymentId))).slice(0, 32);
58
+ return this.intents.attachNonce(nonce).transfer({ recipient, token, amount }).execute();
59
+ }
60
+
60
61
  async waitUntilBalance(need: Record<string, bigint>, receiver: string, attempts = 0) {
61
62
  if (attempts > 120) throw "Balance is not enough";
62
63
  const assets = Object.keys(need) as string[];