bitcoin-wallet-connector 0.1.0 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +24 -21
- package/lib/BitcoinConnectionProvider.d.ts +3 -3
- package/lib/BitcoinWalletConnector-BC92ulXx.js +2 -0
- package/lib/BitcoinWalletConnector-BC92ulXx.js.map +1 -0
- package/lib/{BitcoinWalletAdapterConnector-Bq835yj0.mjs → BitcoinWalletConnector-CS0BshOl.mjs} +11 -19
- package/lib/BitcoinWalletConnector-CS0BshOl.mjs.map +1 -0
- package/lib/{BitcoinWalletAdapterConnector.d.ts → BitcoinWalletConnector.d.ts} +4 -5
- package/lib/BitgetWalletAdapter.impl-D8kqiYDi.mjs +11 -0
- package/lib/BitgetWalletAdapter.impl-D8kqiYDi.mjs.map +1 -0
- package/lib/BitgetWalletAdapter.impl-DiyzNQ9d.js +2 -0
- package/lib/BitgetWalletAdapter.impl-DiyzNQ9d.js.map +1 -0
- package/lib/{LeatherWalletAdapter.impl-RUYx555r.mjs → LeatherWalletAdapter.impl-B1PoZS7z.mjs} +48 -37
- package/lib/LeatherWalletAdapter.impl-B1PoZS7z.mjs.map +1 -0
- package/lib/LeatherWalletAdapter.impl-BIWirus3.js +2 -0
- package/lib/LeatherWalletAdapter.impl-BIWirus3.js.map +1 -0
- package/lib/{MagicEdenWalletAdapter.impl-CrA6SGvG.mjs → MagicEdenWalletAdapter.impl-B3d5lbkD.mjs} +31 -20
- package/lib/MagicEdenWalletAdapter.impl-B3d5lbkD.mjs.map +1 -0
- package/lib/MagicEdenWalletAdapter.impl-DLBP3p4o.js +2 -0
- package/lib/MagicEdenWalletAdapter.impl-DLBP3p4o.js.map +1 -0
- package/lib/OkxWalletAdapter.impl-7cj96tmr.js +2 -0
- package/lib/OkxWalletAdapter.impl-7cj96tmr.js.map +1 -0
- package/lib/{OkxWalletAdapter.impl-BepoUL1B.mjs → OkxWalletAdapter.impl-nRgHsPTn.mjs} +13 -9
- package/lib/OkxWalletAdapter.impl-nRgHsPTn.mjs.map +1 -0
- package/lib/{UnisatCompatibleWalletAdapterImpl-M38FqkZI.mjs → UnisatCompatibleWalletAdapterImpl-8lRRF7Zj.mjs} +18 -10
- package/lib/UnisatCompatibleWalletAdapterImpl-8lRRF7Zj.mjs.map +1 -0
- package/lib/{UnisatCompatibleWalletAdapterImpl-Cq2Oqk1b.js → UnisatCompatibleWalletAdapterImpl-C-JWrc9s.js} +2 -2
- package/lib/UnisatCompatibleWalletAdapterImpl-C-JWrc9s.js.map +1 -0
- package/lib/UnisatWalletAdapter.impl-DXDfnHz_.js +2 -0
- package/lib/UnisatWalletAdapter.impl-DXDfnHz_.js.map +1 -0
- package/lib/UnisatWalletAdapter.impl-DvA33Ikj.mjs +19 -0
- package/lib/UnisatWalletAdapter.impl-DvA33Ikj.mjs.map +1 -0
- package/lib/WalletAdapters.types-CExaiK0o.js +2 -0
- package/lib/WalletAdapters.types-CExaiK0o.js.map +1 -0
- package/lib/WalletAdapters.types-DBvhI1hu.mjs +20 -0
- package/lib/WalletAdapters.types-DBvhI1hu.mjs.map +1 -0
- package/lib/WalletAdapters.types.d.ts +7 -12
- package/lib/{XverseCompatibleWalletAdapterImpl-Bf-BK5VK.js → XverseCompatibleWalletAdapterImpl-Dp_GUxQM.js} +2 -2
- package/lib/XverseCompatibleWalletAdapterImpl-Dp_GUxQM.js.map +1 -0
- package/lib/{XverseCompatibleWalletAdapterImpl-DXKnO_-V.mjs → XverseCompatibleWalletAdapterImpl-bgp9xDYH.mjs} +12 -8
- package/lib/XverseCompatibleWalletAdapterImpl-bgp9xDYH.mjs.map +1 -0
- package/lib/{XverseWalletAdapter.impl-CZO0RQva.mjs → XverseWalletAdapter.impl-BOpY4Vf8.mjs} +15 -15
- package/lib/XverseWalletAdapter.impl-BOpY4Vf8.mjs.map +1 -0
- package/lib/XverseWalletAdapter.impl-D0eOtEOa.js +2 -0
- package/lib/XverseWalletAdapter.impl-D0eOtEOa.js.map +1 -0
- package/lib/adapters/BitgetWalletAdapter.d.ts +6 -2
- package/lib/adapters/LeatherWalletAdapter.d.ts +4 -2
- package/lib/adapters/LeatherWalletAdapter.impl.d.ts +8 -1
- package/lib/adapters/MagicEdenWalletAdapter.d.ts +5 -2
- package/lib/adapters/MagicEdenWalletAdapter.impl.d.ts +1 -1
- package/lib/adapters/MockAddressWalletAdapter.d.ts +8 -32
- package/lib/adapters/OkxWalletAdapter.d.ts +3 -2
- package/lib/adapters/OkxWalletAdapter.impl.d.ts +5 -1
- package/lib/adapters/UnisatWalletAdapter.d.ts +3 -2
- package/lib/adapters/UnisatWalletAdapter.impl.d.ts +4 -0
- package/lib/adapters/XverseWalletAdapter.d.ts +3 -2
- package/lib/adapters/XverseWalletAdapter.impl.d.ts +1 -1
- package/lib/adapters/index.d.ts +6 -6
- package/lib/adapters.js +1 -1
- package/lib/adapters.mjs +8 -8
- package/lib/constants-B7qVf97f.mjs +5 -0
- package/lib/constants-B7qVf97f.mjs.map +1 -0
- package/lib/constants-Dr0_Mix2.js +2 -0
- package/lib/constants-Dr0_Mix2.js.map +1 -0
- package/lib/constants.d.ts +1 -0
- package/lib/{index-D7YwhNAG.mjs → index-DM4G-LJz.mjs} +639 -590
- package/lib/index-DM4G-LJz.mjs.map +1 -0
- package/lib/index-jRY8YhyK.js +2 -0
- package/lib/index-jRY8YhyK.js.map +1 -0
- package/lib/index.d.ts +1 -1
- package/lib/index.js +1 -1
- package/lib/index.mjs +13 -13
- package/lib/react.js +1 -1
- package/lib/react.js.map +1 -1
- package/lib/react.mjs +7 -7
- package/lib/react.mjs.map +1 -1
- package/lib/{transaction-CiLOYSE_.mjs → transaction-4ShhFCwN.mjs} +2 -2
- package/lib/{transaction-CiLOYSE_.mjs.map → transaction-4ShhFCwN.mjs.map} +1 -1
- package/lib/{transaction-CzdnbXSo.js → transaction-B6SlpRzN.js} +2 -2
- package/lib/{transaction-CzdnbXSo.js.map → transaction-B6SlpRzN.js.map} +1 -1
- package/lib/utils/UnisatCompatibleWalletAdapterImpl.d.ts +11 -3
- package/lib/utils/XverseCompatibleWalletAdapterImpl.d.ts +4 -0
- package/lib/utils/XverseCompatibleWalletAdapterImpl_legacy.d.ts +7 -2
- package/package.json +9 -10
- package/src/BitcoinConnectionProvider.stories.tsx +111 -43
- package/src/BitcoinConnectionProvider.tsx +5 -5
- package/src/{BitcoinWalletAdapterConnector.ts → BitcoinWalletConnector.ts} +18 -26
- package/src/WalletAdapters.types.ts +13 -22
- package/src/adapters/BitgetWalletAdapter.impl.ts +2 -1
- package/src/adapters/BitgetWalletAdapter.ts +9 -7
- package/src/adapters/LeatherWalletAdapter.impl.ts +23 -13
- package/src/adapters/LeatherWalletAdapter.ts +11 -8
- package/src/adapters/MagicEdenWalletAdapter.impl.ts +9 -8
- package/src/adapters/MagicEdenWalletAdapter.ts +17 -14
- package/src/adapters/MockAddressWalletAdapter.ts +61 -35
- package/src/adapters/OkxWalletAdapter.impl.ts +12 -7
- package/src/adapters/OkxWalletAdapter.ts +10 -7
- package/src/adapters/UnisatWalletAdapter.impl.ts +8 -2
- package/src/adapters/UnisatWalletAdapter.ts +9 -7
- package/src/adapters/XverseWalletAdapter.impl.ts +6 -6
- package/src/adapters/XverseWalletAdapter.ts +10 -7
- package/src/adapters/index.ts +6 -6
- package/src/constants.ts +1 -0
- package/src/index.ts +1 -1
- package/src/utils/UnisatCompatibleWalletAdapterImpl.ts +11 -2
- package/src/utils/XverseCompatibleWalletAdapterImpl.ts +4 -0
- package/src/utils/XverseCompatibleWalletAdapterImpl_legacy.ts +19 -7
- package/lib/BitcoinWalletAdapterConnector-Bq835yj0.mjs.map +0 -1
- package/lib/BitcoinWalletAdapterConnector-DMef0iHV.js +0 -2
- package/lib/BitcoinWalletAdapterConnector-DMef0iHV.js.map +0 -1
- package/lib/BitgetWalletAdapter.impl-C_HLO7Oi.mjs +0 -10
- package/lib/BitgetWalletAdapter.impl-C_HLO7Oi.mjs.map +0 -1
- package/lib/BitgetWalletAdapter.impl-CxnKMf7U.js +0 -2
- package/lib/BitgetWalletAdapter.impl-CxnKMf7U.js.map +0 -1
- package/lib/LeatherWalletAdapter.impl-B2QgX_tO.js +0 -2
- package/lib/LeatherWalletAdapter.impl-B2QgX_tO.js.map +0 -1
- package/lib/LeatherWalletAdapter.impl-RUYx555r.mjs.map +0 -1
- package/lib/MagicEdenWalletAdapter.impl-CrA6SGvG.mjs.map +0 -1
- package/lib/MagicEdenWalletAdapter.impl-Di3Nu2S5.js +0 -2
- package/lib/MagicEdenWalletAdapter.impl-Di3Nu2S5.js.map +0 -1
- package/lib/OkxWalletAdapter.impl-BepoUL1B.mjs.map +0 -1
- package/lib/OkxWalletAdapter.impl-C8kesjGu.js +0 -2
- package/lib/OkxWalletAdapter.impl-C8kesjGu.js.map +0 -1
- package/lib/UnisatCompatibleWalletAdapterImpl-Cq2Oqk1b.js.map +0 -1
- package/lib/UnisatCompatibleWalletAdapterImpl-M38FqkZI.mjs.map +0 -1
- package/lib/UnisatWalletAdapter.impl-CJB22se8.mjs +0 -14
- package/lib/UnisatWalletAdapter.impl-CJB22se8.mjs.map +0 -1
- package/lib/UnisatWalletAdapter.impl-EISvxdpc.js +0 -2
- package/lib/UnisatWalletAdapter.impl-EISvxdpc.js.map +0 -1
- package/lib/WalletAdapters.types-CnvOqHFH.mjs +0 -32
- package/lib/WalletAdapters.types-CnvOqHFH.mjs.map +0 -1
- package/lib/WalletAdapters.types-De_x1lzr.js +0 -2
- package/lib/WalletAdapters.types-De_x1lzr.js.map +0 -1
- package/lib/XverseCompatibleWalletAdapterImpl-Bf-BK5VK.js.map +0 -1
- package/lib/XverseCompatibleWalletAdapterImpl-DXKnO_-V.mjs.map +0 -1
- package/lib/XverseWalletAdapter.impl-CZO0RQva.mjs.map +0 -1
- package/lib/XverseWalletAdapter.impl-lJwMi-Iv.js +0 -2
- package/lib/XverseWalletAdapter.impl-lJwMi-Iv.js.map +0 -1
- package/lib/index-D7YwhNAG.mjs.map +0 -1
- package/lib/index-Zx0KcpYx.js +0 -2
- package/lib/index-Zx0KcpYx.js.map +0 -1
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";const t=require("./index-Zx0KcpYx.js"),z=t.validate(t.createBytes(null),i=>t.validatePubkey(i,t.PubT.ecdsa)),W=t.validate(t.createBytes(32),i=>t.validatePubkey(i,t.PubT.schnorr)),X=t.validate(t.createBytes(null),i=>{if(i.length!==64&&i.length!==65)throw new Error("Schnorr signature should be 64 or 65 bytes long");return i}),Y=t.struct({fingerprint:t.U32BE,path:t.array(null,t.U32LE)}),at=t.struct({hashes:t.array(t.CompactSizeLen,t.createBytes(32)),der:Y}),ht=t.createBytes(78),dt=t.struct({pubKey:W,leafHash:t.createBytes(32)}),gt=t.struct({version:t.U8,internalKey:t.createBytes(32),merklePath:t.array(null,t.createBytes(32))}),v=t.validate(gt,i=>{if(i.merklePath.length>128)throw new Error("TaprootControlBlock: merklePath should be of length 0..128 (inclusive)");return i}),wt=t.array(null,t.struct({depth:t.U8,version:t.U8,script:t.VarBytes})),E=t.createBytes(null),J=t.createBytes(20),I=t.createBytes(32),F={unsignedTx:[0,!1,t.RawOldTx,[0],[0],!1],xpub:[1,ht,Y,[],[0,2],!1],txVersion:[2,!1,t.U32LE,[2],[2],!1],fallbackLocktime:[3,!1,t.U32LE,[],[2],!1],inputCount:[4,!1,t.CompactSizeLen,[2],[2],!1],outputCount:[5,!1,t.CompactSizeLen,[2],[2],!1],txModifiable:[6,!1,t.U8,[],[2],!1],version:[251,!1,t.U32LE,[],[0,2],!1],proprietary:[252,E,E,[],[0,2],!1]},q={nonWitnessUtxo:[0,!1,t.RawTx,[],[0,2],!1],witnessUtxo:[1,!1,t.RawOutput,[],[0,2],!1],partialSig:[2,z,E,[],[0,2],!1],sighashType:[3,!1,t.U32LE,[],[0,2],!1],redeemScript:[4,!1,E,[],[0,2],!1],witnessScript:[5,!1,E,[],[0,2],!1],bip32Derivation:[6,z,Y,[],[0,2],!1],finalScriptSig:[7,!1,E,[],[0,2],!1],finalScriptWitness:[8,!1,t.RawWitness,[],[0,2],!1],porCommitment:[9,!1,E,[],[0,2],!1],ripemd160:[10,J,E,[],[0,2],!1],sha256:[11,I,E,[],[0,2],!1],hash160:[12,J,E,[],[0,2],!1],hash256:[13,I,E,[],[0,2],!1],txid:[14,!1,I,[2],[2],!0],index:[15,!1,t.U32LE,[2],[2],!0],sequence:[16,!1,t.U32LE,[],[2],!0],requiredTimeLocktime:[17,!1,t.U32LE,[],[2],!1],requiredHeightLocktime:[18,!1,t.U32LE,[],[2],!1],tapKeySig:[19,!1,X,[],[0,2],!1],tapScriptSig:[20,dt,X,[],[0,2],!1],tapLeafScript:[21,v,E,[],[0,2],!1],tapBip32Derivation:[22,I,at,[],[0,2],!1],tapInternalKey:[23,!1,W,[],[0,2],!1],tapMerkleRoot:[24,!1,I,[],[0,2],!1],proprietary:[252,E,E,[],[0,2],!1]},yt=["txid","sequence","index","witnessUtxo","nonWitnessUtxo","finalScriptSig","finalScriptWitness","unknown"],St=["partialSig","finalScriptSig","finalScriptWitness","tapKeySig","tapScriptSig"],$={redeemScript:[0,!1,E,[],[0,2],!1],witnessScript:[1,!1,E,[],[0,2],!1],bip32Derivation:[2,z,Y,[],[0,2],!1],amount:[3,!1,t.I64LE,[2],[2],!0],script:[4,!1,E,[2],[2],!0],tapInternalKey:[5,!1,W,[],[0,2],!1],tapTree:[6,!1,wt,[],[0,2],!1],tapBip32Derivation:[7,W,at,[],[0,2],!1],proprietary:[252,E,E,[],[0,2],!1]},mt=[],Z=t.array(t.NULL,t.struct({key:t.prefix(t.CompactSizeLen,t.struct({type:t.CompactSizeLen,key:t.createBytes(null)})),value:t.createBytes(t.CompactSizeLen)}));function R(i){const[e,n,s,r,o,a]=i;return{type:e,kc:n,vc:s,reqInc:r,allowInc:o,silentIgnore:a}}t.struct({type:t.CompactSizeLen,key:t.createBytes(null)});function H(i){const e={};for(const n in i){const[s,r,o]=i[n];e[s]=[n,r,o]}return t.wrap({encodeStream:(n,s)=>{let r=[];for(const o in i){const a=s[o];if(a===void 0)continue;const[u,c,h]=i[o];if(!c)r.push({key:{type:u,key:t.EMPTY},value:h.encode(a)});else{const p=a.map(([l,f])=>[c.encode(l),h.encode(f)]);p.sort((l,f)=>t.compareBytes(l[0],f[0]));for(const[l,f]of p)r.push({key:{key:l,type:u},value:f})}}if(s.unknown){s.unknown.sort((o,a)=>t.compareBytes(o[0].key,a[0].key));for(const[o,a]of s.unknown)r.push({key:o,value:a})}Z.encodeStream(n,r)},decodeStream:n=>{const s=Z.decodeStream(n),r={},o={};for(const a of s){let u="unknown",c=a.key.key,h=a.value;if(e[a.key.type]){const[p,l,f]=e[a.key.type];if(u=p,!l&&c.length)throw new Error(`PSBT: Non-empty key for ${u} (key=${t.hex.encode(c)} value=${t.hex.encode(h)}`);if(c=l?l.decode(c):void 0,h=f.decode(h),!l){if(r[u])throw new Error(`PSBT: Same keys: ${u} (key=${c} value=${h})`);r[u]=h,o[u]=!0;continue}}else c={type:a.key.type,key:a.key.key};if(o[u])throw new Error(`PSBT: Key type with empty key and no key=${u} val=${h}`);r[u]||(r[u]=[]),r[u].push([c,h])}return r}})}const _=t.validate(H(q),i=>{if(i.finalScriptWitness&&!i.finalScriptWitness.length)throw new Error("validateInput: empty finalScriptWitness");if(i.partialSig&&!i.partialSig.length)throw new Error("Empty partialSig");if(i.partialSig)for(const[e]of i.partialSig)t.validatePubkey(e,t.PubT.ecdsa);if(i.bip32Derivation)for(const[e]of i.bip32Derivation)t.validatePubkey(e,t.PubT.ecdsa);if(i.requiredTimeLocktime!==void 0&&i.requiredTimeLocktime<5e8)throw new Error(`validateInput: wrong timeLocktime=${i.requiredTimeLocktime}`);if(i.requiredHeightLocktime!==void 0&&(i.requiredHeightLocktime<=0||i.requiredHeightLocktime>=5e8))throw new Error(`validateInput: wrong heighLocktime=${i.requiredHeightLocktime}`);if(i.tapLeafScript)for(const[e,n]of i.tapLeafScript){if((e.version&254)!==n[n.length-1])throw new Error("validateInput: tapLeafScript version mimatch");if(n[n.length-1]&1)throw new Error("validateInput: tapLeafScript version has parity bit!")}return i}),G=t.validate(H($),i=>{if(i.bip32Derivation)for(const[e]of i.bip32Derivation)t.validatePubkey(e,t.PubT.ecdsa);return i}),ut=t.validate(H(F),i=>{if((i.version||0)===0){if(!i.unsignedTx)throw new Error("PSBTv0: missing unsignedTx");for(const n of i.unsignedTx.inputs)if(n.finalScriptSig&&n.finalScriptSig.length)throw new Error("PSBTv0: input scriptSig found in unsignedTx")}return i}),kt=t.struct({magic:t.magic(t.string(new Uint8Array([255])),"psbt"),global:ut,inputs:t.array("global/unsignedTx/inputs/length",_),outputs:t.array(null,G)}),Et=t.struct({magic:t.magic(t.string(new Uint8Array([255])),"psbt"),global:ut,inputs:t.array("global/inputCount",_),outputs:t.array("global/outputCount",G)});t.struct({magic:t.magic(t.string(new Uint8Array([255])),"psbt"),items:t.array(null,t.apply(t.array(t.NULL,t.tuple([t.createHex(t.CompactSizeLen),t.createBytes(t.CompactSize)])),t.coders.dict()))});function D(i,e,n){for(const s in n){if(s==="unknown"||!e[s])continue;const{allowInc:r}=R(e[s]);if(!r.includes(i))throw new Error(`PSBTv${i}: field ${s} is not allowed`)}for(const s in e){const{reqInc:r}=R(e[s]);if(r.includes(i)&&n[s]===void 0)throw new Error(`PSBTv${i}: missing required field ${s}`)}}function tt(i,e,n){const s={};for(const r in n){const o=r;if(o!=="unknown"){if(!e[o])continue;const{allowInc:a,silentIgnore:u}=R(e[o]);if(!a.includes(i)){if(u)continue;throw new Error(`Failed to serialize in PSBTv${i}: ${o} but versions allows inclusion=${a}`)}}s[o]=n[o]}return s}function ct(i){const e=i&&i.global&&i.global.version||0;D(e,F,i.global);for(const a of i.inputs)D(e,q,a);for(const a of i.outputs)D(e,$,a);const n=e?i.global.inputCount:i.global.unsignedTx.inputs.length;if(i.inputs.length<n)throw new Error("Not enough inputs");const s=i.inputs.slice(n);if(s.length>1||s.length&&Object.keys(s[0]).length)throw new Error(`Unexpected inputs left in tx=${s}`);const r=e?i.global.outputCount:i.global.unsignedTx.outputs.length;if(i.outputs.length<r)throw new Error("Not outputs inputs");const o=i.outputs.slice(r);if(o.length>1||o.length&&Object.keys(o[0]).length)throw new Error(`Unexpected outputs left in tx=${o}`);return i}function K(i,e,n,s,r){const o={...n,...e};for(const a in i){const u=a,[c,h,p]=i[u],l=s&&!s.includes(a);if(e[a]===void 0&&a in e){if(l)throw new Error(`Cannot remove signed field=${a}`);delete o[a]}else if(h){const f=n&&n[a]?n[a]:[];let w=e[u];if(w){if(!Array.isArray(w))throw new Error(`keyMap(${a}): KV pairs should be [k, v][]`);w=w.map(g=>{if(g.length!==2)throw new Error(`keyMap(${a}): KV pairs should be [k, v][]`);return[typeof g[0]=="string"?h.decode(t.hex.decode(g[0])):g[0],typeof g[1]=="string"?p.decode(t.hex.decode(g[1])):g[1]]});const m={},y=(g,k,S)=>{if(m[g]===void 0){m[g]=[k,S];return}const T=t.hex.encode(p.encode(m[g][1])),x=t.hex.encode(p.encode(S));if(T!==x)throw new Error(`keyMap(${u}): same key=${g} oldVal=${T} newVal=${x}`)};for(const[g,k]of f){const S=t.hex.encode(h.encode(g));y(S,g,k)}for(const[g,k]of w){const S=t.hex.encode(h.encode(g));if(k===void 0){if(l)throw new Error(`Cannot remove signed field=${u}/${g}`);delete m[S]}else y(S,g,k)}o[u]=Object.values(m)}}else if(typeof o[a]=="string")o[a]=p.decode(t.hex.decode(o[a]));else if(l&&a in e&&n&&n[a]!==void 0&&!t.equalBytes(p.encode(e[a]),p.encode(n[a])))throw new Error(`Cannot change signed field=${a}`)}for(const a in o)if(!i[a]){if(r&&a==="unknown")continue;delete o[a]}return o}const et=t.validate(kt,ct),nt=t.validate(Et,ct),O=new Uint8Array(32),Tt={amount:0xffffffffffffffffn,script:t.EMPTY},xt=i=>Math.ceil(i/4),bt=8,Lt=2,L=0,pt=4294967295;t.coders.decimal(bt);const A=(i,e)=>i===void 0?e:i;function C(i){if(Array.isArray(i))return i.map(e=>C(e));if(t.isBytes(i))return Uint8Array.from(i);if(["number","bigint","boolean","string","undefined"].includes(typeof i))return i;if(i===null)return i;if(typeof i=="object")return Object.fromEntries(Object.entries(i).map(([e,n])=>[e,C(n)]));throw new Error(`cloneDeep: unknown type=${i} (${typeof i})`)}const d={DEFAULT:0,ALL:1,NONE:2,SINGLE:3,ANYONECANPAY:128},Ut={DEFAULT:d.DEFAULT,ALL:d.ALL,NONE:d.NONE,SINGLE:d.SINGLE,DEFAULT_ANYONECANPAY:d.DEFAULT|d.ANYONECANPAY,ALL_ANYONECANPAY:d.ALL|d.ANYONECANPAY,NONE_ANYONECANPAY:d.NONE|d.ANYONECANPAY,SINGLE_ANYONECANPAY:d.SINGLE|d.ANYONECANPAY},Bt=t.reverseObject(Ut);function It(i,e,n,s=t.EMPTY){return t.equalBytes(n,e)&&(i=t.taprootTweakPrivKey(i,s),e=t.pubSchnorr(i)),{privKey:i,pubKey:e}}function U(i){if(i.script===void 0||i.amount===void 0)throw new Error("Transaction/output: script and amount required");return{script:i.script,amount:i.amount}}function P(i){if(i.txid===void 0||i.index===void 0)throw new Error("Transaction/input: txid and index required");return{txid:i.txid,index:i.index,sequence:A(i.sequence,pt),finalScriptSig:A(i.finalScriptSig,t.EMPTY)}}function V(i){for(const e in i){const n=e;yt.includes(n)||delete i[n]}}const M=t.struct({txid:t.createBytes(32,!0),index:t.U32LE});function Pt(i){if(typeof i!="number"||typeof Bt[i]!="string")throw new Error(`Invalid SigHash=${i}`);return i}function it(i){const e=i&31;return{isAny:!!(i&d.ANYONECANPAY),isNone:e===d.NONE,isSingle:e===d.SINGLE}}function vt(i){if(i!==void 0&&{}.toString.call(i)!=="[object Object]")throw new Error(`Wrong object type for transaction options: ${i}`);const e={...i,version:A(i.version,Lt),lockTime:A(i.lockTime,0),PSBTVersion:A(i.PSBTVersion,0)};if(typeof e.allowUnknowInput<"u"&&(i.allowUnknownInputs=e.allowUnknowInput),typeof e.allowUnknowOutput<"u"&&(i.allowUnknownOutputs=e.allowUnknowOutput),typeof e.lockTime!="number")throw new Error("Transaction lock time should be number");if(t.U32LE.encode(e.lockTime),e.PSBTVersion!==0&&e.PSBTVersion!==2)throw new Error(`Unknown PSBT version ${e.PSBTVersion}`);for(const n of["allowUnknownVersion","allowUnknownOutputs","allowUnknownInputs","disableScriptCheck","bip174jsCompat","allowLegacyWitnessUtxo","lowR"]){const s=e[n];if(s!==void 0&&typeof s!="boolean")throw new Error(`Transation options wrong type: ${n}=${s} (${typeof s})`)}if(e.allowUnknownVersion?typeof e.version=="number":![-1,0,1,2,3].includes(e.version))throw new Error(`Unknown version: ${e.version}`);if(e.customScripts!==void 0){const n=e.customScripts;if(!Array.isArray(n))throw new Error(`wrong custom scripts type (expected array): customScripts=${n} (${typeof n})`);for(const s of n){if(typeof s.encode!="function"||typeof s.decode!="function")throw new Error(`wrong script=${s} (${typeof s})`);if(s.finalizeTaproot!==void 0&&typeof s.finalizeTaproot!="function")throw new Error(`wrong script=${s} (${typeof s})`)}}return Object.freeze(e)}function st(i){if(i.nonWitnessUtxo&&i.index!==void 0){const e=i.nonWitnessUtxo.outputs.length-1;if(i.index>e)throw new Error(`validateInput: index(${i.index}) not in nonWitnessUtxo`);const n=i.nonWitnessUtxo.outputs[i.index];if(i.witnessUtxo&&(!t.equalBytes(i.witnessUtxo.script,n.script)||i.witnessUtxo.amount!==n.amount))throw new Error("validateInput: witnessUtxo different from nonWitnessUtxo");if(i.txid){if(i.nonWitnessUtxo.outputs.length-1<i.index)throw new Error("nonWitnessUtxo: incorect output index");const r=B.fromRaw(t.RawTx.encode(i.nonWitnessUtxo),{allowUnknownOutputs:!0,disableScriptCheck:!0,allowUnknownInputs:!0}),o=t.hex.encode(i.txid);if(r.isFinal&&r.id!==o)throw new Error(`nonWitnessUtxo: wrong txid, exp=${o} got=${r.id}`)}}return i}function N(i){if(i.nonWitnessUtxo){if(i.index===void 0)throw new Error("Unknown input index");return i.nonWitnessUtxo.outputs[i.index]}else{if(i.witnessUtxo)return i.witnessUtxo;throw new Error("Cannot find previous output info")}}function ot(i,e,n,s=!1,r=!1){let{nonWitnessUtxo:o,txid:a}=i;typeof o=="string"&&(o=t.hex.decode(o)),t.isBytes(o)&&(o=t.RawTx.decode(o)),!("nonWitnessUtxo"in i)&&o===void 0&&(o=e?.nonWitnessUtxo),typeof a=="string"&&(a=t.hex.decode(a)),a===void 0&&(a=e?.txid);let u={...e,...i,nonWitnessUtxo:o,txid:a};!("nonWitnessUtxo"in i)&&u.nonWitnessUtxo===void 0&&delete u.nonWitnessUtxo,u.sequence===void 0&&(u.sequence=pt),u.tapMerkleRoot===null&&delete u.tapMerkleRoot,u=K(q,u,e,n,r),_.encode(u);let c;return u.nonWitnessUtxo&&u.index!==void 0?c=u.nonWitnessUtxo.outputs[u.index]:u.witnessUtxo&&(c=u.witnessUtxo),c&&!s&&t.checkScript(c&&c.script,u.redeemScript,u.witnessScript),u}function rt(i,e=!1){let n="legacy",s=d.ALL;const r=N(i),o=t.OutScript.decode(r.script);let a=o.type,u=o;const c=[o];if(o.type==="tr")return s=d.DEFAULT,{txType:"taproot",type:"tr",last:o,lastScript:r.script,defaultSighash:s,sighash:i.sighashType||s};{if((o.type==="wpkh"||o.type==="wsh")&&(n="segwit"),o.type==="sh"){if(!i.redeemScript)throw new Error("inputType: sh without redeemScript");let f=t.OutScript.decode(i.redeemScript);(f.type==="wpkh"||f.type==="wsh")&&(n="segwit"),c.push(f),u=f,a+=`-${f.type}`}if(u.type==="wsh"){if(!i.witnessScript)throw new Error("inputType: wsh without witnessScript");let f=t.OutScript.decode(i.witnessScript);f.type==="wsh"&&(n="segwit"),c.push(f),u=f,a+=`-${f.type}`}const h=c[c.length-1];if(h.type==="sh"||h.type==="wsh")throw new Error("inputType: sh/wsh cannot be terminal type");const p=t.OutScript.encode(h),l={type:a,txType:n,last:h,lastScript:p,defaultSighash:s,sighash:i.sighashType||s};if(n==="legacy"&&!e&&!i.nonWitnessUtxo)throw new Error("Transaction/sign: legacy input without nonWitnessUtxo, can result in attack that forces paying higher fees. Pass allowLegacyWitnessUtxo=true, if you sure");return l}}class B{global={};inputs=[];outputs=[];opts;constructor(e={}){const n=this.opts=vt(e);n.lockTime!==L&&(this.global.fallbackLocktime=n.lockTime),this.global.txVersion=n.version}static fromRaw(e,n={}){const s=t.RawTx.decode(e),r=new B({...n,version:s.version,lockTime:s.lockTime});for(const o of s.outputs)r.addOutput(o);if(r.outputs=s.outputs,r.inputs=s.inputs,s.witnesses)for(let o=0;o<s.witnesses.length;o++)r.inputs[o].finalScriptWitness=s.witnesses[o];return r}static fromPSBT(e,n={}){let s;try{s=et.decode(e)}catch(l){try{s=nt.decode(e)}catch{throw l}}const r=s.global.version||0;if(r!==0&&r!==2)throw new Error(`Wrong PSBT version=${r}`);const o=s.global.unsignedTx,a=r===0?o?.version:s.global.txVersion,u=r===0?o?.lockTime:s.global.fallbackLocktime,c=new B({...n,version:a,lockTime:u,PSBTVersion:r}),h=r===0?o?.inputs.length:s.global.inputCount;c.inputs=s.inputs.slice(0,h).map((l,f)=>st({finalScriptSig:t.EMPTY,...s.global.unsignedTx?.inputs[f],...l}));const p=r===0?o?.outputs.length:s.global.outputCount;return c.outputs=s.outputs.slice(0,p).map((l,f)=>({...l,...s.global.unsignedTx?.outputs[f]})),c.global={...s.global,txVersion:a},u!==L&&(c.global.fallbackLocktime=u),c}toPSBT(e=this.opts.PSBTVersion){if(e!==0&&e!==2)throw new Error(`Wrong PSBT version=${e}`);const n=this.inputs.map(o=>st(tt(e,q,o)));for(const o of n)o.partialSig&&!o.partialSig.length&&delete o.partialSig,o.finalScriptSig&&!o.finalScriptSig.length&&delete o.finalScriptSig,o.finalScriptWitness&&!o.finalScriptWitness.length&&delete o.finalScriptWitness;const s=this.outputs.map(o=>tt(e,$,o)),r={...this.global};return e===0?(r.unsignedTx=t.RawOldTx.decode(t.RawOldTx.encode({version:this.version,lockTime:this.lockTime,inputs:this.inputs.map(P).map(o=>({...o,finalScriptSig:t.EMPTY})),outputs:this.outputs.map(U)})),delete r.fallbackLocktime,delete r.txVersion):(r.version=e,r.txVersion=this.version,r.inputCount=this.inputs.length,r.outputCount=this.outputs.length,r.fallbackLocktime&&r.fallbackLocktime===L&&delete r.fallbackLocktime),this.opts.bip174jsCompat&&(n.length||n.push({}),s.length||s.push({})),(e===0?et:nt).encode({global:r,inputs:n,outputs:s})}get lockTime(){let e=L,n=0,s=L,r=0;for(const o of this.inputs)o.requiredHeightLocktime&&(e=Math.max(e,o.requiredHeightLocktime),n++),o.requiredTimeLocktime&&(s=Math.max(s,o.requiredTimeLocktime),r++);return n&&n>=r?e:s!==L?s:this.global.fallbackLocktime||L}get version(){if(this.global.txVersion===void 0)throw new Error("No global.txVersion");return this.global.txVersion}inputStatus(e){this.checkInputIdx(e);const n=this.inputs[e];return n.finalScriptSig&&n.finalScriptSig.length||n.finalScriptWitness&&n.finalScriptWitness.length?"finalized":n.tapKeySig||n.tapScriptSig&&n.tapScriptSig.length||n.partialSig&&n.partialSig.length?"signed":"unsigned"}inputSighash(e){this.checkInputIdx(e);const n=this.inputs[e].sighashType,s=n===void 0?d.DEFAULT:n,r=s===d.DEFAULT?d.ALL:s&3;return{sigInputs:s&d.ANYONECANPAY,sigOutputs:r}}signStatus(){let e=!0,n=!0,s=[],r=[];for(let o=0;o<this.inputs.length;o++){if(this.inputStatus(o)==="unsigned")continue;const{sigInputs:u,sigOutputs:c}=this.inputSighash(o);if(u===d.ANYONECANPAY?s.push(o):e=!1,c===d.ALL)n=!1;else if(c===d.SINGLE)r.push(o);else if(c!==d.NONE)throw new Error(`Wrong signature hash output type: ${c}`)}return{addInput:e,addOutput:n,inputs:s,outputs:r}}get isFinal(){for(let e=0;e<this.inputs.length;e++)if(this.inputStatus(e)!=="finalized")return!1;return!0}get hasWitnesses(){let e=!1;for(const n of this.inputs)n.finalScriptWitness&&n.finalScriptWitness.length&&(e=!0);return e}get weight(){if(!this.isFinal)throw new Error("Transaction is not finalized");let e=32;const n=this.outputs.map(U);e+=4*t.CompactSizeLen.encode(this.outputs.length).length;for(const s of n)e+=32+4*t.VarBytes.encode(s.script).length;this.hasWitnesses&&(e+=2),e+=4*t.CompactSizeLen.encode(this.inputs.length).length;for(const s of this.inputs)e+=160+4*t.VarBytes.encode(s.finalScriptSig||t.EMPTY).length,this.hasWitnesses&&s.finalScriptWitness&&(e+=t.RawWitness.encode(s.finalScriptWitness).length);return e}get vsize(){return xt(this.weight)}toBytes(e=!1,n=!1){return t.RawTx.encode({version:this.version,lockTime:this.lockTime,inputs:this.inputs.map(P).map(s=>({...s,finalScriptSig:e&&s.finalScriptSig||t.EMPTY})),outputs:this.outputs.map(U),witnesses:this.inputs.map(s=>s.finalScriptWitness||[]),segwitFlag:n&&this.hasWitnesses})}get unsignedTx(){return this.toBytes(!1,!1)}get hex(){return t.hex.encode(this.toBytes(!0,this.hasWitnesses))}get hash(){return t.hex.encode(t.sha256x2(this.toBytes(!0)))}get id(){return t.hex.encode(t.sha256x2(this.toBytes(!0)).reverse())}checkInputIdx(e){if(!Number.isSafeInteger(e)||0>e||e>=this.inputs.length)throw new Error(`Wrong input index=${e}`)}getInput(e){return this.checkInputIdx(e),C(this.inputs[e])}get inputsLength(){return this.inputs.length}addInput(e,n=!1){if(!n&&!this.signStatus().addInput)throw new Error("Tx has signed inputs, cannot add new one");return this.inputs.push(ot(e,void 0,void 0,this.opts.disableScriptCheck)),this.inputs.length-1}updateInput(e,n,s=!1){this.checkInputIdx(e);let r;if(!s){const o=this.signStatus();(!o.addInput||o.inputs.includes(e))&&(r=St)}this.inputs[e]=ot(n,this.inputs[e],r,this.opts.disableScriptCheck,this.opts.allowUnknown)}checkOutputIdx(e){if(!Number.isSafeInteger(e)||0>e||e>=this.outputs.length)throw new Error(`Wrong output index=${e}`)}getOutput(e){return this.checkOutputIdx(e),C(this.outputs[e])}getOutputAddress(e,n=t.NETWORK){const s=this.getOutput(e);if(s.script)return t.Address(n).encode(t.OutScript.decode(s.script))}get outputsLength(){return this.outputs.length}normalizeOutput(e,n,s){let{amount:r,script:o}=e;if(r===void 0&&(r=n?.amount),typeof r!="bigint")throw new Error(`Wrong amount type, should be of type bigint in sats, but got ${r} of type ${typeof r}`);typeof o=="string"&&(o=t.hex.decode(o)),o===void 0&&(o=n?.script);let a={...n,...e,amount:r,script:o};if(a.amount===void 0&&delete a.amount,a=K($,a,n,s,this.opts.allowUnknown),G.encode(a),a.script&&!this.opts.allowUnknownOutputs&&t.OutScript.decode(a.script).type==="unknown")throw new Error("Transaction/output: unknown output script type, there is a chance that input is unspendable. Pass allowUnknownOutputs=true, if you sure");return this.opts.disableScriptCheck||t.checkScript(a.script,a.redeemScript,a.witnessScript),a}addOutput(e,n=!1){if(!n&&!this.signStatus().addOutput)throw new Error("Tx has signed outputs, cannot add new one");return this.outputs.push(this.normalizeOutput(e)),this.outputs.length-1}updateOutput(e,n,s=!1){this.checkOutputIdx(e);let r;if(!s){const o=this.signStatus();(!o.addOutput||o.outputs.includes(e))&&(r=mt)}this.outputs[e]=this.normalizeOutput(n,this.outputs[e],r)}addOutputAddress(e,n,s=t.NETWORK){return this.addOutput({script:t.OutScript.encode(t.Address(s).decode(e)),amount:n})}get fee(){let e=0n;for(const s of this.inputs){const r=N(s);if(!r)throw new Error("Empty input amount");e+=r.amount}const n=this.outputs.map(U);for(const s of n)e-=s.amount;return e}preimageLegacy(e,n,s){const{isAny:r,isNone:o,isSingle:a}=it(s);if(e<0||!Number.isSafeInteger(e))throw new Error(`Invalid input idx=${e}`);if(a&&e>=this.outputs.length||e>=this.inputs.length)return t.U256BE.encode(1n);n=t.Script.encode(t.Script.decode(n).filter(p=>p!=="CODESEPARATOR"));let u=this.inputs.map(P).map((p,l)=>({...p,finalScriptSig:l===e?n:t.EMPTY}));r?u=[u[e]]:(o||a)&&(u=u.map((p,l)=>({...p,sequence:l===e?p.sequence:0})));let c=this.outputs.map(U);o?c=[]:a&&(c=c.slice(0,e).fill(Tt).concat([c[e]]));const h=t.RawTx.encode({lockTime:this.lockTime,version:this.version,segwitFlag:!1,inputs:u,outputs:c});return t.sha256x2(h,t.I32LE.encode(s))}preimageWitnessV0(e,n,s,r){const{isAny:o,isNone:a,isSingle:u}=it(s);let c=O,h=O,p=O;const l=this.inputs.map(P),f=this.outputs.map(U);o||(c=t.sha256x2(...l.map(M.encode))),!o&&!u&&!a&&(h=t.sha256x2(...l.map(m=>t.U32LE.encode(m.sequence)))),!u&&!a?p=t.sha256x2(...f.map(t.RawOutput.encode)):u&&e<f.length&&(p=t.sha256x2(t.RawOutput.encode(f[e])));const w=l[e];return t.sha256x2(t.I32LE.encode(this.version),c,h,t.createBytes(32,!0).encode(w.txid),t.U32LE.encode(w.index),t.VarBytes.encode(n),t.U64LE.encode(r),t.U32LE.encode(w.sequence),p,t.U32LE.encode(this.lockTime),t.U32LE.encode(s))}preimageWitnessV1(e,n,s,r,o=-1,a,u=192,c){if(!Array.isArray(r)||this.inputs.length!==r.length)throw new Error(`Invalid amounts array=${r}`);if(!Array.isArray(n)||this.inputs.length!==n.length)throw new Error(`Invalid prevOutScript array=${n}`);const h=[t.U8.encode(0),t.U8.encode(s),t.I32LE.encode(this.version),t.U32LE.encode(this.lockTime)],p=s===d.DEFAULT?d.ALL:s&3,l=s&d.ANYONECANPAY,f=this.inputs.map(P),w=this.outputs.map(U);l!==d.ANYONECANPAY&&h.push(...[f.map(M.encode),r.map(t.U64LE.encode),n.map(t.VarBytes.encode),f.map(y=>t.U32LE.encode(y.sequence))].map(y=>t.sha256(t.concatBytes(...y)))),p===d.ALL&&h.push(t.sha256(t.concatBytes(...w.map(t.RawOutput.encode))));const m=(c?1:0)|(a?2:0);if(h.push(new Uint8Array([m])),l===d.ANYONECANPAY){const y=f[e];h.push(M.encode(y),t.U64LE.encode(r[e]),t.VarBytes.encode(n[e]),t.U32LE.encode(y.sequence))}else h.push(t.U32LE.encode(e));return m&1&&h.push(t.sha256(t.VarBytes.encode(c||t.EMPTY))),p===d.SINGLE&&h.push(e<w.length?t.sha256(t.RawOutput.encode(w[e])):O),a&&h.push(t.tapLeafHash(a,u),t.U8.encode(0),t.I32LE.encode(o)),t.tagSchnorr("TapSighash",...h)}signIdx(e,n,s,r){this.checkInputIdx(n);const o=this.inputs[n],a=rt(o,this.opts.allowLegacyWitnessUtxo);if(!t.isBytes(e)){if(!o.bip32Derivation||!o.bip32Derivation.length)throw new Error("bip32Derivation: empty");const p=o.bip32Derivation.filter(f=>f[1].fingerprint==e.fingerprint).map(([f,{path:w}])=>{let m=e;for(const y of w)m=m.deriveChild(y);if(!t.equalBytes(m.publicKey,f))throw new Error("bip32Derivation: wrong pubKey");if(!m.privateKey)throw new Error("bip32Derivation: no privateKey");return m});if(!p.length)throw new Error(`bip32Derivation: no items with fingerprint=${e.fingerprint}`);let l=!1;for(const f of p)this.signIdx(f.privateKey,n)&&(l=!0);return l}s?s.forEach(Pt):s=[a.defaultSighash];const u=a.sighash;if(!s.includes(u))throw new Error(`Input with not allowed sigHash=${u}. Allowed: ${s.join(", ")}`);const{sigOutputs:c}=this.inputSighash(n);if(c===d.SINGLE&&n>=this.outputs.length)throw new Error(`Input with sighash SINGLE, but there is no output with corresponding index=${n}`);const h=N(o);if(a.txType==="taproot"){const p=this.inputs.map(N),l=p.map(g=>g.script),f=p.map(g=>g.amount);let w=!1,m=t.pubSchnorr(e),y=o.tapMerkleRoot||t.EMPTY;if(o.tapInternalKey){const{pubKey:g,privKey:k}=It(e,m,o.tapInternalKey,y),[S]=t.taprootTweakPubkey(o.tapInternalKey,y);if(t.equalBytes(S,g)){const T=this.preimageWitnessV1(n,l,u,f),x=t.concatBytes(t.signSchnorr(T,k,r),u!==d.DEFAULT?new Uint8Array([u]):t.EMPTY);this.updateInput(n,{tapKeySig:x},!0),w=!0}}if(o.tapLeafScript){o.tapScriptSig=o.tapScriptSig||[];for(const[g,k]of o.tapLeafScript){const S=k.subarray(0,-1),T=t.Script.decode(S),x=k[k.length-1],b=t.tapLeafHash(S,x);if(T.findIndex(Q=>t.isBytes(Q)&&t.equalBytes(Q,m))===-1)continue;const lt=this.preimageWitnessV1(n,l,u,f,void 0,S,x),ft=t.concatBytes(t.signSchnorr(lt,e,r),u!==d.DEFAULT?new Uint8Array([u]):t.EMPTY);this.updateInput(n,{tapScriptSig:[[{pubKey:m,leafHash:b},ft]]},!0),w=!0}}if(!w)throw new Error("No taproot scripts signed");return!0}else{const p=t.pubECDSA(e);let l=!1;const f=t.hash160(p);for(const y of t.Script.decode(a.lastScript))t.isBytes(y)&&(t.equalBytes(y,p)||t.equalBytes(y,f))&&(l=!0);if(!l)throw new Error(`Input script doesn't have pubKey: ${a.lastScript}`);let w;if(a.txType==="legacy")w=this.preimageLegacy(n,a.lastScript,u);else if(a.txType==="segwit"){let y=a.lastScript;a.last.type==="wpkh"&&(y=t.OutScript.encode({type:"pkh",hash:a.last.hash})),w=this.preimageWitnessV0(n,y,u,h.amount)}else throw new Error(`Transaction/sign: unknown tx type: ${a.txType}`);const m=t.signECDSA(w,e,this.opts.lowR);this.updateInput(n,{partialSig:[[p,t.concatBytes(m,new Uint8Array([u]))]]},!0)}return!0}sign(e,n,s){let r=0;for(let o=0;o<this.inputs.length;o++)try{this.signIdx(e,o,n,s)&&r++}catch{}if(!r)throw new Error("No inputs signed");return r}finalizeIdx(e){if(this.checkInputIdx(e),this.fee<0n)throw new Error("Outputs spends more than inputs amount");const n=this.inputs[e],s=rt(n,this.opts.allowLegacyWitnessUtxo);if(s.txType==="taproot"){if(n.tapKeySig)n.finalScriptWitness=[n.tapKeySig];else if(n.tapLeafScript&&n.tapScriptSig){const c=n.tapLeafScript.sort((h,p)=>v.encode(h[0]).length-v.encode(p[0]).length);for(const[h,p]of c){const l=p.slice(0,-1),f=p[p.length-1],w=t.OutScript.decode(l),m=t.tapLeafHash(l,f),y=n.tapScriptSig.filter(k=>t.equalBytes(k[0].leafHash,m));let g=[];if(w.type==="tr_ms"){const k=w.m,S=w.pubkeys;let T=0;for(const x of S){const b=y.findIndex(j=>t.equalBytes(j[0].pubKey,x));if(T===k||b===-1){g.push(t.EMPTY);continue}g.push(y[b][1]),T++}if(T!==k)continue}else if(w.type==="tr_ns"){for(const k of w.pubkeys){const S=y.findIndex(T=>t.equalBytes(T[0].pubKey,k));S!==-1&&g.push(y[S][1])}if(g.length!==w.pubkeys.length)continue}else if(w.type==="unknown"&&this.opts.allowUnknownInputs){const k=t.Script.decode(l);if(g=y.map(([{pubKey:S},T])=>{const x=k.findIndex(b=>t.isBytes(b)&&t.equalBytes(b,S));if(x===-1)throw new Error("finalize/taproot: cannot find position of pubkey in script");return{signature:T,pos:x}}).sort((S,T)=>S.pos-T.pos).map(S=>S.signature),!g.length)continue}else{const k=this.opts.customScripts;if(k)for(const S of k){if(!S.finalizeTaproot)continue;const T=t.Script.decode(l),x=S.encode(T);if(x===void 0)continue;const b=S.finalizeTaproot(l,x,y);if(b){n.finalScriptWitness=b.concat(v.encode(h)),n.finalScriptSig=t.EMPTY,V(n);return}}throw new Error("Finalize: Unknown tapLeafScript")}n.finalScriptWitness=g.reverse().concat([l,v.encode(h)]);break}if(!n.finalScriptWitness)throw new Error("finalize/taproot: empty witness")}else throw new Error("finalize/taproot: unknown input");n.finalScriptSig=t.EMPTY,V(n);return}if(!n.partialSig||!n.partialSig.length)throw new Error("Not enough partial sign");let r=t.EMPTY,o=[];if(s.last.type==="ms"){const c=s.last.m,h=s.last.pubkeys;let p=[];for(const l of h){const f=n.partialSig.find(w=>t.equalBytes(l,w[0]));f&&p.push(f[1])}if(p=p.slice(0,c),p.length!==c)throw new Error(`Multisig: wrong signatures count, m=${c} n=${h.length} signatures=${p.length}`);r=t.Script.encode([0,...p])}else if(s.last.type==="pk")r=t.Script.encode([n.partialSig[0][1]]);else if(s.last.type==="pkh")r=t.Script.encode([n.partialSig[0][1],n.partialSig[0][0]]);else if(s.last.type==="wpkh")r=t.EMPTY,o=[n.partialSig[0][1],n.partialSig[0][0]];else if(s.last.type==="unknown"&&!this.opts.allowUnknownInputs)throw new Error("Unknown inputs not allowed");let a,u;if(s.type.includes("wsh-")&&(r.length&&s.lastScript.length&&(o=t.Script.decode(r).map(c=>{if(c===0)return t.EMPTY;if(t.isBytes(c))return c;throw new Error(`Wrong witness op=${c}`)})),o=o.concat(s.lastScript)),s.txType==="segwit"&&(u=o),s.type.startsWith("sh-wsh-")?a=t.Script.encode([t.Script.encode([0,t.sha256(s.lastScript)])]):s.type.startsWith("sh-")?a=t.Script.encode([...t.Script.decode(r),s.lastScript]):s.type.startsWith("wsh-")||s.txType!=="segwit"&&(a=r),!a&&!u)throw new Error("Unknown error finalizing input");a&&(n.finalScriptSig=a),u&&(n.finalScriptWitness=u),V(n)}finalize(){for(let e=0;e<this.inputs.length;e++)this.finalizeIdx(e)}extract(){if(!this.isFinal)throw new Error("Transaction has unfinalized inputs");if(!this.outputs.length)throw new Error("Transaction has no outputs");if(this.fee<0n)throw new Error("Outputs spends more than inputs amount");return this.toBytes(!0,!0)}combine(e){for(const r of["PSBTVersion","version","lockTime"])if(this.opts[r]!==e.opts[r])throw new Error(`Transaction/combine: different ${r} this=${this.opts[r]} other=${e.opts[r]}`);for(const r of["inputs","outputs"])if(this[r].length!==e[r].length)throw new Error(`Transaction/combine: different ${r} length this=${this[r].length} other=${e[r].length}`);const n=this.global.unsignedTx?t.RawOldTx.encode(this.global.unsignedTx):t.EMPTY,s=e.global.unsignedTx?t.RawOldTx.encode(e.global.unsignedTx):t.EMPTY;if(!t.equalBytes(n,s))throw new Error("Transaction/combine: different unsigned tx");this.global=K(F,this.global,e.global,void 0,this.opts.allowUnknown);for(let r=0;r<this.inputs.length;r++)this.updateInput(r,e.inputs[r],!0);for(let r=0;r<this.outputs.length;r++)this.updateOutput(r,e.outputs[r],!0);return this}clone(){return B.fromPSBT(this.toPSBT(this.opts.PSBTVersion),this.opts)}}exports.Transaction=B;
|
|
2
|
-
//# sourceMappingURL=transaction-
|
|
1
|
+
"use strict";const t=require("./index-jRY8YhyK.js"),z=t.validate(t.createBytes(null),i=>t.validatePubkey(i,t.PubT.ecdsa)),W=t.validate(t.createBytes(32),i=>t.validatePubkey(i,t.PubT.schnorr)),X=t.validate(t.createBytes(null),i=>{if(i.length!==64&&i.length!==65)throw new Error("Schnorr signature should be 64 or 65 bytes long");return i}),Y=t.struct({fingerprint:t.U32BE,path:t.array(null,t.U32LE)}),at=t.struct({hashes:t.array(t.CompactSizeLen,t.createBytes(32)),der:Y}),ht=t.createBytes(78),dt=t.struct({pubKey:W,leafHash:t.createBytes(32)}),gt=t.struct({version:t.U8,internalKey:t.createBytes(32),merklePath:t.array(null,t.createBytes(32))}),v=t.validate(gt,i=>{if(i.merklePath.length>128)throw new Error("TaprootControlBlock: merklePath should be of length 0..128 (inclusive)");return i}),wt=t.array(null,t.struct({depth:t.U8,version:t.U8,script:t.VarBytes})),E=t.createBytes(null),J=t.createBytes(20),I=t.createBytes(32),F={unsignedTx:[0,!1,t.RawOldTx,[0],[0],!1],xpub:[1,ht,Y,[],[0,2],!1],txVersion:[2,!1,t.U32LE,[2],[2],!1],fallbackLocktime:[3,!1,t.U32LE,[],[2],!1],inputCount:[4,!1,t.CompactSizeLen,[2],[2],!1],outputCount:[5,!1,t.CompactSizeLen,[2],[2],!1],txModifiable:[6,!1,t.U8,[],[2],!1],version:[251,!1,t.U32LE,[],[0,2],!1],proprietary:[252,E,E,[],[0,2],!1]},q={nonWitnessUtxo:[0,!1,t.RawTx,[],[0,2],!1],witnessUtxo:[1,!1,t.RawOutput,[],[0,2],!1],partialSig:[2,z,E,[],[0,2],!1],sighashType:[3,!1,t.U32LE,[],[0,2],!1],redeemScript:[4,!1,E,[],[0,2],!1],witnessScript:[5,!1,E,[],[0,2],!1],bip32Derivation:[6,z,Y,[],[0,2],!1],finalScriptSig:[7,!1,E,[],[0,2],!1],finalScriptWitness:[8,!1,t.RawWitness,[],[0,2],!1],porCommitment:[9,!1,E,[],[0,2],!1],ripemd160:[10,J,E,[],[0,2],!1],sha256:[11,I,E,[],[0,2],!1],hash160:[12,J,E,[],[0,2],!1],hash256:[13,I,E,[],[0,2],!1],txid:[14,!1,I,[2],[2],!0],index:[15,!1,t.U32LE,[2],[2],!0],sequence:[16,!1,t.U32LE,[],[2],!0],requiredTimeLocktime:[17,!1,t.U32LE,[],[2],!1],requiredHeightLocktime:[18,!1,t.U32LE,[],[2],!1],tapKeySig:[19,!1,X,[],[0,2],!1],tapScriptSig:[20,dt,X,[],[0,2],!1],tapLeafScript:[21,v,E,[],[0,2],!1],tapBip32Derivation:[22,I,at,[],[0,2],!1],tapInternalKey:[23,!1,W,[],[0,2],!1],tapMerkleRoot:[24,!1,I,[],[0,2],!1],proprietary:[252,E,E,[],[0,2],!1]},yt=["txid","sequence","index","witnessUtxo","nonWitnessUtxo","finalScriptSig","finalScriptWitness","unknown"],St=["partialSig","finalScriptSig","finalScriptWitness","tapKeySig","tapScriptSig"],$={redeemScript:[0,!1,E,[],[0,2],!1],witnessScript:[1,!1,E,[],[0,2],!1],bip32Derivation:[2,z,Y,[],[0,2],!1],amount:[3,!1,t.I64LE,[2],[2],!0],script:[4,!1,E,[2],[2],!0],tapInternalKey:[5,!1,W,[],[0,2],!1],tapTree:[6,!1,wt,[],[0,2],!1],tapBip32Derivation:[7,W,at,[],[0,2],!1],proprietary:[252,E,E,[],[0,2],!1]},mt=[],Z=t.array(t.NULL,t.struct({key:t.prefix(t.CompactSizeLen,t.struct({type:t.CompactSizeLen,key:t.createBytes(null)})),value:t.createBytes(t.CompactSizeLen)}));function R(i){const[e,n,s,r,o,a]=i;return{type:e,kc:n,vc:s,reqInc:r,allowInc:o,silentIgnore:a}}t.struct({type:t.CompactSizeLen,key:t.createBytes(null)});function H(i){const e={};for(const n in i){const[s,r,o]=i[n];e[s]=[n,r,o]}return t.wrap({encodeStream:(n,s)=>{let r=[];for(const o in i){const a=s[o];if(a===void 0)continue;const[u,c,h]=i[o];if(!c)r.push({key:{type:u,key:t.EMPTY},value:h.encode(a)});else{const p=a.map(([l,f])=>[c.encode(l),h.encode(f)]);p.sort((l,f)=>t.compareBytes(l[0],f[0]));for(const[l,f]of p)r.push({key:{key:l,type:u},value:f})}}if(s.unknown){s.unknown.sort((o,a)=>t.compareBytes(o[0].key,a[0].key));for(const[o,a]of s.unknown)r.push({key:o,value:a})}Z.encodeStream(n,r)},decodeStream:n=>{const s=Z.decodeStream(n),r={},o={};for(const a of s){let u="unknown",c=a.key.key,h=a.value;if(e[a.key.type]){const[p,l,f]=e[a.key.type];if(u=p,!l&&c.length)throw new Error(`PSBT: Non-empty key for ${u} (key=${t.hex.encode(c)} value=${t.hex.encode(h)}`);if(c=l?l.decode(c):void 0,h=f.decode(h),!l){if(r[u])throw new Error(`PSBT: Same keys: ${u} (key=${c} value=${h})`);r[u]=h,o[u]=!0;continue}}else c={type:a.key.type,key:a.key.key};if(o[u])throw new Error(`PSBT: Key type with empty key and no key=${u} val=${h}`);r[u]||(r[u]=[]),r[u].push([c,h])}return r}})}const _=t.validate(H(q),i=>{if(i.finalScriptWitness&&!i.finalScriptWitness.length)throw new Error("validateInput: empty finalScriptWitness");if(i.partialSig&&!i.partialSig.length)throw new Error("Empty partialSig");if(i.partialSig)for(const[e]of i.partialSig)t.validatePubkey(e,t.PubT.ecdsa);if(i.bip32Derivation)for(const[e]of i.bip32Derivation)t.validatePubkey(e,t.PubT.ecdsa);if(i.requiredTimeLocktime!==void 0&&i.requiredTimeLocktime<5e8)throw new Error(`validateInput: wrong timeLocktime=${i.requiredTimeLocktime}`);if(i.requiredHeightLocktime!==void 0&&(i.requiredHeightLocktime<=0||i.requiredHeightLocktime>=5e8))throw new Error(`validateInput: wrong heighLocktime=${i.requiredHeightLocktime}`);if(i.tapLeafScript)for(const[e,n]of i.tapLeafScript){if((e.version&254)!==n[n.length-1])throw new Error("validateInput: tapLeafScript version mimatch");if(n[n.length-1]&1)throw new Error("validateInput: tapLeafScript version has parity bit!")}return i}),G=t.validate(H($),i=>{if(i.bip32Derivation)for(const[e]of i.bip32Derivation)t.validatePubkey(e,t.PubT.ecdsa);return i}),ut=t.validate(H(F),i=>{if((i.version||0)===0){if(!i.unsignedTx)throw new Error("PSBTv0: missing unsignedTx");for(const n of i.unsignedTx.inputs)if(n.finalScriptSig&&n.finalScriptSig.length)throw new Error("PSBTv0: input scriptSig found in unsignedTx")}return i}),kt=t.struct({magic:t.magic(t.string(new Uint8Array([255])),"psbt"),global:ut,inputs:t.array("global/unsignedTx/inputs/length",_),outputs:t.array(null,G)}),Et=t.struct({magic:t.magic(t.string(new Uint8Array([255])),"psbt"),global:ut,inputs:t.array("global/inputCount",_),outputs:t.array("global/outputCount",G)});t.struct({magic:t.magic(t.string(new Uint8Array([255])),"psbt"),items:t.array(null,t.apply(t.array(t.NULL,t.tuple([t.createHex(t.CompactSizeLen),t.createBytes(t.CompactSize)])),t.coders.dict()))});function D(i,e,n){for(const s in n){if(s==="unknown"||!e[s])continue;const{allowInc:r}=R(e[s]);if(!r.includes(i))throw new Error(`PSBTv${i}: field ${s} is not allowed`)}for(const s in e){const{reqInc:r}=R(e[s]);if(r.includes(i)&&n[s]===void 0)throw new Error(`PSBTv${i}: missing required field ${s}`)}}function tt(i,e,n){const s={};for(const r in n){const o=r;if(o!=="unknown"){if(!e[o])continue;const{allowInc:a,silentIgnore:u}=R(e[o]);if(!a.includes(i)){if(u)continue;throw new Error(`Failed to serialize in PSBTv${i}: ${o} but versions allows inclusion=${a}`)}}s[o]=n[o]}return s}function ct(i){const e=i&&i.global&&i.global.version||0;D(e,F,i.global);for(const a of i.inputs)D(e,q,a);for(const a of i.outputs)D(e,$,a);const n=e?i.global.inputCount:i.global.unsignedTx.inputs.length;if(i.inputs.length<n)throw new Error("Not enough inputs");const s=i.inputs.slice(n);if(s.length>1||s.length&&Object.keys(s[0]).length)throw new Error(`Unexpected inputs left in tx=${s}`);const r=e?i.global.outputCount:i.global.unsignedTx.outputs.length;if(i.outputs.length<r)throw new Error("Not outputs inputs");const o=i.outputs.slice(r);if(o.length>1||o.length&&Object.keys(o[0]).length)throw new Error(`Unexpected outputs left in tx=${o}`);return i}function K(i,e,n,s,r){const o={...n,...e};for(const a in i){const u=a,[c,h,p]=i[u],l=s&&!s.includes(a);if(e[a]===void 0&&a in e){if(l)throw new Error(`Cannot remove signed field=${a}`);delete o[a]}else if(h){const f=n&&n[a]?n[a]:[];let w=e[u];if(w){if(!Array.isArray(w))throw new Error(`keyMap(${a}): KV pairs should be [k, v][]`);w=w.map(g=>{if(g.length!==2)throw new Error(`keyMap(${a}): KV pairs should be [k, v][]`);return[typeof g[0]=="string"?h.decode(t.hex.decode(g[0])):g[0],typeof g[1]=="string"?p.decode(t.hex.decode(g[1])):g[1]]});const m={},y=(g,k,S)=>{if(m[g]===void 0){m[g]=[k,S];return}const T=t.hex.encode(p.encode(m[g][1])),x=t.hex.encode(p.encode(S));if(T!==x)throw new Error(`keyMap(${u}): same key=${g} oldVal=${T} newVal=${x}`)};for(const[g,k]of f){const S=t.hex.encode(h.encode(g));y(S,g,k)}for(const[g,k]of w){const S=t.hex.encode(h.encode(g));if(k===void 0){if(l)throw new Error(`Cannot remove signed field=${u}/${g}`);delete m[S]}else y(S,g,k)}o[u]=Object.values(m)}}else if(typeof o[a]=="string")o[a]=p.decode(t.hex.decode(o[a]));else if(l&&a in e&&n&&n[a]!==void 0&&!t.equalBytes(p.encode(e[a]),p.encode(n[a])))throw new Error(`Cannot change signed field=${a}`)}for(const a in o)if(!i[a]){if(r&&a==="unknown")continue;delete o[a]}return o}const et=t.validate(kt,ct),nt=t.validate(Et,ct),O=new Uint8Array(32),Tt={amount:0xffffffffffffffffn,script:t.EMPTY},xt=i=>Math.ceil(i/4),bt=8,Lt=2,L=0,pt=4294967295;t.coders.decimal(bt);const A=(i,e)=>i===void 0?e:i;function C(i){if(Array.isArray(i))return i.map(e=>C(e));if(t.isBytes(i))return Uint8Array.from(i);if(["number","bigint","boolean","string","undefined"].includes(typeof i))return i;if(i===null)return i;if(typeof i=="object")return Object.fromEntries(Object.entries(i).map(([e,n])=>[e,C(n)]));throw new Error(`cloneDeep: unknown type=${i} (${typeof i})`)}const d={DEFAULT:0,ALL:1,NONE:2,SINGLE:3,ANYONECANPAY:128},Ut={DEFAULT:d.DEFAULT,ALL:d.ALL,NONE:d.NONE,SINGLE:d.SINGLE,DEFAULT_ANYONECANPAY:d.DEFAULT|d.ANYONECANPAY,ALL_ANYONECANPAY:d.ALL|d.ANYONECANPAY,NONE_ANYONECANPAY:d.NONE|d.ANYONECANPAY,SINGLE_ANYONECANPAY:d.SINGLE|d.ANYONECANPAY},Bt=t.reverseObject(Ut);function It(i,e,n,s=t.EMPTY){return t.equalBytes(n,e)&&(i=t.taprootTweakPrivKey(i,s),e=t.pubSchnorr(i)),{privKey:i,pubKey:e}}function U(i){if(i.script===void 0||i.amount===void 0)throw new Error("Transaction/output: script and amount required");return{script:i.script,amount:i.amount}}function P(i){if(i.txid===void 0||i.index===void 0)throw new Error("Transaction/input: txid and index required");return{txid:i.txid,index:i.index,sequence:A(i.sequence,pt),finalScriptSig:A(i.finalScriptSig,t.EMPTY)}}function V(i){for(const e in i){const n=e;yt.includes(n)||delete i[n]}}const M=t.struct({txid:t.createBytes(32,!0),index:t.U32LE});function Pt(i){if(typeof i!="number"||typeof Bt[i]!="string")throw new Error(`Invalid SigHash=${i}`);return i}function it(i){const e=i&31;return{isAny:!!(i&d.ANYONECANPAY),isNone:e===d.NONE,isSingle:e===d.SINGLE}}function vt(i){if(i!==void 0&&{}.toString.call(i)!=="[object Object]")throw new Error(`Wrong object type for transaction options: ${i}`);const e={...i,version:A(i.version,Lt),lockTime:A(i.lockTime,0),PSBTVersion:A(i.PSBTVersion,0)};if(typeof e.allowUnknowInput<"u"&&(i.allowUnknownInputs=e.allowUnknowInput),typeof e.allowUnknowOutput<"u"&&(i.allowUnknownOutputs=e.allowUnknowOutput),typeof e.lockTime!="number")throw new Error("Transaction lock time should be number");if(t.U32LE.encode(e.lockTime),e.PSBTVersion!==0&&e.PSBTVersion!==2)throw new Error(`Unknown PSBT version ${e.PSBTVersion}`);for(const n of["allowUnknownVersion","allowUnknownOutputs","allowUnknownInputs","disableScriptCheck","bip174jsCompat","allowLegacyWitnessUtxo","lowR"]){const s=e[n];if(s!==void 0&&typeof s!="boolean")throw new Error(`Transation options wrong type: ${n}=${s} (${typeof s})`)}if(e.allowUnknownVersion?typeof e.version=="number":![-1,0,1,2,3].includes(e.version))throw new Error(`Unknown version: ${e.version}`);if(e.customScripts!==void 0){const n=e.customScripts;if(!Array.isArray(n))throw new Error(`wrong custom scripts type (expected array): customScripts=${n} (${typeof n})`);for(const s of n){if(typeof s.encode!="function"||typeof s.decode!="function")throw new Error(`wrong script=${s} (${typeof s})`);if(s.finalizeTaproot!==void 0&&typeof s.finalizeTaproot!="function")throw new Error(`wrong script=${s} (${typeof s})`)}}return Object.freeze(e)}function st(i){if(i.nonWitnessUtxo&&i.index!==void 0){const e=i.nonWitnessUtxo.outputs.length-1;if(i.index>e)throw new Error(`validateInput: index(${i.index}) not in nonWitnessUtxo`);const n=i.nonWitnessUtxo.outputs[i.index];if(i.witnessUtxo&&(!t.equalBytes(i.witnessUtxo.script,n.script)||i.witnessUtxo.amount!==n.amount))throw new Error("validateInput: witnessUtxo different from nonWitnessUtxo");if(i.txid){if(i.nonWitnessUtxo.outputs.length-1<i.index)throw new Error("nonWitnessUtxo: incorect output index");const r=B.fromRaw(t.RawTx.encode(i.nonWitnessUtxo),{allowUnknownOutputs:!0,disableScriptCheck:!0,allowUnknownInputs:!0}),o=t.hex.encode(i.txid);if(r.isFinal&&r.id!==o)throw new Error(`nonWitnessUtxo: wrong txid, exp=${o} got=${r.id}`)}}return i}function N(i){if(i.nonWitnessUtxo){if(i.index===void 0)throw new Error("Unknown input index");return i.nonWitnessUtxo.outputs[i.index]}else{if(i.witnessUtxo)return i.witnessUtxo;throw new Error("Cannot find previous output info")}}function ot(i,e,n,s=!1,r=!1){let{nonWitnessUtxo:o,txid:a}=i;typeof o=="string"&&(o=t.hex.decode(o)),t.isBytes(o)&&(o=t.RawTx.decode(o)),!("nonWitnessUtxo"in i)&&o===void 0&&(o=e?.nonWitnessUtxo),typeof a=="string"&&(a=t.hex.decode(a)),a===void 0&&(a=e?.txid);let u={...e,...i,nonWitnessUtxo:o,txid:a};!("nonWitnessUtxo"in i)&&u.nonWitnessUtxo===void 0&&delete u.nonWitnessUtxo,u.sequence===void 0&&(u.sequence=pt),u.tapMerkleRoot===null&&delete u.tapMerkleRoot,u=K(q,u,e,n,r),_.encode(u);let c;return u.nonWitnessUtxo&&u.index!==void 0?c=u.nonWitnessUtxo.outputs[u.index]:u.witnessUtxo&&(c=u.witnessUtxo),c&&!s&&t.checkScript(c&&c.script,u.redeemScript,u.witnessScript),u}function rt(i,e=!1){let n="legacy",s=d.ALL;const r=N(i),o=t.OutScript.decode(r.script);let a=o.type,u=o;const c=[o];if(o.type==="tr")return s=d.DEFAULT,{txType:"taproot",type:"tr",last:o,lastScript:r.script,defaultSighash:s,sighash:i.sighashType||s};{if((o.type==="wpkh"||o.type==="wsh")&&(n="segwit"),o.type==="sh"){if(!i.redeemScript)throw new Error("inputType: sh without redeemScript");let f=t.OutScript.decode(i.redeemScript);(f.type==="wpkh"||f.type==="wsh")&&(n="segwit"),c.push(f),u=f,a+=`-${f.type}`}if(u.type==="wsh"){if(!i.witnessScript)throw new Error("inputType: wsh without witnessScript");let f=t.OutScript.decode(i.witnessScript);f.type==="wsh"&&(n="segwit"),c.push(f),u=f,a+=`-${f.type}`}const h=c[c.length-1];if(h.type==="sh"||h.type==="wsh")throw new Error("inputType: sh/wsh cannot be terminal type");const p=t.OutScript.encode(h),l={type:a,txType:n,last:h,lastScript:p,defaultSighash:s,sighash:i.sighashType||s};if(n==="legacy"&&!e&&!i.nonWitnessUtxo)throw new Error("Transaction/sign: legacy input without nonWitnessUtxo, can result in attack that forces paying higher fees. Pass allowLegacyWitnessUtxo=true, if you sure");return l}}class B{global={};inputs=[];outputs=[];opts;constructor(e={}){const n=this.opts=vt(e);n.lockTime!==L&&(this.global.fallbackLocktime=n.lockTime),this.global.txVersion=n.version}static fromRaw(e,n={}){const s=t.RawTx.decode(e),r=new B({...n,version:s.version,lockTime:s.lockTime});for(const o of s.outputs)r.addOutput(o);if(r.outputs=s.outputs,r.inputs=s.inputs,s.witnesses)for(let o=0;o<s.witnesses.length;o++)r.inputs[o].finalScriptWitness=s.witnesses[o];return r}static fromPSBT(e,n={}){let s;try{s=et.decode(e)}catch(l){try{s=nt.decode(e)}catch{throw l}}const r=s.global.version||0;if(r!==0&&r!==2)throw new Error(`Wrong PSBT version=${r}`);const o=s.global.unsignedTx,a=r===0?o?.version:s.global.txVersion,u=r===0?o?.lockTime:s.global.fallbackLocktime,c=new B({...n,version:a,lockTime:u,PSBTVersion:r}),h=r===0?o?.inputs.length:s.global.inputCount;c.inputs=s.inputs.slice(0,h).map((l,f)=>st({finalScriptSig:t.EMPTY,...s.global.unsignedTx?.inputs[f],...l}));const p=r===0?o?.outputs.length:s.global.outputCount;return c.outputs=s.outputs.slice(0,p).map((l,f)=>({...l,...s.global.unsignedTx?.outputs[f]})),c.global={...s.global,txVersion:a},u!==L&&(c.global.fallbackLocktime=u),c}toPSBT(e=this.opts.PSBTVersion){if(e!==0&&e!==2)throw new Error(`Wrong PSBT version=${e}`);const n=this.inputs.map(o=>st(tt(e,q,o)));for(const o of n)o.partialSig&&!o.partialSig.length&&delete o.partialSig,o.finalScriptSig&&!o.finalScriptSig.length&&delete o.finalScriptSig,o.finalScriptWitness&&!o.finalScriptWitness.length&&delete o.finalScriptWitness;const s=this.outputs.map(o=>tt(e,$,o)),r={...this.global};return e===0?(r.unsignedTx=t.RawOldTx.decode(t.RawOldTx.encode({version:this.version,lockTime:this.lockTime,inputs:this.inputs.map(P).map(o=>({...o,finalScriptSig:t.EMPTY})),outputs:this.outputs.map(U)})),delete r.fallbackLocktime,delete r.txVersion):(r.version=e,r.txVersion=this.version,r.inputCount=this.inputs.length,r.outputCount=this.outputs.length,r.fallbackLocktime&&r.fallbackLocktime===L&&delete r.fallbackLocktime),this.opts.bip174jsCompat&&(n.length||n.push({}),s.length||s.push({})),(e===0?et:nt).encode({global:r,inputs:n,outputs:s})}get lockTime(){let e=L,n=0,s=L,r=0;for(const o of this.inputs)o.requiredHeightLocktime&&(e=Math.max(e,o.requiredHeightLocktime),n++),o.requiredTimeLocktime&&(s=Math.max(s,o.requiredTimeLocktime),r++);return n&&n>=r?e:s!==L?s:this.global.fallbackLocktime||L}get version(){if(this.global.txVersion===void 0)throw new Error("No global.txVersion");return this.global.txVersion}inputStatus(e){this.checkInputIdx(e);const n=this.inputs[e];return n.finalScriptSig&&n.finalScriptSig.length||n.finalScriptWitness&&n.finalScriptWitness.length?"finalized":n.tapKeySig||n.tapScriptSig&&n.tapScriptSig.length||n.partialSig&&n.partialSig.length?"signed":"unsigned"}inputSighash(e){this.checkInputIdx(e);const n=this.inputs[e].sighashType,s=n===void 0?d.DEFAULT:n,r=s===d.DEFAULT?d.ALL:s&3;return{sigInputs:s&d.ANYONECANPAY,sigOutputs:r}}signStatus(){let e=!0,n=!0,s=[],r=[];for(let o=0;o<this.inputs.length;o++){if(this.inputStatus(o)==="unsigned")continue;const{sigInputs:u,sigOutputs:c}=this.inputSighash(o);if(u===d.ANYONECANPAY?s.push(o):e=!1,c===d.ALL)n=!1;else if(c===d.SINGLE)r.push(o);else if(c!==d.NONE)throw new Error(`Wrong signature hash output type: ${c}`)}return{addInput:e,addOutput:n,inputs:s,outputs:r}}get isFinal(){for(let e=0;e<this.inputs.length;e++)if(this.inputStatus(e)!=="finalized")return!1;return!0}get hasWitnesses(){let e=!1;for(const n of this.inputs)n.finalScriptWitness&&n.finalScriptWitness.length&&(e=!0);return e}get weight(){if(!this.isFinal)throw new Error("Transaction is not finalized");let e=32;const n=this.outputs.map(U);e+=4*t.CompactSizeLen.encode(this.outputs.length).length;for(const s of n)e+=32+4*t.VarBytes.encode(s.script).length;this.hasWitnesses&&(e+=2),e+=4*t.CompactSizeLen.encode(this.inputs.length).length;for(const s of this.inputs)e+=160+4*t.VarBytes.encode(s.finalScriptSig||t.EMPTY).length,this.hasWitnesses&&s.finalScriptWitness&&(e+=t.RawWitness.encode(s.finalScriptWitness).length);return e}get vsize(){return xt(this.weight)}toBytes(e=!1,n=!1){return t.RawTx.encode({version:this.version,lockTime:this.lockTime,inputs:this.inputs.map(P).map(s=>({...s,finalScriptSig:e&&s.finalScriptSig||t.EMPTY})),outputs:this.outputs.map(U),witnesses:this.inputs.map(s=>s.finalScriptWitness||[]),segwitFlag:n&&this.hasWitnesses})}get unsignedTx(){return this.toBytes(!1,!1)}get hex(){return t.hex.encode(this.toBytes(!0,this.hasWitnesses))}get hash(){return t.hex.encode(t.sha256x2(this.toBytes(!0)))}get id(){return t.hex.encode(t.sha256x2(this.toBytes(!0)).reverse())}checkInputIdx(e){if(!Number.isSafeInteger(e)||0>e||e>=this.inputs.length)throw new Error(`Wrong input index=${e}`)}getInput(e){return this.checkInputIdx(e),C(this.inputs[e])}get inputsLength(){return this.inputs.length}addInput(e,n=!1){if(!n&&!this.signStatus().addInput)throw new Error("Tx has signed inputs, cannot add new one");return this.inputs.push(ot(e,void 0,void 0,this.opts.disableScriptCheck)),this.inputs.length-1}updateInput(e,n,s=!1){this.checkInputIdx(e);let r;if(!s){const o=this.signStatus();(!o.addInput||o.inputs.includes(e))&&(r=St)}this.inputs[e]=ot(n,this.inputs[e],r,this.opts.disableScriptCheck,this.opts.allowUnknown)}checkOutputIdx(e){if(!Number.isSafeInteger(e)||0>e||e>=this.outputs.length)throw new Error(`Wrong output index=${e}`)}getOutput(e){return this.checkOutputIdx(e),C(this.outputs[e])}getOutputAddress(e,n=t.NETWORK){const s=this.getOutput(e);if(s.script)return t.Address(n).encode(t.OutScript.decode(s.script))}get outputsLength(){return this.outputs.length}normalizeOutput(e,n,s){let{amount:r,script:o}=e;if(r===void 0&&(r=n?.amount),typeof r!="bigint")throw new Error(`Wrong amount type, should be of type bigint in sats, but got ${r} of type ${typeof r}`);typeof o=="string"&&(o=t.hex.decode(o)),o===void 0&&(o=n?.script);let a={...n,...e,amount:r,script:o};if(a.amount===void 0&&delete a.amount,a=K($,a,n,s,this.opts.allowUnknown),G.encode(a),a.script&&!this.opts.allowUnknownOutputs&&t.OutScript.decode(a.script).type==="unknown")throw new Error("Transaction/output: unknown output script type, there is a chance that input is unspendable. Pass allowUnknownOutputs=true, if you sure");return this.opts.disableScriptCheck||t.checkScript(a.script,a.redeemScript,a.witnessScript),a}addOutput(e,n=!1){if(!n&&!this.signStatus().addOutput)throw new Error("Tx has signed outputs, cannot add new one");return this.outputs.push(this.normalizeOutput(e)),this.outputs.length-1}updateOutput(e,n,s=!1){this.checkOutputIdx(e);let r;if(!s){const o=this.signStatus();(!o.addOutput||o.outputs.includes(e))&&(r=mt)}this.outputs[e]=this.normalizeOutput(n,this.outputs[e],r)}addOutputAddress(e,n,s=t.NETWORK){return this.addOutput({script:t.OutScript.encode(t.Address(s).decode(e)),amount:n})}get fee(){let e=0n;for(const s of this.inputs){const r=N(s);if(!r)throw new Error("Empty input amount");e+=r.amount}const n=this.outputs.map(U);for(const s of n)e-=s.amount;return e}preimageLegacy(e,n,s){const{isAny:r,isNone:o,isSingle:a}=it(s);if(e<0||!Number.isSafeInteger(e))throw new Error(`Invalid input idx=${e}`);if(a&&e>=this.outputs.length||e>=this.inputs.length)return t.U256BE.encode(1n);n=t.Script.encode(t.Script.decode(n).filter(p=>p!=="CODESEPARATOR"));let u=this.inputs.map(P).map((p,l)=>({...p,finalScriptSig:l===e?n:t.EMPTY}));r?u=[u[e]]:(o||a)&&(u=u.map((p,l)=>({...p,sequence:l===e?p.sequence:0})));let c=this.outputs.map(U);o?c=[]:a&&(c=c.slice(0,e).fill(Tt).concat([c[e]]));const h=t.RawTx.encode({lockTime:this.lockTime,version:this.version,segwitFlag:!1,inputs:u,outputs:c});return t.sha256x2(h,t.I32LE.encode(s))}preimageWitnessV0(e,n,s,r){const{isAny:o,isNone:a,isSingle:u}=it(s);let c=O,h=O,p=O;const l=this.inputs.map(P),f=this.outputs.map(U);o||(c=t.sha256x2(...l.map(M.encode))),!o&&!u&&!a&&(h=t.sha256x2(...l.map(m=>t.U32LE.encode(m.sequence)))),!u&&!a?p=t.sha256x2(...f.map(t.RawOutput.encode)):u&&e<f.length&&(p=t.sha256x2(t.RawOutput.encode(f[e])));const w=l[e];return t.sha256x2(t.I32LE.encode(this.version),c,h,t.createBytes(32,!0).encode(w.txid),t.U32LE.encode(w.index),t.VarBytes.encode(n),t.U64LE.encode(r),t.U32LE.encode(w.sequence),p,t.U32LE.encode(this.lockTime),t.U32LE.encode(s))}preimageWitnessV1(e,n,s,r,o=-1,a,u=192,c){if(!Array.isArray(r)||this.inputs.length!==r.length)throw new Error(`Invalid amounts array=${r}`);if(!Array.isArray(n)||this.inputs.length!==n.length)throw new Error(`Invalid prevOutScript array=${n}`);const h=[t.U8.encode(0),t.U8.encode(s),t.I32LE.encode(this.version),t.U32LE.encode(this.lockTime)],p=s===d.DEFAULT?d.ALL:s&3,l=s&d.ANYONECANPAY,f=this.inputs.map(P),w=this.outputs.map(U);l!==d.ANYONECANPAY&&h.push(...[f.map(M.encode),r.map(t.U64LE.encode),n.map(t.VarBytes.encode),f.map(y=>t.U32LE.encode(y.sequence))].map(y=>t.sha256(t.concatBytes(...y)))),p===d.ALL&&h.push(t.sha256(t.concatBytes(...w.map(t.RawOutput.encode))));const m=(c?1:0)|(a?2:0);if(h.push(new Uint8Array([m])),l===d.ANYONECANPAY){const y=f[e];h.push(M.encode(y),t.U64LE.encode(r[e]),t.VarBytes.encode(n[e]),t.U32LE.encode(y.sequence))}else h.push(t.U32LE.encode(e));return m&1&&h.push(t.sha256(t.VarBytes.encode(c||t.EMPTY))),p===d.SINGLE&&h.push(e<w.length?t.sha256(t.RawOutput.encode(w[e])):O),a&&h.push(t.tapLeafHash(a,u),t.U8.encode(0),t.I32LE.encode(o)),t.tagSchnorr("TapSighash",...h)}signIdx(e,n,s,r){this.checkInputIdx(n);const o=this.inputs[n],a=rt(o,this.opts.allowLegacyWitnessUtxo);if(!t.isBytes(e)){if(!o.bip32Derivation||!o.bip32Derivation.length)throw new Error("bip32Derivation: empty");const p=o.bip32Derivation.filter(f=>f[1].fingerprint==e.fingerprint).map(([f,{path:w}])=>{let m=e;for(const y of w)m=m.deriveChild(y);if(!t.equalBytes(m.publicKey,f))throw new Error("bip32Derivation: wrong pubKey");if(!m.privateKey)throw new Error("bip32Derivation: no privateKey");return m});if(!p.length)throw new Error(`bip32Derivation: no items with fingerprint=${e.fingerprint}`);let l=!1;for(const f of p)this.signIdx(f.privateKey,n)&&(l=!0);return l}s?s.forEach(Pt):s=[a.defaultSighash];const u=a.sighash;if(!s.includes(u))throw new Error(`Input with not allowed sigHash=${u}. Allowed: ${s.join(", ")}`);const{sigOutputs:c}=this.inputSighash(n);if(c===d.SINGLE&&n>=this.outputs.length)throw new Error(`Input with sighash SINGLE, but there is no output with corresponding index=${n}`);const h=N(o);if(a.txType==="taproot"){const p=this.inputs.map(N),l=p.map(g=>g.script),f=p.map(g=>g.amount);let w=!1,m=t.pubSchnorr(e),y=o.tapMerkleRoot||t.EMPTY;if(o.tapInternalKey){const{pubKey:g,privKey:k}=It(e,m,o.tapInternalKey,y),[S]=t.taprootTweakPubkey(o.tapInternalKey,y);if(t.equalBytes(S,g)){const T=this.preimageWitnessV1(n,l,u,f),x=t.concatBytes(t.signSchnorr(T,k,r),u!==d.DEFAULT?new Uint8Array([u]):t.EMPTY);this.updateInput(n,{tapKeySig:x},!0),w=!0}}if(o.tapLeafScript){o.tapScriptSig=o.tapScriptSig||[];for(const[g,k]of o.tapLeafScript){const S=k.subarray(0,-1),T=t.Script.decode(S),x=k[k.length-1],b=t.tapLeafHash(S,x);if(T.findIndex(Q=>t.isBytes(Q)&&t.equalBytes(Q,m))===-1)continue;const lt=this.preimageWitnessV1(n,l,u,f,void 0,S,x),ft=t.concatBytes(t.signSchnorr(lt,e,r),u!==d.DEFAULT?new Uint8Array([u]):t.EMPTY);this.updateInput(n,{tapScriptSig:[[{pubKey:m,leafHash:b},ft]]},!0),w=!0}}if(!w)throw new Error("No taproot scripts signed");return!0}else{const p=t.pubECDSA(e);let l=!1;const f=t.hash160(p);for(const y of t.Script.decode(a.lastScript))t.isBytes(y)&&(t.equalBytes(y,p)||t.equalBytes(y,f))&&(l=!0);if(!l)throw new Error(`Input script doesn't have pubKey: ${a.lastScript}`);let w;if(a.txType==="legacy")w=this.preimageLegacy(n,a.lastScript,u);else if(a.txType==="segwit"){let y=a.lastScript;a.last.type==="wpkh"&&(y=t.OutScript.encode({type:"pkh",hash:a.last.hash})),w=this.preimageWitnessV0(n,y,u,h.amount)}else throw new Error(`Transaction/sign: unknown tx type: ${a.txType}`);const m=t.signECDSA(w,e,this.opts.lowR);this.updateInput(n,{partialSig:[[p,t.concatBytes(m,new Uint8Array([u]))]]},!0)}return!0}sign(e,n,s){let r=0;for(let o=0;o<this.inputs.length;o++)try{this.signIdx(e,o,n,s)&&r++}catch{}if(!r)throw new Error("No inputs signed");return r}finalizeIdx(e){if(this.checkInputIdx(e),this.fee<0n)throw new Error("Outputs spends more than inputs amount");const n=this.inputs[e],s=rt(n,this.opts.allowLegacyWitnessUtxo);if(s.txType==="taproot"){if(n.tapKeySig)n.finalScriptWitness=[n.tapKeySig];else if(n.tapLeafScript&&n.tapScriptSig){const c=n.tapLeafScript.sort((h,p)=>v.encode(h[0]).length-v.encode(p[0]).length);for(const[h,p]of c){const l=p.slice(0,-1),f=p[p.length-1],w=t.OutScript.decode(l),m=t.tapLeafHash(l,f),y=n.tapScriptSig.filter(k=>t.equalBytes(k[0].leafHash,m));let g=[];if(w.type==="tr_ms"){const k=w.m,S=w.pubkeys;let T=0;for(const x of S){const b=y.findIndex(j=>t.equalBytes(j[0].pubKey,x));if(T===k||b===-1){g.push(t.EMPTY);continue}g.push(y[b][1]),T++}if(T!==k)continue}else if(w.type==="tr_ns"){for(const k of w.pubkeys){const S=y.findIndex(T=>t.equalBytes(T[0].pubKey,k));S!==-1&&g.push(y[S][1])}if(g.length!==w.pubkeys.length)continue}else if(w.type==="unknown"&&this.opts.allowUnknownInputs){const k=t.Script.decode(l);if(g=y.map(([{pubKey:S},T])=>{const x=k.findIndex(b=>t.isBytes(b)&&t.equalBytes(b,S));if(x===-1)throw new Error("finalize/taproot: cannot find position of pubkey in script");return{signature:T,pos:x}}).sort((S,T)=>S.pos-T.pos).map(S=>S.signature),!g.length)continue}else{const k=this.opts.customScripts;if(k)for(const S of k){if(!S.finalizeTaproot)continue;const T=t.Script.decode(l),x=S.encode(T);if(x===void 0)continue;const b=S.finalizeTaproot(l,x,y);if(b){n.finalScriptWitness=b.concat(v.encode(h)),n.finalScriptSig=t.EMPTY,V(n);return}}throw new Error("Finalize: Unknown tapLeafScript")}n.finalScriptWitness=g.reverse().concat([l,v.encode(h)]);break}if(!n.finalScriptWitness)throw new Error("finalize/taproot: empty witness")}else throw new Error("finalize/taproot: unknown input");n.finalScriptSig=t.EMPTY,V(n);return}if(!n.partialSig||!n.partialSig.length)throw new Error("Not enough partial sign");let r=t.EMPTY,o=[];if(s.last.type==="ms"){const c=s.last.m,h=s.last.pubkeys;let p=[];for(const l of h){const f=n.partialSig.find(w=>t.equalBytes(l,w[0]));f&&p.push(f[1])}if(p=p.slice(0,c),p.length!==c)throw new Error(`Multisig: wrong signatures count, m=${c} n=${h.length} signatures=${p.length}`);r=t.Script.encode([0,...p])}else if(s.last.type==="pk")r=t.Script.encode([n.partialSig[0][1]]);else if(s.last.type==="pkh")r=t.Script.encode([n.partialSig[0][1],n.partialSig[0][0]]);else if(s.last.type==="wpkh")r=t.EMPTY,o=[n.partialSig[0][1],n.partialSig[0][0]];else if(s.last.type==="unknown"&&!this.opts.allowUnknownInputs)throw new Error("Unknown inputs not allowed");let a,u;if(s.type.includes("wsh-")&&(r.length&&s.lastScript.length&&(o=t.Script.decode(r).map(c=>{if(c===0)return t.EMPTY;if(t.isBytes(c))return c;throw new Error(`Wrong witness op=${c}`)})),o=o.concat(s.lastScript)),s.txType==="segwit"&&(u=o),s.type.startsWith("sh-wsh-")?a=t.Script.encode([t.Script.encode([0,t.sha256(s.lastScript)])]):s.type.startsWith("sh-")?a=t.Script.encode([...t.Script.decode(r),s.lastScript]):s.type.startsWith("wsh-")||s.txType!=="segwit"&&(a=r),!a&&!u)throw new Error("Unknown error finalizing input");a&&(n.finalScriptSig=a),u&&(n.finalScriptWitness=u),V(n)}finalize(){for(let e=0;e<this.inputs.length;e++)this.finalizeIdx(e)}extract(){if(!this.isFinal)throw new Error("Transaction has unfinalized inputs");if(!this.outputs.length)throw new Error("Transaction has no outputs");if(this.fee<0n)throw new Error("Outputs spends more than inputs amount");return this.toBytes(!0,!0)}combine(e){for(const r of["PSBTVersion","version","lockTime"])if(this.opts[r]!==e.opts[r])throw new Error(`Transaction/combine: different ${r} this=${this.opts[r]} other=${e.opts[r]}`);for(const r of["inputs","outputs"])if(this[r].length!==e[r].length)throw new Error(`Transaction/combine: different ${r} length this=${this[r].length} other=${e[r].length}`);const n=this.global.unsignedTx?t.RawOldTx.encode(this.global.unsignedTx):t.EMPTY,s=e.global.unsignedTx?t.RawOldTx.encode(e.global.unsignedTx):t.EMPTY;if(!t.equalBytes(n,s))throw new Error("Transaction/combine: different unsigned tx");this.global=K(F,this.global,e.global,void 0,this.opts.allowUnknown);for(let r=0;r<this.inputs.length;r++)this.updateInput(r,e.inputs[r],!0);for(let r=0;r<this.outputs.length;r++)this.updateOutput(r,e.outputs[r],!0);return this}clone(){return B.fromPSBT(this.toPSBT(this.opts.PSBTVersion),this.opts)}}exports.Transaction=B;
|
|
2
|
+
//# sourceMappingURL=transaction-B6SlpRzN.js.map
|