otx-btc-wallet-connectors 0.1.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.
- package/README.md +554 -0
- package/dist/base-IAFq7sd8.d.mts +53 -0
- package/dist/base-IAFq7sd8.d.ts +53 -0
- package/dist/binance/index.d.mts +81 -0
- package/dist/binance/index.d.ts +81 -0
- package/dist/binance/index.js +13 -0
- package/dist/binance/index.js.map +1 -0
- package/dist/binance/index.mjs +4 -0
- package/dist/binance/index.mjs.map +1 -0
- package/dist/bitget/index.d.mts +84 -0
- package/dist/bitget/index.d.ts +84 -0
- package/dist/bitget/index.js +13 -0
- package/dist/bitget/index.js.map +1 -0
- package/dist/bitget/index.mjs +4 -0
- package/dist/bitget/index.mjs.map +1 -0
- package/dist/chunk-5Z5Q2Y75.mjs +91 -0
- package/dist/chunk-5Z5Q2Y75.mjs.map +1 -0
- package/dist/chunk-7KK2LZLZ.mjs +208 -0
- package/dist/chunk-7KK2LZLZ.mjs.map +1 -0
- package/dist/chunk-AW2JZIHR.mjs +753 -0
- package/dist/chunk-AW2JZIHR.mjs.map +1 -0
- package/dist/chunk-EIJOSZXZ.js +331 -0
- package/dist/chunk-EIJOSZXZ.js.map +1 -0
- package/dist/chunk-EQHR7P7G.js +541 -0
- package/dist/chunk-EQHR7P7G.js.map +1 -0
- package/dist/chunk-EWRXLZO4.mjs +539 -0
- package/dist/chunk-EWRXLZO4.mjs.map +1 -0
- package/dist/chunk-FISNQZZ7.js +802 -0
- package/dist/chunk-FISNQZZ7.js.map +1 -0
- package/dist/chunk-HL4WDMGS.js +200 -0
- package/dist/chunk-HL4WDMGS.js.map +1 -0
- package/dist/chunk-IPYWR76I.js +314 -0
- package/dist/chunk-IPYWR76I.js.map +1 -0
- package/dist/chunk-JYYNWR5G.js +142 -0
- package/dist/chunk-JYYNWR5G.js.map +1 -0
- package/dist/chunk-LNKTYZJM.js +701 -0
- package/dist/chunk-LNKTYZJM.js.map +1 -0
- package/dist/chunk-LVZMONQL.mjs +699 -0
- package/dist/chunk-LVZMONQL.mjs.map +1 -0
- package/dist/chunk-MFXLQWOE.js +93 -0
- package/dist/chunk-MFXLQWOE.js.map +1 -0
- package/dist/chunk-NBIA4TTE.mjs +204 -0
- package/dist/chunk-NBIA4TTE.mjs.map +1 -0
- package/dist/chunk-O4DD2XJ2.js +206 -0
- package/dist/chunk-O4DD2XJ2.js.map +1 -0
- package/dist/chunk-P7HVBU2B.mjs +140 -0
- package/dist/chunk-P7HVBU2B.mjs.map +1 -0
- package/dist/chunk-Q7QVQYEB.js +210 -0
- package/dist/chunk-Q7QVQYEB.js.map +1 -0
- package/dist/chunk-RLZEG6KL.mjs +329 -0
- package/dist/chunk-RLZEG6KL.mjs.map +1 -0
- package/dist/chunk-SYLDBJ75.mjs +246 -0
- package/dist/chunk-SYLDBJ75.mjs.map +1 -0
- package/dist/chunk-TTEUU3CI.mjs +198 -0
- package/dist/chunk-TTEUU3CI.mjs.map +1 -0
- package/dist/chunk-V66BXDTR.mjs +292 -0
- package/dist/chunk-V66BXDTR.mjs.map +1 -0
- package/dist/chunk-X77ZT4OI.js +268 -0
- package/dist/chunk-X77ZT4OI.js.map +1 -0
- package/dist/imtoken/index.d.mts +116 -0
- package/dist/imtoken/index.d.ts +116 -0
- package/dist/imtoken/index.js +14 -0
- package/dist/imtoken/index.js.map +1 -0
- package/dist/imtoken/index.mjs +5 -0
- package/dist/imtoken/index.mjs.map +1 -0
- package/dist/index.d.mts +14 -0
- package/dist/index.d.ts +14 -0
- package/dist/index.js +170 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +13 -0
- package/dist/index.mjs.map +1 -0
- package/dist/ledger/index.d.mts +290 -0
- package/dist/ledger/index.d.ts +290 -0
- package/dist/ledger/index.js +14 -0
- package/dist/ledger/index.js.map +1 -0
- package/dist/ledger/index.mjs +5 -0
- package/dist/ledger/index.mjs.map +1 -0
- package/dist/okx/index.d.mts +88 -0
- package/dist/okx/index.d.ts +88 -0
- package/dist/okx/index.js +13 -0
- package/dist/okx/index.js.map +1 -0
- package/dist/okx/index.mjs +4 -0
- package/dist/okx/index.mjs.map +1 -0
- package/dist/phantom/index.d.mts +96 -0
- package/dist/phantom/index.d.ts +96 -0
- package/dist/phantom/index.js +14 -0
- package/dist/phantom/index.js.map +1 -0
- package/dist/phantom/index.mjs +5 -0
- package/dist/phantom/index.mjs.map +1 -0
- package/dist/psbt-builder-CFOs69Z5.d.mts +131 -0
- package/dist/psbt-builder-CFOs69Z5.d.ts +131 -0
- package/dist/trezor/index.d.mts +155 -0
- package/dist/trezor/index.d.ts +155 -0
- package/dist/trezor/index.js +14 -0
- package/dist/trezor/index.js.map +1 -0
- package/dist/trezor/index.mjs +5 -0
- package/dist/trezor/index.mjs.map +1 -0
- package/dist/unisat/index.d.mts +75 -0
- package/dist/unisat/index.d.ts +75 -0
- package/dist/unisat/index.js +13 -0
- package/dist/unisat/index.js.map +1 -0
- package/dist/unisat/index.mjs +4 -0
- package/dist/unisat/index.mjs.map +1 -0
- package/dist/utils/index.d.mts +398 -0
- package/dist/utils/index.d.ts +398 -0
- package/dist/utils/index.js +120 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/index.mjs +3 -0
- package/dist/utils/index.mjs.map +1 -0
- package/dist/xverse/index.d.mts +79 -0
- package/dist/xverse/index.d.ts +79 -0
- package/dist/xverse/index.js +13 -0
- package/dist/xverse/index.js.map +1 -0
- package/dist/xverse/index.mjs +4 -0
- package/dist/xverse/index.mjs.map +1 -0
- package/package.json +108 -0
- package/src/base.ts +132 -0
- package/src/binance/BinanceConnector.ts +307 -0
- package/src/binance/index.ts +1 -0
- package/src/bitget/BitgetConnector.ts +301 -0
- package/src/bitget/index.ts +1 -0
- package/src/imtoken/ImTokenConnector.ts +420 -0
- package/src/imtoken/index.ts +2 -0
- package/src/index.ts +78 -0
- package/src/ledger/LedgerConnector.ts +1019 -0
- package/src/ledger/index.ts +8 -0
- package/src/okx/OKXConnector.ts +230 -0
- package/src/okx/index.ts +1 -0
- package/src/phantom/PhantomConnector.ts +381 -0
- package/src/phantom/index.ts +2 -0
- package/src/trezor/TrezorConnector.ts +824 -0
- package/src/trezor/index.ts +6 -0
- package/src/unisat/UnisatConnector.ts +312 -0
- package/src/unisat/index.ts +1 -0
- package/src/utils/blockstream.ts +230 -0
- package/src/utils/btc-service.ts +364 -0
- package/src/utils/index.ts +56 -0
- package/src/utils/mempool.ts +232 -0
- package/src/utils/psbt-builder.ts +492 -0
- package/src/utils/types.ts +183 -0
- package/src/xverse/XverseConnector.ts +479 -0
- package/src/xverse/index.ts +1 -0
|
@@ -0,0 +1,290 @@
|
|
|
1
|
+
import { BitcoinNetwork, WalletAccount, SignPsbtOptions } from 'otx-btc-wallet-core';
|
|
2
|
+
import { B as BaseConnector } from '../base-IAFq7sd8.mjs';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Ledger address type configuration
|
|
6
|
+
*/
|
|
7
|
+
type LedgerAddressType = 'legacy' | 'nested-segwit' | 'segwit' | 'taproot';
|
|
8
|
+
/**
|
|
9
|
+
* Ledger connector options
|
|
10
|
+
*/
|
|
11
|
+
interface LedgerConnectorOptions {
|
|
12
|
+
/** Address type for derivation (default: 'segwit') */
|
|
13
|
+
addressType?: LedgerAddressType;
|
|
14
|
+
/** Account index (default: 0) */
|
|
15
|
+
accountIndex?: number;
|
|
16
|
+
/** Address index (default: 0) */
|
|
17
|
+
addressIndex?: number;
|
|
18
|
+
}
|
|
19
|
+
interface LedgerBtcApp {
|
|
20
|
+
getWalletPublicKey(path: string, opts?: {
|
|
21
|
+
verify?: boolean;
|
|
22
|
+
format?: 'legacy' | 'p2sh' | 'bech32' | 'bech32m';
|
|
23
|
+
}): Promise<{
|
|
24
|
+
publicKey: string;
|
|
25
|
+
bitcoinAddress: string;
|
|
26
|
+
chainCode: string;
|
|
27
|
+
}>;
|
|
28
|
+
getWalletXpub(arg: {
|
|
29
|
+
path: string;
|
|
30
|
+
xpubVersion: number;
|
|
31
|
+
}): Promise<string>;
|
|
32
|
+
signMessage(path: string, messageHex: string): Promise<{
|
|
33
|
+
v: number;
|
|
34
|
+
r: string;
|
|
35
|
+
s: string;
|
|
36
|
+
}>;
|
|
37
|
+
splitTransaction(transactionHex: string, isSegwitSupported?: boolean | null, hasExtraData?: boolean, additionals?: string[]): LedgerTransaction;
|
|
38
|
+
createPaymentTransaction(arg: {
|
|
39
|
+
inputs: Array<[LedgerTransaction, number, string | null | undefined, number?]>;
|
|
40
|
+
associatedKeysets: string[];
|
|
41
|
+
changePath?: string;
|
|
42
|
+
outputScriptHex: string;
|
|
43
|
+
lockTime?: number;
|
|
44
|
+
sigHashType?: number;
|
|
45
|
+
segwit?: boolean;
|
|
46
|
+
additionals?: string[];
|
|
47
|
+
expiryHeight?: Buffer;
|
|
48
|
+
useTrustedInputForSegwit?: boolean;
|
|
49
|
+
}): Promise<string>;
|
|
50
|
+
serializeTransactionOutputs(tx: LedgerTransaction): Buffer;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Ledger Transaction type (returned by splitTransaction)
|
|
54
|
+
*/
|
|
55
|
+
interface LedgerTransaction {
|
|
56
|
+
version: Buffer;
|
|
57
|
+
inputs: Array<{
|
|
58
|
+
prevout: Buffer;
|
|
59
|
+
script: Buffer;
|
|
60
|
+
sequence: Buffer;
|
|
61
|
+
}>;
|
|
62
|
+
outputs?: Array<{
|
|
63
|
+
amount: Buffer;
|
|
64
|
+
script: Buffer;
|
|
65
|
+
}>;
|
|
66
|
+
locktime?: Buffer;
|
|
67
|
+
witness?: Buffer;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* UTXO input for createPaymentTransaction
|
|
71
|
+
*/
|
|
72
|
+
interface LedgerUtxoInput {
|
|
73
|
+
/** Raw transaction hex that created this UTXO */
|
|
74
|
+
txHex: string;
|
|
75
|
+
/** Output index in the transaction */
|
|
76
|
+
outputIndex: number;
|
|
77
|
+
/** BIP32 derivation path for signing (e.g., "84'/0'/0'/0/0") */
|
|
78
|
+
derivationPath: string;
|
|
79
|
+
/** Optional redeem script for P2SH inputs */
|
|
80
|
+
redeemScript?: string;
|
|
81
|
+
/** Optional sequence number (default: 0xffffffff) */
|
|
82
|
+
sequence?: number;
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Output for createPaymentTransaction
|
|
86
|
+
*/
|
|
87
|
+
interface LedgerTxOutput {
|
|
88
|
+
/** Recipient address */
|
|
89
|
+
address: string;
|
|
90
|
+
/** Amount in satoshis */
|
|
91
|
+
satoshis: number;
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Options for sendBitcoin method
|
|
95
|
+
*/
|
|
96
|
+
interface SendBitcoinOptions {
|
|
97
|
+
/** Fee rate in sat/vB (optional, defaults to "hour" priority) */
|
|
98
|
+
feeRate?: number;
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Ledger Hardware Wallet Connector
|
|
102
|
+
*
|
|
103
|
+
* @see https://developers.ledger.com/docs/transport/overview
|
|
104
|
+
* @see https://github.com/LedgerHQ/ledger-live/tree/develop/libs/ledgerjs/packages/hw-app-btc
|
|
105
|
+
*/
|
|
106
|
+
declare class LedgerConnector extends BaseConnector {
|
|
107
|
+
readonly id = "ledger";
|
|
108
|
+
readonly name = "Ledger";
|
|
109
|
+
readonly icon = "data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjAwIiBoZWlnaHQ9IjIwMCIgdmlld0JveD0iMCAwIDIwMCAyMDAiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxnIGNsaXAtcGF0aD0idXJsKCNjbGlwMF83MDM1XzUxMTApIj4KPHJlY3Qgd2lkdGg9IjIwMCIgaGVpZ2h0PSIyMDAiIHJ4PSIzMiIgZmlsbD0id2hpdGUiLz4KPHBhdGggZD0iTTE0Mi4yMzkgMzcuNUg4NS4wOTY0VjExNC41ODJIMTYyLjIzOVY1Ny40MzkzQzE2Mi4yMzggNTQuODE2IDE2MS43MiA1Mi4yMTg2IDE2MC43MTQgNDkuNzk1OUMxNTkuNzA4IDQ3LjM3MzIgMTU4LjIzMyA0NS4xNzI4IDE1Ni4zNzYgNDMuMzIwN0MxNTQuNTE4IDQxLjQ2ODUgMTUyLjMxMyA0MC4wMDExIDE0OS44ODcgMzkuMDAyM0MxNDcuNDYyIDM4LjAwMzUgMTQ0Ljg2MyAzNy40OTMgMTQyLjIzOSAzNy41WiIgZmlsbD0iYmxhY2siLz4KPHBhdGggZD0iTTY3LjI5MjkgMzcuNUg1Ny40NDY0QzUyLjE1NjMgMzcuNSA0Ny4wODI5IDM5LjYwMTUgNDMuMzQyMiA0My4zNDIyQzM5LjYwMTUgNDcuMDgyOSAzNy41IDUyLjE1NjMgMzcuNSA1Ny40NDY0TDM3LjUgNjcuMjkyOUg2Ny4yOTI5VjM3LjVaIiBmaWxsPSJibGFjayIvPgo8cGF0aCBkPSJNMzcuNSA4NS4xMDM2SDY3LjI5MjlWMTE0Ljg5NkgzNy41Vjg1LjEwMzZaIiBmaWxsPSJibGFjayIvPgo8cGF0aCBkPSJNMTMyLjcwNyAxNjIuMjQ2SDE0Mi41NTNDMTQ1LjE3NyAxNjIuMjQ2IDE0Ny43NzYgMTYxLjcyOSAxNTAuMTk5IDE2MC43MjNDMTUyLjYyMyAxNTkuNzE3IDE1NC44MjQgMTU4LjI0MyAxNTYuNjc3IDE1Ni4zODVDMTU4LjUzIDE1NC41MjcgMTU5Ljk5OCAxNTIuMzIyIDE2MC45OTcgMTQ5Ljg5NkMxNjEuOTk2IDE0Ny40NyAxNjIuNTA3IDE0NC44NyAxNjIuNSAxNDIuMjQ2VjEzMi43MDdIMTMyLjcwN1YxNjIuMjQ2WiIgZmlsbD0iYmxhY2siLz4KPHBhdGggZD0iTTg1LjEwMzUgMTMyLjcwN0gxMTQuODk2VjE2Mi41SDg1LjEwMzVWMTMyLjcwN1oiIGZpbGw9ImJsYWNrIi8+CjxwYXRoIGQ9Ik0zNy41IDEzMi43MDdWMTQyLjU1NEMzNy41IDE0NS4xNzMgMzguMDE1OSAxNDcuNzY3IDM5LjAxODMgMTUwLjE4N0M0MC4wMjA3IDE1Mi42MDcgNDEuNDkgMTU0LjgwNiA0My4zNDIyIDE1Ni42NThDNDUuMTk0NCAxNTguNTEgNDcuMzkzMiAxNTkuOTc5IDQ5LjgxMzMgMTYwLjk4MkM1Mi4yMzMzIDE2MS45ODQgNTQuODI3IDE2Mi41IDU3LjQ0NjQgMTYyLjVINjcuMjkyOVYxMzIuNzA3SDM3LjVaIiBmaWxsPSJibGFjayIvPgo8L2c+CjxkZWZzPgo8Y2xpcFBhdGggaWQ9ImNsaXAwXzcwMzVfNTExMCI+CjxyZWN0IHdpZHRoPSIyMDAiIGhlaWdodD0iMjAwIiBmaWxsPSJ3aGl0ZSIvPgo8L2NsaXBQYXRoPgo8L2RlZnM+Cjwvc3ZnPgo=";
|
|
110
|
+
private _transport;
|
|
111
|
+
private _btcApp;
|
|
112
|
+
private _account;
|
|
113
|
+
private _network;
|
|
114
|
+
private _options;
|
|
115
|
+
private _derivationPath;
|
|
116
|
+
private static readonly CONNECTION_TIMEOUT;
|
|
117
|
+
constructor(options?: LedgerConnectorOptions);
|
|
118
|
+
/**
|
|
119
|
+
* Override checkReady - Ledger is always "ready" since it doesn't require browser extension
|
|
120
|
+
* The actual device connection happens when connect() is called
|
|
121
|
+
*/
|
|
122
|
+
protected checkReady(): void;
|
|
123
|
+
/**
|
|
124
|
+
* Get the provider - for Ledger this is the Bitcoin app instance
|
|
125
|
+
*/
|
|
126
|
+
protected getProvider(): LedgerBtcApp | null;
|
|
127
|
+
/**
|
|
128
|
+
* Get current address type
|
|
129
|
+
*/
|
|
130
|
+
getAddressType(): LedgerAddressType;
|
|
131
|
+
/**
|
|
132
|
+
* Set address type options before connecting
|
|
133
|
+
* Call this before connect() to change the address derivation path
|
|
134
|
+
*/
|
|
135
|
+
setOptions(options: LedgerConnectorOptions): void;
|
|
136
|
+
/**
|
|
137
|
+
* Get available address types for UI selection
|
|
138
|
+
*/
|
|
139
|
+
static getAvailableAddressTypes(): Array<{
|
|
140
|
+
type: LedgerAddressType;
|
|
141
|
+
label: string;
|
|
142
|
+
description: string;
|
|
143
|
+
}>;
|
|
144
|
+
/**
|
|
145
|
+
* Check if WebUSB is supported in the current browser
|
|
146
|
+
*/
|
|
147
|
+
isSupported(): Promise<boolean>;
|
|
148
|
+
/**
|
|
149
|
+
* Initialize transport with timeout
|
|
150
|
+
* Uses request() instead of create() to always show device selection popup
|
|
151
|
+
*/
|
|
152
|
+
private initTransport;
|
|
153
|
+
/**
|
|
154
|
+
* Get BTC app instance, initializing if needed
|
|
155
|
+
*/
|
|
156
|
+
private getBtcAppInstance;
|
|
157
|
+
/**
|
|
158
|
+
* Connect to Ledger device
|
|
159
|
+
* IMPORTANT: This must be called within a user gesture (click event)
|
|
160
|
+
*/
|
|
161
|
+
connect(network?: BitcoinNetwork): Promise<WalletAccount>;
|
|
162
|
+
/**
|
|
163
|
+
* Get address with verification on device
|
|
164
|
+
*/
|
|
165
|
+
getAddressWithVerification(): Promise<WalletAccount>;
|
|
166
|
+
private setupDisconnectListener;
|
|
167
|
+
private closeTransport;
|
|
168
|
+
disconnect(): Promise<void>;
|
|
169
|
+
getAccounts(): Promise<WalletAccount[]>;
|
|
170
|
+
signMessage(message: string): Promise<string>;
|
|
171
|
+
/**
|
|
172
|
+
* Sign a PSBT with Ledger
|
|
173
|
+
*
|
|
174
|
+
* Note: Ledger hardware wallets don't support direct PSBT signing through the standard API.
|
|
175
|
+
* Use the createTransaction method or sendTransaction instead.
|
|
176
|
+
*/
|
|
177
|
+
signPsbt(_psbtHex: string, _options?: SignPsbtOptions): Promise<string>;
|
|
178
|
+
/**
|
|
179
|
+
* Sign multiple PSBTs
|
|
180
|
+
*/
|
|
181
|
+
signPsbts(psbtHexs: string[], options?: SignPsbtOptions): Promise<string[]>;
|
|
182
|
+
/**
|
|
183
|
+
* Send a Bitcoin transaction
|
|
184
|
+
*
|
|
185
|
+
* @param to - Recipient address
|
|
186
|
+
* @param satoshis - Amount to send in satoshis
|
|
187
|
+
* @param options - Send options (feeRate, etc.)
|
|
188
|
+
* @returns Transaction ID after broadcast
|
|
189
|
+
*
|
|
190
|
+
* @example
|
|
191
|
+
* ```typescript
|
|
192
|
+
* const txid = await ledger.sendTransaction('bc1q...', 50000);
|
|
193
|
+
* // With custom fee rate
|
|
194
|
+
* const txid = await ledger.sendTransaction('bc1q...', 50000, { feeRate: 10 });
|
|
195
|
+
* ```
|
|
196
|
+
*/
|
|
197
|
+
sendTransaction(to: string, satoshis: number, options?: SendBitcoinOptions): Promise<string>;
|
|
198
|
+
/**
|
|
199
|
+
* Create and sign a Bitcoin transaction using Ledger
|
|
200
|
+
*
|
|
201
|
+
* This method requires you to provide UTXOs (unspent transaction outputs) which
|
|
202
|
+
* must be fetched from a blockchain API (e.g., Blockstream, Mempool.space, etc.)
|
|
203
|
+
*
|
|
204
|
+
* @param inputs - Array of UTXO inputs to spend
|
|
205
|
+
* @param outputs - Array of outputs (recipients)
|
|
206
|
+
* @param changePath - Optional BIP32 path for change output
|
|
207
|
+
* @returns Signed transaction hex ready for broadcast
|
|
208
|
+
*
|
|
209
|
+
* @example
|
|
210
|
+
* ```typescript
|
|
211
|
+
* const signedTx = await ledger.createTransaction(
|
|
212
|
+
* [{
|
|
213
|
+
* txHex: '0100000001...', // Raw tx hex that created the UTXO
|
|
214
|
+
* outputIndex: 0,
|
|
215
|
+
* derivationPath: "84'/0'/0'/0/0",
|
|
216
|
+
* }],
|
|
217
|
+
* [{
|
|
218
|
+
* address: 'bc1q...',
|
|
219
|
+
* satoshis: 50000,
|
|
220
|
+
* }],
|
|
221
|
+
* "84'/0'/0'/1/0" // Change address path
|
|
222
|
+
* );
|
|
223
|
+
* ```
|
|
224
|
+
*/
|
|
225
|
+
createTransaction(inputs: LedgerUtxoInput[], outputs: LedgerTxOutput[], changePath?: string): Promise<string>;
|
|
226
|
+
/**
|
|
227
|
+
* Build output script hex from outputs array
|
|
228
|
+
* Format: varint(output_count) + [amount(8 bytes LE) + varint(script_len) + script]...
|
|
229
|
+
*/
|
|
230
|
+
private buildOutputScript;
|
|
231
|
+
/**
|
|
232
|
+
* Convert address to scriptPubKey hex
|
|
233
|
+
*/
|
|
234
|
+
private addressToScriptPubKey;
|
|
235
|
+
/**
|
|
236
|
+
* Decode bech32/bech32m address to hex
|
|
237
|
+
*/
|
|
238
|
+
private decodeBech32;
|
|
239
|
+
/**
|
|
240
|
+
* Decode base58check address to hex (without version byte)
|
|
241
|
+
*/
|
|
242
|
+
private decodeBase58Check;
|
|
243
|
+
/**
|
|
244
|
+
* Encode number as varint hex
|
|
245
|
+
*/
|
|
246
|
+
private encodeVarint;
|
|
247
|
+
/**
|
|
248
|
+
* Convert uint16 to little-endian hex
|
|
249
|
+
*/
|
|
250
|
+
private uint16ToLittleEndian;
|
|
251
|
+
/**
|
|
252
|
+
* Convert uint32 to little-endian hex
|
|
253
|
+
*/
|
|
254
|
+
private uint32ToLittleEndian;
|
|
255
|
+
/**
|
|
256
|
+
* Convert uint64 to little-endian hex
|
|
257
|
+
*/
|
|
258
|
+
private uint64ToLittleEndian;
|
|
259
|
+
/**
|
|
260
|
+
* Get additionals array based on address type
|
|
261
|
+
*/
|
|
262
|
+
private getAdditionals;
|
|
263
|
+
getNetwork(): Promise<BitcoinNetwork>;
|
|
264
|
+
/**
|
|
265
|
+
* Get extended public key (xpub/ypub/zpub) for account
|
|
266
|
+
*/
|
|
267
|
+
getExtendedPublicKey(): Promise<string>;
|
|
268
|
+
/**
|
|
269
|
+
* Get multiple addresses for the account
|
|
270
|
+
*/
|
|
271
|
+
getAddresses(startIndex: number, count: number): Promise<WalletAccount[]>;
|
|
272
|
+
/**
|
|
273
|
+
* Get current derivation path
|
|
274
|
+
*/
|
|
275
|
+
getDerivationPath(): string;
|
|
276
|
+
/**
|
|
277
|
+
* Check if device is connected
|
|
278
|
+
*/
|
|
279
|
+
isConnected(): boolean;
|
|
280
|
+
/**
|
|
281
|
+
* Get the Ledger Bitcoin app instance for advanced operations
|
|
282
|
+
* This allows users to call createPaymentTransaction directly
|
|
283
|
+
*/
|
|
284
|
+
getBtcApp(): LedgerBtcApp | null;
|
|
285
|
+
private mapLedgerAddressType;
|
|
286
|
+
private getXpubVersion;
|
|
287
|
+
private handleLedgerError;
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
export { type LedgerAddressType, LedgerConnector, type LedgerConnectorOptions, type LedgerTxOutput, type LedgerUtxoInput, type SendBitcoinOptions };
|
|
@@ -0,0 +1,290 @@
|
|
|
1
|
+
import { BitcoinNetwork, WalletAccount, SignPsbtOptions } from 'otx-btc-wallet-core';
|
|
2
|
+
import { B as BaseConnector } from '../base-IAFq7sd8.js';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Ledger address type configuration
|
|
6
|
+
*/
|
|
7
|
+
type LedgerAddressType = 'legacy' | 'nested-segwit' | 'segwit' | 'taproot';
|
|
8
|
+
/**
|
|
9
|
+
* Ledger connector options
|
|
10
|
+
*/
|
|
11
|
+
interface LedgerConnectorOptions {
|
|
12
|
+
/** Address type for derivation (default: 'segwit') */
|
|
13
|
+
addressType?: LedgerAddressType;
|
|
14
|
+
/** Account index (default: 0) */
|
|
15
|
+
accountIndex?: number;
|
|
16
|
+
/** Address index (default: 0) */
|
|
17
|
+
addressIndex?: number;
|
|
18
|
+
}
|
|
19
|
+
interface LedgerBtcApp {
|
|
20
|
+
getWalletPublicKey(path: string, opts?: {
|
|
21
|
+
verify?: boolean;
|
|
22
|
+
format?: 'legacy' | 'p2sh' | 'bech32' | 'bech32m';
|
|
23
|
+
}): Promise<{
|
|
24
|
+
publicKey: string;
|
|
25
|
+
bitcoinAddress: string;
|
|
26
|
+
chainCode: string;
|
|
27
|
+
}>;
|
|
28
|
+
getWalletXpub(arg: {
|
|
29
|
+
path: string;
|
|
30
|
+
xpubVersion: number;
|
|
31
|
+
}): Promise<string>;
|
|
32
|
+
signMessage(path: string, messageHex: string): Promise<{
|
|
33
|
+
v: number;
|
|
34
|
+
r: string;
|
|
35
|
+
s: string;
|
|
36
|
+
}>;
|
|
37
|
+
splitTransaction(transactionHex: string, isSegwitSupported?: boolean | null, hasExtraData?: boolean, additionals?: string[]): LedgerTransaction;
|
|
38
|
+
createPaymentTransaction(arg: {
|
|
39
|
+
inputs: Array<[LedgerTransaction, number, string | null | undefined, number?]>;
|
|
40
|
+
associatedKeysets: string[];
|
|
41
|
+
changePath?: string;
|
|
42
|
+
outputScriptHex: string;
|
|
43
|
+
lockTime?: number;
|
|
44
|
+
sigHashType?: number;
|
|
45
|
+
segwit?: boolean;
|
|
46
|
+
additionals?: string[];
|
|
47
|
+
expiryHeight?: Buffer;
|
|
48
|
+
useTrustedInputForSegwit?: boolean;
|
|
49
|
+
}): Promise<string>;
|
|
50
|
+
serializeTransactionOutputs(tx: LedgerTransaction): Buffer;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Ledger Transaction type (returned by splitTransaction)
|
|
54
|
+
*/
|
|
55
|
+
interface LedgerTransaction {
|
|
56
|
+
version: Buffer;
|
|
57
|
+
inputs: Array<{
|
|
58
|
+
prevout: Buffer;
|
|
59
|
+
script: Buffer;
|
|
60
|
+
sequence: Buffer;
|
|
61
|
+
}>;
|
|
62
|
+
outputs?: Array<{
|
|
63
|
+
amount: Buffer;
|
|
64
|
+
script: Buffer;
|
|
65
|
+
}>;
|
|
66
|
+
locktime?: Buffer;
|
|
67
|
+
witness?: Buffer;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* UTXO input for createPaymentTransaction
|
|
71
|
+
*/
|
|
72
|
+
interface LedgerUtxoInput {
|
|
73
|
+
/** Raw transaction hex that created this UTXO */
|
|
74
|
+
txHex: string;
|
|
75
|
+
/** Output index in the transaction */
|
|
76
|
+
outputIndex: number;
|
|
77
|
+
/** BIP32 derivation path for signing (e.g., "84'/0'/0'/0/0") */
|
|
78
|
+
derivationPath: string;
|
|
79
|
+
/** Optional redeem script for P2SH inputs */
|
|
80
|
+
redeemScript?: string;
|
|
81
|
+
/** Optional sequence number (default: 0xffffffff) */
|
|
82
|
+
sequence?: number;
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Output for createPaymentTransaction
|
|
86
|
+
*/
|
|
87
|
+
interface LedgerTxOutput {
|
|
88
|
+
/** Recipient address */
|
|
89
|
+
address: string;
|
|
90
|
+
/** Amount in satoshis */
|
|
91
|
+
satoshis: number;
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Options for sendBitcoin method
|
|
95
|
+
*/
|
|
96
|
+
interface SendBitcoinOptions {
|
|
97
|
+
/** Fee rate in sat/vB (optional, defaults to "hour" priority) */
|
|
98
|
+
feeRate?: number;
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Ledger Hardware Wallet Connector
|
|
102
|
+
*
|
|
103
|
+
* @see https://developers.ledger.com/docs/transport/overview
|
|
104
|
+
* @see https://github.com/LedgerHQ/ledger-live/tree/develop/libs/ledgerjs/packages/hw-app-btc
|
|
105
|
+
*/
|
|
106
|
+
declare class LedgerConnector extends BaseConnector {
|
|
107
|
+
readonly id = "ledger";
|
|
108
|
+
readonly name = "Ledger";
|
|
109
|
+
readonly icon = "data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjAwIiBoZWlnaHQ9IjIwMCIgdmlld0JveD0iMCAwIDIwMCAyMDAiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxnIGNsaXAtcGF0aD0idXJsKCNjbGlwMF83MDM1XzUxMTApIj4KPHJlY3Qgd2lkdGg9IjIwMCIgaGVpZ2h0PSIyMDAiIHJ4PSIzMiIgZmlsbD0id2hpdGUiLz4KPHBhdGggZD0iTTE0Mi4yMzkgMzcuNUg4NS4wOTY0VjExNC41ODJIMTYyLjIzOVY1Ny40MzkzQzE2Mi4yMzggNTQuODE2IDE2MS43MiA1Mi4yMTg2IDE2MC43MTQgNDkuNzk1OUMxNTkuNzA4IDQ3LjM3MzIgMTU4LjIzMyA0NS4xNzI4IDE1Ni4zNzYgNDMuMzIwN0MxNTQuNTE4IDQxLjQ2ODUgMTUyLjMxMyA0MC4wMDExIDE0OS44ODcgMzkuMDAyM0MxNDcuNDYyIDM4LjAwMzUgMTQ0Ljg2MyAzNy40OTMgMTQyLjIzOSAzNy41WiIgZmlsbD0iYmxhY2siLz4KPHBhdGggZD0iTTY3LjI5MjkgMzcuNUg1Ny40NDY0QzUyLjE1NjMgMzcuNSA0Ny4wODI5IDM5LjYwMTUgNDMuMzQyMiA0My4zNDIyQzM5LjYwMTUgNDcuMDgyOSAzNy41IDUyLjE1NjMgMzcuNSA1Ny40NDY0TDM3LjUgNjcuMjkyOUg2Ny4yOTI5VjM3LjVaIiBmaWxsPSJibGFjayIvPgo8cGF0aCBkPSJNMzcuNSA4NS4xMDM2SDY3LjI5MjlWMTE0Ljg5NkgzNy41Vjg1LjEwMzZaIiBmaWxsPSJibGFjayIvPgo8cGF0aCBkPSJNMTMyLjcwNyAxNjIuMjQ2SDE0Mi41NTNDMTQ1LjE3NyAxNjIuMjQ2IDE0Ny43NzYgMTYxLjcyOSAxNTAuMTk5IDE2MC43MjNDMTUyLjYyMyAxNTkuNzE3IDE1NC44MjQgMTU4LjI0MyAxNTYuNjc3IDE1Ni4zODVDMTU4LjUzIDE1NC41MjcgMTU5Ljk5OCAxNTIuMzIyIDE2MC45OTcgMTQ5Ljg5NkMxNjEuOTk2IDE0Ny40NyAxNjIuNTA3IDE0NC44NyAxNjIuNSAxNDIuMjQ2VjEzMi43MDdIMTMyLjcwN1YxNjIuMjQ2WiIgZmlsbD0iYmxhY2siLz4KPHBhdGggZD0iTTg1LjEwMzUgMTMyLjcwN0gxMTQuODk2VjE2Mi41SDg1LjEwMzVWMTMyLjcwN1oiIGZpbGw9ImJsYWNrIi8+CjxwYXRoIGQ9Ik0zNy41IDEzMi43MDdWMTQyLjU1NEMzNy41IDE0NS4xNzMgMzguMDE1OSAxNDcuNzY3IDM5LjAxODMgMTUwLjE4N0M0MC4wMjA3IDE1Mi42MDcgNDEuNDkgMTU0LjgwNiA0My4zNDIyIDE1Ni42NThDNDUuMTk0NCAxNTguNTEgNDcuMzkzMiAxNTkuOTc5IDQ5LjgxMzMgMTYwLjk4MkM1Mi4yMzMzIDE2MS45ODQgNTQuODI3IDE2Mi41IDU3LjQ0NjQgMTYyLjVINjcuMjkyOVYxMzIuNzA3SDM3LjVaIiBmaWxsPSJibGFjayIvPgo8L2c+CjxkZWZzPgo8Y2xpcFBhdGggaWQ9ImNsaXAwXzcwMzVfNTExMCI+CjxyZWN0IHdpZHRoPSIyMDAiIGhlaWdodD0iMjAwIiBmaWxsPSJ3aGl0ZSIvPgo8L2NsaXBQYXRoPgo8L2RlZnM+Cjwvc3ZnPgo=";
|
|
110
|
+
private _transport;
|
|
111
|
+
private _btcApp;
|
|
112
|
+
private _account;
|
|
113
|
+
private _network;
|
|
114
|
+
private _options;
|
|
115
|
+
private _derivationPath;
|
|
116
|
+
private static readonly CONNECTION_TIMEOUT;
|
|
117
|
+
constructor(options?: LedgerConnectorOptions);
|
|
118
|
+
/**
|
|
119
|
+
* Override checkReady - Ledger is always "ready" since it doesn't require browser extension
|
|
120
|
+
* The actual device connection happens when connect() is called
|
|
121
|
+
*/
|
|
122
|
+
protected checkReady(): void;
|
|
123
|
+
/**
|
|
124
|
+
* Get the provider - for Ledger this is the Bitcoin app instance
|
|
125
|
+
*/
|
|
126
|
+
protected getProvider(): LedgerBtcApp | null;
|
|
127
|
+
/**
|
|
128
|
+
* Get current address type
|
|
129
|
+
*/
|
|
130
|
+
getAddressType(): LedgerAddressType;
|
|
131
|
+
/**
|
|
132
|
+
* Set address type options before connecting
|
|
133
|
+
* Call this before connect() to change the address derivation path
|
|
134
|
+
*/
|
|
135
|
+
setOptions(options: LedgerConnectorOptions): void;
|
|
136
|
+
/**
|
|
137
|
+
* Get available address types for UI selection
|
|
138
|
+
*/
|
|
139
|
+
static getAvailableAddressTypes(): Array<{
|
|
140
|
+
type: LedgerAddressType;
|
|
141
|
+
label: string;
|
|
142
|
+
description: string;
|
|
143
|
+
}>;
|
|
144
|
+
/**
|
|
145
|
+
* Check if WebUSB is supported in the current browser
|
|
146
|
+
*/
|
|
147
|
+
isSupported(): Promise<boolean>;
|
|
148
|
+
/**
|
|
149
|
+
* Initialize transport with timeout
|
|
150
|
+
* Uses request() instead of create() to always show device selection popup
|
|
151
|
+
*/
|
|
152
|
+
private initTransport;
|
|
153
|
+
/**
|
|
154
|
+
* Get BTC app instance, initializing if needed
|
|
155
|
+
*/
|
|
156
|
+
private getBtcAppInstance;
|
|
157
|
+
/**
|
|
158
|
+
* Connect to Ledger device
|
|
159
|
+
* IMPORTANT: This must be called within a user gesture (click event)
|
|
160
|
+
*/
|
|
161
|
+
connect(network?: BitcoinNetwork): Promise<WalletAccount>;
|
|
162
|
+
/**
|
|
163
|
+
* Get address with verification on device
|
|
164
|
+
*/
|
|
165
|
+
getAddressWithVerification(): Promise<WalletAccount>;
|
|
166
|
+
private setupDisconnectListener;
|
|
167
|
+
private closeTransport;
|
|
168
|
+
disconnect(): Promise<void>;
|
|
169
|
+
getAccounts(): Promise<WalletAccount[]>;
|
|
170
|
+
signMessage(message: string): Promise<string>;
|
|
171
|
+
/**
|
|
172
|
+
* Sign a PSBT with Ledger
|
|
173
|
+
*
|
|
174
|
+
* Note: Ledger hardware wallets don't support direct PSBT signing through the standard API.
|
|
175
|
+
* Use the createTransaction method or sendTransaction instead.
|
|
176
|
+
*/
|
|
177
|
+
signPsbt(_psbtHex: string, _options?: SignPsbtOptions): Promise<string>;
|
|
178
|
+
/**
|
|
179
|
+
* Sign multiple PSBTs
|
|
180
|
+
*/
|
|
181
|
+
signPsbts(psbtHexs: string[], options?: SignPsbtOptions): Promise<string[]>;
|
|
182
|
+
/**
|
|
183
|
+
* Send a Bitcoin transaction
|
|
184
|
+
*
|
|
185
|
+
* @param to - Recipient address
|
|
186
|
+
* @param satoshis - Amount to send in satoshis
|
|
187
|
+
* @param options - Send options (feeRate, etc.)
|
|
188
|
+
* @returns Transaction ID after broadcast
|
|
189
|
+
*
|
|
190
|
+
* @example
|
|
191
|
+
* ```typescript
|
|
192
|
+
* const txid = await ledger.sendTransaction('bc1q...', 50000);
|
|
193
|
+
* // With custom fee rate
|
|
194
|
+
* const txid = await ledger.sendTransaction('bc1q...', 50000, { feeRate: 10 });
|
|
195
|
+
* ```
|
|
196
|
+
*/
|
|
197
|
+
sendTransaction(to: string, satoshis: number, options?: SendBitcoinOptions): Promise<string>;
|
|
198
|
+
/**
|
|
199
|
+
* Create and sign a Bitcoin transaction using Ledger
|
|
200
|
+
*
|
|
201
|
+
* This method requires you to provide UTXOs (unspent transaction outputs) which
|
|
202
|
+
* must be fetched from a blockchain API (e.g., Blockstream, Mempool.space, etc.)
|
|
203
|
+
*
|
|
204
|
+
* @param inputs - Array of UTXO inputs to spend
|
|
205
|
+
* @param outputs - Array of outputs (recipients)
|
|
206
|
+
* @param changePath - Optional BIP32 path for change output
|
|
207
|
+
* @returns Signed transaction hex ready for broadcast
|
|
208
|
+
*
|
|
209
|
+
* @example
|
|
210
|
+
* ```typescript
|
|
211
|
+
* const signedTx = await ledger.createTransaction(
|
|
212
|
+
* [{
|
|
213
|
+
* txHex: '0100000001...', // Raw tx hex that created the UTXO
|
|
214
|
+
* outputIndex: 0,
|
|
215
|
+
* derivationPath: "84'/0'/0'/0/0",
|
|
216
|
+
* }],
|
|
217
|
+
* [{
|
|
218
|
+
* address: 'bc1q...',
|
|
219
|
+
* satoshis: 50000,
|
|
220
|
+
* }],
|
|
221
|
+
* "84'/0'/0'/1/0" // Change address path
|
|
222
|
+
* );
|
|
223
|
+
* ```
|
|
224
|
+
*/
|
|
225
|
+
createTransaction(inputs: LedgerUtxoInput[], outputs: LedgerTxOutput[], changePath?: string): Promise<string>;
|
|
226
|
+
/**
|
|
227
|
+
* Build output script hex from outputs array
|
|
228
|
+
* Format: varint(output_count) + [amount(8 bytes LE) + varint(script_len) + script]...
|
|
229
|
+
*/
|
|
230
|
+
private buildOutputScript;
|
|
231
|
+
/**
|
|
232
|
+
* Convert address to scriptPubKey hex
|
|
233
|
+
*/
|
|
234
|
+
private addressToScriptPubKey;
|
|
235
|
+
/**
|
|
236
|
+
* Decode bech32/bech32m address to hex
|
|
237
|
+
*/
|
|
238
|
+
private decodeBech32;
|
|
239
|
+
/**
|
|
240
|
+
* Decode base58check address to hex (without version byte)
|
|
241
|
+
*/
|
|
242
|
+
private decodeBase58Check;
|
|
243
|
+
/**
|
|
244
|
+
* Encode number as varint hex
|
|
245
|
+
*/
|
|
246
|
+
private encodeVarint;
|
|
247
|
+
/**
|
|
248
|
+
* Convert uint16 to little-endian hex
|
|
249
|
+
*/
|
|
250
|
+
private uint16ToLittleEndian;
|
|
251
|
+
/**
|
|
252
|
+
* Convert uint32 to little-endian hex
|
|
253
|
+
*/
|
|
254
|
+
private uint32ToLittleEndian;
|
|
255
|
+
/**
|
|
256
|
+
* Convert uint64 to little-endian hex
|
|
257
|
+
*/
|
|
258
|
+
private uint64ToLittleEndian;
|
|
259
|
+
/**
|
|
260
|
+
* Get additionals array based on address type
|
|
261
|
+
*/
|
|
262
|
+
private getAdditionals;
|
|
263
|
+
getNetwork(): Promise<BitcoinNetwork>;
|
|
264
|
+
/**
|
|
265
|
+
* Get extended public key (xpub/ypub/zpub) for account
|
|
266
|
+
*/
|
|
267
|
+
getExtendedPublicKey(): Promise<string>;
|
|
268
|
+
/**
|
|
269
|
+
* Get multiple addresses for the account
|
|
270
|
+
*/
|
|
271
|
+
getAddresses(startIndex: number, count: number): Promise<WalletAccount[]>;
|
|
272
|
+
/**
|
|
273
|
+
* Get current derivation path
|
|
274
|
+
*/
|
|
275
|
+
getDerivationPath(): string;
|
|
276
|
+
/**
|
|
277
|
+
* Check if device is connected
|
|
278
|
+
*/
|
|
279
|
+
isConnected(): boolean;
|
|
280
|
+
/**
|
|
281
|
+
* Get the Ledger Bitcoin app instance for advanced operations
|
|
282
|
+
* This allows users to call createPaymentTransaction directly
|
|
283
|
+
*/
|
|
284
|
+
getBtcApp(): LedgerBtcApp | null;
|
|
285
|
+
private mapLedgerAddressType;
|
|
286
|
+
private getXpubVersion;
|
|
287
|
+
private handleLedgerError;
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
export { type LedgerAddressType, LedgerConnector, type LedgerConnectorOptions, type LedgerTxOutput, type LedgerUtxoInput, type SendBitcoinOptions };
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var chunkLNKTYZJM_js = require('../chunk-LNKTYZJM.js');
|
|
4
|
+
require('../chunk-FISNQZZ7.js');
|
|
5
|
+
require('../chunk-MFXLQWOE.js');
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
Object.defineProperty(exports, "LedgerConnector", {
|
|
10
|
+
enumerable: true,
|
|
11
|
+
get: function () { return chunkLNKTYZJM_js.LedgerConnector; }
|
|
12
|
+
});
|
|
13
|
+
//# sourceMappingURL=out.js.map
|
|
14
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":""}
|