@sidhujag/sysweb3-keyring 1.0.628 → 2.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/CHANGELOG.md +30 -0
- package/README.md +174 -0
- package/cjs/bip84-native.js +8 -0
- package/cjs/bip84-native.js.map +1 -0
- package/cjs/hardware-wallet-manager.js +302 -128
- package/cjs/hardware-wallet-manager.js.map +1 -1
- package/cjs/keyring-core.js +319 -0
- package/cjs/keyring-core.js.map +1 -1
- package/cjs/keyring-manager.js +9 -3
- package/cjs/keyring-manager.js.map +1 -1
- package/cjs/ledger/bitcoin_client/lib/appClient.js.map +1 -1
- package/cjs/ledger/host-types.js +10 -0
- package/cjs/ledger/host-types.js.map +1 -0
- package/cjs/ledger/index.js +243 -447
- package/cjs/ledger/index.js.map +1 -1
- package/cjs/ledger/prepare-psbt.js +177 -0
- package/cjs/ledger/prepare-psbt.js.map +1 -0
- package/cjs/public-bip84.js +157 -0
- package/cjs/public-bip84.js.map +1 -0
- package/cjs/software-hd-account.js +23 -0
- package/cjs/software-hd-account.js.map +1 -0
- package/cjs/software-utxo-account.js +12 -0
- package/cjs/software-utxo-account.js.map +1 -0
- package/cjs/software.js +24 -0
- package/cjs/software.js.map +1 -1
- package/cjs/transactions/bip84-native-plan.js +481 -0
- package/cjs/transactions/bip84-native-plan.js.map +1 -0
- package/cjs/transactions/ethereum.js +55 -10
- package/cjs/transactions/ethereum.js.map +1 -1
- package/cjs/transactions/hardware-psbt.js +36 -44
- package/cjs/transactions/hardware-psbt.js.map +1 -1
- package/cjs/transactions/prepared-bip84.js +214 -0
- package/cjs/transactions/prepared-bip84.js.map +1 -0
- package/cjs/transactions/prepared-evm.js +197 -0
- package/cjs/transactions/prepared-evm.js.map +1 -0
- package/cjs/trezor/connect.js +243 -0
- package/cjs/trezor/connect.js.map +1 -0
- package/cjs/trezor/index.js +96 -58
- package/cjs/trezor/index.js.map +1 -1
- package/cjs/trezor/witness.js +25 -0
- package/cjs/trezor/witness.js.map +1 -0
- package/cjs/utils/psbt-account-scope.js +5 -3
- package/cjs/utils/psbt-account-scope.js.map +1 -1
- package/esm/errorUtils.js +72 -0
- package/esm/errorUtils.js.map +1 -0
- package/esm/ethers-v6.js +207 -0
- package/esm/ethers-v6.js.map +1 -0
- package/esm/hardware-wallet-manager.js +643 -0
- package/esm/hardware-wallet-manager.js.map +1 -0
- package/esm/ledger/bitcoin_client/lib/appClient.js +279 -0
- package/esm/ledger/bitcoin_client/lib/appClient.js.map +1 -0
- package/esm/ledger/bitcoin_client/lib/bip32.js +49 -0
- package/esm/ledger/bitcoin_client/lib/bip32.js.map +1 -0
- package/esm/ledger/bitcoin_client/lib/buffertools.js +119 -0
- package/esm/ledger/bitcoin_client/lib/buffertools.js.map +1 -0
- package/esm/ledger/bitcoin_client/lib/clientCommands.js +269 -0
- package/esm/ledger/bitcoin_client/lib/clientCommands.js.map +1 -0
- package/esm/ledger/bitcoin_client/lib/merkelizedPsbt.js +50 -0
- package/esm/ledger/bitcoin_client/lib/merkelizedPsbt.js.map +1 -0
- package/esm/ledger/bitcoin_client/lib/merkle.js +111 -0
- package/esm/ledger/bitcoin_client/lib/merkle.js.map +1 -0
- package/esm/ledger/bitcoin_client/lib/merkleMap.js +42 -0
- package/esm/ledger/bitcoin_client/lib/merkleMap.js.map +1 -0
- package/esm/ledger/bitcoin_client/lib/policy.js +68 -0
- package/esm/ledger/bitcoin_client/lib/policy.js.map +1 -0
- package/esm/ledger/bitcoin_client/lib/psbtv2.js +645 -0
- package/esm/ledger/bitcoin_client/lib/psbtv2.js.map +1 -0
- package/esm/ledger/bitcoin_client/lib/varint.js +108 -0
- package/esm/ledger/bitcoin_client/lib/varint.js.map +1 -0
- package/esm/ledger/consts.js +4 -0
- package/esm/ledger/consts.js.map +1 -0
- package/esm/ledger/dmk-evm.js +258 -0
- package/esm/ledger/dmk-evm.js.map +1 -0
- package/esm/ledger/dmk-session.js +264 -0
- package/esm/ledger/dmk-session.js.map +1 -0
- package/esm/ledger/dmk-utxo.js +279 -0
- package/esm/ledger/dmk-utxo.js.map +1 -0
- package/esm/ledger/host-types.js +5 -0
- package/esm/ledger/host-types.js.map +1 -0
- package/esm/ledger/index.js +268 -0
- package/esm/ledger/index.js.map +1 -0
- package/esm/ledger/prepare-psbt.js +141 -0
- package/esm/ledger/prepare-psbt.js.map +1 -0
- package/esm/ledger/types.js +2 -0
- package/esm/ledger/types.js.map +1 -0
- package/esm/ledger-host.js +36 -0
- package/esm/ledger-host.js.map +1 -0
- package/esm/private-records.js +153 -0
- package/esm/private-records.js.map +1 -0
- package/esm/providers.js +588 -0
- package/esm/providers.js.map +1 -0
- package/esm/signers.js +28 -0
- package/esm/signers.js.map +1 -0
- package/esm/trezor/connect.js +206 -0
- package/esm/trezor/connect.js.map +1 -0
- package/esm/trezor/index.js +876 -0
- package/esm/trezor/index.js.map +1 -0
- package/esm/trezor/witness.js +21 -0
- package/esm/trezor/witness.js.map +1 -0
- package/esm/types.js +17 -0
- package/esm/types.js.map +1 -0
- package/esm/utils/derivation-paths.js +109 -0
- package/esm/utils/derivation-paths.js.map +1 -0
- package/esm/utils/psbt-account-scope.js +310 -0
- package/esm/utils/psbt-account-scope.js.map +1 -0
- package/package.json +34 -9
- package/types/bip84-native.d.ts +3 -0
- package/types/hardware-wallet-manager.d.ts +12 -19
- package/types/keyring-core.d.ts +14 -0
- package/types/keyring-manager.d.ts +2 -1
- package/types/ledger/bitcoin_client/lib/appClient.d.ts +6 -3
- package/types/ledger/dmk-evm.d.ts +8 -0
- package/types/ledger/dmk-session.d.ts +60 -0
- package/types/ledger/dmk-utxo.d.ts +26 -0
- package/types/ledger/host-types.d.ts +131 -0
- package/types/ledger/index.d.ts +21 -58
- package/types/ledger/prepare-psbt.d.ts +3 -0
- package/types/ledger/types.d.ts +3 -0
- package/types/ledger-host.d.ts +7 -0
- package/types/public-bip84.d.ts +39 -0
- package/types/software-hd-account.d.ts +16 -0
- package/types/software-utxo-account.d.ts +13 -0
- package/types/software.d.ts +26 -0
- package/types/transactions/bip84-native-plan.d.ts +83 -0
- package/types/transactions/ethereum.d.ts +1 -1
- package/types/transactions/prepared-bip84.d.ts +27 -0
- package/types/transactions/prepared-evm.d.ts +53 -0
- package/types/trezor/connect.d.ts +42 -0
- package/types/trezor/index.d.ts +22 -4
- package/types/trezor/witness.d.ts +3 -0
- package/types/utils/psbt-account-scope.d.ts +1 -0
|
@@ -2,17 +2,15 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.createLedgerPsbtSigner = createLedgerPsbtSigner;
|
|
4
4
|
exports.createTrezorPsbtSigner = createTrezorPsbtSigner;
|
|
5
|
+
const secp256k1_1 = require("@bitcoinerlab/secp256k1");
|
|
5
6
|
const sysweb3_network_1 = require("@sidhujag/sysweb3-network");
|
|
6
7
|
const syscoin_core_1 = require("./syscoin-core");
|
|
7
|
-
const
|
|
8
|
-
const psbtv2_1 = require("../ledger/bitcoin_client/lib/psbtv2");
|
|
9
|
-
const consts_1 = require("../ledger/consts");
|
|
10
|
-
const derivation_paths_1 = require("../utils/derivation-paths");
|
|
8
|
+
const prepare_psbt_1 = require("../ledger/prepare-psbt");
|
|
11
9
|
const psbt_account_scope_1 = require("../utils/psbt-account-scope");
|
|
12
10
|
/** Legacy device adapter. The software transaction engine never imports it. */
|
|
13
11
|
function createLedgerPsbtSigner(ledger) {
|
|
14
12
|
return async ({ psbt, account, network: activeNetwork, scope, assertCurrent, getRawTransaction, }) => {
|
|
15
|
-
if (typeof ledger?.
|
|
13
|
+
if (typeof ledger?.signPsbt !== 'function' ||
|
|
16
14
|
typeof getRawTransaction !== 'function') {
|
|
17
15
|
throw (0, syscoin_core_1.createHardwareSignerUnavailableError)('Ledger');
|
|
18
16
|
}
|
|
@@ -86,51 +84,45 @@ function createLedgerPsbtSigner(ledger) {
|
|
|
86
84
|
}
|
|
87
85
|
}
|
|
88
86
|
assertCurrent();
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
let deviceXpub = null;
|
|
99
|
-
try {
|
|
100
|
-
deviceXpub = await ledger.ledgerUtxoClient.getExtendedPubkey(hdPath, false);
|
|
101
|
-
}
|
|
102
|
-
catch (_e) {
|
|
103
|
-
// ignore; we'll fall back
|
|
104
|
-
}
|
|
105
|
-
if (!deviceXpub) {
|
|
106
|
-
const devicePubMagicHex = activeNetwork.slip44 === 1 ? '043587cf' : '0488b21e';
|
|
107
|
-
deviceXpub = (0, derivation_paths_1.convertExtendedKeyVersion)(accountXpub, devicePubMagicHex);
|
|
108
|
-
}
|
|
109
|
-
const xpubWithDescriptor = `[${hdPath}]${deviceXpub}`.replace('m', fingerprint);
|
|
110
|
-
const walletPolicy = new policy_1.WalletPolicy(activeNetwork.currency.toLowerCase(), consts_1.DESCRIPTOR, [xpubWithDescriptor]);
|
|
111
|
-
// Register lazily and retrieve HMAC for silent operations thereafter
|
|
112
|
-
let hmac = null;
|
|
113
|
-
if (typeof ledger.getOrRegisterHmac === 'function') {
|
|
114
|
-
hmac = await ledger.getOrRegisterHmac(walletPolicy, fingerprint);
|
|
115
|
-
}
|
|
116
|
-
// Convert to PsbtV2 for direct signing without intermediate base64 encode/decode
|
|
117
|
-
const psbtV2 = new psbtv2_1.PsbtV2().fromBitcoinJS(enhancedPsbt);
|
|
87
|
+
(0, psbt_account_scope_1.assertPsbtAccountScope)(psbt, scope);
|
|
88
|
+
// The host verifies the device xpub and signs in one serialized operation.
|
|
89
|
+
const { fingerprint, signatures } = await ledger.signPsbt({
|
|
90
|
+
currency: activeNetwork.currency,
|
|
91
|
+
slip44: activeNetwork.slip44,
|
|
92
|
+
accountIndex: accountId,
|
|
93
|
+
accountXpub,
|
|
94
|
+
psbtBase64: psbt.toBase64(),
|
|
95
|
+
});
|
|
118
96
|
assertCurrent();
|
|
97
|
+
const enhancedPsbt = (0, prepare_psbt_1.prepareLedgerPsbt)(psbt, accountXpub, accountId, activeNetwork.currency, activeNetwork.slip44, fingerprint);
|
|
119
98
|
(0, psbt_account_scope_1.assertPsbtAccountScope)(enhancedPsbt, scope);
|
|
120
|
-
const
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
99
|
+
for (const entry of signatures) {
|
|
100
|
+
if (!Number.isSafeInteger(entry.inputIndex) ||
|
|
101
|
+
entry.inputIndex < 0 ||
|
|
102
|
+
!/^(02|03)[0-9a-f]{64}$/i.test(entry.pubkeyHex) ||
|
|
103
|
+
!/^(?:[0-9a-f]{2})+$/i.test(entry.signatureHex) ||
|
|
104
|
+
entry.tapleafHashHex)
|
|
105
|
+
throw new Error('Invalid Ledger signature response');
|
|
106
|
+
const partialSig = {
|
|
107
|
+
pubkey: Buffer.from(entry.pubkeyHex, 'hex'),
|
|
108
|
+
signature: Buffer.from(entry.signatureHex, 'hex'),
|
|
109
|
+
};
|
|
110
|
+
const input = enhancedPsbt.data.inputs[entry.inputIndex];
|
|
124
111
|
if (!input ||
|
|
125
112
|
input.finalScriptSig ||
|
|
126
113
|
input.finalScriptWitness ||
|
|
127
|
-
!input.bip32Derivation?.some((derivation) => Buffer.from(derivation.pubkey).equals(
|
|
114
|
+
!input.bip32Derivation?.some((derivation) => Buffer.from(derivation.pubkey).equals(partialSig.pubkey)))
|
|
128
115
|
throw new Error('PSBT input is outside the approved account');
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
116
|
+
// An absent PSBT sighash request means SIGHASH_ALL. A valid signature
|
|
117
|
+
// with weaker coverage must not silently replace that approval.
|
|
118
|
+
const expectedSighash = input.sighashType ?? 0x01;
|
|
119
|
+
if (partialSig.signature[partialSig.signature.length - 1] !==
|
|
120
|
+
expectedSighash)
|
|
121
|
+
throw new Error('Ledger signature does not match the approved sighash type');
|
|
122
|
+
enhancedPsbt.updateInput(entry.inputIndex, { partialSig: [partialSig] });
|
|
123
|
+
if (!enhancedPsbt.validateSignaturesOfInput(entry.inputIndex, (pubkey, hash, signature) => (0, secp256k1_1.verify)(hash, pubkey, signature), partialSig.pubkey))
|
|
124
|
+
throw new Error('Invalid Ledger signature for approved transaction');
|
|
125
|
+
}
|
|
134
126
|
// Preserve external inputs that were finalized before device signing.
|
|
135
127
|
enhancedPsbt.data.inputs.forEach((input, index) => {
|
|
136
128
|
if (!input.finalScriptSig && !input.finalScriptWitness)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hardware-psbt.js","sourceRoot":"","sources":["../../../src/transactions/hardware-psbt.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"hardware-psbt.js","sourceRoot":"","sources":["../../../src/transactions/hardware-psbt.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,214 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.snapshotPreparedBip84Request = snapshotPreparedBip84Request;
|
|
7
|
+
exports.clearBip84PrivateNodes = clearBip84PrivateNodes;
|
|
8
|
+
exports.signValidatedBip84Plan = signValidatedBip84Plan;
|
|
9
|
+
const secp256k1_1 = __importDefault(require("@bitcoinerlab/secp256k1"));
|
|
10
|
+
const bitcoinjs_lib_1 = require("bitcoinjs-lib");
|
|
11
|
+
const public_bip84_1 = require("../public-bip84");
|
|
12
|
+
const bip84_native_plan_1 = require("./bip84-native-plan");
|
|
13
|
+
/** Private host snapshot. A public prepared DTO never carries signing authority. */
|
|
14
|
+
function snapshotPreparedBip84Request(input) {
|
|
15
|
+
const r = (0, bip84_native_plan_1.record)(input, ['account', 'prepared']);
|
|
16
|
+
const a = (0, bip84_native_plan_1.record)(r.account, ['type', 'index', 'expectedAccountKey']);
|
|
17
|
+
const p = (0, bip84_native_plan_1.record)(r.prepared, ['plan', 'unsignedTransaction', 'feeSatoshis']);
|
|
18
|
+
if (a.type !== 'HDAccount')
|
|
19
|
+
return (0, bip84_native_plan_1.fail)('ACCOUNT_MISMATCH');
|
|
20
|
+
const accountIndex = (0, bip84_native_plan_1.index)(a.index);
|
|
21
|
+
if (typeof a.expectedAccountKey !== 'string' ||
|
|
22
|
+
a.expectedAccountKey.length > 112 ||
|
|
23
|
+
typeof p.unsignedTransaction !== 'string' ||
|
|
24
|
+
p.unsignedTransaction.length > bip84_native_plan_1.LIMITS.unsignedBytes * 2 ||
|
|
25
|
+
!/^(?:[0-9a-f]{2})+$/.test(p.unsignedTransaction) ||
|
|
26
|
+
typeof p.feeSatoshis !== 'string' ||
|
|
27
|
+
!/^(0|[1-9][0-9]{0,18})$/.test(p.feeSatoshis))
|
|
28
|
+
return (0, bip84_native_plan_1.fail)('INVALID_REQUEST');
|
|
29
|
+
const validated = (0, bip84_native_plan_1.validateBip84NativePlan)(p.plan);
|
|
30
|
+
if (accountIndex !== validated.prepared.plan.account.accountIndex ||
|
|
31
|
+
a.expectedAccountKey !== validated.prepared.plan.account.canonicalKey)
|
|
32
|
+
return (0, bip84_native_plan_1.fail)('ACCOUNT_MISMATCH');
|
|
33
|
+
if (p.unsignedTransaction !== validated.prepared.unsignedTransaction ||
|
|
34
|
+
p.feeSatoshis !== validated.prepared.feeSatoshis)
|
|
35
|
+
return (0, bip84_native_plan_1.fail)('INVALID_REQUEST');
|
|
36
|
+
return {
|
|
37
|
+
account: Object.freeze({
|
|
38
|
+
type: 'HDAccount',
|
|
39
|
+
index: accountIndex,
|
|
40
|
+
expectedAccountKey: a.expectedAccountKey,
|
|
41
|
+
}),
|
|
42
|
+
validated,
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
/** Only operation-owned nodes. No session/shared key objects may be supplied. */
|
|
46
|
+
function clearBip84PrivateNodes(nodes) {
|
|
47
|
+
while (nodes.length) {
|
|
48
|
+
const node = nodes.pop();
|
|
49
|
+
try {
|
|
50
|
+
node.privateKey?.fill(0);
|
|
51
|
+
}
|
|
52
|
+
catch {
|
|
53
|
+
// Continue retiring the other owned buffers and the operation token.
|
|
54
|
+
// JS/library copies and inaccessible buffers are not claimed zeroized.
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
const equal = (left, right) => Buffer.from(left).equals(Buffer.from(right));
|
|
59
|
+
/** Internally owned PSBT only. No provider, generic SDK signer or partial result. */
|
|
60
|
+
function signValidatedBip84Plan(validated, accountNode, assertCurrent) {
|
|
61
|
+
const nodes = [];
|
|
62
|
+
try {
|
|
63
|
+
const { prepared, psbt, previousOutputs } = validated;
|
|
64
|
+
const { plan } = prepared;
|
|
65
|
+
const profile = (0, bip84_native_plan_1.bip84Profile)(plan.network.network);
|
|
66
|
+
assertCurrent();
|
|
67
|
+
const derivedAccount = (0, public_bip84_1.parseBip84PublicAccount)({
|
|
68
|
+
network: plan.network.network,
|
|
69
|
+
accountKey: accountNode.neutered().toBase58(),
|
|
70
|
+
});
|
|
71
|
+
if (derivedAccount.canonicalKey !== plan.account.canonicalKey ||
|
|
72
|
+
derivedAccount.accountIndex !== plan.account.accountIndex)
|
|
73
|
+
return (0, bip84_native_plan_1.fail)('ACCOUNT_MISMATCH');
|
|
74
|
+
const branches = new Map();
|
|
75
|
+
const children = new Map();
|
|
76
|
+
const publicKeys = [];
|
|
77
|
+
for (const [i, input] of plan.inputs.entries()) {
|
|
78
|
+
assertCurrent();
|
|
79
|
+
let branch = branches.get(input.branch);
|
|
80
|
+
if (!branch) {
|
|
81
|
+
branch = accountNode.derive(input.branch);
|
|
82
|
+
nodes.push(branch);
|
|
83
|
+
if (branch.index !== input.branch)
|
|
84
|
+
return (0, bip84_native_plan_1.fail)('ACCOUNT_MISMATCH');
|
|
85
|
+
branches.set(input.branch, branch);
|
|
86
|
+
}
|
|
87
|
+
const path = `${input.branch}/${input.index}`;
|
|
88
|
+
let child = children.get(path);
|
|
89
|
+
if (!child) {
|
|
90
|
+
child = branch.derive(input.index);
|
|
91
|
+
nodes.push(child);
|
|
92
|
+
if (child.index !== input.index)
|
|
93
|
+
return (0, bip84_native_plan_1.fail)('ACCOUNT_MISMATCH');
|
|
94
|
+
children.set(path, child);
|
|
95
|
+
}
|
|
96
|
+
const pubkey = Uint8Array.from(child.publicKey);
|
|
97
|
+
const payment = bitcoinjs_lib_1.payments.p2wpkh({
|
|
98
|
+
pubkey,
|
|
99
|
+
network: profile.addressNetwork,
|
|
100
|
+
});
|
|
101
|
+
if (pubkey.length !== 33 ||
|
|
102
|
+
!payment.output ||
|
|
103
|
+
!equal(payment.output, previousOutputs[i].script))
|
|
104
|
+
return (0, bip84_native_plan_1.fail)('INPUT_MISMATCH');
|
|
105
|
+
publicKeys.push(pubkey);
|
|
106
|
+
const signer = child;
|
|
107
|
+
assertCurrent();
|
|
108
|
+
psbt.signInput(i, {
|
|
109
|
+
publicKey: pubkey,
|
|
110
|
+
sign(hash) {
|
|
111
|
+
assertCurrent();
|
|
112
|
+
const signature = signer.sign(hash);
|
|
113
|
+
assertCurrent();
|
|
114
|
+
return signature;
|
|
115
|
+
},
|
|
116
|
+
}, [bitcoinjs_lib_1.Transaction.SIGHASH_ALL]);
|
|
117
|
+
assertCurrent();
|
|
118
|
+
const partial = psbt.data.inputs[i].partialSig;
|
|
119
|
+
if (!partial ||
|
|
120
|
+
partial.length !== 1 ||
|
|
121
|
+
!equal(partial[0].pubkey, pubkey) ||
|
|
122
|
+
bitcoinjs_lib_1.script.signature.decode(partial[0].signature).hashType !==
|
|
123
|
+
bitcoinjs_lib_1.Transaction.SIGHASH_ALL ||
|
|
124
|
+
psbt.validateSignaturesOfInput(i, (key, hash, signature) => equal(key, pubkey) && secp256k1_1.default.verify(hash, key, signature, true), pubkey) !== true)
|
|
125
|
+
return (0, bip84_native_plan_1.fail)('SIGNATURE_INVALID');
|
|
126
|
+
}
|
|
127
|
+
// Verify change from the private-derived account as well as the public plan.
|
|
128
|
+
if (plan.change) {
|
|
129
|
+
assertCurrent();
|
|
130
|
+
const branch = accountNode.neutered().derive(1);
|
|
131
|
+
if (branch.index !== 1)
|
|
132
|
+
return (0, bip84_native_plan_1.fail)('ACCOUNT_MISMATCH');
|
|
133
|
+
const child = branch.derive(plan.change.index);
|
|
134
|
+
if (child.index !== plan.change.index)
|
|
135
|
+
return (0, bip84_native_plan_1.fail)('ACCOUNT_MISMATCH');
|
|
136
|
+
const payment = bitcoinjs_lib_1.payments.p2wpkh({
|
|
137
|
+
pubkey: child.publicKey,
|
|
138
|
+
network: profile.addressNetwork,
|
|
139
|
+
});
|
|
140
|
+
if (!payment.output || !equal(payment.output, psbt.txOutputs[1].script))
|
|
141
|
+
return (0, bip84_native_plan_1.fail)('INPUT_MISMATCH');
|
|
142
|
+
}
|
|
143
|
+
if (psbt.toBuffer().length > bip84_native_plan_1.LIMITS.psbtBytes)
|
|
144
|
+
return (0, bip84_native_plan_1.fail)('LIMIT_EXCEEDED');
|
|
145
|
+
assertCurrent();
|
|
146
|
+
for (let i = 0; i < plan.inputs.length; i++) {
|
|
147
|
+
psbt.finalizeInput(i);
|
|
148
|
+
const input = psbt.data.inputs[i];
|
|
149
|
+
if (!(input.finalScriptWitness instanceof Uint8Array) ||
|
|
150
|
+
input.finalScriptWitness.length === 0 ||
|
|
151
|
+
(input.finalScriptSig !== undefined && input.finalScriptSig.length > 0))
|
|
152
|
+
return (0, bip84_native_plan_1.fail)('SIGNATURE_INVALID');
|
|
153
|
+
}
|
|
154
|
+
if (psbt.toBuffer().length > bip84_native_plan_1.LIMITS.psbtBytes)
|
|
155
|
+
return (0, bip84_native_plan_1.fail)('LIMIT_EXCEEDED');
|
|
156
|
+
assertCurrent();
|
|
157
|
+
// SJS overrides fee/extraction helpers. Their success is not our fee proof.
|
|
158
|
+
const bytes = psbt.extractTransaction().toBuffer();
|
|
159
|
+
if (bytes.length > bip84_native_plan_1.LIMITS.signedBytes)
|
|
160
|
+
return (0, bip84_native_plan_1.fail)('LIMIT_EXCEEDED');
|
|
161
|
+
const transaction = bitcoinjs_lib_1.Transaction.fromBuffer(bytes);
|
|
162
|
+
if (!equal(transaction.toBuffer(), bytes) ||
|
|
163
|
+
transaction.ins.length !== plan.inputs.length)
|
|
164
|
+
return (0, bip84_native_plan_1.fail)('SIGNATURE_INVALID');
|
|
165
|
+
for (const [i, input] of transaction.ins.entries()) {
|
|
166
|
+
assertCurrent();
|
|
167
|
+
if (input.script.length !== 0 ||
|
|
168
|
+
input.witness.length !== 2 ||
|
|
169
|
+
!equal(input.witness[1], publicKeys[i]))
|
|
170
|
+
return (0, bip84_native_plan_1.fail)('SIGNATURE_INVALID');
|
|
171
|
+
const signature = bitcoinjs_lib_1.script.signature.decode(input.witness[0]);
|
|
172
|
+
const scriptCode = bitcoinjs_lib_1.payments.p2pkh({ pubkey: publicKeys[i] }).output;
|
|
173
|
+
if (signature.hashType !== bitcoinjs_lib_1.Transaction.SIGHASH_ALL ||
|
|
174
|
+
!scriptCode ||
|
|
175
|
+
!equal(bitcoinjs_lib_1.script.signature.encode(signature.signature, signature.hashType), input.witness[0]) ||
|
|
176
|
+
!secp256k1_1.default.verify(transaction.hashForWitnessV0(i, scriptCode, previousOutputs[i].value, bitcoinjs_lib_1.Transaction.SIGHASH_ALL), publicKeys[i], signature.signature, true))
|
|
177
|
+
return (0, bip84_native_plan_1.fail)('SIGNATURE_INVALID');
|
|
178
|
+
}
|
|
179
|
+
const unsigned = transaction.clone();
|
|
180
|
+
unsigned.stripWitnesses();
|
|
181
|
+
if (unsigned.toHex() !== prepared.unsignedTransaction)
|
|
182
|
+
return (0, bip84_native_plan_1.fail)('SIGNATURE_INVALID');
|
|
183
|
+
const fee = previousOutputs.reduce((sum, output) => sum + output.value, 0n) -
|
|
184
|
+
transaction.outs.reduce((sum, output) => sum + output.value, 0n);
|
|
185
|
+
const virtualSize = transaction.virtualSize();
|
|
186
|
+
if (fee < 0n ||
|
|
187
|
+
fee.toString() !== prepared.feeSatoshis ||
|
|
188
|
+
fee > bip84_native_plan_1.LIMITS.maxFee ||
|
|
189
|
+
fee > BigInt(plan.feeLimits.maxFeeSatoshis) ||
|
|
190
|
+
!Number.isSafeInteger(virtualSize) ||
|
|
191
|
+
virtualSize <= 0 ||
|
|
192
|
+
fee > BigInt(virtualSize) * bip84_native_plan_1.LIMITS.maxFeeRate ||
|
|
193
|
+
fee > BigInt(virtualSize) * BigInt(plan.feeLimits.maxFeeRateSatPerVByte))
|
|
194
|
+
return (0, bip84_native_plan_1.fail)('FEE_LIMIT');
|
|
195
|
+
assertCurrent();
|
|
196
|
+
return Object.freeze({
|
|
197
|
+
rawTransaction: transaction.toHex(),
|
|
198
|
+
txid: transaction.getId(),
|
|
199
|
+
wtxid: Buffer.from(transaction.getHash(true)).reverse().toString('hex'),
|
|
200
|
+
unsignedTransaction: prepared.unsignedTransaction,
|
|
201
|
+
feeSatoshis: fee.toString(),
|
|
202
|
+
virtualSize,
|
|
203
|
+
});
|
|
204
|
+
}
|
|
205
|
+
catch (error) {
|
|
206
|
+
if (error instanceof bip84_native_plan_1.Bip84NativeError)
|
|
207
|
+
throw error;
|
|
208
|
+
return (0, bip84_native_plan_1.fail)('SIGNATURE_INVALID');
|
|
209
|
+
}
|
|
210
|
+
finally {
|
|
211
|
+
clearBip84PrivateNodes(nodes);
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
//# sourceMappingURL=prepared-bip84.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prepared-bip84.js","sourceRoot":"","sources":["../../../src/transactions/prepared-bip84.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.snapshotPreparedEvmRequest = snapshotPreparedEvmRequest;
|
|
4
|
+
exports.preparedEvmGuard = preparedEvmGuard;
|
|
5
|
+
exports.signPreparedEvmEnvelope = signPreparedEvmEnvelope;
|
|
6
|
+
const address_1 = require("ethers/address");
|
|
7
|
+
const crypto_1 = require("ethers/crypto");
|
|
8
|
+
const transaction_1 = require("ethers/transaction");
|
|
9
|
+
const evm_local_signer_1 = require("./evm-local-signer");
|
|
10
|
+
const UINT256 = (1n << 256n) - 1n;
|
|
11
|
+
const UINT64 = (1n << 64n) - 1n;
|
|
12
|
+
const MAX_DATA_BYTES = 16 * 1024;
|
|
13
|
+
const invalid = () => new TypeError('Invalid prepared EVM signing request');
|
|
14
|
+
/** Snapshot values without invoking accessors or accepting hidden fields. */
|
|
15
|
+
function record(value, keys) {
|
|
16
|
+
if (!value || typeof value !== 'object' || Array.isArray(value))
|
|
17
|
+
throw invalid();
|
|
18
|
+
const prototype = Object.getPrototypeOf(value);
|
|
19
|
+
if (prototype !== Object.prototype && prototype !== null)
|
|
20
|
+
throw invalid();
|
|
21
|
+
const names = Reflect.ownKeys(value);
|
|
22
|
+
if (names.length !== keys.length ||
|
|
23
|
+
names.some((key) => typeof key !== 'string' || !keys.includes(key)))
|
|
24
|
+
throw invalid();
|
|
25
|
+
const result = Object.create(null);
|
|
26
|
+
for (const key of keys) {
|
|
27
|
+
const descriptor = Object.getOwnPropertyDescriptor(value, key);
|
|
28
|
+
if (!descriptor ||
|
|
29
|
+
!descriptor.enumerable ||
|
|
30
|
+
!Object.prototype.hasOwnProperty.call(descriptor, 'value'))
|
|
31
|
+
throw invalid();
|
|
32
|
+
result[key] = descriptor.value;
|
|
33
|
+
}
|
|
34
|
+
return result;
|
|
35
|
+
}
|
|
36
|
+
function quantity(value, maximum = UINT256, positive = false) {
|
|
37
|
+
if (typeof value !== 'string' || !/^(0|[1-9][0-9]{0,77})$/.test(value))
|
|
38
|
+
throw invalid();
|
|
39
|
+
const parsed = BigInt(value);
|
|
40
|
+
if (parsed > maximum || (positive && parsed === 0n))
|
|
41
|
+
throw invalid();
|
|
42
|
+
return value;
|
|
43
|
+
}
|
|
44
|
+
function address(value) {
|
|
45
|
+
if (typeof value !== 'string' || !/^0x[0-9a-fA-F]{40}$/.test(value))
|
|
46
|
+
throw invalid();
|
|
47
|
+
let canonical;
|
|
48
|
+
try {
|
|
49
|
+
canonical = (0, address_1.getAddress)(value);
|
|
50
|
+
}
|
|
51
|
+
catch {
|
|
52
|
+
throw invalid();
|
|
53
|
+
}
|
|
54
|
+
if (/^0x0{40}$/i.test(canonical))
|
|
55
|
+
throw invalid();
|
|
56
|
+
return canonical;
|
|
57
|
+
}
|
|
58
|
+
function snapshotPreparedEvmRequest(input) {
|
|
59
|
+
const root = record(input, ['account', 'network', 'transaction']);
|
|
60
|
+
const account = record(root.account, ['id', 'type', 'expectedAddress']);
|
|
61
|
+
if (!Number.isSafeInteger(account.id) ||
|
|
62
|
+
account.id < 0 ||
|
|
63
|
+
account.id > 0x7fffffff ||
|
|
64
|
+
(account.type !== 'HDAccount' && account.type !== 'Imported'))
|
|
65
|
+
throw invalid();
|
|
66
|
+
const network = record(root.network, ['kind', 'chainId', 'slip44', 'url']);
|
|
67
|
+
if (network.kind !== 'ethereum' ||
|
|
68
|
+
network.slip44 !== 60 ||
|
|
69
|
+
typeof network.url !== 'string' ||
|
|
70
|
+
!network.url ||
|
|
71
|
+
network.url.length > 4096 ||
|
|
72
|
+
network.url.trim() !== network.url ||
|
|
73
|
+
// eslint-disable-next-line no-control-regex -- Reject endpoint control characters and lone surrogates.
|
|
74
|
+
/[\uD800-\uDFFF\u0000-\u001f\u007f]/u.test(network.url))
|
|
75
|
+
throw invalid();
|
|
76
|
+
const chainId = quantity(network.chainId, UINT256, true);
|
|
77
|
+
// Read the discriminator from a data property before choosing the exact schema.
|
|
78
|
+
if (!root.transaction || typeof root.transaction !== 'object')
|
|
79
|
+
throw invalid();
|
|
80
|
+
const typeDescriptor = Object.getOwnPropertyDescriptor(root.transaction, 'type');
|
|
81
|
+
if (!typeDescriptor ||
|
|
82
|
+
!Object.prototype.hasOwnProperty.call(typeDescriptor, 'value'))
|
|
83
|
+
throw invalid();
|
|
84
|
+
const type = typeDescriptor.value;
|
|
85
|
+
if (type !== 0 && type !== 2)
|
|
86
|
+
throw invalid();
|
|
87
|
+
const fields = [
|
|
88
|
+
'type',
|
|
89
|
+
'from',
|
|
90
|
+
'to',
|
|
91
|
+
'chainId',
|
|
92
|
+
'nonce',
|
|
93
|
+
'value',
|
|
94
|
+
'gasLimit',
|
|
95
|
+
'data',
|
|
96
|
+
];
|
|
97
|
+
const transaction = record(root.transaction, type === 0
|
|
98
|
+
? [...fields, 'gasPrice']
|
|
99
|
+
: [...fields, 'maxFeePerGas', 'maxPriorityFeePerGas']);
|
|
100
|
+
const from = address(transaction.from);
|
|
101
|
+
const expectedAddress = address(account.expectedAddress);
|
|
102
|
+
if (from !== expectedAddress ||
|
|
103
|
+
quantity(transaction.chainId, UINT256, true) !== chainId)
|
|
104
|
+
throw invalid();
|
|
105
|
+
if (typeof transaction.data !== 'string' ||
|
|
106
|
+
transaction.data.length > 2 + 2 * MAX_DATA_BYTES ||
|
|
107
|
+
!/^0x(?:[0-9a-fA-F]{2})*$/.test(transaction.data))
|
|
108
|
+
throw invalid();
|
|
109
|
+
const common = {
|
|
110
|
+
from,
|
|
111
|
+
to: address(transaction.to),
|
|
112
|
+
chainId,
|
|
113
|
+
nonce: quantity(transaction.nonce, BigInt(Number.MAX_SAFE_INTEGER)),
|
|
114
|
+
value: quantity(transaction.value),
|
|
115
|
+
gasLimit: quantity(transaction.gasLimit, UINT64, true),
|
|
116
|
+
data: transaction.data.toLowerCase(),
|
|
117
|
+
};
|
|
118
|
+
const fees = type === 0
|
|
119
|
+
? { type: 0, gasPrice: quantity(transaction.gasPrice) }
|
|
120
|
+
: {
|
|
121
|
+
type: 2,
|
|
122
|
+
maxFeePerGas: quantity(transaction.maxFeePerGas),
|
|
123
|
+
maxPriorityFeePerGas: quantity(transaction.maxPriorityFeePerGas),
|
|
124
|
+
};
|
|
125
|
+
if (fees.type === 2 &&
|
|
126
|
+
BigInt(fees.maxPriorityFeePerGas) > BigInt(fees.maxFeePerGas))
|
|
127
|
+
throw invalid();
|
|
128
|
+
const maximumFee = BigInt(common.gasLimit) *
|
|
129
|
+
BigInt(fees.type === 0 ? fees.gasPrice : fees.maxFeePerGas);
|
|
130
|
+
if (maximumFee + BigInt(common.value) > UINT256)
|
|
131
|
+
throw invalid();
|
|
132
|
+
return Object.freeze({
|
|
133
|
+
account: Object.freeze({
|
|
134
|
+
id: account.id,
|
|
135
|
+
type: account.type,
|
|
136
|
+
expectedAddress,
|
|
137
|
+
}),
|
|
138
|
+
network: Object.freeze({
|
|
139
|
+
kind: 'ethereum',
|
|
140
|
+
chainId,
|
|
141
|
+
slip44: 60,
|
|
142
|
+
url: network.url,
|
|
143
|
+
}),
|
|
144
|
+
transaction: Object.freeze({ ...common, ...fees }),
|
|
145
|
+
});
|
|
146
|
+
}
|
|
147
|
+
function preparedEvmGuard(input) {
|
|
148
|
+
const options = record(input, ['assertCurrent']);
|
|
149
|
+
if (typeof options.assertCurrent !== 'function')
|
|
150
|
+
throw invalid();
|
|
151
|
+
const guard = options.assertCurrent;
|
|
152
|
+
return () => {
|
|
153
|
+
const result = guard();
|
|
154
|
+
if (result !== undefined) {
|
|
155
|
+
// Consume a rejected async guard without allowing it to authorize signing.
|
|
156
|
+
if (result !== null &&
|
|
157
|
+
(typeof result === 'object' || typeof result === 'function'))
|
|
158
|
+
void Promise.resolve(result).catch(() => undefined);
|
|
159
|
+
throw new TypeError('Prepared EVM signing guard must return undefined synchronously');
|
|
160
|
+
}
|
|
161
|
+
};
|
|
162
|
+
}
|
|
163
|
+
/** Internal, network-free signing. The key never becomes part of the result. */
|
|
164
|
+
function signPreparedEvmEnvelope(transaction, privateKey) {
|
|
165
|
+
const unsigned = {
|
|
166
|
+
type: transaction.type,
|
|
167
|
+
to: transaction.to,
|
|
168
|
+
chainId: BigInt(transaction.chainId),
|
|
169
|
+
nonce: Number(transaction.nonce),
|
|
170
|
+
value: BigInt(transaction.value),
|
|
171
|
+
gasLimit: BigInt(transaction.gasLimit),
|
|
172
|
+
data: transaction.data,
|
|
173
|
+
...(transaction.type === 0
|
|
174
|
+
? { gasPrice: BigInt(transaction.gasPrice) }
|
|
175
|
+
: {
|
|
176
|
+
maxFeePerGas: BigInt(transaction.maxFeePerGas),
|
|
177
|
+
maxPriorityFeePerGas: BigInt(transaction.maxPriorityFeePerGas),
|
|
178
|
+
}),
|
|
179
|
+
};
|
|
180
|
+
const expected = transaction_1.Transaction.from(unsigned);
|
|
181
|
+
const rawTransaction = (0, evm_local_signer_1.signTransaction)(unsigned, privateKey);
|
|
182
|
+
const signed = transaction_1.Transaction.from(rawTransaction);
|
|
183
|
+
if (!signed.isSigned() ||
|
|
184
|
+
signed.from !== transaction.from ||
|
|
185
|
+
signed.unsignedSerialized !== expected.unsignedSerialized ||
|
|
186
|
+
signed.unsignedHash !== expected.unsignedHash ||
|
|
187
|
+
signed.hash !== (0, crypto_1.keccak256)(rawTransaction))
|
|
188
|
+
throw new Error('Prepared EVM signature does not match requested transaction');
|
|
189
|
+
return Object.freeze({
|
|
190
|
+
rawTransaction,
|
|
191
|
+
hash: signed.hash,
|
|
192
|
+
unsignedHash: signed.unsignedHash,
|
|
193
|
+
from: signed.from,
|
|
194
|
+
transaction,
|
|
195
|
+
});
|
|
196
|
+
}
|
|
197
|
+
//# sourceMappingURL=prepared-evm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prepared-evm.js","sourceRoot":"","sources":["../../../src/transactions/prepared-evm.ts"],"names":[],"mappings":"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"}
|