@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.
Files changed (131) hide show
  1. package/CHANGELOG.md +30 -0
  2. package/README.md +174 -0
  3. package/cjs/bip84-native.js +8 -0
  4. package/cjs/bip84-native.js.map +1 -0
  5. package/cjs/hardware-wallet-manager.js +302 -128
  6. package/cjs/hardware-wallet-manager.js.map +1 -1
  7. package/cjs/keyring-core.js +319 -0
  8. package/cjs/keyring-core.js.map +1 -1
  9. package/cjs/keyring-manager.js +9 -3
  10. package/cjs/keyring-manager.js.map +1 -1
  11. package/cjs/ledger/bitcoin_client/lib/appClient.js.map +1 -1
  12. package/cjs/ledger/host-types.js +10 -0
  13. package/cjs/ledger/host-types.js.map +1 -0
  14. package/cjs/ledger/index.js +243 -447
  15. package/cjs/ledger/index.js.map +1 -1
  16. package/cjs/ledger/prepare-psbt.js +177 -0
  17. package/cjs/ledger/prepare-psbt.js.map +1 -0
  18. package/cjs/public-bip84.js +157 -0
  19. package/cjs/public-bip84.js.map +1 -0
  20. package/cjs/software-hd-account.js +23 -0
  21. package/cjs/software-hd-account.js.map +1 -0
  22. package/cjs/software-utxo-account.js +12 -0
  23. package/cjs/software-utxo-account.js.map +1 -0
  24. package/cjs/software.js +24 -0
  25. package/cjs/software.js.map +1 -1
  26. package/cjs/transactions/bip84-native-plan.js +481 -0
  27. package/cjs/transactions/bip84-native-plan.js.map +1 -0
  28. package/cjs/transactions/ethereum.js +55 -10
  29. package/cjs/transactions/ethereum.js.map +1 -1
  30. package/cjs/transactions/hardware-psbt.js +36 -44
  31. package/cjs/transactions/hardware-psbt.js.map +1 -1
  32. package/cjs/transactions/prepared-bip84.js +214 -0
  33. package/cjs/transactions/prepared-bip84.js.map +1 -0
  34. package/cjs/transactions/prepared-evm.js +197 -0
  35. package/cjs/transactions/prepared-evm.js.map +1 -0
  36. package/cjs/trezor/connect.js +243 -0
  37. package/cjs/trezor/connect.js.map +1 -0
  38. package/cjs/trezor/index.js +96 -58
  39. package/cjs/trezor/index.js.map +1 -1
  40. package/cjs/trezor/witness.js +25 -0
  41. package/cjs/trezor/witness.js.map +1 -0
  42. package/cjs/utils/psbt-account-scope.js +5 -3
  43. package/cjs/utils/psbt-account-scope.js.map +1 -1
  44. package/esm/errorUtils.js +72 -0
  45. package/esm/errorUtils.js.map +1 -0
  46. package/esm/ethers-v6.js +207 -0
  47. package/esm/ethers-v6.js.map +1 -0
  48. package/esm/hardware-wallet-manager.js +643 -0
  49. package/esm/hardware-wallet-manager.js.map +1 -0
  50. package/esm/ledger/bitcoin_client/lib/appClient.js +279 -0
  51. package/esm/ledger/bitcoin_client/lib/appClient.js.map +1 -0
  52. package/esm/ledger/bitcoin_client/lib/bip32.js +49 -0
  53. package/esm/ledger/bitcoin_client/lib/bip32.js.map +1 -0
  54. package/esm/ledger/bitcoin_client/lib/buffertools.js +119 -0
  55. package/esm/ledger/bitcoin_client/lib/buffertools.js.map +1 -0
  56. package/esm/ledger/bitcoin_client/lib/clientCommands.js +269 -0
  57. package/esm/ledger/bitcoin_client/lib/clientCommands.js.map +1 -0
  58. package/esm/ledger/bitcoin_client/lib/merkelizedPsbt.js +50 -0
  59. package/esm/ledger/bitcoin_client/lib/merkelizedPsbt.js.map +1 -0
  60. package/esm/ledger/bitcoin_client/lib/merkle.js +111 -0
  61. package/esm/ledger/bitcoin_client/lib/merkle.js.map +1 -0
  62. package/esm/ledger/bitcoin_client/lib/merkleMap.js +42 -0
  63. package/esm/ledger/bitcoin_client/lib/merkleMap.js.map +1 -0
  64. package/esm/ledger/bitcoin_client/lib/policy.js +68 -0
  65. package/esm/ledger/bitcoin_client/lib/policy.js.map +1 -0
  66. package/esm/ledger/bitcoin_client/lib/psbtv2.js +645 -0
  67. package/esm/ledger/bitcoin_client/lib/psbtv2.js.map +1 -0
  68. package/esm/ledger/bitcoin_client/lib/varint.js +108 -0
  69. package/esm/ledger/bitcoin_client/lib/varint.js.map +1 -0
  70. package/esm/ledger/consts.js +4 -0
  71. package/esm/ledger/consts.js.map +1 -0
  72. package/esm/ledger/dmk-evm.js +258 -0
  73. package/esm/ledger/dmk-evm.js.map +1 -0
  74. package/esm/ledger/dmk-session.js +264 -0
  75. package/esm/ledger/dmk-session.js.map +1 -0
  76. package/esm/ledger/dmk-utxo.js +279 -0
  77. package/esm/ledger/dmk-utxo.js.map +1 -0
  78. package/esm/ledger/host-types.js +5 -0
  79. package/esm/ledger/host-types.js.map +1 -0
  80. package/esm/ledger/index.js +268 -0
  81. package/esm/ledger/index.js.map +1 -0
  82. package/esm/ledger/prepare-psbt.js +141 -0
  83. package/esm/ledger/prepare-psbt.js.map +1 -0
  84. package/esm/ledger/types.js +2 -0
  85. package/esm/ledger/types.js.map +1 -0
  86. package/esm/ledger-host.js +36 -0
  87. package/esm/ledger-host.js.map +1 -0
  88. package/esm/private-records.js +153 -0
  89. package/esm/private-records.js.map +1 -0
  90. package/esm/providers.js +588 -0
  91. package/esm/providers.js.map +1 -0
  92. package/esm/signers.js +28 -0
  93. package/esm/signers.js.map +1 -0
  94. package/esm/trezor/connect.js +206 -0
  95. package/esm/trezor/connect.js.map +1 -0
  96. package/esm/trezor/index.js +876 -0
  97. package/esm/trezor/index.js.map +1 -0
  98. package/esm/trezor/witness.js +21 -0
  99. package/esm/trezor/witness.js.map +1 -0
  100. package/esm/types.js +17 -0
  101. package/esm/types.js.map +1 -0
  102. package/esm/utils/derivation-paths.js +109 -0
  103. package/esm/utils/derivation-paths.js.map +1 -0
  104. package/esm/utils/psbt-account-scope.js +310 -0
  105. package/esm/utils/psbt-account-scope.js.map +1 -0
  106. package/package.json +34 -9
  107. package/types/bip84-native.d.ts +3 -0
  108. package/types/hardware-wallet-manager.d.ts +12 -19
  109. package/types/keyring-core.d.ts +14 -0
  110. package/types/keyring-manager.d.ts +2 -1
  111. package/types/ledger/bitcoin_client/lib/appClient.d.ts +6 -3
  112. package/types/ledger/dmk-evm.d.ts +8 -0
  113. package/types/ledger/dmk-session.d.ts +60 -0
  114. package/types/ledger/dmk-utxo.d.ts +26 -0
  115. package/types/ledger/host-types.d.ts +131 -0
  116. package/types/ledger/index.d.ts +21 -58
  117. package/types/ledger/prepare-psbt.d.ts +3 -0
  118. package/types/ledger/types.d.ts +3 -0
  119. package/types/ledger-host.d.ts +7 -0
  120. package/types/public-bip84.d.ts +39 -0
  121. package/types/software-hd-account.d.ts +16 -0
  122. package/types/software-utxo-account.d.ts +13 -0
  123. package/types/software.d.ts +26 -0
  124. package/types/transactions/bip84-native-plan.d.ts +83 -0
  125. package/types/transactions/ethereum.d.ts +1 -1
  126. package/types/transactions/prepared-bip84.d.ts +27 -0
  127. package/types/transactions/prepared-evm.d.ts +53 -0
  128. package/types/trezor/connect.d.ts +42 -0
  129. package/types/trezor/index.d.ts +22 -4
  130. package/types/trezor/witness.d.ts +3 -0
  131. 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 policy_1 = require("../ledger/bitcoin_client/lib/policy");
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?.convertToLedgerFormat !== 'function' ||
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
- const enhancedPsbt = await ledger.convertToLedgerFormat(psbt, accountXpub, accountId, activeNetwork.currency, activeNetwork.slip44);
90
- assertCurrent();
91
- (0, psbt_account_scope_1.assertPsbtAccountScope)(enhancedPsbt, scope);
92
- // Get wallet policy for Ledger
93
- const fingerprint = await ledger.ledgerUtxoClient.getMasterFingerprint();
94
- const hdPath = (0, derivation_paths_1.getAccountDerivationPath)(activeNetwork.currency, activeNetwork.slip44, accountId);
95
- // For policy key preimages, match what the currently-open Ledger app expects.
96
- // Prefer the device-reported extended pubkey for this path (silent), and only fall back
97
- // to converting the stored xpub/vpub/zpub if needed.
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 signatureEntries = await ledger.ledgerUtxoClient.signPsbt(psbtV2, walletPolicy, hmac);
121
- assertCurrent();
122
- signatureEntries.forEach(([inputIndex, partialSig]) => {
123
- const input = enhancedPsbt.data.inputs[inputIndex];
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(Buffer.from(partialSig.pubkey)))) {
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
- enhancedPsbt.updateInput(inputIndex, {
131
- partialSig: [partialSig],
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":";;AAmBA,wDAmMC;AAGD,wDA+BC;AAxPD,+DAA6D;AAE7D,iDAGwB;AACxB,gEAAmE;AACnE,gEAA6D;AAC7D,6CAA8C;AAC9C,gEAGmC;AACnC,oEAAqE;AAKrE,+EAA+E;AAC/E,SAAgB,sBAAsB,CACpC,MAAqB;IAErB,OAAO,KAAK,EAAE,EACZ,IAAI,EACJ,OAAO,EACP,OAAO,EAAE,aAAa,EACtB,KAAK,EACL,aAAa,EACb,iBAAiB,GAClB,EAAE,EAAE;QACH,IACE,OAAO,MAAM,EAAE,qBAAqB,KAAK,UAAU;YACnD,OAAO,iBAAiB,KAAK,UAAU,EACvC,CAAC;YACD,MAAM,IAAA,mDAAoC,EAAC,QAAQ,CAAC,CAAC;QACvD,CAAC;QACD,qDAAqD;QACrD,MAAM,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;QACjC,MAAM,SAAS,GAAG,OAAO,CAAC,EAAE,CAAC;QAE7B,2DAA2D;QAC3D,MAAM,YAAY,GAAG,aAAa,CAAC,GAAG,CAAC;QAEvC,8EAA8E;QAC9E,8EAA8E;QAC9E,MAAM,OAAO,GAAQ,IAAW,CAAC;QACjC,MAAM,UAAU,GAAsB,OAAO,EAAE,IAAI,EAAE,MAAM,CAAC;QAC5D,MAAM,QAAQ,GAAsB,OAAO,EAAE,QAAQ,CAAC;QACtD,IACE,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC;YACzB,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC;YACvB,QAAQ,CAAC,MAAM,GAAG,CAAC,EACnB,CAAC;YACD,4DAA4D;YAC5D,MAAM,eAAe,GAAG,QAAQ,CAAC,GAAG,CAAC,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE;gBAC7D,IAAI,CAAC;oBACH,6DAA6D;oBAC7D,+DAA+D;oBAC/D,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC;oBAChC,IACE,KAAK,EAAE,cAAc;wBACrB,CAAC,KAAK,EAAE,WAAW;4BACjB,CAAC,KAAK,CAAC,cAAc,IAAI,KAAK,CAAC,kBAAkB,CAAC,CAAC;wBAErD,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;oBAClC,MAAM,EAAE,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;oBAC3B,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;oBAEhE,4BAA4B;oBAC5B,MAAM,aAAa,GAAG,MAAM,iBAAiB,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC;oBAEtE,yFAAyF;oBACzF,IAAI,QAAgB,CAAC;oBACrB,IAAI,OAAO,aAAa,KAAK,QAAQ,EAAE,CAAC;wBACtC,QAAQ,GAAG,aAAa,CAAC;oBAC3B,CAAC;yBAAM,IACL,aAAa;wBACb,OAAO,aAAa,KAAK,QAAQ;wBACjC,KAAK,IAAI,aAAa,EACtB,CAAC;wBACD,QAAQ,GAAI,aAAqB,CAAC,GAAG,CAAC;oBACxC,CAAC;yBAAM,IACL,aAAa;wBACb,OAAO,aAAa,KAAK,QAAQ;wBACjC,QAAQ,IAAI,aAAa,EACzB,CAAC;wBACD,QAAQ,GAAI,aAAqB,CAAC,MAAM,CAAC;oBAC3C,CAAC;yBAAM,CAAC;wBACN,MAAM,IAAI,KAAK,CACb,+BAA+B,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,EAAE,CAC/D,CAAC;oBACJ,CAAC;oBAED,IAAI,CAAC,QAAQ,IAAI,OAAO,QAAQ,KAAK,QAAQ,EAAE,CAAC;wBAC9C,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC;oBAC1D,CAAC;oBAED,wCAAwC;oBACxC,MAAM,cAAc,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;oBACpD,IAAI,cAAc,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;wBAChC,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC;oBAC/C,CAAC;oBAED,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,EAAE,cAAc,EAAE,CAAC,CAAC;oBAC5C,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;gBAClC,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,OAAO,CAAC,KAAK,CAAC,mCAAmC,KAAK,GAAG,EAAE,KAAK,CAAC,CAAC;oBAClE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;gBAC1C,CAAC;YACH,CAAC,CAAC,CAAC;YAEH,qCAAqC;YACrC,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;YACnD,MAAM,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;YAEvD,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC5B,MAAM,IAAI,KAAK,CACb,oBAAoB,YAAY,CAAC,MAAM,OAAO,OAAO,CAAC,MAAM,+BAA+B;oBACzF,+CAA+C,CAClD,CAAC;YACJ,CAAC;QACH,CAAC;QAED,aAAa,EAAE,CAAC;QAChB,MAAM,YAAY,GAAG,MAAM,MAAM,CAAC,qBAAqB,CACrD,IAAI,EACJ,WAAW,EACX,SAAS,EACT,aAAa,CAAC,QAAQ,EACtB,aAAa,CAAC,MAAM,CACrB,CAAC;QACF,aAAa,EAAE,CAAC;QAChB,IAAA,2CAAsB,EAAC,YAAY,EAAE,KAAK,CAAC,CAAC;QAE5C,+BAA+B;QAC/B,MAAM,WAAW,GAAG,MAAM,MAAM,CAAC,gBAAgB,CAAC,oBAAoB,EAAE,CAAC;QAEzE,MAAM,MAAM,GAAG,IAAA,2CAAwB,EACrC,aAAa,CAAC,QAAQ,EACtB,aAAa,CAAC,MAAM,EACpB,SAAS,CACV,CAAC;QAEF,8EAA8E;QAC9E,wFAAwF;QACxF,qDAAqD;QACrD,IAAI,UAAU,GAAkB,IAAI,CAAC;QACrC,IAAI,CAAC;YACH,UAAU,GAAG,MAAM,MAAM,CAAC,gBAAgB,CAAC,iBAAiB,CAC1D,MAAM,EACN,KAAK,CACN,CAAC;QACJ,CAAC;QAAC,OAAO,EAAE,EAAE,CAAC;YACZ,0BAA0B;QAC5B,CAAC;QAED,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,MAAM,iBAAiB,GACrB,aAAa,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC;YACvD,UAAU,GAAG,IAAA,4CAAyB,EAAC,WAAW,EAAE,iBAAiB,CAAC,CAAC;QACzE,CAAC;QAED,MAAM,kBAAkB,GAAG,IAAI,MAAM,IAAI,UAAU,EAAE,CAAC,OAAO,CAC3D,GAAG,EACH,WAAW,CACZ,CAAC;QACF,MAAM,YAAY,GAAG,IAAI,qBAAY,CACnC,aAAa,CAAC,QAAQ,CAAC,WAAW,EAAE,EACpC,mBAAiB,EACjB,CAAC,kBAAkB,CAAC,CACrB,CAAC;QAEF,qEAAqE;QACrE,IAAI,IAAI,GAAkB,IAAI,CAAC;QAC/B,IAAI,OAAQ,MAAc,CAAC,iBAAiB,KAAK,UAAU,EAAE,CAAC;YAC5D,IAAI,GAAG,MAAO,MAAc,CAAC,iBAAiB,CAAC,YAAY,EAAE,WAAW,CAAC,CAAC;QAC5E,CAAC;QAED,iFAAiF;QACjF,MAAM,MAAM,GAAG,IAAI,eAAM,EAAE,CAAC,aAAa,CAAC,YAAY,CAAC,CAAC;QACxD,aAAa,EAAE,CAAC;QAChB,IAAA,2CAAsB,EAAC,YAAY,EAAE,KAAK,CAAC,CAAC;QAC5C,MAAM,gBAAgB,GAAG,MAAM,MAAM,CAAC,gBAAgB,CAAC,QAAQ,CAC7D,MAAM,EACN,YAAY,EACZ,IAAI,CACL,CAAC;QACF,aAAa,EAAE,CAAC;QAEhB,gBAAgB,CAAC,OAAO,CAAC,CAAC,CAAC,UAAU,EAAE,UAAU,CAAC,EAAE,EAAE;YACpD,MAAM,KAAK,GAAG,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;YACnD,IACE,CAAC,KAAK;gBACN,KAAK,CAAC,cAAc;gBACpB,KAAK,CAAC,kBAAkB;gBACxB,CAAC,KAAK,CAAC,eAAe,EAAE,IAAI,CAAC,CAAC,UAAU,EAAE,EAAE,CAC1C,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CACtE,EACD,CAAC;gBACD,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC;YAChE,CAAC;YACD,YAAY,CAAC,WAAW,CAAC,UAAU,EAAE;gBACnC,UAAU,EAAE,CAAC,UAAU,CAAC;aACzB,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,sEAAsE;QACtE,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE;YAChD,IAAI,CAAC,KAAK,CAAC,cAAc,IAAI,CAAC,KAAK,CAAC,kBAAkB;gBACpD,YAAY,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QACtC,CAAC,CAAC,CAAC;QAEH,OAAO,YAAY,CAAC;IACtB,CAAC,CAAC;AACJ,CAAC;AAED,iFAAiF;AACjF,SAAgB,sBAAsB,CACpC,MAAqB;IAErB,OAAO,KAAK,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,EAAE,EAAE;QAC/D,IACE,OAAO,MAAM,EAAE,qBAAqB,KAAK,UAAU;YACnD,OAAO,MAAM,EAAE,mBAAmB,KAAK,UAAU,EACjD,CAAC;YACD,MAAM,IAAA,mDAAoC,EAAC,QAAQ,CAAC,CAAC;QACvD,CAAC;QACD,iCAAiC;QACjC,uCAAuC;QACvC,MAAM,aAAa,GAAG,IAAA,kCAAgB,EACpC,aAAa,CAAC,MAAM,EACpB,aAAa,CAAC,QAAQ,CACvB,CAAC;QACF,MAAM,SAAS,GAAG,aAAa,CAAC,MAAM,KAAK,CAAC,CAAC;QAC7C,MAAM,gBAAgB,GAAG,SAAS;YAChC,CAAC,CAAC,aAAa,EAAE,QAAQ,EAAE,OAAO;YAClC,CAAC,CAAC,aAAa,EAAE,QAAQ,EAAE,OAAO,CAAC;QAErC,MAAM,QAAQ,GAAG,MAAM,CAAC,qBAAqB,CAAC;YAC5C,IAAI;YACJ,IAAI,EAAE,aAAa,CAAC,QAAQ,CAAC,WAAW,EAAE;YAC1C,OAAO,EAAE,gBAAgB,IAAI,SAAS,EAAE,6CAA6C;SACtF,CAAC,CAAC;QACH,aAAa,EAAE,CAAC;QAChB,MAAM,UAAU,GAAG,MAAM,MAAM,CAAC,mBAAmB,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;QACpE,aAAa,EAAE,CAAC;QAChB,OAAO,UAAU,CAAC;IACpB,CAAC,CAAC;AACJ,CAAC"}
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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"}