@sidhujag/sysweb3-keyring 1.0.545 → 1.0.547
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/coverage/clover.xml +2875 -0
- package/coverage/coverage-final.json +29468 -0
- package/coverage/lcov-report/base.css +354 -0
- package/coverage/lcov-report/block-navigation.js +85 -0
- package/coverage/lcov-report/favicon.png +0 -0
- package/coverage/lcov-report/index.html +320 -0
- package/coverage/lcov-report/prettify.css +101 -0
- package/coverage/lcov-report/prettify.js +1008 -0
- package/coverage/lcov-report/sort-arrow-sprite.png +0 -0
- package/coverage/lcov-report/sorter.js +191 -0
- package/coverage/lcov-report/src/index.html +276 -0
- package/coverage/lcov-report/src/index.ts.html +114 -0
- package/coverage/lcov-report/src/initial-state.ts.html +558 -0
- package/coverage/lcov-report/src/keyring-manager.ts.html +6279 -0
- package/coverage/lcov-report/src/ledger/bitcoin_client/index.html +178 -0
- package/coverage/lcov-report/src/ledger/bitcoin_client/index.ts.html +144 -0
- package/coverage/lcov-report/src/ledger/bitcoin_client/lib/appClient.ts.html +1560 -0
- package/coverage/lcov-report/src/ledger/bitcoin_client/lib/bip32.ts.html +276 -0
- package/coverage/lcov-report/src/ledger/bitcoin_client/lib/buffertools.ts.html +495 -0
- package/coverage/lcov-report/src/ledger/bitcoin_client/lib/clientCommands.ts.html +1138 -0
- package/coverage/lcov-report/src/ledger/bitcoin_client/lib/index.html +363 -0
- package/coverage/lcov-report/src/ledger/bitcoin_client/lib/merkelizedPsbt.ts.html +289 -0
- package/coverage/lcov-report/src/ledger/bitcoin_client/lib/merkle.ts.html +486 -0
- package/coverage/lcov-report/src/ledger/bitcoin_client/lib/merkleMap.ts.html +240 -0
- package/coverage/lcov-report/src/ledger/bitcoin_client/lib/policy.ts.html +342 -0
- package/coverage/lcov-report/src/ledger/bitcoin_client/lib/psbtv2.ts.html +2388 -0
- package/coverage/lcov-report/src/ledger/bitcoin_client/lib/varint.ts.html +453 -0
- package/coverage/lcov-report/src/ledger/consts.ts.html +177 -0
- package/coverage/lcov-report/src/ledger/index.html +216 -0
- package/coverage/lcov-report/src/ledger/index.ts.html +1371 -0
- package/coverage/lcov-report/src/ledger/utils.ts.html +102 -0
- package/coverage/lcov-report/src/signers.ts.html +591 -0
- package/coverage/lcov-report/src/storage.ts.html +198 -0
- package/coverage/lcov-report/src/transactions/ethereum.ts.html +5826 -0
- package/coverage/lcov-report/src/transactions/index.html +216 -0
- package/coverage/lcov-report/src/transactions/index.ts.html +93 -0
- package/coverage/lcov-report/src/transactions/syscoin.ts.html +1521 -0
- package/coverage/lcov-report/src/trezor/index.html +176 -0
- package/coverage/lcov-report/src/trezor/index.ts.html +2655 -0
- package/coverage/lcov-report/src/types.ts.html +1443 -0
- package/coverage/lcov-report/src/utils/derivation-paths.ts.html +486 -0
- package/coverage/lcov-report/src/utils/index.html +196 -0
- package/coverage/lcov-report/src/utils/psbt.ts.html +159 -0
- package/coverage/lcov-report/test/helpers/constants.ts.html +627 -0
- package/coverage/lcov-report/test/helpers/index.html +176 -0
- package/coverage/lcov.info +4832 -0
- package/{cjs → dist/cjs}/ledger/bitcoin_client/lib/appClient.js +1 -124
- package/dist/cjs/ledger/bitcoin_client/lib/appClient.js.map +1 -0
- package/{cjs → dist/cjs}/transactions/ethereum.js +6 -2
- package/dist/cjs/transactions/ethereum.js.map +1 -0
- package/dist/package.json +50 -0
- package/{types → dist/types}/ledger/bitcoin_client/lib/appClient.d.ts +0 -6
- package/examples/basic-usage.js +140 -0
- package/jest.config.js +32 -0
- package/package.json +31 -13
- package/readme.md +201 -0
- package/src/declare.d.ts +7 -0
- package/src/errorUtils.ts +83 -0
- package/src/hardware-wallet-manager.ts +655 -0
- package/src/index.ts +12 -0
- package/src/initial-state.ts +108 -0
- package/src/keyring-manager.ts +2698 -0
- package/src/ledger/bitcoin_client/index.ts +19 -0
- package/src/ledger/bitcoin_client/lib/appClient.ts +405 -0
- package/src/ledger/bitcoin_client/lib/bip32.ts +61 -0
- package/src/ledger/bitcoin_client/lib/buffertools.ts +134 -0
- package/src/ledger/bitcoin_client/lib/clientCommands.ts +356 -0
- package/src/ledger/bitcoin_client/lib/constants.ts +12 -0
- package/src/ledger/bitcoin_client/lib/merkelizedPsbt.ts +65 -0
- package/src/ledger/bitcoin_client/lib/merkle.ts +136 -0
- package/src/ledger/bitcoin_client/lib/merkleMap.ts +49 -0
- package/src/ledger/bitcoin_client/lib/policy.ts +91 -0
- package/src/ledger/bitcoin_client/lib/psbtv2.ts +768 -0
- package/src/ledger/bitcoin_client/lib/varint.ts +120 -0
- package/src/ledger/consts.ts +3 -0
- package/src/ledger/index.ts +685 -0
- package/src/ledger/types.ts +74 -0
- package/src/network-utils.ts +99 -0
- package/src/providers.ts +345 -0
- package/src/signers.ts +158 -0
- package/src/storage.ts +63 -0
- package/src/transactions/__tests__/integration.test.ts +303 -0
- package/src/transactions/__tests__/syscoin.test.ts +409 -0
- package/src/transactions/ethereum.ts +2503 -0
- package/src/transactions/index.ts +2 -0
- package/src/transactions/syscoin.ts +542 -0
- package/src/trezor/index.ts +1050 -0
- package/src/types.ts +366 -0
- package/src/utils/derivation-paths.ts +133 -0
- package/src/utils/psbt.ts +24 -0
- package/src/utils.ts +191 -0
- package/test/README.md +158 -0
- package/test/__mocks__/ledger-mock.js +20 -0
- package/test/__mocks__/trezor-mock.js +75 -0
- package/test/cleanup-summary.md +167 -0
- package/test/helpers/README.md +78 -0
- package/test/helpers/constants.ts +79 -0
- package/test/helpers/setup.ts +714 -0
- package/test/integration/import-validation.spec.ts +588 -0
- package/test/unit/hardware/ledger.spec.ts +869 -0
- package/test/unit/hardware/trezor.spec.ts +828 -0
- package/test/unit/keyring-manager/account-management.spec.ts +970 -0
- package/test/unit/keyring-manager/import-watchonly.spec.ts +181 -0
- package/test/unit/keyring-manager/import-wif.spec.ts +126 -0
- package/test/unit/keyring-manager/initialization.spec.ts +782 -0
- package/test/unit/keyring-manager/key-derivation.spec.ts +996 -0
- package/test/unit/keyring-manager/security.spec.ts +505 -0
- package/test/unit/keyring-manager/state-management.spec.ts +375 -0
- package/test/unit/network/network-management.spec.ts +372 -0
- package/test/unit/transactions/ethereum-transactions.spec.ts +382 -0
- package/test/unit/transactions/syscoin-transactions.spec.ts +615 -0
- package/tsconfig.json +14 -0
- package/cjs/ledger/bitcoin_client/lib/appClient.js.map +0 -1
- package/cjs/transactions/ethereum.js.map +0 -1
- /package/{README.md → dist/README.md} +0 -0
- /package/{cjs → dist/cjs}/errorUtils.js +0 -0
- /package/{cjs → dist/cjs}/errorUtils.js.map +0 -0
- /package/{cjs → dist/cjs}/hardware-wallet-manager.js +0 -0
- /package/{cjs → dist/cjs}/hardware-wallet-manager.js.map +0 -0
- /package/{cjs → dist/cjs}/index.js +0 -0
- /package/{cjs → dist/cjs}/index.js.map +0 -0
- /package/{cjs → dist/cjs}/initial-state.js +0 -0
- /package/{cjs → dist/cjs}/initial-state.js.map +0 -0
- /package/{cjs → dist/cjs}/keyring-manager.js +0 -0
- /package/{cjs → dist/cjs}/keyring-manager.js.map +0 -0
- /package/{cjs → dist/cjs}/ledger/bitcoin_client/index.js +0 -0
- /package/{cjs → dist/cjs}/ledger/bitcoin_client/index.js.map +0 -0
- /package/{cjs → dist/cjs}/ledger/bitcoin_client/lib/bip32.js +0 -0
- /package/{cjs → dist/cjs}/ledger/bitcoin_client/lib/bip32.js.map +0 -0
- /package/{cjs → dist/cjs}/ledger/bitcoin_client/lib/buffertools.js +0 -0
- /package/{cjs → dist/cjs}/ledger/bitcoin_client/lib/buffertools.js.map +0 -0
- /package/{cjs → dist/cjs}/ledger/bitcoin_client/lib/clientCommands.js +0 -0
- /package/{cjs → dist/cjs}/ledger/bitcoin_client/lib/clientCommands.js.map +0 -0
- /package/{cjs → dist/cjs}/ledger/bitcoin_client/lib/constants.js +0 -0
- /package/{cjs → dist/cjs}/ledger/bitcoin_client/lib/constants.js.map +0 -0
- /package/{cjs → dist/cjs}/ledger/bitcoin_client/lib/merkelizedPsbt.js +0 -0
- /package/{cjs → dist/cjs}/ledger/bitcoin_client/lib/merkelizedPsbt.js.map +0 -0
- /package/{cjs → dist/cjs}/ledger/bitcoin_client/lib/merkle.js +0 -0
- /package/{cjs → dist/cjs}/ledger/bitcoin_client/lib/merkle.js.map +0 -0
- /package/{cjs → dist/cjs}/ledger/bitcoin_client/lib/merkleMap.js +0 -0
- /package/{cjs → dist/cjs}/ledger/bitcoin_client/lib/merkleMap.js.map +0 -0
- /package/{cjs → dist/cjs}/ledger/bitcoin_client/lib/policy.js +0 -0
- /package/{cjs → dist/cjs}/ledger/bitcoin_client/lib/policy.js.map +0 -0
- /package/{cjs → dist/cjs}/ledger/bitcoin_client/lib/psbtv2.js +0 -0
- /package/{cjs → dist/cjs}/ledger/bitcoin_client/lib/psbtv2.js.map +0 -0
- /package/{cjs → dist/cjs}/ledger/bitcoin_client/lib/varint.js +0 -0
- /package/{cjs → dist/cjs}/ledger/bitcoin_client/lib/varint.js.map +0 -0
- /package/{cjs → dist/cjs}/ledger/consts.js +0 -0
- /package/{cjs → dist/cjs}/ledger/consts.js.map +0 -0
- /package/{cjs → dist/cjs}/ledger/index.js +0 -0
- /package/{cjs → dist/cjs}/ledger/index.js.map +0 -0
- /package/{cjs → dist/cjs}/ledger/types.js +0 -0
- /package/{cjs → dist/cjs}/ledger/types.js.map +0 -0
- /package/{cjs → dist/cjs}/network-utils.js +0 -0
- /package/{cjs → dist/cjs}/network-utils.js.map +0 -0
- /package/{cjs → dist/cjs}/providers.js +0 -0
- /package/{cjs → dist/cjs}/providers.js.map +0 -0
- /package/{cjs → dist/cjs}/signers.js +0 -0
- /package/{cjs → dist/cjs}/signers.js.map +0 -0
- /package/{cjs → dist/cjs}/storage.js +0 -0
- /package/{cjs → dist/cjs}/storage.js.map +0 -0
- /package/{cjs → dist/cjs}/transactions/__tests__/integration.test.js +0 -0
- /package/{cjs → dist/cjs}/transactions/__tests__/integration.test.js.map +0 -0
- /package/{cjs → dist/cjs}/transactions/__tests__/syscoin.test.js +0 -0
- /package/{cjs → dist/cjs}/transactions/__tests__/syscoin.test.js.map +0 -0
- /package/{cjs → dist/cjs}/transactions/index.js +0 -0
- /package/{cjs → dist/cjs}/transactions/index.js.map +0 -0
- /package/{cjs → dist/cjs}/transactions/syscoin.js +0 -0
- /package/{cjs → dist/cjs}/transactions/syscoin.js.map +0 -0
- /package/{cjs → dist/cjs}/trezor/index.js +0 -0
- /package/{cjs → dist/cjs}/trezor/index.js.map +0 -0
- /package/{cjs → dist/cjs}/types.js +0 -0
- /package/{cjs → dist/cjs}/types.js.map +0 -0
- /package/{cjs → dist/cjs}/utils/derivation-paths.js +0 -0
- /package/{cjs → dist/cjs}/utils/derivation-paths.js.map +0 -0
- /package/{cjs → dist/cjs}/utils/psbt.js +0 -0
- /package/{cjs → dist/cjs}/utils/psbt.js.map +0 -0
- /package/{cjs → dist/cjs}/utils.js +0 -0
- /package/{cjs → dist/cjs}/utils.js.map +0 -0
- /package/{types → dist/types}/errorUtils.d.ts +0 -0
- /package/{types → dist/types}/hardware-wallet-manager.d.ts +0 -0
- /package/{types → dist/types}/index.d.ts +0 -0
- /package/{types → dist/types}/initial-state.d.ts +0 -0
- /package/{types → dist/types}/keyring-manager.d.ts +0 -0
- /package/{types → dist/types}/ledger/bitcoin_client/index.d.ts +0 -0
- /package/{types → dist/types}/ledger/bitcoin_client/lib/bip32.d.ts +0 -0
- /package/{types → dist/types}/ledger/bitcoin_client/lib/buffertools.d.ts +0 -0
- /package/{types → dist/types}/ledger/bitcoin_client/lib/clientCommands.d.ts +0 -0
- /package/{types → dist/types}/ledger/bitcoin_client/lib/constants.d.ts +0 -0
- /package/{types → dist/types}/ledger/bitcoin_client/lib/merkelizedPsbt.d.ts +0 -0
- /package/{types → dist/types}/ledger/bitcoin_client/lib/merkle.d.ts +0 -0
- /package/{types → dist/types}/ledger/bitcoin_client/lib/merkleMap.d.ts +0 -0
- /package/{types → dist/types}/ledger/bitcoin_client/lib/policy.d.ts +0 -0
- /package/{types → dist/types}/ledger/bitcoin_client/lib/psbtv2.d.ts +0 -0
- /package/{types → dist/types}/ledger/bitcoin_client/lib/varint.d.ts +0 -0
- /package/{types → dist/types}/ledger/consts.d.ts +0 -0
- /package/{types → dist/types}/ledger/index.d.ts +0 -0
- /package/{types → dist/types}/ledger/types.d.ts +0 -0
- /package/{types → dist/types}/network-utils.d.ts +0 -0
- /package/{types → dist/types}/providers.d.ts +0 -0
- /package/{types → dist/types}/signers.d.ts +0 -0
- /package/{types → dist/types}/storage.d.ts +0 -0
- /package/{types → dist/types}/transactions/__tests__/integration.test.d.ts +0 -0
- /package/{types → dist/types}/transactions/__tests__/syscoin.test.d.ts +0 -0
- /package/{types → dist/types}/transactions/ethereum.d.ts +0 -0
- /package/{types → dist/types}/transactions/index.d.ts +0 -0
- /package/{types → dist/types}/transactions/syscoin.d.ts +0 -0
- /package/{types → dist/types}/trezor/index.d.ts +0 -0
- /package/{types → dist/types}/types.d.ts +0 -0
- /package/{types → dist/types}/utils/derivation-paths.d.ts +0 -0
- /package/{types → dist/types}/utils/psbt.d.ts +0 -0
- /package/{types → dist/types}/utils.d.ts +0 -0
|
@@ -0,0 +1,615 @@
|
|
|
1
|
+
import { INetworkType } from '@sidhujag/sysweb3-network';
|
|
2
|
+
import * as sjs from 'syscoinjs-lib';
|
|
3
|
+
|
|
4
|
+
import { KeyringManager, KeyringAccountType } from '../../../src';
|
|
5
|
+
import { FAKE_PASSWORD, PEACE_SEED_PHRASE } from '../../helpers/constants';
|
|
6
|
+
import { setupMocks } from '../../helpers/setup';
|
|
7
|
+
|
|
8
|
+
describe('Syscoin Transactions', () => {
|
|
9
|
+
let keyringManager: KeyringManager;
|
|
10
|
+
let mockVaultStateGetter: jest.Mock;
|
|
11
|
+
let currentVaultState: any;
|
|
12
|
+
|
|
13
|
+
beforeEach(async () => {
|
|
14
|
+
setupMocks();
|
|
15
|
+
// Set up vault-keys that would normally be created by Pali's MainController
|
|
16
|
+
await setupTestVault(FAKE_PASSWORD);
|
|
17
|
+
|
|
18
|
+
// Set up UTXO testnet vault state
|
|
19
|
+
currentVaultState = createMockVaultState({
|
|
20
|
+
activeAccountId: 0,
|
|
21
|
+
activeAccountType: KeyringAccountType.HDAccount,
|
|
22
|
+
networkType: INetworkType.Syscoin,
|
|
23
|
+
chainId: 5700,
|
|
24
|
+
});
|
|
25
|
+
mockVaultStateGetter = jest.fn(() => currentVaultState);
|
|
26
|
+
|
|
27
|
+
keyringManager = await KeyringManager.createInitialized(
|
|
28
|
+
PEACE_SEED_PHRASE,
|
|
29
|
+
FAKE_PASSWORD,
|
|
30
|
+
mockVaultStateGetter
|
|
31
|
+
);
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
describe('Fee Estimation', () => {
|
|
35
|
+
it('should get recommended fee from network', async () => {
|
|
36
|
+
const fee = await keyringManager.syscoinTransaction.getRecommendedFee(
|
|
37
|
+
keyringManager.getNetwork().url
|
|
38
|
+
);
|
|
39
|
+
|
|
40
|
+
expect(typeof fee).toBe('number');
|
|
41
|
+
expect(fee).toBeGreaterThan(0);
|
|
42
|
+
expect(fee).toBeLessThan(1); // Fee should be reasonable (less than 1 SYS/byte)
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
it('should estimate transaction fee for simple transfer', async () => {
|
|
46
|
+
// Mock PsbtUtils.toPali to avoid toBase64 errors
|
|
47
|
+
const PsbtUtils = require('../../../src/utils/psbt').PsbtUtils;
|
|
48
|
+
const originalToPali = PsbtUtils.toPali;
|
|
49
|
+
PsbtUtils.toPali = jest.fn().mockReturnValue({
|
|
50
|
+
psbt: 'mock_psbt_base64',
|
|
51
|
+
assets: [],
|
|
52
|
+
});
|
|
53
|
+
|
|
54
|
+
const result =
|
|
55
|
+
await keyringManager.syscoinTransaction.getEstimateSysTransactionFee({
|
|
56
|
+
txOptions: {},
|
|
57
|
+
amount: 0.1, // 0.1 SYS
|
|
58
|
+
receivingAddress: 'tsys1qdsvzmrxkq5uh0kwc6cyndsj7fluszcu3pl2wlv',
|
|
59
|
+
feeRate: 0.000001, // 1 satoshi per byte
|
|
60
|
+
token: null,
|
|
61
|
+
});
|
|
62
|
+
|
|
63
|
+
expect(result.fee).toBeGreaterThan(0);
|
|
64
|
+
expect(result.psbt).toBeDefined();
|
|
65
|
+
expect(typeof result.psbt).toBe('object');
|
|
66
|
+
|
|
67
|
+
// Restore
|
|
68
|
+
PsbtUtils.toPali = originalToPali;
|
|
69
|
+
});
|
|
70
|
+
|
|
71
|
+
it('should handle fee estimation with multiple outputs', async () => {
|
|
72
|
+
// Mock PsbtUtils.toPali to avoid toBase64 errors
|
|
73
|
+
const PsbtUtils = require('../../../src/utils/psbt').PsbtUtils;
|
|
74
|
+
const originalToPali = PsbtUtils.toPali;
|
|
75
|
+
PsbtUtils.toPali = jest.fn().mockReturnValue({
|
|
76
|
+
psbt: 'mock_psbt_base64',
|
|
77
|
+
assets: [],
|
|
78
|
+
});
|
|
79
|
+
|
|
80
|
+
const outputs = [
|
|
81
|
+
{
|
|
82
|
+
address: 'tsys1qdsvzmrxkq5uh0kwc6cyndsj7fluszcu3pl2wlv',
|
|
83
|
+
value: 0.05,
|
|
84
|
+
},
|
|
85
|
+
{
|
|
86
|
+
address: 'tsys1q4v8sagt0znwaxdscrzhvu8t33n7vj8j45czpv4',
|
|
87
|
+
value: 0.05,
|
|
88
|
+
},
|
|
89
|
+
];
|
|
90
|
+
|
|
91
|
+
// Test with custom fee rate
|
|
92
|
+
const feeRate = 0.000002; // 2 satoshis per byte
|
|
93
|
+
|
|
94
|
+
// Note: This would need actual implementation in syscoinTransaction
|
|
95
|
+
// For now, we're testing the interface
|
|
96
|
+
const amount = outputs.reduce((sum, out) => sum + out.value, 0);
|
|
97
|
+
const result =
|
|
98
|
+
await keyringManager.syscoinTransaction.getEstimateSysTransactionFee({
|
|
99
|
+
txOptions: {},
|
|
100
|
+
amount,
|
|
101
|
+
receivingAddress: outputs[0].address,
|
|
102
|
+
feeRate,
|
|
103
|
+
token: null,
|
|
104
|
+
});
|
|
105
|
+
|
|
106
|
+
expect(result.fee).toBeGreaterThan(0);
|
|
107
|
+
|
|
108
|
+
// Restore
|
|
109
|
+
PsbtUtils.toPali = originalToPali;
|
|
110
|
+
});
|
|
111
|
+
});
|
|
112
|
+
|
|
113
|
+
describe('PSBT Operations', () => {
|
|
114
|
+
it('should sign a valid PSBT', async () => {
|
|
115
|
+
// Mock PsbtUtils to avoid Base64 validation
|
|
116
|
+
const PsbtUtils = require('../../../src/utils/psbt').PsbtUtils;
|
|
117
|
+
const originalFromPali = PsbtUtils.fromPali;
|
|
118
|
+
const originalToPali = PsbtUtils.toPali;
|
|
119
|
+
|
|
120
|
+
PsbtUtils.fromPali = jest.fn().mockReturnValue({
|
|
121
|
+
txInputs: [{ hash: Buffer.alloc(32), index: 0, sequence: 0xffffffff }],
|
|
122
|
+
txOutputs: [{ script: Buffer.alloc(25), value: 100000000 }],
|
|
123
|
+
data: {
|
|
124
|
+
inputs: [
|
|
125
|
+
{
|
|
126
|
+
witnessUtxo: { script: Buffer.alloc(25), value: 100000000 },
|
|
127
|
+
nonWitnessUtxo: Buffer.alloc(100),
|
|
128
|
+
},
|
|
129
|
+
],
|
|
130
|
+
outputs: [{}],
|
|
131
|
+
},
|
|
132
|
+
getInputType: () => 'witnesspubkeyhash',
|
|
133
|
+
signAllInputsHDAsync: jest.fn().mockResolvedValue(undefined),
|
|
134
|
+
validateSignaturesOfAllInputs: jest.fn().mockReturnValue(true),
|
|
135
|
+
finalizeAllInputs: jest.fn(),
|
|
136
|
+
extractTransaction: jest.fn().mockReturnValue({
|
|
137
|
+
getId: jest.fn().mockReturnValue('mock_txid'),
|
|
138
|
+
}),
|
|
139
|
+
});
|
|
140
|
+
|
|
141
|
+
PsbtUtils.toPali = jest.fn().mockReturnValue({
|
|
142
|
+
psbt: 'mock_signed_psbt',
|
|
143
|
+
assets: [],
|
|
144
|
+
});
|
|
145
|
+
|
|
146
|
+
const mockPsbtData = {
|
|
147
|
+
psbt: 'mocked_psbt_base64',
|
|
148
|
+
assets: [],
|
|
149
|
+
};
|
|
150
|
+
|
|
151
|
+
const result = await keyringManager.syscoinTransaction.signPSBT({
|
|
152
|
+
psbt: mockPsbtData,
|
|
153
|
+
isTrezor: false,
|
|
154
|
+
isLedger: false,
|
|
155
|
+
});
|
|
156
|
+
|
|
157
|
+
expect(result).toBeDefined();
|
|
158
|
+
expect(typeof result).toBe('object');
|
|
159
|
+
|
|
160
|
+
// Restore
|
|
161
|
+
PsbtUtils.fromPali = originalFromPali;
|
|
162
|
+
PsbtUtils.toPali = originalToPali;
|
|
163
|
+
});
|
|
164
|
+
|
|
165
|
+
it('should reject invalid PSBT format', async () => {
|
|
166
|
+
await expect(
|
|
167
|
+
keyringManager.syscoinTransaction.signPSBT({
|
|
168
|
+
psbt: 'invalid-psbt-format',
|
|
169
|
+
isTrezor: false,
|
|
170
|
+
isLedger: false,
|
|
171
|
+
})
|
|
172
|
+
).rejects.toThrow();
|
|
173
|
+
});
|
|
174
|
+
|
|
175
|
+
it('should handle PSBT signing with hardware wallet flags', async () => {
|
|
176
|
+
// Mock PsbtUtils to avoid Base64 validation
|
|
177
|
+
const PsbtUtils = require('../../../src/utils/psbt').PsbtUtils;
|
|
178
|
+
const originalFromPali = PsbtUtils.fromPali;
|
|
179
|
+
const originalToPali = PsbtUtils.toPali;
|
|
180
|
+
|
|
181
|
+
// Mock the entire signPSBTWithMethod to bypass all Trezor validation
|
|
182
|
+
const originalSignPSBTWithMethod = (
|
|
183
|
+
keyringManager.syscoinTransaction as any
|
|
184
|
+
).signPSBTWithMethod;
|
|
185
|
+
(keyringManager.syscoinTransaction as any).signPSBTWithMethod = jest
|
|
186
|
+
.fn()
|
|
187
|
+
.mockResolvedValue({
|
|
188
|
+
txid: 'mock_trezor_txid',
|
|
189
|
+
transaction: 'mock_trezor_transaction',
|
|
190
|
+
});
|
|
191
|
+
|
|
192
|
+
// Mock a proper PSBT object with required methods for Trezor conversion
|
|
193
|
+
PsbtUtils.fromPali = jest.fn().mockReturnValue({
|
|
194
|
+
txInputs: [{ hash: Buffer.alloc(32), index: 0, sequence: 0xffffffff }],
|
|
195
|
+
txOutputs: [
|
|
196
|
+
{
|
|
197
|
+
script: Buffer.from('0014' + '0'.repeat(40), 'hex'), // Valid witness script
|
|
198
|
+
value: 100000000,
|
|
199
|
+
address:
|
|
200
|
+
'tsys1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq4k9aqm', // Valid testnet bech32
|
|
201
|
+
},
|
|
202
|
+
],
|
|
203
|
+
data: {
|
|
204
|
+
inputs: [
|
|
205
|
+
{
|
|
206
|
+
witnessUtxo: { script: Buffer.alloc(25), value: 100000000 },
|
|
207
|
+
nonWitnessUtxo: Buffer.alloc(100),
|
|
208
|
+
},
|
|
209
|
+
],
|
|
210
|
+
outputs: [{}],
|
|
211
|
+
},
|
|
212
|
+
getInputType: () => 'witnesspubkeyhash',
|
|
213
|
+
finalizeAllInputs: jest.fn(),
|
|
214
|
+
extractTransaction: jest.fn().mockReturnValue({
|
|
215
|
+
getId: jest.fn().mockReturnValue('mock_txid'),
|
|
216
|
+
}),
|
|
217
|
+
});
|
|
218
|
+
|
|
219
|
+
PsbtUtils.toPali = jest.fn().mockReturnValue({
|
|
220
|
+
psbt: 'mock_signed_psbt',
|
|
221
|
+
assets: [],
|
|
222
|
+
});
|
|
223
|
+
|
|
224
|
+
const mockPsbtData = {
|
|
225
|
+
psbt: 'mocked_psbt_base64',
|
|
226
|
+
assets: [],
|
|
227
|
+
};
|
|
228
|
+
|
|
229
|
+
// Test with Trezor flag
|
|
230
|
+
const trezorResult = await keyringManager.syscoinTransaction.signPSBT({
|
|
231
|
+
psbt: mockPsbtData,
|
|
232
|
+
isTrezor: true,
|
|
233
|
+
isLedger: false,
|
|
234
|
+
});
|
|
235
|
+
|
|
236
|
+
expect(trezorResult).toBeDefined();
|
|
237
|
+
|
|
238
|
+
// Restore
|
|
239
|
+
PsbtUtils.fromPali = originalFromPali;
|
|
240
|
+
PsbtUtils.toPali = originalToPali;
|
|
241
|
+
(keyringManager.syscoinTransaction as any).signPSBTWithMethod =
|
|
242
|
+
originalSignPSBTWithMethod;
|
|
243
|
+
});
|
|
244
|
+
});
|
|
245
|
+
|
|
246
|
+
describe('Transaction Creation', () => {
|
|
247
|
+
it('should create a simple transaction', async () => {
|
|
248
|
+
// Mock PsbtUtils throughout the entire flow
|
|
249
|
+
const PsbtUtils = require('../../../src/utils/psbt').PsbtUtils;
|
|
250
|
+
const originalFromPali = PsbtUtils.fromPali;
|
|
251
|
+
const originalToPali = PsbtUtils.toPali;
|
|
252
|
+
|
|
253
|
+
PsbtUtils.toPali = jest.fn().mockReturnValue({
|
|
254
|
+
psbt: 'mock_unsigned_psbt',
|
|
255
|
+
assets: [],
|
|
256
|
+
});
|
|
257
|
+
|
|
258
|
+
PsbtUtils.fromPali = jest.fn().mockReturnValue({
|
|
259
|
+
txInputs: [{ hash: Buffer.alloc(32), index: 0, sequence: 0xffffffff }],
|
|
260
|
+
txOutputs: [{ script: Buffer.alloc(25), value: 100000000 }],
|
|
261
|
+
data: {
|
|
262
|
+
inputs: [
|
|
263
|
+
{
|
|
264
|
+
witnessUtxo: { script: Buffer.alloc(25), value: 100000000 },
|
|
265
|
+
nonWitnessUtxo: Buffer.alloc(100),
|
|
266
|
+
},
|
|
267
|
+
],
|
|
268
|
+
outputs: [{}],
|
|
269
|
+
},
|
|
270
|
+
getInputType: () => 'witnesspubkeyhash',
|
|
271
|
+
signAllInputsHDAsync: jest.fn().mockResolvedValue(undefined),
|
|
272
|
+
validateSignaturesOfAllInputs: jest.fn().mockReturnValue(true),
|
|
273
|
+
finalizeAllInputs: jest.fn(),
|
|
274
|
+
extractTransaction: jest.fn().mockReturnValue({
|
|
275
|
+
getId: jest.fn().mockReturnValue('mock_transaction_id'),
|
|
276
|
+
}),
|
|
277
|
+
});
|
|
278
|
+
|
|
279
|
+
// First create unsigned PSBT
|
|
280
|
+
const feeEstimate =
|
|
281
|
+
await keyringManager.syscoinTransaction.getEstimateSysTransactionFee({
|
|
282
|
+
txOptions: {},
|
|
283
|
+
amount: 0.1,
|
|
284
|
+
receivingAddress: 'tsys1qdsvzmrxkq5uh0kwc6cyndsj7fluszcu3pl2wlv',
|
|
285
|
+
feeRate: 0.0001,
|
|
286
|
+
token: null,
|
|
287
|
+
});
|
|
288
|
+
|
|
289
|
+
// Mock signed PSBT for signing step
|
|
290
|
+
PsbtUtils.toPali.mockReturnValue({
|
|
291
|
+
psbt: 'mock_signed_psbt',
|
|
292
|
+
assets: [],
|
|
293
|
+
});
|
|
294
|
+
|
|
295
|
+
// Sign the PSBT
|
|
296
|
+
const signedPsbt = await keyringManager.syscoinTransaction.signPSBT({
|
|
297
|
+
psbt: feeEstimate.psbt,
|
|
298
|
+
isTrezor: false,
|
|
299
|
+
isLedger: false,
|
|
300
|
+
});
|
|
301
|
+
|
|
302
|
+
// Mock sendTransaction to avoid network calls
|
|
303
|
+
const originalSendTransaction =
|
|
304
|
+
keyringManager.syscoinTransaction.sendTransaction;
|
|
305
|
+
keyringManager.syscoinTransaction.sendTransaction = jest
|
|
306
|
+
.fn()
|
|
307
|
+
.mockResolvedValue({
|
|
308
|
+
txid: 'mock_transaction_id',
|
|
309
|
+
});
|
|
310
|
+
|
|
311
|
+
// Now send the signed PSBT (current API signature)
|
|
312
|
+
const result = await keyringManager.syscoinTransaction.sendTransaction(
|
|
313
|
+
signedPsbt
|
|
314
|
+
);
|
|
315
|
+
|
|
316
|
+
expect(result.txid).toBeDefined();
|
|
317
|
+
expect(typeof result.txid).toBe('string');
|
|
318
|
+
|
|
319
|
+
// Restore
|
|
320
|
+
keyringManager.syscoinTransaction.sendTransaction =
|
|
321
|
+
originalSendTransaction;
|
|
322
|
+
|
|
323
|
+
// Restore
|
|
324
|
+
PsbtUtils.fromPali = originalFromPali;
|
|
325
|
+
PsbtUtils.toPali = originalToPali;
|
|
326
|
+
});
|
|
327
|
+
|
|
328
|
+
it('should handle change address generation', async () => {
|
|
329
|
+
const changeAddress = await keyringManager.getNewChangeAddress();
|
|
330
|
+
|
|
331
|
+
expect(changeAddress).toBeDefined();
|
|
332
|
+
expect(changeAddress.startsWith('tsys1')).toBe(true); // Testnet address
|
|
333
|
+
expect(changeAddress.length).toBe(44); // Bech32 address length
|
|
334
|
+
});
|
|
335
|
+
|
|
336
|
+
it('should get current receiving address', async () => {
|
|
337
|
+
const address = await keyringManager.updateReceivingAddress();
|
|
338
|
+
|
|
339
|
+
expect(address).toBeDefined();
|
|
340
|
+
expect(address.startsWith('tsys1')).toBe(true);
|
|
341
|
+
|
|
342
|
+
// Verify it updated the account
|
|
343
|
+
const account = keyringManager.getActiveAccount().activeAccount;
|
|
344
|
+
expect(account.address).toBe(address);
|
|
345
|
+
});
|
|
346
|
+
});
|
|
347
|
+
|
|
348
|
+
describe('UTXO Management', () => {
|
|
349
|
+
it('should handle UTXO selection for transactions', async () => {
|
|
350
|
+
// Mock PsbtUtils.toPali to avoid toBase64 errors
|
|
351
|
+
const PsbtUtils = require('../../../src/utils/psbt').PsbtUtils;
|
|
352
|
+
const originalToPali = PsbtUtils.toPali;
|
|
353
|
+
PsbtUtils.toPali = jest.fn().mockReturnValue({
|
|
354
|
+
psbt: 'mock_psbt_base64',
|
|
355
|
+
assets: [],
|
|
356
|
+
});
|
|
357
|
+
|
|
358
|
+
// This tests the integration with coinselectsyscoin
|
|
359
|
+
const amount = 0.5; // 0.5 SYS
|
|
360
|
+
const feeRate = 0.000001; // 1 satoshi per byte
|
|
361
|
+
|
|
362
|
+
const result =
|
|
363
|
+
await keyringManager.syscoinTransaction.getEstimateSysTransactionFee({
|
|
364
|
+
txOptions: { rbf: true }, // Replace-by-fee enabled
|
|
365
|
+
amount,
|
|
366
|
+
receivingAddress: 'tsys1qdsvzmrxkq5uh0kwc6cyndsj7fluszcu3pl2wlv',
|
|
367
|
+
feeRate,
|
|
368
|
+
token: null,
|
|
369
|
+
});
|
|
370
|
+
|
|
371
|
+
expect(result.fee).toBeGreaterThan(0);
|
|
372
|
+
expect(result.fee).toBeLessThan(amount); // Fee should be less than amount
|
|
373
|
+
|
|
374
|
+
// Restore
|
|
375
|
+
PsbtUtils.toPali = originalToPali;
|
|
376
|
+
});
|
|
377
|
+
|
|
378
|
+
it('should handle insufficient balance', async () => {
|
|
379
|
+
// Try to send more than available balance
|
|
380
|
+
const hugeAmount = 1000000; // 1 million SYS
|
|
381
|
+
|
|
382
|
+
// This should fail in a real implementation
|
|
383
|
+
try {
|
|
384
|
+
await keyringManager.syscoinTransaction.getEstimateSysTransactionFee({
|
|
385
|
+
txOptions: {},
|
|
386
|
+
amount: hugeAmount,
|
|
387
|
+
receivingAddress: 'tsys1qdsvzmrxkq5uh0kwc6cyndsj7fluszcu3pl2wlv',
|
|
388
|
+
feeRate: 0.000001,
|
|
389
|
+
token: null,
|
|
390
|
+
});
|
|
391
|
+
} catch (error) {
|
|
392
|
+
// Expected to fail with insufficient balance
|
|
393
|
+
expect(error).toBeDefined();
|
|
394
|
+
}
|
|
395
|
+
});
|
|
396
|
+
});
|
|
397
|
+
|
|
398
|
+
describe('SPT Token Support', () => {
|
|
399
|
+
it('should handle SPT token transactions', async () => {
|
|
400
|
+
// Mock PsbtUtils throughout the entire flow
|
|
401
|
+
const PsbtUtils = require('../../../src/utils/psbt').PsbtUtils;
|
|
402
|
+
const originalFromPali = PsbtUtils.fromPali;
|
|
403
|
+
const originalToPali = PsbtUtils.toPali;
|
|
404
|
+
|
|
405
|
+
PsbtUtils.toPali = jest.fn().mockReturnValue({
|
|
406
|
+
psbt: 'mock_token_psbt',
|
|
407
|
+
assets: [],
|
|
408
|
+
});
|
|
409
|
+
|
|
410
|
+
PsbtUtils.fromPali = jest.fn().mockReturnValue({
|
|
411
|
+
txInputs: [{ hash: Buffer.alloc(32), index: 0, sequence: 0xffffffff }],
|
|
412
|
+
txOutputs: [{ script: Buffer.alloc(25), value: 100000000 }],
|
|
413
|
+
data: {
|
|
414
|
+
inputs: [
|
|
415
|
+
{
|
|
416
|
+
witnessUtxo: { script: Buffer.alloc(25), value: 100000000 },
|
|
417
|
+
nonWitnessUtxo: Buffer.alloc(100),
|
|
418
|
+
},
|
|
419
|
+
],
|
|
420
|
+
outputs: [{}],
|
|
421
|
+
},
|
|
422
|
+
getInputType: () => 'witnesspubkeyhash',
|
|
423
|
+
signAllInputsHDAsync: jest.fn().mockResolvedValue(undefined),
|
|
424
|
+
validateSignaturesOfAllInputs: jest.fn().mockReturnValue(true),
|
|
425
|
+
finalizeAllInputs: jest.fn(),
|
|
426
|
+
extractTransaction: jest.fn().mockReturnValue({
|
|
427
|
+
getId: jest.fn().mockReturnValue('mock_token_txid'),
|
|
428
|
+
}),
|
|
429
|
+
});
|
|
430
|
+
|
|
431
|
+
// First create unsigned PSBT for token transaction
|
|
432
|
+
const feeEstimate =
|
|
433
|
+
await keyringManager.syscoinTransaction.getEstimateSysTransactionFee({
|
|
434
|
+
txOptions: {},
|
|
435
|
+
amount: 100, // 100 tokens
|
|
436
|
+
receivingAddress: 'tsys1qdsvzmrxkq5uh0kwc6cyndsj7fluszcu3pl2wlv',
|
|
437
|
+
feeRate: 0.0001,
|
|
438
|
+
token: {
|
|
439
|
+
guid: '123456789',
|
|
440
|
+
symbol: 'TEST',
|
|
441
|
+
},
|
|
442
|
+
});
|
|
443
|
+
|
|
444
|
+
// Mock signed PSBT for signing step
|
|
445
|
+
PsbtUtils.toPali.mockReturnValue({
|
|
446
|
+
psbt: 'mock_signed_token_psbt',
|
|
447
|
+
assets: [],
|
|
448
|
+
});
|
|
449
|
+
|
|
450
|
+
// Sign the PSBT
|
|
451
|
+
const signedPsbt = await keyringManager.syscoinTransaction.signPSBT({
|
|
452
|
+
psbt: feeEstimate.psbt,
|
|
453
|
+
isTrezor: false,
|
|
454
|
+
isLedger: false,
|
|
455
|
+
});
|
|
456
|
+
|
|
457
|
+
// Mock sendTransaction to avoid network calls
|
|
458
|
+
const originalSendTransaction =
|
|
459
|
+
keyringManager.syscoinTransaction.sendTransaction;
|
|
460
|
+
keyringManager.syscoinTransaction.sendTransaction = jest
|
|
461
|
+
.fn()
|
|
462
|
+
.mockResolvedValue({
|
|
463
|
+
txid: 'mock_token_txid',
|
|
464
|
+
});
|
|
465
|
+
|
|
466
|
+
// Send the signed token transaction
|
|
467
|
+
const result = await keyringManager.syscoinTransaction.sendTransaction(
|
|
468
|
+
signedPsbt
|
|
469
|
+
);
|
|
470
|
+
|
|
471
|
+
expect(result.txid).toBeDefined();
|
|
472
|
+
|
|
473
|
+
// Restore sendTransaction
|
|
474
|
+
keyringManager.syscoinTransaction.sendTransaction =
|
|
475
|
+
originalSendTransaction;
|
|
476
|
+
|
|
477
|
+
// Restore
|
|
478
|
+
PsbtUtils.fromPali = originalFromPali;
|
|
479
|
+
PsbtUtils.toPali = originalToPali;
|
|
480
|
+
});
|
|
481
|
+
});
|
|
482
|
+
|
|
483
|
+
describe('Multiple Account Support', () => {
|
|
484
|
+
it('should sign transactions from different accounts', async () => {
|
|
485
|
+
// Add a second account
|
|
486
|
+
const account2 = await keyringManager.addNewAccount('Account 2');
|
|
487
|
+
|
|
488
|
+
// Update vault state with the new account (in stateless keyring, this would be done by Pali/Redux)
|
|
489
|
+
currentVaultState.accounts[KeyringAccountType.HDAccount][account2.id] = {
|
|
490
|
+
id: account2.id,
|
|
491
|
+
address: account2.address,
|
|
492
|
+
xpub: account2.xpub,
|
|
493
|
+
xprv: account2.xprv,
|
|
494
|
+
label: account2.label,
|
|
495
|
+
balances: account2.balances,
|
|
496
|
+
isImported: account2.isImported,
|
|
497
|
+
isTrezorWallet: account2.isTrezorWallet,
|
|
498
|
+
isLedgerWallet: account2.isLedgerWallet,
|
|
499
|
+
};
|
|
500
|
+
|
|
501
|
+
// Get change address for account 1
|
|
502
|
+
const changeAddress1 = await keyringManager.getChangeAddress(0);
|
|
503
|
+
|
|
504
|
+
// Switch to account 2
|
|
505
|
+
currentVaultState.activeAccount = {
|
|
506
|
+
id: account2.id,
|
|
507
|
+
type: KeyringAccountType.HDAccount,
|
|
508
|
+
};
|
|
509
|
+
|
|
510
|
+
// Get change address for account 2
|
|
511
|
+
const changeAddress2 = await keyringManager.getChangeAddress(1);
|
|
512
|
+
|
|
513
|
+
// Addresses should be different
|
|
514
|
+
expect(changeAddress1).not.toBe(changeAddress2);
|
|
515
|
+
expect(changeAddress1.startsWith('tsys1')).toBe(true);
|
|
516
|
+
expect(changeAddress2.startsWith('tsys1')).toBe(true);
|
|
517
|
+
});
|
|
518
|
+
});
|
|
519
|
+
|
|
520
|
+
describe('Network Compatibility', () => {
|
|
521
|
+
it('should work with mainnet configuration', async () => {
|
|
522
|
+
// Set up mainnet vault state
|
|
523
|
+
const mainnetVaultState = createMockVaultState({
|
|
524
|
+
activeAccountId: 0,
|
|
525
|
+
activeAccountType: KeyringAccountType.HDAccount,
|
|
526
|
+
networkType: INetworkType.Syscoin,
|
|
527
|
+
chainId: 57,
|
|
528
|
+
});
|
|
529
|
+
const mainnetVaultStateGetter = jest.fn(() => mainnetVaultState);
|
|
530
|
+
|
|
531
|
+
// Create mainnet keyring
|
|
532
|
+
const mainnetKeyring = await KeyringManager.createInitialized(
|
|
533
|
+
PEACE_SEED_PHRASE,
|
|
534
|
+
FAKE_PASSWORD,
|
|
535
|
+
mainnetVaultStateGetter
|
|
536
|
+
);
|
|
537
|
+
|
|
538
|
+
const address = mainnetKeyring.getActiveAccount().activeAccount.address;
|
|
539
|
+
expect(address.startsWith('sys1')).toBe(true); // Mainnet prefix
|
|
540
|
+
|
|
541
|
+
const fee = await mainnetKeyring.syscoinTransaction.getRecommendedFee(
|
|
542
|
+
mainnetKeyring.getNetwork().url
|
|
543
|
+
);
|
|
544
|
+
expect(fee).toBeGreaterThan(0);
|
|
545
|
+
});
|
|
546
|
+
});
|
|
547
|
+
|
|
548
|
+
describe('Error Handling', () => {
|
|
549
|
+
it('should handle network errors gracefully', async () => {
|
|
550
|
+
// Mock a network error
|
|
551
|
+
const mockFetchEstimateFee = sjs.utils.fetchEstimateFee as jest.Mock;
|
|
552
|
+
mockFetchEstimateFee.mockRejectedValueOnce(new Error('Network error'));
|
|
553
|
+
|
|
554
|
+
try {
|
|
555
|
+
await keyringManager.syscoinTransaction.getRecommendedFee(
|
|
556
|
+
'https://invalid-url.com'
|
|
557
|
+
);
|
|
558
|
+
} catch (error) {
|
|
559
|
+
expect(error.message).toContain('Network error');
|
|
560
|
+
}
|
|
561
|
+
});
|
|
562
|
+
|
|
563
|
+
it('should validate addresses before sending', async () => {
|
|
564
|
+
// Mock address validation to throw for invalid addresses
|
|
565
|
+
const syscoinjs = require('syscoinjs-lib');
|
|
566
|
+
const originalValidateAddress = syscoinjs.utils.validateSyscoinAddress;
|
|
567
|
+
syscoinjs.utils.validateSyscoinAddress = jest
|
|
568
|
+
.fn()
|
|
569
|
+
.mockImplementation((address) => {
|
|
570
|
+
if (address === 'invalid_address') {
|
|
571
|
+
throw new Error('Invalid address format');
|
|
572
|
+
}
|
|
573
|
+
return true;
|
|
574
|
+
});
|
|
575
|
+
|
|
576
|
+
// Should reject invalid addresses during fee estimation
|
|
577
|
+
try {
|
|
578
|
+
await keyringManager.syscoinTransaction.getEstimateSysTransactionFee({
|
|
579
|
+
txOptions: {},
|
|
580
|
+
amount: 0.1,
|
|
581
|
+
receivingAddress: 'invalid_address',
|
|
582
|
+
feeRate: 0.0001,
|
|
583
|
+
token: null,
|
|
584
|
+
});
|
|
585
|
+
// If we get here, the test should fail
|
|
586
|
+
expect(true).toBe(false);
|
|
587
|
+
} catch (error) {
|
|
588
|
+
// Expected to throw for invalid address
|
|
589
|
+
expect(error).toBeDefined();
|
|
590
|
+
}
|
|
591
|
+
|
|
592
|
+
// Restore
|
|
593
|
+
syscoinjs.utils.validateSyscoinAddress = originalValidateAddress;
|
|
594
|
+
});
|
|
595
|
+
|
|
596
|
+
it('should require unlock for transaction operations', async () => {
|
|
597
|
+
keyringManager.lockWallet();
|
|
598
|
+
|
|
599
|
+
try {
|
|
600
|
+
await keyringManager.syscoinTransaction.getEstimateSysTransactionFee({
|
|
601
|
+
txOptions: {},
|
|
602
|
+
amount: 0.1,
|
|
603
|
+
receivingAddress: 'tsys1qdsvzmrxkq5uh0kwc6cyndsj7fluszcu3pl2wlv',
|
|
604
|
+
feeRate: 0.0001,
|
|
605
|
+
token: null,
|
|
606
|
+
});
|
|
607
|
+
// If we get here, the test should fail
|
|
608
|
+
expect(true).toBe(false);
|
|
609
|
+
} catch (error) {
|
|
610
|
+
// Expected to throw when wallet is locked
|
|
611
|
+
expect(error).toBeDefined();
|
|
612
|
+
}
|
|
613
|
+
});
|
|
614
|
+
});
|
|
615
|
+
});
|
package/tsconfig.json
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
{
|
|
2
|
+
"extends": "../../tsconfig-package.json",
|
|
3
|
+
"compilerOptions": {
|
|
4
|
+
"rootDir": "src",
|
|
5
|
+
"baseUrl": "src",
|
|
6
|
+
"allowJs": true,
|
|
7
|
+
"outDir": "dist/cjs",
|
|
8
|
+
"declarationDir": "dist/types",
|
|
9
|
+
"resolveJsonModule": true,
|
|
10
|
+
"noImplicitAny": false,
|
|
11
|
+
"strictPropertyInitialization": false
|
|
12
|
+
},
|
|
13
|
+
"include": ["src"]
|
|
14
|
+
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"appClient.js","sourceRoot":"","sources":["../../../../../src/ledger/bitcoin_client/lib/appClient.ts"],"names":[],"mappings":"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"}
|