ecash-quicksend 1.1.0 → 1.3.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 +50 -15
- package/dist/config/constants.js +3 -3
- package/dist/config/constants.js.map +1 -1
- package/dist/send/tokensend.d.ts.map +1 -1
- package/dist/send/tokensend.js +5 -3
- package/dist/send/tokensend.js.map +1 -1
- package/dist/send/xecsend.d.ts.map +1 -1
- package/dist/send/xecsend.js +2 -0
- package/dist/send/xecsend.js.map +1 -1
- package/dist/transaction/transaction-builder.d.ts +8 -0
- package/dist/transaction/transaction-builder.d.ts.map +1 -1
- package/dist/transaction/transaction-builder.js +28 -1
- package/dist/transaction/transaction-builder.js.map +1 -1
- package/dist/types.d.ts +1 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/utxo/utxo-utils.d.ts +1 -1
- package/dist/utxo/utxo-utils.d.ts.map +1 -1
- package/dist/utxo/utxo-utils.js +26 -14
- package/dist/utxo/utxo-utils.js.map +1 -1
- package/dist/wallet/wallet-utils.js +1 -1
- package/dist/wallet/wallet-utils.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -11,14 +11,33 @@ A unified transaction manager for eCash (XEC), SLP, and ALP token transactions.
|
|
|
11
11
|
npm install ecash-quicksend
|
|
12
12
|
```
|
|
13
13
|
|
|
14
|
+
## Migration Notes
|
|
15
|
+
|
|
16
|
+
### v1.1.0+
|
|
17
|
+
This library no longer calls `dotenv.config()` internally. If you rely on a `.env` file for your mnemonic, call `dotenv.config()` in your own application entry point before using this library:
|
|
18
|
+
|
|
19
|
+
```javascript
|
|
20
|
+
import dotenv from 'dotenv';
|
|
21
|
+
dotenv.config(); // call this yourself
|
|
22
|
+
|
|
23
|
+
import quick from 'ecash-quicksend';
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
### v1.3.0+
|
|
27
|
+
`tokenDecimals` is now optional. `amount` in token recipients is in **atoms** (smallest unit). `tokenDecimals` is kept for backward compatibility but has no effect.
|
|
28
|
+
|
|
29
|
+
---
|
|
30
|
+
|
|
14
31
|
## Quick Start
|
|
15
32
|
|
|
16
33
|
### Setup
|
|
17
34
|
|
|
18
|
-
**Option 1: Environment Variable
|
|
19
|
-
```
|
|
20
|
-
|
|
21
|
-
|
|
35
|
+
**Option 1: Environment Variable**
|
|
36
|
+
```javascript
|
|
37
|
+
// In your app entry point:
|
|
38
|
+
import dotenv from 'dotenv';
|
|
39
|
+
dotenv.config();
|
|
40
|
+
// Then set MNEMONIC in your .env file
|
|
22
41
|
```
|
|
23
42
|
|
|
24
43
|
**Option 2: Direct in Code**
|
|
@@ -43,20 +62,18 @@ await quick.sendXec([
|
|
|
43
62
|
mnemonic: 'your twelve word mnemonic phrase'
|
|
44
63
|
});
|
|
45
64
|
|
|
46
|
-
// Send SLP tokens
|
|
65
|
+
// Send SLP tokens — amount in atoms (smallest unit)
|
|
47
66
|
await quick.sendSlp([
|
|
48
|
-
{ address: 'ecash:qq...', amount: 100 } //
|
|
67
|
+
{ address: 'ecash:qq...', amount: 100 } // 100 atoms
|
|
49
68
|
], {
|
|
50
69
|
tokenId: 'your-token-id',
|
|
51
|
-
tokenDecimals: 2
|
|
52
70
|
});
|
|
53
71
|
|
|
54
|
-
// Send ALP tokens
|
|
72
|
+
// Send ALP tokens — amount in atoms (smallest unit)
|
|
55
73
|
await quick.sendAlp([
|
|
56
|
-
{ address: 'ecash:qq...', amount: 100 } //
|
|
74
|
+
{ address: 'ecash:qq...', amount: 100 } // 100 atoms
|
|
57
75
|
], {
|
|
58
76
|
tokenId: 'your-token-id',
|
|
59
|
-
tokenDecimals: 4
|
|
60
77
|
});
|
|
61
78
|
```
|
|
62
79
|
|
|
@@ -82,8 +99,8 @@ await quick.sendAlp([
|
|
|
82
99
|
|
|
83
100
|
// Token Options (SLP/ALP)
|
|
84
101
|
{
|
|
85
|
-
tokenId: string;
|
|
86
|
-
tokenDecimals
|
|
102
|
+
tokenId: string; // required
|
|
103
|
+
tokenDecimals?: number; // optional, ignored (kept for backward compatibility)
|
|
87
104
|
addressIndex?: number;
|
|
88
105
|
feeStrategy?: 'all' | 'minimal' | 'largest_first';
|
|
89
106
|
tokenStrategy?: 'all' | 'largest' | 'minimal';
|
|
@@ -116,7 +133,6 @@ await quick.sendXec(recipients, { addressIndex: 1 });
|
|
|
116
133
|
await quick.send('xec', recipients);
|
|
117
134
|
await quick.send('slp', recipients, {
|
|
118
135
|
tokenId: 'token-id',
|
|
119
|
-
tokenDecimals: 2
|
|
120
136
|
});
|
|
121
137
|
|
|
122
138
|
// Custom chronik client
|
|
@@ -126,7 +142,6 @@ const customChronik = new ChronikClient('https://your-chronik-url.com');
|
|
|
126
142
|
await quick.sendXec(recipients, { chronik: customChronik });
|
|
127
143
|
await quick.sendSlp(recipients, {
|
|
128
144
|
tokenId: 'token-id',
|
|
129
|
-
tokenDecimals: 2,
|
|
130
145
|
chronik: customChronik
|
|
131
146
|
});
|
|
132
147
|
```
|
|
@@ -155,4 +170,24 @@ Contributions are welcome! Please feel free to submit a Pull Request.
|
|
|
155
170
|
|
|
156
171
|
## Support
|
|
157
172
|
|
|
158
|
-
[Issues](https://github.com/alitayin/quicksend/issues) | [GitHub](https://github.com/alitayin/quicksend)
|
|
173
|
+
[Issues](https://github.com/alitayin/quicksend/issues) | [GitHub](https://github.com/alitayin/quicksend)
|
|
174
|
+
|
|
175
|
+
---
|
|
176
|
+
|
|
177
|
+
## Changelog
|
|
178
|
+
|
|
179
|
+
### v1.3.0
|
|
180
|
+
- `tokenDecimals` is now optional in `sendSlp` / `sendAlp` / `send`. Token `amount` is in atoms (smallest unit), matching the ecash-wallet convention. `tokenDecimals` is accepted but ignored for backward compatibility.
|
|
181
|
+
|
|
182
|
+
### v1.2.0
|
|
183
|
+
- Fee verification now uses `EccDummy` (same approach as ecash-wallet) to build a dummy transaction with worst-case signature sizes before broadcasting. This guarantees the fee estimate is always a conservative upper bound — insufficient-fee broadcasts are impossible.
|
|
184
|
+
|
|
185
|
+
### v1.1.0
|
|
186
|
+
- **Breaking**: Library no longer calls `dotenv.config()` internally. Call it yourself in your app entry point if you use `.env` files.
|
|
187
|
+
- `broadcastTx` → `broadcastTxs` (chronik-client >= 0.32.10).
|
|
188
|
+
- Fee estimation replaced magic numbers with `calcTxFee` + named byte-size constants.
|
|
189
|
+
- Removed duplicate `console.log` calls for key derivation and transaction summaries.
|
|
190
|
+
- Merged duplicate `buildSlpOutputs` / `buildAlpOutputs` into shared `buildTokenOutputs`.
|
|
191
|
+
|
|
192
|
+
### v1.0.9
|
|
193
|
+
- Migrated to `broadcastTxs`, unified `TransactionResult` type, extracted XEC derivation path constant.
|
package/dist/config/constants.js
CHANGED
|
@@ -23,7 +23,7 @@ exports.CONFIG = {
|
|
|
23
23
|
*/
|
|
24
24
|
function validateConfig() {
|
|
25
25
|
if (!exports.CONFIG.MNEMONIC) {
|
|
26
|
-
throw new Error('
|
|
26
|
+
throw new Error('MNEMONIC environment variable must be set');
|
|
27
27
|
}
|
|
28
28
|
}
|
|
29
29
|
// 注释掉自动验证,因为用户现在可以在代码中提供助记词
|
|
@@ -43,7 +43,7 @@ function getMnemonic() {
|
|
|
43
43
|
function getPrivateKeyWIF(addressIndex = 0, mnemonic) {
|
|
44
44
|
const finalMnemonic = mnemonic || getMnemonic();
|
|
45
45
|
if (!finalMnemonic) {
|
|
46
|
-
throw new Error('
|
|
46
|
+
throw new Error('Mnemonic not set: please set the MNEMONIC environment variable or provide it as a parameter');
|
|
47
47
|
}
|
|
48
48
|
const derived = (0, mnemonic_utils_1.deriveBuyerKey)(finalMnemonic, addressIndex);
|
|
49
49
|
return derived.wif;
|
|
@@ -56,7 +56,7 @@ function getPrivateKeyWIF(addressIndex = 0, mnemonic) {
|
|
|
56
56
|
function getDefaultUtxoAddress(addressIndex = 0, mnemonic) {
|
|
57
57
|
const finalMnemonic = mnemonic || getMnemonic();
|
|
58
58
|
if (!finalMnemonic) {
|
|
59
|
-
throw new Error('
|
|
59
|
+
throw new Error('Mnemonic not set: please set the MNEMONIC environment variable or provide it as a parameter');
|
|
60
60
|
}
|
|
61
61
|
const derived = (0, mnemonic_utils_1.deriveBuyerKey)(finalMnemonic, addressIndex);
|
|
62
62
|
return derived.address;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../config/constants.ts"],"names":[],"mappings":";;;;;;AAeA,wCAIC;AASD,kCAEC;AAOD,4CAOC;AAOD,sDAOC;AA1DD,oDAA4B;AAC5B,6DAA0D;AAC1D,gBAAM,CAAC,MAAM,EAAE,CAAC;AAEhB;;GAEG;AACU,QAAA,MAAM,GAAG;IACpB,gBAAgB;IAChB,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,QAAQ;CAC/B,CAAC;AAEF;;GAEG;AACH,SAAgB,cAAc;IAC5B,IAAI,CAAC,cAAM,CAAC,QAAQ,EAAE,CAAC;QACrB,MAAM,IAAI,KAAK,CAAC,
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../config/constants.ts"],"names":[],"mappings":";;;;;;AAeA,wCAIC;AASD,kCAEC;AAOD,4CAOC;AAOD,sDAOC;AA1DD,oDAA4B;AAC5B,6DAA0D;AAC1D,gBAAM,CAAC,MAAM,EAAE,CAAC;AAEhB;;GAEG;AACU,QAAA,MAAM,GAAG;IACpB,gBAAgB;IAChB,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,QAAQ;CAC/B,CAAC;AAEF;;GAEG;AACH,SAAgB,cAAc;IAC5B,IAAI,CAAC,cAAM,CAAC,QAAQ,EAAE,CAAC;QACrB,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAC;IAC/D,CAAC;AACH,CAAC;AAED,4BAA4B;AAC5B,oBAAoB;AAEpB;;;GAGG;AACH,SAAgB,WAAW;IACzB,OAAO,cAAM,CAAC,QAAQ,IAAI,IAAI,CAAC;AACjC,CAAC;AAED;;;;GAIG;AACH,SAAgB,gBAAgB,CAAC,eAAuB,CAAC,EAAE,QAAiB;IAC1E,MAAM,aAAa,GAAG,QAAQ,IAAI,WAAW,EAAE,CAAC;IAChD,IAAI,CAAC,aAAa,EAAE,CAAC;QACnB,MAAM,IAAI,KAAK,CAAC,6FAA6F,CAAC,CAAC;IACjH,CAAC;IACD,MAAM,OAAO,GAAG,IAAA,+BAAc,EAAC,aAAa,EAAE,YAAY,CAAC,CAAC;IAC5D,OAAO,OAAO,CAAC,GAAG,CAAC;AACrB,CAAC;AAED;;;;GAIG;AACH,SAAgB,qBAAqB,CAAC,eAAuB,CAAC,EAAE,QAAiB;IAC/E,MAAM,aAAa,GAAG,QAAQ,IAAI,WAAW,EAAE,CAAC;IAChD,IAAI,CAAC,aAAa,EAAE,CAAC;QACnB,MAAM,IAAI,KAAK,CAAC,6FAA6F,CAAC,CAAC;IACjH,CAAC;IACD,MAAM,OAAO,GAAG,IAAA,+BAAc,EAAC,aAAa,EAAE,YAAY,CAAC,CAAC;IAC5D,OAAO,OAAO,CAAC,OAAO,CAAC;AACzB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tokensend.d.ts","sourceRoot":"","sources":["../../send/tokensend.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"tokensend.d.ts","sourceRoot":"","sources":["../../send/tokensend.ts"],"names":[],"mappings":"AAYA,OAAO,EAAE,SAAS,EAAE,uBAAuB,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAkJjF;;GAEG;AACH,wBAAsB,uBAAuB,CAAC,UAAU,EAAE,SAAS,EAAE,EAAE,OAAO,EAAE,uBAAuB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAEnI;AAED;;GAEG;AACH,wBAAsB,uBAAuB,CAAC,UAAU,EAAE,SAAS,EAAE,EAAE,OAAO,EAAE,uBAAuB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAEnI"}
|
package/dist/send/tokensend.js
CHANGED
|
@@ -83,9 +83,9 @@ async function createTokenTransaction(recipients, options, tokenType = 'SLP') {
|
|
|
83
83
|
// 验证必需参数
|
|
84
84
|
(0, transaction_builder_1.validateRequiredParams)(options, [
|
|
85
85
|
{ key: 'tokenId', message: 'tokenId is required' },
|
|
86
|
-
{ key: 'tokenDecimals', message: 'tokenDecimals is required', checkUndefined: true }
|
|
87
86
|
]);
|
|
88
|
-
const { tokenId, tokenDecimals
|
|
87
|
+
const { tokenId, tokenDecimals = 0, // 默认0:amount 直接作为 atoms 使用
|
|
88
|
+
addressIndex = 0, feeStrategy = 'all', tokenStrategy = 'all', mnemonic, // 从选项中提取助记词
|
|
89
89
|
chronik: chronikClient // 新增:从选项中提取chronik客户端
|
|
90
90
|
} = options;
|
|
91
91
|
// 初始化钱包 - 使用指定的地址索引和可选的助记词
|
|
@@ -109,8 +109,10 @@ async function createTokenTransaction(recipients, options, tokenType = 'SLP') {
|
|
|
109
109
|
else {
|
|
110
110
|
outputs = buildSlpOutputs(tokenId, finalSendAmounts, recipients, tokenChange, dustLimit, walletP2pkh);
|
|
111
111
|
}
|
|
112
|
+
// 用 EccDummy 验证输入能覆盖输出 + 真实手续费(保守上界)
|
|
113
|
+
(0, transaction_builder_1.verifyFee)([...selectedTokenUtxos, ...selectedFeeUtxos], outputs);
|
|
112
114
|
// 构建并广播交易
|
|
113
|
-
return await (0, transaction_builder_1.buildAndBroadcastTransaction)(inputs, outputs, { dustLimit, chronik: chronikClient });
|
|
115
|
+
return await (0, transaction_builder_1.buildAndBroadcastTransaction)(inputs, outputs, { dustLimit, chronik: chronikClient });
|
|
114
116
|
}
|
|
115
117
|
catch (error) {
|
|
116
118
|
console.error(`${tokenType} transaction creation failed:`, error);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tokensend.js","sourceRoot":"","sources":["../../send/tokensend.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"tokensend.js","sourceRoot":"","sources":["../../send/tokensend.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"xecsend.d.ts","sourceRoot":"","sources":["../../send/xecsend.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAG7C,UAAU,iBAAiB;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAGD,UAAU,oBAAqB,SAAQ,iBAAiB;IACtD,aAAa,EAAE,GAAG,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,eAAe,EAAE,MAAM,CAAC;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,KAAK,CAAC;QACpB,OAAO,EAAE,MAAM,CAAC;QAChB,MAAM,EAAE,MAAM,CAAC;QACf,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,OAAO,EAAE,MAAM,CAAC;KACjB,CAAC,CAAC;CACJ;AAED,wBAAsB,uBAAuB,CAC3C,UAAU,EAAE,iBAAiB,EAAE,EAC/B,YAAY,GAAE,MAAc,EAC5B,YAAY,GAAE,MAAU,EACxB,QAAQ,CAAC,EAAE,MAAM,EAAE,WAAW;AAC9B,aAAa,CAAC,EAAE,GAAG,GAClB,OAAO,CAAC,oBAAoB,CAAC,
|
|
1
|
+
{"version":3,"file":"xecsend.d.ts","sourceRoot":"","sources":["../../send/xecsend.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAG7C,UAAU,iBAAiB;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAGD,UAAU,oBAAqB,SAAQ,iBAAiB;IACtD,aAAa,EAAE,GAAG,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,eAAe,EAAE,MAAM,CAAC;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,KAAK,CAAC;QACpB,OAAO,EAAE,MAAM,CAAC;QAChB,MAAM,EAAE,MAAM,CAAC;QACf,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,OAAO,EAAE,MAAM,CAAC;KACjB,CAAC,CAAC;CACJ;AAED,wBAAsB,uBAAuB,CAC3C,UAAU,EAAE,iBAAiB,EAAE,EAC/B,YAAY,GAAE,MAAc,EAC5B,YAAY,GAAE,MAAU,EACxB,QAAQ,CAAC,EAAE,MAAM,EAAE,WAAW;AAC9B,aAAa,CAAC,EAAE,GAAG,GAClB,OAAO,CAAC,oBAAoB,CAAC,CAkG/B"}
|
package/dist/send/xecsend.js
CHANGED
|
@@ -70,6 +70,8 @@ chronikClient // 新增:可选的chronik客户端参数 (使用any类型以避
|
|
|
70
70
|
});
|
|
71
71
|
// 添加找零脚本 - 保持原始逻辑!
|
|
72
72
|
outputs.push(walletP2pkh);
|
|
73
|
+
// 用 EccDummy 验证输入能覆盖输出 + 真实手续费(保守上界)
|
|
74
|
+
(0, transaction_builder_1.verifyFee)(selectedUtxos, outputs);
|
|
73
75
|
// 构建并广播交易
|
|
74
76
|
const result = await (0, transaction_builder_1.buildAndBroadcastTransaction)(inputs, outputs, { chronik: chronikClient }); // 传递chronik客户端
|
|
75
77
|
return {
|
package/dist/send/xecsend.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"xecsend.js","sourceRoot":"","sources":["../../send/xecsend.ts"],"names":[],"mappings":";;;;;AAgCA,
|
|
1
|
+
{"version":3,"file":"xecsend.js","sourceRoot":"","sources":["../../send/xecsend.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,13 @@
|
|
|
1
1
|
import { ChronikClient } from "chronik-client";
|
|
2
2
|
import { TransactionResult } from "../types";
|
|
3
|
+
/**
|
|
4
|
+
* 用 EccDummy 验证 UTXOs 能否覆盖 outputs + 真实手续费。
|
|
5
|
+
* EccDummy 签名长度固定为最大值(73字节),结果是保守上界,永远不低估。
|
|
6
|
+
* 如果验证失败,在广播前提前抛出,避免浪费网络请求。
|
|
7
|
+
*/
|
|
8
|
+
export declare function verifyFee(utxos: Array<{
|
|
9
|
+
value: number;
|
|
10
|
+
}>, outputs: any[], feePerKb?: bigint, dustSats?: bigint): void;
|
|
3
11
|
interface TransactionOptions {
|
|
4
12
|
feePerKb?: bigint;
|
|
5
13
|
dustSats?: bigint;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transaction-builder.d.ts","sourceRoot":"","sources":["../../transaction/transaction-builder.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"transaction-builder.d.ts","sourceRoot":"","sources":["../../transaction/transaction-builder.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAQ7C;;;;GAIG;AACH,wBAAgB,SAAS,CACvB,KAAK,EAAE,KAAK,CAAC;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,EAC/B,OAAO,EAAE,GAAG,EAAE,EACd,QAAQ,GAAE,MAAgC,EAC1C,QAAQ,GAAE,MAA0B,GACnC,IAAI,CAmBN;AAGD,UAAU,kBAAkB;IAC1B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,aAAa,CAAC;CACzB;AAGD,UAAU,mBAAmB;IAC3B,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AAED;;;;;;GAMG;AACH,wBAAsB,4BAA4B,CAChD,MAAM,EAAE,GAAG,EAAE,EACb,OAAO,EAAE,GAAG,EAAE,EACd,OAAO,GAAE,kBAAuB,GAC/B,OAAO,CAAC,iBAAiB,CAAC,CAuC5B;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,mBAAmB,EAAE,GAAG,IAAI,CAMzF;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,GAAG,IAAI,CAEtE"}
|
|
@@ -1,10 +1,37 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.verifyFee = verifyFee;
|
|
3
4
|
exports.buildAndBroadcastTransaction = buildAndBroadcastTransaction;
|
|
4
5
|
exports.validateRequiredParams = validateRequiredParams;
|
|
5
6
|
exports.logTransactionSummary = logTransactionSummary;
|
|
6
7
|
const chronik_client_1 = require("../client/chronik-client");
|
|
7
8
|
const ecash_lib_1 = require("ecash-lib");
|
|
9
|
+
// EccDummy 使用固定最大签名长度(73字节),保证费用估算永远不低于实际
|
|
10
|
+
const _eccDummy = new ecash_lib_1.EccDummy();
|
|
11
|
+
const _DUMMY_SK = (0, ecash_lib_1.fromHex)('1122334455667788990011223344556677889900112233445566778899001122');
|
|
12
|
+
const _DUMMY_PK = _eccDummy.derivePubkey(_DUMMY_SK);
|
|
13
|
+
const _DUMMY_P2PKH = ecash_lib_1.Script.p2pkh(new Uint8Array(20).fill(0x11));
|
|
14
|
+
/**
|
|
15
|
+
* 用 EccDummy 验证 UTXOs 能否覆盖 outputs + 真实手续费。
|
|
16
|
+
* EccDummy 签名长度固定为最大值(73字节),结果是保守上界,永远不低估。
|
|
17
|
+
* 如果验证失败,在广播前提前抛出,避免浪费网络请求。
|
|
18
|
+
*/
|
|
19
|
+
function verifyFee(utxos, outputs, feePerKb = ecash_lib_1.DEFAULT_FEE_SATS_PER_KB, dustSats = ecash_lib_1.DEFAULT_DUST_SATS) {
|
|
20
|
+
const dummyInputs = utxos.map((utxo, i) => ({
|
|
21
|
+
input: {
|
|
22
|
+
prevOut: { txid: '00'.repeat(32), outIdx: i },
|
|
23
|
+
signData: { sats: BigInt(utxo.value), outputScript: _DUMMY_P2PKH },
|
|
24
|
+
},
|
|
25
|
+
signatory: (0, ecash_lib_1.P2PKHSignatory)(_DUMMY_SK, _DUMMY_PK, ecash_lib_1.ALL_BIP143),
|
|
26
|
+
}));
|
|
27
|
+
try {
|
|
28
|
+
const txBuilder = new ecash_lib_1.TxBuilder({ inputs: dummyInputs, outputs });
|
|
29
|
+
txBuilder.sign({ ecc: _eccDummy, feePerKb, dustSats });
|
|
30
|
+
}
|
|
31
|
+
catch (e) {
|
|
32
|
+
throw new Error(`Insufficient balance to cover outputs and fee: ${e instanceof Error ? e.message : String(e)}`);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
8
35
|
/**
|
|
9
36
|
* 构建并广播交易的通用函数
|
|
10
37
|
* @param inputs - 交易输入数组
|
|
@@ -61,6 +88,6 @@ function validateRequiredParams(params, required) {
|
|
|
61
88
|
* @param summary - 摘要信息
|
|
62
89
|
*/
|
|
63
90
|
function logTransactionSummary(type, summary) {
|
|
64
|
-
console.log(`${type}
|
|
91
|
+
console.log(`${type} transaction summary:`, summary);
|
|
65
92
|
}
|
|
66
93
|
//# sourceMappingURL=transaction-builder.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transaction-builder.js","sourceRoot":"","sources":["../../transaction/transaction-builder.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"transaction-builder.js","sourceRoot":"","sources":["../../transaction/transaction-builder.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
CHANGED
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../types.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAE/C;;GAEG;AACH,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,IAAI;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,QAAQ;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,GAAG,EAAE,CAAC;IACf,OAAO,CAAC,EAAE,GAAG,EAAE,CAAC;IAChB,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,uBAAuB;IACtC,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../types.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAE/C;;GAEG;AACH,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,IAAI;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,QAAQ;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,GAAG,EAAE,CAAC;IACf,OAAO,CAAC,EAAE,GAAG,EAAE,CAAC;IAChB,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,uBAAuB;IACtC,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,aAAa,CAAC;CACzB;AAED;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,aAAa,CAAC;CACzB;AAED;;GAEG;AACH,MAAM,MAAM,UAAU,GAAG,MAAM,GAAG,qBAAqB,CAAC;AAExD;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,aAAa,CAAC;CACzB;AAED;;GAEG;AACH,MAAM,MAAM,eAAe,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,CAAC;AAEpD;;GAEG;AACH,MAAM,MAAM,YAAY,GAAG,KAAK,GAAG,QAAQ,GAAG,UAAU,CAAC"}
|
|
@@ -70,7 +70,7 @@ declare function selectUtxos(utxos: Utxo[], sendAmount: number, strategy?: UtxoS
|
|
|
70
70
|
* @param options - 选项
|
|
71
71
|
* @returns 包含选择的UTXOs和相关信息
|
|
72
72
|
*/
|
|
73
|
-
declare function selectSlpUtxos(utxos: Utxo[], tokenId: string, recipients: Recipient[], tokenDecimals
|
|
73
|
+
declare function selectSlpUtxos(utxos: Utxo[], tokenId: string, recipients: Recipient[], tokenDecimals?: number, options?: SlpUtxoOptions): SlpUtxoSelection;
|
|
74
74
|
/**
|
|
75
75
|
* 获取地址余额信息
|
|
76
76
|
* @param address - eCash地址
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utxo-utils.d.ts","sourceRoot":"","sources":["../../utxo/utxo-utils.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"utxo-utils.d.ts","sourceRoot":"","sources":["../../utxo/utxo-utils.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,IAAI,EAAY,SAAS,EAAE,MAAM,UAAU,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAc/C,UAAU,aAAa;IACrB,aAAa,EAAE,IAAI,EAAE,CAAC;IACtB,eAAe,EAAE,MAAM,CAAC;IACxB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;CACnB;AAGD,UAAU,cAAc;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,KAAK,GAAG,SAAS,GAAG,eAAe,CAAC;IAClD,aAAa,CAAC,EAAE,SAAS,GAAG,SAAS,GAAG,KAAK,CAAC;CAC/C;AAGD,UAAU,gBAAgB;IACxB,kBAAkB,EAAE,IAAI,EAAE,CAAC;IAC3B,gBAAgB,EAAE,IAAI,EAAE,CAAC;IACzB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,MAAM,CAAC;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,eAAe,EAAE,MAAM,CAAC;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE;QACP,cAAc,EAAE,MAAM,CAAC;QACvB,YAAY,EAAE,MAAM,CAAC;QACrB,cAAc,EAAE,MAAM,CAAC;QACvB,cAAc,EAAE,OAAO,CAAC;QACxB,YAAY,EAAE,MAAM,CAAC;KACtB,CAAC;CACH;AAGD,UAAU,YAAY;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,IAAI,EAAE,CAAC;CACf;AAGD,UAAU,cAAc;IACtB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,IAAI,EAAE,CAAC;IACpB,QAAQ,EAAE,IAAI,EAAE,CAAC;IACjB,aAAa,EAAE,YAAY,EAAE,CAAC;CAC/B;AAGD,KAAK,YAAY,GAAG,KAAK,GAAG,SAAS,GAAG,eAAe,CAAC;AAExD;;;;;GAKG;AACH,iBAAe,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC,CAuBvF;AAED;;;;;;GAMG;AACH,iBAAS,WAAW,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,UAAU,EAAE,MAAM,EAAE,QAAQ,GAAE,YAAoB,GAAG,aAAa,CA4DrG;AAED;;;;;;;;GAQG;AACH,iBAAS,cAAc,CACrB,KAAK,EAAE,IAAI,EAAE,EACb,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,SAAS,EAAE,EACvB,aAAa,GAAE,MAAU,EACzB,OAAO,GAAE,cAAmB,GAC3B,gBAAgB,CAkHlB;AAED;;;;;GAKG;AACH,iBAAe,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,cAAc,CAAC,CAqCxG;AAED,OAAO,EACL,QAAQ,EACR,WAAW,EACX,cAAc,EACd,iBAAiB,EAClB,CAAC"}
|
package/dist/utxo/utxo-utils.js
CHANGED
|
@@ -4,8 +4,18 @@ exports.getUtxos = getUtxos;
|
|
|
4
4
|
exports.selectUtxos = selectUtxos;
|
|
5
5
|
exports.selectSlpUtxos = selectSlpUtxos;
|
|
6
6
|
exports.getAddressBalance = getAddressBalance;
|
|
7
|
+
const ecash_lib_1 = require("ecash-lib");
|
|
7
8
|
const ecashaddrjs_1 = require("ecashaddrjs");
|
|
8
9
|
const chronik_client_1 = require("../client/chronik-client");
|
|
10
|
+
// P2PKH 交易字节大小常量
|
|
11
|
+
const P2PKH_INPUT_BYTES = 148; // txid(32) + vout(4) + scriptLen(1) + sig(72) + pubkey(33) + sequence(4) + varint(2)
|
|
12
|
+
const P2PKH_OUTPUT_BYTES = 34; // value(8) + scriptLen(1) + script(25)
|
|
13
|
+
const TX_OVERHEAD_BYTES = 10; // version(4) + locktime(4) + input/output count varints
|
|
14
|
+
/** 根据输入数和输出数估算交易手续费(satoshis) */
|
|
15
|
+
function estimateFee(nInputs, nOutputs) {
|
|
16
|
+
const txBytes = nInputs * P2PKH_INPUT_BYTES + nOutputs * P2PKH_OUTPUT_BYTES + TX_OVERHEAD_BYTES;
|
|
17
|
+
return Number((0, ecash_lib_1.calcTxFee)(txBytes, ecash_lib_1.DEFAULT_FEE_SATS_PER_KB));
|
|
18
|
+
}
|
|
9
19
|
/**
|
|
10
20
|
* Get UTXOs for a given address
|
|
11
21
|
* @param address - eCash address
|
|
@@ -45,7 +55,7 @@ function selectUtxos(utxos, sendAmount, strategy = 'all') {
|
|
|
45
55
|
// 过滤掉SLP代币UTXOs
|
|
46
56
|
const nonSlpUtxos = utxos.filter(utxo => !utxo.slpToken);
|
|
47
57
|
if (nonSlpUtxos.length === 0) {
|
|
48
|
-
throw new Error('
|
|
58
|
+
throw new Error('No non-SLP UTXOs available');
|
|
49
59
|
}
|
|
50
60
|
let selectedUtxos = [];
|
|
51
61
|
switch (strategy) {
|
|
@@ -60,8 +70,8 @@ function selectUtxos(utxos, sendAmount, strategy = 'all') {
|
|
|
60
70
|
for (const utxo of sortedUtxos) {
|
|
61
71
|
selectedUtxos.push(utxo);
|
|
62
72
|
accumulatedValue += utxo.value;
|
|
63
|
-
//
|
|
64
|
-
const estimatedFee = selectedUtxos.length
|
|
73
|
+
// 估算手续费:inputs + 2 outputs(接收方 + 找零)
|
|
74
|
+
const estimatedFee = estimateFee(selectedUtxos.length, 2);
|
|
65
75
|
if (accumulatedValue >= sendAmount + estimatedFee) {
|
|
66
76
|
break;
|
|
67
77
|
}
|
|
@@ -72,13 +82,13 @@ function selectUtxos(utxos, sendAmount, strategy = 'all') {
|
|
|
72
82
|
selectedUtxos = nonSlpUtxos.sort((a, b) => b.value - a.value);
|
|
73
83
|
break;
|
|
74
84
|
default:
|
|
75
|
-
throw new Error(
|
|
85
|
+
throw new Error(`Unknown UTXO selection strategy: ${strategy}`);
|
|
76
86
|
}
|
|
77
87
|
const totalInputValue = selectedUtxos.reduce((sum, utxo) => sum + utxo.value, 0);
|
|
78
|
-
const estimatedFee = selectedUtxos.length
|
|
88
|
+
const estimatedFee = estimateFee(selectedUtxos.length, 2);
|
|
79
89
|
// 检查余额是否足够
|
|
80
90
|
if (totalInputValue < sendAmount + estimatedFee) {
|
|
81
|
-
throw new Error(
|
|
91
|
+
throw new Error(`Insufficient balance. Total input: ${totalInputValue}, required: ${sendAmount + estimatedFee} (including estimated fee ${estimatedFee})`);
|
|
82
92
|
}
|
|
83
93
|
return {
|
|
84
94
|
selectedUtxos,
|
|
@@ -97,7 +107,7 @@ function selectUtxos(utxos, sendAmount, strategy = 'all') {
|
|
|
97
107
|
* @param options - 选项
|
|
98
108
|
* @returns 包含选择的UTXOs和相关信息
|
|
99
109
|
*/
|
|
100
|
-
function selectSlpUtxos(utxos, tokenId, recipients, tokenDecimals, options = {}) {
|
|
110
|
+
function selectSlpUtxos(utxos, tokenId, recipients, tokenDecimals = 0, options = {}) {
|
|
101
111
|
const { dustLimit = 546, feeStrategy = 'all', // 手续费UTXO选择策略
|
|
102
112
|
tokenStrategy = 'largest' // 代币UTXO选择策略
|
|
103
113
|
} = options;
|
|
@@ -105,10 +115,10 @@ function selectSlpUtxos(utxos, tokenId, recipients, tokenDecimals, options = {})
|
|
|
105
115
|
const slpUtxos = utxos.filter(utxo => utxo.slpToken && utxo.slpToken.tokenId === tokenId);
|
|
106
116
|
const nonSlpUtxos = utxos.filter(utxo => !utxo.slpToken);
|
|
107
117
|
if (slpUtxos.length === 0) {
|
|
108
|
-
throw new Error(
|
|
118
|
+
throw new Error(`No SLP UTXOs available for token ${tokenId}`);
|
|
109
119
|
}
|
|
110
120
|
if (nonSlpUtxos.length === 0) {
|
|
111
|
-
throw new Error('
|
|
121
|
+
throw new Error('No non-SLP UTXOs available for fee payment');
|
|
112
122
|
}
|
|
113
123
|
// 计算需要发送的代币总量(直接使用基础单位,不进行小数转换)
|
|
114
124
|
const sendAmounts = recipients.map(r => BigInt(r.amount));
|
|
@@ -141,13 +151,13 @@ function selectSlpUtxos(utxos, tokenId, recipients, tokenDecimals, options = {})
|
|
|
141
151
|
return aAmount < bAmount ? -1 : aAmount > bAmount ? 1 : 0;
|
|
142
152
|
});
|
|
143
153
|
if (sortedSlpUtxos.length === 0) {
|
|
144
|
-
throw new Error('
|
|
154
|
+
throw new Error('Insufficient token balance');
|
|
145
155
|
}
|
|
146
156
|
selectedTokenUtxos = [sortedSlpUtxos[0]];
|
|
147
157
|
totalTokens = BigInt(sortedSlpUtxos[0].slpToken.atoms);
|
|
148
158
|
}
|
|
149
159
|
if (totalSendTokens > totalTokens) {
|
|
150
|
-
throw new Error(
|
|
160
|
+
throw new Error(`Insufficient token balance. Available: ${totalTokens.toString()}, required: ${totalSendTokens.toString()}`);
|
|
151
161
|
}
|
|
152
162
|
const tokenChange = totalTokens - totalSendTokens;
|
|
153
163
|
// 选择手续费UTXOs
|
|
@@ -162,11 +172,13 @@ function selectSlpUtxos(utxos, tokenId, recipients, tokenDecimals, options = {})
|
|
|
162
172
|
selectedFeeUtxos = feeSelection.selectedUtxos;
|
|
163
173
|
}
|
|
164
174
|
const totalFeeInputValue = selectedFeeUtxos.reduce((sum, utxo) => sum + utxo.value, 0);
|
|
165
|
-
|
|
175
|
+
// 估算手续费:所有输入 + OP_RETURN(1) + 接收方输出 + token找零(1) + XEC找零(1)
|
|
176
|
+
const nOutputs = 1 + recipients.length + (tokenChange > 0n ? 1 : 0) + 1;
|
|
177
|
+
const estimatedFee = estimateFee(selectedFeeUtxos.length + selectedTokenUtxos.length, nOutputs);
|
|
166
178
|
// 计算所需的最小金额
|
|
167
179
|
const requiredAmount = recipients.length * dustLimit + (tokenChange > 0n ? dustLimit : 0) + estimatedFee;
|
|
168
180
|
if (totalFeeInputValue < requiredAmount) {
|
|
169
|
-
throw new Error(
|
|
181
|
+
throw new Error(`Insufficient balance for fees. Total input: ${totalFeeInputValue}, required: ${requiredAmount} (including estimated fee ${estimatedFee})`);
|
|
170
182
|
}
|
|
171
183
|
// 构建最终的发送金额数组
|
|
172
184
|
const finalSendAmounts = [...sendAmounts];
|
|
@@ -231,7 +243,7 @@ async function getAddressBalance(address, chronikClient) {
|
|
|
231
243
|
};
|
|
232
244
|
}
|
|
233
245
|
catch (error) {
|
|
234
|
-
console.error('
|
|
246
|
+
console.error('Failed to get address balance:', error);
|
|
235
247
|
throw error;
|
|
236
248
|
}
|
|
237
249
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utxo-utils.js","sourceRoot":"","sources":["../../utxo/utxo-utils.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"utxo-utils.js","sourceRoot":"","sources":["../../utxo/utxo-utils.ts"],"names":[],"mappings":"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"}
|
|
@@ -49,7 +49,7 @@ function initializeWallet(addressIndex = 0, mnemonic) {
|
|
|
49
49
|
// 如果提供了助记词参数就使用,否则从环境变量获取
|
|
50
50
|
const finalMnemonic = mnemonic || (0, constants_1.getMnemonic)();
|
|
51
51
|
if (!finalMnemonic) {
|
|
52
|
-
throw new Error('
|
|
52
|
+
throw new Error('Mnemonic not set: please set the MNEMONIC environment variable or provide it as a parameter');
|
|
53
53
|
}
|
|
54
54
|
// 只调用一次 deriveBuyerKey,获取完整信息
|
|
55
55
|
const derived = (0, mnemonic_utils_1.deriveBuyerKey)(finalMnemonic, addressIndex);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wallet-utils.js","sourceRoot":"","sources":["../../wallet/wallet-utils.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA6BA,4CA6BC;AA1DD,mDAAkD;AAClD,qDAAkD;AAClD,yCAA2B;AAC3B,oDAAsC;AAEtC,MAAM,EACJ,GAAG,EACH,MAAM,EACN,OAAO,EACP,SAAS,GACV,GAAG,QAAQ,CAAC;AAab;;;;;GAKG;AACH,SAAgB,gBAAgB,CAAC,eAAuB,CAAC,EAAE,QAAiB;IAC1E,0BAA0B;IAC1B,MAAM,aAAa,GAAG,QAAQ,IAAI,IAAA,uBAAW,GAAE,CAAC;IAEhD,IAAI,CAAC,aAAa,EAAE,CAAC;QACnB,MAAM,IAAI,KAAK,CAAC,
|
|
1
|
+
{"version":3,"file":"wallet-utils.js","sourceRoot":"","sources":["../../wallet/wallet-utils.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA6BA,4CA6BC;AA1DD,mDAAkD;AAClD,qDAAkD;AAClD,yCAA2B;AAC3B,oDAAsC;AAEtC,MAAM,EACJ,GAAG,EACH,MAAM,EACN,OAAO,EACP,SAAS,GACV,GAAG,QAAQ,CAAC;AAab;;;;;GAKG;AACH,SAAgB,gBAAgB,CAAC,eAAuB,CAAC,EAAE,QAAiB;IAC1E,0BAA0B;IAC1B,MAAM,aAAa,GAAG,QAAQ,IAAI,IAAA,uBAAW,GAAE,CAAC;IAEhD,IAAI,CAAC,aAAa,EAAE,CAAC;QACnB,MAAM,IAAI,KAAK,CAAC,6FAA6F,CAAC,CAAC;IACjH,CAAC;IAED,8BAA8B;IAC9B,MAAM,OAAO,GAAG,IAAA,+BAAc,EAAC,aAAa,EAAE,YAAY,CAAC,CAAC;IAE5D,MAAM,GAAG,GAAG,IAAI,GAAG,EAAE,CAAC;IACtB,MAAM,OAAO,GAAG,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACxC,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC;IACtC,MAAM,aAAa,GAAG,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC9D,MAAM,QAAQ,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC;IACxC,MAAM,QAAQ,GAAG,GAAG,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;IAC5C,MAAM,SAAS,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;IACtC,MAAM,WAAW,GAAG,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;IAE5C,OAAO;QACL,GAAG;QACH,QAAQ;QACR,QAAQ;QACR,SAAS;QACT,WAAW;QACX,OAAO,EAAE,OAAO,CAAC,OAAO,EAAG,YAAY;QACvC,YAAY;KACb,CAAC;AACJ,CAAC"}
|