mainnet-js 2.7.23 → 2.7.25

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 (36) hide show
  1. package/dist/index.html +1 -1
  2. package/dist/{mainnet-2.7.23.js → mainnet-2.7.25.js} +6 -16
  3. package/dist/module/network/ElectrumNetworkProvider.d.ts +0 -6
  4. package/dist/module/network/ElectrumNetworkProvider.d.ts.map +1 -1
  5. package/dist/module/network/ElectrumNetworkProvider.js +3 -43
  6. package/dist/module/network/ElectrumNetworkProvider.js.map +1 -1
  7. package/dist/module/util/index.d.ts +0 -1
  8. package/dist/module/util/index.d.ts.map +1 -1
  9. package/dist/module/util/index.js +0 -1
  10. package/dist/module/util/index.js.map +1 -1
  11. package/dist/module/wallet/Base.d.ts +7 -7
  12. package/dist/module/wallet/Base.d.ts.map +1 -1
  13. package/dist/module/wallet/Base.js +5 -0
  14. package/dist/module/wallet/Base.js.map +1 -1
  15. package/dist/module/wallet/Wif.d.ts +22 -13
  16. package/dist/module/wallet/Wif.d.ts.map +1 -1
  17. package/dist/module/wallet/Wif.js +56 -5
  18. package/dist/module/wallet/Wif.js.map +1 -1
  19. package/dist/module/wallet/enum.d.ts +1 -0
  20. package/dist/module/wallet/enum.d.ts.map +1 -1
  21. package/dist/module/wallet/enum.js +1 -0
  22. package/dist/module/wallet/enum.js.map +1 -1
  23. package/dist/tsconfig.tsbuildinfo +1 -1
  24. package/package.json +1 -1
  25. package/src/network/ElectrumNetworkProvider.ts +3 -52
  26. package/src/util/derivePublicKeyHash.test.ts +1 -0
  27. package/src/util/index.ts +0 -1
  28. package/src/wallet/Base.ts +12 -7
  29. package/src/wallet/Wif.ts +81 -18
  30. package/src/wallet/enum.ts +1 -0
  31. package/dist/module/util/walletConnect.d.ts +0 -22
  32. package/dist/module/util/walletConnect.d.ts.map +0 -1
  33. package/dist/module/util/walletConnect.js +0 -57
  34. package/dist/module/util/walletConnect.js.map +0 -1
  35. package/src/util/walletConnect.test.ts +0 -115
  36. package/src/util/walletConnect.ts +0 -156
package/src/wallet/Wif.ts CHANGED
@@ -1,5 +1,10 @@
1
1
  //#region Imports
2
- import { encodeHdPublicKey, HdKeyNetwork, secp256k1 } from "@bitauth/libauth";
2
+ import {
3
+ encodeHdPublicKey,
4
+ HdKeyNetwork,
5
+ hexToBin,
6
+ secp256k1,
7
+ } from "@bitauth/libauth";
3
8
 
