@babylonlabs-io/ts-sdk 0.27.0 → 0.28.0

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 (87) hide show
  1. package/dist/{buildAndBroadcastRefund-BzYJv-Fv.js → buildAndBroadcastRefund-Cc4-L7gX.js} +32 -31
  2. package/dist/buildAndBroadcastRefund-Cc4-L7gX.js.map +1 -0
  3. package/dist/buildAndBroadcastRefund-OoaQaNqn.cjs +2 -0
  4. package/dist/buildAndBroadcastRefund-OoaQaNqn.cjs.map +1 -0
  5. package/dist/deriveVaultRoot-B4gnRbW_.cjs +2 -0
  6. package/dist/deriveVaultRoot-B4gnRbW_.cjs.map +1 -0
  7. package/dist/{context-CClNOyD3.js → deriveVaultRoot-DAMZDqg-.js} +495 -541
  8. package/dist/deriveVaultRoot-DAMZDqg-.js.map +1 -0
  9. package/dist/index.cjs +1 -1
  10. package/dist/index.js +55 -55
  11. package/dist/psbtInputFields-CB8hqjQ5.cjs +2 -0
  12. package/dist/psbtInputFields-CB8hqjQ5.cjs.map +1 -0
  13. package/dist/{psbtInputFields-C3dqKWjQ.js → psbtInputFields-DeTFSJOq.js} +70 -64
  14. package/dist/psbtInputFields-DeTFSJOq.js.map +1 -0
  15. package/dist/sha2-CPdTLk1u.js +280 -0
  16. package/dist/sha2-CPdTLk1u.js.map +1 -0
  17. package/dist/sha2-CsTynrfJ.cjs +2 -0
  18. package/dist/sha2-CsTynrfJ.cjs.map +1 -0
  19. package/dist/shared/index.cjs.map +1 -1
  20. package/dist/shared/index.js.map +1 -1
  21. package/dist/shared/wallets/index.d.ts +2 -1
  22. package/dist/shared/wallets/index.d.ts.map +1 -1
  23. package/dist/shared/wallets/interfaces/BitcoinWallet.d.ts +8 -0
  24. package/dist/shared/wallets/interfaces/BitcoinWallet.d.ts.map +1 -1
  25. package/dist/signing-BZigafm0.js.map +1 -1
  26. package/dist/signing-DHSXjhLM.cjs.map +1 -1
  27. package/dist/tbv/core/clients/index.cjs +1 -1
  28. package/dist/tbv/core/clients/index.js +2 -2
  29. package/dist/tbv/core/index.cjs +1 -1
  30. package/dist/tbv/core/index.js +52 -52
  31. package/dist/tbv/core/services/deposit/peginState.d.ts +1 -1
  32. package/dist/tbv/core/services/deposit/peginState.d.ts.map +1 -1
  33. package/dist/tbv/core/services/index.cjs +1 -1
  34. package/dist/tbv/core/services/index.js +1 -1
  35. package/dist/tbv/core/utils/index.cjs +1 -1
  36. package/dist/tbv/core/utils/index.js +1 -1
  37. package/dist/tbv/core/utils/utxo/reservation.d.ts +5 -0
  38. package/dist/tbv/core/utils/utxo/reservation.d.ts.map +1 -1
  39. package/dist/tbv/core/vault-secrets/__tests__/deriveVaultRoot.test.d.ts +13 -0
  40. package/dist/tbv/core/vault-secrets/__tests__/deriveVaultRoot.test.d.ts.map +1 -0
  41. package/dist/tbv/core/vault-secrets/context.d.ts +9 -0
  42. package/dist/tbv/core/vault-secrets/context.d.ts.map +1 -1
  43. package/dist/tbv/core/vault-secrets/deriveVaultRoot.d.ts +56 -0
  44. package/dist/tbv/core/vault-secrets/deriveVaultRoot.d.ts.map +1 -0
  45. package/dist/tbv/core/vault-secrets/expand.d.ts +18 -3
  46. package/dist/tbv/core/vault-secrets/expand.d.ts.map +1 -1
  47. package/dist/tbv/core/vault-secrets/index.d.ts +6 -3
  48. package/dist/tbv/core/vault-secrets/index.d.ts.map +1 -1
  49. package/dist/tbv/core/wots/blockDerivation.d.ts +20 -24
  50. package/dist/tbv/core/wots/blockDerivation.d.ts.map +1 -1
  51. package/dist/tbv/core/wots/errors.d.ts +3 -1
  52. package/dist/tbv/core/wots/errors.d.ts.map +1 -1
  53. package/dist/tbv/core/wots/index.d.ts +1 -2
  54. package/dist/tbv/core/wots/index.d.ts.map +1 -1
  55. package/dist/tbv/index.cjs +1 -1
  56. package/dist/tbv/index.js +52 -52
  57. package/dist/testing/MockBitcoinWallet.d.ts +9 -3
  58. package/dist/testing/MockBitcoinWallet.d.ts.map +1 -1
  59. package/dist/testing/index.cjs +1 -1
  60. package/dist/testing/index.cjs.map +1 -1
  61. package/dist/testing/index.js +65 -54
  62. package/dist/testing/index.js.map +1 -1
  63. package/dist/types-CQ86O7NX.js +650 -0
  64. package/dist/types-CQ86O7NX.js.map +1 -0
  65. package/dist/types-CcwaEPE1.cjs +2 -0
  66. package/dist/types-CcwaEPE1.cjs.map +1 -0
  67. package/dist/{vault-registry-reader-CpCOte7w.js → vault-registry-reader-CshEgmS0.js} +31 -30
  68. package/dist/{vault-registry-reader-CpCOte7w.js.map → vault-registry-reader-CshEgmS0.js.map} +1 -1
  69. package/dist/vault-registry-reader-_2BjSjoN.cjs +2 -0
  70. package/dist/{vault-registry-reader-BizmBSBV.cjs.map → vault-registry-reader-_2BjSjoN.cjs.map} +1 -1
  71. package/package.json +3 -3
  72. package/dist/buildAndBroadcastRefund-BEASMFsz.cjs +0 -2
  73. package/dist/buildAndBroadcastRefund-BEASMFsz.cjs.map +0 -1
  74. package/dist/buildAndBroadcastRefund-BzYJv-Fv.js.map +0 -1
  75. package/dist/context-BSdcD4J_.cjs +0 -2
  76. package/dist/context-BSdcD4J_.cjs.map +0 -1
  77. package/dist/context-CClNOyD3.js.map +0 -1
  78. package/dist/psbtInputFields-C3dqKWjQ.js.map +0 -1
  79. package/dist/psbtInputFields-DhGm77bP.cjs +0 -2
  80. package/dist/psbtInputFields-DhGm77bP.cjs.map +0 -1
  81. package/dist/sha2-1XZuToHP.cjs +0 -2
  82. package/dist/sha2-1XZuToHP.cjs.map +0 -1
  83. package/dist/sha2-ZzfZqQSw.js +0 -1123
  84. package/dist/sha2-ZzfZqQSw.js.map +0 -1
  85. package/dist/tbv/core/wots/deriveWotsPkHash.d.ts +0 -9
  86. package/dist/tbv/core/wots/deriveWotsPkHash.d.ts.map +0 -1
  87. package/dist/vault-registry-reader-BizmBSBV.cjs +0 -2
