@dynamic-labs-sdk/bitcoin 1.19.0 → 1.20.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 (51) hide show
  1. package/dist/{addBitcoinInjectedWalletsExtension-BD_sDgf9.esm.js → addBitcoinInjectedWalletsExtension-B7E0hK1o.esm.js} +2 -2
  2. package/dist/{addBitcoinInjectedWalletsExtension-BD_sDgf9.esm.js.map → addBitcoinInjectedWalletsExtension-B7E0hK1o.esm.js.map} +1 -1
  3. package/dist/{addBitcoinInjectedWalletsExtension-Bg3KI_MJ.cjs → addBitcoinInjectedWalletsExtension-CTMHhM9_.cjs} +3 -3
  4. package/dist/{addBitcoinInjectedWalletsExtension-Bg3KI_MJ.cjs.map → addBitcoinInjectedWalletsExtension-CTMHhM9_.cjs.map} +1 -1
  5. package/dist/{addWaasBitcoinExtension-D69lYSx2.esm.js → addWaasBitcoinExtension-DD7tP-MB.esm.js} +140 -49
  6. package/dist/addWaasBitcoinExtension-DD7tP-MB.esm.js.map +1 -0
  7. package/dist/{addWaasBitcoinExtension-BuxHED6F.cjs → addWaasBitcoinExtension-Du9epD-l.cjs} +150 -47
  8. package/dist/addWaasBitcoinExtension-Du9epD-l.cjs.map +1 -0
  9. package/dist/{bitcoinTransferAmount-vyn5gKOV.cjs → bitcoinTransferAmount-Bz15MjRP.cjs} +22 -3
  10. package/dist/{bitcoinTransferAmount-vyn5gKOV.cjs.map → bitcoinTransferAmount-Bz15MjRP.cjs.map} +1 -1
  11. package/dist/{bitcoinTransferAmount-D6zp-bUs.esm.js → bitcoinTransferAmount-DvQ6eq1s.esm.js} +4 -3
  12. package/dist/{bitcoinTransferAmount-D6zp-bUs.esm.js.map → bitcoinTransferAmount-DvQ6eq1s.esm.js.map} +1 -1
  13. package/dist/errors/UnsupportedBitcoinNetworkError.d.ts +5 -0
  14. package/dist/errors/UnsupportedBitcoinNetworkError.d.ts.map +1 -0
  15. package/dist/exports/waas.d.ts +3 -0
  16. package/dist/exports/waas.d.ts.map +1 -1
  17. package/dist/index.cjs +3 -3
  18. package/dist/index.esm.js +3 -3
  19. package/dist/injected.cjs +3 -3
  20. package/dist/injected.esm.js +2 -2
  21. package/dist/tsconfig.lib.tsbuildinfo +1 -1
  22. package/dist/waas/constants.d.ts +0 -4
  23. package/dist/waas/constants.d.ts.map +1 -1
  24. package/dist/waas/utils/broadcastTransaction/broadcastTransaction.d.ts +6 -2
  25. package/dist/waas/utils/broadcastTransaction/broadcastTransaction.d.ts.map +1 -1
  26. package/dist/waas/utils/buildPsbt/buildPsbt.d.ts +2 -1
  27. package/dist/waas/utils/buildPsbt/buildPsbt.d.ts.map +1 -1
  28. package/dist/waas/utils/calculateFeeAndChange/calculateFeeAndChange.d.ts +2 -1
  29. package/dist/waas/utils/calculateFeeAndChange/calculateFeeAndChange.d.ts.map +1 -1
  30. package/dist/waas/utils/createWalletProviderForWaasBitcoin/createWalletProviderForWaasBitcoin.d.ts.map +1 -1
  31. package/dist/waas/utils/estimateTransactionFee/estimateTransactionFee.d.ts +2 -1
  32. package/dist/waas/utils/estimateTransactionFee/estimateTransactionFee.d.ts.map +1 -1
  33. package/dist/waas/utils/getActiveBitcoinNetworkConfig/getActiveBitcoinNetworkConfig.d.ts +22 -0
  34. package/dist/waas/utils/getActiveBitcoinNetworkConfig/getActiveBitcoinNetworkConfig.d.ts.map +1 -0
  35. package/dist/waas/utils/getActiveBitcoinNetworkConfig/index.d.ts +3 -0
  36. package/dist/waas/utils/getActiveBitcoinNetworkConfig/index.d.ts.map +1 -0
  37. package/dist/waas/utils/getFeeRecommendations/getFeeRecommendations.d.ts +4 -1
  38. package/dist/waas/utils/getFeeRecommendations/getFeeRecommendations.d.ts.map +1 -1
  39. package/dist/waas/utils/getUTXOs/getUTXOs.d.ts +6 -2
  40. package/dist/waas/utils/getUTXOs/getUTXOs.d.ts.map +1 -1
  41. package/dist/waas/utils/getWaasBitcoinAddressForNetwork/getWaasBitcoinAddressForNetwork.d.ts +19 -0
  42. package/dist/waas/utils/getWaasBitcoinAddressForNetwork/getWaasBitcoinAddressForNetwork.d.ts.map +1 -0
  43. package/dist/waas/utils/getWaasBitcoinAddressForNetwork/index.d.ts +2 -0
  44. package/dist/waas/utils/getWaasBitcoinAddressForNetwork/index.d.ts.map +1 -0
  45. package/dist/waas.cjs +4 -2
  46. package/dist/waas.cjs.map +1 -1
  47. package/dist/waas.esm.js +3 -3
  48. package/dist/waas.esm.js.map +1 -1
  49. package/package.json +3 -3
  50. package/dist/addWaasBitcoinExtension-BuxHED6F.cjs.map +0 -1
  51. package/dist/addWaasBitcoinExtension-D69lYSx2.esm.js.map +0 -1
@@ -25,7 +25,7 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
25
25
  }) : target, mod));
26
26
 
27
27
  //#endregion
28
- const require_bitcoinTransferAmount = require('./bitcoinTransferAmount-vyn5gKOV.cjs');
28
+ const require_bitcoinTransferAmount = require('./bitcoinTransferAmount-Bz15MjRP.cjs');
29
29
  let _dynamic_labs_sdk_client_core = require("@dynamic-labs-sdk/client/core");
30
30
  let _dynamic_labs_sdk_client = require("@dynamic-labs-sdk/client");
31
31
  let _dynamic_labs_sdk_api_core = require("@dynamic-labs/sdk-api-core");
@@ -66,11 +66,30 @@ var TransactionRequiredError = class extends _dynamic_labs_sdk_client.BaseError
66
66
  };
67
67
 
68
68
  //#endregion
69
- //#region src/waas/constants.ts
69
+ //#region src/waas/utils/broadcastTransaction/broadcastTransaction.ts
70
70
  /**
71
- * Mempool.space API URL for mainnet
71
+ * Sends a raw Bitcoin transaction to the mempool
72
+ *
73
+ * @param options.rawTransaction - The raw transaction in hex format
74
+ * @param options.mempoolApiUrl - Base mempool API URL for the active network
75
+ * @returns The transaction ID
76
+ * @throws {TransactionRequiredError} if no transaction is specified
77
+ * @throws {TransactionBroadcastFailedError} if broadcasting fails
78
+ * @notInstrumented
72
79
  */
73
- const MEMPOOL_API_URL = "https://mempool.space/api";
80
+ const broadcastTransaction = async ({ mempoolApiUrl = require_bitcoinTransferAmount.MEMPOOL_API_URL, rawTransaction }) => {
81
+ if (!rawTransaction) throw new TransactionRequiredError();
82
+ const response = await fetch(`${mempoolApiUrl}/tx`, {
83
+ body: rawTransaction,
84
+ headers: { "Content-Type": "application/x-www-form-urlencoded" },
85
+ method: "POST"
86
+ });
87
+ if (!response.ok) throw new TransactionBroadcastFailedError({ response });
88
+ return response.text();
89
+ };
90
+
91
+ //#endregion
92
+ //#region src/waas/constants.ts
74
93
  /**
75
94
  * Number of satoshis per Bitcoin
76
95
  */
@@ -103,28 +122,6 @@ const DEFAULT_FEE_ESTIMATE = 1e3;
103
122
  */
104
123
  const RBF_SEQUENCE = 4294967293;
105
124
 
106
- //#endregion
107
- //#region src/waas/utils/broadcastTransaction/broadcastTransaction.ts
108
- /**
109
- * Sends a raw Bitcoin transaction to the mempool
110
- *
111
- * @param rawTransaction - The raw transaction in hex format
112
- * @returns The transaction ID
113
- * @throws {TransactionRequiredError} if no transaction is specified
114
- * @throws {TransactionBroadcastFailedError} if broadcasting fails
115
- * @notInstrumented
116
- */
117
- const broadcastTransaction = async (rawTransaction) => {
118
- if (!rawTransaction) throw new TransactionRequiredError();
119
- const response = await fetch(`${MEMPOOL_API_URL}/tx`, {
120
- body: rawTransaction,
121
- headers: { "Content-Type": "application/x-www-form-urlencoded" },
122
- method: "POST"
123
- });
124
- if (!response.ok) throw new TransactionBroadcastFailedError({ response });
125
- return response.text();
126
- };
127
-
128
125
  //#endregion
129
126
  //#region src/errors/InsufficientFundsError.ts