4
9
  import {
5
10
  binToHex,
@@ -54,20 +59,20 @@ import { BaseWallet } from "./Base.js";
54
59
  * Class to manage a bitcoin cash wallet.
55
60
  */
56
61
  export class Wallet extends BaseWallet {
57
- declare provider: ElectrumNetworkProvider;
58
- declare cashaddr: string;
59
- declare tokenaddr: string;
60
- derivationPath: string = Config.DefaultParentDerivationPath + "/0/0";
61
- parentDerivationPath: string = Config.DefaultParentDerivationPath;
62
- mnemonic!: string;
63
- parentXPubKey!: string;
64
- privateKey!: Uint8Array;
65
- publicKeyCompressed!: Uint8Array;
66
- privateKeyWif!: string;
67
- publicKey!: Uint8Array;
68
- declare publicKeyHash: Uint8Array;
62
+ declare readonly provider: ElectrumNetworkProvider;
63
+ declare readonly cashaddr: string;
64
+ declare readonly tokenaddr: string;
65
+ readonly derivationPath: string = Config.DefaultParentDerivationPath + "/0/0";
66
+ readonly parentDerivationPath: string = Config.DefaultParentDerivationPath;
67
+ readonly mnemonic!: string;
68
+ readonly parentXPubKey!: string;
69
+ readonly privateKey!: Uint8Array;
70
+ readonly publicKeyCompressed!: Uint8Array;
71
+ readonly privateKeyWif!: string;
72
+ readonly publicKey!: Uint8Array;
73
+ declare readonly publicKeyHash: Uint8Array;
69
74
  declare name: string;
70
- static signedMessage: SignedMessageI = new SignedMessage();
75
+ static readonly signedMessage: SignedMessageI = new SignedMessage();
71
76
 
72
77
  //#region Accessors
73
78
  // Get mnemonic and derivation path for wallet
@@ -141,6 +146,7 @@ export class Wallet extends BaseWallet {
141
146
  ) {
142
147
  super(network);
143
148
  this.name = name;
149
+ // @ts-ignore
144
150
  this.walletType = walletType;
145
151
  }
146
152
 
@@ -159,6 +165,20 @@ export class Wallet extends BaseWallet {
159
165
  return new this().fromId(walletId) as InstanceType<T>;
160
166
  }
161
167
 
168
+ /**
169
+ * fromPrivateKey - create a wallet using the private key supplied in hex or Uint8Array
170
+ *
171
+ * @param wif WIF encoded private key string
172
+ *
173
+ * @returns instantiated wallet
174
+ */
175
+ public static async fromPrivateKey<T extends typeof Wallet>(
176
+ this: T,
177
+ privateKey: string | Uint8Array
178
+ ): Promise<InstanceType<T>> {
179
+ return new this().fromPrivateKey(privateKey) as InstanceType<T>;
180
+ }
181
+
162
182
  /**
163
183
  * fromWIF - create a wallet using the private key supplied in `Wallet Import Format`
164
184
  *
@@ -229,6 +249,7 @@ export class Wallet extends BaseWallet {
229
249
 
230
250
  private async _generateWif() {
231
251
  if (!this.privateKey) {
252
+ // @ts-ignore
232
253
  this.privateKey = generatePrivateKey(
233
254
  () => generateRandomBytes(32) as Uint8Array
234
255
  );
@@ -237,12 +258,14 @@ export class Wallet extends BaseWallet {
237
258
  }
238
259
 
239
260
  private async _generateMnemonic() {
261
+ // @ts-ignore
240
262
  this.mnemonic = generateMnemonic(Config.getWordlist());
241
263
  if (this.mnemonic.length == 0)
242
264
  throw Error("refusing to create wallet from empty mnemonic");
243
265
  const seed = mnemonicToSeedSync(this.mnemonic);
244
266
  checkForEmptySeed(seed);
245
267
  const network = this.isTestnet ? "testnet" : "mainnet";
268
+ // @ts-ignore
246
269
  this.parentXPubKey = getXPubKey(seed, this.parentDerivationPath, network);
247
270
 
248
271
  const hdNode = deriveHdPrivateNodeFromSeed(seed, {
@@ -254,8 +277,10 @@ export class Wallet extends BaseWallet {
254
277
  if (typeof zerothChild === "string") {
255
278
  throw Error(zerothChild);
256
279
  }
280
+ // @ts-ignore
257
281
  this.privateKey = zerothChild.privateKey;
258
282
 
283
+ // @ts-ignore
259
284
  this.walletType = WalletTypeEnum.Seed;
260
285
  return await this.deriveInfo();
261
286
  }
@@ -270,10 +295,13 @@ export class Wallet extends BaseWallet {
270
295
 
271
296
  // "wif:regtest:cNfsPtqN2bMRS7vH5qd8tR8GMvgXyL5BjnGAKgZ8DYEiCrCCQcP6"
272
297
  switch (walletType) {
273
- case "wif":
298
+ case WalletTypeEnum.PrivateKey:
299
+ return this.fromPrivateKey(arg1);
300
+
301
+ case WalletTypeEnum.Wif:
274
302
  return this.fromWIF(arg1);
275
303
 
276
- case "watch":
304
+ case WalletTypeEnum.Watch:
277
305
  if (arg2) {
278
306
  // watch:testnet:bchtest:qq1234567
279
307
  return this.watchOnly(`${arg1}:${arg2}`);
@@ -281,7 +309,7 @@ export class Wallet extends BaseWallet {
281
309
  // watch:testnet:qq1234567
282
310
  return this.watchOnly(`${arg1}`);
283
311
 
284
- case "named":
312
+ case WalletTypeEnum.Named:
285
313
  if (arg2) {
286
314
  // named:testnet:wallet_1:my_database
287
315
  return this.named(arg1, arg2);
@@ -290,7 +318,7 @@ export class Wallet extends BaseWallet {
290
318
  return this.named(arg1);
291
319
  }
292
320
 
293
- case "seed":
321
+ case WalletTypeEnum.Seed:
294
322
  if (arg2) {
295
323
  // seed:testnet:table later ... stove kitten pluck:m/44'/0'/0'/0/0
296
324
  return this.fromSeed(arg1, arg2);
@@ -320,6 +348,7 @@ export class Wallet extends BaseWallet {
320
348
  mnemonic: string,
321
349
  derivationPath?: string
322
350
  ): Promise<this> {
351
+ // @ts-ignore
323
352
  this.mnemonic = mnemonic.trim().toLowerCase();
324
353
 
325
354
  if (this.mnemonic.length == 0)
@@ -331,11 +360,13 @@ export class Wallet extends BaseWallet {
331
360
  throwErrors: true,
332
361
  });
333
362
  if (derivationPath) {
363
+ // @ts-ignore
334
364
  this.derivationPath = derivationPath;
335
365
 
336
366
  // If the derivation path is for the first account child, set the parent derivation path
337
367
  const path = derivationPath.split("/");
338
368
  if (path.slice(-2).join("/") == "0/0") {
369
+ // @ts-ignore
339
370
  this.parentDerivationPath = path.slice(0, -2).join("/");
340
371
  }
341
372
  }
@@ -344,15 +375,18 @@ export class Wallet extends BaseWallet {
344
375
  if (typeof zerothChild === "string") {
345
376
  throw Error(zerothChild);
346
377
  }
378
+ // @ts-ignore
347
379
  this.privateKey = zerothChild.privateKey;
348
380
 
349
381
  const network = this.isTestnet ? "testnet" : "mainnet";
382
+ // @ts-ignore
350
383
  this.parentXPubKey = await getXPubKey(
351
384
  seed,
352
385
  this.parentDerivationPath,
353
386
  network
354
387
  );
355
388
 
389
+ // @ts-ignore
356
390
  this.walletType = WalletTypeEnum.Seed;
357
391
  await this.deriveInfo();
358
392
  return this;
@@ -406,6 +440,22 @@ export class Wallet extends BaseWallet {
406
440
  });
407
441
  }
408
442
 
443
+ // Initialize wallet from private key in hex or Uint8Array
444
+ protected async fromPrivateKey(
445
+ privateKey: string | Uint8Array
446
+ ): Promise<this> {
447
+ if (typeof privateKey === "string") {
448
+ privateKey = hexToBin(privateKey);
449
+ }
450
+
451
+ // @ts-ignore
452
+ this.privateKey = privateKey;
453
+ // @ts-ignore
454
+ this.walletType = WalletTypeEnum.PrivateKey;
455
+ await this.deriveInfo();
456
+ return this;
457
+ }
458
+
409
459
  // Initialize wallet from Wallet Import Format
410
460
  protected async fromWIF(secret: string): Promise<this> {
411
461
  checkWifNetwork(secret, this.network);
@@ -416,8 +466,11 @@ export class Wallet extends BaseWallet {
416
466
  throw Error(wifResult as string);
417
467
  }
418
468
  let resultData: PrivateKeyI = wifResult as PrivateKeyI;
469
+ // @ts-ignore
419
470
  this.privateKey = resultData.privateKey;
471
+ // @ts-ignore
420
472
  this.privateKeyWif = secret;
473
+ // @ts-ignore
421
474
  this.walletType = WalletTypeEnum.Wif;
422
475
  await this.deriveInfo();
423
476
  return this;
@@ -447,6 +500,8 @@ export class Wallet extends BaseWallet {
447
500
  public toString() {
448
501
  if (this.name) {
449
502
  return `named:${this.network}:${this.name}`;
503
+ } else if (this.walletType == WalletTypeEnum.PrivateKey) {
504
+ return `${this.walletType}:${this.network}:${binToHex(this.privateKey)}`;
450
505
  } else if (this.walletType == WalletTypeEnum.Seed) {
451
506
  return `${this.walletType}:${this.network}:${this.mnemonic}:${this.derivationPath}`;
452
507
  } else if (this.walletType === WalletTypeEnum.Wif) {
@@ -466,6 +521,8 @@ export class Wallet extends BaseWallet {
466
521
  public toDbString() {
467
522
  if (this.walletType == WalletTypeEnum.Seed) {
468
523
  return `${this.walletType}:${this.network}:${this.mnemonic}:${this.derivationPath}`;
524
+ } else if (this.walletType == WalletTypeEnum.PrivateKey) {
525
+ return `${this.walletType}:${this.network}:${binToHex(this.privateKey)}`;
469
526
  } else if (this.walletType === WalletTypeEnum.Wif) {
470
527
  return `${this.walletType}:${this.network}:${this.privateKeyWif}`;
471
528
  } else if (this.walletType == WalletTypeEnum.Watch) {
@@ -553,6 +610,7 @@ export class Wallet extends BaseWallet {
553
610
  if (typeof publicKey === "string") {
554
611
  throw new Error(publicKey);
555
612
  }
613
+ // @ts-ignore
556
614
  this.publicKey = publicKey;
557
615
  const publicKeyCompressed = secp256k1.derivePublicKeyCompressed(
558
616
  this.privateKey
@@ -560,14 +618,19 @@ export class Wallet extends BaseWallet {
560
618
  if (typeof publicKeyCompressed === "string") {
561
619
  throw new Error(publicKeyCompressed);
562
620
  }
621
+ // @ts-ignore
563
622
  this.publicKeyCompressed = publicKeyCompressed;
564
623
  const networkType =
565
624
  this.network === NetworkType.Regtest ? NetworkType.Testnet : this.network;
625
+ // @ts-ignore
566
626
  this.privateKeyWif = encodePrivateKeyWif(this.privateKey, networkType);
567
627
  checkWifNetwork(this.privateKeyWif, this.network);
568
628
 
629
+ // @ts-ignore
569
630
  this.cashaddr = deriveCashaddr(this.privateKey, this.networkPrefix);
631
+ // @ts-ignore
570
632
  this.tokenaddr = deriveTokenaddr(this.privateKey, this.networkPrefix);
633
+ // @ts-ignore
571
634
  this.publicKeyHash = derivePublicKeyHash(this.cashaddr);
572
635
  return this;
573
636
  }
@@ -1,4 +1,5 @@
1
1
  export enum WalletTypeEnum {
2
+ Named = "named",
2
3
  Wif = "wif",
3
4
  Seed = "seed",
4
5
  Hd = "hd",
@@ -1,22 +0,0 @@
1
- import { IConnector, WcSignTransactionRequest, WcSignTransactionResponse } from "@bch-wc2/interfaces";
2
- import { BaseWallet } from "../wallet/Base.js";
3
- import { SendRequestOptionsI } from "../wallet/interface.js";
4
- import { OpReturnData, SendRequest, SendRequestArray, SendRequestType, SendResponse, TokenBurnRequest, TokenGenesisRequest, TokenMintRequest, TokenSendRequest } from "../wallet/model.js";
5
- export interface WcTransactionOptions {
6
- broadcast?: boolean;
7
- userPrompt?: string;
8
- }
9
- export declare const generateWcSignTransactionRequest: (sendResponse: SendResponse, options?: WcTransactionOptions) => WcSignTransactionRequest;
10
- export type WcSendResponse = SendResponse & WcSignTransactionResponse;
11
- export declare class WcSigner {
12
- wallet: BaseWallet;
13
- connector: IConnector;
14
- constructor(wallet: BaseWallet, connector: IConnector);
15
- private handleTransaction;
16
- send(requests: SendRequest | TokenSendRequest | OpReturnData | Array<SendRequest | TokenSendRequest | OpReturnData> | SendRequestArray[], options?: SendRequestOptionsI & WcTransactionOptions): Promise<WcSendResponse>;
17
- sendMax(cashaddr: string, options?: SendRequestOptionsI & WcTransactionOptions): Promise<WcSendResponse>;
18
- tokenGenesis(genesisRequest: TokenGenesisRequest, sendRequests?: SendRequestType | SendRequestType[], options?: SendRequestOptionsI & WcTransactionOptions): Promise<WcSendResponse>;
19
- tokenMint(tokenId: string, mintRequests: TokenMintRequest | Array<TokenMintRequest>, deductTokenAmount?: boolean, options?: SendRequestOptionsI & WcTransactionOptions): Promise<WcSendResponse>;
20
- tokenBurn(burnRequest: TokenBurnRequest, message?: string, options?: SendRequestOptionsI & WcTransactionOptions): Promise<WcSendResponse>;
21
- }
22
- //# sourceMappingURL=walletConnect.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"walletConnect.d.ts","sourceRoot":"","sources":["../../../src/util/walletConnect.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,UAAU,EACV,wBAAwB,EACxB,yBAAyB,EAC1B,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,EACL,YAAY,EACZ,WAAW,EACX,gBAAgB,EAChB,eAAe,EACf,YAAY,EACZ,gBAAgB,EAChB,mBAAmB,EACnB,gBAAgB,EAChB,gBAAgB,EACjB,MAAM,oBAAoB,CAAC;AAE5B,MAAM,WAAW,oBAAoB;IACnC,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,eAAO,MAAM,gCAAgC,iBAC7B,YAAY,YAChB,oBAAoB,KAC7B,wBAYF,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG,YAAY,GAAG,yBAAyB,CAAC;AAKtE,qBAAa,QAAQ;IACZ,MAAM,EAAG,UAAU,CAAC;IACpB,SAAS,EAAE,UAAU,CAAC;gBAEjB,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,UAAU;YASvC,iBAAiB;IA4BzB,IAAI,CACR,QAAQ,EACJ,WAAW,GACX,gBAAgB,GAChB,YAAY,GACZ,KAAK,CAAC,WAAW,GAAG,gBAAgB,GAAG,YAAY,CAAC,GACpD,gBAAgB,EAAE,EACtB,OAAO,CAAC,EAAE,mBAAmB,GAAG,oBAAoB,GACnD,OAAO,CAAC,cAAc,CAAC;IASb,OAAO,CAClB,QAAQ,EAAE,MAAM,EAChB,OAAO,CAAC,EAAE,mBAAmB,GAAG,oBAAoB,GACnD,OAAO,CAAC,cAAc,CAAC;IASpB,YAAY,CAChB,cAAc,EAAE,mBAAmB,EACnC,YAAY,GAAE,eAAe,GAAG,eAAe,EAAO,EACtD,OAAO,CAAC,EAAE,mBAAmB,GAAG,oBAAoB,GACnD,OAAO,CAAC,cAAc,CAAC;IASb,SAAS,CACpB,OAAO,EAAE,MAAM,EACf,YAAY,EAAE,gBAAgB,GAAG,KAAK,CAAC,gBAAgB,CAAC,EACxD,iBAAiB,GAAE,OAAe,EAClC,OAAO,CAAC,EAAE,mBAAmB,GAAG,oBAAoB,GACnD,OAAO,CAAC,cAAc,CAAC;IASb,SAAS,CACpB,WAAW,EAAE,gBAAgB,EAC7B,OAAO,CAAC,EAAE,MAAM,EAChB,OAAO,CAAC,EAAE,mBAAmB,GAAG,oBAAoB,GACnD,OAAO,CAAC,cAAc,CAAC;CAQ3B"}
@@ -1,57 +0,0 @@
1
- export const generateWcSignTransactionRequest = (sendResponse, options) => {
2
- if (!sendResponse.unsignedTransaction || !sendResponse.sourceOutputs) {
3
- throw new Error("SendResponse does not contain an unsigned transaction or source outputs");
4
- }
5
- return {
6
- ...options,
7
- transaction: sendResponse.unsignedTransaction,
8
- sourceOutputs: sendResponse.sourceOutputs,
9
- };
10
- };
11
- // A wrapper class for signing transactions with WalletConnect
12
- // Interfaces are the same as the original wallet methods
13
- // Meant to be a drop-in replacement for the original wallet methods
14
- export class WcSigner {
15
- constructor(wallet, connector) {
16
- if (!wallet || !connector) {
17
- throw new Error("Invalid wallet or connector");
18
- }
19
- this.wallet = wallet;
20
- this.connector = connector;
21
- }
22
- async handleTransaction(walletMethod, walletArgs, options, errorMsg = "Failed to sign transaction, user may have rejected the request") {
23
- const response = await walletMethod.apply(this.wallet, [
24
- ...walletArgs,
25
- { queryBalance: false, ...options, buildUnsigned: true },
26
- ]);
27
- const signRequest = generateWcSignTransactionRequest(response, {
28
- // ask to broadcast the transaction by default
29
- broadcast: true,
30
- ...options,
31
- });
32
- const signResponse = await this.connector.signTransaction(signRequest);
33
- if (!signResponse) {
34
- throw new Error(errorMsg);
35
- }
36
- return {
37
- ...response,
38
- ...signResponse,
39
- };
40
- }
41
- async send(requests, options) {
42
- return this.handleTransaction(this.wallet.send, [requests], options, "Failed to sign send transaction, user may have rejected the request");
43
- }
44
- async sendMax(cashaddr, options) {
45
- return this.handleTransaction(this.wallet.sendMax, [cashaddr], options, "Failed to sign send max transaction, user may have rejected the request");
46
- }
47
- async tokenGenesis(genesisRequest, sendRequests = [], options) {
48
- return this.handleTransaction(this.wallet.tokenGenesis, [genesisRequest, sendRequests], options, "Failed to sign token genesis transaction, user may have rejected the request");
49
- }
50
- async tokenMint(tokenId, mintRequests, deductTokenAmount = false, options) {
51
- return this.handleTransaction(this.wallet.tokenMint, [tokenId, mintRequests, deductTokenAmount], options, "Failed to sign token mint transaction, user may have rejected the request");
52
- }
53
- async tokenBurn(burnRequest, message, options) {
54
- return this.handleTransaction(this.wallet.tokenBurn, [burnRequest, message], options, "Failed to sign token burn transaction, user may have rejected the request");
55
- }
56
- }
57
- //# sourceMappingURL=walletConnect.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"walletConnect.js","sourceRoot":"","sources":["../../../src/util/walletConnect.ts"],"names":[],"mappings":"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"}
@@ -1,115 +0,0 @@
1
- import { binToHex } from "@bitauth/libauth";
2
- import { RegTestWallet } from "../wallet/Wif";
3
- import { generateWcSignTransactionRequest, WcSigner } from "./walletConnect";
4
- import { WcSignTransactionRequest } from "@bch-wc2/interfaces";
5
- import {
6
- PrivKeyConnector,
7
- signWcTransaction,
8
- } from "@bch-wc2/privkey-connector";
9
- import { NetworkProvider } from "../network";
10
-
11
- export const processWcSignTransactionRequest = async (
12
- wcTransactionRequest: WcSignTransactionRequest,
13
- signingInfo: {
14
- privateKey: Uint8Array;
15
- pubkeyCompressed?: Uint8Array;
16
- walletLockingBytecodeHex?: string;
17
- },
18
- networkProvider?: NetworkProvider
19
- ): Promise<string> => {
20
- const signedTransaction = signWcTransaction(
21
- wcTransactionRequest,
22
- signingInfo
23
- );
24
- const hexSignedTransaction = binToHex(signedTransaction);
25
-
26
- if (wcTransactionRequest.broadcast) {
27
- if (!networkProvider) {
28
- throw new Error(
29
- "NetworkProvider is required for broadcasting transactions"
30
- );
31
- }
32
-
33
- await networkProvider.sendRawTransaction(hexSignedTransaction);
34
- }
35
-
36
- return hexSignedTransaction;
37
- };
38
-
39
- describe("Wallet Connect Utility Functions", () => {
40
- it("should generate a valid WcSignTransactionRequest object and sign it", async () => {
41
- const wallet = await RegTestWallet.fromId(process.env.ALICE_ID!);
42
-
43
- const bob = await RegTestWallet.newRandom();
44
-
45
- const sendResponse = await wallet.send(
46
- {
47
- cashaddr: bob.cashaddr,
48
- value: 5000,
49
- unit: "satoshi",
50
- },
51
- {
52
- buildUnsigned: true,
53
- queryBalance: false,
54
- }
55
- );
56
-
57
- const request = generateWcSignTransactionRequest(sendResponse, {
58
- broadcast: true,
59
- userPrompt: "Confirm transaction",
60
- });
61
-
62
- await expect(
63
- processWcSignTransactionRequest(
64
- request,
65
- {
66
- privateKey: wallet.privateKey,
67
- pubkeyCompressed: wallet.publicKeyCompressed,
68
- },
69
- undefined
70
- )
71
- ).rejects.toThrow(
72
- "NetworkProvider is required for broadcasting transactions"
73
- );
74
-
75
- await processWcSignTransactionRequest(
76
- request,
77
- {
78
- privateKey: wallet.privateKey,
79
- pubkeyCompressed: wallet.publicKeyCompressed,
80
- },
81
- wallet.provider
82
- );
83
-
84
- expect(await bob.getBalance("sat")).toBe(5000);
85
- });
86
-
87
- it("should sign a transaction with WcSigner", async () => {
88
- const wallet = await RegTestWallet.fromId(process.env.ALICE_ID!);
89
- const bob = await RegTestWallet.newRandom();
90
-
91
- const connector = new PrivKeyConnector({
92
- privateKey: wallet.privateKey,
93
- pubkeyCompressed: wallet.publicKeyCompressed,
94
- networkProvider: wallet.provider,
95
- });
96
-
97
- const wcSigner = new WcSigner(wallet, connector);
98
-
99
- const sendResponse = await wcSigner.send(
100
- {
101
- cashaddr: bob.cashaddr,
102
- value: 5000,
103
- unit: "satoshi",
104
- },
105
- {
106
- userPrompt: "Confirm transaction",
107
- broadcast: true,
108
- }
109
- );
110
-
111
- expect(sendResponse.signedTransaction).toBeDefined();
112
-
113
- expect(await bob.getBalance("sat")).toBe(5000);
114
- });
115
- });
@@ -1,156 +0,0 @@
1
- import {
2
- IConnector,
3
- WcSignTransactionRequest,
4
- WcSignTransactionResponse,
5
- } from "@bch-wc2/interfaces";
6
- import { BaseWallet } from "../wallet/Base.js";
7
- import { SendRequestOptionsI } from "../wallet/interface.js";
8
- import {
9
- OpReturnData,
10
- SendRequest,
11
- SendRequestArray,
12
- SendRequestType,
13
- SendResponse,
14
- TokenBurnRequest,
15
- TokenGenesisRequest,
16
- TokenMintRequest,
17
- TokenSendRequest,
18
- } from "../wallet/model.js";
19
-
20
- export interface WcTransactionOptions {
21
- broadcast?: boolean;
22
- userPrompt?: string;
23
- }
24
-
25
- export const generateWcSignTransactionRequest = (
26
- sendResponse: SendResponse,
27
- options?: WcTransactionOptions
28
- ): WcSignTransactionRequest => {
29
- if (!sendResponse.unsignedTransaction || !sendResponse.sourceOutputs) {
30
- throw new Error(
31
- "SendResponse does not contain an unsigned transaction or source outputs"
32
- );
33
- }
34
-
35
- return {
36
- ...options,
37
- transaction: sendResponse.unsignedTransaction,
38
- sourceOutputs: sendResponse.sourceOutputs,
39
- };
40
- };
41
-
42
- export type WcSendResponse = SendResponse & WcSignTransactionResponse;
43
-
44
- // A wrapper class for signing transactions with WalletConnect
45
- // Interfaces are the same as the original wallet methods
46
- // Meant to be a drop-in replacement for the original wallet methods
47
- export class WcSigner {
48
- public wallet!: BaseWallet;
49
- public connector: IConnector;
50
-
51
- constructor(wallet: BaseWallet, connector: IConnector) {
52
- if (!wallet || !connector) {
53
- throw new Error("Invalid wallet or connector");
54
- }
55
-
56
- this.wallet = wallet;
57
- this.connector = connector;
58
- }
59
-
60
- private async handleTransaction(
61
- walletMethod: (...args: any[]) => Promise<SendResponse>,
62
- walletArgs: any[],
63
- options?: SendRequestOptionsI & WcTransactionOptions,
64
- errorMsg: string = "Failed to sign transaction, user may have rejected the request"
65
- ): Promise<WcSendResponse> {
66
- const response = await walletMethod.apply(this.wallet, [
67
- ...walletArgs,
68
- { queryBalance: false, ...options, buildUnsigned: true },
69
- ]);
70
-
71
- const signRequest = generateWcSignTransactionRequest(response, {
72
- // ask to broadcast the transaction by default
73
- broadcast: true,
74
- ...options,
75
- });
76
- const signResponse = await this.connector.signTransaction(signRequest);
77
-
78
- if (!signResponse) {
79
- throw new Error(errorMsg);
80
- }
81
-
82
- return {
83
- ...response,
84
- ...signResponse,
85
- };
86
- }
87
-
88
- async send(
89
- requests:
90
- | SendRequest
91
- | TokenSendRequest
92
- | OpReturnData
93
- | Array<SendRequest | TokenSendRequest | OpReturnData>
94
- | SendRequestArray[],
95
- options?: SendRequestOptionsI & WcTransactionOptions
96
- ): Promise<WcSendResponse> {
97
- return this.handleTransaction(
98
- this.wallet.send,
99
- [requests],
100
- options,
101
- "Failed to sign send transaction, user may have rejected the request"
102
- );
103
- }
104
-
105
- public async sendMax(
106
- cashaddr: string,
107
- options?: SendRequestOptionsI & WcTransactionOptions
108
- ): Promise<WcSendResponse> {
109
- return this.handleTransaction(
110
- this.wallet.sendMax,
111
- [cashaddr],
112
- options,
113
- "Failed to sign send max transaction, user may have rejected the request"
114
- );
115
- }
116
-
117
- async tokenGenesis(
118
- genesisRequest: TokenGenesisRequest,
119
- sendRequests: SendRequestType | SendRequestType[] = [],
120
- options?: SendRequestOptionsI & WcTransactionOptions
121
- ): Promise<WcSendResponse> {
122
- return this.handleTransaction(
123
- this.wallet.tokenGenesis,
124
- [genesisRequest, sendRequests],
125
- options,
126
- "Failed to sign token genesis transaction, user may have rejected the request"
127
- );
128
- }
129
-
130
- public async tokenMint(
131
- tokenId: string,
132
- mintRequests: TokenMintRequest | Array<TokenMintRequest>,
133
- deductTokenAmount: boolean = false,
134
- options?: SendRequestOptionsI & WcTransactionOptions
135
- ): Promise<WcSendResponse> {
136
- return this.handleTransaction(
137
- this.wallet.tokenMint,
138
- [tokenId, mintRequests, deductTokenAmount],
139
- options,
140
- "Failed to sign token mint transaction, user may have rejected the request"
141
- );
142
- }
143
-
144
- public async tokenBurn(
145
- burnRequest: TokenBurnRequest,
146
- message?: string,
147
- options?: SendRequestOptionsI & WcTransactionOptions
148
- ): Promise<WcSendResponse> {
149
- return this.handleTransaction(
150
- this.wallet.tokenBurn,
151
- [burnRequest, message],
152
- options,
153
- "Failed to sign token burn transaction, user may have rejected the request"
154
- );
155
- }
156
- }