@@ -1,16 +1,23 @@
1
- var q = Object.defineProperty;
2
- var h = (n, i, s) => i in n ? q(n, i, { enumerable: !0, configurable: !0, writable: !0, value: s }) : n[i] = s;
3
- var t = (n, i, s) => h(n, typeof i != "symbol" ? i + "" : i, s);
1
+ var d = Object.defineProperty;
2
+ var l = (e, t, n) => t in e ? d(e, t, { enumerable: !0, configurable: !0, writable: !0, value: n }) : e[t] = n;
3
+ var o = (e, t, n) => l(e, typeof t != "symbol" ? t + "" : t, n);
4
+ import { s as g } from "../sha2-CPdTLk1u.js";
4
5
  import { Buffer as r } from "buffer";
5
- import { BitcoinNetworks as c } from "../shared/index.js";
6
- class f {
7
- constructor(i = {}) {
8
- t(this, "config");
6
+ import { u as f } from "../bitcoin-B-Y0DlqR.js";
7
+ import { BitcoinNetworks as q } from "../shared/index.js";
8
+ const h = async (e, t) => {
9
+ const n = new TextEncoder(), s = n.encode(e), i = n.encode(t), a = new Uint8Array(4 + s.length + 4 + i.length), c = new DataView(a.buffer);
10
+ return c.setUint32(0, s.length), a.set(s, 4), c.setUint32(4 + s.length, i.length), a.set(i, 4 + s.length + 4), f(g(a));
11
+ };
12
+ class p {
13
+ constructor(t = {}) {
14
+ o(this, "config");
9
15
  this.config = {
10
- publicKeyHex: i.publicKeyHex || "a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b0c1d2e3f4a5b6c7d8e9f0a1b2",
11
- address: i.address || "tb1pqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqkx6jks",
12
- network: i.network ?? c.SIGNET,
13
- shouldFailSigning: i.shouldFailSigning ?? !1
16
+ publicKeyHex: t.publicKeyHex || "a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b0c1d2e3f4a5b6c7d8e9f0a1b2",
17
+ address: t.address || "tb1pqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqkx6jks",
18
+ network: t.network ?? q.SIGNET,
19
+ shouldFailSigning: t.shouldFailSigning ?? !1,
20
+ deriveContextHash: t.deriveContextHash ?? h
14
21
  };
15
22
  }
16
23
  async getPublicKeyHex() {
@@ -19,38 +26,41 @@ class f {
19
26
  async getAddress() {
20
27
  return this.config.address;
21
28
  }
22
- async signPsbt(i) {
29
+ async signPsbt(t) {
23
30
  if (this.config.shouldFailSigning)
24
31
  throw new Error("Mock signing failed");
25
- if (!i || i.length === 0)
32
+ if (!t || t.length === 0)
26
33
  throw new Error("Invalid PSBT: empty hex string");
27
- return i + "deadbeef";
34
+ return t + "deadbeef";
28
35
  }
29
- async signPsbts(i, s) {
30
- const a = [];
31
- for (const e of i) {
32
- const o = await this.signPsbt(e);
33
- a.push(o);
36
+ async signPsbts(t, n) {
37
+ const s = [];
38
+ for (const i of t) {
39
+ const a = await this.signPsbt(i);
40
+ s.push(a);
34
41
  }
35
- return a;
42
+ return s;
36
43
  }
37
- async signMessage(i, s) {
44
+ async signMessage(t, n) {
38
45
  if (this.config.shouldFailSigning)
39
46
  throw new Error("Mock signing failed");
40
- if (!i || i.length === 0)
47
+ if (!t || t.length === 0)
41
48
  throw new Error("Invalid message: empty string");
42
49
  return r.from(
43
- `mock-signature-${s}-${i}-${this.config.publicKeyHex}`
50
+ `mock-signature-${n}-${t}-${this.config.publicKeyHex}`
44
51
  ).toString("base64");
45
52
  }
46
53
  async getNetwork() {
47
54
  return this.config.network;
48
55
  }
56
+ async deriveContextHash(t, n) {
57
+ return this.config.deriveContextHash(t, n);
58
+ }
49
59
  /** Updates configuration for testing different scenarios. */
50
- updateConfig(i) {
60
+ updateConfig(t) {
51
61
  this.config = {
52
62
  ...this.config,
53
- ...i
63
+ ...t
54
64
  };
55
65
  }
56
66
  /** Resets to default configuration. */
@@ -58,56 +68,57 @@ class f {
58
68
  this.config = {
59
69
  publicKeyHex: "a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b0c1d2e3f4a5b6c7d8e9f0a1b2",
60
70
  address: "tb1pqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqkx6jks",
61
- network: c.SIGNET,
62
- shouldFailSigning: !1
71
+ network: q.SIGNET,
72
+ shouldFailSigning: !1,
73
+ deriveContextHash: h
63
74
  };
64
75
  }
65
76
  }
66
- class u {
67
- constructor(i = {}) {
77
+ class x {
78
+ constructor(t = {}) {
68
79
  // Public properties matching viem's WalletClient structure
69
- t(this, "account");
70
- t(this, "chain");
71
- t(this, "shouldFailOperations");
72
- t(this, "transactionDelay");
73
- t(this, "nonce", 0);
80
+ o(this, "account");
81
+ o(this, "chain");
82
+ o(this, "shouldFailOperations");
83
+ o(this, "transactionDelay");
84
+ o(this, "nonce", 0);
74
85
  this.account = {
75
- address: i.address || "0x742d35cc6634c0532925a3b844bc9e7595f0beb0"
86
+ address: t.address || "0x742d35cc6634c0532925a3b844bc9e7595f0beb0"
76
87
  }, this.chain = {
77
- id: i.chainId ?? 11155111
88
+ id: t.chainId ?? 11155111
78
89
  // Sepolia by default
79
- }, this.shouldFailOperations = i.shouldFailOperations ?? !1, this.transactionDelay = i.transactionDelay ?? 0, this.signMessage = this.signMessage.bind(this), this.sendTransaction = this.sendTransaction.bind(this);
90
+ }, this.shouldFailOperations = t.shouldFailOperations ?? !1, this.transactionDelay = t.transactionDelay ?? 0, this.signMessage = this.signMessage.bind(this), this.sendTransaction = this.sendTransaction.bind(this);
80
91
  }
81
- async signMessage(i) {
82
- const s = i.message, a = i.account || this.account.address;
92
+ async signMessage(t) {
93
+ const n = t.message, s = t.account || this.account.address;
83
94
  if (this.shouldFailOperations)
84
95
  throw new Error("Mock signing failed");
85
- if (!s || s.length === 0)
96
+ if (!n || n.length === 0)
86
97
  throw new Error("Invalid message: empty string");
87
- const e = `personal_sign:${s}-${a}-${this.chain.id}`;
88
- return `0x${r.from(e).toString("hex").slice(0, 130).padEnd(130, "0")}`;
98
+ const i = `personal_sign:${n}-${s}-${this.chain.id}`;
99
+ return `0x${r.from(i).toString("hex").slice(0, 130).padEnd(130, "0")}`;
89
100
  }
90
- async sendTransaction(i) {
91
- var e;
101
+ async sendTransaction(t) {
102
+ var i;
92
103
  if (this.shouldFailOperations)
93
104
  throw new Error("Mock transaction failed");
94
- if (!i.to)
105
+ if (!t.to)
95
106
  throw new Error("Invalid transaction: missing 'to' address");
96
107
  this.transactionDelay > 0 && await new Promise(
97
- (o) => setTimeout(o, this.transactionDelay)
108
+ (a) => setTimeout(a, this.transactionDelay)
98
109
  ), this.nonce++;
99
- const s = JSON.stringify({
110
+ const n = JSON.stringify({
100
111
  from: this.account.address,
101
- to: i.to,
102
- value: ((e = i.value) == null ? void 0 : e.toString()) || "0",
112
+ to: t.to,
113
+ value: ((i = t.value) == null ? void 0 : i.toString()) || "0",
103
114
  nonce: this.nonce,
104
115
  chainId: this.chain.id
105
116
  });
106
- return `0x${r.from(s).toString("hex").slice(0, 64).padEnd(64, "0")}`;
117
+ return `0x${r.from(n).toString("hex").slice(0, 64).padEnd(64, "0")}`;
107
118
  }
108
119
  /** Updates configuration for testing different scenarios. */
109
- updateConfig(i) {
110
- i.address !== void 0 && (this.account.address = i.address), i.chainId !== void 0 && (this.chain.id = i.chainId), i.shouldFailOperations !== void 0 && (this.shouldFailOperations = i.shouldFailOperations), i.transactionDelay !== void 0 && (this.transactionDelay = i.transactionDelay);
120
+ updateConfig(t) {
121
+ t.address !== void 0 && (this.account.address = t.address), t.chainId !== void 0 && (this.chain.id = t.chainId), t.shouldFailOperations !== void 0 && (this.shouldFailOperations = t.shouldFailOperations), t.transactionDelay !== void 0 && (this.transactionDelay = t.transactionDelay);
111
122
  }
112
123
  /** Resets to default configuration and nonce. */
113
124
  reset() {
@@ -119,7 +130,7 @@ class u {
119
130
  }
120
131
  }
121
132
  export {
122
- f as MockBitcoinWallet,
123
- u as MockEthereumWallet
133
+ p as MockBitcoinWallet,
134
+ x as MockEthereumWallet
124
135
  };
125
136
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../src/testing/MockBitcoinWallet.ts","../../src/testing/MockEthereumWallet.ts"],"sourcesContent":["import { Buffer } from \"buffer\";\n\nimport { BitcoinNetworks, type BitcoinNetwork } from \"../shared/wallets/interfaces\";\nimport type {\n BitcoinWallet,\n SignPsbtOptions,\n} from \"../shared/wallets/interfaces/BitcoinWallet\";\n\n/**\n * Configuration for MockBitcoinWallet.\n */\nexport interface MockBitcoinWalletConfig {\n publicKeyHex?: string;\n address?: string;\n network?: BitcoinNetwork;\n shouldFailSigning?: boolean;\n}\n\n/**\n * Mock Bitcoin wallet for testing.\n */\nexport class MockBitcoinWallet implements BitcoinWallet {\n private config: Required<MockBitcoinWalletConfig>;\n\n constructor(config: MockBitcoinWalletConfig = {}) {\n this.config = {\n publicKeyHex:\n config.publicKeyHex ||\n \"a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b0c1d2e3f4a5b6c7d8e9f0a1b2\",\n address:\n config.address ||\n \"tb1pqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqkx6jks\",\n network: config.network ?? BitcoinNetworks.SIGNET,\n shouldFailSigning: config.shouldFailSigning ?? false,\n };\n }\n\n async getPublicKeyHex(): Promise<string> {\n return this.config.publicKeyHex;\n }\n\n async getAddress(): Promise<string> {\n return this.config.address;\n }\n\n async signPsbt(psbtHex: string): Promise<string> {\n if (this.config.shouldFailSigning) {\n throw new Error(\"Mock signing failed\");\n }\n\n if (!psbtHex || psbtHex.length === 0) {\n throw new Error(\"Invalid PSBT: empty hex string\");\n }\n\n // In a real implementation, this would actually sign the PSBT\n // For the mock, we just return the input with a mock signature appended\n return psbtHex + \"deadbeef\";\n }\n\n async signPsbts(\n psbtsHexes: string[],\n _options?: SignPsbtOptions[],\n ): Promise<string[]> {\n const signedPsbts: string[] = [];\n for (const psbtHex of psbtsHexes) {\n const signedPsbt = await this.signPsbt(psbtHex);\n signedPsbts.push(signedPsbt);\n }\n return signedPsbts;\n }\n\n async signMessage(\n message: string,\n type: \"bip322-simple\" | \"ecdsa\",\n ): Promise<string> {\n if (this.config.shouldFailSigning) {\n throw new Error(\"Mock signing failed\");\n }\n\n if (!message || message.length === 0) {\n throw new Error(\"Invalid message: empty string\");\n }\n\n // In a real implementation, this would create a proper signature\n // For the mock, we return a base64-like mock signature\n const mockSignature = Buffer.from(\n `mock-signature-${type}-${message}-${this.config.publicKeyHex}`,\n ).toString(\"base64\");\n return mockSignature;\n }\n\n async getNetwork(): Promise<BitcoinNetwork> {\n return this.config.network;\n }\n\n /** Updates configuration for testing different scenarios. */\n updateConfig(updates: Partial<MockBitcoinWalletConfig>): void {\n this.config = {\n ...this.config,\n ...updates,\n };\n }\n\n /** Resets to default configuration. */\n reset(): void {\n this.config = {\n publicKeyHex:\n \"a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b0c1d2e3f4a5b6c7d8e9f0a1b2\",\n address: \"tb1pqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqkx6jks\",\n network: BitcoinNetworks.SIGNET,\n shouldFailSigning: false,\n };\n }\n}\n","import { Buffer } from \"buffer\";\nimport type { Address, Hex } from \"viem\";\n\n/**\n * Configuration for MockEthereumWallet.\n */\nexport interface MockEthereumWalletConfig {\n address?: Address;\n chainId?: number;\n shouldFailOperations?: boolean;\n transactionDelay?: number;\n}\n\n/**\n * Mock Ethereum wallet for testing.\n *\n * Provides the subset of viem's WalletClient methods used by the SDK.\n * Can be passed to functions expecting a WalletClient for testing purposes.\n */\nexport class MockEthereumWallet {\n // Public properties matching viem's WalletClient structure\n account: { address: Address };\n chain: { id: number };\n\n private shouldFailOperations: boolean;\n private transactionDelay: number;\n private nonce: number = 0;\n\n constructor(config: MockEthereumWalletConfig = {}) {\n // Use lowercase addresses to avoid EIP-55 checksum validation issues\n this.account = {\n address:\n config.address ||\n (\"0x742d35cc6634c0532925a3b844bc9e7595f0beb0\" as Address),\n };\n\n this.chain = {\n id: config.chainId ?? 11155111, // Sepolia by default\n };\n\n this.shouldFailOperations = config.shouldFailOperations ?? false;\n this.transactionDelay = config.transactionDelay ?? 0;\n\n // Bind methods to preserve 'this' context when called\n this.signMessage = this.signMessage.bind(this);\n this.sendTransaction = this.sendTransaction.bind(this);\n }\n\n async signMessage(args: { message: string; account?: Address }): Promise<Hex> {\n const message = args.message;\n const account = args.account || this.account.address;\n\n if (this.shouldFailOperations) {\n throw new Error(\"Mock signing failed\");\n }\n\n if (!message || message.length === 0) {\n throw new Error(\"Invalid message: empty string\");\n }\n\n // Generate a deterministic mock signature\n const signatureData = `personal_sign:${message}-${account}-${this.chain.id}`;\n const signature = `0x${Buffer.from(signatureData)\n .toString(\"hex\")\n .slice(0, 130)\n .padEnd(130, \"0\")}` as Hex;\n return signature;\n }\n\n async sendTransaction(tx: {\n to: Address;\n data?: Hex;\n value?: bigint;\n gas?: bigint;\n account?: { address: Address };\n chain?: { id: number };\n }): Promise<Hex> {\n if (this.shouldFailOperations) {\n throw new Error(\"Mock transaction failed\");\n }\n\n if (!tx.to) {\n throw new Error(\"Invalid transaction: missing 'to' address\");\n }\n\n // Simulate network delay if configured\n if (this.transactionDelay > 0) {\n await new Promise((resolve) =>\n setTimeout(resolve, this.transactionDelay),\n );\n }\n\n // Generate a deterministic mock transaction hash\n this.nonce++;\n const txData = JSON.stringify({\n from: this.account.address,\n to: tx.to,\n value: tx.value?.toString() || \"0\",\n nonce: this.nonce,\n chainId: this.chain.id,\n });\n\n const hash = `0x${Buffer.from(txData)\n .toString(\"hex\")\n .slice(0, 64)\n .padEnd(64, \"0\")}` as Hex;\n return hash;\n }\n\n /** Updates configuration for testing different scenarios. */\n updateConfig(updates: Partial<MockEthereumWalletConfig>): void {\n if (updates.address !== undefined) {\n this.account.address = updates.address;\n }\n if (updates.chainId !== undefined) {\n this.chain.id = updates.chainId;\n }\n if (updates.shouldFailOperations !== undefined) {\n this.shouldFailOperations = updates.shouldFailOperations;\n }\n if (updates.transactionDelay !== undefined) {\n this.transactionDelay = updates.transactionDelay;\n }\n }\n\n /** Resets to default configuration and nonce. */\n reset(): void {\n this.account.address =\n \"0x742d35cc6634c0532925a3b844bc9e7595f0beb0\" as Address;\n this.chain.id = 11155111;\n this.shouldFailOperations = false;\n this.transactionDelay = 0;\n this.nonce = 0;\n }\n\n /** Returns current nonce for testing. */\n getCurrentNonce(): number {\n return this.nonce;\n }\n}\n"],"names":["MockBitcoinWallet","config","__publicField","BitcoinNetworks","psbtHex","psbtsHexes","_options","signedPsbts","signedPsbt","message","type","Buffer","updates","MockEthereumWallet","args","account","signatureData","tx","resolve","txData","_a"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../../src/testing/MockBitcoinWallet.ts","../../src/testing/MockEthereumWallet.ts"],"sourcesContent":["import { sha256 } from \"@noble/hashes/sha2.js\";\nimport { Buffer } from \"buffer\";\n\nimport { BitcoinNetworks, type BitcoinNetwork } from \"../shared/wallets/interfaces\";\nimport type {\n BitcoinWallet,\n SignPsbtOptions,\n} from \"../shared/wallets/interfaces/BitcoinWallet\";\nimport { uint8ArrayToHex } from \"../tbv/core/primitives/utils/bitcoin\";\n\n/**\n * Configuration for MockBitcoinWallet.\n */\nexport interface MockBitcoinWalletConfig {\n publicKeyHex?: string;\n address?: string;\n network?: BitcoinNetwork;\n shouldFailSigning?: boolean;\n /**\n * Optional override for `deriveContextHash`. When omitted the mock\n * returns a deterministic 64-char lowercase hex string derived from\n * `(appName, context)` so tests can assert pass-through wiring\n * without pinning a specific value. Override to inject spec test\n * vectors or to simulate failure modes.\n */\n deriveContextHash?: (appName: string, context: string) => Promise<string>;\n}\n\n/**\n * Mock Bitcoin wallet for testing.\n */\n/**\n * Default `deriveContextHash` implementation: deterministic and\n * collision-resistant via SHA-256, so tests that assert pass-through\n * wiring (different `(appName, context)` → different output) hold\n * without flakes. Domain-separates the two inputs by length-prefixing\n * each as `len(name) || name || len(ctx) || ctx`, preventing\n * `(\"ab\", \"cd\")` from colliding with `(\"abc\", \"d\")`.\n */\nconst defaultDeriveContextHash = async (\n appName: string,\n context: string,\n): Promise<string> => {\n const enc = new TextEncoder();\n const nameBytes = enc.encode(appName);\n const ctxBytes = enc.encode(context);\n const buf = new Uint8Array(4 + nameBytes.length + 4 + ctxBytes.length);\n const view = new DataView(buf.buffer);\n view.setUint32(0, nameBytes.length);\n buf.set(nameBytes, 4);\n view.setUint32(4 + nameBytes.length, ctxBytes.length);\n buf.set(ctxBytes, 4 + nameBytes.length + 4);\n return uint8ArrayToHex(sha256(buf));\n};\n\nexport class MockBitcoinWallet implements BitcoinWallet {\n private config: Required<MockBitcoinWalletConfig>;\n\n constructor(config: MockBitcoinWalletConfig = {}) {\n this.config = {\n publicKeyHex:\n config.publicKeyHex ||\n \"a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b0c1d2e3f4a5b6c7d8e9f0a1b2\",\n address:\n config.address ||\n \"tb1pqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqkx6jks\",\n network: config.network ?? BitcoinNetworks.SIGNET,\n shouldFailSigning: config.shouldFailSigning ?? false,\n deriveContextHash: config.deriveContextHash ?? defaultDeriveContextHash,\n };\n }\n\n async getPublicKeyHex(): Promise<string> {\n return this.config.publicKeyHex;\n }\n\n async getAddress(): Promise<string> {\n return this.config.address;\n }\n\n async signPsbt(psbtHex: string): Promise<string> {\n if (this.config.shouldFailSigning) {\n throw new Error(\"Mock signing failed\");\n }\n\n if (!psbtHex || psbtHex.length === 0) {\n throw new Error(\"Invalid PSBT: empty hex string\");\n }\n\n // In a real implementation, this would actually sign the PSBT\n // For the mock, we just return the input with a mock signature appended\n return psbtHex + \"deadbeef\";\n }\n\n async signPsbts(\n psbtsHexes: string[],\n _options?: SignPsbtOptions[],\n ): Promise<string[]> {\n const signedPsbts: string[] = [];\n for (const psbtHex of psbtsHexes) {\n const signedPsbt = await this.signPsbt(psbtHex);\n signedPsbts.push(signedPsbt);\n }\n return signedPsbts;\n }\n\n async signMessage(\n message: string,\n type: \"bip322-simple\" | \"ecdsa\",\n ): Promise<string> {\n if (this.config.shouldFailSigning) {\n throw new Error(\"Mock signing failed\");\n }\n\n if (!message || message.length === 0) {\n throw new Error(\"Invalid message: empty string\");\n }\n\n // In a real implementation, this would create a proper signature\n // For the mock, we return a base64-like mock signature\n const mockSignature = Buffer.from(\n `mock-signature-${type}-${message}-${this.config.publicKeyHex}`,\n ).toString(\"base64\");\n return mockSignature;\n }\n\n async getNetwork(): Promise<BitcoinNetwork> {\n return this.config.network;\n }\n\n async deriveContextHash(appName: string, context: string): Promise<string> {\n return this.config.deriveContextHash(appName, context);\n }\n\n /** Updates configuration for testing different scenarios. */\n updateConfig(updates: Partial<MockBitcoinWalletConfig>): void {\n this.config = {\n ...this.config,\n ...updates,\n };\n }\n\n /** Resets to default configuration. */\n reset(): void {\n this.config = {\n publicKeyHex:\n \"a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b0c1d2e3f4a5b6c7d8e9f0a1b2\",\n address: \"tb1pqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqkx6jks\",\n network: BitcoinNetworks.SIGNET,\n shouldFailSigning: false,\n deriveContextHash: defaultDeriveContextHash,\n };\n }\n}\n","import { Buffer } from \"buffer\";\nimport type { Address, Hex } from \"viem\";\n\n/**\n * Configuration for MockEthereumWallet.\n */\nexport interface MockEthereumWalletConfig {\n address?: Address;\n chainId?: number;\n shouldFailOperations?: boolean;\n transactionDelay?: number;\n}\n\n/**\n * Mock Ethereum wallet for testing.\n *\n * Provides the subset of viem's WalletClient methods used by the SDK.\n * Can be passed to functions expecting a WalletClient for testing purposes.\n */\nexport class MockEthereumWallet {\n // Public properties matching viem's WalletClient structure\n account: { address: Address };\n chain: { id: number };\n\n private shouldFailOperations: boolean;\n private transactionDelay: number;\n private nonce: number = 0;\n\n constructor(config: MockEthereumWalletConfig = {}) {\n // Use lowercase addresses to avoid EIP-55 checksum validation issues\n this.account = {\n address:\n config.address ||\n (\"0x742d35cc6634c0532925a3b844bc9e7595f0beb0\" as Address),\n };\n\n this.chain = {\n id: config.chainId ?? 11155111, // Sepolia by default\n };\n\n this.shouldFailOperations = config.shouldFailOperations ?? false;\n this.transactionDelay = config.transactionDelay ?? 0;\n\n // Bind methods to preserve 'this' context when called\n this.signMessage = this.signMessage.bind(this);\n this.sendTransaction = this.sendTransaction.bind(this);\n }\n\n async signMessage(args: { message: string; account?: Address }): Promise<Hex> {\n const message = args.message;\n const account = args.account || this.account.address;\n\n if (this.shouldFailOperations) {\n throw new Error(\"Mock signing failed\");\n }\n\n if (!message || message.length === 0) {\n throw new Error(\"Invalid message: empty string\");\n }\n\n // Generate a deterministic mock signature\n const signatureData = `personal_sign:${message}-${account}-${this.chain.id}`;\n const signature = `0x${Buffer.from(signatureData)\n .toString(\"hex\")\n .slice(0, 130)\n .padEnd(130, \"0\")}` as Hex;\n return signature;\n }\n\n async sendTransaction(tx: {\n to: Address;\n data?: Hex;\n value?: bigint;\n gas?: bigint;\n account?: { address: Address };\n chain?: { id: number };\n }): Promise<Hex> {\n if (this.shouldFailOperations) {\n throw new Error(\"Mock transaction failed\");\n }\n\n if (!tx.to) {\n throw new Error(\"Invalid transaction: missing 'to' address\");\n }\n\n // Simulate network delay if configured\n if (this.transactionDelay > 0) {\n await new Promise((resolve) =>\n setTimeout(resolve, this.transactionDelay),\n );\n }\n\n // Generate a deterministic mock transaction hash\n this.nonce++;\n const txData = JSON.stringify({\n from: this.account.address,\n to: tx.to,\n value: tx.value?.toString() || \"0\",\n nonce: this.nonce,\n chainId: this.chain.id,\n });\n\n const hash = `0x${Buffer.from(txData)\n .toString(\"hex\")\n .slice(0, 64)\n .padEnd(64, \"0\")}` as Hex;\n return hash;\n }\n\n /** Updates configuration for testing different scenarios. */\n updateConfig(updates: Partial<MockEthereumWalletConfig>): void {\n if (updates.address !== undefined) {\n this.account.address = updates.address;\n }\n if (updates.chainId !== undefined) {\n this.chain.id = updates.chainId;\n }\n if (updates.shouldFailOperations !== undefined) {\n this.shouldFailOperations = updates.shouldFailOperations;\n }\n if (updates.transactionDelay !== undefined) {\n this.transactionDelay = updates.transactionDelay;\n }\n }\n\n /** Resets to default configuration and nonce. */\n reset(): void {\n this.account.address =\n \"0x742d35cc6634c0532925a3b844bc9e7595f0beb0\" as Address;\n this.chain.id = 11155111;\n this.shouldFailOperations = false;\n this.transactionDelay = 0;\n this.nonce = 0;\n }\n\n /** Returns current nonce for testing. */\n getCurrentNonce(): number {\n return this.nonce;\n }\n}\n"],"names":["defaultDeriveContextHash","appName","context","enc","nameBytes","ctxBytes","buf","view","uint8ArrayToHex","sha256","MockBitcoinWallet","config","__publicField","BitcoinNetworks","psbtHex","psbtsHexes","_options","signedPsbts","signedPsbt","message","type","Buffer","updates","MockEthereumWallet","args","account","signatureData","tx","resolve","txData","_a"],"mappings":"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"}