130
127
  var InsufficientFundsError = class extends _dynamic_labs_sdk_client.BaseError {
@@ -278,12 +275,13 @@ var FeeRecommendationsFetchError = class extends _dynamic_labs_sdk_client.BaseEr
278
275
  /**
279
276
  * Gets fee recommendations from mempool.space API
280
277
  *
278
+ * @param options.mempoolApiUrl - Base mempool API URL for the active network
281
279
  * @returns Fee recommendation data with rates in sat/vB
282
280
  * @throws FeeRecommendationsFetchError if fetching fee recommendations fails
283
281
  * @notInstrumented
284
282
  */
285
- const getFeeRecommendations = async () => {
286
- const response = await fetch(`${MEMPOOL_API_URL}/v1/fees/recommended`);
283
+ const getFeeRecommendations = async ({ mempoolApiUrl = require_bitcoinTransferAmount.MEMPOOL_API_URL } = {}) => {
284
+ const response = await fetch(`${mempoolApiUrl}/v1/fees/recommended`);
287
285
  if (!response.ok) throw new FeeRecommendationsFetchError({ response });
288
286
  return response.json();
289
287
  };
@@ -299,9 +297,9 @@ const getFeeRecommendations = async () => {
299
297
  * @returns Estimated fee in satoshis
300
298
  * @notInstrumented
301
299
  */
302
- const estimateTransactionFee = async ({ feePriority = "medium", numInputs, numOutputs }) => {
300
+ const estimateTransactionFee = async ({ feePriority = "medium", mempoolApiUrl, numInputs, numOutputs }) => {
303
301
  try {
304
- const feeData = await getFeeRecommendations();
302
+ const feeData = await getFeeRecommendations({ mempoolApiUrl });
305
303
  let feePerByte;
306
304
  if (feePriority === "high") feePerByte = feeData.fastestFee ?? feeData.halfHourFee ?? 1;
307
305
  else if (feePriority === "low") feePerByte = feeData.economyFee ?? feeData.hourFee ?? 1;
@@ -325,9 +323,10 @@ const estimateTransactionFee = async ({ feePriority = "medium", numInputs, numOu
325
323
  * @returns Object with feeEstimate, changeAmountNumber, and hasChangeOutput
326
324
  * @notInstrumented
327
325
  */
328
- const calculateFeeAndChange = async ({ amountInSatoshis, feePriority, selectedTotalValue, selectedUTXOs }) => {
326
+ const calculateFeeAndChange = async ({ amountInSatoshis, feePriority, mempoolApiUrl, selectedTotalValue, selectedUTXOs }) => {
329
327
  let feeEstimate = await estimateTransactionFee({
330
328
  feePriority,
329
+ mempoolApiUrl,
331
330
  numInputs: selectedUTXOs.length,
332
331
  numOutputs: 1
333
332
  });
@@ -336,6 +335,7 @@ const calculateFeeAndChange = async ({ amountInSatoshis, feePriority, selectedTo
336
335
  if (changeAmount > 0 && Number(changeAmount) >= DUST_LIMIT) {
337
336
  feeEstimate = await estimateTransactionFee({
338
337
  feePriority,
338
+ mempoolApiUrl,
339
339
  numInputs: selectedUTXOs.length,
340
340
  numOutputs: 2
341
341
  });
@@ -387,13 +387,14 @@ var UTXOsFetchError = class extends _dynamic_labs_sdk_client.BaseError {
387
387
  /**
388
388
  * Gets UTXOs for a Bitcoin address from mempool.space API
389
389
  *
390
- * @param address - The Bitcoin address to get UTXOs for
390
+ * @param options.address - The Bitcoin address to get UTXOs for
391
+ * @param options.mempoolApiUrl - Base mempool API URL for the active network
391
392
  * @returns Array of UTXOs
392
393
  * @throws UTXOsFetchError if fetching UTXOs fails
393
394
  * @notInstrumented
394
395
  */
395
- const getUTXOs = async (address$1) => {
396
- const response = await fetch(`${MEMPOOL_API_URL}/address/${address$1}/utxo`);
396
+ const getUTXOs = async ({ address: address$1, mempoolApiUrl = require_bitcoinTransferAmount.MEMPOOL_API_URL }) => {
397
+ const response = await fetch(`${mempoolApiUrl}/address/${address$1}/utxo`);
397
398
  if (!response.ok) throw new UTXOsFetchError({
398
399
  address: address$1,
399
400
  response
@@ -501,19 +502,23 @@ const validateNotTaproot = (accountAddress) => {
501
502
  * @throws Error if insufficient funds, no UTXOs, or other errors
502
503
  * @notInstrumented
503
504
  */
504
- const buildPsbt = async ({ accountAddress, amountInSatoshis, feePriority = "medium", network, publicKeyHex, recipientAddress }) => {
505
+ const buildPsbt = async ({ accountAddress, amountInSatoshis, feePriority = "medium", mempoolApiUrl, network, publicKeyHex, recipientAddress }) => {
505
506
  if (amountInSatoshis <= BigInt(0)) throw new InvalidAmountError({
506
507
  amountInSatoshis: Number(amountInSatoshis),
507
508
  reason: "Amount must be greater than 0"
508
509
  });
509
510
  validateNotTaproot(accountAddress);
510
- const allUTXOs = await getUTXOs(accountAddress);
511
+ const allUTXOs = await getUTXOs({
512
+ address: accountAddress,
513
+ mempoolApiUrl
514
+ });
511
515
  if (allUTXOs.length === 0) throw new NoUTXOsFoundError({ address: accountAddress });
512
516
  const publicKeyBuffer = new Uint8Array((0, _dynamic_labs_sdk_client_core.getBuffer)().from(publicKeyHex, "hex"));
513
517
  const publicKeyPair = (0, ecpair.ECPairFactory)(_bitcoinerlab_secp256k1.default).fromPublicKey(publicKeyBuffer, { compressed: true });
514
518
  const amountInSatoshisNumber = Number(amountInSatoshis);
515
519
  const initialFeeEstimate = await estimateTransactionFee({
516
520
  feePriority,
521
+ mempoolApiUrl,
517
522
  numInputs: 1,
518
523
  numOutputs: 1
519
524
  });
@@ -532,6 +537,7 @@ const buildPsbt = async ({ accountAddress, amountInSatoshis, feePriority = "medi
532
537
  const { changeAmountNumber, feeEstimate, hasChangeOutput } = await calculateFeeAndChange({
533
538
  amountInSatoshis,
534
539
  feePriority,
540
+ mempoolApiUrl,
535
541
  selectedTotalValue,
536
542
  selectedUTXOs
537
543
  });
@@ -559,6 +565,55 @@ const buildPsbt = async ({ accountAddress, amountInSatoshis, feePriority = "medi
559
565
  return psbt.toBase64();
560
566
  };
561
567
 
568
+ //#endregion
569
+ //#region src/errors/UnsupportedBitcoinNetworkError.ts
570
+ var UnsupportedBitcoinNetworkError = class extends _dynamic_labs_sdk_client.BaseError {
571
+ constructor(networkId) {
572
+ super({
573
+ cause: null,
574
+ code: "unsupported_bitcoin_network_error",
575
+ docsUrl: null,
576
+ name: "UnsupportedBitcoinNetworkError",
577
+ shortMessage: `Unsupported Bitcoin network id: ${networkId}`
578
+ });
579
+ }
580
+ };
581
+
582
+ //#endregion
583
+ //#region src/waas/utils/getActiveBitcoinNetworkConfig/getActiveBitcoinNetworkConfig.ts
584
+ /**
585
+ * Resolves a Dynamic Bitcoin network id (1 mainnet, 2 testnet, 3 signet) to
586
+ * the per-network configuration used by the WaaS provider. An undefined id
587
+ * (network never switched) resolves to mainnet.
588
+ *
589
+ * @throws {UnsupportedBitcoinNetworkError} for any other network id
590
+ * @notInstrumented
591
+ */
592
+ const getActiveBitcoinNetworkConfig = ({ networkId }) => {
593
+ const id = networkId ?? "1";
594
+ switch (id) {
595
+ case "1": return {
596
+ bitcoinNetwork: "mainnet",
597
+ mempoolApiUrl: require_bitcoinTransferAmount.MEMPOOL_API_URL,
598
+ networkId: id,
599
+ psbtNetwork: bitcoinjs_lib.networks.bitcoin
600
+ };
601
+ case "2": return {
602
+ bitcoinNetwork: "testnet",
603
+ mempoolApiUrl: require_bitcoinTransferAmount.MEMPOOL_API_URL_TESTNET,
604
+ networkId: id,
605
+ psbtNetwork: bitcoinjs_lib.networks.testnet
606
+ };
607
+ case "3": return {
608
+ bitcoinNetwork: "testnet",
609
+ mempoolApiUrl: require_bitcoinTransferAmount.MEMPOOL_API_URL_SIGNET,
610
+ networkId: id,
611
+ psbtNetwork: bitcoinjs_lib.networks.testnet
612
+ };
613
+ default: throw new UnsupportedBitcoinNetworkError(id);
614
+ }
615
+ };
616
+
562
617
  //#endregion
563
618
  //#region src/errors/PublicKeyNotFoundError.ts
564
619
  var PublicKeyNotFoundError = class extends _dynamic_labs_sdk_client.BaseError {
@@ -588,6 +643,25 @@ const getPublicKeyForWalletAccount = (walletAccount, client) => {
588
643
  throw new PublicKeyNotFoundError(walletAccount.address);
589
644
  };
590
645
 
646
+ //#endregion
647
+ //#region src/waas/utils/getWaasBitcoinAddressForNetwork/getWaasBitcoinAddressForNetwork.ts
648
+ /**
649
+ * Resolves the wallet's payment address for the given Bitcoin network. One
650
+ * WaaS wallet (one MPC key) exposes a per-network payment address via its
651
+ * network-tagged additional addresses. Falls back to the wallet account's
652
+ * primary address (the mainnet encoding) for legacy wallets without tagged
653
+ * rows.
654
+ *
655
+ * The wallet identity (keyshare/password lookups, signing) is always the
656
+ * primary address — this resolver is only for address-driven operations
657
+ * (UTXOs, balance, broadcast source).
658
+ *
659
+ * @notInstrumented
660
+ */
661
+ const getWaasBitcoinAddressForNetwork = ({ bitcoinNetwork, walletAccount }) => {
662
+ return walletAccount.addressesWithTypes?.find((address$1) => address$1.type === _dynamic_labs_sdk_api_core.WalletAddressType.Payment && address$1.network === bitcoinNetwork)?.address ?? walletAccount.address;
663
+ };
664
+
591
665
  //#endregion
592
666
  //#region src/waas/utils/createWalletProviderForWaasBitcoin/createWalletProviderForWaasBitcoin.ts
593
667
  /** @notInstrumented */
@@ -607,11 +681,18 @@ const createWalletProviderForWaasBitcoin = (sdkClient) => {
607
681
  client: sdkClient,
608
682
  walletProviderKey: key
609
683
  });
610
- const switchActiveNetwork = async ({ networkId }) => (0, _dynamic_labs_sdk_client_core.switchActiveNetworkInLastKnownRegistry)({
611
- client: sdkClient,
612
- networkId,
613
- walletProviderKey: key
614
- });
684
+ const switchActiveNetwork = async ({ networkId }) => {
685
+ getActiveBitcoinNetworkConfig({ networkId });
686
+ return (0, _dynamic_labs_sdk_client_core.switchActiveNetworkInLastKnownRegistry)({
687
+ client: sdkClient,
688
+ networkId,
689
+ walletProviderKey: key
690
+ });
691
+ };
692
+ const getActiveNetworkConfig = async () => {
693
+ const { networkId } = await getActiveNetworkId();
694
+ return getActiveBitcoinNetworkConfig({ networkId });
695
+ };
615
696
  const getConnectedAddresses = async () => {
616
697
  return { addresses: (0, _dynamic_labs_sdk_client_waas_core.getAllUserWaasAddressesForChain)({ chain }, sdkClient) };
617
698
  };
@@ -643,10 +724,11 @@ const createWalletProviderForWaasBitcoin = (sdkClient) => {
643
724
  const waasClient = await waasProvider.getWaasClient();
644
725
  const { signature: signedSessionId } = await (0, _dynamic_labs_sdk_client_core.getSignedSessionId)(sdkClient);
645
726
  const mfaToken = await (0, _dynamic_labs_sdk_client_core.consumeMfaTokenIfRequiredForAction)({ mfaAction: _dynamic_labs_sdk_api_core.MFAAction.WalletWaasSign }, sdkClient);
727
+ const { bitcoinNetwork } = await getActiveNetworkConfig();
646
728
  return { signature: await waasClient.signMessage({
647
729
  accountAddress: walletAccount.address,
648
730
  authToken: sdkClient.token ?? void 0,
649
- bitcoinConfig: { network: "mainnet" },
731
+ bitcoinConfig: { network: bitcoinNetwork },
650
732
  message,
651
733
  mfaToken,
652
734
  signedSessionId
@@ -655,11 +737,16 @@ const createWalletProviderForWaasBitcoin = (sdkClient) => {
655
737
  const buildPsbt$1 = async ({ transaction, walletAccount }) => {
656
738
  (0, _dynamic_labs_sdk_client_core.assertDefined)(walletAccount, "Wallet account is required");
657
739
  const publicKeyHex = getPublicKeyForWalletAccount(walletAccount, sdkClient);
740
+ const { bitcoinNetwork, mempoolApiUrl, psbtNetwork } = await getActiveNetworkConfig();
658
741
  return buildPsbt({
659
- accountAddress: walletAccount.address,
742
+ accountAddress: getWaasBitcoinAddressForNetwork({
743
+ bitcoinNetwork,
744
+ walletAccount
745
+ }),
660
746
  amountInSatoshis: transaction.amount,
661
747
  feePriority: transaction.feePriority ?? "medium",
662
- network: bitcoinjs_lib.networks.bitcoin,
748
+ mempoolApiUrl,
749
+ network: psbtNetwork,
663
750
  publicKeyHex,
664
751
  recipientAddress: transaction.recipientAddress
665
752
  });
@@ -679,9 +766,13 @@ const createWalletProviderForWaasBitcoin = (sdkClient) => {
679
766
  },
680
767
  walletAccount
681
768
  });
682
- const psbt = bitcoinjs_lib.Psbt.fromBase64(signedPsbt, { network: bitcoinjs_lib.networks.bitcoin });
769
+ const { mempoolApiUrl, psbtNetwork } = await getActiveNetworkConfig();
770
+ const psbt = bitcoinjs_lib.Psbt.fromBase64(signedPsbt, { network: psbtNetwork });
683
771
  psbt.finalizeAllInputs();
684
- return { transactionId: await broadcastTransaction(psbt.extractTransaction().toHex()) };
772
+ return { transactionId: await broadcastTransaction({
773
+ mempoolApiUrl,
774
+ rawTransaction: psbt.extractTransaction().toHex()
775
+ }) };
685
776
  };
686
777
  return {
687
778
  ...waasProvider,
@@ -755,4 +846,16 @@ Object.defineProperty(exports, 'addWaasBitcoinExtension', {
755
846
  return addWaasBitcoinExtension;
756
847
  }
757
848
  });
758
- //# sourceMappingURL=addWaasBitcoinExtension-BuxHED6F.cjs.map
849
+ Object.defineProperty(exports, 'getActiveBitcoinNetworkConfig', {
850
+ enumerable: true,
851
+ get: function () {
852
+ return getActiveBitcoinNetworkConfig;
853
+ }
854
+ });
855
+ Object.defineProperty(exports, 'getWaasBitcoinAddressForNetwork', {
856
+ enumerable: true,
857
+ get: function () {
858
+ return getWaasBitcoinAddressForNetwork;
859
+ }
860
+ });
861
+ //# sourceMappingURL=addWaasBitcoinExtension-Du9epD-l.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"addWaasBitcoinExtension-Du9epD-l.cjs","names":["BaseError","BaseError","MEMPOOL_API_URL","BaseError","BaseError","BaseError","address","BaseError","payments","address","BaseError","MEMPOOL_API_URL","feePerByte: number","BaseError","address","MEMPOOL_API_URL","address","selected: UTXO[]","BaseError","ecc","Psbt","BaseError","MEMPOOL_API_URL","networks","MEMPOOL_API_URL_TESTNET","MEMPOOL_API_URL_SIGNET","BaseError","address","address","WalletAddressType","WalletProviderEnum","DYNAMIC_WAAS_METADATA","getActiveNetworkId: WaasBitcoinWalletProvider['getActiveNetworkId']","switchActiveNetwork: WaasBitcoinWalletProvider['switchActiveNetwork']","getConnectedAddresses: WaasBitcoinWalletProvider['getConnectedAddresses']","signPsbt: WaasBitcoinWalletProvider['signPsbt']","MFAAction","signPsbts: WaasBitcoinWalletProvider['signPsbts']","signMessage: WaasBitcoinWalletProvider['signMessage']","buildPsbt: WaasBitcoinWalletProvider['buildPsbt']","buildPsbtUtil","sendBitcoin: WaasBitcoinWalletProvider['sendBitcoin']","buildPsbt","Psbt","bitcoinExecuteSwapTransaction","bitcoinTransferAmount","WalletProviderPriority"],"sources":["../src/errors/TransactionBroadcastFailedError.ts","../src/errors/TransactionRequiredError.ts","../src/waas/utils/broadcastTransaction/broadcastTransaction.ts","../src/waas/constants.ts","../src/errors/InsufficientFundsError.ts","../src/errors/InvalidAmountError.ts","../src/errors/NoUTXOsFoundError.ts","../src/errors/SegwitOutputScriptError.ts","../src/waas/utils/addInputsToPsbt/addInputsToPsbt.ts","../src/waas/utils/addOutputsToPsbt/addOutputsToPsbt.ts","../src/errors/FeeRecommendationsFetchError.ts","../src/waas/utils/getFeeRecommendations/getFeeRecommendations.ts","../src/waas/utils/estimateTransactionFee/estimateTransactionFee.ts","../src/waas/utils/calculateFeeAndChange/calculateFeeAndChange.ts","../src/waas/utils/calculateUTXOTotal/calculateUTXOTotal.ts","../src/errors/UTXOsFetchError.ts","../src/waas/utils/getUTXOs/getUTXOs.ts","../src/waas/utils/selectUTXOsLargestFirst/selectUTXOsLargestFirst.ts","../src/waas/utils/validateAndSelectUTXOs/validateAndSelectUTXOs.ts","../src/errors/TaprootAddressNotSupportedError.ts","../src/waas/utils/validateNotTaproot/validateNotTaproot.ts","../src/waas/utils/buildPsbt/buildPsbt.ts","../src/errors/UnsupportedBitcoinNetworkError.ts","../src/waas/utils/getActiveBitcoinNetworkConfig/getActiveBitcoinNetworkConfig.ts","../src/errors/PublicKeyNotFoundError.ts","../src/waas/utils/getPublicKeyForWalletAccount/getPublicKeyForWalletAccount.ts","../src/waas/utils/getWaasBitcoinAddressForNetwork/getWaasBitcoinAddressForNetwork.ts","../src/waas/utils/createWalletProviderForWaasBitcoin/createWalletProviderForWaasBitcoin.ts","../src/waas/addWaasBitcoinExtension/addWaasBitcoinExtension.ts"],"sourcesContent":["import { BaseError } from '@dynamic-labs-sdk/client';\n\ntype TransactionBroadcastFailedErrorParams = {\n response: Response;\n};\n\nexport class TransactionBroadcastFailedError extends BaseError {\n public readonly response: Response;\n\n constructor({ response }: TransactionBroadcastFailedErrorParams) {\n super({\n cause: null,\n code: 'transaction_broadcast_failed_error',\n details: `Status: ${response.status} ${response.statusText}`,\n docsUrl: null,\n name: 'TransactionBroadcastFailedError',\n shortMessage: 'Failed to broadcast transaction to mempool',\n });\n\n this.response = response;\n }\n}\n","import { BaseError } from '@dynamic-labs-sdk/client';\n\nexport class TransactionRequiredError extends BaseError {\n constructor() {\n super({\n cause: null,\n code: 'transaction_required_error',\n docsUrl: null,\n name: 'TransactionRequiredError',\n shortMessage: 'No transaction specified for broadcast',\n });\n }\n}\n","import { MEMPOOL_API_URL } from '../../../constants';\nimport { TransactionBroadcastFailedError } from '../../../errors/TransactionBroadcastFailedError';\nimport { TransactionRequiredError } from '../../../errors/TransactionRequiredError';\n\n/**\n * Sends a raw Bitcoin transaction to the mempool\n *\n * @param options.rawTransaction - The raw transaction in hex format\n * @param options.mempoolApiUrl - Base mempool API URL for the active network\n * @returns The transaction ID\n * @throws {TransactionRequiredError} if no transaction is specified\n * @throws {TransactionBroadcastFailedError} if broadcasting fails\n * @notInstrumented\n */\nexport const broadcastTransaction = async ({\n mempoolApiUrl = MEMPOOL_API_URL,\n rawTransaction,\n}: {\n mempoolApiUrl?: string;\n rawTransaction: string;\n}): Promise<string> => {\n if (!rawTransaction) {\n throw new TransactionRequiredError();\n }\n\n const response = await fetch(`${mempoolApiUrl}/tx`, {\n body: rawTransaction,\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded',\n },\n method: 'POST',\n });\n\n if (!response.ok) {\n throw new TransactionBroadcastFailedError({ response });\n }\n\n return response.text();\n};\n","/**\n * Number of satoshis per Bitcoin\n */\nexport const SATOSHIS_PER_BTC = 100_000_000;\n\n/**\n * Bitcoin's dust limit in satoshis\n * Outputs below this value are considered \"dust\" and will be rejected by nodes\n */\nexport const DUST_LIMIT = 546;\n\n/**\n * Accurate vSize constants for Native SegWit (P2WPKH) transactions\n * Used for precise fee estimation\n */\nexport const VSIZE_OVERHEAD = 10.5;\n\nexport const VSIZE_INPUT_P2WPKH = 68;\n\nexport const VSIZE_OUTPUT_P2WPKH = 31;\n\n/**\n * Minimum relay fee in satoshis\n * Added to fee estimate to ensure transaction propagation\n */\nexport const MIN_RELAY_FEE = 111;\n\n/**\n * Conservative default fee estimate in satoshis\n * Used as fallback when fee estimation fails\n */\nexport const DEFAULT_FEE_ESTIMATE = 1000;\n\n/**\n * RBF (Replace-By-Fee) sequence number\n * 0xfffffffd = 4294967293 (enables RBF, not final)\n */\nexport const RBF_SEQUENCE = 0xfffffffd;\n","import { BaseError } from '@dynamic-labs-sdk/client';\n\nimport { SATOSHIS_PER_BTC } from '../waas/constants';\n\ntype InsufficientFundsErrorParams = {\n availableSatoshis: number;\n requiredSatoshis: number;\n};\n\nexport class InsufficientFundsError extends BaseError {\n public readonly availableSatoshis: number;\n\n public readonly requiredSatoshis: number;\n\n constructor({ availableSatoshis, requiredSatoshis }: InsufficientFundsErrorParams) {\n const availableBtc = availableSatoshis / SATOSHIS_PER_BTC;\n const requiredBtc = requiredSatoshis / SATOSHIS_PER_BTC;\n\n super({\n cause: null,\n code: 'insufficient_funds_error',\n details: `Available: ${availableBtc} BTC (${availableSatoshis} satoshis), Required: ${requiredBtc} BTC (${requiredSatoshis} satoshis)`,\n docsUrl: null,\n name: 'InsufficientFundsError',\n shortMessage: 'Insufficient funds for transaction',\n });\n\n this.availableSatoshis = availableSatoshis;\n\n this.requiredSatoshis = requiredSatoshis;\n }\n}\n","import { BaseError } from '@dynamic-labs-sdk/client';\n\ntype InvalidAmountErrorParams = {\n amountInSatoshis: number;\n reason: string;\n};\n\nexport class InvalidAmountError extends BaseError {\n public readonly amountInSatoshis: number;\n\n constructor({ amountInSatoshis, reason }: InvalidAmountErrorParams) {\n super({\n cause: null,\n code: 'invalid_amount_error',\n details: `Amount: ${amountInSatoshis} satoshis`,\n docsUrl: null,\n name: 'InvalidAmountError',\n shortMessage: reason,\n });\n\n this.amountInSatoshis = amountInSatoshis;\n }\n}\n","import { BaseError } from '@dynamic-labs-sdk/client';\n\ntype NoUTXOsFoundErrorParams = {\n address: string;\n};\n\nexport class NoUTXOsFoundError extends BaseError {\n public readonly address: string;\n\n constructor({ address }: NoUTXOsFoundErrorParams) {\n super({\n cause: null,\n code: 'no_utxos_found_error',\n details: `Address: ${address}`,\n docsUrl: null,\n name: 'NoUTXOsFoundError',\n shortMessage: 'No UTXOs found for this address',\n });\n\n this.address = address;\n }\n}\n","import { BaseError } from '@dynamic-labs-sdk/client';\n\nexport class SegwitOutputScriptError extends BaseError {\n constructor() {\n super({\n cause: null,\n code: 'segwit_output_script_error',\n docsUrl: null,\n name: 'SegwitOutputScriptError',\n shortMessage: 'Failed to create segwit output script',\n });\n }\n}\n","import { getBuffer } from '@dynamic-labs-sdk/client/core';\nimport type { Network, Psbt } from 'bitcoinjs-lib';\nimport { payments } from 'bitcoinjs-lib';\n\nimport { SegwitOutputScriptError } from '../../../errors/SegwitOutputScriptError';\nimport { RBF_SEQUENCE } from '../../constants';\nimport type { UTXO } from '../../WaasBitcoinWalletProvider.types';\n\ntype AddInputsToPsbtOptions = {\n network: Network;\n psbt: Psbt;\n publicKeyPair: { publicKey: Uint8Array };\n selectedUTXOs: UTXO[];\n};\n\n/**\n * Adds inputs to PSBT from selected UTXOs\n *\n * @param options.network - Bitcoin network configuration (mainnet or testnet)\n * @param options.psbt - The PSBT instance to add inputs to\n * @param options.publicKeyPair - Key pair containing the public key for witness script\n * @param options.selectedUTXOs - Array of UTXOs to add as inputs\n * @notInstrumented\n */\nexport const addInputsToPsbt = (options: AddInputsToPsbtOptions): void => {\n const { network, psbt, publicKeyPair, selectedUTXOs } = options;\n\n for (const utxo of selectedUTXOs) {\n const outputScript = payments.p2wpkh({\n network,\n pubkey: publicKeyPair.publicKey,\n }).output;\n\n if (!outputScript) {\n throw new SegwitOutputScriptError();\n }\n\n const txidBuffer = new Uint8Array(\n getBuffer().from(utxo.txid, 'hex').reverse()\n );\n\n psbt.addInput({\n hash: txidBuffer,\n index: utxo.vout,\n sequence: RBF_SEQUENCE,\n witnessUtxo: {\n script: outputScript,\n value: BigInt(utxo.value),\n },\n });\n }\n};\n","import type { Network, Psbt } from 'bitcoinjs-lib';\nimport { address } from 'bitcoinjs-lib';\n\nimport { InvalidAmountError } from '../../../errors/InvalidAmountError';\nimport { DUST_LIMIT, SATOSHIS_PER_BTC } from '../../constants';\n\ntype AddOutputsToPsbtOptions = {\n accountAddress: string;\n amountInSatoshis: number;\n changeAmount: number;\n hasChangeOutput: boolean;\n network: Network;\n psbt: Psbt;\n recipientAddress: string;\n};\n\n/**\n * Adds outputs to PSBT (recipient and optionally change)\n *\n * @param options.accountAddress - The sender's address for receiving change\n * @param options.amountInSatoshis - Amount to send to the recipient in satoshis\n * @param options.changeAmount - Amount to return as change in satoshis\n * @param options.hasChangeOutput - Whether to include a change output\n * @param options.network - Bitcoin network configuration (mainnet or testnet)\n * @param options.psbt - The PSBT instance to add outputs to\n * @param options.recipientAddress - The recipient's Bitcoin address\n * @notInstrumented\n */\nexport const addOutputsToPsbt = (options: AddOutputsToPsbtOptions): void => {\n const {\n accountAddress,\n amountInSatoshis,\n changeAmount,\n hasChangeOutput,\n network,\n psbt,\n recipientAddress,\n } = options;\n\n if (amountInSatoshis < DUST_LIMIT) {\n throw new InvalidAmountError({\n amountInSatoshis,\n reason: `Amount is below dust limit of ${DUST_LIMIT} satoshis (${DUST_LIMIT / SATOSHIS_PER_BTC} BTC)`,\n });\n }\n\n psbt.addOutput({\n script: address.toOutputScript(recipientAddress, network),\n value: BigInt(amountInSatoshis),\n });\n\n if (hasChangeOutput) {\n psbt.addOutput({\n script: address.toOutputScript(accountAddress, network),\n value: BigInt(changeAmount),\n });\n }\n};\n","import { BaseError } from '@dynamic-labs-sdk/client';\n\ntype FeeRecommendationsFetchErrorParams = {\n response: Response;\n};\n\nexport class FeeRecommendationsFetchError extends BaseError {\n public readonly response: Response;\n\n constructor({ response }: FeeRecommendationsFetchErrorParams) {\n super({\n cause: null,\n code: 'fee_recommendations_fetch_error',\n details: `Status: ${response.status} ${response.statusText}`,\n docsUrl: null,\n name: 'FeeRecommendationsFetchError',\n shortMessage: 'Failed to fetch fee recommendations from mempool',\n });\n\n this.response = response;\n }\n}\n","import { MEMPOOL_API_URL } from '../../../constants';\nimport { FeeRecommendationsFetchError } from '../../../errors/FeeRecommendationsFetchError';\nimport type { FeeRecommendations } from '../../WaasBitcoinWalletProvider.types';\n\n/**\n * Gets fee recommendations from mempool.space API\n *\n * @param options.mempoolApiUrl - Base mempool API URL for the active network\n * @returns Fee recommendation data with rates in sat/vB\n * @throws FeeRecommendationsFetchError if fetching fee recommendations fails\n * @notInstrumented\n */\nexport const getFeeRecommendations = async ({\n mempoolApiUrl = MEMPOOL_API_URL,\n}: {\n mempoolApiUrl?: string;\n} = {}): Promise<FeeRecommendations> => {\n const response = await fetch(`${mempoolApiUrl}/v1/fees/recommended`);\n\n if (!response.ok) {\n throw new FeeRecommendationsFetchError({ response });\n }\n\n return response.json();\n};\n","import {\n DEFAULT_FEE_ESTIMATE,\n MIN_RELAY_FEE,\n VSIZE_INPUT_P2WPKH,\n VSIZE_OUTPUT_P2WPKH,\n VSIZE_OVERHEAD,\n} from '../../constants';\nimport type { FeePriority } from '../../WaasBitcoinWalletProvider.types';\nimport { getFeeRecommendations } from '../getFeeRecommendations';\n\ntype EstimateTransactionFeeOptions = {\n feePriority?: FeePriority;\n mempoolApiUrl?: string;\n numInputs: number;\n numOutputs: number;\n};\n\n/**\n * Estimates transaction fees based on number of inputs and outputs using accurate vSize\n *\n * @param options.feePriority - Priority level for fee estimation ('low', 'medium', or 'high')\n * @param options.numInputs - Number of transaction inputs (UTXOs being spent)\n * @param options.numOutputs - Number of transaction outputs\n * @returns Estimated fee in satoshis\n * @notInstrumented\n */\nexport const estimateTransactionFee = async ({\n feePriority = 'medium',\n mempoolApiUrl,\n numInputs,\n numOutputs,\n}: EstimateTransactionFeeOptions): Promise<number> => {\n try {\n const feeData = await getFeeRecommendations({ mempoolApiUrl });\n\n let feePerByte: number;\n\n if (feePriority === 'high') {\n feePerByte = feeData.fastestFee ?? feeData.halfHourFee ?? 1;\n } else if (feePriority === 'low') {\n feePerByte = feeData.economyFee ?? feeData.hourFee ?? 1;\n } else {\n feePerByte =\n feeData.halfHourFee ?? feeData.hourFee ?? feeData.economyFee ?? 1;\n }\n\n const vSize =\n VSIZE_OVERHEAD +\n numInputs * VSIZE_INPUT_P2WPKH +\n numOutputs * VSIZE_OUTPUT_P2WPKH;\n\n return Math.ceil(feePerByte * vSize) + MIN_RELAY_FEE;\n } catch {\n return DEFAULT_FEE_ESTIMATE;\n }\n};\n","import { DUST_LIMIT } from '../../constants';\nimport type { FeePriority, UTXO } from '../../WaasBitcoinWalletProvider.types';\nimport { estimateTransactionFee } from '../estimateTransactionFee';\n\ntype CalculateFeeAndChangeOptions = {\n amountInSatoshis: bigint;\n feePriority: FeePriority;\n mempoolApiUrl?: string;\n selectedTotalValue: number;\n selectedUTXOs: UTXO[];\n};\n\ntype CalculateFeeAndChangeResult = {\n changeAmountNumber: number;\n feeEstimate: number;\n hasChangeOutput: boolean;\n};\n\n/**\n * Calculates fee estimate and change amount, handling dust limit\n *\n * @param options.amountInSatoshis - Amount to send in satoshis\n * @param options.feePriority - Priority level for fee estimation ('low', 'medium', or 'high')\n * @param options.selectedTotalValue - Total value of selected UTXOs in satoshis\n * @param options.selectedUTXOs - Array of selected UTXOs for the transaction\n * @returns Object with feeEstimate, changeAmountNumber, and hasChangeOutput\n * @notInstrumented\n */\nexport const calculateFeeAndChange = async ({\n amountInSatoshis,\n feePriority,\n mempoolApiUrl,\n selectedTotalValue,\n selectedUTXOs,\n}: CalculateFeeAndChangeOptions): Promise<CalculateFeeAndChangeResult> => {\n let feeEstimate = await estimateTransactionFee({\n feePriority,\n mempoolApiUrl,\n numInputs: selectedUTXOs.length,\n numOutputs: 1,\n });\n\n let maxToSpend = selectedTotalValue - feeEstimate;\n let changeAmount = BigInt(maxToSpend) - amountInSatoshis;\n\n const changeAmountNumber = Number(changeAmount);\n\n if (changeAmount > 0 && changeAmountNumber >= DUST_LIMIT) {\n feeEstimate = await estimateTransactionFee({\n feePriority,\n mempoolApiUrl,\n numInputs: selectedUTXOs.length,\n numOutputs: 2,\n });\n maxToSpend = selectedTotalValue - feeEstimate;\n changeAmount = BigInt(maxToSpend) - amountInSatoshis;\n }\n\n const finalChangeAmountNumber = Number(changeAmount);\n const hasChangeOutput =\n changeAmount > 0 && finalChangeAmountNumber >= DUST_LIMIT;\n\n if (changeAmount > 0 && finalChangeAmountNumber < DUST_LIMIT) {\n feeEstimate += finalChangeAmountNumber;\n }\n\n return {\n changeAmountNumber: finalChangeAmountNumber,\n feeEstimate,\n hasChangeOutput,\n };\n};\n","import type { UTXO } from '../../WaasBitcoinWalletProvider.types';\n\n/**\n * Calculates the total value of UTXOs\n *\n * @param utxos - Array of UTXOs\n * @returns Total value in satoshis\n * @notInstrumented\n */\nexport const calculateUTXOTotal = (utxos: UTXO[]): number =>\n utxos.reduce((total: number, utxo: UTXO) => total + utxo.value, 0);\n","import { BaseError } from '@dynamic-labs-sdk/client';\n\ntype UTXOsFetchErrorParams = {\n address: string;\n response: Response;\n};\n\nexport class UTXOsFetchError extends BaseError {\n public readonly address: string;\n\n public readonly response: Response;\n\n constructor({ address, response }: UTXOsFetchErrorParams) {\n super({\n cause: null,\n code: 'utxos_fetch_error',\n details: `Address: ${address}, Status: ${response.status} ${response.statusText}`,\n docsUrl: null,\n name: 'UTXOsFetchError',\n shortMessage: 'Failed to fetch UTXOs from mempool',\n });\n\n this.address = address;\n\n this.response = response;\n }\n}\n","import { MEMPOOL_API_URL } from '../../../constants';\nimport { UTXOsFetchError } from '../../../errors/UTXOsFetchError';\nimport type { UTXO } from '../../WaasBitcoinWalletProvider.types';\n\n/**\n * Gets UTXOs for a Bitcoin address from mempool.space API\n *\n * @param options.address - The Bitcoin address to get UTXOs for\n * @param options.mempoolApiUrl - Base mempool API URL for the active network\n * @returns Array of UTXOs\n * @throws UTXOsFetchError if fetching UTXOs fails\n * @notInstrumented\n */\nexport const getUTXOs = async ({\n address,\n mempoolApiUrl = MEMPOOL_API_URL,\n}: {\n address: string;\n mempoolApiUrl?: string;\n}): Promise<UTXO[]> => {\n const response = await fetch(`${mempoolApiUrl}/address/${address}/utxo`);\n\n if (!response.ok) {\n throw new UTXOsFetchError({ address, response });\n }\n\n return response.json();\n};\n","import type { UTXO } from '../../WaasBitcoinWalletProvider.types';\n\ntype SelectUTXOsLargestFirstOptions = {\n targetAmount: number;\n utxos: UTXO[];\n};\n\n/**\n * Selects UTXOs using Largest-First (Accumulator) strategy\n * Sorts UTXOs by value (descending) and selects until we have enough to cover amount + fees\n *\n * @param options.targetAmount - Target amount in satoshis (amount + fees + dust limit)\n * @param options.utxos - Array of available UTXOs to select from\n * @returns Selected UTXOs\n * @notInstrumented\n */\nexport const selectUTXOsLargestFirst = (\n options: SelectUTXOsLargestFirstOptions\n) => {\n const { targetAmount, utxos } = options;\n\n const sortedUTXOs = [...utxos].sort((a, b) => b.value - a.value);\n\n const selected: UTXO[] = [];\n let total = 0;\n\n for (const utxo of sortedUTXOs) {\n selected.push(utxo);\n total += utxo.value;\n\n if (total >= targetAmount) {\n break;\n }\n }\n\n return selected;\n};\n","import { InsufficientFundsError } from '../../../errors/InsufficientFundsError';\nimport type { UTXO } from '../../WaasBitcoinWalletProvider.types';\nimport { calculateUTXOTotal } from '../calculateUTXOTotal';\n\ntype ValidateAndSelectUTXOsOptions = {\n allUTXOs: UTXO[];\n amountInSatoshis: number;\n feeEstimate: number;\n selectedTotal: number;\n selectedUTXOs: UTXO[];\n};\n\n/**\n * Validates and ensures sufficient funds for the transaction\n *\n * @param options.allUTXOs - Complete array of available UTXOs for the address\n * @param options.amountInSatoshis - Amount to send in satoshis\n * @param options.feeEstimate - Estimated transaction fee in satoshis\n * @param options.selectedTotal - Total value of initially selected UTXOs in satoshis\n * @param options.selectedUTXOs - Array of initially selected UTXOs\n * @returns Validated selected UTXOs\n * @throws InsufficientFundsError if insufficient funds\n * @notInstrumented\n */\nexport const validateAndSelectUTXOs = (\n options: ValidateAndSelectUTXOsOptions\n) => {\n const {\n allUTXOs,\n amountInSatoshis,\n feeEstimate,\n selectedTotal,\n selectedUTXOs,\n } = options;\n\n const requiredAmount = amountInSatoshis + feeEstimate;\n\n if (selectedTotal >= requiredAmount) {\n return selectedUTXOs;\n }\n\n if (selectedUTXOs.length < allUTXOs.length) {\n const allTotal = calculateUTXOTotal(allUTXOs);\n\n if (allTotal < requiredAmount) {\n throw new InsufficientFundsError({\n availableSatoshis: allTotal,\n requiredSatoshis: amountInSatoshis,\n });\n }\n\n return allUTXOs;\n }\n\n throw new InsufficientFundsError({\n availableSatoshis: selectedTotal,\n requiredSatoshis: amountInSatoshis,\n });\n};\n","import { BaseError } from '@dynamic-labs-sdk/client';\n\nexport class TaprootAddressNotSupportedError extends BaseError {\n constructor() {\n super({\n cause: null,\n code: 'taproot_address_not_supported',\n docsUrl: null,\n name: 'TaprootAddressNotSupportedError',\n shortMessage:\n 'Taproot addresses are not supported for PSBT building. Only Native SegWit (P2WPKH) addresses are allowed.',\n });\n }\n}\n","import { TaprootAddressNotSupportedError } from '../../../errors/TaprootAddressNotSupportedError';\n\n/**\n * Validates that the address is not a Taproot address\n * Only Native SegWit (P2WPKH) is supported for PSBT building\n *\n * @param accountAddress - The account address to check\n * @throws TaprootAddressNotSupportedError if address is Taproot\n * @notInstrumented\n */\n// eslint-disable-next-line custom-rules/require-single-object-param\nexport const validateNotTaproot = (accountAddress: string): void => {\n if (\n accountAddress.toLowerCase().startsWith('bc1p') ||\n accountAddress.toLowerCase().startsWith('tb1p')\n ) {\n throw new TaprootAddressNotSupportedError();\n }\n};\n","import ecc from '@bitcoinerlab/secp256k1';\nimport { getBuffer } from '@dynamic-labs-sdk/client/core';\nimport type { Network } from 'bitcoinjs-lib';\nimport { Psbt } from 'bitcoinjs-lib';\nimport { ECPairFactory } from 'ecpair';\n\nimport { InsufficientFundsError } from '../../../errors/InsufficientFundsError';\nimport { InvalidAmountError } from '../../../errors/InvalidAmountError';\nimport { NoUTXOsFoundError } from '../../../errors/NoUTXOsFoundError';\nimport { DUST_LIMIT } from '../../constants';\nimport type { FeePriority } from '../../WaasBitcoinWalletProvider.types';\nimport { addInputsToPsbt } from '../addInputsToPsbt';\nimport { addOutputsToPsbt } from '../addOutputsToPsbt';\nimport { calculateFeeAndChange } from '../calculateFeeAndChange';\nimport { calculateUTXOTotal } from '../calculateUTXOTotal';\nimport { estimateTransactionFee } from '../estimateTransactionFee';\nimport { getUTXOs } from '../getUTXOs';\nimport { selectUTXOsLargestFirst } from '../selectUTXOsLargestFirst';\nimport { validateAndSelectUTXOs } from '../validateAndSelectUTXOs';\nimport { validateNotTaproot } from '../validateNotTaproot';\n\ntype BuildPsbtOptions = {\n accountAddress: string;\n amountInSatoshis: bigint;\n feePriority?: FeePriority;\n mempoolApiUrl?: string;\n network: Network;\n publicKeyHex: string;\n recipientAddress: string;\n};\n\n/**\n * Builds a PSBT for a Bitcoin transaction with real UTXOs\n * Uses Largest-First UTXO selection strategy with accurate vSize fee estimation\n *\n * @param options.accountAddress - The sender's Bitcoin address\n * @param options.amountInSatoshis - Amount to send in satoshis\n * @param options.feePriority - Priority level for fee estimation ('low', 'medium', or 'high')\n * @param options.network - Bitcoin network configuration (mainnet or testnet)\n * @param options.publicKeyHex - The sender's public key in hexadecimal format\n * @param options.recipientAddress - The recipient's Bitcoin address\n * @returns A PSBT in Base64 format\n * @throws Error if insufficient funds, no UTXOs, or other errors\n * @notInstrumented\n */\nexport const buildPsbt = async ({\n accountAddress,\n amountInSatoshis,\n feePriority = 'medium',\n mempoolApiUrl,\n network,\n publicKeyHex,\n recipientAddress,\n}: BuildPsbtOptions): Promise<string> => {\n if (amountInSatoshis <= BigInt(0)) {\n throw new InvalidAmountError({\n amountInSatoshis: Number(amountInSatoshis),\n reason: 'Amount must be greater than 0',\n });\n }\n\n validateNotTaproot(accountAddress);\n\n const allUTXOs = await getUTXOs({ address: accountAddress, mempoolApiUrl });\n\n if (allUTXOs.length === 0) {\n throw new NoUTXOsFoundError({ address: accountAddress });\n }\n\n const publicKeyBuffer = new Uint8Array(getBuffer().from(publicKeyHex, 'hex'));\n const ECPair = ECPairFactory(ecc);\n\n // @ts-expect-error - ecpair types are incompatible with valibot >=1.2.0\n // The options are actually optional at runtime, but TypeScript infers them as required\n const publicKeyPair = ECPair.fromPublicKey(publicKeyBuffer, {\n compressed: true,\n });\n\n const amountInSatoshisNumber = Number(amountInSatoshis);\n\n const initialFeeEstimate = await estimateTransactionFee({\n feePriority,\n mempoolApiUrl,\n numInputs: 1,\n numOutputs: 1,\n });\n\n const targetAmount = amountInSatoshisNumber + initialFeeEstimate + DUST_LIMIT;\n\n let selectedUTXOs = selectUTXOsLargestFirst({\n targetAmount,\n utxos: allUTXOs,\n });\n const selectedTotal = calculateUTXOTotal(selectedUTXOs);\n\n selectedUTXOs = validateAndSelectUTXOs({\n allUTXOs,\n amountInSatoshis: amountInSatoshisNumber,\n feeEstimate: initialFeeEstimate,\n selectedTotal,\n selectedUTXOs,\n });\n\n const selectedTotalValue = calculateUTXOTotal(selectedUTXOs);\n\n const { changeAmountNumber, feeEstimate, hasChangeOutput } =\n await calculateFeeAndChange({\n amountInSatoshis,\n feePriority,\n mempoolApiUrl,\n selectedTotalValue,\n selectedUTXOs,\n });\n\n const maxToSpend = selectedTotalValue - feeEstimate;\n\n if (maxToSpend < amountInSatoshisNumber) {\n throw new InsufficientFundsError({\n availableSatoshis: maxToSpend,\n requiredSatoshis: amountInSatoshisNumber,\n });\n }\n\n const psbt = new Psbt({ network });\n\n addInputsToPsbt({\n network,\n psbt,\n publicKeyPair,\n selectedUTXOs,\n });\n\n addOutputsToPsbt({\n accountAddress,\n amountInSatoshis: amountInSatoshisNumber,\n changeAmount: changeAmountNumber,\n hasChangeOutput,\n network,\n psbt,\n recipientAddress,\n });\n\n return psbt.toBase64();\n};\n","import { BaseError } from '@dynamic-labs-sdk/client';\n\nexport class UnsupportedBitcoinNetworkError extends BaseError {\n // eslint-disable-next-line custom-rules/require-single-object-param\n constructor(networkId: string) {\n super({\n cause: null,\n code: 'unsupported_bitcoin_network_error',\n docsUrl: null,\n name: 'UnsupportedBitcoinNetworkError',\n shortMessage: `Unsupported Bitcoin network id: ${networkId}`,\n });\n }\n}\n","import type { Network } from 'bitcoinjs-lib';\nimport { networks } from 'bitcoinjs-lib';\n\nimport {\n MEMPOOL_API_URL,\n MEMPOOL_API_URL_SIGNET,\n MEMPOOL_API_URL_TESTNET,\n} from '../../../constants';\nimport { UnsupportedBitcoinNetworkError } from '../../../errors/UnsupportedBitcoinNetworkError';\n\nexport type ActiveBitcoinNetworkConfig = {\n /** WaaS signing network for `bitcoinConfig.network`. */\n bitcoinNetwork: 'mainnet' | 'testnet';\n /** Base mempool.space API URL for the network. */\n mempoolApiUrl: string;\n networkId: string;\n /** bitcoinjs-lib network for PSBT encoding. */\n psbtNetwork: Network;\n};\n\n/**\n * Resolves a Dynamic Bitcoin network id (1 mainnet, 2 testnet, 3 signet) to\n * the per-network configuration used by the WaaS provider. An undefined id\n * (network never switched) resolves to mainnet.\n *\n * @throws {UnsupportedBitcoinNetworkError} for any other network id\n * @notInstrumented\n */\nexport const getActiveBitcoinNetworkConfig = ({\n networkId,\n}: {\n networkId: string | undefined;\n}): ActiveBitcoinNetworkConfig => {\n const id = networkId ?? '1';\n\n switch (id) {\n case '1':\n return {\n bitcoinNetwork: 'mainnet',\n mempoolApiUrl: MEMPOOL_API_URL,\n networkId: id,\n psbtNetwork: networks.bitcoin,\n };\n case '2':\n return {\n bitcoinNetwork: 'testnet',\n mempoolApiUrl: MEMPOOL_API_URL_TESTNET,\n networkId: id,\n psbtNetwork: networks.testnet,\n };\n case '3':\n return {\n bitcoinNetwork: 'testnet',\n mempoolApiUrl: MEMPOOL_API_URL_SIGNET,\n networkId: id,\n psbtNetwork: networks.testnet,\n };\n default:\n throw new UnsupportedBitcoinNetworkError(id);\n }\n};\n","import { BaseError } from '@dynamic-labs-sdk/client';\n\nexport class PublicKeyNotFoundError extends BaseError {\n // eslint-disable-next-line custom-rules/require-single-object-param\n constructor(address: string) {\n super({\n cause: null,\n code: 'public_key_not_found_error',\n docsUrl: null,\n name: 'PublicKeyNotFoundError',\n shortMessage: `No public key found for address ${address}`,\n });\n }\n}\n\n","import type { DynamicClient, WalletAccount } from '@dynamic-labs-sdk/client';\nimport { getCore } from '@dynamic-labs-sdk/client/core';\n\nimport { PublicKeyNotFoundError } from '../../../errors/PublicKeyNotFoundError';\n\n/**\n * Gets the public key for a wallet account from the user's verified credentials\n * @notInstrumented\n */\nexport const getPublicKeyForWalletAccount = (\n walletAccount: WalletAccount,\n client: DynamicClient\n): string => {\n const user = getCore(client).state.get().user;\n\n for (const credential of user?.verifiedCredentials ?? []) {\n const additionalAddress = credential.walletAdditionalAddresses?.find(\n (addr) => addr.address === walletAccount.address\n );\n\n if (additionalAddress?.publicKey) {\n return additionalAddress.publicKey;\n }\n }\n\n throw new PublicKeyNotFoundError(walletAccount.address);\n};\n","import type { WalletAccount } from '@dynamic-labs-sdk/client';\nimport { WalletAddressType } from '@dynamic-labs/sdk-api-core';\n\n/**\n * Resolves the wallet's payment address for the given Bitcoin network. One\n * WaaS wallet (one MPC key) exposes a per-network payment address via its\n * network-tagged additional addresses. Falls back to the wallet account's\n * primary address (the mainnet encoding) for legacy wallets without tagged\n * rows.\n *\n * The wallet identity (keyshare/password lookups, signing) is always the\n * primary address — this resolver is only for address-driven operations\n * (UTXOs, balance, broadcast source).\n *\n * @notInstrumented\n */\nexport const getWaasBitcoinAddressForNetwork = ({\n bitcoinNetwork,\n walletAccount,\n}: {\n bitcoinNetwork: 'mainnet' | 'testnet';\n walletAccount: WalletAccount;\n}): string => {\n const taggedAddress = walletAccount.addressesWithTypes?.find(\n (address) =>\n address.type === WalletAddressType.Payment &&\n address.network === bitcoinNetwork\n )?.address;\n\n return taggedAddress ?? walletAccount.address;\n};\n","import type { DynamicClient } from '@dynamic-labs-sdk/client';\nimport {\n assertDefined,\n consumeMfaTokenIfRequiredForAction,\n formatWalletProviderGroupKey,\n formatWalletProviderKey,\n getActiveNetworkIdFromLastKnownRegistry,\n getSignedSessionId,\n switchActiveNetworkInLastKnownRegistry,\n} from '@dynamic-labs-sdk/client/core';\nimport type { BitcoinNetwork } from '@dynamic-labs-sdk/client/waas/core';\nimport {\n DYNAMIC_WAAS_METADATA,\n createWaasProvider,\n getAllUserWaasAddressesForChain,\n} from '@dynamic-labs-sdk/client/waas/core';\nimport { MFAAction, WalletProviderEnum } from '@dynamic-labs/sdk-api-core';\nimport { Psbt } from 'bitcoinjs-lib';\n\nimport type { BitcoinSendTransactionResponse } from '../../../BitcoinWalletProvider.types';\nimport { bitcoinExecuteSwapTransaction } from '../../../utils/bitcoinExecuteSwapTransaction';\nimport { bitcoinTransferAmount } from '../../../utils/bitcoinTransferAmount';\nimport type {\n WaasBitcoinTransaction,\n WaasBitcoinWalletProvider,\n} from '../../WaasBitcoinWalletProvider.types';\nimport { broadcastTransaction } from '../broadcastTransaction';\nimport { buildPsbt as buildPsbtUtil } from '../buildPsbt';\nimport { getActiveBitcoinNetworkConfig } from '../getActiveBitcoinNetworkConfig';\nimport { getPublicKeyForWalletAccount } from '../getPublicKeyForWalletAccount/getPublicKeyForWalletAccount';\nimport { getWaasBitcoinAddressForNetwork } from '../getWaasBitcoinAddressForNetwork';\n\n/** @notInstrumented */\nexport const createWalletProviderForWaasBitcoin = (\n sdkClient: DynamicClient\n): WaasBitcoinWalletProvider => {\n const chain = 'BTC' as const;\n\n const walletProviderType = WalletProviderEnum.EmbeddedWallet;\n\n const key = formatWalletProviderKey({\n chain,\n displayName: DYNAMIC_WAAS_METADATA.displayName,\n walletProviderType,\n });\n\n const waasProvider = createWaasProvider({ chain, sdkClient });\n\n const getActiveNetworkId: WaasBitcoinWalletProvider['getActiveNetworkId'] =\n async () =>\n getActiveNetworkIdFromLastKnownRegistry({\n client: sdkClient,\n walletProviderKey: key,\n });\n\n const switchActiveNetwork: WaasBitcoinWalletProvider['switchActiveNetwork'] =\n async ({ networkId }) => {\n // Validates the id before persisting it — an unsupported network must\n // fail the switch rather than silently degrade to mainnet later.\n getActiveBitcoinNetworkConfig({ networkId });\n\n return switchActiveNetworkInLastKnownRegistry({\n client: sdkClient,\n networkId,\n walletProviderKey: key,\n });\n };\n\n const getActiveNetworkConfig = async () => {\n const { networkId } = await getActiveNetworkId();\n\n return getActiveBitcoinNetworkConfig({ networkId });\n };\n\n const getConnectedAddresses: WaasBitcoinWalletProvider['getConnectedAddresses'] =\n async () => {\n const waasBitcoinAddresses = getAllUserWaasAddressesForChain(\n { chain },\n sdkClient\n );\n\n return {\n addresses: waasBitcoinAddresses,\n };\n };\n\n const signPsbt: WaasBitcoinWalletProvider['signPsbt'] = async ({\n request,\n walletAccount,\n }) => {\n assertDefined(walletAccount, 'Wallet account is required');\n\n const waasClient = await waasProvider.getWaasClient();\n\n const { signature: signedSessionId } = await getSignedSessionId(sdkClient);\n\n const mfaToken = await consumeMfaTokenIfRequiredForAction(\n { mfaAction: MFAAction.WalletWaasSign },\n sdkClient\n );\n\n const signedPsbt = await waasClient.signTransaction({\n authToken: sdkClient.token ?? undefined,\n mfaToken,\n senderAddress: walletAccount.address,\n signedSessionId,\n transaction: request.unsignedPsbtBase64,\n });\n\n return { signedPsbt };\n };\n\n const signPsbts: WaasBitcoinWalletProvider['signPsbts'] = async ({\n requests,\n walletAccount,\n }) => {\n assertDefined(walletAccount, 'Wallet account is required');\n\n const signedPsbts = await Promise.all(\n requests.map(async (request) => {\n const { signedPsbt } = await signPsbt({ request, walletAccount });\n\n return signedPsbt;\n })\n );\n\n return { signedPsbts };\n };\n\n const signMessage: WaasBitcoinWalletProvider['signMessage'] = async ({\n message,\n walletAccount,\n }) => {\n assertDefined(walletAccount, 'Wallet account is required');\n\n const waasClient = await waasProvider.getWaasClient();\n\n const { signature: signedSessionId } = await getSignedSessionId(sdkClient);\n\n const mfaToken = await consumeMfaTokenIfRequiredForAction(\n { mfaAction: MFAAction.WalletWaasSign },\n sdkClient\n );\n\n const { bitcoinNetwork } = await getActiveNetworkConfig();\n\n const signature = await waasClient.signMessage({\n accountAddress: walletAccount.address,\n authToken: sdkClient.token ?? undefined,\n bitcoinConfig: {\n network: bitcoinNetwork as BitcoinNetwork,\n },\n message,\n mfaToken,\n signedSessionId,\n });\n\n return { signature };\n };\n\n const buildPsbt: WaasBitcoinWalletProvider['buildPsbt'] = async ({\n transaction,\n walletAccount,\n }) => {\n assertDefined(walletAccount, 'Wallet account is required');\n\n const publicKeyHex = getPublicKeyForWalletAccount(walletAccount, sdkClient);\n\n const { bitcoinNetwork, mempoolApiUrl, psbtNetwork } =\n await getActiveNetworkConfig();\n\n return buildPsbtUtil({\n // UTXO source and change output use the active network's payment\n // address; signing identity stays the wallet account's primary address.\n accountAddress: getWaasBitcoinAddressForNetwork({\n bitcoinNetwork,\n walletAccount,\n }),\n amountInSatoshis: transaction.amount,\n feePriority: transaction.feePriority ?? 'medium',\n mempoolApiUrl,\n network: psbtNetwork,\n publicKeyHex,\n recipientAddress: transaction.recipientAddress,\n });\n };\n\n const sendBitcoin: WaasBitcoinWalletProvider['sendBitcoin'] = async ({\n transaction,\n walletAccount,\n }): Promise<BitcoinSendTransactionResponse> => {\n assertDefined(walletAccount, 'Wallet account is required');\n\n const waasTransaction: WaasBitcoinTransaction = {\n amount: transaction.amount,\n recipientAddress: transaction.recipientAddress,\n };\n\n const unsignedPsbt = await buildPsbt({\n transaction: waasTransaction,\n walletAccount,\n });\n\n const { signedPsbt } = await signPsbt({\n request: { allowedSighash: [], unsignedPsbtBase64: unsignedPsbt },\n walletAccount,\n });\n\n const { mempoolApiUrl, psbtNetwork } = await getActiveNetworkConfig();\n\n const psbt = Psbt.fromBase64(signedPsbt, { network: psbtNetwork });\n\n psbt.finalizeAllInputs();\n\n const rawTx = psbt.extractTransaction().toHex();\n\n const transactionId = await broadcastTransaction({\n mempoolApiUrl,\n rawTransaction: rawTx,\n });\n\n return { transactionId };\n };\n\n return {\n ...waasProvider,\n buildPsbt,\n chain,\n executeSwapTransaction: (args) =>\n bitcoinExecuteSwapTransaction(args, sdkClient),\n getActiveNetworkId,\n getConnectedAddresses,\n groupKey: formatWalletProviderGroupKey(DYNAMIC_WAAS_METADATA.displayName),\n key,\n metadata: {\n displayName: DYNAMIC_WAAS_METADATA.displayName,\n icon: DYNAMIC_WAAS_METADATA.icon,\n },\n sendBitcoin,\n signMessage,\n signPsbt,\n signPsbts,\n switchActiveNetwork,\n transferAmount: (args) => bitcoinTransferAmount(args, sdkClient),\n walletProviderType,\n };\n};\n","import {\n WalletProviderPriority,\n getDefaultClient,\n getWalletProviderRegistry,\n hasExtension,\n registerExtension,\n} from '@dynamic-labs-sdk/client/core';\n\nimport { registerBitcoinNetworkProviderBuilder } from '../../registerBitcoinNetworkProviderBuilder';\nimport { createWalletProviderForWaasBitcoin } from '../utils/createWalletProviderForWaasBitcoin';\n\nexport const WAAS_BITCOIN_EXTENSION_KEY = 'waasBitcoin';\n\n/**\n * Adds the Dynamic WaaS (Wallet as a Service) Bitcoin extension to the Dynamic client.\n *\n * This extension enables embedded wallet functionality for Bitcoin blockchain,\n * allowing users to have wallets managed by Dynamic's infrastructure.\n *\n * @param [client] - The Dynamic client instance. Only required when using multiple Dynamic clients.\n * @notInstrumented\n */\nexport const addWaasBitcoinExtension = (client = getDefaultClient()): void => {\n if (hasExtension({ extensionKey: WAAS_BITCOIN_EXTENSION_KEY }, client)) {\n return;\n }\n\n registerExtension({ extensionKey: WAAS_BITCOIN_EXTENSION_KEY }, client);\n registerBitcoinNetworkProviderBuilder(client);\n\n const walletProviderRegistry = getWalletProviderRegistry(client);\n\n const walletProvider = createWalletProviderForWaasBitcoin(client);\n\n walletProviderRegistry.register({\n priority: WalletProviderPriority.WALLET_SDK,\n walletProvider,\n });\n};\n\n"],"mappings":"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"}
@@ -1,16 +1,17 @@
1
- const require_addWaasBitcoinExtension = require('./addWaasBitcoinExtension-BuxHED6F.cjs');
1
+ const require_addWaasBitcoinExtension = require('./addWaasBitcoinExtension-Du9epD-l.cjs');
2
2
  let _dynamic_labs_sdk_client_core = require("@dynamic-labs-sdk/client/core");
3
3
  let _dynamic_labs_sdk_client = require("@dynamic-labs-sdk/client");
4
4
  let bitcoinjs_lib = require("bitcoinjs-lib");
5
5
 
6
6
  //#region package.json
7
7
  var name = "@dynamic-labs-sdk/bitcoin";
8
- var version = "1.19.0";
8
+ var version = "1.20.0";
9
9
 
10
10
  //#endregion
11
11
  //#region src/constants.ts
12
12
  const MEMPOOL_API_URL = "https://mempool.space/api";
13
13
  const MEMPOOL_API_URL_TESTNET = "https://mempool.space/testnet/api";
14
+ const MEMPOOL_API_URL_SIGNET = "https://mempool.space/signet/api";
14
15
 
15
16
  //#endregion
16
17
  //#region src/utils/getMempoolApiUrl/getMempoolApiUrl.ts
@@ -251,6 +252,24 @@ const bitcoinTransferAmount = async ({ amount, recipient, walletAccount }, clien
251
252
  };
252
253
 
253
254
  //#endregion
255
+ Object.defineProperty(exports, 'MEMPOOL_API_URL', {
256
+ enumerable: true,
257
+ get: function () {
258
+ return MEMPOOL_API_URL;
259
+ }
260
+ });
261
+ Object.defineProperty(exports, 'MEMPOOL_API_URL_SIGNET', {
262
+ enumerable: true,
263
+ get: function () {
264
+ return MEMPOOL_API_URL_SIGNET;
265
+ }
266
+ });
267
+ Object.defineProperty(exports, 'MEMPOOL_API_URL_TESTNET', {
268
+ enumerable: true,
269
+ get: function () {
270
+ return MEMPOOL_API_URL_TESTNET;
271
+ }
272
+ });
254
273
  Object.defineProperty(exports, 'NotBitcoinProviderError', {
255
274
  enumerable: true,
256
275
  get: function () {
@@ -317,4 +336,4 @@ Object.defineProperty(exports, 'version', {
317
336
  return version;
318
337
  }
319
338
  });
320
- //# sourceMappingURL=bitcoinTransferAmount-vyn5gKOV.cjs.map
339
+ //# sourceMappingURL=bitcoinTransferAmount-Bz15MjRP.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"bitcoinTransferAmount-vyn5gKOV.cjs","names":["BaseError","InvalidParamError","Psbt","BaseError","MethodNotImplementedError","InvalidParamError"],"sources":["../package.json","../src/constants.ts","../src/utils/getMempoolApiUrl/getMempoolApiUrl.ts","../src/utils/satoshisToBtc/satoshisToBtc.ts","../src/utils/fetchBtcBalance/fetchBtcBalance.ts","../src/utils/createBitcoinNetworkProvider/createBitcoinNetworkProvider.ts","../src/registerBitcoinNetworkProviderBuilder/registerBitcoinNetworkProviderBuilder.ts","../src/isBitcoinWalletAccount/isBitcoinWalletAccount.ts","../src/isBitcoinWalletProvider/isBitcoinWalletProvider.ts","../src/errors/SendBitcoinRawTransactionError.ts","../src/sendRawTransaction/sendRawTransaction.ts","../src/utils/convertPsbtToBase64/convertPsbtToBase64.ts","../src/utils/bitcoinExecuteSwapTransaction/bitcoinExecuteSwapTransaction.ts","../src/errors/NotBitcoinProviderError.ts","../src/sendBitcoin/sendBitcoin.ts","../src/utils/bitcoinTransferAmount/bitcoinTransferAmount.ts"],"sourcesContent":["","export const MEMPOOL_API_URL = 'https://mempool.space/api';\nexport const MEMPOOL_API_URL_TESTNET = 'https://mempool.space/testnet/api';\nexport const MEMPOOL_API_URL_SIGNET = 'https://mempool.space/signet/api';\n","import { MEMPOOL_API_URL, MEMPOOL_API_URL_TESTNET } from '../../constants';\n\n/** @notInstrumented */\nexport const getMempoolApiUrl = (address: string) =>\n address.startsWith('t') ? MEMPOOL_API_URL_TESTNET : MEMPOOL_API_URL;\n","/** @notInstrumented */\nexport const satoshisToBtc = (satoshis: number) => satoshis / 100000000;\n","import { getMempoolApiUrl } from '../getMempoolApiUrl';\nimport { satoshisToBtc } from '../satoshisToBtc';\n\n/** @notInstrumented */\nexport const fetchBtcBalance = async ({\n address,\n}: {\n address: string;\n}): Promise<string | null> => {\n const API_URL = getMempoolApiUrl(address);\n\n const response = await fetch(`${API_URL}/address/${address}`);\n\n if (!response.ok) {\n return null;\n }\n\n const addressInfo = await response.json();\n\n if (!addressInfo?.chain_stats || !addressInfo?.mempool_stats) {\n return null;\n }\n\n const confirmedBalanceInSats =\n Number(addressInfo.chain_stats.funded_txo_sum) -\n Number(addressInfo.chain_stats.spent_txo_sum);\n\n const unconfirmedBalanceInSats =\n Number(addressInfo.mempool_stats.funded_txo_sum) -\n Number(addressInfo.mempool_stats.spent_txo_sum);\n\n const balance = satoshisToBtc(\n confirmedBalanceInSats + unconfirmedBalanceInSats\n );\n\n return balance.toString();\n};\n","import type { NetworkData } from '@dynamic-labs-sdk/client';\nimport { createBaseNetworkProvider } from '@dynamic-labs-sdk/client/core';\n\nimport type { BitcoinNetworkProvider } from '../../BitcoinNetworkProvider.types';\nimport { fetchBtcBalance } from '../fetchBtcBalance';\n\n/** @notInstrumented */\nexport const createBitcoinNetworkProvider = (\n networkData: NetworkData\n): BitcoinNetworkProvider => ({\n ...createBaseNetworkProvider('BTC', networkData),\n cluster: networkData.cluster,\n getBalance: async ({ address }) => ({\n balance: await fetchBtcBalance({\n address,\n }),\n }),\n});\n","import type { DynamicClient } from '@dynamic-labs-sdk/client';\nimport { getNetworkProviderBuilderRegistry } from '@dynamic-labs-sdk/client/core';\n\nimport { createBitcoinNetworkProvider } from '../utils/createBitcoinNetworkProvider';\n\n/** @notInstrumented */\nexport const registerBitcoinNetworkProviderBuilder = (\n client: DynamicClient\n): void => {\n const networkProviderBuilderRegistry =\n getNetworkProviderBuilderRegistry(client);\n\n /**\n * If the Bitcoin network provider builder is already registered, return.\n */\n if (networkProviderBuilderRegistry.get().get('BTC')) {\n return;\n }\n\n networkProviderBuilderRegistry.register({\n builder: createBitcoinNetworkProvider,\n chain: 'BTC',\n });\n};\n","import type { WalletAccount } from '@dynamic-labs-sdk/client';\n\nimport type { BitcoinWalletAccount } from '../BitcoinWalletAccount.types';\n\n/**\n * Type guard function to check if a wallet account is a Bitcoin wallet account.\n *\n * @example\n * ```ts\n * const accounts = getWalletAccounts();\n * const btcAccounts = accounts.filter(isBitcoinWalletAccount);\n * ```\n *\n * @param walletAccount - The wallet account to check.\n * @returns True if the wallet account is a Bitcoin wallet account, false otherwise.\n * @see isBitcoinNetworkProvider\n * @see addBitcoinExtension\n * @notInstrumented\n */\nexport const isBitcoinWalletAccount = (\n walletAccount: WalletAccount\n): walletAccount is BitcoinWalletAccount => walletAccount.chain === 'BTC';\n","import type { WalletProvider } from '@dynamic-labs-sdk/client/core';\n\nimport type { BitcoinWalletProvider } from '../BitcoinWalletProvider.types';\n\n/** @notInstrumented */\nexport const isBitcoinWalletProvider = (\n provider: WalletProvider\n): provider is BitcoinWalletProvider => {\n return provider.chain === 'BTC';\n};\n","import { BaseError } from '@dynamic-labs-sdk/client';\n\ntype SendBitcoinRawTransactionErrorParams = {\n originalError: unknown;\n};\n\nexport class SendBitcoinRawTransactionError extends BaseError {\n constructor({ originalError }: SendBitcoinRawTransactionErrorParams) {\n const cause = originalError instanceof Error ? originalError : null;\n\n super({\n cause,\n code: 'send_bitcoin_raw_transaction_error',\n docsUrl: null,\n name: 'SendBitcoinRawTransactionError',\n shortMessage: 'Failed to send Bitcoin raw transaction',\n });\n }\n}\n","import { getDefaultClient } from '@dynamic-labs-sdk/client';\nimport { getCore } from '@dynamic-labs-sdk/client/core';\n\nimport type { BitcoinWalletAccount } from '../BitcoinWalletAccount.types';\nimport { SendBitcoinRawTransactionError } from '../errors/SendBitcoinRawTransactionError';\nimport { getMempoolApiUrl } from '../utils/getMempoolApiUrl';\n\ntype SendRawTransactionParams = {\n rawTransaction: string;\n walletAccount: BitcoinWalletAccount;\n};\n\n/**\n * Sends a raw transaction using the mempool.space API.\n *\n * @example\n * ```ts\n * const { transactionId } = await sendRawTransaction({\n * walletAccount: btcAccount,\n * rawTransaction: '0200000001...',\n * });\n * ```\n *\n * @param params.rawTransaction - The raw transaction hex to broadcast.\n * @param params.walletAccount - The wallet account whose network determines the API endpoint.\n * @param [client] - The Dynamic client instance. Only required when using multiple Dynamic clients.\n * @returns An object containing the transaction id.\n * @throws {SendBitcoinRawTransactionError} If the mempool API returns an error.\n * @see sendBitcoin\n * @see signPsbt\n * @notInstrumented\n */\nexport const sendRawTransaction = async (\n { rawTransaction, walletAccount }: SendRawTransactionParams,\n client = getDefaultClient()\n): Promise<{\n transactionId: string;\n}> => {\n const fetchService = getCore(client).fetch;\n\n const API_URL = getMempoolApiUrl(walletAccount.address);\n\n const response = await fetchService(`${API_URL}/tx`, {\n body: rawTransaction,\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded',\n },\n method: 'POST',\n });\n\n if (!response.ok) {\n throw new SendBitcoinRawTransactionError({\n originalError: await response.text(),\n });\n }\n\n // this endpoint returns the transaction ID\n const transactionId = await response.text();\n\n return { transactionId };\n};\n","import { getBuffer } from '@dynamic-labs-sdk/client/core';\n\n/** @notInstrumented */\n// eslint-disable-next-line custom-rules/require-single-object-param\nexport const convertPsbtToBase64 = (psbt: string): string => {\n // Lowercase to handle uppercase hex encoding (e.g., 70736274FF)\n const psbtBase64 = psbt.toLowerCase().startsWith('70736274ff')\n ? getBuffer().from(psbt, 'hex').toString('base64')\n : psbt;\n\n return psbtBase64;\n};\n","import {\n type DynamicClient,\n InvalidParamError,\n} from '@dynamic-labs-sdk/client';\nimport type {\n ExecuteSwapTransactionParams,\n ExecuteSwapTransactionResult,\n} from '@dynamic-labs-sdk/client/core';\nimport { getWalletProviderFromWalletAccount } from '@dynamic-labs-sdk/client/core';\nimport { Psbt } from 'bitcoinjs-lib';\n\nimport { isBitcoinWalletAccount } from '../../isBitcoinWalletAccount';\nimport { isBitcoinWalletProvider } from '../../isBitcoinWalletProvider';\nimport { sendRawTransaction } from '../../sendRawTransaction';\nimport { convertPsbtToBase64 } from '../convertPsbtToBase64';\n\n/** @notInstrumented */\nexport const bitcoinExecuteSwapTransaction = async (\n { onStepChange, signingPayload, walletAccount }: ExecuteSwapTransactionParams,\n client: DynamicClient\n): Promise<ExecuteSwapTransactionResult> => {\n const provider = getWalletProviderFromWalletAccount(\n { walletAccount },\n client\n );\n\n if (\n !isBitcoinWalletAccount(walletAccount) ||\n !isBitcoinWalletProvider(provider)\n ) {\n throw new InvalidParamError(\n 'Wallet account is not a Bitcoin wallet account'\n );\n }\n\n if (!signingPayload.psbt) {\n throw new InvalidParamError(\n 'Signing payload is missing PSBT transaction data'\n );\n }\n\n onStepChange?.('transaction');\n\n // make sure the psbt is base64 encoded, no matter if it comes as hex or base64\n const psbtBase64 = convertPsbtToBase64(signingPayload.psbt);\n\n // Parse the unsigned PSBT to determine which inputs need signing.\n // Explicitly passing signingIndexes ensures all wallet providers\n // (including Phantom, which requires it) know which inputs to sign.\n const unsignedPsbt = Psbt.fromBase64(psbtBase64);\n const signingIndexes = unsignedPsbt.txInputs.map((_, i) => i);\n\n const { signedPsbt } = await provider.signPsbt({\n request: {\n allowedSighash: [1],\n signature: [\n {\n address: walletAccount.address,\n signingIndexes,\n },\n ],\n unsignedPsbtBase64: psbtBase64,\n },\n walletAccount,\n });\n\n const psbt = Psbt.fromBase64(signedPsbt);\n\n // Some wallets return an already-finalized PSBT; only finalize\n // inputs that haven't been finalized yet.\n psbt.data.inputs.forEach((input, idx) => {\n if (!input.finalScriptSig && !input.finalScriptWitness) {\n psbt.finalizeInput(idx);\n }\n });\n\n const rawTxHex = psbt.extractTransaction().toHex();\n\n const { transactionId } = await sendRawTransaction(\n { rawTransaction: rawTxHex, walletAccount },\n client\n );\n\n return { transactionHash: transactionId };\n};\n","import { BaseError } from '@dynamic-labs-sdk/client';\n\nexport class NotBitcoinProviderError extends BaseError {\n public readonly providerKey: string;\n\n constructor(params: { providerKey: string }) {\n super({\n cause: null,\n code: 'not_bitcoin_provider_error',\n docsUrl: null,\n name: 'NotBitcoinProviderError',\n shortMessage: 'Provider is not a Bitcoin wallet provider',\n });\n\n this.providerKey = params.providerKey;\n }\n}\n","import { getDefaultClient } from '@dynamic-labs-sdk/client';\nimport {\n MethodNotImplementedError,\n getWalletProviderFromWalletAccount,\n} from '@dynamic-labs-sdk/client/core';\n\nimport type { BitcoinWalletAccount } from '../BitcoinWalletAccount.types';\nimport type {\n BitcoinSendTransactionResponse,\n BitcoinTransaction,\n} from '../BitcoinWalletProvider.types';\nimport { NotBitcoinProviderError } from '../errors/NotBitcoinProviderError';\nimport { isBitcoinWalletProvider } from '../isBitcoinWalletProvider';\n\ntype SendBitcoinParams = {\n transaction: BitcoinTransaction;\n walletAccount: BitcoinWalletAccount;\n};\n\n/**\n * Sends a Bitcoin transaction.\n *\n * @example\n * ```ts\n * const { transactionId } = await sendBitcoin({\n * walletAccount: btcAccount,\n * transaction: { recipientAddress: 'bc1q...', amount: 50000n },\n * });\n * ```\n *\n * @param params.transaction - The transaction to send.\n * @param params.walletAccount - The wallet account to send the transaction from.\n * @param [client] - The Dynamic client instance. Only required when using multiple Dynamic clients.\n * @returns An object containing the transaction id.\n * @throws {MethodNotImplementedError} If the wallet provider does not implement the sendBitcoin method.\n * @throws {NotBitcoinProviderError} If the wallet account is not a valid BitcoinWalletAccount.\n * @see sendRawTransaction\n * @see signPsbt\n * @notInstrumented\n */\nexport const sendBitcoin = async (\n { walletAccount, transaction }: SendBitcoinParams,\n client = getDefaultClient()\n): Promise<BitcoinSendTransactionResponse> => {\n const provider = getWalletProviderFromWalletAccount(\n {\n walletAccount,\n },\n client\n );\n\n if (!isBitcoinWalletProvider(provider)) {\n throw new NotBitcoinProviderError({ providerKey: provider.key });\n }\n\n if (!provider.sendBitcoin) {\n throw new MethodNotImplementedError('sendBitcoin');\n }\n\n return provider.sendBitcoin({ transaction, walletAccount });\n};\n","import type { DynamicClient } from '@dynamic-labs-sdk/client';\nimport { InvalidParamError } from '@dynamic-labs-sdk/client';\nimport {\n type TransferAmountParams,\n parseAmountToSmallestUnit,\n} from '@dynamic-labs-sdk/client/core';\n\nimport { isBitcoinWalletAccount } from '../../isBitcoinWalletAccount';\nimport { sendBitcoin } from '../../sendBitcoin';\n\nconst BTC_DECIMALS = 8;\n\n/**\n * Transfers native BTC from one wallet to another.\n *\n * Converts the human-readable BTC amount string to satoshis (8 decimals)\n * and delegates to `sendBitcoin`.\n *\n * @param params.amount - The amount in BTC as a decimal string (e.g. \"0.001\").\n * @param params.recipient - The recipient Bitcoin address.\n * @param params.walletAccount - The wallet account to send from.\n * @param client - The Dynamic client instance.\n * @returns An object containing the transaction hash.\n * @notInstrumented\n */\nexport const bitcoinTransferAmount = async (\n { amount, recipient, walletAccount }: TransferAmountParams,\n client: DynamicClient\n): Promise<{ transactionHash: string }> => {\n if (!isBitcoinWalletAccount(walletAccount)) {\n throw new InvalidParamError(\n 'Wallet account is not a Bitcoin wallet account'\n );\n }\n\n const satoshis = parseAmountToSmallestUnit({ amount, decimals: BTC_DECIMALS });\n\n const result = await sendBitcoin(\n {\n transaction: {\n amount: satoshis,\n recipientAddress: recipient,\n },\n walletAccount,\n },\n client\n );\n\n return { transactionHash: result.transactionId };\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"bitcoinTransferAmount-Bz15MjRP.cjs","names":["BaseError","InvalidParamError","Psbt","BaseError","MethodNotImplementedError","InvalidParamError"],"sources":["../package.json","../src/constants.ts","../src/utils/getMempoolApiUrl/getMempoolApiUrl.ts","../src/utils/satoshisToBtc/satoshisToBtc.ts","../src/utils/fetchBtcBalance/fetchBtcBalance.ts","../src/utils/createBitcoinNetworkProvider/createBitcoinNetworkProvider.ts","../src/registerBitcoinNetworkProviderBuilder/registerBitcoinNetworkProviderBuilder.ts","../src/isBitcoinWalletAccount/isBitcoinWalletAccount.ts","../src/isBitcoinWalletProvider/isBitcoinWalletProvider.ts","../src/errors/SendBitcoinRawTransactionError.ts","../src/sendRawTransaction/sendRawTransaction.ts","../src/utils/convertPsbtToBase64/convertPsbtToBase64.ts","../src/utils/bitcoinExecuteSwapTransaction/bitcoinExecuteSwapTransaction.ts","../src/errors/NotBitcoinProviderError.ts","../src/sendBitcoin/sendBitcoin.ts","../src/utils/bitcoinTransferAmount/bitcoinTransferAmount.ts"],"sourcesContent":["","export const MEMPOOL_API_URL = 'https://mempool.space/api';\nexport const MEMPOOL_API_URL_TESTNET = 'https://mempool.space/testnet/api';\nexport const MEMPOOL_API_URL_SIGNET = 'https://mempool.space/signet/api';\n","import { MEMPOOL_API_URL, MEMPOOL_API_URL_TESTNET } from '../../constants';\n\n/** @notInstrumented */\nexport const getMempoolApiUrl = (address: string) =>\n address.startsWith('t') ? MEMPOOL_API_URL_TESTNET : MEMPOOL_API_URL;\n","/** @notInstrumented */\nexport const satoshisToBtc = (satoshis: number) => satoshis / 100000000;\n","import { getMempoolApiUrl } from '../getMempoolApiUrl';\nimport { satoshisToBtc } from '../satoshisToBtc';\n\n/** @notInstrumented */\nexport const fetchBtcBalance = async ({\n address,\n}: {\n address: string;\n}): Promise<string | null> => {\n const API_URL = getMempoolApiUrl(address);\n\n const response = await fetch(`${API_URL}/address/${address}`);\n\n if (!response.ok) {\n return null;\n }\n\n const addressInfo = await response.json();\n\n if (!addressInfo?.chain_stats || !addressInfo?.mempool_stats) {\n return null;\n }\n\n const confirmedBalanceInSats =\n Number(addressInfo.chain_stats.funded_txo_sum) -\n Number(addressInfo.chain_stats.spent_txo_sum);\n\n const unconfirmedBalanceInSats =\n Number(addressInfo.mempool_stats.funded_txo_sum) -\n Number(addressInfo.mempool_stats.spent_txo_sum);\n\n const balance = satoshisToBtc(\n confirmedBalanceInSats + unconfirmedBalanceInSats\n );\n\n return balance.toString();\n};\n","import type { NetworkData } from '@dynamic-labs-sdk/client';\nimport { createBaseNetworkProvider } from '@dynamic-labs-sdk/client/core';\n\nimport type { BitcoinNetworkProvider } from '../../BitcoinNetworkProvider.types';\nimport { fetchBtcBalance } from '../fetchBtcBalance';\n\n/** @notInstrumented */\nexport const createBitcoinNetworkProvider = (\n networkData: NetworkData\n): BitcoinNetworkProvider => ({\n ...createBaseNetworkProvider('BTC', networkData),\n cluster: networkData.cluster,\n getBalance: async ({ address }) => ({\n balance: await fetchBtcBalance({\n address,\n }),\n }),\n});\n","import type { DynamicClient } from '@dynamic-labs-sdk/client';\nimport { getNetworkProviderBuilderRegistry } from '@dynamic-labs-sdk/client/core';\n\nimport { createBitcoinNetworkProvider } from '../utils/createBitcoinNetworkProvider';\n\n/** @notInstrumented */\nexport const registerBitcoinNetworkProviderBuilder = (\n client: DynamicClient\n): void => {\n const networkProviderBuilderRegistry =\n getNetworkProviderBuilderRegistry(client);\n\n /**\n * If the Bitcoin network provider builder is already registered, return.\n */\n if (networkProviderBuilderRegistry.get().get('BTC')) {\n return;\n }\n\n networkProviderBuilderRegistry.register({\n builder: createBitcoinNetworkProvider,\n chain: 'BTC',\n });\n};\n","import type { WalletAccount } from '@dynamic-labs-sdk/client';\n\nimport type { BitcoinWalletAccount } from '../BitcoinWalletAccount.types';\n\n/**\n * Type guard function to check if a wallet account is a Bitcoin wallet account.\n *\n * @example\n * ```ts\n * const accounts = getWalletAccounts();\n * const btcAccounts = accounts.filter(isBitcoinWalletAccount);\n * ```\n *\n * @param walletAccount - The wallet account to check.\n * @returns True if the wallet account is a Bitcoin wallet account, false otherwise.\n * @see isBitcoinNetworkProvider\n * @see addBitcoinExtension\n * @notInstrumented\n */\nexport const isBitcoinWalletAccount = (\n walletAccount: WalletAccount\n): walletAccount is BitcoinWalletAccount => walletAccount.chain === 'BTC';\n","import type { WalletProvider } from '@dynamic-labs-sdk/client/core';\n\nimport type { BitcoinWalletProvider } from '../BitcoinWalletProvider.types';\n\n/** @notInstrumented */\nexport const isBitcoinWalletProvider = (\n provider: WalletProvider\n): provider is BitcoinWalletProvider => {\n return provider.chain === 'BTC';\n};\n","import { BaseError } from '@dynamic-labs-sdk/client';\n\ntype SendBitcoinRawTransactionErrorParams = {\n originalError: unknown;\n};\n\nexport class SendBitcoinRawTransactionError extends BaseError {\n constructor({ originalError }: SendBitcoinRawTransactionErrorParams) {\n const cause = originalError instanceof Error ? originalError : null;\n\n super({\n cause,\n code: 'send_bitcoin_raw_transaction_error',\n docsUrl: null,\n name: 'SendBitcoinRawTransactionError',\n shortMessage: 'Failed to send Bitcoin raw transaction',\n });\n }\n}\n","import { getDefaultClient } from '@dynamic-labs-sdk/client';\nimport { getCore } from '@dynamic-labs-sdk/client/core';\n\nimport type { BitcoinWalletAccount } from '../BitcoinWalletAccount.types';\nimport { SendBitcoinRawTransactionError } from '../errors/SendBitcoinRawTransactionError';\nimport { getMempoolApiUrl } from '../utils/getMempoolApiUrl';\n\ntype SendRawTransactionParams = {\n rawTransaction: string;\n walletAccount: BitcoinWalletAccount;\n};\n\n/**\n * Sends a raw transaction using the mempool.space API.\n *\n * @example\n * ```ts\n * const { transactionId } = await sendRawTransaction({\n * walletAccount: btcAccount,\n * rawTransaction: '0200000001...',\n * });\n * ```\n *\n * @param params.rawTransaction - The raw transaction hex to broadcast.\n * @param params.walletAccount - The wallet account whose network determines the API endpoint.\n * @param [client] - The Dynamic client instance. Only required when using multiple Dynamic clients.\n * @returns An object containing the transaction id.\n * @throws {SendBitcoinRawTransactionError} If the mempool API returns an error.\n * @see sendBitcoin\n * @see signPsbt\n * @notInstrumented\n */\nexport const sendRawTransaction = async (\n { rawTransaction, walletAccount }: SendRawTransactionParams,\n client = getDefaultClient()\n): Promise<{\n transactionId: string;\n}> => {\n const fetchService = getCore(client).fetch;\n\n const API_URL = getMempoolApiUrl(walletAccount.address);\n\n const response = await fetchService(`${API_URL}/tx`, {\n body: rawTransaction,\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded',\n },\n method: 'POST',\n });\n\n if (!response.ok) {\n throw new SendBitcoinRawTransactionError({\n originalError: await response.text(),\n });\n }\n\n // this endpoint returns the transaction ID\n const transactionId = await response.text();\n\n return { transactionId };\n};\n","import { getBuffer } from '@dynamic-labs-sdk/client/core';\n\n/** @notInstrumented */\n// eslint-disable-next-line custom-rules/require-single-object-param\nexport const convertPsbtToBase64 = (psbt: string): string => {\n // Lowercase to handle uppercase hex encoding (e.g., 70736274FF)\n const psbtBase64 = psbt.toLowerCase().startsWith('70736274ff')\n ? getBuffer().from(psbt, 'hex').toString('base64')\n : psbt;\n\n return psbtBase64;\n};\n","import {\n type DynamicClient,\n InvalidParamError,\n} from '@dynamic-labs-sdk/client';\nimport type {\n ExecuteSwapTransactionParams,\n ExecuteSwapTransactionResult,\n} from '@dynamic-labs-sdk/client/core';\nimport { getWalletProviderFromWalletAccount } from '@dynamic-labs-sdk/client/core';\nimport { Psbt } from 'bitcoinjs-lib';\n\nimport { isBitcoinWalletAccount } from '../../isBitcoinWalletAccount';\nimport { isBitcoinWalletProvider } from '../../isBitcoinWalletProvider';\nimport { sendRawTransaction } from '../../sendRawTransaction';\nimport { convertPsbtToBase64 } from '../convertPsbtToBase64';\n\n/** @notInstrumented */\nexport const bitcoinExecuteSwapTransaction = async (\n { onStepChange, signingPayload, walletAccount }: ExecuteSwapTransactionParams,\n client: DynamicClient\n): Promise<ExecuteSwapTransactionResult> => {\n const provider = getWalletProviderFromWalletAccount(\n { walletAccount },\n client\n );\n\n if (\n !isBitcoinWalletAccount(walletAccount) ||\n !isBitcoinWalletProvider(provider)\n ) {\n throw new InvalidParamError(\n 'Wallet account is not a Bitcoin wallet account'\n );\n }\n\n if (!signingPayload.psbt) {\n throw new InvalidParamError(\n 'Signing payload is missing PSBT transaction data'\n );\n }\n\n onStepChange?.('transaction');\n\n // make sure the psbt is base64 encoded, no matter if it comes as hex or base64\n const psbtBase64 = convertPsbtToBase64(signingPayload.psbt);\n\n // Parse the unsigned PSBT to determine which inputs need signing.\n // Explicitly passing signingIndexes ensures all wallet providers\n // (including Phantom, which requires it) know which inputs to sign.\n const unsignedPsbt = Psbt.fromBase64(psbtBase64);\n const signingIndexes = unsignedPsbt.txInputs.map((_, i) => i);\n\n const { signedPsbt } = await provider.signPsbt({\n request: {\n allowedSighash: [1],\n signature: [\n {\n address: walletAccount.address,\n signingIndexes,\n },\n ],\n unsignedPsbtBase64: psbtBase64,\n },\n walletAccount,\n });\n\n const psbt = Psbt.fromBase64(signedPsbt);\n\n // Some wallets return an already-finalized PSBT; only finalize\n // inputs that haven't been finalized yet.\n psbt.data.inputs.forEach((input, idx) => {\n if (!input.finalScriptSig && !input.finalScriptWitness) {\n psbt.finalizeInput(idx);\n }\n });\n\n const rawTxHex = psbt.extractTransaction().toHex();\n\n const { transactionId } = await sendRawTransaction(\n { rawTransaction: rawTxHex, walletAccount },\n client\n );\n\n return { transactionHash: transactionId };\n};\n","import { BaseError } from '@dynamic-labs-sdk/client';\n\nexport class NotBitcoinProviderError extends BaseError {\n public readonly providerKey: string;\n\n constructor(params: { providerKey: string }) {\n super({\n cause: null,\n code: 'not_bitcoin_provider_error',\n docsUrl: null,\n name: 'NotBitcoinProviderError',\n shortMessage: 'Provider is not a Bitcoin wallet provider',\n });\n\n this.providerKey = params.providerKey;\n }\n}\n","import { getDefaultClient } from '@dynamic-labs-sdk/client';\nimport {\n MethodNotImplementedError,\n getWalletProviderFromWalletAccount,\n} from '@dynamic-labs-sdk/client/core';\n\nimport type { BitcoinWalletAccount } from '../BitcoinWalletAccount.types';\nimport type {\n BitcoinSendTransactionResponse,\n BitcoinTransaction,\n} from '../BitcoinWalletProvider.types';\nimport { NotBitcoinProviderError } from '../errors/NotBitcoinProviderError';\nimport { isBitcoinWalletProvider } from '../isBitcoinWalletProvider';\n\ntype SendBitcoinParams = {\n transaction: BitcoinTransaction;\n walletAccount: BitcoinWalletAccount;\n};\n\n/**\n * Sends a Bitcoin transaction.\n *\n * @example\n * ```ts\n * const { transactionId } = await sendBitcoin({\n * walletAccount: btcAccount,\n * transaction: { recipientAddress: 'bc1q...', amount: 50000n },\n * });\n * ```\n *\n * @param params.transaction - The transaction to send.\n * @param params.walletAccount - The wallet account to send the transaction from.\n * @param [client] - The Dynamic client instance. Only required when using multiple Dynamic clients.\n * @returns An object containing the transaction id.\n * @throws {MethodNotImplementedError} If the wallet provider does not implement the sendBitcoin method.\n * @throws {NotBitcoinProviderError} If the wallet account is not a valid BitcoinWalletAccount.\n * @see sendRawTransaction\n * @see signPsbt\n * @notInstrumented\n */\nexport const sendBitcoin = async (\n { walletAccount, transaction }: SendBitcoinParams,\n client = getDefaultClient()\n): Promise<BitcoinSendTransactionResponse> => {\n const provider = getWalletProviderFromWalletAccount(\n {\n walletAccount,\n },\n client\n );\n\n if (!isBitcoinWalletProvider(provider)) {\n throw new NotBitcoinProviderError({ providerKey: provider.key });\n }\n\n if (!provider.sendBitcoin) {\n throw new MethodNotImplementedError('sendBitcoin');\n }\n\n return provider.sendBitcoin({ transaction, walletAccount });\n};\n","import type { DynamicClient } from '@dynamic-labs-sdk/client';\nimport { InvalidParamError } from '@dynamic-labs-sdk/client';\nimport {\n type TransferAmountParams,\n parseAmountToSmallestUnit,\n} from '@dynamic-labs-sdk/client/core';\n\nimport { isBitcoinWalletAccount } from '../../isBitcoinWalletAccount';\nimport { sendBitcoin } from '../../sendBitcoin';\n\nconst BTC_DECIMALS = 8;\n\n/**\n * Transfers native BTC from one wallet to another.\n *\n * Converts the human-readable BTC amount string to satoshis (8 decimals)\n * and delegates to `sendBitcoin`.\n *\n * @param params.amount - The amount in BTC as a decimal string (e.g. \"0.001\").\n * @param params.recipient - The recipient Bitcoin address.\n * @param params.walletAccount - The wallet account to send from.\n * @param client - The Dynamic client instance.\n * @returns An object containing the transaction hash.\n * @notInstrumented\n */\nexport const bitcoinTransferAmount = async (\n { amount, recipient, walletAccount }: TransferAmountParams,\n client: DynamicClient\n): Promise<{ transactionHash: string }> => {\n if (!isBitcoinWalletAccount(walletAccount)) {\n throw new InvalidParamError(\n 'Wallet account is not a Bitcoin wallet account'\n );\n }\n\n const satoshis = parseAmountToSmallestUnit({ amount, decimals: BTC_DECIMALS });\n\n const result = await sendBitcoin(\n {\n transaction: {\n amount: satoshis,\n recipientAddress: recipient,\n },\n walletAccount,\n },\n client\n );\n\n return { transactionHash: result.transactionId };\n};\n"],"mappings":"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"}
@@ -4,12 +4,13 @@ import { Psbt } from "bitcoinjs-lib";
4
4
 
5
5
  //#region package.json
6
6
  var name = "@dynamic-labs-sdk/bitcoin";
7
- var version = "1.19.0";
7
+ var version = "1.20.0";
8
8
 
9
9
  //#endregion
10
10
  //#region src/constants.ts
11
11
  const MEMPOOL_API_URL = "https://mempool.space/api";
12
12
  const MEMPOOL_API_URL_TESTNET = "https://mempool.space/testnet/api";
13
+ const MEMPOOL_API_URL_SIGNET = "https://mempool.space/signet/api";
13
14
 
14
15
  //#endregion
15
16
  //#region src/utils/getMempoolApiUrl/getMempoolApiUrl.ts
@@ -250,5 +251,5 @@ const bitcoinTransferAmount = async ({ amount, recipient, walletAccount }, clien
250
251
  };
251
252
 
252
253
  //#endregion
253
- export { sendRawTransaction as a, registerBitcoinNetworkProviderBuilder as c, version as d, bitcoinExecuteSwapTransaction as i, getMempoolApiUrl as l, sendBitcoin as n, isBitcoinWalletProvider as o, NotBitcoinProviderError as r, isBitcoinWalletAccount as s, bitcoinTransferAmount as t, name as u };
254
- //# sourceMappingURL=bitcoinTransferAmount-D6zp-bUs.esm.js.map
254
+ export { sendRawTransaction as a, registerBitcoinNetworkProviderBuilder as c, MEMPOOL_API_URL_SIGNET as d, MEMPOOL_API_URL_TESTNET as f, bitcoinExecuteSwapTransaction as i, getMempoolApiUrl as l, version as m, sendBitcoin as n, isBitcoinWalletProvider as o, name as p, NotBitcoinProviderError as r, isBitcoinWalletAccount as s, bitcoinTransferAmount as t, MEMPOOL_API_URL as u };
255
+ //# sourceMappingURL=bitcoinTransferAmount-DvQ6eq1s.esm.js.map