@babylonlabs-io/ts-sdk 0.28.0 → 0.28.1
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.
- package/dist/PeginManager-Da4uSHzl.cjs +2 -0
- package/dist/PeginManager-Da4uSHzl.cjs.map +1 -0
- package/dist/{deriveVaultRoot-DAMZDqg-.js → PeginManager-DzMSIQ0I.js} +1131 -1043
- package/dist/PeginManager-DzMSIQ0I.js.map +1 -0
- package/dist/buildAndBroadcastRefund-DkEpTFkv.cjs +2 -0
- package/dist/buildAndBroadcastRefund-DkEpTFkv.cjs.map +1 -0
- package/dist/{buildAndBroadcastRefund-Cc4-L7gX.js → buildAndBroadcastRefund-xWS8frc6.js} +318 -329
- package/dist/buildAndBroadcastRefund-xWS8frc6.js.map +1 -0
- package/dist/index.cjs +1 -1
- package/dist/index.js +4 -4
- package/dist/{sha2-CPdTLk1u.js → sha2-6wN58S6R.js} +9 -9
- package/dist/{sha2-CPdTLk1u.js.map → sha2-6wN58S6R.js.map} +1 -1
- package/dist/tbv/core/clients/eth/vault-registry-reader.d.ts.map +1 -1
- package/dist/tbv/core/clients/index.cjs +1 -1
- package/dist/tbv/core/clients/index.js +2 -2
- package/dist/tbv/core/contracts/abis/BTCVaultRegistry.abi.d.ts +80 -70
- package/dist/tbv/core/contracts/abis/BTCVaultRegistry.abi.d.ts.map +1 -1
- package/dist/tbv/core/index.cjs +1 -1
- package/dist/tbv/core/index.js +4 -4
- package/dist/tbv/core/managers/PeginManager.d.ts +64 -27
- package/dist/tbv/core/managers/PeginManager.d.ts.map +1 -1
- package/dist/tbv/core/managers/index.d.ts +1 -1
- package/dist/tbv/core/managers/index.d.ts.map +1 -1
- package/dist/tbv/core/services/deposit/validation.d.ts +0 -4
- package/dist/tbv/core/services/deposit/validation.d.ts.map +1 -1
- package/dist/tbv/core/services/index.cjs +1 -1
- package/dist/tbv/core/services/index.js +1 -1
- package/dist/tbv/index.cjs +1 -1
- package/dist/tbv/index.js +4 -4
- package/dist/testing/MockBitcoinWallet.d.ts +1 -0
- package/dist/testing/MockBitcoinWallet.d.ts.map +1 -1
- package/dist/testing/index.cjs +1 -1
- package/dist/testing/index.cjs.map +1 -1
- package/dist/testing/index.js +35 -34
- package/dist/testing/index.js.map +1 -1
- package/dist/{types-CQ86O7NX.js → types-CnG3JsRs.js} +111 -81
- package/dist/types-CnG3JsRs.js.map +1 -0
- package/dist/types-jmEyzzhY.cjs +2 -0
- package/dist/types-jmEyzzhY.cjs.map +1 -0
- package/dist/{vault-registry-reader-CshEgmS0.js → vault-registry-reader-BywZhqJL.js} +37 -37
- package/dist/{vault-registry-reader-CshEgmS0.js.map → vault-registry-reader-BywZhqJL.js.map} +1 -1
- package/dist/{vault-registry-reader-_2BjSjoN.cjs → vault-registry-reader-DdruADqa.cjs} +2 -2
- package/dist/{vault-registry-reader-_2BjSjoN.cjs.map → vault-registry-reader-DdruADqa.cjs.map} +1 -1
- package/package.json +1 -1
- package/dist/buildAndBroadcastRefund-Cc4-L7gX.js.map +0 -1
- package/dist/buildAndBroadcastRefund-OoaQaNqn.cjs +0 -2
- package/dist/buildAndBroadcastRefund-OoaQaNqn.cjs.map +0 -1
- package/dist/deriveVaultRoot-B4gnRbW_.cjs +0 -2
- package/dist/deriveVaultRoot-B4gnRbW_.cjs.map +0 -1
- package/dist/deriveVaultRoot-DAMZDqg-.js.map +0 -1
- package/dist/types-CQ86O7NX.js.map +0 -1
- package/dist/types-CcwaEPE1.cjs +0 -2
- package/dist/types-CcwaEPE1.cjs.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","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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"}
|
|
1
|
+
{"version":3,"file":"index.cjs","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 * 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\nconst DEFAULT_CONFIG: Required<MockBitcoinWalletConfig> = {\n publicKeyHex:\n \"a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b0c1d2e3f4a5b6c7d8e9f0a1b2\",\n address: \"tb1pqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqkx6jks\",\n network: BitcoinNetworks.SIGNET,\n shouldFailSigning: false,\n deriveContextHash: defaultDeriveContextHash,\n};\n\n/** Mock Bitcoin wallet for testing. */\nexport class MockBitcoinWallet implements BitcoinWallet {\n private config: Required<MockBitcoinWalletConfig>;\n\n constructor(config: MockBitcoinWalletConfig = {}) {\n this.config = {\n ...DEFAULT_CONFIG,\n ...(config.publicKeyHex ? { publicKeyHex: config.publicKeyHex } : {}),\n ...(config.address ? { address: config.address } : {}),\n ...(config.network !== undefined ? { network: config.network } : {}),\n ...(config.shouldFailSigning !== undefined\n ? { shouldFailSigning: config.shouldFailSigning }\n : {}),\n ...(config.deriveContextHash\n ? { deriveContextHash: config.deriveContextHash }\n : {}),\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 = { ...DEFAULT_CONFIG };\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","DEFAULT_CONFIG","BitcoinNetworks","MockBitcoinWallet","config","__publicField","psbtHex","psbtsHexes","_options","signedPsbts","signedPsbt","message","type","Buffer","updates","MockEthereumWallet","args","account","signatureData","tx","resolve","txData","_a"],"mappings":"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"}
|
package/dist/testing/index.js
CHANGED
|
@@ -1,23 +1,30 @@
|
|
|
1
1
|
var d = Object.defineProperty;
|
|
2
|
-
var l = (e, t,
|
|
3
|
-
var o = (e, t,
|
|
4
|
-
import { s as g } from "../sha2-
|
|
2
|
+
var l = (e, t, s) => t in e ? d(e, t, { enumerable: !0, configurable: !0, writable: !0, value: s }) : e[t] = s;
|
|
3
|
+
var o = (e, t, s) => l(e, typeof t != "symbol" ? t + "" : t, s);
|
|
4
|
+
import { s as g } from "../sha2-6wN58S6R.js";
|
|
5
5
|
import { Buffer as r } from "buffer";
|
|
6
|
-
import { u
|
|
6
|
+
import { u } from "../bitcoin-B-Y0DlqR.js";
|
|
7
7
|
import { BitcoinNetworks as q } from "../shared/index.js";
|
|
8
|
-
const
|
|
9
|
-
const
|
|
10
|
-
return c.setUint32(0,
|
|
8
|
+
const f = async (e, t) => {
|
|
9
|
+
const s = new TextEncoder(), n = s.encode(e), i = s.encode(t), a = new Uint8Array(4 + n.length + 4 + i.length), c = new DataView(a.buffer);
|
|
10
|
+
return c.setUint32(0, n.length), a.set(n, 4), c.setUint32(4 + n.length, i.length), a.set(i, 4 + n.length + 4), u(g(a));
|
|
11
|
+
}, h = {
|
|
12
|
+
publicKeyHex: "a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b0c1d2e3f4a5b6c7d8e9f0a1b2",
|
|
13
|
+
address: "tb1pqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqkx6jks",
|
|
14
|
+
network: q.SIGNET,
|
|
15
|
+
shouldFailSigning: !1,
|
|
16
|
+
deriveContextHash: f
|
|
11
17
|
};
|
|
12
18
|
class p {
|
|
13
19
|
constructor(t = {}) {
|
|
14
20
|
o(this, "config");
|
|
15
21
|
this.config = {
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
22
|
+
...h,
|
|
23
|
+
...t.publicKeyHex ? { publicKeyHex: t.publicKeyHex } : {},
|
|
24
|
+
...t.address ? { address: t.address } : {},
|
|
25
|
+
...t.network !== void 0 ? { network: t.network } : {},
|
|
26
|
+
...t.shouldFailSigning !== void 0 ? { shouldFailSigning: t.shouldFailSigning } : {},
|
|
27
|
+
...t.deriveContextHash ? { deriveContextHash: t.deriveContextHash } : {}
|
|
21
28
|
};
|
|
22
29
|
}
|
|
23
30
|
async getPublicKeyHex() {
|
|
@@ -33,28 +40,28 @@ class p {
|
|
|
33
40
|
throw new Error("Invalid PSBT: empty hex string");
|
|
34
41
|
return t + "deadbeef";
|
|
35
42
|
}
|
|
36
|
-
async signPsbts(t,
|
|
37
|
-
const
|
|
43
|
+
async signPsbts(t, s) {
|
|
44
|
+
const n = [];
|
|
38
45
|
for (const i of t) {
|
|
39
46
|
const a = await this.signPsbt(i);
|
|
40
|
-
|
|
47
|
+
n.push(a);
|
|
41
48
|
}
|
|
42
|
-
return
|
|
49
|
+
return n;
|
|
43
50
|
}
|
|
44
|
-
async signMessage(t,
|
|
51
|
+
async signMessage(t, s) {
|
|
45
52
|
if (this.config.shouldFailSigning)
|
|
46
53
|
throw new Error("Mock signing failed");
|
|
47
54
|
if (!t || t.length === 0)
|
|
48
55
|
throw new Error("Invalid message: empty string");
|
|
49
56
|
return r.from(
|
|
50
|
-
`mock-signature-${
|
|
57
|
+
`mock-signature-${s}-${t}-${this.config.publicKeyHex}`
|
|
51
58
|
).toString("base64");
|
|
52
59
|
}
|
|
53
60
|
async getNetwork() {
|
|
54
61
|
return this.config.network;
|
|
55
62
|
}
|
|
56
|
-
async deriveContextHash(t,
|
|
57
|
-
return this.config.deriveContextHash(t,
|
|
63
|
+
async deriveContextHash(t, s) {
|
|
64
|
+
return this.config.deriveContextHash(t, s);
|
|
58
65
|
}
|
|
59
66
|
/** Updates configuration for testing different scenarios. */
|
|
60
67
|
updateConfig(t) {
|
|
@@ -65,16 +72,10 @@ class p {
|
|
|
65
72
|
}
|
|
66
73
|
/** Resets to default configuration. */
|
|
67
74
|
reset() {
|
|
68
|
-
this.config = {
|
|
69
|
-
publicKeyHex: "a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b0c1d2e3f4a5b6c7d8e9f0a1b2",
|
|
70
|
-
address: "tb1pqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqkx6jks",
|
|
71
|
-
network: q.SIGNET,
|
|
72
|
-
shouldFailSigning: !1,
|
|
73
|
-
deriveContextHash: h
|
|
74
|
-
};
|
|
75
|
+
this.config = { ...h };
|
|
75
76
|
}
|
|
76
77
|
}
|
|
77
|
-
class
|
|
78
|
+
class v {
|
|
78
79
|
constructor(t = {}) {
|
|
79
80
|
// Public properties matching viem's WalletClient structure
|
|
80
81
|
o(this, "account");
|
|
@@ -90,12 +91,12 @@ class x {
|
|
|
90
91
|
}, this.shouldFailOperations = t.shouldFailOperations ?? !1, this.transactionDelay = t.transactionDelay ?? 0, this.signMessage = this.signMessage.bind(this), this.sendTransaction = this.sendTransaction.bind(this);
|
|
91
92
|
}
|
|
92
93
|
async signMessage(t) {
|
|
93
|
-
const
|
|
94
|
+
const s = t.message, n = t.account || this.account.address;
|
|
94
95
|
if (this.shouldFailOperations)
|
|
95
96
|
throw new Error("Mock signing failed");
|
|
96
|
-
if (!
|
|
97
|
+
if (!s || s.length === 0)
|
|
97
98
|
throw new Error("Invalid message: empty string");
|
|
98
|
-
const i = `personal_sign:${
|
|
99
|
+
const i = `personal_sign:${s}-${n}-${this.chain.id}`;
|
|
99
100
|
return `0x${r.from(i).toString("hex").slice(0, 130).padEnd(130, "0")}`;
|
|
100
101
|
}
|
|
101
102
|
async sendTransaction(t) {
|
|
@@ -107,14 +108,14 @@ class x {
|
|
|
107
108
|
this.transactionDelay > 0 && await new Promise(
|
|
108
109
|
(a) => setTimeout(a, this.transactionDelay)
|
|
109
110
|
), this.nonce++;
|
|
110
|
-
const
|
|
111
|
+
const s = JSON.stringify({
|
|
111
112
|
from: this.account.address,
|
|
112
113
|
to: t.to,
|
|
113
114
|
value: ((i = t.value) == null ? void 0 : i.toString()) || "0",
|
|
114
115
|
nonce: this.nonce,
|
|
115
116
|
chainId: this.chain.id
|
|
116
117
|
});
|
|
117
|
-
return `0x${r.from(
|
|
118
|
+
return `0x${r.from(s).toString("hex").slice(0, 64).padEnd(64, "0")}`;
|
|
118
119
|
}
|
|
119
120
|
/** Updates configuration for testing different scenarios. */
|
|
120
121
|
updateConfig(t) {
|
|
@@ -131,6 +132,6 @@ class x {
|
|
|
131
132
|
}
|
|
132
133
|
export {
|
|
133
134
|
p as MockBitcoinWallet,
|
|
134
|
-
|
|
135
|
+
v as MockEthereumWallet
|
|
135
136
|
};
|
|
136
137
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
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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"}
|
|
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 * 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\nconst DEFAULT_CONFIG: Required<MockBitcoinWalletConfig> = {\n publicKeyHex:\n \"a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b0c1d2e3f4a5b6c7d8e9f0a1b2\",\n address: \"tb1pqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqkx6jks\",\n network: BitcoinNetworks.SIGNET,\n shouldFailSigning: false,\n deriveContextHash: defaultDeriveContextHash,\n};\n\n/** Mock Bitcoin wallet for testing. */\nexport class MockBitcoinWallet implements BitcoinWallet {\n private config: Required<MockBitcoinWalletConfig>;\n\n constructor(config: MockBitcoinWalletConfig = {}) {\n this.config = {\n ...DEFAULT_CONFIG,\n ...(config.publicKeyHex ? { publicKeyHex: config.publicKeyHex } : {}),\n ...(config.address ? { address: config.address } : {}),\n ...(config.network !== undefined ? { network: config.network } : {}),\n ...(config.shouldFailSigning !== undefined\n ? { shouldFailSigning: config.shouldFailSigning }\n : {}),\n ...(config.deriveContextHash\n ? { deriveContextHash: config.deriveContextHash }\n : {}),\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 = { ...DEFAULT_CONFIG };\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","DEFAULT_CONFIG","BitcoinNetworks","MockBitcoinWallet","config","__publicField","psbtHex","psbtsHexes","_options","signedPsbts","signedPsbt","message","type","Buffer","updates","MockEthereumWallet","args","account","signatureData","tx","resolve","txData","_a"],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
var R = Object.defineProperty;
|
|
2
2
|
var h = (e, t, n) => t in e ? R(e, t, { enumerable: !0, configurable: !0, writable: !0, value: n }) : e[t] = n;
|
|
3
3
|
var p = (e, t, n) => h(e, typeof t != "symbol" ? t + "" : t, n);
|
|
4
|
-
const
|
|
4
|
+
const G = [
|
|
5
5
|
{
|
|
6
6
|
type: "function",
|
|
7
7
|
name: "submitPeginRequest",
|
|
@@ -216,13 +216,36 @@ const k = [
|
|
|
216
216
|
}
|
|
217
217
|
],
|
|
218
218
|
outputs: [
|
|
219
|
-
{
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
219
|
+
{
|
|
220
|
+
name: "vBasic",
|
|
221
|
+
type: "tuple",
|
|
222
|
+
internalType: "struct BTCVaultTypes.BTCVaultBasicInfo",
|
|
223
|
+
components: [
|
|
224
|
+
{ name: "depositor", type: "address", internalType: "address" },
|
|
225
|
+
{
|
|
226
|
+
name: "depositorBtcPubKey",
|
|
227
|
+
type: "bytes32",
|
|
228
|
+
internalType: "bytes32"
|
|
229
|
+
},
|
|
230
|
+
{ name: "amount", type: "uint256", internalType: "uint256" },
|
|
231
|
+
{
|
|
232
|
+
name: "vaultProvider",
|
|
233
|
+
type: "address",
|
|
234
|
+
internalType: "address"
|
|
235
|
+
},
|
|
236
|
+
{
|
|
237
|
+
name: "status",
|
|
238
|
+
type: "uint8",
|
|
239
|
+
internalType: "enum IBTCVaultRegistry.BTCVaultStatus"
|
|
240
|
+
},
|
|
241
|
+
{
|
|
242
|
+
name: "applicationEntryPoint",
|
|
243
|
+
type: "address",
|
|
244
|
+
internalType: "address"
|
|
245
|
+
},
|
|
246
|
+
{ name: "createdAt", type: "uint256", internalType: "uint256" }
|
|
247
|
+
]
|
|
248
|
+
}
|
|
226
249
|
],
|
|
227
250
|
stateMutability: "view"
|
|
228
251
|
},
|
|
@@ -289,59 +312,66 @@ const k = [
|
|
|
289
312
|
],
|
|
290
313
|
outputs: [
|
|
291
314
|
{
|
|
292
|
-
name: "
|
|
293
|
-
type: "
|
|
294
|
-
internalType: "
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
315
|
+
name: "vProtocol",
|
|
316
|
+
type: "tuple",
|
|
317
|
+
internalType: "struct BTCVaultRegistryTypes.BTCVaultProtocolInfo",
|
|
318
|
+
components: [
|
|
319
|
+
{
|
|
320
|
+
name: "depositorSignedPeginTx",
|
|
321
|
+
type: "bytes",
|
|
322
|
+
internalType: "bytes"
|
|
323
|
+
},
|
|
324
|
+
{
|
|
325
|
+
name: "universalChallengersVersion",
|
|
326
|
+
type: "uint16",
|
|
327
|
+
internalType: "uint16"
|
|
328
|
+
},
|
|
329
|
+
{
|
|
330
|
+
name: "appVaultKeepersVersion",
|
|
331
|
+
type: "uint16",
|
|
332
|
+
internalType: "uint16"
|
|
333
|
+
},
|
|
334
|
+
{
|
|
335
|
+
name: "offchainParamsVersion",
|
|
336
|
+
type: "uint16",
|
|
337
|
+
internalType: "uint16"
|
|
338
|
+
},
|
|
339
|
+
{
|
|
340
|
+
name: "verifiedAt",
|
|
341
|
+
type: "uint256",
|
|
342
|
+
internalType: "uint256"
|
|
343
|
+
},
|
|
344
|
+
{
|
|
345
|
+
name: "depositorWotsPkHash",
|
|
346
|
+
type: "bytes32",
|
|
347
|
+
internalType: "bytes32"
|
|
348
|
+
},
|
|
349
|
+
{
|
|
350
|
+
name: "hashlock",
|
|
351
|
+
type: "bytes32",
|
|
352
|
+
internalType: "bytes32"
|
|
353
|
+
},
|
|
354
|
+
{
|
|
355
|
+
name: "htlcVout",
|
|
356
|
+
type: "uint8",
|
|
357
|
+
internalType: "uint8"
|
|
358
|
+
},
|
|
359
|
+
{
|
|
360
|
+
name: "depositorPopSignature",
|
|
361
|
+
type: "bytes",
|
|
362
|
+
internalType: "bytes"
|
|
363
|
+
},
|
|
364
|
+
{
|
|
365
|
+
name: "prePeginTxHash",
|
|
366
|
+
type: "bytes32",
|
|
367
|
+
internalType: "bytes32"
|
|
368
|
+
},
|
|
369
|
+
{
|
|
370
|
+
name: "vaultProviderCommissionBps",
|
|
371
|
+
type: "uint16",
|
|
372
|
+
internalType: "uint16"
|
|
373
|
+
}
|
|
374
|
+
]
|
|
345
375
|
}
|
|
346
376
|
],
|
|
347
377
|
stateMutability: "view"
|
|
@@ -414,7 +444,7 @@ function f(e) {
|
|
|
414
444
|
const t = e.data;
|
|
415
445
|
return t === null || typeof t != "object" ? !1 : t.kind === O;
|
|
416
446
|
}
|
|
417
|
-
class
|
|
447
|
+
class k {
|
|
418
448
|
constructor(t) {
|
|
419
449
|
p(this, "baseUrl");
|
|
420
450
|
p(this, "timeout");
|
|
@@ -479,12 +509,12 @@ class C {
|
|
|
479
509
|
);
|
|
480
510
|
const o = s;
|
|
481
511
|
if ("error" in o && o.error != null) {
|
|
482
|
-
const
|
|
512
|
+
const c = o.error;
|
|
483
513
|
throw new d(
|
|
484
|
-
|
|
485
|
-
|
|
514
|
+
c.code ?? T.INVALID_RESPONSE,
|
|
515
|
+
c.message ?? "Unknown RPC error",
|
|
486
516
|
"wire",
|
|
487
|
-
|
|
517
|
+
c.data
|
|
488
518
|
);
|
|
489
519
|
}
|
|
490
520
|
if (!("result" in o))
|
|
@@ -509,7 +539,7 @@ class C {
|
|
|
509
539
|
return this.fetchWithRetry(t, n, r);
|
|
510
540
|
}
|
|
511
541
|
async fetchWithRetry(t, n, r) {
|
|
512
|
-
const i = ++this.requestId, s = this.retryableFor(t) ? this.retries : 0,
|
|
542
|
+
const i = ++this.requestId, s = this.retryableFor(t) ? this.retries : 0, c = JSON.stringify({
|
|
513
543
|
jsonrpc: A,
|
|
514
544
|
method: t,
|
|
515
545
|
params: [n],
|
|
@@ -517,15 +547,15 @@ class C {
|
|
|
517
547
|
});
|
|
518
548
|
let b = null;
|
|
519
549
|
for (let u = 0; u <= s; u++) {
|
|
520
|
-
const
|
|
521
|
-
() =>
|
|
550
|
+
const P = new AbortController(), m = setTimeout(
|
|
551
|
+
() => P.abort(),
|
|
522
552
|
this.timeout
|
|
523
|
-
), l = r ? w(r,
|
|
553
|
+
), l = r ? w(r, P.signal) : null, E = l ? l.signal : P.signal;
|
|
524
554
|
try {
|
|
525
555
|
const a = await this.buildHeaders(t), y = await fetch(this.baseUrl, {
|
|
526
556
|
method: "POST",
|
|
527
557
|
headers: a,
|
|
528
|
-
body:
|
|
558
|
+
body: c,
|
|
529
559
|
signal: E
|
|
530
560
|
});
|
|
531
561
|
if (clearTimeout(m), l == null || l.cleanup(), !y.ok) {
|
|
@@ -613,38 +643,38 @@ const M = [
|
|
|
613
643
|
"PendingPeginSigsAvailability",
|
|
614
644
|
"PendingPrePegInConfirmations"
|
|
615
645
|
/* PENDING_PRE_PEGIN_CONFIRMATIONS */
|
|
616
|
-
],
|
|
646
|
+
], B = [
|
|
617
647
|
"PendingACKs",
|
|
618
648
|
"PendingActivation",
|
|
619
649
|
"Activated"
|
|
620
650
|
/* ACTIVATED */
|
|
621
|
-
],
|
|
651
|
+
], V = /* @__PURE__ */ new Set([
|
|
622
652
|
"PendingBabeSetup",
|
|
623
653
|
"PendingChallengerPresigning",
|
|
624
654
|
"PendingPeginSigsAvailability",
|
|
625
655
|
"PendingPrePegInConfirmations",
|
|
626
|
-
...
|
|
656
|
+
...B
|
|
627
657
|
]), x = /* @__PURE__ */ new Set([
|
|
628
658
|
"Expired",
|
|
629
659
|
"ClaimPosted",
|
|
630
660
|
"PeggedOut"
|
|
631
661
|
/* PEGGED_OUT */
|
|
632
662
|
]), H = /* @__PURE__ */ new Set([
|
|
633
|
-
...
|
|
663
|
+
...V,
|
|
634
664
|
"PendingDepositorSignatures"
|
|
635
665
|
/* PENDING_DEPOSITOR_SIGNATURES */
|
|
636
666
|
]);
|
|
637
|
-
var
|
|
667
|
+
var L = /* @__PURE__ */ ((e) => (e[e.DATABASE_ERROR = -32005] = "DATABASE_ERROR", e[e.PRESIGN_ERROR = -32006] = "PRESIGN_ERROR", e[e.JSON_SERIALIZATION_ERROR = -32007] = "JSON_SERIALIZATION_ERROR", e[e.TX_GRAPH_ERROR = -32008] = "TX_GRAPH_ERROR", e[e.INVALID_GRAPH = -32009] = "INVALID_GRAPH", e[e.VALIDATION_ERROR = -32010] = "VALIDATION_ERROR", e[e.NOT_FOUND = -32011] = "NOT_FOUND", e[e.INTERNAL_ERROR = -32603] = "INTERNAL_ERROR", e))(L || {});
|
|
638
668
|
export {
|
|
639
|
-
|
|
669
|
+
G as B,
|
|
640
670
|
D,
|
|
641
|
-
|
|
671
|
+
k as J,
|
|
642
672
|
M as P,
|
|
643
|
-
|
|
644
|
-
|
|
673
|
+
L as R,
|
|
674
|
+
V,
|
|
645
675
|
d as a,
|
|
646
676
|
T as b,
|
|
647
677
|
x as c,
|
|
648
678
|
H as d
|
|
649
679
|
};
|
|
650
|
-
//# sourceMappingURL=types-
|
|
680
|
+
//# sourceMappingURL=types-CnG3JsRs.js.map
|