@dynamic-labs-wallet/btc 1.1.28 → 1.1.30
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/index.cjs +27 -13
- package/index.esm.js +28 -14
- package/package.json +3 -3
- package/src/client/client.d.ts +9 -2
- package/src/client/client.d.ts.map +1 -1
package/index.cjs
CHANGED
|
@@ -735,16 +735,26 @@ class DynamicBtcWalletClient extends browser.DynamicWalletClient {
|
|
|
735
735
|
* @param amount - The amount to send in satoshis
|
|
736
736
|
* @param senderAddress - The address to send funds from
|
|
737
737
|
* @param network - The network to use (mainnet/testnet)
|
|
738
|
-
* @param feeRateLevel - The fee rate level to use (fast, medium, slow)
|
|
738
|
+
* @param feeRateLevel - The fee rate level to use (fast, medium, slow). Ignored when feeRate is set
|
|
739
|
+
* @param feeRate - Explicit fee rate in sat/vByte; skips the fee lookup entirely
|
|
740
|
+
* @param rpcUrl - Custom Esplora-compatible API base URL (e.g. a self-hosted Esplora/electrs/mempool)
|
|
741
|
+
* used for fee rates, UTXOs and raw transactions instead of mempool.space. Must be https
|
|
742
|
+
* (http only for localhost). Fee rates use `/v1/fees/recommended`, falling back to `/fee-estimates`
|
|
739
743
|
* @returns The PSBT in hex format
|
|
740
|
-
*/ async createTransaction({ receiverAddress, amount, senderAddress, network, feeRateLevel = 'medium' }) {
|
|
744
|
+
*/ async createTransaction({ receiverAddress, amount, senderAddress, network, feeRateLevel = 'medium', feeRate: feeRateOverride, rpcUrl }) {
|
|
745
|
+
// rpcUrl is deliberately not logged: custom endpoints may embed API keys.
|
|
741
746
|
this.logger.debug('[BTC Client] Creating transaction', {
|
|
742
747
|
receiverAddress,
|
|
743
748
|
amount,
|
|
744
749
|
senderAddress,
|
|
745
750
|
network,
|
|
746
|
-
feeRateLevel
|
|
751
|
+
feeRateLevel,
|
|
752
|
+
feeRate: feeRateOverride,
|
|
753
|
+
hasCustomRpcUrl: Boolean(rpcUrl)
|
|
747
754
|
});
|
|
755
|
+
if (feeRateOverride !== undefined && (!Number.isFinite(feeRateOverride) || feeRateOverride <= 0)) {
|
|
756
|
+
throw new Error('feeRate must be a positive number (sat/vByte)');
|
|
757
|
+
}
|
|
748
758
|
if (!senderAddress) {
|
|
749
759
|
throw new Error(browser.ERROR_ACCOUNT_ADDRESS_REQUIRED);
|
|
750
760
|
}
|
|
@@ -761,15 +771,15 @@ class DynamicBtcWalletClient extends browser.DynamicWalletClient {
|
|
|
761
771
|
throw new Error('Taproot transaction creation not yet supported');
|
|
762
772
|
}
|
|
763
773
|
const bitcoinNetwork = network === 'testnet' ? bitcoin__namespace.networks.testnet : bitcoin__namespace.networks.bitcoin;
|
|
764
|
-
|
|
765
|
-
|
|
766
|
-
|
|
767
|
-
});
|
|
768
|
-
const feeRate = feeRates[feeRateLevel];
|
|
774
|
+
const feeRate = feeRateOverride != null ? feeRateOverride : (await btcUtils.getFeeRates({
|
|
775
|
+
network,
|
|
776
|
+
rpcUrl
|
|
777
|
+
}))[feeRateLevel];
|
|
769
778
|
// Fetch UTXOs
|
|
770
779
|
const utxos = await btcUtils.getUTXOs({
|
|
771
780
|
address: senderAddress,
|
|
772
|
-
network
|
|
781
|
+
network,
|
|
782
|
+
rpcUrl
|
|
773
783
|
});
|
|
774
784
|
// Select UTXOs
|
|
775
785
|
const { inputs, change, fee } = btcUtils.selectUTXOs({
|
|
@@ -782,7 +792,7 @@ class DynamicBtcWalletClient extends browser.DynamicWalletClient {
|
|
|
782
792
|
});
|
|
783
793
|
// Prepare inputs
|
|
784
794
|
await Promise.all(inputs.map(async (utxo)=>{
|
|
785
|
-
const txHex = await this.getTxHex(utxo.txid, network);
|
|
795
|
+
const txHex = await this.getTxHex(utxo.txid, network, rpcUrl);
|
|
786
796
|
const inputData = {
|
|
787
797
|
hash: utxo.txid,
|
|
788
798
|
index: utxo.vout,
|
|
@@ -828,10 +838,14 @@ class DynamicBtcWalletClient extends browser.DynamicWalletClient {
|
|
|
828
838
|
* Fetches the raw transaction hex for a given transaction ID
|
|
829
839
|
* @param txid - The transaction ID
|
|
830
840
|
* @param network - The network
|
|
841
|
+
* @param rpcUrl - Optional custom Esplora-compatible API base URL
|
|
831
842
|
* @returns The transaction hex
|
|
832
|
-
*/ async getTxHex(txid, network) {
|
|
833
|
-
const baseUrl = btcUtils.
|
|
834
|
-
|
|
843
|
+
*/ async getTxHex(txid, network, rpcUrl) {
|
|
844
|
+
const baseUrl = btcUtils.resolveRpcUrl({
|
|
845
|
+
network,
|
|
846
|
+
rpcUrl
|
|
847
|
+
});
|
|
848
|
+
const response = await btcUtils.rpcFetch(`${baseUrl}/tx/${txid}/hex`, rpcUrl);
|
|
835
849
|
if (!response.ok) {
|
|
836
850
|
throw new Error(`Failed to fetch TX hex: ${response.statusText}`);
|
|
837
851
|
}
|
package/index.esm.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { DynamicWalletClient, BitcoinNetwork, BitcoinAddressType, getMPCChainConfig, ERROR_CREATE_WALLET_ACCOUNT, ERROR_PASSWORD_MISMATCH, ERROR_MULTIPLE_WALLETS_PER_CHAIN, ERROR_SIGN_MESSAGE, ERROR_ACCOUNT_ADDRESS_REQUIRED, ERROR_IMPORT_PRIVATE_KEY } from '@dynamic-labs-wallet/browser';
|
|
2
2
|
import * as bitcoin from 'bitcoinjs-lib';
|
|
3
3
|
import ecc from '@bitcoinerlab/secp256k1';
|
|
4
|
-
import { extractPublicKeyHex, normalizePublicKey, publicKeyToBitcoinAddress, resolveBitcoinAddressType, calculateTaprootTweak, encodeBip322Signature, calculateBip322Hash, wifToPrivateKey, getPublicKeyFromPrivateKey, privateKeyToWIF, doesInputBelongToAddress, filterInputsBySigningIndexes, assertSighashAllowed, collectPSBTInputData, getSigHashType, convertSignatureToTaprootBuffer, getSegwitV0ScriptCode, getBitcoinNetwork, convertSignatureToDER, getFeeRates, getUTXOs, selectUTXOs,
|
|
4
|
+
import { extractPublicKeyHex, normalizePublicKey, publicKeyToBitcoinAddress, resolveBitcoinAddressType, calculateTaprootTweak, encodeBip322Signature, calculateBip322Hash, wifToPrivateKey, getPublicKeyFromPrivateKey, privateKeyToWIF, doesInputBelongToAddress, filterInputsBySigningIndexes, assertSighashAllowed, collectPSBTInputData, getSigHashType, convertSignatureToTaprootBuffer, getSegwitV0ScriptCode, getBitcoinNetwork, convertSignatureToDER, getFeeRates, getUTXOs, selectUTXOs, resolveRpcUrl, rpcFetch, initEccLib } from '@dynamic-labs-wallet/btc-utils';
|
|
5
5
|
|
|
6
6
|
function _extends() {
|
|
7
7
|
_extends = Object.assign || function assign(target) {
|
|
@@ -714,16 +714,26 @@ class DynamicBtcWalletClient extends DynamicWalletClient {
|
|
|
714
714
|
* @param amount - The amount to send in satoshis
|
|
715
715
|
* @param senderAddress - The address to send funds from
|
|
716
716
|
* @param network - The network to use (mainnet/testnet)
|
|
717
|
-
* @param feeRateLevel - The fee rate level to use (fast, medium, slow)
|
|
717
|
+
* @param feeRateLevel - The fee rate level to use (fast, medium, slow). Ignored when feeRate is set
|
|
718
|
+
* @param feeRate - Explicit fee rate in sat/vByte; skips the fee lookup entirely
|
|
719
|
+
* @param rpcUrl - Custom Esplora-compatible API base URL (e.g. a self-hosted Esplora/electrs/mempool)
|
|
720
|
+
* used for fee rates, UTXOs and raw transactions instead of mempool.space. Must be https
|
|
721
|
+
* (http only for localhost). Fee rates use `/v1/fees/recommended`, falling back to `/fee-estimates`
|
|
718
722
|
* @returns The PSBT in hex format
|
|
719
|
-
*/ async createTransaction({ receiverAddress, amount, senderAddress, network, feeRateLevel = 'medium' }) {
|
|
723
|
+
*/ async createTransaction({ receiverAddress, amount, senderAddress, network, feeRateLevel = 'medium', feeRate: feeRateOverride, rpcUrl }) {
|
|
724
|
+
// rpcUrl is deliberately not logged: custom endpoints may embed API keys.
|
|
720
725
|
this.logger.debug('[BTC Client] Creating transaction', {
|
|
721
726
|
receiverAddress,
|
|
722
727
|
amount,
|
|
723
728
|
senderAddress,
|
|
724
729
|
network,
|
|
725
|
-
feeRateLevel
|
|
730
|
+
feeRateLevel,
|
|
731
|
+
feeRate: feeRateOverride,
|
|
732
|
+
hasCustomRpcUrl: Boolean(rpcUrl)
|
|
726
733
|
});
|
|
734
|
+
if (feeRateOverride !== undefined && (!Number.isFinite(feeRateOverride) || feeRateOverride <= 0)) {
|
|
735
|
+
throw new Error('feeRate must be a positive number (sat/vByte)');
|
|
736
|
+
}
|
|
727
737
|
if (!senderAddress) {
|
|
728
738
|
throw new Error(ERROR_ACCOUNT_ADDRESS_REQUIRED);
|
|
729
739
|
}
|
|
@@ -740,15 +750,15 @@ class DynamicBtcWalletClient extends DynamicWalletClient {
|
|
|
740
750
|
throw new Error('Taproot transaction creation not yet supported');
|
|
741
751
|
}
|
|
742
752
|
const bitcoinNetwork = network === 'testnet' ? bitcoin.networks.testnet : bitcoin.networks.bitcoin;
|
|
743
|
-
|
|
744
|
-
|
|
745
|
-
|
|
746
|
-
});
|
|
747
|
-
const feeRate = feeRates[feeRateLevel];
|
|
753
|
+
const feeRate = feeRateOverride != null ? feeRateOverride : (await getFeeRates({
|
|
754
|
+
network,
|
|
755
|
+
rpcUrl
|
|
756
|
+
}))[feeRateLevel];
|
|
748
757
|
// Fetch UTXOs
|
|
749
758
|
const utxos = await getUTXOs({
|
|
750
759
|
address: senderAddress,
|
|
751
|
-
network
|
|
760
|
+
network,
|
|
761
|
+
rpcUrl
|
|
752
762
|
});
|
|
753
763
|
// Select UTXOs
|
|
754
764
|
const { inputs, change, fee } = selectUTXOs({
|
|
@@ -761,7 +771,7 @@ class DynamicBtcWalletClient extends DynamicWalletClient {
|
|
|
761
771
|
});
|
|
762
772
|
// Prepare inputs
|
|
763
773
|
await Promise.all(inputs.map(async (utxo)=>{
|
|
764
|
-
const txHex = await this.getTxHex(utxo.txid, network);
|
|
774
|
+
const txHex = await this.getTxHex(utxo.txid, network, rpcUrl);
|
|
765
775
|
const inputData = {
|
|
766
776
|
hash: utxo.txid,
|
|
767
777
|
index: utxo.vout,
|
|
@@ -807,10 +817,14 @@ class DynamicBtcWalletClient extends DynamicWalletClient {
|
|
|
807
817
|
* Fetches the raw transaction hex for a given transaction ID
|
|
808
818
|
* @param txid - The transaction ID
|
|
809
819
|
* @param network - The network
|
|
820
|
+
* @param rpcUrl - Optional custom Esplora-compatible API base URL
|
|
810
821
|
* @returns The transaction hex
|
|
811
|
-
*/ async getTxHex(txid, network) {
|
|
812
|
-
const baseUrl =
|
|
813
|
-
|
|
822
|
+
*/ async getTxHex(txid, network, rpcUrl) {
|
|
823
|
+
const baseUrl = resolveRpcUrl({
|
|
824
|
+
network,
|
|
825
|
+
rpcUrl
|
|
826
|
+
});
|
|
827
|
+
const response = await rpcFetch(`${baseUrl}/tx/${txid}/hex`, rpcUrl);
|
|
814
828
|
if (!response.ok) {
|
|
815
829
|
throw new Error(`Failed to fetch TX hex: ${response.statusText}`);
|
|
816
830
|
}
|
package/package.json
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@dynamic-labs-wallet/btc",
|
|
3
|
-
"version": "1.1.
|
|
3
|
+
"version": "1.1.30",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"sideEffects": false,
|
|
7
7
|
"dependencies": {
|
|
8
8
|
"@dynamic-labs/sdk-api-core": "0.50.0",
|
|
9
|
-
"@dynamic-labs-wallet/browser": "1.1.
|
|
10
|
-
"@dynamic-labs-wallet/btc-utils": "1.1.
|
|
9
|
+
"@dynamic-labs-wallet/browser": "1.1.30",
|
|
10
|
+
"@dynamic-labs-wallet/btc-utils": "1.1.30",
|
|
11
11
|
"@bitcoinerlab/secp256k1": "^1.2.0",
|
|
12
12
|
"bitcoinjs-lib": "^7.0.0"
|
|
13
13
|
},
|
package/src/client/client.d.ts
CHANGED
|
@@ -189,20 +189,27 @@ export declare class DynamicBtcWalletClient extends DynamicWalletClient {
|
|
|
189
189
|
* @param amount - The amount to send in satoshis
|
|
190
190
|
* @param senderAddress - The address to send funds from
|
|
191
191
|
* @param network - The network to use (mainnet/testnet)
|
|
192
|
-
* @param feeRateLevel - The fee rate level to use (fast, medium, slow)
|
|
192
|
+
* @param feeRateLevel - The fee rate level to use (fast, medium, slow). Ignored when feeRate is set
|
|
193
|
+
* @param feeRate - Explicit fee rate in sat/vByte; skips the fee lookup entirely
|
|
194
|
+
* @param rpcUrl - Custom Esplora-compatible API base URL (e.g. a self-hosted Esplora/electrs/mempool)
|
|
195
|
+
* used for fee rates, UTXOs and raw transactions instead of mempool.space. Must be https
|
|
196
|
+
* (http only for localhost). Fee rates use `/v1/fees/recommended`, falling back to `/fee-estimates`
|
|
193
197
|
* @returns The PSBT in hex format
|
|
194
198
|
*/
|
|
195
|
-
createTransaction({ receiverAddress, amount, senderAddress, network, feeRateLevel, }: {
|
|
199
|
+
createTransaction({ receiverAddress, amount, senderAddress, network, feeRateLevel, feeRate: feeRateOverride, rpcUrl, }: {
|
|
196
200
|
receiverAddress: string;
|
|
197
201
|
amount: string;
|
|
198
202
|
senderAddress: string;
|
|
199
203
|
network: BitcoinNetwork;
|
|
200
204
|
feeRateLevel?: 'fast' | 'medium' | 'slow';
|
|
205
|
+
feeRate?: number;
|
|
206
|
+
rpcUrl?: string;
|
|
201
207
|
}): Promise<string>;
|
|
202
208
|
/**
|
|
203
209
|
* Fetches the raw transaction hex for a given transaction ID
|
|
204
210
|
* @param txid - The transaction ID
|
|
205
211
|
* @param network - The network
|
|
212
|
+
* @param rpcUrl - Optional custom Esplora-compatible API base URL
|
|
206
213
|
* @returns The transaction hex
|
|
207
214
|
*/
|
|
208
215
|
private getTxHex;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/client/client.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,kBAAkB,EAClB,cAAc,EACd,mBAAmB,EAQnB,KAAK,kBAAkB,EACvB,KAAK,aAAa,EAClB,KAAK,kCAAkC,EACvC,KAAK,wBAAwB,EAC7B,KAAK,cAAc,EACnB,KAAK,cAAc,EACnB,KAAK,wBAAwB,EAC7B,KAAK,8BAA8B,EACnC,KAAK,cAAc,EAEnB,KAAK,4BAA4B,EAClC,MAAM,8BAA8B,CAAC;
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/client/client.ts"],"names":[],"mappings":"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"}
|